diff --git a/src/main/java/li/cil/oc/Items.scala b/src/main/java/li/cil/oc/Items.scala index 549fb2658..c167743b0 100644 --- a/src/main/java/li/cil/oc/Items.scala +++ b/src/main/java/li/cil/oc/Items.scala @@ -16,7 +16,7 @@ object Items { // ----------------------------------------------------------------------- // // Servers - var server: item.Server = _ + var server1, server2, server3: item.Server = _ // ----------------------------------------------------------------------- // // Memory @@ -125,11 +125,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) // ----------------------------------------------------------------------- // diff --git a/src/main/java/li/cil/oc/Recipes.scala b/src/main/java/li/cil/oc/Recipes.scala index c916df98c..c5641e90a 100644 --- a/src/main/java/li/cil/oc/Recipes.scala +++ b/src/main/java/li/cil/oc/Recipes.scala @@ -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") diff --git a/src/main/java/li/cil/oc/Settings.scala b/src/main/java/li/cil/oc/Settings.scala index 4c1d30841..03d2c1888 100644 --- a/src/main/java/li/cil/oc/Settings.scala +++ b/src/main/java/li/cil/oc/Settings.scala @@ -165,7 +165,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 { diff --git a/src/main/java/li/cil/oc/client/GuiHandler.scala b/src/main/java/li/cil/oc/client/GuiHandler.scala index 68e287527..cf1236d32 100644 --- a/src/main/java/li/cil/oc/client/GuiHandler.scala +++ b/src/main/java/li/cil/oc/client/GuiHandler.scala @@ -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 }) diff --git a/src/main/java/li/cil/oc/common/GuiHandler.scala b/src/main/java/li/cil/oc/common/GuiHandler.scala index fdec9afa0..c1d275b2f 100644 --- a/src/main/java/li/cil/oc/common/GuiHandler.scala +++ b/src/main/java/li/cil/oc/common/GuiHandler.scala @@ -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 diff --git a/src/main/java/li/cil/oc/common/container/Server.scala b/src/main/java/li/cil/oc/common/container/Server.scala index ccccce67e..96a0a94d6 100644 --- a/src/main/java/li/cil/oc/common/container/Server.scala +++ b/src/main/java/li/cil/oc/common/container/Server.scala @@ -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) } diff --git a/src/main/java/li/cil/oc/common/inventory/ServerInventory.scala b/src/main/java/li/cil/oc/common/inventory/ServerInventory.scala index 1987fb670..3c024a179 100644 --- a/src/main/java/li/cil/oc/common/inventory/ServerInventory.scala +++ b/src/main/java/li/cil/oc/common/inventory/ServerInventory.scala @@ -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 getInvName = 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. + } + } } diff --git a/src/main/java/li/cil/oc/common/item/CPU.scala b/src/main/java/li/cil/oc/common/item/CPU.scala index 6b2ca7960..8023adefa 100644 --- a/src/main/java/li/cil/oc/common/item/CPU.scala +++ b/src/main/java/li/cil/oc/common/item/CPU.scala @@ -25,4 +25,3 @@ class CPU(val parent: Delegator, val tier: Int) extends Delegate { icon = iconRegister.registerIcon(Settings.resourceDomain + ":cpu" + tier) } } - diff --git a/src/main/java/li/cil/oc/common/item/Server.scala b/src/main/java/li/cil/oc/common/item/Server.scala index 681f7d2c5..07c5af98c 100644 --- a/src/main/java/li/cil/oc/common/item/Server.scala +++ b/src/main/java/li/cil/oc/common/item/Server.scala @@ -7,21 +7,26 @@ import li.cil.oc.util.Tooltip import li.cil.oc.{Settings, OpenComputers} import net.minecraft.client.renderer.texture.IconRegister 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: 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) = { diff --git a/src/main/java/li/cil/oc/common/tileentity/Rack.scala b/src/main/java/li/cil/oc/common/tileentity/Rack.scala index a30310ddd..f98146a59 100644 --- a/src/main/java/li/cil/oc/common/tileentity/Rack.scala +++ b/src/main/java/li/cil/oc/common/tileentity/Rack.scala @@ -105,7 +105,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 + } // ----------------------------------------------------------------------- // diff --git a/src/main/java/li/cil/oc/server/component/Server.scala b/src/main/java/li/cil/oc/server/component/Server.scala index 48d9dc79a..eb1c3a5bd 100644 --- a/src/main/java/li/cil/oc/server/component/Server.scala +++ b/src/main/java/li/cil/oc/server/component/Server.scala @@ -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 @@ -90,6 +92,11 @@ class Server(val rack: tileentity.Rack, val number: Int) extends Machine.Owner { } } + override def tier = Items.multi.subItem(container) match { + case Some(server: item.Server) => server.tier + case _ => 0 + } + var containerOverride: ItemStack = _ override def container = if (containerOverride != null) containerOverride else rack.getStackInSlot(number) diff --git a/src/main/java/li/cil/oc/server/driver/item/Item.scala b/src/main/java/li/cil/oc/server/driver/item/Item.scala index 450421ff5..0482122e4 100644 --- a/src/main/java/li/cil/oc/server/driver/item/Item.scala +++ b/src/main/java/li/cil/oc/server/driver/item/Item.scala @@ -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 } } diff --git a/src/main/resources/assets/opencomputers/lang/de_DE.lang b/src/main/resources/assets/opencomputers/lang/de_DE.lang index ab030181d..ff6848bb8 100644 --- a/src/main/resources/assets/opencomputers/lang/de_DE.lang +++ b/src/main/resources/assets/opencomputers/lang/de_DE.lang @@ -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. diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index 602c98c12..544af22b6 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -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. diff --git a/src/main/resources/assets/opencomputers/recipes/default.recipes b/src/main/resources/assets/opencomputers/recipes/default.recipes index 9154c1d31..e901711bb 100644 --- a/src/main/resources/assets/opencomputers/recipes/default.recipes +++ b/src/main/resources/assets/opencomputers/recipes/default.recipes @@ -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"] diff --git a/src/main/resources/assets/opencomputers/recipes/hardmode.recipes b/src/main/resources/assets/opencomputers/recipes/hardmode.recipes index 807c4327e..571ef0346 100644 --- a/src/main/resources/assets/opencomputers/recipes/hardmode.recipes +++ b/src/main/resources/assets/opencomputers/recipes/hardmode.recipes @@ -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"]] } diff --git a/src/main/resources/assets/opencomputers/textures/items/server.png b/src/main/resources/assets/opencomputers/textures/items/server.png deleted file mode 100644 index 5088c51d6..000000000 Binary files a/src/main/resources/assets/opencomputers/textures/items/server.png and /dev/null differ diff --git a/src/main/resources/assets/opencomputers/textures/items/server0.png b/src/main/resources/assets/opencomputers/textures/items/server0.png new file mode 100644 index 000000000..6c82c19ca Binary files /dev/null and b/src/main/resources/assets/opencomputers/textures/items/server0.png differ diff --git a/src/main/resources/assets/opencomputers/textures/items/server1.png b/src/main/resources/assets/opencomputers/textures/items/server1.png new file mode 100644 index 000000000..c9b44992f Binary files /dev/null and b/src/main/resources/assets/opencomputers/textures/items/server1.png differ diff --git a/src/main/resources/assets/opencomputers/textures/items/server2.png b/src/main/resources/assets/opencomputers/textures/items/server2.png new file mode 100644 index 000000000..cec4e2ba1 Binary files /dev/null and b/src/main/resources/assets/opencomputers/textures/items/server2.png differ diff --git a/src/main/resources/reference.conf b/src/main/resources/reference.conf index 32b56f7c6..8e9597222 100644 --- a/src/main/resources/reference.conf +++ b/src/main/resources/reference.conf @@ -674,5 +674,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] } } \ No newline at end of file