From b0a4e8f857e7865fc2f720f5ed37fd8a1ac3d89a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 30 Jan 2015 21:11:35 +0100 Subject: [PATCH] Added tier two and creative tablet cases. Tier two and creative case also have space for a single container. When shift-rightclicking them, in addition to be powered off a GUI will open, giving access to the container slot, so you can, for example, insert and remove floppies on the go. Also, tablet icons should be updated to reflect the tablet's run state more promptly now. --- assets/items.psd | Bin 571995 -> 580270 bytes .../assets/opencomputers/lang/de_DE.lang | 5 +- .../assets/opencomputers/lang/en_US.lang | 5 +- .../assets/opencomputers/lang/fr_FR.lang | 5 +- .../assets/opencomputers/lang/it_IT.lang | 5 +- .../assets/opencomputers/lang/ru_RU.lang | 1 + .../assets/opencomputers/lang/zh_CN.lang | 5 +- .../assets/opencomputers/lang/zh_TW.lang | 5 +- .../opencomputers/recipes/default.recipes | 7 +- .../items/{TabletCase.png => TabletCase0.png} | Bin .../textures/items/TabletCase1.png | Bin 0 -> 389 bytes .../textures/items/TabletCase3.png | Bin 0 -> 389 bytes .../scala/li/cil/oc/client/GuiHandler.scala | 15 ++- .../scala/li/cil/oc/client/gui/Tablet.scala | 26 +++++ .../scala/li/cil/oc/common/GuiHandler.scala | 6 ++ src/main/scala/li/cil/oc/common/GuiType.scala | 1 + src/main/scala/li/cil/oc/common/Proxy.scala | 3 +- .../li/cil/oc/common/container/Tablet.scala | 13 +++ .../scala/li/cil/oc/common/init/Items.scala | 7 +- .../scala/li/cil/oc/common/item/Present.scala | 3 +- .../scala/li/cil/oc/common/item/Tablet.scala | 52 +++++++++- .../li/cil/oc/common/item/TabletCase.scala | 10 +- .../cil/oc/common/item/data/TabletData.scala | 9 ++ .../oc/common/template/RobotTemplate.scala | 6 +- .../oc/common/template/TabletTemplate.scala | 97 ++++++++++++++++-- src/main/scala/li/cil/oc/util/ItemUtils.scala | 3 + 26 files changed, 256 insertions(+), 33 deletions(-) rename src/main/resources/assets/opencomputers/textures/items/{TabletCase.png => TabletCase0.png} (100%) create mode 100644 src/main/resources/assets/opencomputers/textures/items/TabletCase1.png create mode 100644 src/main/resources/assets/opencomputers/textures/items/TabletCase3.png create mode 100644 src/main/scala/li/cil/oc/client/gui/Tablet.scala create mode 100644 src/main/scala/li/cil/oc/common/container/Tablet.scala diff --git a/assets/items.psd b/assets/items.psd index 9a6d7b44d0707f665fb830a950af5f4395c2a446..6856b63bd4ca7fff37968744184d5d205d6918be 100644 GIT binary patch delta 11897 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 S_NC_rmoyrfHb=`omi#Yxi5WQn delta 9292 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�GV71-PJun!C(%jz&Y>@y)t>aaaIcmYqO=Wr%Oe*wF9wQP(h zezG4iJ@M9^GH#Lo7x^1^ A2LJ#7 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 0000000000000000000000000000000000000000..e333cf11340d2226147efeb3869a13122d3a2c72 GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8%mAMdR}N-YPe&I4Hckf%D`oeflok6pg+%9_xTfgr$1NuL z^urf19pgo(Z`^zHky})vXaD)>M=o;+2#M>N$yhi_8e7+GKPhcyFKg{0Z||w#=q;?K z)4cOEmxwrzgp87lzo@1`?%G4$`_BFU|KCSX>Nn6*<&q%3U?7(OU`W$!o(5Fj?CIhd zQgJKi{6(QA1%cLw%?;8ljMJ7yM(+9VyzPO{hROS*{k^hnrXNZ^oZa!D(EUMX z$o6e4=P&Pi->iR7B4okmUITOvgQu&X%Q~loCICAI Bq4)p* literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..d3ae9e6ff7b89e29d29a27ad130c2db3348bdbda GIT binary patch literal 389 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!WQl7;NpOBzNqJ&XDuZK6ep0G} zXKrG8YEWuoN@d~6R2!h8%mAMdS5HS54rW#d3o8LO&ULAKJ(UB6IYrOTzvimwE6yz` z#w~HU_nfYn(fP$UK0f{O?%v0fGcFs5o0>{l3vdWo$v9X_+wZPFA;Kjl$s^;Y%6b!l(wkB=DdT4y3hXq|NrlbDkGq!$|XU5!9Xqnz>ucdJPoM4+0(@_ zq~cc2`P)KG3L>o!S(~ht_}p$eUVijfeiQFGlfJKOA3mF3%lwJ2u6Z5bYD4GjoEL)U z`Q%*QOQb(v_*+QkMRnn^rz)M#RVRM_6zBZJ($YK3d2xk)UCyfu>l>HnWGrLdzIua= z>MHkWrw5v*JZ4i8dTtnS-khPFy?V;O+Pvq=2N<}n^P99iw=o1dhr!d;&t;ucLK6U! CSELvK literal 0 HcmV?d00001 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 }