Fixed issue with empty stacks in autocrafting during (de)serialization.
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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<ItemStack> {
|
||||
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);
|
||||
|
||||
@@ -27,12 +27,6 @@ public class StorageDiskItem implements IStorageDisk<ItemStack> {
|
||||
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<Item, ItemStack> stacks = ArrayListMultimap.create();
|
||||
@@ -56,29 +50,8 @@ public class StorageDiskItem implements IStorageDisk<ItemStack> {
|
||||
|
||||
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);
|
||||
|
||||
@@ -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 -> {
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user