diff options
author | firenoo <49818773+firenoo@users.noreply.github.com> | 2023-08-16 22:53:58 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-17 07:53:58 +0200 |
commit | 691239c347ab09bd6f024ab4fa1afaf19819cad0 (patch) | |
tree | 02c5adf5c7347a8cb8edce85280b69cf03176a1c /src | |
parent | 7d64f80c790d262b10eddae72042b09c4816d327 (diff) | |
download | GT5-Unofficial-691239c347ab09bd6f024ab4fa1afaf19819cad0.tar.gz GT5-Unofficial-691239c347ab09bd6f024ab4fa1afaf19819cad0.tar.bz2 GT5-Unofficial-691239c347ab09bd6f024ab4fa1afaf19819cad0.zip |
Fix a NPE w/ injecting into super/quantum chests (#2234)
When simulating an injection, if the stackSize > chest's capacity, it
causes a NPE when the internal chest is empty.
Also fixes a potential bug when void overflow is set; the chest should
return null in such a scenario regardless of simulation/modulation.
Diffstat (limited to 'src')
-rw-r--r-- | src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java | 54 |
1 files changed, 27 insertions, 27 deletions
diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java index 7d1d49ee02..d8d4483cb9 100644 --- a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java +++ b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalChestBase.java @@ -214,37 +214,37 @@ public abstract class GT_MetaTileEntity_DigitalChestBase extends GT_MetaTileEnti @Override public IAEItemStack injectItems(final IAEItemStack input, final appeng.api.config.Actionable mode, final appeng.api.networking.security.BaseActionSource src) { - final ItemStack inputStack = input.getItemStack(); - if (inputStack == null) return null; if (getBaseMetaTileEntity() == null) return input; - if (mode != appeng.api.config.Actionable.SIMULATE) getBaseMetaTileEntity().markDirty(); - ItemStack storedStack = getItemStack(); - if (storedStack != null) { - if (GT_Utility.areStacksEqual(storedStack, inputStack)) { - if (input.getStackSize() + getItemCount() > getMaxItemCount()) { - if (mVoidOverflow) { - if (mode != appeng.api.config.Actionable.SIMULATE) setItemCount(getMaxItemCount()); - return null; - } - return createOverflowStack(input.getStackSize() + getItemCount(), mode); - } - if (mode != appeng.api.config.Actionable.SIMULATE) - setItemCount(getItemCount() + (int) input.getStackSize()); - return null; - } + + final ItemStack inputStack = input.getItemStack(); + final int maxCapacity = getMaxItemCount(); + final int itemCount = getItemCount(); + final long toAdd = input.getStackSize(); + final ItemStack storedStack = getItemStack(); + + if (storedStack != null && !GT_Utility.areStacksEqual(storedStack, inputStack)) { + // Can't stack with existing item, just return the input. return input; } - if (mode != appeng.api.config.Actionable.SIMULATE) setItemStack(inputStack.copy()); - if (input.getStackSize() > getMaxItemCount()) return createOverflowStack(input.getStackSize(), mode); - if (mode != appeng.api.config.Actionable.SIMULATE) setItemCount((int) input.getStackSize()); - return null; - } - private IAEItemStack createOverflowStack(long size, appeng.api.config.Actionable mode) { - final IAEItemStack overflow = AEItemStack.create(getItemStack()); - overflow.setStackSize(size - getMaxItemCount()); - if (mode != appeng.api.config.Actionable.SIMULATE) setItemCount(getMaxItemCount()); - return overflow; + // Number of items not added because there's too much to add. + final long notAdded = itemCount + toAdd - maxCapacity; + + if (mode == appeng.api.config.Actionable.MODULATE) { + final int newCount = (int) Math.min((long) maxCapacity, itemCount + toAdd); + + if (storedStack == null) { + setItemStack(inputStack.copy()); + } + setItemCount(newCount); + getBaseMetaTileEntity().markDirty(); + } + if (mVoidOverflow || notAdded <= 0) { + return null; + } else { + return input.copy() + .setStackSize(notAdded); + } } @Override |