diff options
author | Glease <4586901+Glease@users.noreply.github.com> | 2022-01-04 01:19:56 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-03 18:19:56 +0100 |
commit | 5cf9aa8a9033d19ea7dd2b8739384c08006f4da2 (patch) | |
tree | 369f3d482f200e7fdcee1df9eb62f4365d6be0e7 /src/main/java | |
parent | ce70eef5b55ee411800606f621af8bafd7eff70e (diff) | |
download | GT5-Unofficial-5cf9aa8a9033d19ea7dd2b8739384c08006f4da2.tar.gz GT5-Unofficial-5cf9aa8a9033d19ea7dd2b8739384c08006f4da2.tar.bz2 GT5-Unofficial-5cf9aa8a9033d19ea7dd2b8739384c08006f4da2.zip |
Allow drag and drop from NEI to set output hatch locking (#845)
* Allow drag and drop from NEI to set output hatch locking
also cleaned up the output hatch networking code
* Add not locked indicator
Diffstat (limited to 'src/main/java')
7 files changed, 137 insertions, 76 deletions
diff --git a/src/main/java/gregtech/api/gui/GT_GUIContainer.java b/src/main/java/gregtech/api/gui/GT_GUIContainer.java index b122b33a73..af6c37a8dd 100644 --- a/src/main/java/gregtech/api/gui/GT_GUIContainer.java +++ b/src/main/java/gregtech/api/gui/GT_GUIContainer.java @@ -3,9 +3,12 @@ package gregtech.api.gui; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.client.renderer.Tessellator; import net.minecraft.inventory.Container; +import net.minecraft.inventory.Slot; import net.minecraft.util.ResourceLocation; import org.lwjgl.input.Mouse; +import static gregtech.GT_Mod.GT_FML_LOGGER; + /** * NEVER INCLUDE THIS FILE IN YOUR MOD!!! * <p/> @@ -69,6 +72,18 @@ public class GT_GUIContainer extends GuiContainer { protected void onMouseWheel(int mx, int my, int delta) { } + public boolean isMouseOverSlot(int slotIndex, int mx, int my) + { + int size = inventorySlots.inventorySlots.size(); + if (slotIndex < 0 || slotIndex >= size) { + // slot does not exist somehow. log and carry on + GT_FML_LOGGER.error("Slot {} required where only {} is present", slotIndex, size); + return false; + } + Slot slot = inventorySlots.getSlot(slotIndex); + return this.func_146978_c(slot.xDisplayPosition, slot.yDisplayPosition, 16, 16, mx, my); + } + /* @Override protected void drawSlotInventory(Slot par1Slot) { diff --git a/src/main/java/gregtech/api/net/GT_Packet_SetLockedFluid.java b/src/main/java/gregtech/api/net/GT_Packet_SetLockedFluid.java new file mode 100644 index 0000000000..deea71feab --- /dev/null +++ b/src/main/java/gregtech/api/net/GT_Packet_SetLockedFluid.java @@ -0,0 +1,91 @@ +package gregtech.api.net; + +import com.google.common.io.ByteArrayDataInput; +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; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.network.INetHandler; +import net.minecraft.network.NetHandlerPlayServer; +import net.minecraft.tileentity.TileEntity; +import net.minecraft.world.IBlockAccess; +import net.minecraft.world.World; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidRegistry; +import net.minecraftforge.fluids.FluidStack; + +public class GT_Packet_SetLockedFluid extends GT_Packet_New { + protected int mX; + protected short mY; + protected int mZ; + + protected int mFluidID; + + private EntityPlayerMP mPlayer; + + public GT_Packet_SetLockedFluid() { + super(true); + } + + public GT_Packet_SetLockedFluid(IGregTechTileEntity aTile, FluidStack aSource) { + this(aTile.getXCoord(), aTile.getYCoord(), aTile.getZCoord(), aSource.getFluidID()); + } + + public GT_Packet_SetLockedFluid(int x, short y, int z, int aFluidID) { + super(false); + + this.mX = x; + this.mY = y; + this.mZ = z; + + this.mFluidID = aFluidID; + } + + @Override + public byte getPacketID() { + return 14; + } + + @Override + public void encode(ByteBuf aOut) { + aOut.writeInt(mX); + aOut.writeShort(mY); + aOut.writeInt(mZ); + + aOut.writeInt(mFluidID); + } + + @Override + public void setINetHandler(INetHandler aHandler) { + if (aHandler instanceof NetHandlerPlayServer) { + mPlayer = ((NetHandlerPlayServer) aHandler).playerEntity; + } + } + + @Override + public GT_Packet_New decode(ByteArrayDataInput aData) { + return new GT_Packet_SetLockedFluid( + aData.readInt(), + aData.readShort(), + aData.readInt(), + + aData.readInt()); + } + + @Override + public void process(IBlockAccess aWorld) { + if (mPlayer == null) return; + World world = mPlayer.worldObj; + 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; + Fluid tFluid = FluidRegistry.getFluid(mFluidID); + if (tFluid == null) return; + ((GT_MetaTileEntity_Hatch_Output) mte).setLockedFluidName(tFluid.getName()); + GT_Utility.sendChatToPlayer(mPlayer, String.format(GT_LanguageManager.addStringLocalization("Interaction_DESCRIPTION_Index_151.4", "Sucessfully locked Fluid to %s", false), new FluidStack(tFluid, 1).getLocalizedName())); + } +} diff --git a/src/main/java/gregtech/common/GT_Network.java b/src/main/java/gregtech/common/GT_Network.java index 96ca384949..d3387209c3 100644 --- a/src/main/java/gregtech/common/GT_Network.java +++ b/src/main/java/gregtech/common/GT_Network.java @@ -49,7 +49,8 @@ public class GT_Network extends MessageToMessageCodec<FMLProxyPacket, GT_Packet> new GT_Packet_WirelessRedstoneCover(), new GT_Packet_TileEntityCoverNew(), new GT_Packet_SetConfigurationCircuit(), - new GT_Packet_UpdateItem() + new GT_Packet_UpdateItem(), + new GT_Packet_SetLockedFluid() ); } 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 31a6224535..6651d7875a 100644 --- a/src/main/java/gregtech/common/gui/GT_Container_OutputHatch.java +++ b/src/main/java/gregtech/common/gui/GT_Container_OutputHatch.java @@ -1,7 +1,5 @@ package gregtech.common.gui; -import cpw.mods.fml.relauncher.Side; -import cpw.mods.fml.relauncher.SideOnly; import gregtech.api.gui.GT_Container_BasicTank; import gregtech.api.gui.GT_Slot_Output; import gregtech.api.gui.GT_Slot_Render; @@ -10,21 +8,12 @@ import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_Hatch_Outpu import gregtech.api.util.GT_Utility; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; -import net.minecraft.inventory.ICrafting; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; -import net.minecraftforge.fluids.Fluid; -import net.minecraftforge.fluids.FluidRegistry; import net.minecraftforge.fluids.FluidStack; -import java.nio.ByteBuffer; - public class GT_Container_OutputHatch extends GT_Container_BasicTank { - private ByteBuffer buffer; - private String fluidName = ""; - private byte mMode; - public GT_Container_OutputHatch(InventoryPlayer aInventoryPlayer, IGregTechTileEntity aTileEntity) { super(aInventoryPlayer, aTileEntity); } @@ -48,76 +37,13 @@ public class GT_Container_OutputHatch extends GT_Container_BasicTank { tHatch.setLockedFluidName(null); GT_Utility.sendChatToPlayer(aPlayer, trans("300", "Fluid Lock Cleared.")); tHatch.mMode = 0; - fluidName = ""; } else { tHatch.setLockedFluidName(tReadyLockFluid.getFluid().getName()); GT_Utility.sendChatToPlayer(aPlayer, String.format(trans("151.4", "Sucessfully locked Fluid to %s"), tReadyLockFluid.getLocalizedName())); tHatch.mMode = 9; - fluidName = tReadyLockFluid.getUnlocalizedName(); } } return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer); } - - @Override - public void addCraftingToCrafters(ICrafting clientHandle) { - buffer.putInt(0, fluidName.length()); - buffer.put(Integer.BYTES, mMode); - for (int i = 0; i < fluidName.length(); i++) { - buffer.putChar(Integer.BYTES + Character.BYTES * i + 1, fluidName.charAt(i)); - } - sendStateUpdate(clientHandle); - super.addCraftingToCrafters(clientHandle); - } - - @Override - public void detectAndSendChanges() { - super.detectAndSendChanges(); - if (buffer == null) { - buffer = ByteBuffer.allocate(256); - } - if(mTileEntity.isServerSide()) { - GT_MetaTileEntity_Hatch_Output tile = (GT_MetaTileEntity_Hatch_Output) mTileEntity.getMetaTileEntity(); - if (tile == null) return; - fluidName = tile.getLockedFluidName() == null ? "" : tile.getLockedFluidName(); - mMode = tile.getMode(); - buffer.putInt(0, fluidName.length()); - buffer.put(Integer.BYTES, mMode); - for (int i = 0; i < fluidName.length(); i++) { - buffer.putChar(Integer.BYTES + Character.BYTES * i + 1, fluidName.charAt(i)); - } - for (Object clientHandle : this.crafters) { - sendStateUpdate((ICrafting) clientHandle); - } - } - } - - private void sendStateUpdate(ICrafting clientHandle) { - final int bytes = Character.BYTES * fluidName.length() + Integer.BYTES + 1; - for (int i = 0; i < bytes; i++) { - clientHandle.sendProgressBarUpdate(this, i + 110, buffer.get(i)); - } - } - - @SideOnly(Side.CLIENT) - public void updateProgressBar(int index, int value) { - super.updateProgressBar(index, value); - index = index - 110; - if(index >= 0 && index < buffer.capacity()) { - buffer.put(index, (byte) value); - } - } - - @SideOnly(Side.CLIENT) - public String getFluidName() { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < buffer.getInt(0); ++i) { - sb.append(buffer.getChar(i * Character.BYTES + Integer.BYTES + 1)); - } - byte mode = buffer.get(Integer.BYTES); - FluidStack tFluid = FluidRegistry.getFluidStack(sb.toString(), 1); - if (tFluid == null || mode < 8) return "Empty"; - return tFluid.getLocalizedName().replace("fluid.", ""); - } }
\ No newline at end of file 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 1adf66c1b7..5c29c3d7a6 100644 --- a/src/main/java/gregtech/common/gui/GT_GUIContainer_OutputHatch.java +++ b/src/main/java/gregtech/common/gui/GT_GUIContainer_OutputHatch.java @@ -4,6 +4,7 @@ import gregtech.api.gui.GT_GUIContainerMetaTile_Machine; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; import gregtech.api.util.GT_Utility; import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.item.ItemStack; import net.minecraft.util.StatCollector; import static gregtech.api.enums.GT_Values.RES_PATH_GUI; @@ -25,7 +26,9 @@ public class GT_GUIContainer_OutputHatch extends GT_GUIContainerMetaTile_Machine fontRendererObj.drawString("Liquid Amount", 10, 20, 16448255); fontRendererObj.drawString(GT_Utility.parseNumberToString(((GT_Container_OutputHatch) mContainer).mContent), 10, 30, 16448255); fontRendererObj.drawString("Locked Fluid", 101, 20, 16448255); - fontRendererObj.drawString(((GT_Container_OutputHatch) mContainer).getFluidName(), 101, 30, 16448255); + ItemStack tLockedDisplayStack = (ItemStack) mContainer.getInventory().get(3); + String fluidName = tLockedDisplayStack == null ? "None" : tLockedDisplayStack.getDisplayName(); + fontRendererObj.drawString(fluidName, 101, 30, 16448255); } } diff --git a/src/main/java/gregtech/nei/GT_NEI_GuiAdapter.java b/src/main/java/gregtech/nei/GT_NEI_GuiAdapter.java new file mode 100644 index 0000000000..f70462110d --- /dev/null +++ b/src/main/java/gregtech/nei/GT_NEI_GuiAdapter.java @@ -0,0 +1,24 @@ +package gregtech.nei; + +import codechicken.nei.api.INEIGuiAdapter; +import gregtech.api.enums.GT_Values; +import gregtech.api.net.GT_Packet_SetLockedFluid; +import gregtech.api.util.GT_Utility; +import gregtech.common.gui.GT_GUIContainer_OutputHatch; +import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.FluidStack; + +public class GT_NEI_GuiAdapter extends INEIGuiAdapter { + @Override + public boolean handleDragNDrop(GuiContainer gui, int mousex, int mousey, ItemStack draggedStack, int button) { + if (gui instanceof GT_GUIContainer_OutputHatch && ((GT_GUIContainer_OutputHatch) gui).isMouseOverSlot(3, mousex, mousey)) { + FluidStack tFluidStack = GT_Utility.getFluidForFilledItem(draggedStack, true); + if (tFluidStack != null) { + GT_Values.NW.sendToServer(new GT_Packet_SetLockedFluid(((GT_GUIContainer_OutputHatch) gui).mContainer.mTileEntity, tFluidStack)); + return true; + } + } + return super.handleDragNDrop(gui, mousex, mousey, draggedStack, button); + } +} diff --git a/src/main/java/gregtech/nei/NEI_GT_Config.java b/src/main/java/gregtech/nei/NEI_GT_Config.java index 0b4476eeef..b5cf8776e1 100644 --- a/src/main/java/gregtech/nei/NEI_GT_Config.java +++ b/src/main/java/gregtech/nei/NEI_GT_Config.java @@ -62,6 +62,7 @@ public class NEI_GT_Config implements IConfigureNEI { handlers.forEach(NEI_GT_Config::addHandler); codechicken.nei.api.API.addItemListEntry(ItemList.VOLUMETRIC_FLASK.get(1)); + codechicken.nei.api.API.registerNEIGuiHandler(new GT_NEI_GuiAdapter()); } sIsAdded = true; } |