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.PrintedCircuitBoard.name=Gedruckte Leiterplatte (PCB)
oc:item.RawCircuitBoard.name=Leiterplattenrohling oc:item.RawCircuitBoard.name=Leiterplattenrohling
oc:item.RedstoneCard.name=Redstonekarte 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.Terminal.name=Fernbedienung
oc:item.Transistor.name=Transistor oc:item.Transistor.name=Transistor
oc:item.UpgradeCrafting.name=Fertigungs-Upgrade 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.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.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.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.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.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. 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.PrintedCircuitBoard.name=Printed Circuit Board (PCB)
oc:item.RawCircuitBoard.name=Raw Circuit Board oc:item.RawCircuitBoard.name=Raw Circuit Board
oc:item.RedstoneCard.name=Redstone Card 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.Terminal.name=Remote Terminal
oc:item.Transistor.name=Transistor oc:item.Transistor.name=Transistor
oc:item.UpgradeCrafting.name=Crafting Upgrade 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.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.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.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.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.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. 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]] [nuggetIron, "oc:craftingKeyboard", nuggetIron]]
} }
server { server1 {
input: [[obsidian, "oc:craftingRAMTier3", obsidian] 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"] ["oc:circuitTier2", "oc:circuitTier3", "oc:circuitTier2"]
[obsidian, "oc:craftingCircuitBoardPrinted", obsidian]] [obsidian, "oc:craftingCircuitBoardPrinted", obsidian]]
} }
server3 {
input: [[obsidian, "oc:craftingRAMTier5", obsidian]
["oc:circuitTier3", "oc:circuitTier3", "oc:circuitTier3"]
[obsidian, "oc:craftingCircuitBoardPrinted", obsidian]]
}
ram1 { ram1 {
input: [["oc:circuitTier1", "", "oc:circuitTier1"] input: [["oc:circuitTier1", "", "oc:circuitTier1"]

View File

@ -12,8 +12,18 @@ terminal {
[nuggetIron, "oc:craftingKeyboard", nuggetIron]] [nuggetIron, "oc:craftingKeyboard", nuggetIron]]
} }
server { server1 {
input: [["oc:circuitTier3", "oc:craftingRAMTier4", "oc:circuitTier3"] 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:circuitTier3", "oc:craftingCaseTier3", "oc:circuitTier3"]
["oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted", "oc:craftingCircuitBoardPrinted"]] ["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. # like, you know, more than the loaded area.
# See also: `wirelessStrength`. # See also: `wirelessStrength`.
maxWirelessRange: 400 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 // Servers
var server: item.Server = _ var server1, server2, server3: item.Server = _
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //
// Memory // Memory
@ -124,11 +124,13 @@ object Items {
ram5 = new item.Memory(multi, 4) ram5 = new item.Memory(multi, 4)
// v1.2.0 // v1.2.0
server = new item.Server(multi) server3 = new item.Server(multi, 2)
terminal = new item.Terminal(multi) terminal = new item.Terminal(multi)
cpu1 = new item.CPU(multi, 1) cpu1 = new item.CPU(multi, 1)
cpu2 = new item.CPU(multi, 2) cpu2 = new item.CPU(multi, 2)
internet = new item.InternetCard(multi) 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.hdd2.createItemStack(), recipes, "hdd2")
addRecipe(Items.hdd3.createItemStack(), recipes, "hdd3") 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) { if (StargateTech2.isAvailable) {
addRecipe(Items.abstractBus.createItemStack(), recipes, "abstractBusCard") 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 maxClipboard = config.getInt("misc.maxClipboard") max 0
val maxNetworkPacketSize = config.getInt("misc.maxNetworkPacketSize") max 0 val maxNetworkPacketSize = config.getInt("misc.maxNetworkPacketSize") max 0
val maxWirelessRange = config.getDouble("misc.maxWirelessRange") 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 { object Settings {

View File

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

View File

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

View File

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

View File

@ -9,15 +9,15 @@ class Server(playerInventory: InventoryPlayer, serverInventory: ServerInventory)
addSlotToContainer(76, 7 + i * slotSize, api.driver.Slot.Card, 2 - i) addSlotToContainer(76, 7 + i * slotSize, api.driver.Slot.Card, 2 - i)
} }
for (i <- 0 to 3) { for (i <- 0 to 1 + serverInventory.tier) {
addSlotToContainer(100, 7 + i * slotSize, api.driver.Slot.Processor) 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) 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) 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.Settings
import li.cil.oc.api.driver.Slot import li.cil.oc.api.driver.Slot
import li.cil.oc.server.driver.Registry import li.cil.oc.server.driver.Registry
import net.minecraft.item.ItemStack
import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
trait ServerInventory extends ItemStackInventory { 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" override def getInventoryName = Settings.namespace + "container.Server"
@ -15,8 +21,17 @@ trait ServerInventory extends ItemStackInventory {
override def isUseableByPlayer(player: EntityPlayer) = false override def isUseableByPlayer(player: EntityPlayer) = false
override def isItemValidForSlot(slot: Int, stack: ItemStack) = override def isItemValidForSlot(slot: Int, stack: ItemStack) = tier match {
(slot, Registry.itemDriverFor(stack)) 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 (_, None) => false // Invalid item.
case (0, Some(driver)) => driver.slot(stack) == Slot.Card && driver.tier(stack) <= 2 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 (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 (10 | 11 | 12 | 13, Some(driver)) => driver.slot(stack) == Slot.HardDiskDrive && driver.tier(stack) <= 2
case _ => false // Invalid slot. 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) 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 li.cil.oc.{Settings, OpenComputers}
import net.minecraft.client.renderer.texture.IIconRegister import net.minecraft.client.renderer.texture.IIconRegister
import net.minecraft.entity.player.EntityPlayer import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack import net.minecraft.item.{EnumRarity, ItemStack}
import net.minecraft.world.World import net.minecraft.world.World
import scala.collection.mutable import scala.collection.mutable
class Server(val parent: Delegator) extends Delegate { class Server(val parent: Delegator, val tier: Int) extends Delegate {
val unlocalizedName = "Server" 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 override def maxStackSize = 1
private object HelperInventory extends ServerInventory { private object HelperInventory extends ServerInventory {
def tier = Server.this.tier
var container: ItemStack = null var container: ItemStack = null
} }
override def tooltipLines(stack: ItemStack, player: EntityPlayer, tooltip: util.List[String], advanced: Boolean) { 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.container = stack
HelperInventory.reinitialize() HelperInventory.reinitialize()
val items = mutable.Map.empty[String, Int] val items = mutable.Map.empty[String, Int]
@ -41,7 +46,7 @@ class Server(val parent: Delegator) extends Delegate {
override def registerIcons(iconRegister: IIconRegister) { override def registerIcons(iconRegister: IIconRegister) {
super.registerIcons(iconRegister) 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) = { 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) { if (!world.isRemote) {
rack.servers(slot) match { rack.servers(slot) match {
case Some(server) => case Some(server) =>
val key = UUID.randomUUID().toString
val keys = rack.terminals(slot).keys
if (!stack.hasTagCompound) { if (!stack.hasTagCompound) {
stack.setTagCompound(new NBTTagCompound()) stack.setTagCompound(new NBTTagCompound())
} }
val key = UUID.randomUUID().toString else {
rack.terminals(slot).key = Some(key) 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) ServerPacketSender.sendServerState(rack, slot)
stack.getTagCompound.setString(Settings.namespace + "key", key) stack.getTagCompound.setString(Settings.namespace + "key", key)
stack.getTagCompound.setString(Settings.namespace + "server", server.machine.node.address) 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. // See AbstractBusAware as to why we have to define the IBusDevice here.
@Optional.Interface(iface = "stargatetech2.api.bus.IBusDevice", modid = "StargateTech2") @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) protected val _computer = if (isRemote) null else new Machine(this)
def computer = _computer def computer = _computer

View File

@ -2,6 +2,7 @@ package li.cil.oc.common.tileentity
import com.google.common.base.Strings import com.google.common.base.Strings
import cpw.mods.fml.common.Optional import cpw.mods.fml.common.Optional
import cpw.mods.fml.common.Optional.Method
import cpw.mods.fml.relauncher.{Side, SideOnly} import cpw.mods.fml.relauncher.{Side, SideOnly}
import li.cil.oc.api.Network import li.cil.oc.api.Network
import li.cil.oc.api.network.{Connector, Visibility, Node, Analyzable} 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 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) = 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 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.writeInt(number)
pb.writeBoolean(t.isRunning(number)) pb.writeBoolean(t.isRunning(number))
pb.writeDirection(t.sides(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 { player match {
case Some(p) => pb.sendToPlayer(p) 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.Settings
import li.cil.oc.api.Network 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 net.minecraft.nbt.NBTTagCompound
import scala.collection.convert.WrapAsScala._ import scala.collection.convert.WrapAsScala._
import stargatetech2.api.StargateTechAPI import stargatetech2.api.StargateTechAPI
import stargatetech2.api.bus._ 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). val node = Network.newNode(this, Visibility.Neighbors).
withComponent("abstract_bus"). withComponent("abstract_bus").
withConnector(). withConnector().
create() create()
val busInterface: IBusInterface = StargateTechAPI.api.getFactory.getIBusInterface(owner, this) val busInterface: IBusInterface = StargateTechAPI.api.getFactory.getIBusInterface(device, this)
protected var isEnabled = true 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 sendQueue: Option[QueuedPacket] = None
protected var owner: Option[Context] = None
// ----------------------------------------------------------------------- // // ----------------------------------------------------------------------- //
override def canHandlePacket(sender: Short, protocolID: Int, hasLIP: Boolean) = hasLIP 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 lip = packet.getPlainText
val data = Map(lip.getEntryList.map(key => (key, lip.get(key))): _*) 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) 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) { 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) { override def load(nbt: NBTTagCompound) {
super.load(nbt) super.load(nbt)
busInterface.readFromNBT(nbt, "bus") 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
import li.cil.oc.api.Network import li.cil.oc.api.Network
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.util.ThreadPoolFactory
import li.cil.oc.{OpenComputers, Settings} import li.cil.oc.{OpenComputers, Settings}
import li.cil.oc.util.ExtendedNBT._
import net.minecraft.nbt.NBTTagCompound import net.minecraft.nbt.NBTTagCompound
import net.minecraft.server.MinecraftServer import net.minecraft.server.MinecraftServer
import scala.Array import scala.Array
import scala.collection.mutable
import scala.collection.convert.WrapAsScala._ 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). val node = Network.newNode(this, Visibility.Network).
withComponent("internet", Visibility.Neighbors). withComponent("internet", Visibility.Neighbors).
create() create()
@ -25,6 +25,8 @@ class InternetCard(val owner: Context) extends ManagedComponent {
val romInternet = Option(api.FileSystem.asManagedEnvironment(api.FileSystem. val romInternet = Option(api.FileSystem.asManagedEnvironment(api.FileSystem.
fromClass(OpenComputers.getClass, Settings.resourceDomain, "lua/component/internet"), "internet")) fromClass(OpenComputers.getClass, Settings.resourceDomain, "lua/component/internet"), "internet"))
protected var owner: Option[Context] = None
protected val connections = mutable.Map.empty[Int, SocketChannel] protected val connections = mutable.Map.empty[Int, SocketChannel]
// For HTTP requests the state switches like so: // For HTTP requests the state switches like so:
@ -49,7 +51,7 @@ class InternetCard(val owner: Context) extends ManagedComponent {
@Callback @Callback
def request(context: Context, args: Arguments): Array[AnyRef] = { 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") throw new IllegalArgumentException("can only be used by the owning computer")
} }
val address = args.checkString(0) val address = args.checkString(0)
@ -105,16 +107,16 @@ class InternetCard(val owner: Context) extends ManagedComponent {
finally { finally {
http.disconnect() http.disconnect()
} }
case other => owner.signal("http_response", address, Unit, "connection failed") case other => owner.foreach(_.signal("http_response", address, Unit, "connection failed"))
} }
} }
catch { catch {
case e: FileNotFoundException => 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 => case _: SocketTimeoutException =>
owner.signal("http_response", address, Unit, "timeout") owner.foreach(_.signal("http_response", address, Unit, "timeout"))
case e: Throwable => 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 { finally {
InternetCard.this.synchronized { InternetCard.this.synchronized {
@ -200,7 +202,7 @@ class InternetCard(val owner: Context) extends ManagedComponent {
this.synchronized { this.synchronized {
if (request.isEmpty && queue.isDefined) { if (request.isEmpty && queue.isDefined) {
val (address, packets) = queue.get 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() packets.dequeue()
} }
if (packets.isEmpty) { if (packets.isEmpty) {
@ -214,6 +216,9 @@ class InternetCard(val owner: Context) extends ManagedComponent {
override def onConnect(node: Node) { override def onConnect(node: Node) {
super.onConnect(node) super.onConnect(node)
if (owner.isEmpty && node.host.isInstanceOf[Context]) {
owner = Some(node.host.asInstanceOf[Context])
}
if (node == this.node) { if (node == this.node) {
romInternet.foreach(rom => node.neighbors.head.connect(rom.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) { override def onDisconnect(node: Node) {
super.onDisconnect(node) super.onDisconnect(node)
if (owner.isDefined && node.host.isInstanceOf[Context] && (node.host.asInstanceOf[Context] == owner.get)) {
owner = None
}
if (node == this.node) { if (node == this.node) {
for ((_, socket) <- connections) { for ((_, socket) <- connections) {
socket.close() socket.close()
@ -235,7 +243,7 @@ class InternetCard(val owner: Context) extends ManagedComponent {
override def onMessage(message: Message) { override def onMessage(message: Message) {
super.onMessage(message) super.onMessage(message)
message.data match { 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.values.foreach(_.close())
connections.clear() connections.clear()
InternetCard.this.synchronized { InternetCard.this.synchronized {

View File

@ -1,9 +1,11 @@
package li.cil.oc.server.component package li.cil.oc.server.component
import li.cil.oc.Items
import li.cil.oc.api.driver import li.cil.oc.api.driver
import li.cil.oc.api.network.{Message, Node} import li.cil.oc.api.network.{Message, Node}
import li.cil.oc.common.inventory.ComponentInventory import li.cil.oc.common.inventory.ComponentInventory
import li.cil.oc.common.inventory.ServerInventory import li.cil.oc.common.inventory.ServerInventory
import li.cil.oc.common.item
import li.cil.oc.common.tileentity import li.cil.oc.common.tileentity
import li.cil.oc.server.component.machine.Machine import li.cil.oc.server.component.machine.Machine
import li.cil.oc.server.driver.Registry 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() 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 { 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 = _ var containerOverride: ItemStack = _
override def container = if (containerOverride != null) containerOverride else rack.getStackInSlot(number) 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.entity.item.EntityItem
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.nbt.NBTTagCompound import net.minecraft.nbt.NBTTagCompound
import net.minecraft.tileentity.{TileEntity => MCTileEntity, TileEntityFurnace} import net.minecraft.tileentity.{TileEntity, TileEntityFurnace}
import scala.Some
class UpgradeGenerator(val owner: MCTileEntity) extends ManagedComponent { class UpgradeGenerator(val owner: TileEntity) extends ManagedComponent {
val node = Network.newNode(this, Visibility.Network). val node = Network.newNode(this, Visibility.Network).
withComponent("generator", Visibility.Neighbors). withComponent("generator", Visibility.Neighbors).
withConnector(). withConnector().

View File

@ -485,10 +485,11 @@ class Machine(val owner: Machine.Owner) extends ManagedComponent with Context wi
val invalid = mutable.Set.empty[String] val invalid = mutable.Set.empty[String]
for ((address, name) <- components) { for ((address, name) <- components) {
if (node.network.node(address) == null) { 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") { 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) signal("component_removed", address, name)
invalid += address invalid += address
} }
@ -800,7 +801,7 @@ object Machine {
private val threadPool = ThreadPoolFactory.create("Computer", Settings.get.threads) private val threadPool = ThreadPoolFactory.create("Computer", Settings.get.threads)
trait Owner { trait Owner extends Context {
def installedMemory: Int def installedMemory: Int
def maxComponents: 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.Items
import li.cil.oc.api.driver.Slot import li.cil.oc.api.driver.Slot
import li.cil.oc.common.tileentity
import li.cil.oc.server.component import li.cil.oc.server.component
import li.cil.oc.util.mods.StargateTech2 import li.cil.oc.util.mods.StargateTech2
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.tileentity.{TileEntity => MCTileEntity} import net.minecraft.tileentity.{TileEntity => MCTileEntity}
import stargatetech2.api.bus.IBusDevice
object AbstractBusCard extends Item { object AbstractBusCard extends Item {
override def worksWith(stack: ItemStack) = isOneOf(stack, Items.abstractBus) override def worksWith(stack: ItemStack) = isOneOf(stack, Items.abstractBus)
override def createEnvironment(stack: ItemStack, container: MCTileEntity) = container match { override def createEnvironment(stack: ItemStack, container: MCTileEntity) = if (StargateTech2.isAvailable) container match {
case computer: tileentity.Computer if StargateTech2.isAvailable => new component.AbstractBus(computer) case device: IBusDevice => new component.AbstractBus(device)
case _ => null case _ => null
} }
else null
override def slot(stack: ItemStack) = Slot.Card 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.driver.Slot
import li.cil.oc.api.fs.Label import li.cil.oc.api.fs.Label
import li.cil.oc.common.item.{FloppyDisk, HardDiskDrive} 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.util.mods.ComputerCraft
import li.cil.oc.{Settings, Items} import li.cil.oc.{Settings, Items}
import net.minecraft.item.ItemStack 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 worksWith(stack: ItemStack) = isOneOf(stack, Items.hdd1, Items.hdd2, Items.hdd3, Items.floppyDisk) || ComputerCraft.isDisk(stack)
override def createEnvironment(stack: ItemStack, container: MCTileEntity) = override def createEnvironment(stack: ItemStack, container: MCTileEntity) =
if (ComputerCraft.isDisk(stack)) { if (ComputerCraft.isDisk(stack) && container != null) {
container match { val address = addressFromTag(dataTag(stack))
case tileEntity: TileEntity => val mount = ComputerCraft.createDiskMount(stack, container.getWorldObj)
val address = addressFromTag(dataTag(stack)) Option(oc.api.FileSystem.asManagedEnvironment(mount, new ComputerCraftLabel(stack))) match {
val mount = ComputerCraft.createDiskMount(stack, tileEntity.world) case Some(environment) =>
Option(oc.api.FileSystem.asManagedEnvironment(mount, new ComputerCraftLabel(stack))) match { environment.node.asInstanceOf[oc.server.network.Node].address = address
case Some(environment) => environment
environment.node.asInstanceOf[oc.server.network.Node].address = address
environment
case _ => null
}
case _ => null case _ => null
} }
} else Items.multi.subItem(stack) match { } 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.Items
import li.cil.oc.api.driver.Slot import li.cil.oc.api.driver.Slot
import li.cil.oc.api.network.Context
import li.cil.oc.server.component import li.cil.oc.server.component
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.tileentity.{TileEntity => MCTileEntity} import net.minecraft.tileentity.TileEntity
object InternetCard extends Item { object InternetCard extends Item {
override def worksWith(stack: ItemStack) = isOneOf(stack, Items.internet) override def worksWith(stack: ItemStack) = isOneOf(stack, Items.internet)
override def createEnvironment(stack: ItemStack, container: MCTileEntity) = container match { override def createEnvironment(stack: ItemStack, container: TileEntity) = new component.InternetCard()
case context: Context => new component.InternetCard(context)
case _ => null
}
override def slot(stack: ItemStack) = Slot.Card 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*) = protected def isOneOf(stack: ItemStack, items: common.item.Delegate*) =
Items.multi.subItem(stack) match { Items.multi.subItem(stack) match {
case None => false
case Some(subItem) => items.contains(subItem) 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.api.driver.Slot
import li.cil.oc.server.component import li.cil.oc.server.component
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.tileentity.{TileEntity => MCTileEntity} import net.minecraft.tileentity.TileEntity
object UpgradeGenerator extends Item { object UpgradeGenerator extends Item {
override def worksWith(stack: ItemStack) = isOneOf(stack, Items.upgradeGenerator) 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 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.server.driver.Registry
import li.cil.oc.{Settings, Items} import li.cil.oc.{Settings, Items}
import net.minecraft.item.ItemStack import net.minecraft.item.ItemStack
import net.minecraft.tileentity.{TileEntity => MCTileEntity} import net.minecraft.tileentity.TileEntity
object UpgradeNavigation extends Item { object UpgradeNavigation extends Item {
override def worksWith(stack: ItemStack) = isOneOf(stack, Items.upgradeNavigation) 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 { val nbt = Registry.itemDriverFor(stack) match {
case Some(driver) => driver.dataTag(stack) case Some(driver) => driver.dataTag(stack)
case _ => null case _ => null

View File

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