Unstackable items are a thing, i guess

This commit is contained in:
grimmauld 2020-09-10 11:41:23 +02:00
parent 59339a7bcb
commit 3b516f5022
3 changed files with 38 additions and 12 deletions

View file

@ -31,12 +31,10 @@ public class DispenserMovementBehaviour extends DropperMovementBehaviour {
@Override @Override
protected void activate(MovementContext context, BlockPos pos) { protected void activate(MovementContext context, BlockPos pos) {
int i = getDispenseSlot(context); ItemStack itemstack = getDispenseStack(context);
if (i < 0) { if (itemstack.isEmpty()) {
context.world.playEvent(1001, pos, 0); context.world.playEvent(1001, pos, 0);
} else { } else {
ItemStack itemstack = getStacks(context).get(i);
// Special dispense item behaviour for moving contraptions // Special dispense item behaviour for moving contraptions
if (MOVED_DISPENSE_ITEM_BEHAVIOURS.containsKey(itemstack.getItem())) { if (MOVED_DISPENSE_ITEM_BEHAVIOURS.containsKey(itemstack.getItem())) {
MOVED_DISPENSE_ITEM_BEHAVIOURS.get(itemstack.getItem()).dispense(itemstack, context, pos); MOVED_DISPENSE_ITEM_BEHAVIOURS.get(itemstack.getItem()).dispense(itemstack, context, pos);

View file

@ -10,6 +10,8 @@ import net.minecraft.util.NonNullList;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.server.ServerWorld; import net.minecraft.world.server.ServerWorld;
import java.util.ArrayList;
import java.util.List;
import java.util.Random; import java.util.Random;
public class DropperMovementBehaviour extends MovementBehaviour { public class DropperMovementBehaviour extends MovementBehaviour {
@ -17,11 +19,11 @@ public class DropperMovementBehaviour extends MovementBehaviour {
private static final Random RNG = new Random(); private static final Random RNG = new Random();
protected void activate(MovementContext context, BlockPos pos) { protected void activate(MovementContext context, BlockPos pos) {
int i = getDispenseSlot(context); ItemStack itemstack = getDispenseStack(context);
if (i < 0) { if (itemstack.isEmpty()) {
context.world.playEvent(1001, pos, 0); context.world.playEvent(1001, pos, 0);
} else { } else {
defaultBehaviour.dispense(getStacks(context).get(i), context, pos); defaultBehaviour.dispense(itemstack, context, pos);
} }
} }
@ -39,7 +41,7 @@ public class DropperMovementBehaviour extends MovementBehaviour {
} }
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
protected NonNullList<ItemStack> getStacks(MovementContext context) { private NonNullList<ItemStack> getStacks(MovementContext context) {
if (!(context.temporaryData instanceof NonNullList) && context.world instanceof ServerWorld) { if (!(context.temporaryData instanceof NonNullList) && context.world instanceof ServerWorld) {
NonNullList<ItemStack> stacks = NonNullList.withSize(9, ItemStack.EMPTY); NonNullList<ItemStack> stacks = NonNullList.withSize(9, ItemStack.EMPTY);
ItemStackHelper.loadAllItems(context.tileData, stacks); ItemStackHelper.loadAllItems(context.tileData, stacks);
@ -48,6 +50,21 @@ public class DropperMovementBehaviour extends MovementBehaviour {
return (NonNullList<ItemStack>) context.temporaryData; return (NonNullList<ItemStack>) context.temporaryData;
} }
private ArrayList<ItemStack> getUseableStacks(MovementContext context) {
ArrayList<ItemStack> useable = new ArrayList<>();
for (ItemStack testStack : getStacks(context)) {
if (testStack == null || testStack.isEmpty())
continue;
if (testStack.getMaxStackSize() == 1) {
ItemStack stack = ItemHelper.findFirstMatch(context.contraption.inventory, testStack::isItemEqual);
if (!stack.isEmpty())
useable.add(stack);
} else if (testStack.getCount() >= 2)
useable.add(testStack);
}
return useable;
}
@Override @Override
public void writeExtraData(MovementContext context) { public void writeExtraData(MovementContext context) {
NonNullList<ItemStack> stacks = getStacks(context); NonNullList<ItemStack> stacks = getStacks(context);
@ -62,15 +79,18 @@ public class DropperMovementBehaviour extends MovementBehaviour {
writeExtraData(context); writeExtraData(context);
} }
protected int getDispenseSlot(MovementContext context) { protected ItemStack getDispenseStack(MovementContext context) {
int i = -1; int i = -1;
int j = 1; int j = 1;
NonNullList<ItemStack> stacks = getStacks(context); List<ItemStack> stacks = getUseableStacks(context);
for (int k = 0; k < stacks.size(); ++k) { for (int k = 0; k < stacks.size(); ++k) {
if (!stacks.get(k).isEmpty() && RNG.nextInt(j++) == 0 && stacks.get(k).getCount() >= 2) { if (RNG.nextInt(j++) == 0) {
i = k; i = k;
} }
} }
return i; if (i < 0)
return ItemStack.EMPTY;
else
return stacks.get(i);
} }
} }

View file

@ -241,4 +241,12 @@ public class ItemHelper {
return extracting; return extracting;
} }
public static ItemStack findFirstMatch(IItemHandler inv, Predicate<ItemStack> test) {
for (int i = 0; i < inv.getSlots(); i++) {
ItemStack toTest = inv.getStackInSlot(i);
if (test.test(toTest))
return toTest;
}
return ItemStack.EMPTY;
}
} }