Convert blocks in OC inventories on load, in particular to ensure screens in robots are converted.

This commit is contained in:
Florian Nücke 2014-10-10 15:07:17 +02:00
parent a6da00f4a9
commit 366c6fc476
11 changed files with 44 additions and 24 deletions

View File

@ -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)
}

View File

@ -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
}

View File

@ -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
}
}

View File

@ -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")

View File

@ -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")))
}
})
}

View File

@ -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))
}
}
}

View File

@ -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")

View File

@ -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

View File

@ -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")))
}
}
}

View File

@ -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")
}

View File

@ -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")