mirror of
https://github.com/Creators-of-Create/Create.git
synced 2024-12-14 10:33:50 +01:00
Stack of Spades
- Protect item handlers against invalid item stack sizes - Fix some held or dropped items not updating count when inserted into item handlers
This commit is contained in:
parent
a99f05d8b0
commit
8e50ad4cfd
8 changed files with 34 additions and 6 deletions
|
@ -2,6 +2,7 @@ package com.simibubi.create.content.fluids.drain;
|
|||
|
||||
import com.simibubi.create.content.fluids.transfer.GenericItemEmptying;
|
||||
import com.simibubi.create.content.kinetics.belt.transport.TransportedItemStack;
|
||||
import com.simibubi.create.foundation.item.ItemHelper;
|
||||
|
||||
import net.minecraft.core.Direction;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
@ -38,7 +39,8 @@ public class ItemDrainItemHandler implements IItemHandler {
|
|||
if (stack.getCount() > 1 && GenericItemEmptying.canItemBeEmptied(blockEntity.getLevel(), stack)) {
|
||||
returned = ItemHandlerHelper.copyStackWithSize(stack, stack.getCount() - 1);
|
||||
stack = ItemHandlerHelper.copyStackWithSize(stack, 1);
|
||||
}
|
||||
} else
|
||||
returned = ItemHelper.limitCountToMaxStackSize(stack, simulate);
|
||||
|
||||
if (!simulate) {
|
||||
TransportedItemStack heldItem = new TransportedItemStack(stack);
|
||||
|
|
|
@ -218,6 +218,8 @@ public class BeltBlock extends HorizontalKineticBlock
|
|||
.copy(), false);
|
||||
if (remainder.isEmpty())
|
||||
itemEntity.discard();
|
||||
else if (remainder.getCount() != itemEntity.getItem().getCount())
|
||||
itemEntity.setItem(remainder);
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package com.simibubi.create.content.kinetics.belt.transport;
|
||||
|
||||
import com.simibubi.create.foundation.item.ItemHelper;
|
||||
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
|
@ -29,6 +31,7 @@ public class ItemHandlerBeltSegment implements IItemHandler {
|
|||
@Override
|
||||
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
|
||||
if (this.beltInventory.canInsertAt(offset)) {
|
||||
ItemStack remainder = ItemHelper.limitCountToMaxStackSize(stack, simulate);
|
||||
if (!simulate) {
|
||||
TransportedItemStack newStack = new TransportedItemStack(stack);
|
||||
newStack.insertedAt = offset;
|
||||
|
@ -38,7 +41,7 @@ public class ItemHandlerBeltSegment implements IItemHandler {
|
|||
this.beltInventory.belt.setChanged();
|
||||
this.beltInventory.belt.sendData();
|
||||
}
|
||||
return ItemStack.EMPTY;
|
||||
return remainder;
|
||||
}
|
||||
return stack;
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.simibubi.create.content.kinetics.deployer;
|
||||
|
||||
import com.simibubi.create.foundation.blockEntity.behaviour.filtering.FilteringBehaviour;
|
||||
import com.simibubi.create.foundation.item.ItemHelper;
|
||||
|
||||
import net.minecraft.world.InteractionHand;
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
|
@ -52,9 +53,10 @@ public class DeployerItemHandler implements IItemHandlerModifiable {
|
|||
|
||||
ItemStack held = getHeld();
|
||||
if (held.isEmpty()) {
|
||||
ItemStack remainder = ItemHelper.limitCountToMaxStackSize(stack, simulate);
|
||||
if (!simulate)
|
||||
set(stack);
|
||||
return ItemStack.EMPTY;
|
||||
return remainder;
|
||||
}
|
||||
|
||||
if (!ItemHandlerHelper.canItemStacksStack(held, stack))
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package com.simibubi.create.content.logistics.chute;
|
||||
|
||||
import com.simibubi.create.foundation.item.ItemHelper;
|
||||
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
|
@ -25,9 +27,10 @@ public class ChuteItemHandler implements IItemHandler {
|
|||
public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) {
|
||||
if (!blockEntity.canAcceptItem(stack))
|
||||
return stack;
|
||||
ItemStack remainder = ItemHelper.limitCountToMaxStackSize(stack, simulate);
|
||||
if (!simulate)
|
||||
blockEntity.setItem(stack);
|
||||
return ItemStack.EMPTY;
|
||||
return remainder;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -93,7 +93,7 @@ public abstract class FunnelBlock extends AbstractDirectionalFunnelBlock {
|
|||
withBlockEntityDo(worldIn, pos, be -> {
|
||||
ItemStack toInsert = heldItem.copy();
|
||||
ItemStack remainder = tryInsert(worldIn, pos, toInsert, false);
|
||||
if (!ItemStack.matches(remainder, toInsert))
|
||||
if (!ItemStack.matches(remainder, toInsert) || remainder.getCount() != heldItem.getCount())
|
||||
player.setItemInHand(handIn, remainder);
|
||||
});
|
||||
return InteractionResult.SUCCESS;
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
package com.simibubi.create.content.logistics.tunnel;
|
||||
|
||||
import com.simibubi.create.foundation.item.ItemHelper;
|
||||
|
||||
import net.minecraft.world.item.ItemStack;
|
||||
import net.minecraftforge.common.util.LazyOptional;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
@ -33,9 +35,11 @@ public class BrassTunnelItemHandler implements IItemHandler {
|
|||
|
||||
if (!blockEntity.canTakeItems())
|
||||
return stack;
|
||||
|
||||
ItemStack remainder = ItemHelper.limitCountToMaxStackSize(stack, simulate);
|
||||
if (!simulate)
|
||||
blockEntity.setStackToDistribute(stack, null);
|
||||
return ItemStack.EMPTY;
|
||||
return remainder;
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -276,4 +276,16 @@ public class ItemHelper {
|
|||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
public static ItemStack limitCountToMaxStackSize(ItemStack stack, boolean simulate) {
|
||||
int count = stack.getCount();
|
||||
int max = stack.getMaxStackSize();
|
||||
if (count <= max)
|
||||
return ItemStack.EMPTY;
|
||||
ItemStack remainder = ItemHandlerHelper.copyStackWithSize(stack, count - max);
|
||||
if (!simulate)
|
||||
stack.setCount(max);
|
||||
return remainder;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue