diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementItemRender.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementItemRender.java index e70ab551f..f10ccaff4 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementItemRender.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/craftingmonitor/CraftingMonitorElementItemRender.java @@ -4,10 +4,10 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftin import com.raoulvdberge.refinedstorage.api.render.IElementDrawers; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.util.RenderUtils; +import com.raoulvdberge.refinedstorage.util.StackUtils; import io.netty.buffer.ByteBuf; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; -import net.minecraftforge.fml.common.network.ByteBufUtils; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -50,7 +50,7 @@ public class CraftingMonitorElementItemRender implements ICraftingMonitorElement @Override public void write(ByteBuf buf) { - ByteBufUtils.writeItemStack(buf, stack); + StackUtils.writeItemStack(buf, stack); buf.writeInt(quantity); buf.writeInt(offset); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java index 0e31cd1aa..89354ec2f 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -25,6 +25,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.inserter.Crafti import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.step.CraftingStep; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.step.CraftingStepCraft; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.step.CraftingStepProcess; +import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -98,7 +99,7 @@ public class CraftingTask implements ICraftingTask { NBTTagList missing = tag.getTagList(NBT_MISSING, Constants.NBT.TAG_COMPOUND); for (int i = 0; i < missing.tagCount(); ++i) { - ItemStack missingItem = new ItemStack(missing.getCompoundTagAt(i)); + ItemStack missingItem = StackUtils.deserializeStackFromNbt(missing.getCompoundTagAt(i)); if (missingItem.isEmpty()) { throw new CraftingTaskReadException("Missing item is empty"); @@ -557,7 +558,7 @@ public class CraftingTask implements ICraftingTask { NBTTagList missing = new NBTTagList(); for (ItemStack missingItem : this.missing.getStacks()) { - missing.appendTag(missingItem.serializeNBT()); + missing.appendTag(StackUtils.serializeStackToNbt(missingItem)); } tag.setTag(NBT_MISSING, missing); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/extractor/CraftingExtractor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/extractor/CraftingExtractor.java index 24219a91e..a62c3bbf3 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/extractor/CraftingExtractor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/extractor/CraftingExtractor.java @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.extractor; import com.raoulvdberge.refinedstorage.api.autocrafting.task.CraftingTaskReadException; import com.raoulvdberge.refinedstorage.api.network.INetwork; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.CraftingTask; +import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -41,7 +42,7 @@ public class CraftingExtractor { for (int i = 0; i < tag.tagCount(); ++i) { NBTTagCompound itemTag = tag.getCompoundTagAt(i); - ItemStack stack = new ItemStack(itemTag.getCompoundTag(NBT_ITEM)); + ItemStack stack = StackUtils.deserializeStackFromNbt(itemTag.getCompoundTag(NBT_ITEM)); if (stack.isEmpty()) { throw new CraftingTaskReadException("Extractor stack is empty"); @@ -151,7 +152,7 @@ public class CraftingExtractor { for (int i = 0; i < items.size(); ++i) { NBTTagCompound tag = new NBTTagCompound(); - tag.setTag(NBT_ITEM, items.get(i).serializeNBT()); + tag.setTag(NBT_ITEM, StackUtils.serializeStackToNbt(items.get(i))); tag.setInteger(NBT_STATUS, status.get(i).ordinal()); list.appendTag(tag); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/inserter/CraftingInserter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/inserter/CraftingInserter.java index 772e1080a..921f2f289 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/inserter/CraftingInserter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/inserter/CraftingInserter.java @@ -2,6 +2,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.inserter; import com.raoulvdberge.refinedstorage.api.autocrafting.task.CraftingTaskReadException; import com.raoulvdberge.refinedstorage.api.network.INetwork; +import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -27,7 +28,7 @@ public class CraftingInserter { for (int i = 0; i < list.tagCount(); ++i) { NBTTagCompound itemTag = list.getCompoundTagAt(i); - ItemStack stack = new ItemStack(itemTag.getCompoundTag(NBT_ITEM)); + ItemStack stack = StackUtils.deserializeStackFromNbt(itemTag.getCompoundTag(NBT_ITEM)); if (stack.isEmpty()) { throw new CraftingTaskReadException("Inserter has empty stack"); @@ -88,7 +89,7 @@ public class CraftingInserter { for (CraftingInserterItem item : items) { NBTTagCompound tag = new NBTTagCompound(); - tag.setTag(NBT_ITEM, item.getStack().serializeNBT()); + tag.setTag(NBT_ITEM, StackUtils.serializeStackToNbt(item.getStack())); tag.setInteger(NBT_STATUS, item.getStatus().ordinal()); list.appendTag(tag); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepCraft.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepCraft.java index b8b36dcd9..9b7665242 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepCraft.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepCraft.java @@ -5,6 +5,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.task.CraftingTaskReadExc import com.raoulvdberge.refinedstorage.api.network.INetwork; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.extractor.CraftingExtractor; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.inserter.CraftingInserter; +import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -50,7 +51,7 @@ public class CraftingStepCraft extends CraftingStep { NBTTagList tookList = tag.getTagList(NBT_TOOK, Constants.NBT.TAG_COMPOUND); for (int i = 0; i < tookList.tagCount(); ++i) { - took.add(new ItemStack(tookList.getCompoundTagAt(i))); + took.add(StackUtils.deserializeStackFromNbt(tookList.getCompoundTagAt(i))); // Took stack can be empty } } @@ -92,7 +93,7 @@ public class CraftingStepCraft extends CraftingStep { NBTTagList took = new NBTTagList(); for (ItemStack stack : this.took) { - took.appendTag(stack.serializeNBT()); + took.appendTag(StackUtils.serializeStackToNbt(stack)); } tag.setTag(NBT_TOOK, took); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepProcess.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepProcess.java index 3e2671b17..916abdb85 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepProcess.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepProcess.java @@ -6,6 +6,7 @@ import com.raoulvdberge.refinedstorage.api.network.INetwork; import com.raoulvdberge.refinedstorage.api.util.IStackList; import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.task.extractor.CraftingExtractor; +import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -47,7 +48,7 @@ public class CraftingStepProcess extends CraftingStep { NBTTagList toReceiveList = tag.getTagList(NBT_TO_RECEIVE, Constants.NBT.TAG_COMPOUND); for (int i = 0; i < toReceiveList.tagCount(); ++i) { - ItemStack toReceive = new ItemStack(toReceiveList.getCompoundTagAt(i)); + ItemStack toReceive = StackUtils.deserializeStackFromNbt(toReceiveList.getCompoundTagAt(i)); if (toReceive.isEmpty()) { throw new CraftingTaskReadException("Item to receive is empty"); @@ -104,7 +105,7 @@ public class CraftingStepProcess extends CraftingStep { NBTTagList toReceive = new NBTTagList(); for (ItemStack toReceiveStack : itemsToReceive.getStacks()) { - toReceive.appendTag(toReceiveStack.serializeNBT()); + toReceive.appendTag(StackUtils.serializeStackToNbt(toReceiveStack)); } tag.setTag(NBT_TO_RECEIVE, toReceive); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskFactoryItem.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskFactoryItem.java index 3728fa857..c765d72a0 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskFactoryItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskFactoryItem.java @@ -2,7 +2,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.storage.disk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDisk; import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskFactory; -import net.minecraft.item.Item; +import com.raoulvdberge.refinedstorage.util.StackUtils; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; @@ -18,16 +18,7 @@ public class StorageDiskFactoryItem implements IStorageDiskFactory { NBTTagList list = (NBTTagList) tag.getTag(StorageDiskItem.NBT_ITEMS); for (int i = 0; i < list.tagCount(); ++i) { - NBTTagCompound item = list.getCompoundTagAt(i); - - ItemStack stack = new ItemStack( - Item.getItemById(item.getInteger(StorageDiskItem.NBT_ITEM_TYPE)), - item.getInteger(StorageDiskItem.NBT_ITEM_QUANTITY), - item.getInteger(StorageDiskItem.NBT_ITEM_DAMAGE), - item.hasKey(StorageDiskItem.NBT_ITEM_CAPS) ? item.getCompoundTag(StorageDiskItem.NBT_ITEM_CAPS) : null - ); - - stack.setTagCompound(item.hasKey(StorageDiskItem.NBT_ITEM_NBT) ? item.getCompoundTag(StorageDiskItem.NBT_ITEM_NBT) : null); + ItemStack stack = StackUtils.deserializeStackFromNbt(list.getCompoundTagAt(i)); if (!stack.isEmpty()) { disk.getRawStacks().put(stack.getItem(), stack); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskItem.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskItem.java index ce41031af..a4a651ed4 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/disk/StorageDiskItem.java @@ -27,12 +27,6 @@ public class StorageDiskItem implements IStorageDisk { static final String NBT_CAPACITY = "Capacity"; static final String NBT_ITEMS = "Items"; - static final String NBT_ITEM_TYPE = "Type"; - static final String NBT_ITEM_QUANTITY = "Quantity"; - static final String NBT_ITEM_DAMAGE = "Damage"; - static final String NBT_ITEM_NBT = "NBT"; - static final String NBT_ITEM_CAPS = "Caps"; - private World world; private int capacity; private Multimap stacks = ArrayListMultimap.create(); @@ -56,29 +50,8 @@ public class StorageDiskItem implements IStorageDisk { NBTTagList list = new NBTTagList(); - // Dummy value for extracting ForgeCaps - NBTTagCompound dummy = new NBTTagCompound(); - for (ItemStack stack : stacks.values()) { - NBTTagCompound itemTag = new NBTTagCompound(); - - itemTag.setInteger(NBT_ITEM_TYPE, Item.getIdFromItem(stack.getItem())); - itemTag.setInteger(NBT_ITEM_QUANTITY, stack.getCount()); - itemTag.setInteger(NBT_ITEM_DAMAGE, stack.getItemDamage()); - - if (stack.hasTagCompound()) { - itemTag.setTag(NBT_ITEM_NBT, stack.getTagCompound()); - } - - stack.writeToNBT(dummy); - - if (dummy.hasKey("ForgeCaps")) { - itemTag.setTag(NBT_ITEM_CAPS, dummy.getTag("ForgeCaps")); - } - - dummy.removeTag("ForgeCaps"); - - list.appendTag(itemTag); + list.appendTag(StackUtils.serializeStackToNbt(stack)); } tag.setString(NBT_VERSION, RS.VERSION); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java index d31b1d6fa..23ed2b485 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java @@ -90,7 +90,7 @@ public class ProxyCommon { API.instance().getCraftingTaskRegistry().add(CraftingTaskFactory.ID, new CraftingTaskFactory()); - API.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementItemRender.ID, buf -> new CraftingMonitorElementItemRender(ByteBufUtils.readItemStack(buf), buf.readInt(), buf.readInt())); + API.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementItemRender.ID, buf -> new CraftingMonitorElementItemRender(StackUtils.readItemStack(buf), buf.readInt(), buf.readInt())); API.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementFluidRender.ID, buf -> new CraftingMonitorElementFluidRender(StackUtils.readFluidStack(buf).getRight(), buf.readInt())); API.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementText.ID, buf -> new CraftingMonitorElementText(ByteBufUtils.readUTF8String(buf), buf.readInt())); API.instance().getCraftingMonitorElementRegistry().add(CraftingMonitorElementColor.ID, buf -> { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java index 9c93579b1..07054ee48 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java @@ -311,4 +311,48 @@ public final class StackUtils { return lines; } + + private static final String NBT_ITEM_TYPE = "Type"; + private static final String NBT_ITEM_QUANTITY = "Quantity"; + private static final String NBT_ITEM_DAMAGE = "Damage"; + private static final String NBT_ITEM_NBT = "NBT"; + private static final String NBT_ITEM_CAPS = "Caps"; + + public static NBTTagCompound serializeStackToNbt(@Nonnull ItemStack stack) { + NBTTagCompound dummy = new NBTTagCompound(); + + NBTTagCompound itemTag = new NBTTagCompound(); + + itemTag.setInteger(NBT_ITEM_TYPE, Item.getIdFromItem(stack.getItem())); + itemTag.setInteger(NBT_ITEM_QUANTITY, stack.getCount()); + itemTag.setInteger(NBT_ITEM_DAMAGE, stack.getItemDamage()); + + if (stack.hasTagCompound()) { + itemTag.setTag(NBT_ITEM_NBT, stack.getTagCompound()); + } + + stack.writeToNBT(dummy); + + if (dummy.hasKey("ForgeCaps")) { + itemTag.setTag(NBT_ITEM_CAPS, dummy.getTag("ForgeCaps")); + } + + dummy.removeTag("ForgeCaps"); + + return itemTag; + } + + @Nonnull + public static ItemStack deserializeStackFromNbt(NBTTagCompound tag) { + ItemStack stack = new ItemStack( + Item.getItemById(tag.getInteger(NBT_ITEM_TYPE)), + tag.getInteger(NBT_ITEM_QUANTITY), + tag.getInteger(NBT_ITEM_DAMAGE), + tag.hasKey(NBT_ITEM_CAPS) ? tag.getCompoundTag(NBT_ITEM_CAPS) : null + ); + + stack.setTagCompound(tag.hasKey(NBT_ITEM_NBT) ? tag.getCompoundTag(NBT_ITEM_NBT) : null); + + return stack; + } }