aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorfirenoo <49818773+firenoo@users.noreply.github.com>2023-08-16 22:53:58 -0700
committerGitHub <noreply@github.com>2023-08-17 07:53:58 +0200
commit691239c347ab09bd6f024ab4fa1afaf19819cad0 (patch)
tree02c5adf5c7347a8cb8edce85280b69cf03176a1c /src
parent7d64f80c790d262b10eddae72042b09c4816d327 (diff)
downloadGT5-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.java54
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