aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common/tileentities/machines
diff options
context:
space:
mode:
authorgreatinfluence <36905103+greatinfluence@users.noreply.github.com>2023-07-28 06:29:28 -0400
committerGitHub <noreply@github.com>2023-07-28 12:29:28 +0200
commitedf63121630cde22a30b78a4ad7d7fff3d488d93 (patch)
treed46feb3fed76149d6811c56eb01d111abd1cebd7 /src/main/java/gregtech/common/tileentities/machines
parent4647e2e8be384582ad09c4f97a4c50dff4e05e4b (diff)
downloadGT5-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.java57
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;
}