diff --git a/assets/items.psd b/assets/items.psd index 9a6d7b44d..6856b63bd 100644 Binary files a/assets/items.psd and b/assets/items.psd differ diff --git a/src/main/resources/assets/opencomputers/lang/de_DE.lang b/src/main/resources/assets/opencomputers/lang/de_DE.lang index 71bd3f583..4a7fdeb21 100644 --- a/src/main/resources/assets/opencomputers/lang/de_DE.lang +++ b/src/main/resources/assets/opencomputers/lang/de_DE.lang @@ -81,7 +81,9 @@ item.oc.Server1.name=Server (Stufe 2) item.oc.Server2.name=Server (Stufe 3) item.oc.Server3.name=Server (Kreativ) item.oc.Tablet.name=Tablet -item.oc.TabletCase.name=Tablet-Gehäuse +item.oc.TabletCase0.name=Tablet-Gehäuse (Stufe 1) +item.oc.TabletCase1.name=Tablet-Gehäuse (Stufe 2) +item.oc.TabletCase3.name=Tablet-Gehäuse (Kreativ) item.oc.Terminal.name=Fernbedienung item.oc.Transistor.name=Transistor item.oc.UpgradeAngel.name=Schwebe-Upgrade @@ -175,6 +177,7 @@ oc:container.DiskDrive=Diskettenlaufwerk oc:container.Server=Server oc:container.ServerRack=Serverschrank oc:container.Switch=Switch +oc:container.TabletWrapper=Tablet # Keybinds key.materialCosts=Materialkosten anzeigen diff --git a/src/main/resources/assets/opencomputers/lang/en_US.lang b/src/main/resources/assets/opencomputers/lang/en_US.lang index 9d4afc855..4e2fff1c2 100644 --- a/src/main/resources/assets/opencomputers/lang/en_US.lang +++ b/src/main/resources/assets/opencomputers/lang/en_US.lang @@ -94,7 +94,9 @@ item.oc.Server1.name=Server (Tier 2) item.oc.Server2.name=Server (Tier 3) item.oc.Server3.name=Server (Creative) item.oc.Tablet.name=Tablet -item.oc.TabletCase.name=Tablet Case +item.oc.TabletCase0.name=Tablet Case (Tier 1) +item.oc.TabletCase1.name=Tablet Case (Tier 2) +item.oc.TabletCase3.name=Tablet Case (Creative) item.oc.Terminal.name=Remote Terminal item.oc.Transistor.name=Transistor item.oc.UpgradeAngel.name=Angel Upgrade @@ -199,6 +201,7 @@ oc:container.Raid=Raid oc:container.Server=Server oc:container.ServerRack=Server Rack oc:container.Switch=Switch +oc:container.TabletWrapper=Tablet # Keybinds key.materialCosts=Show Material Costs diff --git a/src/main/resources/assets/opencomputers/lang/fr_FR.lang b/src/main/resources/assets/opencomputers/lang/fr_FR.lang index f51319b97..5bd0111a9 100644 --- a/src/main/resources/assets/opencomputers/lang/fr_FR.lang +++ b/src/main/resources/assets/opencomputers/lang/fr_FR.lang @@ -87,7 +87,9 @@ item.oc.Server1.name=Serveur (Niveau 2) item.oc.Server2.name=Serveur (Niveau 3) item.oc.Server3.name=Serveur (Créatif) item.oc.Tablet.name=Tablette -item.oc.TabletCase.name=Boitier de tablette +item.oc.TabletCase.name=Boitier de tablette (Niveau 1) +item.oc.TabletCase.name=Boitier de tablette (Niveau 2) +item.oc.TabletCase.name=Boitier de tablette (Créatif) item.oc.Terminal.name=Terminal à distance item.oc.Transistor.name=Transistor item.oc.UpgradeAngel.name=Amélioration ange @@ -187,6 +189,7 @@ oc:container.Raid=Raid oc:container.Server=Serveur oc:container.ServerRack=Support de serveur oc:container.Switch=Routeur +oc:container.TabletWrapper=Tablette # Keybinds key.materialCosts=Montrer les coût en matériaux diff --git a/src/main/resources/assets/opencomputers/lang/it_IT.lang b/src/main/resources/assets/opencomputers/lang/it_IT.lang index 502ae9162..1ad189807 100644 --- a/src/main/resources/assets/opencomputers/lang/it_IT.lang +++ b/src/main/resources/assets/opencomputers/lang/it_IT.lang @@ -79,7 +79,9 @@ item.oc.Server1.name=Server (Livello 2) item.oc.Server2.name=Server (Livello 3) item.oc.Server3.name=Server (Creativo) item.oc.Tablet.name=Tablet -item.oc.TabletCase.name=Custodia Tablet +item.oc.TabletCase0.name=Custodia Tablet (Livello 1) +item.oc.TabletCase1.name=Custodia Tablet (Livello 2) +item.oc.TabletCase3.name=Custodia Tablet (Creativo) item.oc.Terminal.name=Terminale Remoto item.oc.Transistor.name=Transistor item.oc.UpgradeAngel.name=Upgrade Angel @@ -173,6 +175,7 @@ oc:container.DiskDrive=Unità Disco oc:container.Server=Server oc:container.ServerRack=Server Rack oc:container.Switch=Switch +oc:container.TabletWrapper=Tablet # Keybinds key.materialCosts=Mostra Costi Materiali diff --git a/src/main/resources/assets/opencomputers/lang/ru_RU.lang b/src/main/resources/assets/opencomputers/lang/ru_RU.lang index 6b1c4d802..f7babca09 100644 --- a/src/main/resources/assets/opencomputers/lang/ru_RU.lang +++ b/src/main/resources/assets/opencomputers/lang/ru_RU.lang @@ -166,6 +166,7 @@ oc:container.DiskDrive=Дисковод oc:container.Server=Сервер oc:container.ServerRack=Серверная стойка oc:container.Switch=Коммутатор +oc:container.TabletWrapper=Планшет # Keybinds key.materialCosts=Показать стоимость материала diff --git a/src/main/resources/assets/opencomputers/lang/zh_CN.lang b/src/main/resources/assets/opencomputers/lang/zh_CN.lang index f7980299d..b84ef6fdb 100644 --- a/src/main/resources/assets/opencomputers/lang/zh_CN.lang +++ b/src/main/resources/assets/opencomputers/lang/zh_CN.lang @@ -81,7 +81,9 @@ item.oc.Server1.name=高级服务器 item.oc.Server2.name=超级服务器 item.oc.Server3.name=创造模式服务器 item.oc.Tablet.name=平板电脑 -item.oc.TabletCase.name=平板电脑保护套 +item.oc.TabletCase0.name=平板电脑保护套 +item.oc.TabletCase1.name=平板电脑保护套 +item.oc.TabletCase3.name=平板电脑保护套 item.oc.Terminal.name=远程终端 item.oc.Transistor.name=晶体管 item.oc.UpgradeAngel.name=天使方块升级 @@ -175,6 +177,7 @@ oc:container.DiskDrive=磁盘驱动器 oc:container.Server=服务器 oc:container.ServerRack=服务器机架 oc:container.Switch=交换机 +oc:container.TabletWrapper=平板电脑 # Keybinds key.materialCosts=显示材料需求 diff --git a/src/main/resources/assets/opencomputers/lang/zh_TW.lang b/src/main/resources/assets/opencomputers/lang/zh_TW.lang index 3d141486d..04e9ddc49 100644 --- a/src/main/resources/assets/opencomputers/lang/zh_TW.lang +++ b/src/main/resources/assets/opencomputers/lang/zh_TW.lang @@ -81,7 +81,9 @@ item.oc.Server1.name=伺服器 (2級) item.oc.Server2.name=伺服器 (3級) item.oc.Server3.name=伺服器 (創造模式) item.oc.Tablet.name=平板電腦 -item.oc.TabletCase.name=平板電腦保護套 +item.oc.TabletCase0.name=平板電腦保護套 (1級) +item.oc.TabletCase1.name=平板電腦保護套 (2級) +item.oc.TabletCase3.name=平板電腦保護套 (創造模式) item.oc.Terminal.name=遠端終端機 item.oc.Transistor.name=電晶體 item.oc.UpgradeAngel.name=天使升級 @@ -174,6 +176,7 @@ oc:container.DiskDrive=硬碟 oc:container.Server=伺服器 oc:container.ServerRack=伺服器機架 oc:container.Switch=路由器 +oc:container.TabletWrapper=平板電腦 # Keybinds key.materialCosts=顯示材料成本 diff --git a/src/main/resources/assets/opencomputers/recipes/default.recipes b/src/main/resources/assets/opencomputers/recipes/default.recipes index 019783dff..6cb743bcd 100644 --- a/src/main/resources/assets/opencomputers/recipes/default.recipes +++ b/src/main/resources/assets/opencomputers/recipes/default.recipes @@ -31,11 +31,16 @@ terminal { ["oc:circuitChip3", "oc:screen2", "oc:wlanCard"] [nuggetIron, "oc:keyboard", nuggetIron]] } -tabletCase { +tabletCase1 { input: [[ingotGold, button, ingotGold] ["oc:componentBus1", "oc:screen2", "oc:circuitChip3"] [ingotGold, "oc:materialCircuitBoardPrinted", ingotGold]] } +tabletCase2 { + input: [["oc:circuitChip2", button, ingotGold] + ["oc:componentBus3", "oc:screen2", "oc:circuitChip3"] + ["oc:circuitChip2", "oc:materialCircuitBoardPrinted", ingotGold]] +} server1 { input: [[obsidian, "oc:ram4", obsidian] diff --git a/src/main/resources/assets/opencomputers/textures/items/TabletCase.png b/src/main/resources/assets/opencomputers/textures/items/TabletCase0.png similarity index 100% rename from src/main/resources/assets/opencomputers/textures/items/TabletCase.png rename to src/main/resources/assets/opencomputers/textures/items/TabletCase0.png diff --git a/src/main/resources/assets/opencomputers/textures/items/TabletCase1.png b/src/main/resources/assets/opencomputers/textures/items/TabletCase1.png new file mode 100644 index 000000000..e333cf113 Binary files /dev/null and b/src/main/resources/assets/opencomputers/textures/items/TabletCase1.png differ diff --git a/src/main/resources/assets/opencomputers/textures/items/TabletCase3.png b/src/main/resources/assets/opencomputers/textures/items/TabletCase3.png new file mode 100644 index 000000000..d3ae9e6ff Binary files /dev/null and b/src/main/resources/assets/opencomputers/textures/items/TabletCase3.png differ diff --git a/src/main/scala/li/cil/oc/client/GuiHandler.scala b/src/main/scala/li/cil/oc/client/GuiHandler.scala index 06c6af472..6f1a078cf 100644 --- a/src/main/scala/li/cil/oc/client/GuiHandler.scala +++ b/src/main/scala/li/cil/oc/client/GuiHandler.scala @@ -9,7 +9,6 @@ import li.cil.oc.common.init.Items import li.cil.oc.common.inventory.DatabaseInventory import li.cil.oc.common.inventory.ServerInventory import li.cil.oc.common.item -import li.cil.oc.common.item.Tablet import li.cil.oc.common.tileentity import li.cil.oc.common.{GuiHandler => CommonGuiHandler} import net.minecraft.client.Minecraft @@ -72,14 +71,20 @@ object GuiHandler extends CommonGuiHandler { case Some(tablet: item.Tablet) if id == GuiType.Tablet.id => val stack = player.getCurrentEquippedItem if (stack.hasTagCompound) { - Tablet.get(stack, player).components.collect { + item.Tablet.get(stack, player).components.collect { case Some(buffer: TextBuffer) => buffer }.headOption match { - case Some(buffer: TextBuffer) => return new gui.Screen(buffer, true, () => true, () => true) - case _ => + case Some(buffer: TextBuffer) => new gui.Screen(buffer, true, () => true, () => true) + case _ => null } } - null + else null + case Some(tablet: item.Tablet) if id == GuiType.TabletInner.id => + val stack = player.getCurrentEquippedItem + if (stack.hasTagCompound) { + new gui.Tablet(player.inventory, item.Tablet.get(stack, player)) + } + else null case Some(terminal: item.Terminal) if id == GuiType.Terminal.id => val stack = player.getCurrentEquippedItem if (stack.hasTagCompound) { diff --git a/src/main/scala/li/cil/oc/client/gui/Tablet.scala b/src/main/scala/li/cil/oc/client/gui/Tablet.scala new file mode 100644 index 000000000..48698f2fc --- /dev/null +++ b/src/main/scala/li/cil/oc/client/gui/Tablet.scala @@ -0,0 +1,26 @@ +package li.cil.oc.client.gui + +import li.cil.oc.Localization +import li.cil.oc.common.container +import li.cil.oc.common.item.TabletWrapper +import net.minecraft.entity.player.InventoryPlayer +import net.minecraft.inventory.Slot + +class Tablet(playerInventory: InventoryPlayer, val tablet: TabletWrapper) extends DynamicGuiContainer(new container.Tablet(playerInventory, tablet)) { + override def drawSecondaryForegroundLayer(mouseX: Int, mouseY: Int) = { + super.drawSecondaryForegroundLayer(mouseX, mouseY) + fontRendererObj.drawString( + Localization.localizeImmediately(tablet.getInventoryName), + 8, 6, 0x404040) + } + + override def doesGuiPauseGame = false + + protected override def handleMouseClick(slot: Slot, slotNumber: Int, button: Int, shift: Int) { + if (slot == null || slot.getStack != tablet.stack) { + super.handleMouseClick(slot, slotNumber, button, shift) + } + } + + protected override def checkHotbarKeys(slot: Int) = false +} diff --git a/src/main/scala/li/cil/oc/common/GuiHandler.scala b/src/main/scala/li/cil/oc/common/GuiHandler.scala index 38b21432b..366963ebc 100644 --- a/src/main/scala/li/cil/oc/common/GuiHandler.scala +++ b/src/main/scala/li/cil/oc/common/GuiHandler.scala @@ -58,6 +58,12 @@ abstract class GuiHandler extends IGuiHandler { override def isUseableByPlayer(player: EntityPlayer) = player == player }) + case Some(tablet: item.Tablet) if id == GuiType.TabletInner.id => + val stack = player.getCurrentEquippedItem + if (stack.hasTagCompound) + new container.Tablet(player.inventory, item.Tablet.get(stack, player)) + else + null case _ => null } case _ => null diff --git a/src/main/scala/li/cil/oc/common/GuiType.scala b/src/main/scala/li/cil/oc/common/GuiType.scala index 3ce157f9c..7628f8178 100644 --- a/src/main/scala/li/cil/oc/common/GuiType.scala +++ b/src/main/scala/li/cil/oc/common/GuiType.scala @@ -28,6 +28,7 @@ object GuiType extends ScalaEnum { val Server = new EnumVal { def name = "Server"; def subType = GuiType.Category.Item } val Switch = new EnumVal { def name = "Switch"; def subType = GuiType.Category.Block } val Tablet = new EnumVal { def name = "Tablet"; def subType = GuiType.Category.Item } + val TabletInner = new EnumVal { def name = "TabletInner"; def subType = GuiType.Category.Item } val Terminal = new EnumVal { def name = "Terminal"; def subType = GuiType.Category.Item } object Category extends ScalaEnum { diff --git a/src/main/scala/li/cil/oc/common/Proxy.scala b/src/main/scala/li/cil/oc/common/Proxy.scala index 0e4a8aaf1..a7bcf8d49 100644 --- a/src/main/scala/li/cil/oc/common/Proxy.scala +++ b/src/main/scala/li/cil/oc/common/Proxy.scala @@ -114,7 +114,8 @@ class Proxy { OpenComputers.ID + ":rack" -> "serverRack", OpenComputers.ID + ":appengTunnel" -> "", // Avoid breaking worlds for people that used the dev builds. OpenComputers.ID + ":microcontrollerCase" -> "microcontrollerCase1", - OpenComputers.ID + ":droneCase" -> "droneCase1" + OpenComputers.ID + ":droneCase" -> "droneCase1", + OpenComputers.ID + ":tabletCase" -> "tabletCase1" ) def missingMappings(e: FMLMissingMappingsEvent) { diff --git a/src/main/scala/li/cil/oc/common/container/Tablet.scala b/src/main/scala/li/cil/oc/common/container/Tablet.scala new file mode 100644 index 000000000..5e84bd347 --- /dev/null +++ b/src/main/scala/li/cil/oc/common/container/Tablet.scala @@ -0,0 +1,13 @@ +package li.cil.oc.common.container + +import li.cil.oc.common.item.TabletWrapper +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.entity.player.InventoryPlayer + +class Tablet(playerInventory: InventoryPlayer, tablet: TabletWrapper) extends Player(playerInventory, tablet) { + addSlotToContainer(new StaticComponentSlot(this, otherInventory, otherInventory.getSizeInventory - 1, 80, 35, tablet.containerSlotType, tablet.containerSlotTier)) + + addPlayerInventorySlots(8, 84) + + override def canInteractWith(player: EntityPlayer) = player == playerInventory.player +} diff --git a/src/main/scala/li/cil/oc/common/init/Items.scala b/src/main/scala/li/cil/oc/common/init/Items.scala index 368cfda6a..f5b3932cb 100644 --- a/src/main/scala/li/cil/oc/common/init/Items.scala +++ b/src/main/scala/li/cil/oc/common/init/Items.scala @@ -238,6 +238,7 @@ object Items extends ItemAPI { def createConfiguredTablet() = { val data = new TabletData() + data.tier = Tier.Four data.energy = Settings.get.bufferTablet data.maxEnergy = data.energy data.items = Array( @@ -428,7 +429,7 @@ object Items extends ItemAPI { registerItem(new item.DebugCard(multi), "debugCard") // 1.3.5 - Recipes.addMultiItem(new item.TabletCase(multi), "tabletCase", "oc:tabletCase") + Recipes.addMultiItem(new item.TabletCase(multi, Tier.One), "tabletCase1", "oc:tabletCase1") Recipes.addMultiItem(new item.UpgradePiston(multi), "pistonUpgrade", "oc:pistonUpgrade") Recipes.addMultiItem(new item.UpgradeTank(multi), "tankUpgrade", "oc:tankUpgrade") Recipes.addMultiItem(new item.UpgradeTankController(multi), "tankControllerUpgrade", "oc:tankControllerUpgrade") @@ -462,5 +463,9 @@ object Items extends ItemAPI { // 1.4.4 registerItem(new item.MicrocontrollerCase(multi, Tier.Four), "microcontrollerCaseCreative") registerItem(new item.DroneCase(multi, Tier.Four), "droneCaseCreative") + + // 1.4.7 + Recipes.addMultiItem(new item.TabletCase(multi, Tier.Two), "tabletCase2", "oc:tabletCase2") + registerItem(new item.TabletCase(multi, Tier.Four), "tabletCaseCreative") } } diff --git a/src/main/scala/li/cil/oc/common/item/Present.scala b/src/main/scala/li/cil/oc/common/item/Present.scala index bfae1bb9c..3548b129d 100644 --- a/src/main/scala/li/cil/oc/common/item/Present.scala +++ b/src/main/scala/li/cil/oc/common/item/Present.scala @@ -105,7 +105,7 @@ object Present { add("cpu2", 6) add("microcontrollerCase2", 6) add("componentBus2", 6) - add("tabletCase", 5) + add("tabletCase1", 5) add("upgradeContainer2", 5) add("cardContainer2", 5) add("graphicsCard2", 4) @@ -121,6 +121,7 @@ object Present { add("ram5", 2) add("upgradeContainer3", 2) add("cardContainer3", 2) + add("tabletCase2", 1) add("hdd3", 1) add("chunkloaderUpgrade", 1) add("cpu3", 1) diff --git a/src/main/scala/li/cil/oc/common/item/Tablet.scala b/src/main/scala/li/cil/oc/common/item/Tablet.scala index b3e864005..3f0ce0016 100644 --- a/src/main/scala/li/cil/oc/common/item/Tablet.scala +++ b/src/main/scala/li/cil/oc/common/item/Tablet.scala @@ -19,6 +19,7 @@ import li.cil.oc.Settings import li.cil.oc.api import li.cil.oc.api.Driver import li.cil.oc.api.Machine +import li.cil.oc.api.driver.item.Container import li.cil.oc.api.driver.item.Processor import li.cil.oc.api.internal import li.cil.oc.api.machine.Architecture @@ -28,10 +29,14 @@ import li.cil.oc.api.network.Node import li.cil.oc.client.KeyBindings import li.cil.oc.common.GuiType import li.cil.oc.common.Slot +import li.cil.oc.common.Tier import li.cil.oc.common.inventory.ComponentInventory import li.cil.oc.common.item.data.TabletData +import li.cil.oc.integration.opencomputers.DriverKeyboard +import li.cil.oc.integration.opencomputers.DriverScreen import li.cil.oc.server.component import li.cil.oc.util.ExtendedNBT._ +import li.cil.oc.util.Rarity import li.cil.oc.util.RotationHelper import li.cil.oc.util.Tooltip import net.minecraft.entity.Entity @@ -85,6 +90,11 @@ class Tablet(val parent: Delegator) extends Delegate { } } + override def rarity(stack: ItemStack) = { + val data = new TabletData(stack) + Rarity.byTier(data.tier) + } + override def isDamageable = true override def damage(stack: ItemStack) = { @@ -129,7 +139,13 @@ class Tablet(val parent: Delegator) extends Delegate { } } } - else if (!world.isRemote) Tablet.Server.get(stack, player).machine.stop() + else if (!world.isRemote) { + val tablet = Tablet.Server.get(stack, player) + tablet.machine.stop() + if (tablet.data.tier > Tier.One) { + player.openGui(OpenComputers, GuiType.TabletInner.id, world, 0, 0, 0) + } + } player.swingItem() stack } @@ -149,6 +165,8 @@ class TabletWrapper(var stack: ItemStack, var player: EntityPlayer) extends Comp private var isInitialized = !world.isRemote + private var lastRunning = false + def items = data.items override def facing = RotationHelper.fromYaw(player.rotationYaw) @@ -237,11 +255,22 @@ class TabletWrapper(var stack: ItemStack, var player: EntityPlayer) extends Comp override def getSizeInventory = items.length - override def isItemValidForSlot(slot: Int, stack: ItemStack) = true + override def isItemValidForSlot(slot: Int, stack: ItemStack) = slot == getSizeInventory - 1 && (Option(Driver.driverFor(stack, getClass)) match { + case Some(driver) => + // Same special cases, similar as in robot, but allow keyboards, + // because clip-on keyboards kinda seem to make sense, I guess. + driver != DriverScreen && + driver.slot(stack) == containerSlotType && + driver.tier(stack) <= containerSlotTier + case _ => false + }) override def isUseableByPlayer(player: EntityPlayer) = machine.canInteract(player.getCommandSenderName) - override def markDirty() {} + override def markDirty(): Unit = { + data.save(stack) + player.inventory.markDirty() + } // ----------------------------------------------------------------------- // @@ -255,6 +284,18 @@ class TabletWrapper(var stack: ItemStack, var player: EntityPlayer) extends Comp // ----------------------------------------------------------------------- // + def containerSlotType = data.container.fold(Slot.None)(stack => + Option(Driver.driverFor(stack, getClass)) match { + case Some(driver: Container) => driver.providedSlot(stack) + case _ => Slot.None + }) + + def containerSlotTier = data.container.fold(Tier.None)(stack => + Option(Driver.driverFor(stack, getClass)) match { + case Some(driver: Container) => driver.providedTier(stack) + case _ => Tier.None + }) + override def cpuArchitecture: Class[_ <: Architecture] = { for (i <- 0 until getSizeInventory if isComponentSlot(i)) Option(getStackInSlot(i)) match { case Some(s) => Option(Driver.driverFor(s, getClass)) match { @@ -319,6 +360,11 @@ class TabletWrapper(var stack: ItemStack, var player: EntityPlayer) extends Comp data.isRunning = machine.isRunning data.energy = tablet.node.globalBuffer() data.maxEnergy = tablet.node.globalBufferSize() + + if (lastRunning != machine.isRunning) { + lastRunning = machine.isRunning + markDirty() + } } } diff --git a/src/main/scala/li/cil/oc/common/item/TabletCase.scala b/src/main/scala/li/cil/oc/common/item/TabletCase.scala index b76446921..c7a420393 100644 --- a/src/main/scala/li/cil/oc/common/item/TabletCase.scala +++ b/src/main/scala/li/cil/oc/common/item/TabletCase.scala @@ -1,3 +1,11 @@ package li.cil.oc.common.item -class TabletCase(val parent: Delegator) extends Delegate +import net.minecraft.item.ItemStack + +class TabletCase(val parent: Delegator, val tier: Int) extends Delegate with ItemTier { + override val unlocalizedName = super.unlocalizedName + tier + + override protected def tierFromDriver(stack: ItemStack) = tier + + override protected def tooltipName = Option(super.unlocalizedName) +} \ No newline at end of file diff --git a/src/main/scala/li/cil/oc/common/item/data/TabletData.scala b/src/main/scala/li/cil/oc/common/item/data/TabletData.scala index fbada126b..eabcd0261 100644 --- a/src/main/scala/li/cil/oc/common/item/data/TabletData.scala +++ b/src/main/scala/li/cil/oc/common/item/data/TabletData.scala @@ -1,6 +1,7 @@ package li.cil.oc.common.item.data import li.cil.oc.Settings +import li.cil.oc.common.Tier import li.cil.oc.common.init.Items import li.cil.oc.util.ExtendedNBT._ import li.cil.oc.util.ItemUtils @@ -18,6 +19,8 @@ class TabletData extends ItemData { var isRunning = false var energy = 0.0 var maxEnergy = 0.0 + var tier = Tier.One + var container: Option[ItemStack] = None override def load(nbt: NBTTagCompound) { nbt.getTagList(Settings.namespace + "items", NBT.TAG_COMPOUND).foreach((slotNbt: NBTTagCompound) => { @@ -29,6 +32,10 @@ class TabletData extends ItemData { isRunning = nbt.getBoolean(Settings.namespace + "isRunning") energy = nbt.getDouble(Settings.namespace + "energy") maxEnergy = nbt.getDouble(Settings.namespace + "maxEnergy") + tier = nbt.getInteger(Settings.namespace + "tier") + if (nbt.hasKey(Settings.namespace + "container")) { + container = Option(ItemUtils.loadStack(nbt.getCompoundTag(Settings.namespace + "container"))) + } // Code for migrating from 1.4.1 -> 1.4.2, add EEPROM. // TODO Remove in 1.5 @@ -51,6 +58,8 @@ class TabletData extends ItemData { nbt.setBoolean(Settings.namespace + "isRunning", isRunning) nbt.setDouble(Settings.namespace + "energy", energy) nbt.setDouble(Settings.namespace + "maxEnergy", maxEnergy) + nbt.setInteger(Settings.namespace + "tier", tier) + container.foreach(stack => nbt.setNewCompoundTag(Settings.namespace + "container", stack.writeToNBT)) // TODO Remove in 1.5 nbt.setBoolean(Settings.namespace + "biosFlag", true) diff --git a/src/main/scala/li/cil/oc/common/template/RobotTemplate.scala b/src/main/scala/li/cil/oc/common/template/RobotTemplate.scala index 08890dc45..417e20f45 100644 --- a/src/main/scala/li/cil/oc/common/template/RobotTemplate.scala +++ b/src/main/scala/li/cil/oc/common/template/RobotTemplate.scala @@ -28,14 +28,14 @@ object RobotTemplate extends Template { def validate(inventory: IInventory): Array[AnyRef] = validateComputer(inventory) def assemble(inventory: IInventory) = { - val items = (0 until inventory.getSizeInventory).map(inventory.getStackInSlot) + val items = (1 until inventory.getSizeInventory).map(inventory.getStackInSlot) val data = new RobotData() data.tier = ItemUtils.caseTier(inventory.getStackInSlot(0)) data.name = RobotData.randomName data.robotEnergy = Settings.get.bufferRobot.toInt data.totalEnergy = data.robotEnergy - data.containers = items.slice(1, 4).filter(_ != null).toArray - data.components = items.drop(4).filter(_ != null).toArray + data.containers = items.take(3).filter(_ != null).toArray + data.components = items.drop(3).filter(_ != null).toArray val stack = api.Items.get("robot").createItemStack(1) data.save(stack) val energy = Settings.get.robotBaseCost + complexity(inventory) * Settings.get.robotComplexityCost diff --git a/src/main/scala/li/cil/oc/common/template/TabletTemplate.scala b/src/main/scala/li/cil/oc/common/template/TabletTemplate.scala index 4f0a78c1a..1e27c2968 100644 --- a/src/main/scala/li/cil/oc/common/template/TabletTemplate.scala +++ b/src/main/scala/li/cil/oc/common/template/TabletTemplate.scala @@ -8,13 +8,12 @@ import li.cil.oc.common.Slot import li.cil.oc.common.Tier import li.cil.oc.common.item.data.TabletData import li.cil.oc.util.ExtendedNBT._ +import li.cil.oc.util.ItemUtils import net.minecraft.inventory.IInventory import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound import net.minecraft.nbt.NBTTagList -import scala.collection.mutable - object TabletTemplate extends Template { override protected val suggestedComponents = Array( "BIOS" -> hasComponent("eeprom") _, @@ -24,16 +23,20 @@ object TabletTemplate extends Template { override protected def hostClass = classOf[internal.Tablet] - def select(stack: ItemStack) = api.Items.get(stack) == api.Items.get("tabletCase") + def selectTier1(stack: ItemStack) = api.Items.get(stack) == api.Items.get("tabletCase1") + + def selectTier2(stack: ItemStack) = api.Items.get(stack) == api.Items.get("tabletCase2") + + def selectCreative(stack: ItemStack) = api.Items.get(stack) == api.Items.get("tabletCaseCreative") def validate(inventory: IInventory): Array[AnyRef] = validateComputer(inventory) def assemble(inventory: IInventory): Array[AnyRef] = { - val items = mutable.ArrayBuffer( - Option(api.Items.get("screen1").createItemStack(1)) - ) ++ (1 until inventory.getSizeInventory).map(slot => Option(inventory.getStackInSlot(slot))) + val items = (1 until inventory.getSizeInventory).map(slot => Option(inventory.getStackInSlot(slot))) val data = new TabletData() - data.items = items.filter(_.isDefined).toArray + data.tier = ItemUtils.caseTier(inventory.getStackInSlot(0)) + data.container = items.headOption.getOrElse(None) + data.items = Array(Option(api.Items.get("screen1").createItemStack(1))) ++ items.drop(if (data.tier == Tier.One) 0 else 1).filter(_.isDefined) data.energy = Settings.get.bufferTablet data.maxEnergy = data.energy val stack = api.Items.get("tablet").createItemStack(1) @@ -56,8 +59,8 @@ object TabletTemplate extends Template { // Tier 1 { val nbt = new NBTTagCompound() - nbt.setString("name", "Tablet") - nbt.setString("select", "li.cil.oc.common.template.TabletTemplate.select") + nbt.setString("name", "Tablet (Tier 1)") + nbt.setString("select", "li.cil.oc.common.template.TabletTemplate.selectTier1") nbt.setString("validate", "li.cil.oc.common.template.TabletTemplate.validate") nbt.setString("assemble", "li.cil.oc.common.template.TabletTemplate.assemble") nbt.setString("hostClass", "li.cil.oc.api.internal.Tablet") @@ -82,6 +85,78 @@ object TabletTemplate extends Template { FMLInterModComms.sendMessage("OpenComputers", "registerAssemblerTemplate", nbt) } + // Tier 2 + { + val nbt = new NBTTagCompound() + nbt.setString("name", "Tablet (Tier 2)") + nbt.setString("select", "li.cil.oc.common.template.TabletTemplate.selectTier2") + nbt.setString("validate", "li.cil.oc.common.template.TabletTemplate.validate") + nbt.setString("assemble", "li.cil.oc.common.template.TabletTemplate.assemble") + nbt.setString("hostClass", "li.cil.oc.api.internal.Tablet") + + val containerSlots = new NBTTagList() + containerSlots.appendTag(Map("tier" -> Tier.Two)) + nbt.setTag("containerSlots", containerSlots) + + val upgradeSlots = new NBTTagList() + upgradeSlots.appendTag(Map("tier" -> Tier.Three)) + upgradeSlots.appendTag(Map("tier" -> Tier.Two)) + upgradeSlots.appendTag(Map("tier" -> Tier.Two)) + nbt.setTag("upgradeSlots", upgradeSlots) + + val componentSlots = new NBTTagList() + componentSlots.appendTag(Map("type" -> Slot.Card, "tier" -> Tier.Three)) + componentSlots.appendTag(Map("type" -> Slot.Card, "tier" -> Tier.Two)) + componentSlots.appendTag(new NBTTagCompound()) + componentSlots.appendTag(Map("type" -> Slot.CPU, "tier" -> Tier.Three)) + componentSlots.appendTag(Map("type" -> Slot.Memory, "tier" -> Tier.Two)) + componentSlots.appendTag(Map("type" -> Slot.Memory, "tier" -> Tier.Two)) + componentSlots.appendTag(Map("type" -> Slot.EEPROM, "tier" -> Tier.Any)) + componentSlots.appendTag(Map("type" -> Slot.HDD, "tier" -> Tier.Two)) + nbt.setTag("componentSlots", componentSlots) + + FMLInterModComms.sendMessage("OpenComputers", "registerAssemblerTemplate", nbt) + } + + // Creative + { + val nbt = new NBTTagCompound() + nbt.setString("name", "Tablet (Creative)") + nbt.setString("select", "li.cil.oc.common.template.TabletTemplate.selectCreative") + nbt.setString("validate", "li.cil.oc.common.template.TabletTemplate.validate") + nbt.setString("assemble", "li.cil.oc.common.template.TabletTemplate.assemble") + nbt.setString("hostClass", "li.cil.oc.api.internal.Tablet") + + val containerSlots = new NBTTagList() + containerSlots.appendTag(Map("tier" -> Tier.Three)) + nbt.setTag("containerSlots", containerSlots) + + val upgradeSlots = new NBTTagList() + upgradeSlots.appendTag(Map("tier" -> Tier.Three)) + upgradeSlots.appendTag(Map("tier" -> Tier.Three)) + upgradeSlots.appendTag(Map("tier" -> Tier.Three)) + upgradeSlots.appendTag(Map("tier" -> Tier.Three)) + upgradeSlots.appendTag(Map("tier" -> Tier.Three)) + upgradeSlots.appendTag(Map("tier" -> Tier.Three)) + upgradeSlots.appendTag(Map("tier" -> Tier.Three)) + upgradeSlots.appendTag(Map("tier" -> Tier.Three)) + upgradeSlots.appendTag(Map("tier" -> Tier.Three)) + nbt.setTag("upgradeSlots", upgradeSlots) + + val componentSlots = new NBTTagList() + componentSlots.appendTag(Map("type" -> Slot.Card, "tier" -> Tier.Three)) + componentSlots.appendTag(Map("type" -> Slot.Card, "tier" -> Tier.Three)) + componentSlots.appendTag(Map("type" -> Slot.Card, "tier" -> Tier.Three)) + componentSlots.appendTag(Map("type" -> Slot.CPU, "tier" -> Tier.Three)) + componentSlots.appendTag(Map("type" -> Slot.Memory, "tier" -> Tier.Three)) + componentSlots.appendTag(Map("type" -> Slot.Memory, "tier" -> Tier.Three)) + componentSlots.appendTag(Map("type" -> Slot.EEPROM, "tier" -> Tier.Any)) + componentSlots.appendTag(Map("type" -> Slot.HDD, "tier" -> Tier.Three)) + nbt.setTag("componentSlots", componentSlots) + + FMLInterModComms.sendMessage("OpenComputers", "registerAssemblerTemplate", nbt) + } + // Disassembler { val nbt = new NBTTagCompound() @@ -93,7 +168,7 @@ object TabletTemplate extends Template { } } - override protected def maxComplexity(inventory: IInventory) = super.maxComplexity(inventory) - 10 + override protected def maxComplexity(inventory: IInventory) = super.maxComplexity(inventory) / 2 + 5 - override protected def caseTier(inventory: IInventory) = if (select(inventory.getStackInSlot(0))) Tier.Two else Tier.None + override protected def caseTier(inventory: IInventory) = ItemUtils.caseTier(inventory.getStackInSlot(0)) } diff --git a/src/main/scala/li/cil/oc/util/ItemUtils.scala b/src/main/scala/li/cil/oc/util/ItemUtils.scala index 9c7468468..db034eb5a 100644 --- a/src/main/scala/li/cil/oc/util/ItemUtils.scala +++ b/src/main/scala/li/cil/oc/util/ItemUtils.scala @@ -36,6 +36,9 @@ object ItemUtils { else if (descriptor == api.Items.get("server2")) Tier.Two else if (descriptor == api.Items.get("server3")) Tier.Three else if (descriptor == api.Items.get("serverCreative")) Tier.Four + else if (descriptor == api.Items.get("tabletCase1")) Tier.One + else if (descriptor == api.Items.get("tabletCase2")) Tier.Two + else if (descriptor == api.Items.get("tabletCaseCreative")) Tier.Four else Tier.None }