From 07ce2fd1ea255752de0af425c3ef1542fa127428 Mon Sep 17 00:00:00 2001 From: lc-1337 <62835225+lc-1337@users.noreply.github.com> Date: Wed, 6 May 2026 18:27:23 +0300 Subject: [PATCH] Allow decode drops into fluid (#430) --- .../ContainerFluidPacketDecoder.java | 12 +++- .../common/tile/TileFluidPacketDecoder.java | 70 +++++++++---------- .../inventory/slot/FCSlotRestrictedInput.java | 24 +++++-- .../resources/assets/ae2fc/lang/en_US.lang | 4 +- 4 files changed, 68 insertions(+), 42 deletions(-) diff --git a/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidPacketDecoder.java b/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidPacketDecoder.java index 884b1b9e..495b6756 100644 --- a/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidPacketDecoder.java +++ b/src/main/java/com/glodblock/github/client/gui/container/ContainerFluidPacketDecoder.java @@ -1,7 +1,10 @@ package com.glodblock.github.client.gui.container; +import static com.glodblock.github.loader.ItemAndBlockHolder.DROP; import static com.glodblock.github.loader.ItemAndBlockHolder.PACKET; +import java.util.Arrays; + import net.minecraft.entity.player.InventoryPlayer; import com.glodblock.github.common.tile.TileFluidPacketDecoder; @@ -13,7 +16,14 @@ public class ContainerFluidPacketDecoder extends AEBaseContainer { public ContainerFluidPacketDecoder(InventoryPlayer ipl, TileFluidPacketDecoder tile) { super(ipl, tile); - addSlotToContainer(new FCSlotRestrictedInput(PACKET.stack(), tile.getInventory(), 0, 80, 35, ipl)); + addSlotToContainer( + new FCSlotRestrictedInput( + Arrays.asList(PACKET.stack(), DROP.stack()), + tile.getInventory(), + 0, + 80, + 35, + ipl)); bindPlayerInventory(ipl, 0, 84); } } diff --git a/src/main/java/com/glodblock/github/common/tile/TileFluidPacketDecoder.java b/src/main/java/com/glodblock/github/common/tile/TileFluidPacketDecoder.java index 8020ff52..4c755cd3 100644 --- a/src/main/java/com/glodblock/github/common/tile/TileFluidPacketDecoder.java +++ b/src/main/java/com/glodblock/github/common/tile/TileFluidPacketDecoder.java @@ -2,6 +2,7 @@ package com.glodblock.github.common.tile; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.IInventory; +import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; @@ -10,6 +11,7 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; +import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.common.item.ItemFluidPacket; import appeng.api.networking.GridFlags; @@ -60,13 +62,22 @@ public class TileFluidPacketDecoder extends AENetworkTile return new TickingRequest(5, 120, false, true); } + private FluidStack getFluidStack() { + final ItemStack stack = inventory.getStackInSlot(0); + if (stack == null) return null; + + if (stack.getItem() instanceof ItemFluidPacket) { + return ItemFluidPacket.getFluidStack(stack); + } else if (stack.getItem() instanceof ItemFluidDrop) { + return ItemFluidDrop.getFluidStack(stack); + } + + return null; + } + @Override public TickRateModulation tickingRequest(IGridNode node, int ticksSinceLastCall) { - ItemStack stack = inventory.getStackInSlot(0); - if (stack == null || !(stack.getItem() instanceof ItemFluidPacket)) { - return TickRateModulation.SLEEP; - } - FluidStack fluid = ItemFluidPacket.getFluidStack(stack); + final FluidStack fluid = getFluidStack(); if (fluid == null || fluid.amount <= 0) { inventory.setInventorySlotContents(0, null); return TickRateModulation.SLEEP; @@ -167,7 +178,8 @@ public class TileFluidPacketDecoder extends AENetworkTile @Override public boolean isItemValidForSlot(int slot, ItemStack stack) { - return stack.getItem() instanceof ItemFluidPacket; + final Item item = stack.getItem(); + return item instanceof ItemFluidPacket || item instanceof ItemFluidDrop; } @Override @@ -182,34 +194,27 @@ public class TileFluidPacketDecoder extends AENetworkTile private FluidStack drain(FluidStack requestFluid, boolean doDrain) { if (requestFluid == null || requestFluid.amount <= 0) return null; - ItemStack fluidPacket = this.inventory.getStackInSlot(0); - if (fluidPacket != null) { - FluidStack fs = ItemFluidPacket.getFluidStack(fluidPacket); - if (fs == null) return null; - if (fs.isFluidEqual(requestFluid)) { - if (fs.amount > requestFluid.amount) { - fs.amount -= requestFluid.amount; - if (doDrain) this.inventory.setInventorySlotContents(0, ItemFluidPacket.newStack(fs)); - return requestFluid; - } else { - if (doDrain) this.inventory.setInventorySlotContents(0, null); - return fs; - } + final FluidStack fs = this.getFluidStack(); + if (fs != null && fs.isFluidEqual(requestFluid)) { + if (fs.amount > requestFluid.amount) { + fs.amount -= requestFluid.amount; + if (doDrain) this.inventory.setInventorySlotContents(0, ItemFluidPacket.newStack(fs)); + return requestFluid; + } else { + if (doDrain) this.inventory.setInventorySlotContents(0, null); + return fs; } } + return null; } @Override public FluidStack drain(ForgeDirection from, int maxDrain, boolean doDrain) { - ItemStack fluidPacket = this.inventory.getStackInSlot(0); - if (fluidPacket != null) { - FluidStack requestFluid = ItemFluidPacket.getFluidStack(fluidPacket); - if (requestFluid == null) return null; - requestFluid.amount = maxDrain; - return this.drain(requestFluid, doDrain); - } - return null; + final FluidStack requestFluid = this.getFluidStack(); + if (requestFluid == null) return null; + requestFluid.amount = maxDrain; + return this.drain(requestFluid, doDrain); } @Override @@ -224,13 +229,8 @@ public class TileFluidPacketDecoder extends AENetworkTile @Override public FluidTankInfo[] getTankInfo(ForgeDirection from) { - ItemStack fluidPacket = this.inventory.getStackInSlot(0); - if (fluidPacket == null) { - return new FluidTankInfo[0]; - } else { - FluidStack fs = ItemFluidPacket.getFluidStack(fluidPacket); - if (fs == null) return new FluidTankInfo[0]; - return new FluidTankInfo[] { new FluidTankInfo(fs, fs.amount) }; - } + final FluidStack fs = this.getFluidStack(); + if (fs == null) return new FluidTankInfo[0]; + return new FluidTankInfo[] { new FluidTankInfo(fs, fs.amount) }; } } diff --git a/src/main/java/com/glodblock/github/inventory/slot/FCSlotRestrictedInput.java b/src/main/java/com/glodblock/github/inventory/slot/FCSlotRestrictedInput.java index eb75133a..296b357e 100644 --- a/src/main/java/com/glodblock/github/inventory/slot/FCSlotRestrictedInput.java +++ b/src/main/java/com/glodblock/github/inventory/slot/FCSlotRestrictedInput.java @@ -1,5 +1,8 @@ package com.glodblock.github.inventory.slot; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.inventory.IInventory; @@ -17,10 +20,22 @@ public class FCSlotRestrictedInput extends SlotRestrictedInput { MutablePair isItemValid(final ItemStack inputItem); } - private final Filter filter; + private final List filter = new ArrayList<>(); private final InventoryPlayer p; private ItemStack validItem = null; + public FCSlotRestrictedInput(List validList, IInventory i, int slotIndex, int x, int y, + InventoryPlayer p) { + super(PlacableItemType.INSCRIBER_PLATE, i, slotIndex, x, y, p); + validList.forEach( + valid -> filter.add( + (inputItem) -> new MutablePair<>( + valid.getItem().getClass().isAssignableFrom(inputItem.getItem().getClass()), + valid))); + this.p = p; + this.validItem = validList.get(0); + } + public FCSlotRestrictedInput(ItemStack valid, IInventory i, int slotIndex, int x, int y, InventoryPlayer p) { this( (inputItem) -> new MutablePair<>( @@ -36,14 +51,15 @@ public class FCSlotRestrictedInput extends SlotRestrictedInput { public FCSlotRestrictedInput(Filter filter, IInventory i, int slotIndex, int x, int y, InventoryPlayer p) { super(PlacableItemType.INSCRIBER_PLATE, i, slotIndex, x, y, p); - this.filter = filter; + this.filter.add(filter); this.p = p; } @Override public boolean isItemValid(final ItemStack inputItem) { - MutablePair result = this.filter.isItemValid(inputItem); - return result.left; + for (Filter filter : this.filter) if (filter.isItemValid(inputItem).left) return true; + + return false; } public boolean getAllowEdit() { diff --git a/src/main/resources/assets/ae2fc/lang/en_US.lang b/src/main/resources/assets/ae2fc/lang/en_US.lang index 5fff165f..2659b72a 100644 --- a/src/main/resources/assets/ae2fc/lang/en_US.lang +++ b/src/main/resources/assets/ae2fc/lang/en_US.lang @@ -85,7 +85,7 @@ ae2fc.waila.disable=Disable ae2fc.tooltip.shift_for_more=§r> Hold §3Shift§r for more information ae2fc.tooltip.ctrl_for_more=§r> Hold §3Ctrl§r for more information -ae2fc.tooltip.fluid_packet_decoder.desc=The Fluid Decoder can decode Fluid packets. It has to be connected to a ME System and a place to store the liquid in, otherwise it won't work. +ae2fc.tooltip.fluid_packet_decoder.desc=The Fluid Decoder can decode Fluid packets/drops. It has to be connected to a ME System and a place to store the liquid in, otherwise it won't work. ae2fc.tooltip.fluid_buffer.desc=This is a high speed fluid IO ae2fc.tooltip.walrus.desc=GTNH is like a job ae2fc.tooltip.fluid_auto_filler=Creates a fluid canning pattern with the given container automatically. @@ -132,7 +132,7 @@ ae2fc.tooltip.fluid_terminal=uh So we don't need EC2 anymore? ae2fc.tooltip.level_terminal=uh... ae2fc.tooltip.invalid_fluid=Invalid fluid! ae2fc.tooltip.encode_pattern=Encode Pattern -ae2fc.tooltip.fluid_packet=Use a Fluid Packet Decoder to\nconvert this back into fluid. +ae2fc.tooltip.fluid_packet=Use a Fluid Packet/Drops Decoder to\nconvert this back into fluid. ae2fc.tooltip.empty=Empty ae2fc.tooltip.dump_tank=Dump Tank Contents ae2fc.tooltip.switch_fluid_interface=Switch ME Dual Interface GUI