This commit is contained in:
Florian Nücke 2014-02-09 00:44:52 +01:00
commit f826a62cbe
36 changed files with 232 additions and 99 deletions

View File

@ -60,7 +60,9 @@ oc:item.NumPad.name=Ziffernblock
oc:item.PrintedCircuitBoard.name=Gedruckte Leiterplatte (PCB)
oc:item.RawCircuitBoard.name=Leiterplattenrohling
oc:item.RedstoneCard.name=Redstonekarte
oc:item.Server.name=Server
oc:item.Server0.name=Server (Stufe 1)
oc:item.Server1.name=Server (Stufe 2)
oc:item.Server2.name=Server (Stufe 3)
oc:item.Terminal.name=Fernbedienung
oc:item.Transistor.name=Transistor
oc:item.UpgradeCrafting.name=Fertigungs-Upgrade
@ -154,7 +156,7 @@ oc:tooltip.Robot_Level=§fStufe§7: §a%s§7.
oc:tooltip.Robot_StoredEnergy=§fGespeicherte Energie§7: §a%s§7.
oc:tooltip.Router=Erlaubt es, mehrere Netzwerke miteinander zu verbinden. Leitet ausschließlich Netzwerknachrichten weiter, Komponenten "hinter" dem Router sind nicht sichtbar. Nützlich, um Netzwerke zu trennen, jedoch nach wie vor Kommunikation zwischen den Netzwerken zu erlauben, z.b. mittels Netzwerkkarten.
oc:tooltip.Screen=Zeigt Text an, gesteuert von Grafikkarten in Computern.[nl] Höchstauflösung: §f%sx%s§7.[nl] Maximale Farbtiefe: §f%s§7.
oc:tooltip.Server=Ein Server kann wie ein gewöhnliches Computergehäuse mit Komponenten verbessert werden. Um den Server zu starten, muss er in einem Servergehäuse installiert werden.
oc:tooltip.Server=Ein Server kann wie ein gewöhnliches Computergehäuse mit Komponenten verbessert werden. Um den Server zu starten, muss er in einem Servergehäuse installiert werden.[nl] Anzahl unterstützter Fernbedienungen: §f%s§7.
oc:tooltip.Server.Components=Installierte Komponenten:
oc:tooltip.ServerRack=Erlaubt die Installation von bis zu vier Servern. Stellt für jeden eingebauten Server eine virtuelle Tastatur- und Bildschirmkomponente zur Verfügung, welche je eine Fernbedienung repräsentieren.
oc:tooltip.Terminal=Erlaubt es, einen Server aus der Ferne zu steuern, so lange man sich in Reichweite des Servers befindet. Verhält sich wie Bildschirm und Tastatur in einem. Kann mit Shift-Rechtsklick an einen Server in einem Serverschrank gebunden werden.

View File

@ -60,7 +60,9 @@ oc:item.NumPad.name=Numeric Keypad
oc:item.PrintedCircuitBoard.name=Printed Circuit Board (PCB)
oc:item.RawCircuitBoard.name=Raw Circuit Board
oc:item.RedstoneCard.name=Redstone Card
oc:item.Server.name=Server
oc:item.Server0.name=Server (Tier 1)
oc:item.Server1.name=Server (Tier 2)
oc:item.Server2.name=Server (Tier 3)
oc:item.Terminal.name=Remote Terminal
oc:item.Transistor.name=Transistor
oc:item.UpgradeCrafting.name=Crafting Upgrade
@ -154,7 +156,7 @@ oc:tooltip.Robot_Level=§fLevel§7: §a%s§7.
oc:tooltip.Robot_StoredEnergy=§fStored energy§7: §a%s§7.
oc:tooltip.Router=Allows connecting different networks to each other. Only network messages will be passed along, components will not be visible through this. Use this to separate networks while still allowing communication using Network Cards, for example.
oc:tooltip.Screen=Display text, controlled by a Graphics Card in a Case.[nl] Maximum resolution: §f%sx%s§7.[nl] Maximum color depth: §f%s§7.
oc:tooltip.Server=This is a server, there are many like it, but this one can be upgraded with components much like a computer case can be. It can be run by inserting it into a server rack.
oc:tooltip.Server=This is a server, there are many like it, but this one can be upgraded with components much like a computer case can be. It can be run by inserting it into a server rack.[nl] Number of supported terminals: §f%s§7.
oc:tooltip.Server.Components=Installed components:
oc:tooltip.ServerRack=Allows the installation of up to four servers. Provides a built-in virtual keyboard and screen component for each server, representing a remote terminal.
oc:tooltip.Terminal=Allows controlling a server remotely, as long as you are in range of it. Acts like a portable screen and keyboard. Shift-right-click a server in a server rack to bind the terminal to it.

View File

@ -12,11 +12,21 @@ terminal {
[nuggetIron, "oc:craftingKeyboard", nuggetIron]]
}
server {
server1 {
input: [[obsidian, "oc:craftingRAMTier3", obsidian]
["oc:circuitTier1", "oc:circuitTier2", "oc:circuitTier1"]
[obsidian, "oc:craftingCircuitBoardPrinted", obsidian]]
}
server2 {
input: [[obsidian, "oc:craftingRAMTier4", obsidian]
["oc:circuitTier2", "oc:circuitTier3", "oc:circuitTier2"]
[obsidian, "oc:craftingCircuitBoardPrinted", obsidian]]
}
server3 {
input: [[obsidian, "oc:craftingRAMTier5", obsidian]
["oc:circuitTier3", "oc:circuitTier3", "oc:circuitTier3"]
[obsidian, "oc:craftingCircuitBoardPrinted", obsidian]]
}
ram1 {
input: [["oc:circuitTier1", "", "oc:circuitTier1"]

View File

@ -12,8 +12,18 @@ terminal {
[nuggetIron, "oc:craftingKeyboard", nuggetIron]]
}
server {
input: [["oc:circuitTier3", "oc:craftingRAMTier4", "oc:circuitTier3"]
server1 {
input: [["oc:circuitTier1", "oc:craftingRAMTier3", "oc:circuitTier1"]
["oc:circuitTier2", "oc:craftingCaseTier1", "oc:circuitTier2"]
["oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted"]]
}
server2 {
input: [["oc:circuitTier2", "oc:craftingRAMTier4", "oc:circuitTier2"]
["oc:circuitTier3", "oc:craftingCaseTier2", "oc:circuitTier3"]
["oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted"]]
}
server3 {
input: [["oc:circuitTier3", "oc:craftingRAMTier5", "oc:circuitTier3"]
["oc:circuitTier3", "oc:craftingCaseTier3", "oc:circuitTier3"]
["oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted"]]
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 517 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 521 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 525 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 B

View File

@ -659,5 +659,8 @@ opencomputers {
# like, you know, more than the loaded area.
# See also: `wirelessStrength`.
maxWirelessRange: 400
# The number of remote terminals supported by each server tier.
terminalsPerTier: [2, 4, 8]
}
}

View File

@ -15,7 +15,7 @@ object Items {
// ----------------------------------------------------------------------- //
// Servers
var server: item.Server = _
var server1, server2, server3: item.Server = _
// ----------------------------------------------------------------------- //
// Memory
@ -124,11 +124,13 @@ object Items {
ram5 = new item.Memory(multi, 4)
// v1.2.0
server = new item.Server(multi)
server3 = new item.Server(multi, 2)
terminal = new item.Terminal(multi)
cpu1 = new item.CPU(multi, 1)
cpu2 = new item.CPU(multi, 2)
internet = new item.InternetCard(multi)
server1 = new item.Server(multi, 0)
server2 = new item.Server(multi, 1)
// ----------------------------------------------------------------------- //

View File

@ -68,7 +68,9 @@ object Recipes {
addRecipe(Items.hdd2.createItemStack(), recipes, "hdd2")
addRecipe(Items.hdd3.createItemStack(), recipes, "hdd3")
addRecipe(Items.server.createItemStack(), recipes, "server")
addRecipe(Items.server1.createItemStack(), recipes, "server1")
addRecipe(Items.server2.createItemStack(), recipes, "server2")
addRecipe(Items.server3.createItemStack(), recipes, "server3")
if (StargateTech2.isAvailable) {
addRecipe(Items.abstractBus.createItemStack(), recipes, "abstractBusCard")

View File

@ -156,7 +156,15 @@ class Settings(config: Config) {
val maxClipboard = config.getInt("misc.maxClipboard") max 0
val maxNetworkPacketSize = config.getInt("misc.maxNetworkPacketSize") max 0
val maxWirelessRange = config.getDouble("misc.maxWirelessRange") max 0
val rTreeMaxEntries = 10 // TODO config?
val rTreeMaxEntries = 10
val terminalsPerTier = Array(config.getIntList("misc.terminalsPerTier"): _*) match {
case Array(tier1, tier2, tier3) =>
Array(tier1: Int, tier2: Int, tier3: Int)
case _ =>
OpenComputers.log.warning("Bad number of Remote Terminal counts, ignoring.")
Array(2, 4, 8)
}
}
object Settings {

View File

@ -25,7 +25,9 @@ object GuiHandler extends CommonGuiHandler {
case _ => Items.multi.subItem(player.getCurrentEquippedItem) match {
case Some(server: item.Server) if id == GuiType.Server.id =>
new gui.Server(player.inventory, new ServerInventory {
def container = player.getCurrentEquippedItem
override def tier = server.tier
override def container = player.getCurrentEquippedItem
override def isUseableByPlayer(player: EntityPlayer) = player == player
})
@ -46,7 +48,7 @@ object GuiHandler extends CommonGuiHandler {
case Some(term) =>
def inRange = player.isEntityAlive && term.rack.getDistanceFrom(player.posX, player.posY, player.posZ) < term.rack.range * term.rack.range
if (inRange) {
if (term.key.isDefined && term.key.get == key) return new gui.Screen(term.buffer, true, () => {
if (term.keys.contains(key)) return new gui.Screen(term.buffer, true, () => {
// Check if someone else bound a term to our server.
if (stack.getTagCompound.getString(Settings.namespace + "key") != key) {
Minecraft.getMinecraft.displayGuiScreen(null)

View File

@ -84,9 +84,11 @@ object PacketHandler extends CommonPacketHandler {
else {
t.setRunning(number, p.readBoolean())
t.sides(number) = p.readDirection()
val key = p.readUTF()
if (key != "") {
t.terminals(number).key = Option(key)
val keyCount = p.readInt()
val keys = t.terminals(number).keys
keys.clear()
for (i <- 0 until keyCount) {
keys += p.readUTF()
}
}
case _ => // Invalid packet.

View File

@ -20,6 +20,8 @@ abstract class GuiHandler extends IGuiHandler {
case _ => Items.multi.subItem(player.getCurrentEquippedItem) match {
case Some(server: item.Server) if id == GuiType.Server.id =>
new container.Server(player.inventory, new ServerInventory {
override def tier = server.tier
override def container = player.getCurrentEquippedItem
override def isUseableByPlayer(player: EntityPlayer) = player == player

View File

@ -10,7 +10,8 @@ import li.cil.oc.util.ExtendedNBT._
import li.cil.oc.util.PackedColor.Depth
import li.cil.oc.{Items, Settings, common}
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.nbt.{NBTTagString, NBTTagCompound}
import scala.collection.mutable
class Terminal(val rack: tileentity.Rack, val number: Int) extends Buffer.Owner {
val buffer = new common.component.Buffer(this)
@ -22,8 +23,7 @@ class Terminal(val rack: tileentity.Rack, val number: Int) extends Buffer.Owner
override def isUseableByPlayer(p: EntityPlayer) = {
val stack = p.getCurrentEquippedItem
Items.multi.subItem(stack) match {
case Some(t: item.Terminal) if key.isDefined && stack.hasTagCompound =>
key.get == stack.getTagCompound.getString(Settings.namespace + "key")
case Some(t: item.Terminal) if stack.hasTagCompound => keys.contains(stack.getTagCompound.getString(Settings.namespace + "key"))
case _ => false
}
}
@ -31,7 +31,7 @@ class Terminal(val rack: tileentity.Rack, val number: Int) extends Buffer.Owner
}
else null
var key: Option[String] = None
val keys = mutable.ListBuffer.empty[String]
def isServer = rack.isServer
@ -48,34 +48,28 @@ class Terminal(val rack: tileentity.Rack, val number: Int) extends Buffer.Owner
def load(nbt: NBTTagCompound) {
buffer.load(nbt.getCompoundTag(Settings.namespace + "buffer"))
keyboard.load(nbt.getCompoundTag(Settings.namespace + "keyboard"))
// Compatibility for previous dev versions where there was only one term.
if (nbt.hasKey(Settings.namespace + "key")) {
key = Option(nbt.getString(Settings.namespace + "key"))
keys += nbt.getString(Settings.namespace + "key")
}
nbt.getTagList(Settings.namespace + "keys").foreach[NBTTagString](keys += _.data)
}
def save(nbt: NBTTagCompound) {
nbt.setNewCompoundTag(Settings.namespace + "buffer", buffer.save)
nbt.setNewCompoundTag(Settings.namespace + "keyboard", keyboard.save)
key match {
case Some(value) => nbt.setString(Settings.namespace + "key", value)
case _ =>
}
nbt.setNewTagList("keys", keys)
}
@SideOnly(Side.CLIENT)
def readFromNBTForClient(nbt: NBTTagCompound) {
buffer.buffer.load(nbt)
if (nbt.hasKey("key")) {
key = Option(nbt.getString("key"))
}
nbt.getTagList("keys").foreach[NBTTagString](keys += _.data)
}
def writeToNBTForClient(nbt: NBTTagCompound) {
buffer.buffer.save(nbt)
key match {
case Some(value) => nbt.setString("key", value)
case _ =>
}
nbt.setNewTagList("keys", keys)
}
// ----------------------------------------------------------------------- //

View File

@ -9,15 +9,15 @@ class Server(playerInventory: InventoryPlayer, serverInventory: ServerInventory)
addSlotToContainer(76, 7 + i * slotSize, api.driver.Slot.Card, 2 - i)
}
for (i <- 0 to 3) {
addSlotToContainer(100, 7 + i * slotSize, api.driver.Slot.Processor)
for (i <- 0 to 1 + serverInventory.tier) {
addSlotToContainer(100, 7 + i * slotSize, api.driver.Slot.Processor, 2)
}
for (i <- 0 to 3) {
for (i <- 0 to 1 + serverInventory.tier) {
addSlotToContainer(124, 7 + i * slotSize, api.driver.Slot.Memory, 2)
}
for (i <- 0 to 3) {
for (i <- 0 to 1 + serverInventory.tier) {
addSlotToContainer(148, 7 + i * slotSize, api.driver.Slot.HardDiskDrive, 2)
}

View File

@ -3,11 +3,17 @@ package li.cil.oc.common.inventory
import li.cil.oc.Settings
import li.cil.oc.api.driver.Slot
import li.cil.oc.server.driver.Registry
import net.minecraft.item.ItemStack
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
trait ServerInventory extends ItemStackInventory {
override def getSizeInventory = 14
def tier: Int
override def getSizeInventory = tier match {
case 1 => 11
case 2 => 14
case _ => 8
}
override def getInventoryName = Settings.namespace + "container.Server"
@ -15,8 +21,17 @@ trait ServerInventory extends ItemStackInventory {
override def isUseableByPlayer(player: EntityPlayer) = false
override def isItemValidForSlot(slot: Int, stack: ItemStack) =
(slot, Registry.itemDriverFor(stack)) match {
override def isItemValidForSlot(slot: Int, stack: ItemStack) = tier match {
case 1 => (slot, Registry.itemDriverFor(stack)) match {
case (_, None) => false // Invalid item.
case (0, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 2
case (1, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 1
case (2 | 3 | 4, Some(driver)) => driver.slot(stack) == Slot.Processor && driver.tier(stack) <= 2
case (5 | 6 | 7, Some(driver)) => driver.slot(stack) == Slot.Memory && driver.tier(stack) <= 2
case (8 | 9 | 10, Some(driver)) => driver.slot(stack) == Slot.HardDiskDrive && driver.tier(stack) <= 2
case _ => false // Invalid slot.
}
case 2 => (slot, Registry.itemDriverFor(stack)) match {
case (_, None) => false // Invalid item.
case (0, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 2
case (1, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 1
@ -25,4 +40,14 @@ trait ServerInventory extends ItemStackInventory {
case (10 | 11 | 12 | 13, Some(driver)) => driver.slot(stack) == Slot.HardDiskDrive && driver.tier(stack) <= 2
case _ => false // Invalid slot.
}
case _ => (slot, Registry.itemDriverFor(stack)) match {
case (_, None) => false // Invalid item.
case (0, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 2
case (1, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 1
case (2 | 3, Some(driver)) => driver.slot(stack) == Slot.Processor && driver.tier(stack) <= 2
case (4 | 5, Some(driver)) => driver.slot(stack) == Slot.Memory && driver.tier(stack) <= 2
case (6 | 7, Some(driver)) => driver.slot(stack) == Slot.HardDiskDrive && driver.tier(stack) <= 2
case _ => false // Invalid slot.
}
}
}

View File

@ -25,4 +25,3 @@ class CPU(val parent: Delegator, val tier: Int) extends Delegate {
icon = iconRegister.registerIcon(Settings.resourceDomain + ":cpu" + tier)
}
}

View File

@ -7,21 +7,26 @@ import li.cil.oc.util.Tooltip
import li.cil.oc.{Settings, OpenComputers}
import net.minecraft.client.renderer.texture.IIconRegister
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
import net.minecraft.item.{EnumRarity, ItemStack}
import net.minecraft.world.World
import scala.collection.mutable
class Server(val parent: Delegator) extends Delegate {
val unlocalizedName = "Server"
class Server(val parent: Delegator, val tier: Int) extends Delegate {
val baseName = "Server"
val unlocalizedName = baseName + tier
override def rarity = Array(EnumRarity.common, EnumRarity.uncommon, EnumRarity.rare).apply(tier max 0 min 2)
override def maxStackSize = 1
private object HelperInventory extends ServerInventory {
def tier = Server.this.tier
var container: ItemStack = null
}
override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) {
tooltip.addAll(Tooltip.get(unlocalizedName))
tooltip.addAll(Tooltip.get(baseName, Settings.get.terminalsPerTier(tier)))
HelperInventory.container = stack
HelperInventory.reinitialize()
val items = mutable.Map.empty[String, Int]
@ -41,7 +46,7 @@ class Server(val parent: Delegator) extends Delegate {
override def registerIcons(iconRegister: IIconRegister) {
super.registerIcons(iconRegister)
icon = iconRegister.registerIcon(Settings.resourceDomain + ":server")
icon = iconRegister.registerIcon(Settings.resourceDomain + ":server" + tier)
}
override def onItemRightClick(stack: ItemStack, world: World, player: EntityPlayer) = {

View File

@ -58,11 +58,16 @@ class Terminal(val parent: Delegator) extends Delegate {
if (!world.isRemote) {
rack.servers(slot) match {
case Some(server) =>
val key = UUID.randomUUID().toString
val keys = rack.terminals(slot).keys
if (!stack.hasTagCompound) {
stack.setTagCompound(new NBTTagCompound())
}
val key = UUID.randomUUID().toString
rack.terminals(slot).key = Some(key)
else {
keys -= stack.getTagCompound.getString(Settings.namespace + "key")
}
keys.remove(0, math.max(0, 1 + keys.length - Settings.get.terminalsPerTier(server.tier)))
keys += key
ServerPacketSender.sendServerState(rack, slot)
stack.getTagCompound.setString(Settings.namespace + "key", key)
stack.getTagCompound.setString(Settings.namespace + "server", server.machine.node.address)

View File

@ -18,7 +18,7 @@ import stargatetech2.api.bus.IBusDevice
// See AbstractBusAware as to why we have to define the IBusDevice here.
@Optional.Interface(iface = "stargatetech2.api.bus.IBusDevice", modid = "StargateTech2")
abstract class Computer(isRemote: Boolean) extends Environment with ComponentInventory with Rotatable with BundledRedstoneAware with AbstractBusAware with IBusDevice with Analyzable with Context with Machine.Owner {
abstract class Computer(isRemote: Boolean) extends Environment with ComponentInventory with Rotatable with BundledRedstoneAware with AbstractBusAware with IBusDevice with Analyzable with Machine.Owner {
protected val _computer = if (isRemote) null else new Machine(this)
def computer = _computer

View File

@ -2,6 +2,7 @@ package li.cil.oc.common.tileentity
import com.google.common.base.Strings
import cpw.mods.fml.common.Optional
import cpw.mods.fml.common.Optional.Method
import cpw.mods.fml.relauncher.{Side, SideOnly}
import li.cil.oc.api.Network
import li.cil.oc.api.network.{Connector, Visibility, Node, Analyzable}
@ -41,6 +42,12 @@ class Rack extends Hub with PowerBalancer with Inventory with Rotatable with Bun
override def canConnect(side: ForgeDirection) = side != facing
@Method(modid = "StargateTech2")
override def getInterfaces(side: Int) = if (side != facing.ordinal) {
super.getInterfaces(side)
}
else null
// ----------------------------------------------------------------------- //
def isRunning(number: Int) =
@ -100,7 +107,11 @@ class Rack extends Hub with PowerBalancer with Inventory with Rotatable with Bun
override def getInventoryStackLimit = 1
override def isItemValidForSlot(i: Int, stack: ItemStack) = Items.server.createItemStack().isItemEqual(stack)
override def isItemValidForSlot(i: Int, stack: ItemStack) =
Items.multi.subItem(stack) match {
case Some(subItem) => subItem == Items.server1 || subItem == Items.server2 || subItem == Items.server3
case _ => false
}
// ----------------------------------------------------------------------- //

View File

@ -317,7 +317,11 @@ object PacketSender {
pb.writeInt(number)
pb.writeBoolean(t.isRunning(number))
pb.writeDirection(t.sides(number))
pb.writeUTF(t.terminals(number).key.getOrElse(""))
val keys = t.terminals(number).keys
pb.writeInt(keys.length)
for (key <- keys) {
pb.writeUTF(key)
}
player match {
case Some(p) => pb.sendToPlayer(p)

View File

@ -2,19 +2,19 @@ package li.cil.oc.server.component
import li.cil.oc.Settings
import li.cil.oc.api.Network
import li.cil.oc.api.network.{Arguments, Context, Callback, Visibility}
import li.cil.oc.api.network._
import net.minecraft.nbt.NBTTagCompound
import scala.collection.convert.WrapAsScala._
import stargatetech2.api.StargateTechAPI
import stargatetech2.api.bus._
class AbstractBus(val owner: Context with IBusDevice) extends ManagedComponent with IBusDriver {
class AbstractBus(val device: IBusDevice) extends ManagedComponent with IBusDriver {
val node = Network.newNode(this, Visibility.Neighbors).
withComponent("abstract_bus").
withConnector().
create()
val busInterface: IBusInterface = StargateTechAPI.api.getFactory.getIBusInterface(owner, this)
val busInterface: IBusInterface = StargateTechAPI.api.getFactory.getIBusInterface(device, this)
protected var isEnabled = true
@ -22,6 +22,8 @@ class AbstractBus(val owner: Context with IBusDevice) extends ManagedComponent w
protected var sendQueue: Option[QueuedPacket] = None
protected var owner: Option[Context] = None
// ----------------------------------------------------------------------- //
override def canHandlePacket(sender: Short, protocolID: Int, hasLIP: Boolean) = hasLIP
@ -30,7 +32,7 @@ class AbstractBus(val owner: Context with IBusDevice) extends ManagedComponent w
val lip = packet.getPlainText
val data = Map(lip.getEntryList.map(key => (key, lip.get(key))): _*)
val metadata = Map("mod" -> lip.getMetadata.modID, "device" -> lip.getMetadata.deviceName, "player" -> lip.getMetadata.playerName)
owner.signal("bus_message", Int.box(packet.getProtocolID), Int.box(packet.getSender), Int.box(packet.getTarget), data, metadata)
owner.foreach(_.signal("bus_message", Int.box(packet.getProtocolID), Int.box(packet.getSender), Int.box(packet.getTarget), data, metadata))
}
override def getNextPacketToSend = if (sendQueue.isDefined) {
@ -87,6 +89,20 @@ class AbstractBus(val owner: Context with IBusDevice) extends ManagedComponent w
// ----------------------------------------------------------------------- //
override def onConnect(node: Node) {
super.onConnect(node)
if (owner.isEmpty && node.host.isInstanceOf[Context]) {
owner = Some(node.host.asInstanceOf[Context])
}
}
override def onDisconnect(node: Node) {
super.onDisconnect(node)
if (owner.isDefined && node.host.isInstanceOf[Context] && (node.host.asInstanceOf[Context] == owner.get)) {
owner = None
}
}
override def load(nbt: NBTTagCompound) {
super.load(nbt)
busInterface.readFromNBT(nbt, "bus")

View File

@ -8,16 +8,16 @@ import java.util.regex.Matcher
import li.cil.oc.api
import li.cil.oc.api.Network
import li.cil.oc.api.network._
import li.cil.oc.util.ExtendedNBT._
import li.cil.oc.util.ThreadPoolFactory
import li.cil.oc.{OpenComputers, Settings}
import li.cil.oc.util.ExtendedNBT._
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.server.MinecraftServer
import scala.Array
import scala.collection.mutable
import scala.collection.convert.WrapAsScala._
import scala.collection.mutable
class InternetCard(val owner: Context) extends ManagedComponent {
class InternetCard extends ManagedComponent {
val node = Network.newNode(this, Visibility.Network).
withComponent("internet", Visibility.Neighbors).
create()
@ -25,6 +25,8 @@ class InternetCard(val owner: Context) extends ManagedComponent {
val romInternet = Option(api.FileSystem.asManagedEnvironment(api.FileSystem.
fromClass(OpenComputers.getClass, Settings.resourceDomain, "lua/component/internet"), "internet"))
protected var owner: Option[Context] = None
protected val connections = mutable.Map.empty[Int, SocketChannel]
// For HTTP requests the state switches like so:
@ -49,7 +51,7 @@ class InternetCard(val owner: Context) extends ManagedComponent {
@Callback
def request(context: Context, args: Arguments): Array[AnyRef] = {
if (context.node.address != owner.node.address) {
if (owner.isEmpty || context.node.address != owner.get.node.address) {
throw new IllegalArgumentException("can only be used by the owning computer")
}
val address = args.checkString(0)
@ -105,16 +107,16 @@ class InternetCard(val owner: Context) extends ManagedComponent {
finally {
http.disconnect()
}
case other => owner.signal("http_response", address, Unit, "connection failed")
case other => owner.foreach(_.signal("http_response", address, Unit, "connection failed"))
}
}
catch {
case e: FileNotFoundException =>
owner.signal("http_response", address, Unit, "not found: " + Option(e.getMessage).getOrElse(e.toString))
owner.foreach(_.signal("http_response", address, Unit, "not found: " + Option(e.getMessage).getOrElse(e.toString)))
case _: SocketTimeoutException =>
owner.signal("http_response", address, Unit, "timeout")
owner.foreach(_.signal("http_response", address, Unit, "timeout"))
case e: Throwable =>
owner.signal("http_response", address, Unit, Option(e.getMessage).getOrElse(e.toString))
owner.foreach(_.signal("http_response", address, Unit, Option(e.getMessage).getOrElse(e.toString)))
}
finally {
InternetCard.this.synchronized {
@ -200,7 +202,7 @@ class InternetCard(val owner: Context) extends ManagedComponent {
this.synchronized {
if (request.isEmpty && queue.isDefined) {
val (address, packets) = queue.get
if (owner.signal("http_response", address, packets.front)) {
if (owner.fold(true)(_.signal("http_response", address, packets.front))) {
packets.dequeue()
}
if (packets.isEmpty) {
@ -214,6 +216,9 @@ class InternetCard(val owner: Context) extends ManagedComponent {
override def onConnect(node: Node) {
super.onConnect(node)
if (owner.isEmpty && node.host.isInstanceOf[Context]) {
owner = Some(node.host.asInstanceOf[Context])
}
if (node == this.node) {
romInternet.foreach(rom => node.neighbors.head.connect(rom.node))
}
@ -221,6 +226,9 @@ class InternetCard(val owner: Context) extends ManagedComponent {
override def onDisconnect(node: Node) {
super.onDisconnect(node)
if (owner.isDefined && node.host.isInstanceOf[Context] && (node.host.asInstanceOf[Context] == owner.get)) {
owner = None
}
if (node == this.node) {
for ((_, socket) <- connections) {
socket.close()
@ -235,7 +243,7 @@ class InternetCard(val owner: Context) extends ManagedComponent {
override def onMessage(message: Message) {
super.onMessage(message)
message.data match {
case Array() if (message.name == "computer.stopped" || message.name == "computer.started") && message.source.address == owner.node.address =>
case Array() if (message.name == "computer.stopped" || message.name == "computer.started") && owner.isDefined && message.source.address == owner.get.node.address =>
connections.values.foreach(_.close())
connections.clear()
InternetCard.this.synchronized {

View File

@ -1,9 +1,11 @@
package li.cil.oc.server.component
import li.cil.oc.Items
import li.cil.oc.api.driver
import li.cil.oc.api.network.{Message, Node}
import li.cil.oc.common.inventory.ComponentInventory
import li.cil.oc.common.inventory.ServerInventory
import li.cil.oc.common.item
import li.cil.oc.common.tileentity
import li.cil.oc.server.component.machine.Machine
import li.cil.oc.server.driver.Registry
@ -16,6 +18,31 @@ class Server(val rack: tileentity.Rack, val number: Int) extends Machine.Owner {
val inventory = new NetworkedInventory()
def tier = Items.multi.subItem(rack.getStackInSlot(number)) match {
case Some(server: item.Server) => server.tier
case _ => 0
}
// ----------------------------------------------------------------------- //
override def address() = machine.node.address
override def node() = machine.node
override def start() = machine.start()
override def stop() = machine.stop()
override def pause(seconds: Double) = machine.pause(seconds)
override def isPaused = machine.isPaused
override def isRunning = machine.isRunning
override def signal(name: String, args: AnyRef*) = machine.signal(name, args: _*)
override def canInteract(player: String) = machine.canInteract(player)
// ----------------------------------------------------------------------- //
override def installedMemory = inventory.items.foldLeft(0)((sum, stack) => sum + (stack match {
@ -70,6 +97,8 @@ class Server(val rack: tileentity.Rack, val number: Int) extends Machine.Owner {
}
}
override def tier = Server.this.tier
var containerOverride: ItemStack = _
override def container = if (containerOverride != null) containerOverride else rack.getStackInSlot(number)

View File

@ -7,10 +7,9 @@ import li.cil.oc.util.ExtendedNBT._
import net.minecraft.entity.item.EntityItem
import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound
import net.minecraft.tileentity.{TileEntity => MCTileEntity, TileEntityFurnace}
import scala.Some
import net.minecraft.tileentity.{TileEntity, TileEntityFurnace}
class UpgradeGenerator(val owner: MCTileEntity) extends ManagedComponent {
class UpgradeGenerator(val owner: TileEntity) extends ManagedComponent {
val node = Network.newNode(this, Visibility.Network).
withComponent("generator", Visibility.Neighbors).
withConnector().

View File

@ -485,10 +485,11 @@ class Machine(val owner: Machine.Owner) extends ManagedComponent with Context wi
val invalid = mutable.Set.empty[String]
for ((address, name) <- components) {
if (node.network.node(address) == null) {
OpenComputers.log.fine("A component of type '%s' disappeared! This usually means that it didn't save its node.".format(name))
if (name == "filesystem") {
OpenComputers.log.fine("If this was a file system provided by a ComputerCraft peripheral, this is normal.");
OpenComputers.log.fine("A component of type '%s' disappeared! This usually means that it didn't save its node.".format(name))
OpenComputers.log.fine("If this was a file system provided by a ComputerCraft peripheral, this is normal.")
}
else OpenComputers.log.warning("A component of type '%s' disappeared! This usually means that it didn't save its node.".format(name))
signal("component_removed", address, name)
invalid += address
}
@ -800,7 +801,7 @@ object Machine {
private val threadPool = ThreadPoolFactory.create("Computer", Settings.get.threads)
trait Owner {
trait Owner extends Context {
def installedMemory: Int
def maxComponents: Int

View File

@ -2,19 +2,20 @@ package li.cil.oc.server.driver.item
import li.cil.oc.Items
import li.cil.oc.api.driver.Slot
import li.cil.oc.common.tileentity
import li.cil.oc.server.component
import li.cil.oc.util.mods.StargateTech2
import net.minecraft.item.ItemStack
import net.minecraft.tileentity.{TileEntity => MCTileEntity}
import stargatetech2.api.bus.IBusDevice
object AbstractBusCard extends Item {
override def worksWith(stack: ItemStack) = isOneOf(stack, Items.abstractBus)
override def createEnvironment(stack: ItemStack, container: MCTileEntity) = container match {
case computer: tileentity.Computer if StargateTech2.isAvailable => new component.AbstractBus(computer)
override def createEnvironment(stack: ItemStack, container: MCTileEntity) = if (StargateTech2.isAvailable) container match {
case device: IBusDevice => new component.AbstractBus(device)
case _ => null
}
else null
override def slot(stack: ItemStack) = Slot.Card
}

View File

@ -5,7 +5,6 @@ import li.cil.oc
import li.cil.oc.api.driver.Slot
import li.cil.oc.api.fs.Label
import li.cil.oc.common.item.{FloppyDisk, HardDiskDrive}
import li.cil.oc.common.tileentity.TileEntity
import li.cil.oc.util.mods.ComputerCraft
import li.cil.oc.{Settings, Items}
import net.minecraft.item.ItemStack
@ -16,17 +15,13 @@ object FileSystem extends Item {
override def worksWith(stack: ItemStack) = isOneOf(stack, Items.hdd1, Items.hdd2, Items.hdd3, Items.floppyDisk) || ComputerCraft.isDisk(stack)
override def createEnvironment(stack: ItemStack, container: MCTileEntity) =
if (ComputerCraft.isDisk(stack)) {
container match {
case tileEntity: TileEntity =>
val address = addressFromTag(dataTag(stack))
val mount = ComputerCraft.createDiskMount(stack, tileEntity.world)
Option(oc.api.FileSystem.asManagedEnvironment(mount, new ComputerCraftLabel(stack))) match {
case Some(environment) =>
environment.node.asInstanceOf[oc.server.network.Node].address = address
environment
case _ => null
}
if (ComputerCraft.isDisk(stack) && container != null) {
val address = addressFromTag(dataTag(stack))
val mount = ComputerCraft.createDiskMount(stack, container.getWorldObj)
Option(oc.api.FileSystem.asManagedEnvironment(mount, new ComputerCraftLabel(stack))) match {
case Some(environment) =>
environment.node.asInstanceOf[oc.server.network.Node].address = address
environment
case _ => null
}
} else Items.multi.subItem(stack) match {

View File

@ -2,18 +2,14 @@ package li.cil.oc.server.driver.item
import li.cil.oc.Items
import li.cil.oc.api.driver.Slot
import li.cil.oc.api.network.Context
import li.cil.oc.server.component
import net.minecraft.item.ItemStack
import net.minecraft.tileentity.{TileEntity => MCTileEntity}
import net.minecraft.tileentity.TileEntity
object InternetCard extends Item {
override def worksWith(stack: ItemStack) = isOneOf(stack, Items.internet)
override def createEnvironment(stack: ItemStack, container: MCTileEntity) = container match {
case context: Context => new component.InternetCard(context)
case _ => null
}
override def createEnvironment(stack: ItemStack, container: TileEntity) = new component.InternetCard()
override def slot(stack: ItemStack) = Slot.Card

View File

@ -13,8 +13,8 @@ trait Item extends driver.Item {
protected def isOneOf(stack: ItemStack, items: common.item.Delegate*) =
Items.multi.subItem(stack) match {
case None => false
case Some(subItem) => items.contains(subItem)
case _ => false
}
}

View File

@ -4,12 +4,12 @@ import li.cil.oc.Items
import li.cil.oc.api.driver.Slot
import li.cil.oc.server.component
import net.minecraft.item.ItemStack
import net.minecraft.tileentity.{TileEntity => MCTileEntity}
import net.minecraft.tileentity.TileEntity
object UpgradeGenerator extends Item {
override def worksWith(stack: ItemStack) = isOneOf(stack, Items.upgradeGenerator)
override def createEnvironment(stack: ItemStack, container: MCTileEntity) = new component.UpgradeGenerator(container)
override def createEnvironment(stack: ItemStack, container: TileEntity) = new component.UpgradeGenerator(container)
override def slot(stack: ItemStack) = Slot.Upgrade
}

View File

@ -5,12 +5,12 @@ import li.cil.oc.server.component
import li.cil.oc.server.driver.Registry
import li.cil.oc.{Settings, Items}
import net.minecraft.item.ItemStack
import net.minecraft.tileentity.{TileEntity => MCTileEntity}
import net.minecraft.tileentity.TileEntity
object UpgradeNavigation extends Item {
override def worksWith(stack: ItemStack) = isOneOf(stack, Items.upgradeNavigation)
override def createEnvironment(stack: ItemStack, container: MCTileEntity) = {
override def createEnvironment(stack: ItemStack, container: TileEntity) = {
val nbt = Registry.itemDriverFor(stack) match {
case Some(driver) => driver.dataTag(stack)
case _ => null

View File

@ -4,12 +4,12 @@ import li.cil.oc.Items
import li.cil.oc.api.driver.Slot
import li.cil.oc.server.component
import net.minecraft.item.ItemStack
import net.minecraft.tileentity.{TileEntity => MCTileEntity}
import net.minecraft.tileentity.TileEntity
object WirelessNetworkCard extends Item {
override def worksWith(stack: ItemStack) = isOneOf(stack, Items.wlan)
override def createEnvironment(stack: ItemStack, container: MCTileEntity) =
override def createEnvironment(stack: ItemStack, container: TileEntity) =
if (container != null) new component.WirelessNetworkCard(container) else null
override def slot(stack: ItemStack) = Slot.Card