diff options
author | greatinfluence <36905103+greatinfluence@users.noreply.github.com> | 2023-07-28 06:29:28 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-07-28 12:29:28 +0200 |
commit | edf63121630cde22a30b78a4ad7d7fff3d488d93 (patch) | |
tree | d46feb3fed76149d6811c56eb01d111abd1cebd7 /src/main/java/gregtech/common/tileentities/machines | |
parent | 4647e2e8be384582ad09c4f97a4c50dff4e05e4b (diff) | |
download | GT5-Unofficial-edf63121630cde22a30b78a4ad7d7fff3d488d93.tar.gz GT5-Unofficial-edf63121630cde22a30b78a4ad7d7fff3d488d93.tar.bz2 GT5-Unofficial-edf63121630cde22a30b78a4ad7d7fff3d488d93.zip |
Crafting Input bus/buffer Overflow fix (#2187)
* Ignore the .vs file created by VS
* Fix item/fluid integer overflow problem
Diffstat (limited to 'src/main/java/gregtech/common/tileentities/machines')
-rw-r--r-- | src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java | 57 |
1 files changed, 47 insertions, 10 deletions
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java index 2a9598a0d8..d88d8050c5 100644 --- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java +++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_CraftingInput_ME.java @@ -182,7 +182,8 @@ public class GT_MetaTileEntity_Hatch_CraftingInput_ME extends GT_MetaTileEntity_ } } - public void insertItemsAndFluids(InventoryCrafting inventoryCrafting) { + public boolean insertItemsAndFluids(InventoryCrafting inventoryCrafting) { + int errorIndex = -1; // overflow may occur at this index for (int i = 0; i < inventoryCrafting.getSizeInventory(); ++i) { ItemStack itemStack = inventoryCrafting.getStackInSlot(i); if (itemStack == null) continue; @@ -192,28 +193,63 @@ public class GT_MetaTileEntity_Hatch_CraftingInput_ME extends GT_MetaTileEntity_ var fluidStack = ItemFluidPacket.getFluidStack(itemStack); if (fluidStack == null) continue; for (var fluid : fluidInventory) { - if (fluid.isFluidEqual(fluidStack)) { - fluid.amount += fluidStack.amount; - inserted = true; + if (!fluid.isFluidEqual(fluidStack)) continue; + if (Integer.MAX_VALUE - fluidStack.amount < fluid.amount) { + // Overflow detected + errorIndex = i; break; } + fluid.amount += fluidStack.amount; + inserted = true; + break; } + if (errorIndex != -1) break; if (!inserted) { fluidInventory.add(fluidStack); } } else { // insert item for (var item : itemInventory) { - if (itemStack.isItemEqual(item)) { - item.stackSize += itemStack.stackSize; - inserted = true; + if (!itemStack.isItemEqual(item)) continue; + if (Integer.MAX_VALUE - itemStack.stackSize < item.stackSize) { + // Overflow detected + errorIndex = i; break; } + item.stackSize += itemStack.stackSize; + inserted = true; + break; } + if (errorIndex != -1) break; if (!inserted) { itemInventory.add(itemStack); } } } + if (errorIndex != -1) { // need to rollback + // Clean up the inserted items/liquids + for (int i = 0; i < errorIndex; ++i) { + var itemStack = inventoryCrafting.getStackInSlot(i); + if (itemStack.getItem() instanceof ItemFluidPacket) { // remove fluid + var fluidStack = ItemFluidPacket.getFluidStack(itemStack); + if (fluidStack == null) continue; + for (var fluid : fluidInventory) { + if (fluid.isFluidEqual(fluidStack)) { + fluid.amount -= fluidStack.amount; + break; + } + } + } else { // remove item + for (var item : itemInventory) { + if (item.isItemEqual(itemStack)) { + item.stackSize -= itemStack.stackSize; + break; + } + } + } + } + return false; + } + return true; } public NBTTagCompound writeToNBT(NBTTagCompound nbt) { @@ -657,9 +693,10 @@ public class GT_MetaTileEntity_Hatch_CraftingInput_ME extends GT_MetaTileEntity_ if (itemStack.getItem() instanceof ItemFluidPacket) return false; } } - - patternDetailsPatternSlotMap.get(patternDetails) - .insertItemsAndFluids(table); + if (!patternDetailsPatternSlotMap.get(patternDetails) + .insertItemsAndFluids(table)) { + return false; + } justHadNewItems = true; return true; } |