diff --git a/src/main/java/com/glodblock/github/client/gui/GuiFCImgButton.java b/src/main/java/com/glodblock/github/client/gui/GuiFCImgButton.java index c1a64de3..9d16d45b 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiFCImgButton.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiFCImgButton.java @@ -48,6 +48,7 @@ public class GuiFCImgButton extends GuiButton implements ITooltip { this.registerApp(2, "FORCE_PRIO", "DO_PRIO", "prio"); this.registerApp(3, "NOT_PRIO", "DONT_PRIO", "not_prio"); this.registerApp(4, "SUBMIT", "SUBMIT", "submit"); + this.registerApp(5, "EDIT", "YES", "edit"); this.registerApp(6, "DISABLE", "DISABLE", "disable"); this.registerApp(7, "ENABLE", "ENABLE", "enable"); this.registerApp(10, "FLUID_TEM", "YES", "fluid_terminal_w"); diff --git a/src/main/java/com/glodblock/github/client/gui/GuiInterfaceTerminalWireless.java b/src/main/java/com/glodblock/github/client/gui/GuiInterfaceTerminalWireless.java index 910fbb28..247331c8 100644 --- a/src/main/java/com/glodblock/github/client/gui/GuiInterfaceTerminalWireless.java +++ b/src/main/java/com/glodblock/github/client/gui/GuiInterfaceTerminalWireless.java @@ -9,6 +9,7 @@ import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.world.World; +import net.minecraftforge.common.util.ForgeDirection; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.GL11; @@ -39,9 +40,11 @@ import appeng.integration.IntegrationRegistry; import appeng.integration.IntegrationType; import appeng.util.Platform; +import com.glodblock.github.FluidCraft; import com.glodblock.github.client.gui.base.FCBaseMEGui; import com.glodblock.github.client.gui.container.ContainerInterfaceWireless; import com.glodblock.github.inventory.item.IWirelessTerminal; +import com.glodblock.github.network.CPacketRenamer; import com.glodblock.github.util.ModAndClassUtil; import com.google.common.collect.HashMultimap; @@ -53,7 +56,7 @@ public class GuiInterfaceTerminalWireless extends FCBaseMEGui implements IDropTo private final HashMap byId = new HashMap<>(); private final HashMultimap byName = HashMultimap.create(); - private final HashMap blockPosHashMap = new HashMap<>(); + private final HashMap blockPosHashMap = new HashMap<>(); private final HashMap guiButtonHashMap = new HashMap<>(); private final ArrayList names = new ArrayList<>(); private final ArrayList lines = new ArrayList<>(); @@ -310,8 +313,14 @@ public class GuiInterfaceTerminalWireless extends FCBaseMEGui implements IDropTo guiTop + offset + 1, Settings.ACTIONS, ActionItems.HIGHLIGHT_INTERFACE); + GuiFCImgButton editButton = new GuiFCImgButton(guiLeft + 4, guiTop + offset + 1, "EDIT", "YES"); guiButtonHashMap.put(guiButton, inv); - buttonList.add(guiButton); + guiButtonHashMap.put(editButton, inv); + if (isShiftKeyDown()) { + buttonList.add(editButton); + } else { + buttonList.add(guiButton); + } } offset += 18; @@ -336,28 +345,34 @@ public class GuiInterfaceTerminalWireless extends FCBaseMEGui implements IDropTo @Override protected void actionPerformed(final GuiButton btn) { if (guiButtonHashMap.containsKey(btn)) { - DimensionalCoord blockPos = blockPosHashMap.get(guiButtonHashMap.get(btn)); - WorldCoord blockPos2 = new WorldCoord( - (int) mc.thePlayer.posX, - (int) mc.thePlayer.posY, - (int) mc.thePlayer.posZ); - if (mc.theWorld.provider.dimensionId != blockPos.getDimension()) { - mc.thePlayer.addChatMessage( - new ChatComponentTranslation( - PlayerMessages.InterfaceInOtherDim.getName(), - blockPos.getDimension())); + DimensionalCoordSide blockPos = blockPosHashMap.get(guiButtonHashMap.get(btn)); + if (btn instanceof GuiFCImgButton) { + FluidCraft.proxy.netHandler.sendToServer( + new CPacketRenamer(blockPos.x, blockPos.y, blockPos.z, blockPos.getDimension(), blockPos.side)); } else { - BlockPosHighlighter.highlightBlock( - blockPos, - System.currentTimeMillis() + 500 * WorldCoord.getTaxicabDistance(blockPos, blockPos2)); - mc.thePlayer.addChatMessage( - new ChatComponentTranslation( - PlayerMessages.InterfaceHighlighted.getName(), - blockPos.x, - blockPos.y, - blockPos.z)); + + WorldCoord blockPos2 = new WorldCoord( + (int) mc.thePlayer.posX, + (int) mc.thePlayer.posY, + (int) mc.thePlayer.posZ); + if (mc.theWorld.provider.dimensionId != blockPos.getDimension()) { + mc.thePlayer.addChatMessage( + new ChatComponentTranslation( + PlayerMessages.InterfaceInOtherDim.getName(), + blockPos.getDimension())); + } else { + BlockPosHighlighter.highlightBlock( + blockPos, + System.currentTimeMillis() + 500 * WorldCoord.getTaxicabDistance(blockPos, blockPos2)); + mc.thePlayer.addChatMessage( + new ChatComponentTranslation( + PlayerMessages.InterfaceHighlighted.getName(), + blockPos.x, + blockPos.y, + blockPos.z)); + } + mc.thePlayer.closeScreen(); } - mc.thePlayer.closeScreen(); } else if (btn == guiButtonHideFull) { AEConfig.instance.showOnlyInterfacesWithFreeSlotsInInterfaceTerminal = !AEConfig.instance.showOnlyInterfacesWithFreeSlotsInInterfaceTerminal; this.refreshList(); @@ -473,6 +488,17 @@ public class GuiInterfaceTerminalWireless extends FCBaseMEGui implements IDropTo return false; } + private static class DimensionalCoordSide extends DimensionalCoord { + + private ForgeDirection side = ForgeDirection.UNKNOWN; + + public DimensionalCoordSide(final int _x, final int _y, final int _z, final int _dim, ForgeDirection side) { + super(_x, _y, _z, _dim); + this.side = side; + } + + } + public void postUpdate(final NBTTagCompound in) { if (in.getBoolean("clear")) { this.byId.clear(); @@ -491,7 +517,8 @@ public class GuiInterfaceTerminalWireless extends FCBaseMEGui implements IDropTo int Y = invData.getInteger("y"); int Z = invData.getInteger("z"); int dim = invData.getInteger("dim"); - blockPosHashMap.put(current, new DimensionalCoord(X, Y, Z, dim)); + ForgeDirection side = ForgeDirection.getOrientation(invData.getInteger("side")); + blockPosHashMap.put(current, new DimensionalCoordSide(X, Y, Z, dim, side)); for (int x = 0; x < current.getInventory().getSizeInventory(); x++) { final String which = Integer.toString(x); diff --git a/src/main/java/com/glodblock/github/client/gui/container/ContainerInterfaceWireless.java b/src/main/java/com/glodblock/github/client/gui/container/ContainerInterfaceWireless.java index a3e08eba..9d97dd49 100644 --- a/src/main/java/com/glodblock/github/client/gui/container/ContainerInterfaceWireless.java +++ b/src/main/java/com/glodblock/github/client/gui/container/ContainerInterfaceWireless.java @@ -10,9 +10,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.util.ForgeDirection; -import appeng.api.config.Settings; -import appeng.api.config.Upgrades; -import appeng.api.config.YesNo; +import appeng.api.config.*; import appeng.api.networking.IGrid; import appeng.api.networking.IGridNode; import appeng.api.networking.security.IActionHost; @@ -23,6 +21,7 @@ import appeng.helpers.DualityInterface; import appeng.helpers.IInterfaceHost; import appeng.helpers.InventoryAction; import appeng.items.misc.ItemEncodedPattern; +import appeng.parts.AEBasePart; import appeng.parts.misc.PartInterface; import appeng.parts.p2p.PartP2PInterface; import appeng.tile.inventory.AppEngInternalInventory; @@ -36,7 +35,9 @@ import appeng.util.inv.WrapperInvSlot; import com.glodblock.github.common.parts.PartFluidInterface; import com.glodblock.github.common.tile.TileFluidInterface; +import com.glodblock.github.inventory.item.IWirelessInterfaceTerminal; import com.glodblock.github.inventory.item.IWirelessTerminal; +import com.glodblock.github.util.Util; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; @@ -49,15 +50,22 @@ public class ContainerInterfaceWireless extends AEBaseContainer { private final Multimap diList = HashMultimap.create(); private final Map byId = new HashMap(); + private final IWirelessInterfaceTerminal it; // private final Map byId = new HashMap<>(); private IGrid grid; private NBTTagCompound data = new NBTTagCompound(); + private int ticks; + private final int slot; + private double powerMultiplier = 0.5; - public ContainerInterfaceWireless(final InventoryPlayer ip, final IWirelessTerminal anchor) { - super(ip, anchor); - + public ContainerInterfaceWireless(final InventoryPlayer ip, final IWirelessTerminal monitorable) { + super(ip, monitorable); + this.it = (IWirelessInterfaceTerminal) monitorable; + final int slotIndex = monitorable.getInventorySlot(); + this.lockPlayerInventorySlot(slotIndex); + this.slot = slotIndex; if (Platform.isServer()) { - this.grid = anchor.getActionableNode().getGrid(); + this.grid = monitorable.getActionableNode().getGrid(); } this.bindPlayerInventory(ip, 14, 0); @@ -73,12 +81,17 @@ public class ContainerInterfaceWireless extends AEBaseContainer { return union; } + private double getPowerMultiplier() { + return this.powerMultiplier; + } + @Override public void detectAndSendChanges() { if (Platform.isClient()) { return; } - + this.ticks = Util + .drainItemPower(this, this.getPlayerInv(), this.slot, this.ticks, this.getPowerMultiplier(), this.it); super.detectAndSendChanges(); if (this.grid == null) { @@ -311,6 +324,7 @@ public class ContainerInterfaceWireless extends AEBaseContainer { tag.setInteger("y", inv.Y); tag.setInteger("z", inv.Z); tag.setInteger("dim", inv.dim); + tag.setInteger("side", inv.side.ordinal()); } for (int x = 0; x < length; x++) { @@ -343,6 +357,7 @@ public class ContainerInterfaceWireless extends AEBaseContainer { private final int Y; private final int Z; private final int dim; + private final ForgeDirection side; public InvTracker(final DualityInterface dual, final IInventory patterns, final String unlocalizedName, int offset, int size) { @@ -355,6 +370,11 @@ public class ContainerInterfaceWireless extends AEBaseContainer { Y = dual.getLocation().y; Z = dual.getLocation().z; dim = dual.getLocation().getDimension(); + if (dual.getHost() instanceof AEBasePart) { + side = ((AEBasePart) dual.getHost()).getSide(); + } else { + side = ForgeDirection.UNKNOWN; + } } } diff --git a/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java b/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java index 745f9853..82cfc2e3 100644 --- a/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java +++ b/src/main/java/com/glodblock/github/coremod/FCClassTransformer.java @@ -40,6 +40,9 @@ public class FCClassTransformer implements IClassTransformer { case "appeng.core.sync.packets.PacketCompressedNBT": tform = PacketCompressedNBTTransformer.INSTANCE; break; + case "appeng.client.gui.implementations.GuiRenamer": + tform = GuiRenamerTransformer.INSTANCE; + break; default: return code; } diff --git a/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java b/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java index e1baa4b2..9a308533 100644 --- a/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java +++ b/src/main/java/com/glodblock/github/coremod/hooker/CoreModHooks.java @@ -8,6 +8,7 @@ import javax.annotation.Nullable; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiContainer; +import net.minecraft.entity.player.EntityPlayer; import net.minecraft.inventory.InventoryCrafting; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -31,15 +32,20 @@ import appeng.parts.misc.PartInterface; import appeng.tile.misc.TileInterface; import appeng.util.InventoryAdaptor; +import com.glodblock.github.FluidCraft; import com.glodblock.github.client.gui.GuiFluidCraftConfirm; import com.glodblock.github.client.gui.GuiInterfaceTerminalWireless; import com.glodblock.github.common.item.ItemFluidDrop; import com.glodblock.github.common.item.ItemFluidPacket; +import com.glodblock.github.common.item.ItemWirelessInterfaceTerminal; +import com.glodblock.github.common.item.ItemWirelessUltraTerminal; import com.glodblock.github.common.parts.PartFluidInterface; import com.glodblock.github.common.tile.TileFluidInterface; import com.glodblock.github.inventory.FluidConvertingInventoryAdaptor; import com.glodblock.github.inventory.FluidConvertingInventoryCrafting; +import com.glodblock.github.inventory.gui.GuiType; import com.glodblock.github.loader.ItemAndBlockHolder; +import com.glodblock.github.network.CPacketSwitchGuis; import com.glodblock.github.util.Ae2Reflect; import com.glodblock.github.util.SetBackedMachineSet; import com.google.common.collect.Sets; @@ -199,4 +205,12 @@ public class CoreModHooks { ((GuiInterfaceTerminalWireless) gs).postUpdate(data); } } + + public static void reopenInterfaceTerminal() { + EntityPlayer p = Minecraft.getMinecraft().thePlayer; + ItemStack c = p.getCurrentEquippedItem(); + if (c.getItem() instanceof ItemWirelessInterfaceTerminal || c.getItem() instanceof ItemWirelessUltraTerminal) { + FluidCraft.proxy.netHandler.sendToServer(new CPacketSwitchGuis(GuiType.WIRELESS_INTERFACE_TERMINAL, true)); + } + } } diff --git a/src/main/java/com/glodblock/github/coremod/transform/GuiRenamerTransformer.java b/src/main/java/com/glodblock/github/coremod/transform/GuiRenamerTransformer.java new file mode 100644 index 00000000..3173b768 --- /dev/null +++ b/src/main/java/com/glodblock/github/coremod/transform/GuiRenamerTransformer.java @@ -0,0 +1,59 @@ +package com.glodblock.github.coremod.transform; + +import org.objectweb.asm.ClassVisitor; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; + +import com.glodblock.github.coremod.FCClassTransformer; + +public class GuiRenamerTransformer extends FCClassTransformer.ClassMapper { + + public static final GuiRenamerTransformer INSTANCE = new GuiRenamerTransformer(); + + private GuiRenamerTransformer() { + // NO-OP + } + + @Override + protected ClassVisitor getClassMapper(ClassVisitor downstream) { + return new GuiRenamerTransformer.TransformGuiRenamer(Opcodes.ASM5, downstream); + } + + private static class TransformGuiRenamer extends ClassVisitor { + + TransformGuiRenamer(int api, ClassVisitor cv) { + super(api, cv); + } + + @Override + public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) { + if (name.equals("keyTyped")) { + return new GuiRenamerTransformer.TransformKeyTyped( + api, + super.visitMethod(access, name, desc, signature, exceptions)); + } + return super.visitMethod(access, name, desc, signature, exceptions); + } + } + + private static class TransformKeyTyped extends MethodVisitor { + + TransformKeyTyped(int api, MethodVisitor mv) { + super(api, mv); + } + + @Override + public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean itf) { + super.visitMethodInsn(opcode, owner, name, desc, itf); + if (owner.equals("net/minecraft/client/entity/EntityClientPlayerMP") && name.equals("closeScreen")) { + super.visitMethodInsn( + Opcodes.INVOKESTATIC, + "com/glodblock/github/coremod/hooker/CoreModHooks", + "reopenInterfaceTerminal", + "()V", + false); + } + } + + } +} diff --git a/src/main/java/com/glodblock/github/loader/ChannelLoader.java b/src/main/java/com/glodblock/github/loader/ChannelLoader.java index bdd47117..29feaa20 100644 --- a/src/main/java/com/glodblock/github/loader/ChannelLoader.java +++ b/src/main/java/com/glodblock/github/loader/ChannelLoader.java @@ -52,6 +52,8 @@ public class ChannelLoader implements Runnable { .registerMessage(new CPacketLevelMaintainer.Handler(), CPacketLevelMaintainer.class, id++, Side.SERVER); FluidCraft.proxy.netHandler .registerMessage(new SPacketSetItemAmount.Handler(), SPacketSetItemAmount.class, id++, Side.CLIENT); + FluidCraft.proxy.netHandler + .registerMessage(new CPacketRenamer.Handler(), CPacketRenamer.class, id++, Side.SERVER); } public static void sendPacketToAllPlayers(Packet packet, World world) { diff --git a/src/main/java/com/glodblock/github/network/CPacketRenamer.java b/src/main/java/com/glodblock/github/network/CPacketRenamer.java new file mode 100644 index 00000000..d9103b0f --- /dev/null +++ b/src/main/java/com/glodblock/github/network/CPacketRenamer.java @@ -0,0 +1,63 @@ +package com.glodblock.github.network; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.tileentity.TileEntity; +import net.minecraftforge.common.DimensionManager; +import net.minecraftforge.common.util.ForgeDirection; + +import appeng.core.sync.GuiBridge; +import appeng.util.Platform; +import cpw.mods.fml.common.network.simpleimpl.IMessage; +import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; +import cpw.mods.fml.common.network.simpleimpl.MessageContext; +import io.netty.buffer.ByteBuf; + +public class CPacketRenamer implements IMessage { + + private int x; + private int y; + private int z; + private int dim; + private ForgeDirection side; + + public CPacketRenamer() {} + + public CPacketRenamer(int x, int y, int z, int dim, ForgeDirection side) { + this.x = x; + this.y = y; + this.z = z; + this.dim = dim; + this.side = side; + } + + @Override + public void fromBytes(ByteBuf buf) { + this.x = buf.readInt(); + this.y = buf.readInt(); + this.z = buf.readInt(); + this.dim = buf.readInt(); + this.side = ForgeDirection.getOrientation(buf.readInt()); + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeInt(this.x); + buf.writeInt(this.y); + buf.writeInt(this.z); + buf.writeInt(this.dim); + buf.writeInt(side.ordinal()); + } + + public static class Handler implements IMessageHandler { + + @Override + public IMessage onMessage(CPacketRenamer message, MessageContext ctx) { + EntityPlayerMP player = ctx.getServerHandler().playerEntity; + TileEntity tile = DimensionManager.getWorld(message.dim).getTileEntity(message.x, message.y, message.z); + if (tile != null) { + Platform.openGUI(player, tile, message.side, GuiBridge.GUI_RENAMER); + } + return null; + } + } +} diff --git a/src/main/resources/assets/ae2fc/lang/en_US.lang b/src/main/resources/assets/ae2fc/lang/en_US.lang index 71a20b2b..9ed01f5b 100644 --- a/src/main/resources/assets/ae2fc/lang/en_US.lang +++ b/src/main/resources/assets/ae2fc/lang/en_US.lang @@ -110,6 +110,7 @@ ae2fc.tooltip.prio.hint=Disabled ae2fc.tooltip.submit=Submit ae2fc.tooltip.enable=Enabled ae2fc.tooltip.disable=Disabled +ae2fc.tooltip.edit=Edit ae2fc.gui.part_fluid_pattern_terminal=Fluid Pattern Terminal ae2fc.gui.part_fluid_pattern_terminal_ex=Fluid Processing Pattern Terminal diff --git a/src/main/resources/assets/ae2fc/lang/zh_CN.lang b/src/main/resources/assets/ae2fc/lang/zh_CN.lang index 3efa7fbc..13a70195 100644 --- a/src/main/resources/assets/ae2fc/lang/zh_CN.lang +++ b/src/main/resources/assets/ae2fc/lang/zh_CN.lang @@ -110,6 +110,7 @@ ae2fc.tooltip.prio.hint=禁用 ae2fc.tooltip.submit=提交 ae2fc.tooltip.enable=启用 ae2fc.tooltip.disable=禁用 +ae2fc.tooltip.edit=编辑 ae2fc.gui.part_fluid_pattern_terminal=ME流体样板终端 ae2fc.gui.part_fluid_pattern_terminal_ex=ME增广流体样板终端 diff --git a/src/main/resources/assets/ae2fc/textures/gui/renamer.png b/src/main/resources/assets/ae2fc/textures/gui/renamer.png new file mode 100644 index 00000000..a915b3af Binary files /dev/null and b/src/main/resources/assets/ae2fc/textures/gui/renamer.png differ diff --git a/src/main/resources/assets/ae2fc/textures/gui/states0.png b/src/main/resources/assets/ae2fc/textures/gui/states0.png index 5f49e054..39e33fad 100644 Binary files a/src/main/resources/assets/ae2fc/textures/gui/states0.png and b/src/main/resources/assets/ae2fc/textures/gui/states0.png differ