From 858826d1fa14e1986ad6f2ab432846b591a2fdfe Mon Sep 17 00:00:00 2001 From: Sebastian Hartte Date: Mon, 24 Aug 2020 20:58:49 +0200 Subject: [PATCH] Fix use of Fuel Registry (it is null not, 0 for unregistered items). Fix Vibration Chamber inventory filter. Fix Molecular Assembler inventory filter. --- .../container/slot/RestrictedInputSlot.java | 2 +- .../MolecularAssemblerBlockEntity.java | 86 +++++++++---------- .../tile/misc/CondenserBlockEntity.java | 4 +- .../misc/VibrationChamberBlockEntity.java | 56 +++++------- .../util/inv/WrapperFilteredItemHandler.java | 19 ++-- 5 files changed, 79 insertions(+), 88 deletions(-) diff --git a/src/main/java/appeng/container/slot/RestrictedInputSlot.java b/src/main/java/appeng/container/slot/RestrictedInputSlot.java index b072beecf..22b58713a 100644 --- a/src/main/java/appeng/container/slot/RestrictedInputSlot.java +++ b/src/main/java/appeng/container/slot/RestrictedInputSlot.java @@ -165,7 +165,7 @@ public class RestrictedInputSlot extends AppEngSlot { case ORE: return GrinderRecipes.isValidIngredient(p.player.world, stack); case FUEL: - return FuelRegistry.INSTANCE.get(stack.getItem()) > 0; + return FuelRegistry.INSTANCE.get(stack.getItem()) != null; case POWERED_TOOL: return Platform.isChargeable(stack); case QE_SINGULARITY: diff --git a/src/main/java/appeng/tile/crafting/MolecularAssemblerBlockEntity.java b/src/main/java/appeng/tile/crafting/MolecularAssemblerBlockEntity.java index 6a91dc1ab..2e2c60050 100644 --- a/src/main/java/appeng/tile/crafting/MolecularAssemblerBlockEntity.java +++ b/src/main/java/appeng/tile/crafting/MolecularAssemblerBlockEntity.java @@ -18,27 +18,9 @@ package appeng.tile.crafting; -import java.io.IOException; -import java.util.List; - -import javax.annotation.Nullable; - -import net.fabricmc.api.EnvType; -import net.fabricmc.api.Environment; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntity; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.inventory.CraftingInventory; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Direction; -import net.minecraft.world.World; - import alexiil.mc.lib.attributes.Simulation; import alexiil.mc.lib.attributes.item.FixedItemInv; - +import alexiil.mc.lib.attributes.item.LimitedFixedItemInv; import appeng.api.config.Actionable; import appeng.api.config.PowerMultiplier; import appeng.api.config.RedstoneMode; @@ -78,9 +60,24 @@ import appeng.util.Platform; import appeng.util.helpers.ItemHandlerUtil; import appeng.util.inv.InvOperation; import appeng.util.inv.WrapperChainedItemHandler; -import appeng.util.inv.WrapperFilteredItemHandler; -import appeng.util.inv.filter.IAEItemFilter; import appeng.util.item.AEItemStack; +import net.fabricmc.api.EnvType; +import net.fabricmc.api.Environment; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntity; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.inventory.CraftingInventory; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Direction; +import net.minecraft.world.World; +import org.jetbrains.annotations.NotNull; + +import javax.annotation.Nullable; +import java.io.IOException; +import java.util.List; public class MolecularAssemblerBlockEntity extends AENetworkInvBlockEntity implements IUpgradeableHost, IConfigManagerHost, IGridTickable, ICraftingMachine, IPowerChannelState { @@ -90,8 +87,8 @@ public class MolecularAssemblerBlockEntity extends AENetworkInvBlockEntity private final CraftingInventory craftingInv; private final AppEngInternalInventory gridInv = new AppEngInternalInventory(this, 9 + 1, 1); private final AppEngInternalInventory patternInv = new AppEngInternalInventory(this, 1, 1); - private final FixedItemInv gridInvExt = new WrapperFilteredItemHandler(this.gridInv, new CraftingGridFilter()); private final FixedItemInv internalInv = new WrapperChainedItemHandler(this.gridInv, this.patternInv); + private final LimitedFixedItemInv gridInvExt; private final IConfigManager settings; private final UpgradeInventory upgrades; private boolean isPowered = false; @@ -116,6 +113,24 @@ public class MolecularAssemblerBlockEntity extends AENetworkInvBlockEntity this.upgrades = new DefinitionUpgradeInventory(assembler, this, this.getUpgradeSlots()); this.craftingInv = new CraftingInventory(new ContainerNull(), 3, 3); + gridInvExt = gridInv.createLimitedFixedInv(); + // Limit the input slots to 1 of the respective crafting ingredient + for ( int i = 0; i < 9; i++) { + int slot = i; + gridInvExt.getRule(slot) + .disallowExtraction() + .limitInsertionCount(1) + .filterInserts(stack -> isValidIngredientForSlot(slot, stack)); + } + // Output slot + gridInvExt.getRule(9).disallowInsertion(); + } + + private boolean isValidIngredientForSlot(int slot, ItemStack stack) { + return this.myPlan != null + && !ItemHandlerUtil.isEmpty(this.patternInv) + && this.myPlan.isValidItemForSlot(slot, stack, + MolecularAssemblerBlockEntity.this.getWorld()); } private int getUpgradeSlots() { @@ -310,8 +325,9 @@ public class MolecularAssemblerBlockEntity extends AENetworkInvBlockEntity return this.internalInv; } + @NotNull @Override - protected FixedItemInv getItemHandlerForSide(Direction side) { + public FixedItemInv getExternalInventory() { return this.gridInvExt; } @@ -554,28 +570,4 @@ public class MolecularAssemblerBlockEntity extends AENetworkInvBlockEntity return this.animationStatus; } - private class CraftingGridFilter implements IAEItemFilter { - private boolean hasPattern() { - return MolecularAssemblerBlockEntity.this.myPlan != null - && !ItemHandlerUtil.isEmpty(MolecularAssemblerBlockEntity.this.patternInv); - } - - @Override - public boolean allowExtract(FixedItemInv inv, int slot, int amount) { - return slot == 9; - } - - @Override - public boolean allowInsert(FixedItemInv inv, int slot, ItemStack stack) { - if (slot >= 9) { - return false; - } - - if (this.hasPattern()) { - return MolecularAssemblerBlockEntity.this.myPlan.isValidItemForSlot(slot, stack, - MolecularAssemblerBlockEntity.this.getWorld()); - } - return false; - } - } } diff --git a/src/main/java/appeng/tile/misc/CondenserBlockEntity.java b/src/main/java/appeng/tile/misc/CondenserBlockEntity.java index fff06abee..2ee2b598c 100644 --- a/src/main/java/appeng/tile/misc/CondenserBlockEntity.java +++ b/src/main/java/appeng/tile/misc/CondenserBlockEntity.java @@ -138,7 +138,7 @@ public class CondenserBlockEntity extends AEBaseInvBlockEntity implements IConfi } private boolean canAddOutput(final ItemStack output) { - return this.outputSlot.getInsertable().attemptInsertion(output, Simulation.SIMULATE).isEmpty(); + return this.outputSlot.getInsertable().wouldAccept(output); } /** @@ -147,7 +147,7 @@ public class CondenserBlockEntity extends AEBaseInvBlockEntity implements IConfi * @param output to be added output */ private void addOutput(final ItemStack output) { - this.outputSlot.getInsertable().attemptInsertion(output, Simulation.ACTION); + this.outputSlot.getInsertable().insert(output); } FixedItemInv getOutputSlot() { diff --git a/src/main/java/appeng/tile/misc/VibrationChamberBlockEntity.java b/src/main/java/appeng/tile/misc/VibrationChamberBlockEntity.java index 3d0012d76..b2c6ec394 100644 --- a/src/main/java/appeng/tile/misc/VibrationChamberBlockEntity.java +++ b/src/main/java/appeng/tile/misc/VibrationChamberBlockEntity.java @@ -18,22 +18,9 @@ package appeng.tile.misc; -import java.io.IOException; - -import javax.annotation.Nonnull; - -import net.fabricmc.fabric.api.registry.FuelRegistry; -import net.minecraft.block.BlockState; -import net.minecraft.block.entity.BlockEntityType; -import net.minecraft.item.Item; -import net.minecraft.item.ItemStack; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.PacketByteBuf; -import net.minecraft.util.math.Direction; - import alexiil.mc.lib.attributes.Simulation; import alexiil.mc.lib.attributes.item.FixedItemInv; - +import alexiil.mc.lib.attributes.item.LimitedFixedItemInv; import appeng.api.config.Actionable; import appeng.api.networking.IGridNode; import appeng.api.networking.energy.IEnergyGrid; @@ -49,8 +36,17 @@ import appeng.tile.grid.AENetworkInvBlockEntity; import appeng.tile.inventory.AppEngInternalInventory; import appeng.util.Platform; import appeng.util.inv.InvOperation; -import appeng.util.inv.WrapperFilteredItemHandler; -import appeng.util.inv.filter.IAEItemFilter; +import net.fabricmc.fabric.api.registry.FuelRegistry; +import net.minecraft.block.BlockState; +import net.minecraft.block.entity.BlockEntityType; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.PacketByteBuf; +import net.minecraft.util.math.Direction; + +import javax.annotation.Nonnull; +import java.io.IOException; public class VibrationChamberBlockEntity extends AENetworkInvBlockEntity implements IGridTickable { public static final double POWER_PER_TICK = 5; @@ -58,7 +54,7 @@ public class VibrationChamberBlockEntity extends AENetworkInvBlockEntity impleme public static final int MAX_BURN_SPEED = 200; public static final double DILATION_SCALING = 25.0; // x4 ~ 40 AE/t at max private final AppEngInternalInventory inv = new AppEngInternalInventory(this, 1); - private final FixedItemInv invExt = new WrapperFilteredItemHandler(this.inv, new FuelSlotFilter()); + private final LimitedFixedItemInv invExt; private int burnSpeed = 100; private double burnTime = 0; @@ -71,6 +67,11 @@ public class VibrationChamberBlockEntity extends AENetworkInvBlockEntity impleme super(tileEntityTypeIn); this.getProxy().setIdlePowerUsage(0); this.getProxy().setFlags(); + + invExt = inv.createLimitedFixedInv(); + invExt.getAllRule() + .filterInserts(stack -> FuelRegistry.INSTANCE.get(stack.getItem()) != null) + .filterExtracts(stack -> FuelRegistry.INSTANCE.get(stack.getItem()) == null); } @Override @@ -123,7 +124,7 @@ public class VibrationChamberBlockEntity extends AENetworkInvBlockEntity impleme @Override public void onChangeInventory(final FixedItemInv inv, final int slot, final InvOperation mc, - final ItemStack removed, final ItemStack added) { + final ItemStack removed, final ItemStack added) { if (this.getBurnTime() <= 0) { if (this.canEatFuel()) { try { @@ -138,8 +139,8 @@ public class VibrationChamberBlockEntity extends AENetworkInvBlockEntity impleme private boolean canEatFuel() { final ItemStack is = this.inv.getInvStack(0); if (!is.isEmpty()) { - final int newBurnTime = FuelRegistry.INSTANCE.get(is.getItem()); - if (newBurnTime > 0 && is.getCount() > 0) { + final Integer newBurnTime = FuelRegistry.INSTANCE.get(is.getItem()); + if (newBurnTime != null && is.getCount() > 0) { return true; } } @@ -210,8 +211,8 @@ public class VibrationChamberBlockEntity extends AENetworkInvBlockEntity impleme private void eatFuel() { final ItemStack is = this.inv.getInvStack(0); if (!is.isEmpty()) { - final int newBurnTime = FuelRegistry.INSTANCE.get(is.getItem()); - if (newBurnTime > 0 && is.getCount() > 0) { + final Integer newBurnTime = FuelRegistry.INSTANCE.get(is.getItem()); + if (newBurnTime != null && is.getCount() > 0) { this.setBurnTime(this.getBurnTime() + newBurnTime); this.setMaxBurnTime(this.getBurnTime()); @@ -270,15 +271,4 @@ public class VibrationChamberBlockEntity extends AENetworkInvBlockEntity impleme this.burnTime = burnTime; } - private static class FuelSlotFilter implements IAEItemFilter { - @Override - public boolean allowExtract(FixedItemInv inv, int slot, int amount) { - return FuelRegistry.INSTANCE.get(inv.getInvStack(slot).getItem()) == 0; - } - - @Override - public boolean allowInsert(FixedItemInv inv, int slot, ItemStack stack) { - return FuelRegistry.INSTANCE.get(stack.getItem()) != 0; - } - } } diff --git a/src/main/java/appeng/util/inv/WrapperFilteredItemHandler.java b/src/main/java/appeng/util/inv/WrapperFilteredItemHandler.java index 0b13e7df5..386f033b8 100644 --- a/src/main/java/appeng/util/inv/WrapperFilteredItemHandler.java +++ b/src/main/java/appeng/util/inv/WrapperFilteredItemHandler.java @@ -18,17 +18,16 @@ package appeng.util.inv; -import javax.annotation.Nonnull; - -import net.minecraft.item.ItemStack; - import alexiil.mc.lib.attributes.Simulation; import alexiil.mc.lib.attributes.item.FixedItemInv; import alexiil.mc.lib.attributes.item.ItemStackUtil; +import alexiil.mc.lib.attributes.item.LimitedFixedItemInv; import alexiil.mc.lib.attributes.item.filter.ItemFilter; import alexiil.mc.lib.attributes.item.impl.DelegatingFixedItemInv; - import appeng.util.inv.filter.IAEItemFilter; +import net.minecraft.item.ItemStack; + +import javax.annotation.Nonnull; // FIXME: Needs to be double checked, LBA has better ways of doing this public class WrapperFilteredItemHandler extends DelegatingFixedItemInv { @@ -39,6 +38,16 @@ public class WrapperFilteredItemHandler extends DelegatingFixedItemInv { this.filter = filter; } + public static LimitedFixedItemInv create(FixedItemInv base, IAEItemFilter filter) { + LimitedFixedItemInv limited = base.createLimitedFixedInv(); + for (int i = 0; i < base.getSlotCount(); i++) { + int slot = i; + limited.getRule(i).filterInserts(stack -> filter.allowInsert(base, slot, stack)) + .filterExtracts(stack -> filter.allowExtract(base, slot, stack.getCount())); + } + return limited; + } + @Override public boolean setInvStack(int slot, ItemStack to, Simulation simulation) { ItemStack current = this.getInvStack(slot);