Fix output item stacking for condenser.
Fix exposed inventories for condenser.
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user