aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authormiozune <miozune@gmail.com>2022-09-02 20:57:30 +0900
committerGitHub <noreply@github.com>2022-09-02 13:57:30 +0200
commit41d1832928fb89accc49b384ddec71375daaed71 (patch)
treecb2cc16e52458a892b2798f28c3305d3b3f05a9f /src
parent233b0f321a0d0b9594f6e0f55dd0d7ae789f9c31 (diff)
downloadGT5-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')
-rw-r--r--src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java3
-rw-r--r--src/main/java/gregtech/api/gui/GT_Container_BasicTank.java27
-rw-r--r--src/main/java/gregtech/api/gui/GT_Container_DigitalTank.java27
-rw-r--r--src/main/java/gregtech/api/gui/GT_GUIContainer_DigitalTank.java28
-rw-r--r--src/main/java/gregtech/api/interfaces/IDragAndDropSupport.java53
-rw-r--r--src/main/java/gregtech/api/interfaces/metatileentity/IFluidLockable.java29
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java26
-rw-r--r--src/main/java/gregtech/api/net/GT_Packet_SetLockedFluid.java15
-rw-r--r--src/main/java/gregtech/api/util/GT_Utility.java8
-rw-r--r--src/main/java/gregtech/common/gui/GT_Container_OutputHatch.java6
-rw-r--r--src/main/java/gregtech/common/gui/GT_GUIContainer_OutputHatch.java40
-rw-r--r--src/main/java/gregtech/common/tileentities/storage/GT_MetaTileEntity_DigitalTankBase.java59
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,