diff --git a/src/main/java/com/glodblock/github/client/gui/GuiPatternItemRenamer.java b/src/main/java/com/glodblock/github/client/gui/GuiPatternItemRenamer.java new file mode 100644 index 00000000..fb0bc91d --- /dev/null +++ b/src/main/java/com/glodblock/github/client/gui/GuiPatternItemRenamer.java @@ -0,0 +1,55 @@ +package com.glodblock.github.client.gui; + +import net.minecraft.entity.player.InventoryPlayer; + +import org.lwjgl.input.Keyboard; + +import com.glodblock.github.FluidCraft; +import com.glodblock.github.common.item.ItemWirelessUltraTerminal; +import com.glodblock.github.common.parts.PartFluidPatternTerminal; +import com.glodblock.github.common.parts.PartFluidPatternTerminalEx; +import com.glodblock.github.common.parts.PartFluidTerminal; +import com.glodblock.github.common.parts.PartLevelTerminal; +import com.glodblock.github.inventory.gui.GuiType; +import com.glodblock.github.inventory.item.IWirelessTerminal; +import com.glodblock.github.inventory.item.WirelessLevelTerminalInventory; +import com.glodblock.github.inventory.item.WirelessPatternTerminalInventory; +import com.glodblock.github.network.SPacketPatternItemRenamer; + +import appeng.api.storage.ITerminalHost; + +public class GuiPatternItemRenamer extends appeng.client.gui.implementations.GuiPatternItemRenamer { + + private GuiType originalGui; + + public GuiPatternItemRenamer(InventoryPlayer ip, ITerminalHost p) { + super(ip, p); + } + + @Override + protected void setOriginGUI(Object target) { + if (target instanceof PartFluidPatternTerminal) { + this.originalGui = GuiType.FLUID_PATTERN_TERMINAL; + } else if (target instanceof PartFluidPatternTerminalEx) { + this.originalGui = GuiType.FLUID_PATTERN_TERMINAL_EX; + } else if (target instanceof PartFluidTerminal) { + this.originalGui = GuiType.FLUID_TERMINAL; + } else if (target instanceof PartLevelTerminal) { + originalGui = GuiType.LEVEL_TERMINAL; + } else if (target instanceof IWirelessTerminal terminal && terminal.isUniversal(target)) { + this.originalGui = ItemWirelessUltraTerminal.readMode(terminal.getItemStack()); + } else if (target instanceof WirelessPatternTerminalInventory) { + this.originalGui = GuiType.FLUID_TERMINAL; + } else if (target instanceof WirelessLevelTerminalInventory) { + originalGui = GuiType.WIRELESS_LEVEL_TERMINAL; + } + } + + @Override + protected void keyTyped(final char character, final int key) { + if (key == Keyboard.KEY_RETURN || key == Keyboard.KEY_NUMPADENTER) { + FluidCraft.proxy.netHandler + .sendToServer(new SPacketPatternItemRenamer(originalGui, getText(), getValueIndex())); + } else super.keyTyped(character, key); + } +} diff --git a/src/main/java/com/glodblock/github/client/gui/base/FCGuiMonitor.java b/src/main/java/com/glodblock/github/client/gui/base/FCGuiMonitor.java index b1fa869b..ba9f372d 100644 --- a/src/main/java/com/glodblock/github/client/gui/base/FCGuiMonitor.java +++ b/src/main/java/com/glodblock/github/client/gui/base/FCGuiMonitor.java @@ -416,6 +416,9 @@ public abstract class FCGuiMonitor> extends FCBaseMEGui if (slot instanceof OptionalSlotFake || slot instanceof SlotFakeCraftingMatrix) { if (slot.getHasStack()) { InventoryAction action = InventoryAction.SET_PATTERN_VALUE; + if (isCtrlKeyDown()) { + action = InventoryAction.RENAME_PATTERN_ITEM; + } IAEItemStack stack = AEItemStack.create(slot.getStack()); ((AEBaseContainer) this.inventorySlots).setTargetStack(stack); for (int i = 0; i < this.inventorySlots.inventorySlots.size(); i++) { diff --git a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java index 49e5890f..84a05249 100644 --- a/src/main/java/com/glodblock/github/inventory/gui/GuiType.java +++ b/src/main/java/com/glodblock/github/inventory/gui/GuiType.java @@ -34,6 +34,7 @@ import com.glodblock.github.client.gui.GuiLevelMaintainer; import com.glodblock.github.client.gui.GuiLevelTerminal; import com.glodblock.github.client.gui.GuiLevelWireless; import com.glodblock.github.client.gui.GuiOCPatternEditor; +import com.glodblock.github.client.gui.GuiPatternItemRenamer; import com.glodblock.github.client.gui.GuiPatternMulti; import com.glodblock.github.client.gui.GuiPatternValueAmount; import com.glodblock.github.client.gui.GuiRenamer; @@ -84,6 +85,7 @@ import com.google.common.collect.ImmutableList; import appeng.api.storage.ITerminalHost; import appeng.container.implementations.ContainerCraftAmount; import appeng.container.implementations.ContainerCraftingStatus; +import appeng.container.implementations.ContainerPatternItemRenamer; import appeng.container.implementations.ContainerPriority; import appeng.helpers.IInterfaceHost; import appeng.helpers.IPriorityHost; @@ -527,6 +529,19 @@ public enum GuiType { protected Object createClientGui(EntityPlayer player, ITerminalHost inv) { return new GuiPatternMulti(player.inventory, inv); } + }), + + GUI_PATTERN_ITEM_RENAMER(new PartOrItemGuiFactory<>(ITerminalHost.class) { + + @Override + protected Object createServerGui(EntityPlayer player, ITerminalHost inv) { + return new ContainerPatternItemRenamer(player.inventory, inv); + } + + @Override + protected Object createClientGui(EntityPlayer player, ITerminalHost inv) { + return new GuiPatternItemRenamer(player.inventory, inv); + } }); public static final List VALUES = ImmutableList.copyOf(values()); diff --git a/src/main/java/com/glodblock/github/loader/ChannelLoader.java b/src/main/java/com/glodblock/github/loader/ChannelLoader.java index 1bccece4..dc91301c 100644 --- a/src/main/java/com/glodblock/github/loader/ChannelLoader.java +++ b/src/main/java/com/glodblock/github/loader/ChannelLoader.java @@ -23,6 +23,7 @@ import com.glodblock.github.network.SPacketFluidUpdate; import com.glodblock.github.network.SPacketLevelTerminalUpdate; import com.glodblock.github.network.SPacketMEFluidInvUpdate; import com.glodblock.github.network.SPacketMEItemInvUpdate; +import com.glodblock.github.network.SPacketPatternItemRenamer; import com.glodblock.github.network.SPacketSetItemAmount; import com.glodblock.github.network.SPacketStringUpdate; import com.glodblock.github.network.SPacketSwitchBack; @@ -81,6 +82,11 @@ public class ChannelLoader implements Runnable { Side.SERVER); netHandler .registerMessage(new CPacketPatternMultiSet.Handler(), CPacketPatternMultiSet.class, id++, Side.SERVER); + netHandler.registerMessage( + new SPacketPatternItemRenamer.Handler(), + SPacketPatternItemRenamer.class, + id++, + Side.SERVER); } public static void sendPacketToAllPlayers(Packet packet, World world) { diff --git a/src/main/java/com/glodblock/github/network/CPacketInventoryAction.java b/src/main/java/com/glodblock/github/network/CPacketInventoryAction.java index b4b96083..8a58a53f 100644 --- a/src/main/java/com/glodblock/github/network/CPacketInventoryAction.java +++ b/src/main/java/com/glodblock/github/network/CPacketInventoryAction.java @@ -24,6 +24,7 @@ import appeng.api.storage.data.IAEItemStack; import appeng.container.AEBaseContainer; import appeng.container.ContainerOpenContext; import appeng.container.implementations.ContainerCraftAmount; +import appeng.container.implementations.ContainerPatternItemRenamer; import appeng.helpers.InventoryAction; import appeng.util.item.AEItemStack; import cpw.mods.fml.common.network.simpleimpl.IMessage; @@ -187,7 +188,36 @@ public class CPacketInventoryAction implements IMessage { cpm.detectAndSendChanges(); } } - } else { + } else if (message.action == InventoryAction.RENAME_PATTERN_ITEM) { + final ContainerOpenContext context = baseContainer.getOpenContext(); + if (context != null) { + final TileEntity te = context.getTile(); + if (te != null) { + InventoryHandler.openGui( + sender, + te.getWorldObj(), + new BlockPos(te), + Objects.requireNonNull(baseContainer.getOpenContext().getSide()), + GuiType.GUI_PATTERN_ITEM_RENAMER); + } else if (target instanceof IWirelessTerminal wt) { + InventoryHandler.openGui( + sender, + sender.worldObj, + new BlockPos( + wt.getInventorySlot(), + Util.GuiHelper.encodeType(0, Util.GuiHelper.GuiType.ITEM), + 0), + ForgeDirection.UNKNOWN, + GuiType.GUI_PATTERN_ITEM_RENAMER); + } + if (sender.openContainer instanceof ContainerPatternItemRenamer cpir) { + if (baseContainer.getTargetStack() != null) { + cpir.getPatternValue().putStack(baseContainer.getTargetStack().getItemStack()); + } + cpir.detectAndSendChanges(); + } + } + }else { baseContainer.doAction(sender, message.action, message.slot, message.id); } } diff --git a/src/main/java/com/glodblock/github/network/SPacketPatternItemRenamer.java b/src/main/java/com/glodblock/github/network/SPacketPatternItemRenamer.java new file mode 100644 index 00000000..47b6833c --- /dev/null +++ b/src/main/java/com/glodblock/github/network/SPacketPatternItemRenamer.java @@ -0,0 +1,107 @@ +package com.glodblock.github.network; + +import java.util.Objects; + +import javax.annotation.Nullable; + +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.tileentity.TileEntity; + +import com.glodblock.github.client.gui.container.base.FCContainerEncodeTerminal; +import com.glodblock.github.inventory.InventoryHandler; +import com.glodblock.github.inventory.gui.GuiType; +import com.glodblock.github.inventory.item.IWirelessTerminal; +import com.glodblock.github.util.BlockPos; +import com.glodblock.github.util.Util; + +import appeng.container.ContainerOpenContext; +import appeng.container.implementations.ContainerPatternItemRenamer; +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 SPacketPatternItemRenamer implements IMessage { + + private GuiType guiType; + private String name = ""; + private int valueIndex; + + public SPacketPatternItemRenamer() {} + + public SPacketPatternItemRenamer(GuiType guiType, String text, int valIndex) { + this.guiType = guiType; + name = text; + valueIndex = valIndex; + } + + @Override + public void toBytes(ByteBuf buf) { + buf.writeByte(guiType != null ? guiType.ordinal() : 0); + buf.writeInt(valueIndex); + + buf.writeInt(name.length()); + for (int i = 0; i < name.length(); i++) { + buf.writeChar(name.charAt(i)); + } + } + + @Override + public void fromBytes(ByteBuf buf) { + guiType = GuiType.getByOrdinal(buf.readByte()); + valueIndex = buf.readInt(); + + int leName = buf.readInt(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < leName; i++) { + sb.append(buf.readChar()); + } + name = sb.toString(); + } + + public static class Handler implements IMessageHandler { + + @Nullable + @Override + public IMessage onMessage(SPacketPatternItemRenamer message, MessageContext ctx) { + EntityPlayerMP player = ctx.getServerHandler().playerEntity; + if (player.openContainer instanceof ContainerPatternItemRenamer cpv) { + ContainerOpenContext context = cpv.getOpenContext(); + if (context == null) { + return null; + } + TileEntity te = context.getTile(); + if (te != null) { + InventoryHandler.openGui( + player, + player.worldObj, + new BlockPos(te), + Objects.requireNonNull(context.getSide()), + message.guiType); + } else if (cpv.getTarget() instanceof IWirelessTerminal iwt) { + InventoryHandler.openGui( + player, + player.worldObj, + new BlockPos( + iwt.getInventorySlot(), + Util.GuiHelper.encodeType(0, Util.GuiHelper.GuiType.ITEM), + 0), + Objects.requireNonNull(context.getSide()), + message.guiType); + } + if (player.openContainer instanceof FCContainerEncodeTerminal) { + Slot slot = player.openContainer.getSlot(message.valueIndex); + if (slot != null && slot.getHasStack()) { + ItemStack nextStack = slot.getStack().copy(); + nextStack.setRepairCost(2); + nextStack.setStackDisplayName(message.name); + slot.putStack(nextStack); + } + } + } + return null; + } + } +}