From 9ac4ea4e6eaf37b3476b531d294c7f8765c7e9f9 Mon Sep 17 00:00:00 2001 From: PrototypeTrousers Date: Wed, 12 Oct 2022 04:10:23 -0300 Subject: [PATCH] custom serialization of oversized itemstacks. simple limiting by checking overflow --- .../implementations/ContainerPatternTerm.java | 7 +++- .../java/appeng/helpers/PatternHelper.java | 8 ++++ .../inventory/AppEngInternalInventory.java | 41 +++++++++++++++++++ 3 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/main/java/appeng/container/implementations/ContainerPatternTerm.java b/src/main/java/appeng/container/implementations/ContainerPatternTerm.java index 9e264fb35..a2bcae31f 100644 --- a/src/main/java/appeng/container/implementations/ContainerPatternTerm.java +++ b/src/main/java/appeng/container/implementations/ContainerPatternTerm.java @@ -266,13 +266,13 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA for (int x = 0; x < this.craftingSlots.length; x++) { input[x] = this.craftingSlots[x].getStack(); - if (!input[x].isEmpty() && input[x].getCount() * multiple > input[x].getMaxStackSize()) { + if (!input[x].isEmpty() && input[x].getCount() * multiple < 0) { canMultiplyInputs = false; } } for (final OptionalSlotFake outputSlot : this.outputSlots) { final ItemStack out = outputSlot.getStack(); - if (!out.isEmpty() && out.getCount() * multiple > out.getMaxStackSize()) { + if (!out.isEmpty() && out.getCount() * multiple < 0) { canMultiplyOutputs = false; } } @@ -488,6 +488,9 @@ public class ContainerPatternTerm extends ContainerMEMonitorable implements IAEA if (!i.isEmpty()) { i.writeToNBT(c); + if (i.getCount() > i.getMaxStackSize()) { + c.setInteger("stackSize", i.getCount()); + } } return c; diff --git a/src/main/java/appeng/helpers/PatternHelper.java b/src/main/java/appeng/helpers/PatternHelper.java index 39231d57f..c45e18650 100644 --- a/src/main/java/appeng/helpers/PatternHelper.java +++ b/src/main/java/appeng/helpers/PatternHelper.java @@ -93,6 +93,10 @@ public class PatternHelper implements ICraftingPatternDetails, Comparable is.getMaxStackSize()) { + itemTag.setInteger("stackSize", stacks.get(i).getCount()); + } + stacks.get(i).writeToNBT(itemTag); + nbtTagList.appendTag(itemTag); + } + } + NBTTagCompound nbt = new NBTTagCompound(); + nbt.setTag("Items", nbtTagList); + nbt.setInteger("Size", stacks.size()); + return nbt; + } + public void readFromNBT(final NBTTagCompound data, final String name) { final NBTTagCompound c = data.getCompoundTag(name); if (c != null) { @@ -163,6 +186,24 @@ public class AppEngInternalInventory extends ItemStackHandler implements Iterabl this.deserializeNBT(data); } + @Override + public void deserializeNBT(NBTTagCompound nbt) { + setSize(nbt.hasKey("Size", Constants.NBT.TAG_INT) ? nbt.getInteger("Size") : stacks.size()); + NBTTagList tagList = nbt.getTagList("Items", Constants.NBT.TAG_COMPOUND); + for (int i = 0; i < tagList.tagCount(); i++) { + NBTTagCompound itemTags = tagList.getCompoundTagAt(i); + int slot = itemTags.getInteger("Slot"); + if (slot >= 0 && slot < stacks.size()) { + stacks.set(slot, new ItemStack(itemTags)); + if (itemTags.hasKey("stackSize")) { + int stackSize = itemTags.getInteger("stackSize"); + stacks.get(slot).setCount(stackSize); + } + } + } + onLoad(); + } + @Override public Iterator iterator() { return Collections.unmodifiableList(super.stacks).iterator();