Fixed issue with empty stacks in autocrafting during (de)serialization.

This commit is contained in:
raoulvdberge
2018-07-01 14:21:24 +02:00
parent 6537e55666
commit cea4afeacc
10 changed files with 65 additions and 52 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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