Fix output item stacking for condenser.

Fix exposed inventories for condenser.
This commit is contained in:
Sebastian Hartte
2020-08-03 13:06:00 +02:00
parent 1693271660
commit 541f07a7e3
@@ -28,13 +28,17 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import alexiil.mc.lib.attributes.AttributeList; import alexiil.mc.lib.attributes.AttributeList;
import alexiil.mc.lib.attributes.ListenerRemovalToken;
import alexiil.mc.lib.attributes.ListenerToken;
import alexiil.mc.lib.attributes.Simulation; import alexiil.mc.lib.attributes.Simulation;
import alexiil.mc.lib.attributes.fluid.FluidInsertable; import alexiil.mc.lib.attributes.fluid.FluidInsertable;
import alexiil.mc.lib.attributes.fluid.FluidVolumeUtil; import alexiil.mc.lib.attributes.fluid.FluidVolumeUtil;
import alexiil.mc.lib.attributes.fluid.amount.FluidAmount; import alexiil.mc.lib.attributes.fluid.amount.FluidAmount;
import alexiil.mc.lib.attributes.fluid.volume.FluidVolume; import alexiil.mc.lib.attributes.fluid.volume.FluidVolume;
import alexiil.mc.lib.attributes.item.FixedItemInv; import alexiil.mc.lib.attributes.item.FixedItemInv;
import alexiil.mc.lib.attributes.item.InvMarkDirtyListener;
import alexiil.mc.lib.attributes.item.ItemInsertable; import alexiil.mc.lib.attributes.item.ItemInsertable;
import alexiil.mc.lib.attributes.item.LimitedFixedItemInv;
import appeng.api.config.CondenserOutput; import appeng.api.config.CondenserOutput;
import appeng.api.config.Settings; import appeng.api.config.Settings;
@@ -67,17 +71,27 @@ public class CondenserBlockEntity extends AEBaseInvBlockEntity implements IConfi
private final AppEngInternalInventory outputSlot = new AppEngInternalInventory(this, 1); private final AppEngInternalInventory outputSlot = new AppEngInternalInventory(this, 1);
private final AppEngInternalInventory storageSlot = new AppEngInternalInventory(this, 1); private final AppEngInternalInventory storageSlot = new AppEngInternalInventory(this, 1);
private final ItemInsertable externalItemInput = new CondenseItemHandler(); // This is a FixedItemInv implementation to satisfy the UI, which is slot based
private final CondenseItemHandler internalInputSlot = new CondenseItemHandler();
private final CondenseItemInsertable externalItemInput = new CondenseItemInsertable();
private final FluidInsertable externalFluidInput = new FluidHandler(); private final FluidInsertable externalFluidInput = new FluidHandler();
private final MEHandler meHandler = new MEHandler(); private final MEHandler meHandler = new MEHandler();
private final FixedItemInv combinedInv = new WrapperChainedItemHandler(this.outputSlot, this.storageSlot); private final FixedItemInv combinedInv = new WrapperChainedItemHandler(this.internalInputSlot, this.outputSlot,
this.storageSlot);
// Only makes input+output visible and limits output to extraction
private final FixedItemInv externalCombinedInv;
private double storedPower = 0; private double storedPower = 0;
public CondenserBlockEntity(BlockEntityType<?> tileEntityTypeIn) { public CondenserBlockEntity(BlockEntityType<?> tileEntityTypeIn) {
super(tileEntityTypeIn); super(tileEntityTypeIn);
this.cm.registerSetting(Settings.CONDENSER_OUTPUT, CondenserOutput.TRASH); this.cm.registerSetting(Settings.CONDENSER_OUTPUT, CondenserOutput.TRASH);
LimitedFixedItemInv limitedOutput = this.outputSlot.createLimitedFixedInv();
limitedOutput.getAllRule().disallowInsertion();
externalCombinedInv = new WrapperChainedItemHandler(this.internalInputSlot, limitedOutput);
} }
@Override @Override
@@ -125,7 +139,7 @@ public class CondenserBlockEntity extends AEBaseInvBlockEntity implements IConfi
} }
private boolean canAddOutput(final ItemStack output) { private boolean canAddOutput(final ItemStack output) {
return this.outputSlot.setInvStack(0, output, Simulation.SIMULATE); return this.outputSlot.getInsertable().attemptInsertion(output, Simulation.SIMULATE).isEmpty();
} }
/** /**
@@ -134,7 +148,7 @@ public class CondenserBlockEntity extends AEBaseInvBlockEntity implements IConfi
* @param output to be added output * @param output to be added output
*/ */
private void addOutput(final ItemStack output) { private void addOutput(final ItemStack output) {
this.outputSlot.setInvStack(0, output, Simulation.ACTION); this.outputSlot.getInsertable().attemptInsertion(output, Simulation.ACTION);
} }
FixedItemInv getOutputSlot() { FixedItemInv getOutputSlot() {
@@ -194,24 +208,58 @@ public class CondenserBlockEntity extends AEBaseInvBlockEntity implements IConfi
@Override @Override
public void addAllAttributes(World world, BlockPos pos, BlockState state, AttributeList<?> to) { public void addAllAttributes(World world, BlockPos pos, BlockState state, AttributeList<?> to) {
super.addAllAttributes(world, pos, state, to); // Do not call super here since it would offer up the internal inventory
to.offer(externalItemInput); to.offer(externalCombinedInv);
to.offer(externalFluidInput); to.offer(externalFluidInput);
to.offer(outputSlot.getPureExtractable());
to.offer(meHandler); to.offer(meHandler);
} }
private class CondenseItemHandler implements ItemInsertable { private class CondenseItemInsertable implements ItemInsertable {
@Override @Override
public ItemStack attemptInsertion(ItemStack stack, Simulation simulation) { public ItemStack attemptInsertion(ItemStack itemStack, Simulation simulation) {
if (simulation == Simulation.ACTION && !stack.isEmpty()) { if (simulation == Simulation.ACTION && !itemStack.isEmpty()) {
CondenserBlockEntity.this.addPower(stack.getCount()); CondenserBlockEntity.this.addPower(itemStack.getCount());
} }
return ItemStack.EMPTY; return ItemStack.EMPTY;
} }
}
private class CondenseItemHandler implements FixedItemInv {
@Override
public int getSlotCount() {
return 1;
}
@Override
public ItemStack getInvStack(int i) {
return ItemStack.EMPTY;
}
@Override
public boolean isItemValidForSlot(int i, ItemStack itemStack) {
return true;
}
@Override
public boolean setInvStack(int i, ItemStack itemStack, Simulation simulation) {
if (simulation == Simulation.ACTION) {
CondenserBlockEntity.this.addPower(itemStack.getCount());
}
return true;
}
@Override
public int getChangeValue() {
return 0;
}
@Nullable
@Override
public ListenerToken addListener(InvMarkDirtyListener invMarkDirtyListener,
ListenerRemovalToken listenerRemovalToken) {
return null;
}
} }
/** /**