From 366c6fc476fe2ec429b4f22d420e4c778a8eed8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20N=C3=BCcke?= Date: Fri, 10 Oct 2014 15:07:17 +0200 Subject: [PATCH] Convert blocks in OC inventories on load, in particular to ensure screens in robots are converted. --- .../scala/li/cil/oc/common/EventHandler.scala | 4 ++-- .../scala/li/cil/oc/common/PacketHandler.scala | 3 ++- .../oc/common/block/DelegatorConverter.scala | 18 ++++++++++++++++-- .../scala/li/cil/oc/common/init/Blocks.scala | 2 +- .../li/cil/oc/common/inventory/Inventory.scala | 3 ++- .../common/inventory/ItemStackInventory.scala | 3 ++- .../cil/oc/common/tileentity/Assembler.scala | 5 +++-- .../oc/common/tileentity/Disassembler.scala | 5 ++--- .../cil/oc/common/tileentity/DiskDrive.scala | 3 ++- .../oc/server/component/UpgradeGenerator.scala | 5 +++-- src/main/scala/li/cil/oc/util/ItemUtils.scala | 17 +++++++++-------- 11 files changed, 44 insertions(+), 24 deletions(-) diff --git a/src/main/scala/li/cil/oc/common/EventHandler.scala b/src/main/scala/li/cil/oc/common/EventHandler.scala index c145ff010..c8db26ba3 100644 --- a/src/main/scala/li/cil/oc/common/EventHandler.scala +++ b/src/main/scala/li/cil/oc/common/EventHandler.scala @@ -14,12 +14,12 @@ import li.cil.oc.common.tileentity.traits.power import li.cil.oc.integration.Mods import li.cil.oc.integration.util import li.cil.oc.server.{PacketSender => ServerPacketSender} +import li.cil.oc.util.ItemUtils import li.cil.oc.util.LuaStateFactory import li.cil.oc.util.SideTracker import li.cil.oc.util.UpdateCheck import net.minecraft.client.Minecraft import net.minecraft.entity.player.EntityPlayerMP -import net.minecraft.item.ItemStack import net.minecraft.server.MinecraftServer import net.minecraft.tileentity.TileEntity import net.minecraftforge.common.MinecraftForge @@ -159,7 +159,7 @@ object EventHandler { if (stack != null && api.Items.get(stack) == navigationUpgrade) { // Restore the map currently used in the upgrade. val nbt = driver.dataTag(stack) - val map = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(Settings.namespace + "map")) + val map = ItemUtils.loadStack(nbt.getCompoundTag(Settings.namespace + "map")) if (!e.player.inventory.addItemStackToInventory(map)) { e.player.dropPlayerItemWithRandomChoice(map, false) } diff --git a/src/main/scala/li/cil/oc/common/PacketHandler.scala b/src/main/scala/li/cil/oc/common/PacketHandler.scala index ce447bbd0..1677ae53a 100644 --- a/src/main/scala/li/cil/oc/common/PacketHandler.scala +++ b/src/main/scala/li/cil/oc/common/PacketHandler.scala @@ -9,6 +9,7 @@ import io.netty.buffer.ByteBufInputStream import li.cil.oc.OpenComputers import li.cil.oc.api import li.cil.oc.common.block.RobotAfterimage +import li.cil.oc.util.ItemUtils import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.nbt.CompressedStreamTools @@ -84,7 +85,7 @@ abstract class PacketHandler { def readItemStack() = { val haveStack = readBoolean() if (haveStack) { - ItemStack.loadItemStackFromNBT(readNBT()) + ItemUtils.loadStack(readNBT()) } else null } diff --git a/src/main/scala/li/cil/oc/common/block/DelegatorConverter.scala b/src/main/scala/li/cil/oc/common/block/DelegatorConverter.scala index 45b2e141c..6719464aa 100644 --- a/src/main/scala/li/cil/oc/common/block/DelegatorConverter.scala +++ b/src/main/scala/li/cil/oc/common/block/DelegatorConverter.scala @@ -48,11 +48,25 @@ object DelegatorConverter { } } - def convert(stack: ItemStack, item: ItemBlock) = { + def convert(stack: ItemStack): ItemStack = stack.getItem match { + case item: ItemBlock => + convert(stack, item) match { + case Some(newStack) => newStack + case _ => stack + } + case _ => stack + } + + def convert(stack: ItemStack, item: ItemBlock): Option[ItemStack] = { val block = item.field_150939_a val meta = stack.getItemDamage getDescriptor(block, meta) match { - case Some(descriptor) => Option(descriptor.createItemStack(stack.stackSize)) + case Some(descriptor) => + val newStack = descriptor.createItemStack(stack.stackSize) + if (stack.hasTagCompound) { + newStack.setTagCompound(stack.getTagCompound.copy().asInstanceOf[NBTTagCompound]) + } + Option(newStack) case _ => None } } diff --git a/src/main/scala/li/cil/oc/common/init/Blocks.scala b/src/main/scala/li/cil/oc/common/init/Blocks.scala index 802b43f55..bac4ad871 100644 --- a/src/main/scala/li/cil/oc/common/init/Blocks.scala +++ b/src/main/scala/li/cil/oc/common/init/Blocks.scala @@ -10,7 +10,7 @@ import li.cil.oc.common.tileentity object Blocks { def init() { GameRegistry.registerTileEntity(classOf[tileentity.Adapter], Settings.namespace + "adapter") - GameRegistry.registerTileEntity(classOf[tileentity.Assembler], Settings.namespace + "assembler") + GameRegistry.registerTileEntityWithAlternatives(classOf[tileentity.Assembler], Settings.namespace + "assembler", Settings.namespace + "robotAssembler") GameRegistry.registerTileEntity(classOf[tileentity.Cable], Settings.namespace + "cable") GameRegistry.registerTileEntity(classOf[tileentity.Capacitor], Settings.namespace + "capacitor") GameRegistry.registerTileEntity(classOf[tileentity.Case], Settings.namespace + "case") diff --git a/src/main/scala/li/cil/oc/common/inventory/Inventory.scala b/src/main/scala/li/cil/oc/common/inventory/Inventory.scala index 1bc412a06..9e6f63fb2 100644 --- a/src/main/scala/li/cil/oc/common/inventory/Inventory.scala +++ b/src/main/scala/li/cil/oc/common/inventory/Inventory.scala @@ -2,6 +2,7 @@ package li.cil.oc.common.inventory import li.cil.oc.Settings 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 @@ -75,7 +76,7 @@ trait Inventory extends IInventory { val slotNbt = list.getCompoundTagAt(index) val slot = slotNbt.getByte("slot") if (slot >= 0 && slot < items.length) { - items(slot) = Option(ItemStack.loadItemStackFromNBT(slotNbt.getCompoundTag("item"))) + items(slot) = Option(ItemUtils.loadStack(slotNbt.getCompoundTag("item"))) } }) } diff --git a/src/main/scala/li/cil/oc/common/inventory/ItemStackInventory.scala b/src/main/scala/li/cil/oc/common/inventory/ItemStackInventory.scala index 9afc96cad..2c318defd 100644 --- a/src/main/scala/li/cil/oc/common/inventory/ItemStackInventory.scala +++ b/src/main/scala/li/cil/oc/common/inventory/ItemStackInventory.scala @@ -1,6 +1,7 @@ package li.cil.oc.common.inventory import li.cil.oc.Settings +import li.cil.oc.util.ItemUtils import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound import net.minecraft.nbt.NBTTagList @@ -30,7 +31,7 @@ trait ItemStackInventory extends Inventory { for (i <- 0 until (list.tagCount min items.length)) { val tag = list.getCompoundTagAt(i) if (!tag.hasNoTags) { - items(i) = Option(ItemStack.loadItemStackFromNBT(tag)) + items(i) = Option(ItemUtils.loadStack(tag)) } } } diff --git a/src/main/scala/li/cil/oc/common/tileentity/Assembler.scala b/src/main/scala/li/cil/oc/common/tileentity/Assembler.scala index 6ff3a5836..9f0348b4e 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Assembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Assembler.scala @@ -11,6 +11,7 @@ import li.cil.oc.api.network._ import li.cil.oc.common.template.AssemblerTemplates import li.cil.oc.server.{PacketSender => ServerPacketSender} import li.cil.oc.util.ExtendedNBT._ +import li.cil.oc.util.ItemUtils import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound import net.minecraftforge.common.util.ForgeDirection @@ -113,11 +114,11 @@ class Assembler extends traits.Environment with traits.PowerAcceptor with traits override def readFromNBT(nbt: NBTTagCompound) { super.readFromNBT(nbt) if (nbt.hasKey(Settings.namespace + "output")) { - output = Option(ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(Settings.namespace + "output"))) + output = Option(ItemUtils.loadStack(nbt.getCompoundTag(Settings.namespace + "output"))) } else if (nbt.hasKey(Settings.namespace + "robot")) { // Backwards compatibility. - output = Option(ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(Settings.namespace + "robot"))) + output = Option(ItemUtils.loadStack(nbt.getCompoundTag(Settings.namespace + "robot"))) } totalRequiredEnergy = nbt.getDouble(Settings.namespace + "total") requiredEnergy = nbt.getDouble(Settings.namespace + "remaining") diff --git a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala index 0f758f18d..049d99fef 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/Disassembler.scala @@ -211,9 +211,8 @@ class Disassembler extends traits.Environment with traits.PowerAcceptor with tra override def readFromNBT(nbt: NBTTagCompound) { super.readFromNBT(nbt) queue.clear() - queue ++= nbt.getTagList(Settings.namespace + "queue", NBT.TAG_COMPOUND).map((list, index) => { - ItemStack.loadItemStackFromNBT(list.getCompoundTagAt(index)) - }) + queue ++= nbt.getTagList(Settings.namespace + "queue", NBT.TAG_COMPOUND). + map((list, index) => ItemUtils.loadStack(list.getCompoundTagAt(index))) buffer = nbt.getDouble(Settings.namespace + "buffer") totalRequiredEnergy = nbt.getDouble(Settings.namespace + "total") isActive = queue.nonEmpty diff --git a/src/main/scala/li/cil/oc/common/tileentity/DiskDrive.scala b/src/main/scala/li/cil/oc/common/tileentity/DiskDrive.scala index c89cdace5..4543fd132 100644 --- a/src/main/scala/li/cil/oc/common/tileentity/DiskDrive.scala +++ b/src/main/scala/li/cil/oc/common/tileentity/DiskDrive.scala @@ -11,6 +11,7 @@ import li.cil.oc.common.Slot import li.cil.oc.common.Sound import li.cil.oc.server.{PacketSender => ServerPacketSender} import li.cil.oc.util.ExtendedNBT._ +import li.cil.oc.util.ItemUtils import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound @@ -76,7 +77,7 @@ class DiskDrive extends traits.Environment with traits.ComponentInventory with t override def writeToNBTForClient(nbt: NBTTagCompound) { super.writeToNBTForClient(nbt) if (nbt.hasKey("disk")) { - setInventorySlotContents(0, ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("disk"))) + setInventorySlotContents(0, ItemUtils.loadStack(nbt.getCompoundTag("disk"))) } } } diff --git a/src/main/scala/li/cil/oc/server/component/UpgradeGenerator.scala b/src/main/scala/li/cil/oc/server/component/UpgradeGenerator.scala index 74b44541c..59156378f 100644 --- a/src/main/scala/li/cil/oc/server/component/UpgradeGenerator.scala +++ b/src/main/scala/li/cil/oc/server/component/UpgradeGenerator.scala @@ -5,13 +5,14 @@ import li.cil.oc.Settings import li.cil.oc.api import li.cil.oc.api.Network import li.cil.oc.api.driver.EnvironmentHost +import li.cil.oc.api.internal.Robot import li.cil.oc.api.machine.Arguments import li.cil.oc.api.machine.Callback import li.cil.oc.api.machine.Context import li.cil.oc.api.network._ import li.cil.oc.api.prefab -import li.cil.oc.api.internal.Robot import li.cil.oc.util.ExtendedNBT._ +import li.cil.oc.util.ItemUtils import net.minecraft.entity.item.EntityItem import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound @@ -145,7 +146,7 @@ class UpgradeGenerator(val host: EnvironmentHost with Robot) extends prefab.Mana super.load(nbt) romGenerator.foreach(_.load(nbt.getCompoundTag("romGenerator"))) if (nbt.hasKey("inventory")) { - inventory = Option(ItemStack.loadItemStackFromNBT(nbt.getCompoundTag("inventory"))) + inventory = Option(ItemUtils.loadStack(nbt.getCompoundTag("inventory"))) } remainingTicks = nbt.getInteger("remainingTicks") } diff --git a/src/main/scala/li/cil/oc/util/ItemUtils.scala b/src/main/scala/li/cil/oc/util/ItemUtils.scala index 29f90a05b..07618b353 100644 --- a/src/main/scala/li/cil/oc/util/ItemUtils.scala +++ b/src/main/scala/li/cil/oc/util/ItemUtils.scala @@ -7,6 +7,7 @@ import li.cil.oc.Settings import li.cil.oc.api import li.cil.oc.api.Persistable import li.cil.oc.common.Tier +import li.cil.oc.common.block.DelegatorConverter import li.cil.oc.integration.opencomputers.DriverScreen import li.cil.oc.integration.opencomputers.DriverUpgradeExperience import li.cil.oc.util.ExtendedNBT._ @@ -28,6 +29,8 @@ object ItemUtils { else Tier.None } + def loadStack(nbt: NBTTagCompound) = DelegatorConverter.convert(ItemStack.loadItemStackFromNBT(nbt)) + abstract class ItemData extends Persistable { def load(stack: ItemStack) { if (stack.hasTagCompound) { @@ -76,12 +79,10 @@ object ItemUtils { robotEnergy = nbt.getInteger(Settings.namespace + "robotEnergy") if (nbt.hasKey(Settings.namespace + "components")) { tier = nbt.getInteger(Settings.namespace + "tier") - components = nbt.getTagList(Settings.namespace + "components", NBT.TAG_COMPOUND).map((list, index) => { - ItemStack.loadItemStackFromNBT(list.getCompoundTagAt(index)) - }).toArray - containers = nbt.getTagList(Settings.namespace + "containers", NBT.TAG_COMPOUND).map((list, index) => { - ItemStack.loadItemStackFromNBT(list.getCompoundTagAt(index)) - }).toArray + components = nbt.getTagList(Settings.namespace + "components", NBT.TAG_COMPOUND). + map((list, index) => loadStack(list.getCompoundTagAt(index))).toArray + containers = nbt.getTagList(Settings.namespace + "containers", NBT.TAG_COMPOUND). + map((list, index) => loadStack(list.getCompoundTagAt(index))).toArray } else { // Old robot, upgrade to new modular model. @@ -191,7 +192,7 @@ object ItemUtils { override def load(nbt: NBTTagCompound) { if (nbt.hasKey(Settings.namespace + "map")) { - map = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(Settings.namespace + "map")) + map = loadStack(nbt.getCompoundTag(Settings.namespace + "map")) } } @@ -218,7 +219,7 @@ object ItemUtils { val slotNbt = list.getCompoundTagAt(index) val slot = slotNbt.getByte("slot") if (slot >= 0 && slot < items.length) { - items(slot) = Option(ItemStack.loadItemStackFromNBT(slotNbt.getCompoundTag("item"))) + items(slot) = Option(loadStack(slotNbt.getCompoundTag("item"))) } }) isRunning = nbt.getBoolean(Settings.namespace + "isRunning")