diff options
author | miozune <miozune@gmail.com> | 2022-09-02 20:57:30 +0900 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-02 13:57:30 +0200 |
commit | 41d1832928fb89accc49b384ddec71375daaed71 (patch) | |
tree | cb2cc16e52458a892b2798f28c3305d3b3f05a9f /src | |
parent | 233b0f321a0d0b9594f6e0f55dd0d7ae789f9c31 (diff) | |
download | GT5-Unofficial-41d1832928fb89accc49b384ddec71375daaed71.tar.gz GT5-Unofficial-41d1832928fb89accc49b384ddec71375daaed71.tar.bz2 GT5-Unofficial-41d1832928fb89accc49b384ddec71375daaed71.zip |
Add Drag-And-Drop support for digital tank (#1333)
* Add Drag-And-Drop support for digital tank
* lockedFluidName is null in old save
Diffstat (limited to 'src')
12 files changed, 237 insertions, 84 deletions
diff --git a/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java b/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java index fc0b3270d2..590d406ca4 100644 --- a/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java +++ b/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java @@ -4,6 +4,7 @@ import static gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Basi import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.interfaces.IFluidAccess; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank; @@ -221,7 +222,7 @@ public class GT_Container_BasicMachine extends GT_Container_BasicTank { tTank.setFillableStack(GT_Utility.getFluidFromDisplayStack(tTank.getStackInSlot(2))); } GT_MetaTileEntity_BasicTank tTank = (GT_MetaTileEntity_BasicTank) mTileEntity.getMetaTileEntity(); - BasicTankFluidAccess tFillableAccess = BasicTankFluidAccess.from(tTank, true); + IFluidAccess tFillableAccess = constructFluidAccess(tTank, true); GT_Recipe_Map recipes = machine.getRecipeList(); // If the machine has recipes but no fluid inputs, disallow filling this slot with fluids. ItemStack tToken = handleFluidSlotClick( diff --git a/src/main/java/gregtech/api/gui/GT_Container_BasicTank.java b/src/main/java/gregtech/api/gui/GT_Container_BasicTank.java index 8d8d018cdc..27138511f0 100644 --- a/src/main/java/gregtech/api/gui/GT_Container_BasicTank.java +++ b/src/main/java/gregtech/api/gui/GT_Container_BasicTank.java @@ -54,7 +54,7 @@ public class GT_Container_BasicTank extends GT_ContainerMetaTile_Machine { tTank.setDrainableStack(GT_Utility.getFluidFromDisplayStack(tTank.getStackInSlot(2))); } GT_MetaTileEntity_BasicTank tTank = (GT_MetaTileEntity_BasicTank) mTileEntity.getMetaTileEntity(); - BasicTankFluidAccess tDrainableAccess = BasicTankFluidAccess.from(tTank, false); + IFluidAccess tDrainableAccess = constructFluidAccess(tTank, false); return handleFluidSlotClick( tDrainableAccess, aPlayer, aMouseclick == 0, true, !tTank.isDrainableStackSeparate()); } @@ -106,9 +106,13 @@ public class GT_Container_BasicTank extends GT_ContainerMetaTile_Machine { return 1; } + protected IFluidAccess constructFluidAccess(GT_MetaTileEntity_BasicTank aTank, boolean aIsFillableStack) { + return new BasicTankFluidAccess(aTank, aIsFillableStack); + } + static class BasicTankFluidAccess implements IFluidAccess { - private final GT_MetaTileEntity_BasicTank mTank; - private final boolean mIsFillableStack; + protected final GT_MetaTileEntity_BasicTank mTank; + protected final boolean mIsFillableStack; public BasicTankFluidAccess(GT_MetaTileEntity_BasicTank aTank, boolean aIsFillableStack) { this.mTank = aTank; @@ -132,22 +136,5 @@ public class GT_Container_BasicTank extends GT_ContainerMetaTile_Machine { public int getCapacity() { return mTank.getCapacity(); } - - @Override - public int getRealCapacity() { - if (mTank instanceof GT_MetaTileEntity_DigitalTankBase) { - return ((GT_MetaTileEntity_DigitalTankBase) mTank).getRealCapacity(); - } - return IFluidAccess.super.getRealCapacity(); - } - - static BasicTankFluidAccess from(GT_MetaTileEntity_BasicTank aTank, boolean aIsFillableStack) { - return new BasicTankFluidAccess(aTank, aIsFillableStack); - } - - @Override - public void verifyFluidStack() { - if (!(mTank instanceof GT_MetaTileEntity_DigitalTankBase) && get() != null && get().amount <= 0) set(null); - } } } diff --git a/src/main/java/gregtech/api/gui/GT_Container_DigitalTank.java b/src/main/java/gregtech/api/gui/GT_Container_DigitalTank.java index bdc2b32c80..b4cdf698dc 100644 --- a/src/main/java/gregtech/api/gui/GT_Container_DigitalTank.java +++ b/src/main/java/gregtech/api/gui/GT_Container_DigitalTank.java @@ -2,7 +2,9 @@ package gregtech.api.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; +import gregtech.api.interfaces.IFluidAccess; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank; import gregtech.api.util.GT_Utility; import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalTankBase; import net.minecraft.entity.player.EntityPlayer; @@ -53,15 +55,16 @@ public class GT_Container_DigitalTank extends GT_Container_BasicTank { mte.mLockFluid = !mte.mLockFluid; if (mte.mLockFluid) { if (mte.mFluid == null) { - mte.lockedFluidName = null; + mte.setLockedFluidName(null); inBrackets = GT_Utility.trans("264", "currently none, will be locked to the next that is put in"); } else { - mte.lockedFluidName = mte.getDrainableStack().getUnlocalizedName(); + mte.setLockedFluidName(mte.getDrainableStack().getFluid().getName()); inBrackets = mte.getDrainableStack().getLocalizedName(); } GT_Utility.sendChatToPlayer( aPlayer, String.format("%s (%s)", GT_Utility.trans("265", "1 specific Fluid"), inBrackets)); } else { + mte.setLockedFluidName(null); GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("266", "Lock Fluid Mode Disabled")); } return null; @@ -152,4 +155,24 @@ public class GT_Container_DigitalTank extends GT_Container_BasicTank { break; } } + + @Override + protected IFluidAccess constructFluidAccess(GT_MetaTileEntity_BasicTank aTank, boolean aIsFillableStack) { + return new DigitalTankFluidAccess(aTank, aIsFillableStack); + } + + static class DigitalTankFluidAccess extends BasicTankFluidAccess { + + public DigitalTankFluidAccess(GT_MetaTileEntity_BasicTank aTank, boolean aIsFillableStack) { + super(aTank, aIsFillableStack); + } + + @Override + public int getRealCapacity() { + return ((GT_MetaTileEntity_DigitalTankBase) mTank).getRealCapacity(); + } + + @Override + public void verifyFluidStack() {} + } } diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer_DigitalTank.java b/src/main/java/gregtech/api/gui/GT_GUIContainer_DigitalTank.java index 5d72c9ff51..c1e90ed68a 100644 --- a/src/main/java/gregtech/api/gui/GT_GUIContainer_DigitalTank.java +++ b/src/main/java/gregtech/api/gui/GT_GUIContainer_DigitalTank.java @@ -2,14 +2,21 @@ package gregtech.api.gui; import static gregtech.api.enums.GT_Values.RES_PATH_GUI; +import gregtech.api.enums.GT_Values; +import gregtech.api.interfaces.IDragAndDropSupport; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.net.GT_Packet_SetLockedFluid; import gregtech.api.util.GT_Utility; +import gregtech.common.tileentities.storage.GT_MetaTileEntity_DigitalTankBase; import java.util.ArrayList; import java.util.List; +import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; +import net.minecraftforge.fluids.FluidStack; -public class GT_GUIContainer_DigitalTank extends GT_GUIContainerMetaTile_Machine { +public class GT_GUIContainer_DigitalTank extends GT_GUIContainerMetaTile_Machine implements IDragAndDropSupport { private final String mName; private final int textColor = this.getTextColorOrDefault("text", 0xFAFAFF), @@ -94,4 +101,23 @@ public class GT_GUIContainer_DigitalTank extends GT_GUIContainerMetaTile_Machine } } } + + @Override + public boolean handleDragAndDropGT( + GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button, boolean isGhost) { + if (!(gui instanceof GT_GUIContainer_DigitalTank) + || !((GT_GUIContainer_DigitalTank) gui).isMouseOverSlot(2, mousex, mousey) + || !isGhost) return false; + FluidStack fluidStack = GT_Utility.getFluidFromContainerOrFluidDisplay(draggedStack); + if (fluidStack == null) return false; + IGregTechTileEntity te = ((GT_GUIContainer_DigitalTank) gui).mContainer.mTileEntity; + GT_MetaTileEntity_DigitalTankBase mte = (GT_MetaTileEntity_DigitalTankBase) te.getMetaTileEntity(); + if (mte == null || !mte.allowChangingLockedFluid(fluidStack.getFluid().getName())) return false; + + GT_Values.NW.sendToServer(new GT_Packet_SetLockedFluid(te, fluidStack)); + draggedStack.stackSize = 0; + // propagate to client too + mte.setLockedFluidName(fluidStack.getFluid().getName()); + return true; + } } diff --git a/src/main/java/gregtech/api/interfaces/IDragAndDropSupport.java b/src/main/java/gregtech/api/interfaces/IDragAndDropSupport.java new file mode 100644 index 0000000000..53b3a2b059 --- /dev/null +++ b/src/main/java/gregtech/api/interfaces/IDragAndDropSupport.java @@ -0,0 +1,53 @@ +package gregtech.api.interfaces; + +import codechicken.nei.NEIClientUtils; +import codechicken.nei.VisiblityData; +import codechicken.nei.api.INEIGuiHandler; +import codechicken.nei.api.TaggedInventoryArea; +import cpw.mods.fml.common.Optional; +import java.util.Collections; +import java.util.List; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; + +/** + * Implement this interface if your GuiContainer supports Drag-And-Drop behavior on NEI. + */ +@Optional.Interface(modid = "NotEnoughItems", iface = "codechicken.nei.api.INEIGuiHandler") +public interface IDragAndDropSupport extends INEIGuiHandler { + + /** + * Implement this to handle Drag-And-Drop behavior. + * This may be invoked on normal click too ({@code isGhost==false}), so be careful + * if your slot supports both Drag-And-Drop and other behaviors e.g. fluid I/O with FluidDisplay click + * @param gui Current gui instance. Make sure to check if it is an instance of your GuiContainer. + * @param mousex X position of the mouse + * @param mousey Y position of the mouse + * @param draggedStack ItemStack user is holding on cursor + * @param button 0 = left click, 1 = right click + * @param isGhost Whether {@code draggedStack} is dragged from ItemPanel/BookmarkPanel, or actual item player holds + * @return True if success + */ + boolean handleDragAndDropGT( + GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button, boolean isGhost); + + default boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button) { + return handleDragAndDropGT(gui, mousex, mousey, draggedStack, button, NEIClientUtils.getHeldItem() == null); + } + + default VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility) { + return currentVisibility; + } + + default Iterable<Integer> getItemSpawnSlots(GuiContainer gui, ItemStack item) { + return Collections.emptyList(); + } + + default List<TaggedInventoryArea> getInventoryAreas(GuiContainer gui) { + return null; + } + + default boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) { + return false; + } +} diff --git a/src/main/java/gregtech/api/interfaces/metatileentity/IFluidLockable.java b/src/main/java/gregtech/api/interfaces/metatileentity/IFluidLockable.java new file mode 100644 index 0000000000..688a85b521 --- /dev/null +++ b/src/main/java/gregtech/api/interfaces/metatileentity/IFluidLockable.java @@ -0,0 +1,29 @@ +package gregtech.api.interfaces.metatileentity; + +import net.minecraftforge.fluids.Fluid; + +/** + * Implement this interface if your MetaTileEntity supports fluid lock mechanism. + */ +@SuppressWarnings({"BooleanMethodIsAlwaysInverted", "unused"}) +public interface IFluidLockable { + + /** + * Use {@link Fluid#getName()} instead of {@link Fluid#getUnlocalizedName()} for fluid name + */ + void setLockedFluidName(String name); + + String getLockedFluidName(); + + /** + * Set fluid lock state. + * Would be useful when you don't necessarily want to change mode when locked fluid is changed. + */ + void lockFluid(boolean lock); + + boolean isFluidLocked(); + + boolean allowChangingLockedFluid(String name); + + default void onFluidLockPacketReceived(String name) {} +} diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java index 9e949220f7..55ca9f9605 100644 --- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java +++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java @@ -5,6 +5,7 @@ import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT; import gregtech.GT_Mod; import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IFluidLockable; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.render.TextureFactory; @@ -22,7 +23,7 @@ import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; import net.minecraftforge.fluids.*; -public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch { +public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch implements IFluidLockable { private String lockedFluidName = null; private WeakReference<EntityPlayer> playerThatLockedfluid = null; public byte mMode = 0; @@ -368,18 +369,31 @@ public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch { return mMode % 4 < 2 && mMode != 9; } - public boolean isFluidLocked() { - return mMode == 8 || mMode == 9; - } - + @Override public String getLockedFluidName() { return lockedFluidName; } + @Override public void setLockedFluidName(String lockedFluidName) { this.lockedFluidName = lockedFluidName; } + @Override + public void lockFluid(boolean lock) { + this.mMode = (byte) (lock ? 9 : 0); + } + + @Override + public boolean isFluidLocked() { + return mMode == 8 || mMode == 9; + } + + @Override + public boolean allowChangingLockedFluid(String name) { + return true; + } + public boolean canStoreFluid(Fluid fluid) { if (isFluidLocked()) { if (lockedFluidName == null) return true; @@ -403,7 +417,7 @@ public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch { GT_Utility.sendChatToPlayer( player, String.format( - GT_Utility.trans("151.4", "Sucessfully locked Fluid to %s"), mFluid.getLocalizedName())); + GT_Utility.trans("151.4", "Successfully locked Fluid to %s"), mFluid.getLocalizedName())); playerThatLockedfluid = null; } } diff --git a/src/main/java/gregtech/api/net/GT_Packet_SetLockedFluid.java b/src/main/java/gregtech/api/net/GT_Packet_SetLockedFluid.java index d100dd6055..d3f6d9ae4d 100644 --- a/src/main/java/gregtech/api/net/GT_Packet_SetLockedFluid.java +++ b/src/main/java/gregtech/api/net/GT_Packet_SetLockedFluid.java @@ -1,9 +1,9 @@ package gregtech.api.net; import com.google.common.io.ByteArrayDataInput; +import gregtech.api.interfaces.metatileentity.IFluidLockable; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; -import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Output; import gregtech.api.util.GT_LanguageManager; import gregtech.api.util.GT_Utility; import io.netty.buffer.ByteBuf; @@ -77,17 +77,20 @@ public class GT_Packet_SetLockedFluid extends GT_Packet_New { TileEntity tile = world.getTileEntity(mX, mY, mZ); if (!(tile instanceof IGregTechTileEntity) || ((IGregTechTileEntity) tile).isDead()) return; IMetaTileEntity mte = ((IGregTechTileEntity) tile).getMetaTileEntity(); - if (!(mte instanceof GT_MetaTileEntity_Hatch_Output)) return; + if (!(mte instanceof IFluidLockable)) return; Fluid tFluid = FluidRegistry.getFluid(mFluidID); if (tFluid == null) return; - GT_MetaTileEntity_Hatch_Output hatch = (GT_MetaTileEntity_Hatch_Output) mte; - hatch.setLockedFluidName(tFluid.getName()); - hatch.mMode = 9; + IFluidLockable mteToLock = (IFluidLockable) mte; + if (!mteToLock.allowChangingLockedFluid(tFluid.getName())) return; + + mteToLock.setLockedFluidName(tFluid.getName()); GT_Utility.sendChatToPlayer( mPlayer, String.format( GT_LanguageManager.addStringLocalization( - "Interaction_DESCRIPTION_Index_151.4", "Sucessfully locked Fluid to %s", false), + "Interaction_DESCRIPTION_Index_151.4", "Successfully locked Fluid to %s", false), new FluidStack(tFluid, 1).getLocalizedName())); + + mteToLock.onFluidLockPacketReceived(tFluid.getName()); } } diff --git a/src/main/java/gregtech/api/util/GT_Utility.java b/src/main/java/gregtech/api/util/GT_Utility.java index b35b703ab9..abc6366cf3 100644 --- a/src/main/java/gregtech/api/util/GT_Utility.java +++ b/src/main/java/gregtech/api/util/GT_Utility.java @@ -2019,6 +2019,14 @@ public class GT_Utility { return null; } + public static FluidStack getFluidFromContainerOrFluidDisplay(ItemStack stack) { + FluidStack fluidStack = GT_Utility.getFluidForFilledItem(stack, true); + if (fluidStack == null) { + fluidStack = GT_Utility.getFluidFromDisplayStack(stack); + } + return fluidStack; + } + public static synchronized boolean removeIC2BottleRecipe( ItemStack aContainer, ItemStack aInput, diff --git a/src/main/java/gregtech/common/gui/GT_Container_OutputHatch.java b/src/main/java/gregtech/common/gui/GT_Container_OutputHatch.java index 954b8ab61b..135c20dafe 100644 --- a/src/main/java/gregtech/common/gui/GT_Container_OutputHatch.java +++ b/src/main/java/gregtech/common/gui/GT_Container_OutputHatch.java @@ -37,15 +37,15 @@ public class GT_Container_OutputHatch extends GT_Container_BasicTank { || (tMode >= 8 && tReadyLockFluid.getFluid().getName().equals(tHatch.getLockedFluidName()))) { tHatch.setLockedFluidName(null); GT_Utility.sendChatToPlayer(aPlayer, GT_Utility.trans("300", "Fluid Lock Cleared.")); - tHatch.mMode = 0; + tHatch.lockFluid(false); } else { tHatch.setLockedFluidName(tReadyLockFluid.getFluid().getName()); GT_Utility.sendChatToPlayer( aPlayer, String.format( - GT_Utility.trans("151.4", "Sucessfully locked Fluid to %s"), + GT_Utility.trans("151.4", "Successfully locked Fluid to %s"), tReadyLockFluid.getLocalizedName())); - tHatch.mMode = 9; + tHatch.lockFluid(true); } } return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer); diff --git a/src/main/java/gregtech/common/gui/GT_GUIContainer_OutputHatch.java b/src/main/java/gregtech/common/gui/GT_GUIContainer_OutputHatch.java index 605fb5a463..7e27a7409a 100644 --- a/src/main/java/gregtech/common/gui/GT_GUIContainer_OutputHatch.java +++ b/src/main/java/gregtech/common/gui/GT_GUIContainer_OutputHatch.java @@ -2,25 +2,19 @@ package gregtech.common.gui; import static gregtech.api.enums.GT_Values.RES_PATH_GUI; -import codechicken.nei.VisiblityData; -import codechicken.nei.api.INEIGuiHandler; -import codechicken.nei.api.TaggedInventoryArea; -import cpw.mods.fml.common.Optional; import gregtech.api.enums.GT_Values; import gregtech.api.gui.GT_GUIContainerMetaTile_Machine; +import gregtech.api.interfaces.IDragAndDropSupport; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.net.GT_Packet_SetLockedFluid; import gregtech.api.util.GT_Utility; -import java.util.Collections; -import java.util.List; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; import net.minecraftforge.fluids.FluidStack; -@Optional.Interface(modid = "NotEnoughItems", iface = "codechicken.nei.api.INEIGuiHandler") -public class GT_GUIContainer_OutputHatch extends GT_GUIContainerMetaTile_Machine implements INEIGuiHandler { +public class GT_GUIContainer_OutputHatch extends GT_GUIContainerMetaTile_Machine implements IDragAndDropSupport { private final String mName; private final int textColor = this.getTextColorOrDefault("text", 0xFAFAFF), @@ -62,31 +56,12 @@ public class GT_GUIContainer_OutputHatch extends GT_GUIContainerMetaTile_Machine } @Override - @Optional.Method(modid = "NotEnoughItems") - public VisiblityData modifyVisiblity(GuiContainer gui, VisiblityData currentVisibility) { - return currentVisibility; - } - - @Override - public Iterable<Integer> getItemSpawnSlots(GuiContainer gui, ItemStack item) { - return Collections.emptyList(); - } - - @Override - public List<TaggedInventoryArea> getInventoryAreas(GuiContainer gui) { - return null; - } - - @Override - public boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button) { + public boolean handleDragAndDropGT( + GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button, boolean isGhost) { if (gui instanceof GT_GUIContainer_OutputHatch && ((GT_GUIContainer_OutputHatch) gui).isMouseOverSlot(3, mousex, mousey)) { // the instanceof check should be unnecessary, but we will do it regardless, just in case. - FluidStack tFluidStack; - tFluidStack = GT_Utility.getFluidForFilledItem(draggedStack, true); - if (tFluidStack == null) { - tFluidStack = GT_Utility.getFluidFromDisplayStack(draggedStack); - } + FluidStack tFluidStack = GT_Utility.getFluidFromContainerOrFluidDisplay(draggedStack); if (tFluidStack != null) { GT_Values.NW.sendToServer(new GT_Packet_SetLockedFluid( ((GT_GUIContainer_OutputHatch) gui).mContainer.mTileEntity, tFluidStack)); @@ -96,9 +71,4 @@ public class GT_GUIContainer_OutputHatch extends GT_GUIContainerMetaTile_Machine } return false; } - - @Override - public boolean hideItemPanelSlot(GuiContainer gui, int x, int y, int w, int h) { - return false; - } } diff --git a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java index 765597283a..9a7c75cb83 100644 --- a/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java +++ b/src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java @@ -5,6 +5,7 @@ import static gregtech.api.enums.Textures.BlockIcons.*; import gregtech.api.gui.GT_Container_DigitalTank; import gregtech.api.gui.GT_GUIContainer_DigitalTank; import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.metatileentity.IFluidLockable; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank; import gregtech.api.render.TextureFactory; @@ -15,13 +16,15 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.StatCollector; import net.minecraftforge.common.util.ForgeDirection; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidTankInfo; import net.minecraftforge.fluids.IFluidHandler; -public abstract class GT_MetaTileEntity_DigitalTankBase extends GT_MetaTileEntity_BasicTank { +public abstract class GT_MetaTileEntity_DigitalTankBase extends GT_MetaTileEntity_BasicTank implements IFluidLockable { public boolean mOutputFluid = false, mVoidFluidPart = false, mVoidFluidFull = false, mLockFluid = false; - public String lockedFluidName = null; + protected String lockedFluidName = null; private boolean voidBreak; public boolean mAllowInputFromOutputSide = false; @@ -77,15 +80,14 @@ public abstract class GT_MetaTileEntity_DigitalTankBase extends GT_MetaTileEntit @Override public void setItemNBT(NBTTagCompound aNBT) { if (!voidBreak) { - if (mFluid != null && mFluid.amount > 0) { + if (mFluid != null && mFluid.amount >= 0) { aNBT.setTag("mFluid", mFluid.writeToNBT(new NBTTagCompound())); } aNBT.setBoolean("mOutputFluid", this.mOutputFluid); aNBT.setBoolean("mVoidOverflow", this.mVoidFluidPart); aNBT.setBoolean("mVoidFluidFull", this.mVoidFluidFull); aNBT.setBoolean("mLockFluid", mLockFluid); - if (lockedFluidName != null && lockedFluidName.length() != 0) - aNBT.setString("lockedFluidName", lockedFluidName); + if (GT_Utility.isStringValid(lockedFluidName)) aNBT.setString("lockedFluidName", lockedFluidName); else aNBT.removeTag("lockedFluidName"); aNBT.setBoolean("mAllowInputFromOutputSide", this.mAllowInputFromOutputSide); } @@ -99,8 +101,7 @@ public abstract class GT_MetaTileEntity_DigitalTankBase extends GT_MetaTileEntit aNBT.setBoolean("mVoidOverflow", this.mVoidFluidPart); aNBT.setBoolean("mVoidFluidFull", this.mVoidFluidFull); aNBT.setBoolean("mLockFluid", mLockFluid); - if (lockedFluidName != null && lockedFluidName.length() != 0) - aNBT.setString("lockedFluidName", lockedFluidName); + if (GT_Utility.isStringValid(lockedFluidName)) aNBT.setString("lockedFluidName", lockedFluidName); else aNBT.removeTag("lockedFluidName"); aNBT.setBoolean("mAllowInputFromOutputSide", this.mAllowInputFromOutputSide); } @@ -113,13 +114,15 @@ public abstract class GT_MetaTileEntity_DigitalTankBase extends GT_MetaTileEntit mVoidFluidFull = aNBT.getBoolean("mVoidFluidFull"); mLockFluid = aNBT.getBoolean("mLockFluid"); lockedFluidName = aNBT.getString("lockedFluidName"); - lockedFluidName = lockedFluidName.length() == 0 ? null : lockedFluidName; + lockedFluidName = GT_Utility.isStringInvalid(lockedFluidName) ? null : lockedFluidName; mAllowInputFromOutputSide = aNBT.getBoolean("mAllowInputFromOutputSide"); } @Override public boolean isFluidInputAllowed(FluidStack aFluid) { - return !mLockFluid || lockedFluidName == null || lockedFluidName.equals(aFluid.getUnlocalizedName()); + return !mLockFluid + || lockedFluidName == null + || lockedFluidName.equals(aFluid.getFluid().getName()); } @Override @@ -130,7 +133,7 @@ public abstract class GT_MetaTileEntity_DigitalTankBase extends GT_MetaTileEntit @Override public void onEmptyingContainerWhenEmpty() { if (this.lockedFluidName == null && this.mFluid != null) { - this.lockedFluidName = this.mFluid.getUnlocalizedName(); + this.lockedFluidName = this.mFluid.getFluid().getName(); } } @@ -170,6 +173,42 @@ public abstract class GT_MetaTileEntity_DigitalTankBase extends GT_MetaTileEntit } @Override + public void setLockedFluidName(String lockedFluidName) { + this.lockedFluidName = lockedFluidName; + if (lockedFluidName != null) { + Fluid fluid = FluidRegistry.getFluid(lockedFluidName); + if (fluid != null) { + // create new FluidStack, otherwise existing 0-amount FluidStack will + // prevent new fluid from being locked + setFillableStack(new FluidStack(fluid, getFluidAmount())); + mLockFluid = true; + } + } + // Don't unlock if lockedFluidName == null, + // as player might explicitly enable fluid locking with no fluid contained + } + + @Override + public String getLockedFluidName() { + return this.lockedFluidName; + } + + @Override + public void lockFluid(boolean lock) { + this.mLockFluid = lock; + } + + @Override + public boolean isFluidLocked() { + return this.mLockFluid; + } + + @Override + public boolean allowChangingLockedFluid(String name) { + return getFluidAmount() == 0; + } + + @Override public ITexture[] getTexture( IGregTechTileEntity aBaseMetaTileEntity, byte aSide, |