From f67d7ce14d410d02730d4c9fc0d95e1514da6b8b Mon Sep 17 00:00:00 2001 From: Elenterius Date: Mon, 14 Oct 2024 04:14:33 +0200 Subject: [PATCH] feat: make input slots of Bio-Lab lockable --- .../block/bioforge/BioForgeBlockEntity.java | 4 +- .../block/biolab/BioLabBlockEntity.java | 24 ++--- .../block/biolab/BioLabStateData.java | 32 ++++++- .../decomposer/DecomposerBlockEntity.java | 12 +-- .../block/digester/DigesterBlockEntity.java | 12 +-- .../FleshkinChestBlockEntity.java | 4 +- .../storagesac/StorageSacBlockEntity.java | 4 +- .../biomancy/client/gui/BioLabScreen.java | 18 ++++ .../biomancy/init/ModCapabilities.java | 2 + .../inventory/BehavioralItemHandler.java | 86 +++++++++++++++++- .../biomancy/inventory/InventoryHandler.java | 8 +- .../biomancy/inventory/InventoryHandlers.java | 77 ++++++++++++---- .../biomancy/menu/BioForgeMenu.java | 13 +-- .../elenterius/biomancy/menu/BioLabMenu.java | 15 +++ .../biomancy/util/ItemStackFilter.java | 31 +++++-- .../biomancy/util/ItemStackFilterList.java | 22 +---- .../biomancy/textures/gui/menu_bio_lab.png | Bin 30629 -> 25978 bytes 17 files changed, 275 insertions(+), 89 deletions(-) diff --git a/src/main/java/com/github/elenterius/biomancy/block/bioforge/BioForgeBlockEntity.java b/src/main/java/com/github/elenterius/biomancy/block/bioforge/BioForgeBlockEntity.java index c254e25b0..16c1d4d1b 100644 --- a/src/main/java/com/github/elenterius/biomancy/block/bioforge/BioForgeBlockEntity.java +++ b/src/main/java/com/github/elenterius/biomancy/block/bioforge/BioForgeBlockEntity.java @@ -55,7 +55,7 @@ public class BioForgeBlockEntity extends BlockEntity implements MenuProvider, Pl private final BioForgeStateData stateData; private final FuelHandler fuelHandler; - private final InventoryHandler fuelInventory; + private final InventoryHandler fuelInventory; private final ContainerOpenersCounter openersCounter = new ContainerOpenersCounter() { @@ -150,7 +150,7 @@ public AbstractContainerMenu createMenu(int containerId, Inventory playerInvento return BioForgeMenu.createServerMenu(containerId, playerInventory, this); } - public InventoryHandler getFuelInventory() { + public InventoryHandler getFuelInventory() { return fuelInventory; } diff --git a/src/main/java/com/github/elenterius/biomancy/block/biolab/BioLabBlockEntity.java b/src/main/java/com/github/elenterius/biomancy/block/biolab/BioLabBlockEntity.java index 6d2a28d51..b542ded9c 100644 --- a/src/main/java/com/github/elenterius/biomancy/block/biolab/BioLabBlockEntity.java +++ b/src/main/java/com/github/elenterius/biomancy/block/biolab/BioLabBlockEntity.java @@ -10,14 +10,13 @@ import com.github.elenterius.biomancy.init.ModCapabilities; import com.github.elenterius.biomancy.init.ModRecipes; import com.github.elenterius.biomancy.init.ModSoundEvents; +import com.github.elenterius.biomancy.inventory.BehavioralItemHandler; import com.github.elenterius.biomancy.inventory.InventoryHandler; import com.github.elenterius.biomancy.inventory.InventoryHandlers; import com.github.elenterius.biomancy.inventory.ItemHandlerUtil; import com.github.elenterius.biomancy.menu.BioLabMenu; import com.github.elenterius.biomancy.styles.TextComponentUtil; import com.github.elenterius.biomancy.util.ILoopingSoundHelper; -import com.github.elenterius.biomancy.util.ItemStackFilter; -import com.github.elenterius.biomancy.util.ItemStackFilterList; import com.github.elenterius.biomancy.util.SoundUtil; import com.github.elenterius.biomancy.util.fuel.FluidFuelConsumerHandler; import com.github.elenterius.biomancy.util.fuel.FuelHandler; @@ -69,12 +68,11 @@ public class BioLabBlockEntity extends MachineBlockEntity fuelInventory; - private final InventoryHandler inputInventory; - private final ItemStackFilterList inputSlotsFilter; + private final InventoryHandler inputInventory; - private final InventoryHandler outputInventory; + private final InventoryHandler outputInventory; private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); private ILoopingSoundHelper loopingSoundHelper = ILoopingSoundHelper.NULL; @@ -85,8 +83,7 @@ public class BioLabBlockEntity extends MachineBlockEntity new FluidFuelConsumerHandler(fuelHandler)); + + stateData = new BioLabStateData(fuelHandler, inputInventory.get()); } private LazyOptional createCombinedInventory() { @@ -135,15 +133,15 @@ public BioLabStateData getStateData() { } @Override - public InventoryHandler getInputInventory() { + public InventoryHandler getInputInventory() { return inputInventory; } - public InventoryHandler getFuelInventory() { + public InventoryHandler getFuelInventory() { return fuelInventory; } - public InventoryHandler getOutputInventory() { + public InventoryHandler getOutputInventory() { return outputInventory; } @@ -185,7 +183,6 @@ protected void saveAdditional(CompoundTag tag) { tag.put("Fuel", fuelHandler.serializeNBT()); tag.put("FuelSlots", fuelInventory.serializeNBT()); tag.put("InputSlots", inputInventory.serializeNBT()); - tag.put("InputSlotsFilter", inputSlotsFilter.serializeNBT()); tag.put("OutputSlots", outputInventory.serializeNBT()); } @@ -196,7 +193,6 @@ public void load(CompoundTag tag) { fuelHandler.deserializeNBT(tag.getCompound("Fuel")); fuelInventory.deserializeNBT(tag.getCompound("FuelSlots")); inputInventory.deserializeNBT(tag.getCompound("InputSlots")); - inputSlotsFilter.deserializeNBT(tag.getCompound("InputSlotsFilter")); outputInventory.deserializeNBT(tag.getCompound("OutputSlots")); } diff --git a/src/main/java/com/github/elenterius/biomancy/block/biolab/BioLabStateData.java b/src/main/java/com/github/elenterius/biomancy/block/biolab/BioLabStateData.java index 0833a1e6f..a12aacd09 100644 --- a/src/main/java/com/github/elenterius/biomancy/block/biolab/BioLabStateData.java +++ b/src/main/java/com/github/elenterius/biomancy/block/biolab/BioLabStateData.java @@ -2,13 +2,19 @@ import com.github.elenterius.biomancy.crafting.recipe.BioLabRecipe; import com.github.elenterius.biomancy.crafting.state.FuelConsumingRecipeCraftingStateData; +import com.github.elenterius.biomancy.inventory.BehavioralItemHandler; import com.github.elenterius.biomancy.util.fuel.IFuelHandler; import net.minecraft.world.item.crafting.Recipe; public class BioLabStateData extends FuelConsumingRecipeCraftingStateData { - public BioLabStateData(IFuelHandler fuelHandler) { + public static final int LOCK_INDEX = 4; + + private final BehavioralItemHandler.LockableItemStackFilterInput inputFilterLock; + + public BioLabStateData(IFuelHandler fuelHandler, BehavioralItemHandler.LockableItemStackFilterInput inputFilterLock) { super(fuelHandler); + this.inputFilterLock = inputFilterLock; } @Override @@ -16,4 +22,28 @@ protected boolean isRecipeOfInstance(Recipe recipe) { return recipe instanceof BioLabRecipe; } + public boolean isFilterLocked() { + return inputFilterLock.isLocked(); + } + + @Override + public int get(int index) { + if (index == LOCK_INDEX) return inputFilterLock.isLocked() ? 1 : 0; + return super.get(index); + } + + @Override + public void set(int index, int value) { + if (index == LOCK_INDEX) { + inputFilterLock.setLocked(value != 0); + return; + } + super.set(index, value); + } + + @Override + public int getCount() { + return 5; + } + } diff --git a/src/main/java/com/github/elenterius/biomancy/block/decomposer/DecomposerBlockEntity.java b/src/main/java/com/github/elenterius/biomancy/block/decomposer/DecomposerBlockEntity.java index 43a42c8a1..b601afe60 100644 --- a/src/main/java/com/github/elenterius/biomancy/block/decomposer/DecomposerBlockEntity.java +++ b/src/main/java/com/github/elenterius/biomancy/block/decomposer/DecomposerBlockEntity.java @@ -71,9 +71,9 @@ public class DecomposerBlockEntity extends MachineBlockEntity fuelInventory; + private final InventoryHandler inputInventory; + private final InventoryHandler outputInventory; private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); private ILoopingSoundHelper loopingSoundHelper = ILoopingSoundHelper.NULL; @@ -123,15 +123,15 @@ public DecomposerStateData getStateData() { } @Override - public InventoryHandler getInputInventory() { + public InventoryHandler getInputInventory() { return inputInventory; } - public InventoryHandler getFuelInventory() { + public InventoryHandler getFuelInventory() { return fuelInventory; } - public InventoryHandler getOutputInventory() { + public InventoryHandler getOutputInventory() { return outputInventory; } diff --git a/src/main/java/com/github/elenterius/biomancy/block/digester/DigesterBlockEntity.java b/src/main/java/com/github/elenterius/biomancy/block/digester/DigesterBlockEntity.java index e78b96b6f..9ad400082 100644 --- a/src/main/java/com/github/elenterius/biomancy/block/digester/DigesterBlockEntity.java +++ b/src/main/java/com/github/elenterius/biomancy/block/digester/DigesterBlockEntity.java @@ -65,9 +65,9 @@ public class DigesterBlockEntity extends MachineBlockEntity fuelInventory; + private final InventoryHandler inputInventory; + private final InventoryHandler outputInventory; private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); private ILoopingSoundHelper loopingSoundHelper = ILoopingSoundHelper.NULL; @@ -116,15 +116,15 @@ public DigesterStateData getStateData() { } @Override - public InventoryHandler getInputInventory() { + public InventoryHandler getInputInventory() { return inputInventory; } - public InventoryHandler getFuelInventory() { + public InventoryHandler getFuelInventory() { return fuelInventory; } - public InventoryHandler getOutputInventory() { + public InventoryHandler getOutputInventory() { return outputInventory; } diff --git a/src/main/java/com/github/elenterius/biomancy/block/fleshkinchest/FleshkinChestBlockEntity.java b/src/main/java/com/github/elenterius/biomancy/block/fleshkinchest/FleshkinChestBlockEntity.java index 2ae504d04..1e8e30cfe 100644 --- a/src/main/java/com/github/elenterius/biomancy/block/fleshkinchest/FleshkinChestBlockEntity.java +++ b/src/main/java/com/github/elenterius/biomancy/block/fleshkinchest/FleshkinChestBlockEntity.java @@ -47,7 +47,7 @@ public class FleshkinChestBlockEntity extends OwnableContainerBlockEntity implem public static final int SLOTS = 6 * 7; - private final InventoryHandler inventory; + private final InventoryHandler inventory; private final AnimatableInstanceCache cache = GeckoLibUtil.createInstanceCache(this); @@ -149,7 +149,7 @@ public AbstractContainerMenu createMenu(int containerId, Inventory playerInvento return FleshkinChestMenu.createServerMenu(containerId, playerInventory, this); } - public InventoryHandler getInventory() { + public InventoryHandler getInventory() { return inventory; } diff --git a/src/main/java/com/github/elenterius/biomancy/block/storagesac/StorageSacBlockEntity.java b/src/main/java/com/github/elenterius/biomancy/block/storagesac/StorageSacBlockEntity.java index 3ed424c93..034635677 100644 --- a/src/main/java/com/github/elenterius/biomancy/block/storagesac/StorageSacBlockEntity.java +++ b/src/main/java/com/github/elenterius/biomancy/block/storagesac/StorageSacBlockEntity.java @@ -38,7 +38,7 @@ public class StorageSacBlockEntity extends SimpleContainerBlockEntity implements public static final int SLOTS = 3 * 5; public static final String TOP5_BY_COUNT_KEY = "Top5ByCount"; public static final String INVENTORY_KEY = "Inventory"; - private final InventoryHandler inventory; + private final InventoryHandler inventory; protected final ItemStackCounter itemCounter = new ItemStackCounter(); private List top5ItemsByCount = List.of(); @@ -54,7 +54,7 @@ public AbstractContainerMenu createMenu(int containerId, Inventory playerInvento return StorageSacMenu.createServerMenu(containerId, playerInventory, this); } - public InventoryHandler getInventory() { + public InventoryHandler getInventory() { return inventory; } diff --git a/src/main/java/com/github/elenterius/biomancy/client/gui/BioLabScreen.java b/src/main/java/com/github/elenterius/biomancy/client/gui/BioLabScreen.java index c14672649..34f78555e 100644 --- a/src/main/java/com/github/elenterius/biomancy/client/gui/BioLabScreen.java +++ b/src/main/java/com/github/elenterius/biomancy/client/gui/BioLabScreen.java @@ -26,6 +26,18 @@ protected void init() { super.init(); } + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + int x = leftPos + 130; + int y = topPos + 34; + if (GuiUtil.isInRect(x, y, 8, 10, mouseX, mouseY)) { + minecraft.gameMode.handleInventoryButtonClick(menu.containerId, 0); + return true; + } + + return super.mouseClicked(mouseX, mouseY, button); + } + @Override protected void renderLabels(GuiGraphics guiGraphics, int mouseX, int mouseY) { //don't draw any labels @@ -43,6 +55,7 @@ protected void renderBg(GuiGraphics guiGraphics, float partialTick, int mouseX, guiGraphics.blit(BACKGROUND_TEXTURE, leftPos, topPos, 0, 0, imageWidth, imageHeight); drawProgressBar(guiGraphics, menu.getCraftingProgressNormalized()); drawFuelBar(guiGraphics, menu.getFuelAmountNormalized()); + drawLock(guiGraphics, menu.isFilterLocked()); } private void drawProgressBar(GuiGraphics guiGraphics, float craftingPct) { @@ -55,6 +68,11 @@ private void drawFuelBar(GuiGraphics guiGraphics, float fuelPct) { guiGraphics.blit(BACKGROUND_TEXTURE, leftPos + 36, topPos + 48 + 36 - vHeight, 178, 58 - vHeight, 5, vHeight); } + private void drawLock(GuiGraphics guiGraphics, boolean isLocked) { + int offset = isLocked ? 0 : 8; + guiGraphics.blit(BACKGROUND_TEXTURE, leftPos + 130, topPos + 34, 178 + offset, 58 + 2, 8, 10); + } + @Override protected void renderTooltip(GuiGraphics guiGraphics, int mouseX, int mouseY) { if (menu.getCarried().isEmpty()) { diff --git a/src/main/java/com/github/elenterius/biomancy/init/ModCapabilities.java b/src/main/java/com/github/elenterius/biomancy/init/ModCapabilities.java index 61b16b145..06019f016 100644 --- a/src/main/java/com/github/elenterius/biomancy/init/ModCapabilities.java +++ b/src/main/java/com/github/elenterius/biomancy/init/ModCapabilities.java @@ -18,7 +18,9 @@ @Mod.EventBusSubscriber(modid = BiomancyMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) public final class ModCapabilities { + @Deprecated public static final Capability NO_KNOCKBACK_FLAG_CAP = CapabilityManager.get(new CapabilityToken<>() {}); + public static final Capability ITEM_HANDLER = ForgeCapabilities.ITEM_HANDLER; public static final Capability FLUID_HANDLER = ForgeCapabilities.FLUID_HANDLER; diff --git a/src/main/java/com/github/elenterius/biomancy/inventory/BehavioralItemHandler.java b/src/main/java/com/github/elenterius/biomancy/inventory/BehavioralItemHandler.java index 454f2643e..daf3742f0 100644 --- a/src/main/java/com/github/elenterius/biomancy/inventory/BehavioralItemHandler.java +++ b/src/main/java/com/github/elenterius/biomancy/inventory/BehavioralItemHandler.java @@ -1,6 +1,9 @@ package com.github.elenterius.biomancy.inventory; +import com.github.elenterius.biomancy.util.ItemStackFilter; +import com.github.elenterius.biomancy.util.ItemStackFilterList; import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandler; import org.jetbrains.annotations.NotNull; @@ -100,11 +103,11 @@ public void setStackInSlot(int slot, @NotNull ItemStack stack) { /** * only allows item insertion of matching items */ - class FilterInput> extends Wrapper implements SerializableItemHandler { + class PredicateFilterInput extends Wrapper implements SerializableItemHandler { - private final List filters; + protected final List> filters; - public FilterInput(SerializableItemHandler itemHandler, List slotFilters) { + public PredicateFilterInput(SerializableItemHandler itemHandler, List> slotFilters) { super(itemHandler); assert slotFilters.size() == itemHandler.getSlots(); filters = slotFilters; @@ -144,4 +147,81 @@ public void setStackInSlot(int slot, @NotNull ItemStack stack) { } } + class ItemStackFilterInput extends Wrapper implements SerializableItemHandler { + + protected final ItemStackFilterList filters; + + public ItemStackFilterInput(SerializableItemHandler itemHandler) { + super(itemHandler); + filters = ItemStackFilterList.of(ItemStackFilter.ALLOW_ANY, itemHandler.getSlots()); + } + + private boolean isInvalidSlot(int slot) { + return slot < 0 || slot >= filters.size(); + } + + @Override + public boolean isItemValid(int slot, @Nonnull ItemStack stack) { + if (isInvalidSlot(slot)) return false; + return filters.get(slot).test(stack) && itemHandler.isItemValid(slot, stack); + } + + @Override + @Nonnull + public ItemStack insertItem(int slot, @Nonnull ItemStack stack, boolean simulate) { + if (isInvalidSlot(slot)) return stack; + if (!filters.get(slot).test(stack)) return stack; + return itemHandler.insertItem(slot, stack, simulate); + } + + @Override + public CompoundTag serializeNBT() { + CompoundTag tag = new CompoundTag(); + tag.put("Handler", itemHandler.serializeNBT()); + tag.put("Filters", filters.serializeNBT()); + return tag; + } + + @Override + public void deserializeNBT(CompoundTag tag) { + itemHandler.deserializeNBT(tag.getCompound("Handler")); + filters.deserializeNBT(tag.getList("Filters", Tag.TAG_COMPOUND)); + } + + @Override + public void setStackInSlot(int slot, @NotNull ItemStack stack) { + itemHandler.setStackInSlot(slot, stack); + } + } + + class LockableItemStackFilterInput extends ItemStackFilterInput { + + private boolean locked = false; + + public LockableItemStackFilterInput(SerializableItemHandler itemHandler) { + super(itemHandler); + } + + public void toggleLock() { + setLocked(!locked); + } + + public boolean isLocked() { + return locked; + } + + public void setLocked(boolean locked) { + this.locked = locked; + + if (locked) { + for (int i = 0; i < itemHandler.getSlots(); i++) { + ItemStack stack = itemHandler.getStackInSlot(i); + filters.set(i, ItemStackFilter.of(stack)); + } + } + else { + filters.setAllFilters(ItemStackFilter.ALLOW_ANY); + } + } + } } diff --git a/src/main/java/com/github/elenterius/biomancy/inventory/InventoryHandler.java b/src/main/java/com/github/elenterius/biomancy/inventory/InventoryHandler.java index a3e0477f4..c9ab28cae 100644 --- a/src/main/java/com/github/elenterius/biomancy/inventory/InventoryHandler.java +++ b/src/main/java/com/github/elenterius/biomancy/inventory/InventoryHandler.java @@ -7,14 +7,14 @@ import net.minecraftforge.items.wrapper.RecipeWrapper; import org.jetbrains.annotations.NotNull; -public final class InventoryHandler implements SerializableItemHandler { +public final class InventoryHandler implements SerializableItemHandler { - private final SerializableItemHandler itemHandler; + private final T itemHandler; private LazyOptional optionalItemHandler; private final RecipeWrapper recipeWrapper; - public InventoryHandler(SerializableItemHandler itemHandler) { + public InventoryHandler(T itemHandler) { this.itemHandler = itemHandler; recipeWrapper = new RecipeWrapper(itemHandler); optionalItemHandler = LazyOptional.of(() -> itemHandler); @@ -37,7 +37,7 @@ public void deserializeNBT(CompoundTag nbt) { itemHandler.deserializeNBT(nbt); } - public SerializableItemHandler get() { + public T get() { return itemHandler; } diff --git a/src/main/java/com/github/elenterius/biomancy/inventory/InventoryHandlers.java b/src/main/java/com/github/elenterius/biomancy/inventory/InventoryHandlers.java index 22d079eab..c144d4750 100644 --- a/src/main/java/com/github/elenterius/biomancy/inventory/InventoryHandlers.java +++ b/src/main/java/com/github/elenterius/biomancy/inventory/InventoryHandlers.java @@ -51,51 +51,51 @@ private InventoryHandlers() {} /** * default item handler behavior */ - public static InventoryHandler standard(int slotAmount) { - return new InventoryHandler(new FixedSizeItemStackHandler(slotAmount)); + public static InventoryHandler standard(int slotAmount) { + return new InventoryHandler<>(new FixedSizeItemStackHandler(slotAmount)); } - public static InventoryHandler standard(int slotAmount, Notify onInventoryChanged) { + public static InventoryHandler standard(int slotAmount, Notify onInventoryChanged) { FixedSizeItemStackHandler handler = new FixedSizeItemStackHandler(slotAmount) { @Override protected void onContentsChanged(int slot) { onInventoryChanged.invoke(); } }; - return new InventoryHandler(handler); + return new InventoryHandler<>(handler); } /** * prevents item insertion, only item extraction is possible (e.g. output inventories) */ - public static InventoryHandler denyInput(T itemStackHandler) { - return new InventoryHandler(new BehavioralItemHandler.DenyInput(itemStackHandler)); + public static InventoryHandler denyInput(T itemStackHandler) { + return new InventoryHandler<>(new BehavioralItemHandler.DenyInput(itemStackHandler)); } /** * prevents item insertion, only item extraction is possible (e.g. output inventories) */ - public static InventoryHandler denyInput(int slotAmount, Notify onInventoryChanged) { + public static InventoryHandler denyInput(int slotAmount, Notify onInventoryChanged) { FixedSizeItemStackHandler handler = new FixedSizeItemStackHandler(slotAmount) { @Override protected void onContentsChanged(int slot) { onInventoryChanged.invoke(); } }; - return new InventoryHandler(new BehavioralItemHandler.DenyInput(handler)); + return new InventoryHandler<>(new BehavioralItemHandler.DenyInput(handler)); } /** * only allows item insertion of valid items */ - public static > InventoryHandler filterInput(int slotAmount, List slotFilters) { + public static InventoryHandler filterInput(int slotAmount, List> slotFilters) { return filterInput(new FixedSizeItemStackHandler(slotAmount), slotFilters); } /** * only allows item insertion of valid items */ - public static > InventoryHandler filterInput(int slotAmount, List slotFilters, Notify onInventoryChanged) { + public static InventoryHandler filterInput(int slotAmount, List> slotFilters, Notify onInventoryChanged) { FixedSizeItemStackHandler handler = new FixedSizeItemStackHandler(slotAmount) { @Override protected void onContentsChanged(int slot) { @@ -108,23 +108,64 @@ protected void onContentsChanged(int slot) { /** * only allows item insertion of valid items */ - public static > InventoryHandler filterInput(T itemStackHandler, List slotFilters) { - return new InventoryHandler(new BehavioralItemHandler.FilterInput<>(itemStackHandler, slotFilters)); + public static InventoryHandler filterInput(T itemStackHandler, List> slotFilters) { + return new InventoryHandler<>(new BehavioralItemHandler.PredicateFilterInput(itemStackHandler, slotFilters)); + } + + /** + * only allows item insertion of valid items + */ + public static InventoryHandler filterInput(int slotAmount) { + return filterInput(new FixedSizeItemStackHandler(slotAmount)); + } + + /** + * only allows item insertion of valid items + */ + public static InventoryHandler filterInput(int slotAmount, Notify onInventoryChanged) { + FixedSizeItemStackHandler handler = new FixedSizeItemStackHandler(slotAmount) { + @Override + protected void onContentsChanged(int slot) { + onInventoryChanged.invoke(); + } + }; + return filterInput(handler); + } + + /** + * only allows item insertion of valid items + */ + public static InventoryHandler filterInput(T itemStackHandler) { + return new InventoryHandler<>(new BehavioralItemHandler.ItemStackFilterInput(itemStackHandler)); + } + + public static InventoryHandler lockableFilterInput(int slotAmount, Notify onInventoryChanged) { + FixedSizeItemStackHandler handler = new FixedSizeItemStackHandler(slotAmount) { + @Override + protected void onContentsChanged(int slot) { + onInventoryChanged.invoke(); + } + }; + return lockableFilterInput(handler); + } + + public static InventoryHandler lockableFilterInput(T itemStackHandler) { + return new InventoryHandler<>(new BehavioralItemHandler.LockableItemStackFilterInput(itemStackHandler)); } /** * prevents nesting of items with inventories,
* i.e. insertion of filled shulker boxes and items with filled inventories (item handler capability) */ - public static InventoryHandler denyItemWithFilledInventory(T itemHandler) { - return new InventoryHandler(new BehavioralItemHandler.FilterInput<>(itemHandler, IntStream.range(0, itemHandler.getSlots()).mapToObj(x -> EMPTY_ITEM_INVENTORY_PREDICATE).toList())); + public static InventoryHandler denyItemWithFilledInventory(T itemHandler) { + return new InventoryHandler<>(new BehavioralItemHandler.PredicateFilterInput(itemHandler, IntStream.range(0, itemHandler.getSlots()).mapToObj(x -> EMPTY_ITEM_INVENTORY_PREDICATE).toList())); } /** * prevents nesting of items with inventories,
* i.e. insertion of filled shulker boxes and items with filled inventories (item handler capability) */ - public static InventoryHandler denyItemWithFilledInventory(int slotAmount, Notify onInventoryChanged) { + public static InventoryHandler denyItemWithFilledInventory(int slotAmount, Notify onInventoryChanged) { FixedSizeItemStackHandler handler = new FixedSizeItemStackHandler(slotAmount) { @Override protected void onContentsChanged(int slot) { @@ -137,14 +178,14 @@ protected void onContentsChanged(int slot) { /** * only allows the insertion of items that are biofuel (solid & fluid container) */ - public static InventoryHandler filterFuel(int slotAmount) { + public static InventoryHandler filterFuel(int slotAmount) { return filterFuel(new FixedSizeItemStackHandler(slotAmount)); } /** * only allows the insertion of items that are biofuel (solid & fluid container) */ - public static InventoryHandler filterFuel(int slotAmount, Notify onInventoryChanged) { + public static InventoryHandler filterFuel(int slotAmount, Notify onInventoryChanged) { FixedSizeItemStackHandler handler = new FixedSizeItemStackHandler(slotAmount) { @Override protected void onContentsChanged(int slot) { @@ -157,7 +198,7 @@ protected void onContentsChanged(int slot) { /** * only allows the insertion of items that are biofuel (solid & fluid container) */ - public static InventoryHandler filterFuel(T itemHandler) { + public static InventoryHandler filterFuel(T itemHandler) { return filterInput(itemHandler, IntStream.range(0, itemHandler.getSlots()).mapToObj(x -> Nutrients.FUEL_PREDICATE).toList()); } diff --git a/src/main/java/com/github/elenterius/biomancy/menu/BioForgeMenu.java b/src/main/java/com/github/elenterius/biomancy/menu/BioForgeMenu.java index d56d9fa15..5d7f2d2a8 100644 --- a/src/main/java/com/github/elenterius/biomancy/menu/BioForgeMenu.java +++ b/src/main/java/com/github/elenterius/biomancy/menu/BioForgeMenu.java @@ -280,7 +280,12 @@ public void onTake(Player player, ItemStack stack) { } BioForgeRecipe recipe = getSelectedRecipe(); - if (recipe != null) consumeCraftingIngredients(player, recipe); + if (recipe != null) { + consumeCraftingIngredients(player.getInventory(), recipe); + broadcastChanges(); + } + + setChanged(); checkTakeAchievements(stack); onPlayerMainInventoryChanged(player.getInventory()); //ensures the recipe output slot is filled again if possible, integral for quick crafting to work @@ -291,8 +296,6 @@ public void onTake(Player player, ItemStack stack) { prevSoundTime = time; } } - - setChanged(); } } @@ -301,7 +304,7 @@ private boolean canCraft(@Nullable BioForgeRecipe recipe) { return recipe != null && getFuelAmount() >= recipe.getCraftingCostNutrients() && recipe.isCraftable(itemCounter); } - private void consumeCraftingIngredients(Player player, BioForgeRecipe recipe) { + private void consumeCraftingIngredients(Inventory inventory, BioForgeRecipe recipe) { List ingredients = recipe.getIngredientQuantities(); int[] ingredientCost = new int[ingredients.size()]; @@ -309,8 +312,6 @@ private void consumeCraftingIngredients(Player player, BioForgeRecipe recipe) { ingredientCost[i] = ingredients.get(i).count(); } - Inventory inventory = player.getInventory(); - //consume ingredients for (int idx = 0; idx < inventory.items.size(); idx++) { ItemStack foundStack = inventory.items.get(idx); diff --git a/src/main/java/com/github/elenterius/biomancy/menu/BioLabMenu.java b/src/main/java/com/github/elenterius/biomancy/menu/BioLabMenu.java index 0543d3e82..1329c9d1b 100644 --- a/src/main/java/com/github/elenterius/biomancy/menu/BioLabMenu.java +++ b/src/main/java/com/github/elenterius/biomancy/menu/BioLabMenu.java @@ -57,6 +57,17 @@ public static BioLabMenu createClientMenu(int containerId, Inventory playerInven return new BioLabMenu(containerId, playerInventory, blockEntity instanceof BioLabBlockEntity bioLab ? bioLab : null); } + @Override + public boolean clickMenuButton(Player player, int id) { + + if (id == 0 && !level.isClientSide) { + bioLab.getInputInventory().get().toggleLock(); + return true; + } + + return false; + } + @Override public boolean stillValid(Player player) { return bioLab != null && bioLab.canPlayerInteract(player); @@ -83,6 +94,10 @@ public int getMaxFuelAmount() { return bioLab.getStateData().fuelHandler.getMaxFuelAmount(); } + public boolean isFilterLocked() { + return bioLab.getStateData().isFilterLocked(); + } + @Override public ItemStack quickMoveStack(Player player, int index) { Slot slot = slots.get(index); diff --git a/src/main/java/com/github/elenterius/biomancy/util/ItemStackFilter.java b/src/main/java/com/github/elenterius/biomancy/util/ItemStackFilter.java index 051f9c1d1..35e2f6462 100644 --- a/src/main/java/com/github/elenterius/biomancy/util/ItemStackFilter.java +++ b/src/main/java/com/github/elenterius/biomancy/util/ItemStackFilter.java @@ -5,20 +5,23 @@ import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.items.ItemHandlerHelper; +import org.jetbrains.annotations.Nullable; import java.util.function.Predicate; public class ItemStackFilter implements Predicate, INBTSerializable { - public static final String FILTER_KEY = "filter"; - public static final String STRICT_KEY = "strict"; + public static final String FILTER_KEY = "Filter"; + public static final String STRICT_KEY = "Strict"; - public static final ItemStackFilter ALLOW_ALL = of(ItemStack.EMPTY, false); + public static final ItemStackFilter ALLOW_ANY = new ItemStackFilter(null, false); + public static final ItemStackFilter ALLOW_NONE = new ItemStackFilter(ItemStack.EMPTY, false); + @Nullable private ItemStack filter; private boolean isStrict; - protected ItemStackFilter(ItemStack filter, boolean isStrict) { + protected ItemStackFilter(@Nullable ItemStack filter, boolean isStrict) { this.filter = filter; this.isStrict = isStrict; } @@ -40,6 +43,10 @@ public static ItemStackFilter of(ItemStack filter) { } public static ItemStackFilter of(ItemStack filter, boolean isStrict) { + if (filter.isEmpty()) return ALLOW_NONE; + + filter = filter.copyWithCount(1); + if (filter.hasTag()) { CompoundTag stackTag = filter.getTag(); assert stackTag != null; @@ -52,7 +59,9 @@ public static ItemStackFilter of(ItemStack filter, boolean isStrict) { @Override public boolean test(ItemStack stack) { if (stack.isEmpty()) return false; - if (filter.isEmpty()) return true; + + if (filter == null) return true; + if (filter.isEmpty()) return false; if (isStrict) { return ItemHandlerHelper.canItemStacksStack(filter, stack); @@ -65,15 +74,21 @@ public boolean test(ItemStack stack) { @Override public CompoundTag serializeNBT() { CompoundTag tag = new CompoundTag(); - tag.put(FILTER_KEY, filter.serializeNBT()); - tag.putBoolean(STRICT_KEY, isStrict); + if (filter != null) { + tag.put(FILTER_KEY, filter.serializeNBT()); + tag.putBoolean(STRICT_KEY, isStrict); + } return tag; } @Override public void deserializeNBT(CompoundTag tag) { - filter = ItemStack.of(tag.getCompound(FILTER_KEY)); + filter = tag.contains(FILTER_KEY) ? ItemStack.of(tag.getCompound(FILTER_KEY)) : null; isStrict = tag.getBoolean(STRICT_KEY); } + public boolean allowsAny() { + return filter == null; + } + } diff --git a/src/main/java/com/github/elenterius/biomancy/util/ItemStackFilterList.java b/src/main/java/com/github/elenterius/biomancy/util/ItemStackFilterList.java index b38b19767..9442c318a 100644 --- a/src/main/java/com/github/elenterius/biomancy/util/ItemStackFilterList.java +++ b/src/main/java/com/github/elenterius/biomancy/util/ItemStackFilterList.java @@ -1,8 +1,6 @@ package com.github.elenterius.biomancy.util; -import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; -import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; import net.minecraftforge.common.util.INBTSerializable; @@ -11,7 +9,7 @@ import java.util.List; import java.util.stream.IntStream; -public class ItemStackFilterList extends AbstractList implements INBTSerializable { +public class ItemStackFilterList extends AbstractList implements INBTSerializable { private List filters; @@ -31,12 +29,8 @@ public static ItemStackFilterList of(List filters) { return new ItemStackFilterList(filters); } - public void setAllFilters(List filters) { - this.filters = filters; - } - public void setAllFilters(ItemStackFilter filter) { - filters = IntStream.range(0, filters.size()).mapToObj(x -> filter).toList(); + filters.replaceAll(ignored -> filter); } public void setFilter(int index, ItemStackFilter filter) { @@ -64,9 +58,7 @@ public boolean test(int index, ItemStack stack) { } @Override - public void deserializeNBT(CompoundTag tag) { - ListTag listTag = tag.getList("filters", Tag.TAG_COMPOUND); - + public void deserializeNBT(ListTag listTag) { List newFilters = new ArrayList<>(); for (int i = 0; i < listTag.size(); i++) { newFilters.add(ItemStackFilter.of(listTag.getCompound(i))); @@ -76,17 +68,13 @@ public void deserializeNBT(CompoundTag tag) { } @Override - public CompoundTag serializeNBT() { - + public ListTag serializeNBT() { ListTag listTag = new ListTag(); for (ItemStackFilter filter : filters) { listTag.add(filter.serializeNBT()); } - CompoundTag tag = new CompoundTag(); - tag.put("filters", listTag); - - return tag; + return listTag; } } diff --git a/src/main/resources/assets/biomancy/textures/gui/menu_bio_lab.png b/src/main/resources/assets/biomancy/textures/gui/menu_bio_lab.png index 2f8f297c02620f03f65daa728ea465e7ea673b73..c964a54f804a815ecd68f7596b27caf8f2226ff3 100644 GIT binary patch literal 25978 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 literal 30629 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�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 JfQT9S{}1@(nNR=#