From 58ff772e3cd3485f3cd92874dc63ba93b288c701 Mon Sep 17 00:00:00 2001 From: Kam Date: Mon, 3 Mar 2025 05:13:07 -0500 Subject: [PATCH] Magic GUI WIP Push --- .../kamkeel/npcs/network/PacketHandler.java | 8 + .../npcs/network/enums/EnumRequestPacket.java | 2 +- .../request/magic/MagicCycleRemovePacket.java | 52 +++ .../request/magic/MagicCycleSavePacket.java | 56 +++ .../request/magic/MagicGetAllPacket.java | 58 +++ .../request/magic/MagicRemovePacket.java | 52 +++ .../request/magic/MagicSavePacket.java | 56 +++ .../java/noppes/npcs/client/ClientProxy.java | 3 + .../client/gui/global/GuiNPCManageMagic.java | 53 --- .../client/gui/global/GuiNpcManageMagic.java | 410 ++++++++++++++++++ .../gui/magic/SubGuiMagicCycleEdit.java | 108 +++++ .../client/gui/magic/SubGuiMagicEdit.java | 60 +++ .../magic/SubGuiMagicInteractionsEdit.java | 100 +++++ .../gui/mainmenu/GuiNPCGlobalMainMenu.java | 8 + .../noppes/npcs/constants/EnumGuiType.java | 3 + .../npcs/controllers/MagicController.java | 50 +-- .../{MagicCategory.java => MagicCycle.java} | 4 +- .../assets/customnpcs/textures/gui/icons.png | Bin 5191 -> 5249 bytes 18 files changed, 1002 insertions(+), 81 deletions(-) create mode 100644 src/main/java/kamkeel/npcs/network/packets/request/magic/MagicCycleRemovePacket.java create mode 100644 src/main/java/kamkeel/npcs/network/packets/request/magic/MagicCycleSavePacket.java create mode 100644 src/main/java/kamkeel/npcs/network/packets/request/magic/MagicGetAllPacket.java create mode 100644 src/main/java/kamkeel/npcs/network/packets/request/magic/MagicRemovePacket.java create mode 100644 src/main/java/kamkeel/npcs/network/packets/request/magic/MagicSavePacket.java delete mode 100644 src/main/java/noppes/npcs/client/gui/global/GuiNPCManageMagic.java create mode 100644 src/main/java/noppes/npcs/client/gui/global/GuiNpcManageMagic.java create mode 100644 src/main/java/noppes/npcs/client/gui/magic/SubGuiMagicCycleEdit.java create mode 100644 src/main/java/noppes/npcs/client/gui/magic/SubGuiMagicEdit.java create mode 100644 src/main/java/noppes/npcs/client/gui/magic/SubGuiMagicInteractionsEdit.java rename src/main/java/noppes/npcs/controllers/data/{MagicCategory.java => MagicCycle.java} (96%) diff --git a/src/main/java/kamkeel/npcs/network/PacketHandler.java b/src/main/java/kamkeel/npcs/network/PacketHandler.java index 52c73929c..d2929e35d 100644 --- a/src/main/java/kamkeel/npcs/network/PacketHandler.java +++ b/src/main/java/kamkeel/npcs/network/PacketHandler.java @@ -44,6 +44,7 @@ import kamkeel.npcs.network.packets.request.jobs.JobSavePacket; import kamkeel.npcs.network.packets.request.jobs.JobSpawnerAddPacket; import kamkeel.npcs.network.packets.request.jobs.JobSpawnerRemovePacket; import kamkeel.npcs.network.packets.request.linked.*; +import kamkeel.npcs.network.packets.request.magic.*; import kamkeel.npcs.network.packets.request.mainmenu.*; import kamkeel.npcs.network.packets.request.naturalspawns.NaturalSpawnGetAllPacket; import kamkeel.npcs.network.packets.request.naturalspawns.NaturalSpawnGetPacket; @@ -334,6 +335,13 @@ public class PacketHandler { REQUEST_PACKET.registerPacket(new ProfileRenamePacket()); REQUEST_PACKET.registerPacket(new ProfileChangePacket()); + // Job Packets + REQUEST_PACKET.registerPacket(new MagicCycleRemovePacket()); + REQUEST_PACKET.registerPacket(new MagicCycleSavePacket()); + REQUEST_PACKET.registerPacket(new MagicGetAllPacket()); + REQUEST_PACKET.registerPacket(new MagicSavePacket()); + REQUEST_PACKET.registerPacket(new MagicRemovePacket()); + // Other Packets REQUEST_PACKET.registerPacket(new IsGuiOpenInform()); REQUEST_PACKET.registerPacket(new GuiRequestPacket()); diff --git a/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java b/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java index 9f7278368..9691dd554 100644 --- a/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java +++ b/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java @@ -195,5 +195,5 @@ public enum EnumRequestPacket { ProfileCreate, ProfileRemove, ProfileRename, - ProfileChange + MagicCycleRemove, MagicCycleSave, MagicGetAll, MagicRemove, MagicSave, ProfileChange } diff --git a/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicCycleRemovePacket.java b/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicCycleRemovePacket.java new file mode 100644 index 000000000..ce858ea2d --- /dev/null +++ b/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicCycleRemovePacket.java @@ -0,0 +1,52 @@ +package kamkeel.npcs.network.packets.request.magic; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import kamkeel.npcs.network.AbstractPacket; +import kamkeel.npcs.network.PacketChannel; +import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.enums.EnumRequestPacket; +import noppes.npcs.controllers.MagicController; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import java.io.IOException; + +public class MagicCycleRemovePacket extends AbstractPacket { + + public static String packetName = "Request|MagicCycleRemove"; + + private int cycleId; + + public MagicCycleRemovePacket() { } + + public MagicCycleRemovePacket(int cycleId) { + this.cycleId = cycleId; + } + + @Override + public Enum getType() { + return EnumRequestPacket.MagicCycleRemove; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.REQUEST_PACKET; + } + + @SideOnly(Side.CLIENT) + @Override + public void sendData(ByteBuf out) throws IOException { + out.writeInt(cycleId); + } + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + if (!(player instanceof EntityPlayerMP)) + return; + + int id = in.readInt(); + MagicController.getInstance().cycles.remove(id); + MagicController.getInstance().saveMagicData(); + } +} diff --git a/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicCycleSavePacket.java b/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicCycleSavePacket.java new file mode 100644 index 000000000..c95ea39de --- /dev/null +++ b/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicCycleSavePacket.java @@ -0,0 +1,56 @@ +package kamkeel.npcs.network.packets.request.magic; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import kamkeel.npcs.network.AbstractPacket; +import kamkeel.npcs.network.PacketChannel; +import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.enums.EnumRequestPacket; +import kamkeel.npcs.util.ByteBufUtils; +import noppes.npcs.controllers.MagicController; +import noppes.npcs.controllers.data.MagicCycle; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import java.io.IOException; + +public class MagicCycleSavePacket extends AbstractPacket { + + public static String packetName = "Request|MagicCycleSave"; + + private NBTTagCompound compound; + + public MagicCycleSavePacket() { } + + public MagicCycleSavePacket(NBTTagCompound compound) { + this.compound = compound; + } + + @Override + public Enum getType() { + return EnumRequestPacket.MagicCycleSave; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.REQUEST_PACKET; + } + + @SideOnly(Side.CLIENT) + @Override + public void sendData(ByteBuf out) throws IOException { + ByteBufUtils.writeNBT(out, compound); + } + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + if (!(player instanceof EntityPlayerMP)) + return; + NBTTagCompound comp = ByteBufUtils.readNBT(in); + MagicCycle cycle = new MagicCycle(); + cycle.readNBT(comp); + MagicController.getInstance().cycles.put(cycle.id, cycle); + MagicController.getInstance().saveMagicData(); + } +} diff --git a/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicGetAllPacket.java b/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicGetAllPacket.java new file mode 100644 index 000000000..e9f7d5a6b --- /dev/null +++ b/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicGetAllPacket.java @@ -0,0 +1,58 @@ +package kamkeel.npcs.network.packets.request.magic; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import kamkeel.npcs.network.AbstractPacket; +import kamkeel.npcs.network.PacketChannel; +import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.enums.EnumRequestPacket; +import kamkeel.npcs.network.packets.data.large.GuiDataPacket; +import noppes.npcs.controllers.MagicController; +import noppes.npcs.controllers.data.Magic; +import noppes.npcs.controllers.data.MagicCycle; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import java.io.IOException; + +public class MagicGetAllPacket extends AbstractPacket { + + public static String packetName = "Request|MagicGetAll"; + + public MagicGetAllPacket() { } + + @Override + public Enum getType() { + return EnumRequestPacket.MagicGetAll; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.REQUEST_PACKET; + } + + @SideOnly(Side.CLIENT) + @Override + public void sendData(ByteBuf out) throws IOException {} + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + if (!(player instanceof EntityPlayerMP)) + return; + + NBTTagCompound compound = new NBTTagCompound(); + StringBuilder cycleNames = new StringBuilder(); + for (MagicCycle cycle : MagicController.getInstance().cycles.values()) { + cycleNames.append(cycle.title).append(","); + } + compound.setString("CycleNames", cycleNames.toString()); + // Build comma-separated list of magic names. + StringBuilder magicNames = new StringBuilder(); + for (Magic magic : MagicController.getInstance().magics.values()) { + magicNames.append(magic.name).append(","); + } + compound.setString("MagicNames", magicNames.toString()); + GuiDataPacket.sendGuiData((EntityPlayerMP) player, compound); + } +} diff --git a/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicRemovePacket.java b/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicRemovePacket.java new file mode 100644 index 000000000..f53174cac --- /dev/null +++ b/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicRemovePacket.java @@ -0,0 +1,52 @@ +package kamkeel.npcs.network.packets.request.magic; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import kamkeel.npcs.network.AbstractPacket; +import kamkeel.npcs.network.PacketChannel; +import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.enums.EnumRequestPacket; +import noppes.npcs.controllers.MagicController; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import java.io.IOException; + +public class MagicRemovePacket extends AbstractPacket { + + public static String packetName = "Request|MagicRemove"; + + private int magicId; + + public MagicRemovePacket() { } + + public MagicRemovePacket(int magicId) { + this.magicId = magicId; + } + + @Override + public Enum getType() { + return EnumRequestPacket.MagicRemove; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.REQUEST_PACKET; + } + + @SideOnly(Side.CLIENT) + @Override + public void sendData(ByteBuf out) throws IOException { + out.writeInt(magicId); + } + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + if (!(player instanceof EntityPlayerMP)) + return; + + int id = in.readInt(); + MagicController.getInstance().magics.remove(id); + MagicController.getInstance().saveMagicData(); + } +} diff --git a/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicSavePacket.java b/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicSavePacket.java new file mode 100644 index 000000000..b66a4475e --- /dev/null +++ b/src/main/java/kamkeel/npcs/network/packets/request/magic/MagicSavePacket.java @@ -0,0 +1,56 @@ +package kamkeel.npcs.network.packets.request.magic; + +import cpw.mods.fml.relauncher.Side; +import cpw.mods.fml.relauncher.SideOnly; +import io.netty.buffer.ByteBuf; +import kamkeel.npcs.network.AbstractPacket; +import kamkeel.npcs.network.PacketChannel; +import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.enums.EnumRequestPacket; +import kamkeel.npcs.util.ByteBufUtils; +import noppes.npcs.controllers.MagicController; +import noppes.npcs.controllers.data.Magic; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import java.io.IOException; + +public class MagicSavePacket extends AbstractPacket { + + public static String packetName = "Request|MagicSave"; + + private NBTTagCompound compound; + + public MagicSavePacket() { } + + public MagicSavePacket(NBTTagCompound compound) { + this.compound = compound; + } + + @Override + public Enum getType() { + return EnumRequestPacket.MagicSave; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.REQUEST_PACKET; + } + + @SideOnly(Side.CLIENT) + @Override + public void sendData(ByteBuf out) throws IOException { + ByteBufUtils.writeNBT(out, compound); + } + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + if (!(player instanceof EntityPlayerMP)) + return; + + NBTTagCompound comp = ByteBufUtils.readNBT(in); + Magic magic = new Magic(); + magic.readNBT(comp); + MagicController.getInstance().saveMagic(magic); + } +} diff --git a/src/main/java/noppes/npcs/client/ClientProxy.java b/src/main/java/noppes/npcs/client/ClientProxy.java index c7dfa9a66..5a4b640e5 100644 --- a/src/main/java/noppes/npcs/client/ClientProxy.java +++ b/src/main/java/noppes/npcs/client/ClientProxy.java @@ -297,6 +297,9 @@ public class ClientProxy extends CommonProxy { else if (gui == EnumGuiType.ManageLinked) return new GuiNPCManageLinked(npc); + else if (gui == EnumGuiType.ManageMagic) + return new GuiNpcManageMagic(npc); + else if (gui == EnumGuiType.ManageTransport) return new GuiNPCManageTransporters(npc); diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageMagic.java b/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageMagic.java deleted file mode 100644 index e1b35b31e..000000000 --- a/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageMagic.java +++ /dev/null @@ -1,53 +0,0 @@ -package noppes.npcs.client.gui.global; - -import noppes.npcs.client.gui.GuiMagicMap; -import noppes.npcs.client.gui.util.GuiNPCInterface2; -import noppes.npcs.entity.EntityNPCInterface; - -public class GuiNPCManageMagic extends GuiNPCInterface2 { - - private GuiMagicMap magicMap; - - public GuiNPCManageMagic(EntityNPCInterface npc) { - super(npc); - } - - @Override - public void initGui() { - super.initGui(); - // Position the map in a designated area (e.g., right panel) - int mapX = guiLeft + xSize - 230 + 10; - int mapY = guiTop + 10; - int mapWidth = 210; - int mapHeight = 200; - - magicMap = new GuiMagicMap(this, mapX, mapY, mapWidth, mapHeight); - addDiagram(0, magicMap); - } - - @Override - public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { - if (magicMap != null) { - magicMap.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick); - } - super.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick); - } - - @Override - protected void mouseMovedOrUp(int mouseX, int mouseY, int state) { - if (magicMap != null) { - magicMap.mouseReleased(mouseX, mouseY, state); - } - super.mouseMovedOrUp(mouseX, mouseY, state); - } - - @Override - protected void actionPerformed(net.minecraft.client.gui.GuiButton button) { - // your existing action handling - } - - @Override - public void save() { - // your save logic - } -} diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiNpcManageMagic.java b/src/main/java/noppes/npcs/client/gui/global/GuiNpcManageMagic.java new file mode 100644 index 000000000..94d02b406 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/global/GuiNpcManageMagic.java @@ -0,0 +1,410 @@ +package noppes.npcs.client.gui.global; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +import kamkeel.npcs.network.PacketClient; +import kamkeel.npcs.network.packets.request.magic.MagicCycleRemovePacket; +import kamkeel.npcs.network.packets.request.magic.MagicCycleSavePacket; +import kamkeel.npcs.network.packets.request.magic.MagicGetAllPacket; +import kamkeel.npcs.network.packets.request.magic.MagicRemovePacket; +import kamkeel.npcs.network.packets.request.magic.MagicSavePacket; +import noppes.npcs.client.gui.magic.SubGuiMagicCycleEdit; +import noppes.npcs.client.gui.magic.SubGuiMagicEdit; +import noppes.npcs.client.gui.magic.SubGuiMagicInteractionsEdit; +import noppes.npcs.client.gui.util.*; +import noppes.npcs.controllers.MagicController; +import noppes.npcs.controllers.data.Magic; +import noppes.npcs.controllers.data.MagicCycle; +import noppes.npcs.entity.EntityNPCInterface; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.nbt.NBTTagCompound; +import org.lwjgl.input.Mouse; + +import static noppes.npcs.client.gui.player.inventory.GuiCNPCInventory.specialIcons; + +public class GuiNpcManageMagic extends GuiNPCInterface2 implements ISubGuiListener, ICustomScrollListener, IGuiData { + + private GuiCustomScroll leftScroll; // left scroll for cycles (viewByCycle) + private GuiCustomScroll rightScroll; // right scroll for magics + + // Toggle mode: false = view all magics; true = view by cycle + private boolean viewByCycle = false; + + private HashMap cycleData = new HashMap<>(); + private HashMap magicData = new HashMap<>(); + + private MagicCycle selectedCycle; + private Magic selectedMagic; + + // Divider/resizing variables (only used when viewByCycle is true) + private boolean isResizing = false; + private int initialDragX = 0; + private int dividerOffset = 143; // initial offset from regionLeft + private final int dividerWidth = 5; + private final int minScrollWidth = 50; + private int dividerLineHeight = 20; + private int dividerLineYOffset = 0; + + // Search strings – IDs 55 and 66 are used for search text fields + private String cycleSearch = ""; + private String magicSearch = ""; + + public GuiNpcManageMagic(EntityNPCInterface npc) { + super(npc); + PacketClient.sendClient(new MagicGetAllPacket()); + } + + @Override + public void initGui() { + super.initGui(); + int y = guiTop + 5; + + addButton(new GuiToggleButton(50, guiLeft + 368, guiTop + ySize - 10, viewByCycle)); + ((GuiToggleButton) getButton(50)).setTextureOff(specialIcons).setTextureOffPos( 16, 0); + ((GuiToggleButton) getButton(50)).setIconTexture(specialIcons).setIconPos( 16, 16, 16, 0 ); + + if (!viewByCycle) { + // Define horizontal region (similar to your quest GUI) + int regionLeft = guiLeft + 64; + int regionRight = guiLeft + 355; + int dividerX = regionLeft + dividerOffset; + + // Left scroll (cycles) + if (leftScroll == null) { + leftScroll = new GuiCustomScroll(this, 0, 0); + } + leftScroll.guiLeft = regionLeft; + leftScroll.guiTop = y; + leftScroll.setSize(dividerX - regionLeft, 185); + this.addScroll(leftScroll); + + // Right scroll (magics for selected cycle) + if (rightScroll == null) { + rightScroll = new GuiCustomScroll(this, 1, 0); + } + rightScroll.guiLeft = dividerX + dividerWidth; + rightScroll.guiTop = y; + rightScroll.setSize(regionRight - (dividerX + dividerWidth), 185); + this.addScroll(rightScroll); + + // Add search bars below each scroll – using text field IDs 55 and 66 + addTextField(new GuiNpcTextField(55, this, fontRendererObj, regionLeft, y + 185 + 3, dividerX - regionLeft, 20, cycleSearch)); + addTextField(new GuiNpcTextField(66, this, fontRendererObj, dividerX + dividerWidth, y + 185 + 3, regionRight - (dividerX + dividerWidth), 20, magicSearch)); + + // Left side cycle management buttons (mirroring your quest GUI style) + addButton(new GuiNpcButton(10, guiLeft + 3, guiTop + 8, 58, 20, "Cycles")); + getButton(10).setEnabled(false); + addButton(new GuiNpcButton(4, guiLeft + 3, guiTop + 38, 58, 20, "gui.add")); + addButton(new GuiNpcButton(5, guiLeft + 3, guiTop + 61, 58, 20, "gui.remove")); + addButton(new GuiNpcButton(6, guiLeft + 3, guiTop + 94, 58, 20, "gui.edit")); + + // Right side magic management buttons + addButton(new GuiNpcButton(33, guiLeft + 358, guiTop + 8, 58, 20, "Magics")); + getButton(33).setEnabled(false); + + addButton(new GuiNpcButton(0, guiLeft + 358, guiTop + 38, 58, 20, "gui.add")); + addButton(new GuiNpcButton(1, guiLeft + 358, guiTop + 61, 58, 20, "gui.remove")); + + addButton(new GuiNpcButton(2, guiLeft + 358, guiTop + 94, 58, 20, "gui.edit")); + } else { + // Default mode: one list for all magics plus one search bar + if (rightScroll == null) { + rightScroll = new GuiCustomScroll(this, 1, 0); + } + rightScroll.guiLeft = guiLeft + 10; + rightScroll.guiTop = y; + rightScroll.setSize(xSize - 75, 185); + this.addScroll(rightScroll); + addTextField(new GuiNpcTextField(66, this, fontRendererObj, guiLeft + 10, y + 185 + 3, xSize - 75, 20, magicSearch)); + + addButton(new GuiNpcButton(33, guiLeft + 358, guiTop + 8, 58, 20, "Magics")); + getButton(33).setEnabled(false); + + // Global magic management buttons + addButton(new GuiNpcButton(0, guiLeft + 358, guiTop + 38, 58, 20, "gui.add")); + addButton(new GuiNpcButton(1, guiLeft + 358, guiTop + 61, 58, 20, "gui.remove")); + + addButton(new GuiNpcButton(2, guiLeft + 358, guiTop + 94, 58, 20, "gui.edit")); + } + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + super.drawScreen(mouseX, mouseY, partialTicks); + if (!viewByCycle && !hasSubGui()) { + int regionLeft = guiLeft + 64; + int dividerX = regionLeft + dividerOffset; + int regionTop = guiTop + 30; + int regionHeight = 185; + int handleTop = regionTop + (regionHeight - dividerLineHeight) / 2 + dividerLineYOffset; + drawRect(dividerX + 1, handleTop, dividerX + dividerWidth - 1, handleTop + dividerLineHeight, 0xFF707070); + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) { + if (!viewByCycle && !hasSubGui()) { + int regionLeft = guiLeft + 64; + int dividerX = regionLeft + dividerOffset; + int regionTop = guiTop + 30; + int regionHeight = 185; + int handleTop = regionTop + (regionHeight - dividerLineHeight) / 2 + dividerLineYOffset; + int handleBottom = handleTop + dividerLineHeight; + if (mouseX >= dividerX && mouseX <= dividerX + dividerWidth && + mouseY >= handleTop && mouseY <= handleBottom) { + isResizing = true; + resizingActive = true; + initialDragX = mouseX; + return; + } + } + super.mouseClicked(mouseX, mouseY, mouseButton); + } + + @Override + public void save() {} + + @Override + public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { + if (!viewByCycle && isResizing) { + int dx = mouseX - initialDragX; + initialDragX = mouseX; + dividerOffset += dx; + int regionLeft = guiLeft + 64; + int regionRight = guiLeft + 355; + int minOffset = minScrollWidth; + int maxOffset = (regionRight - regionLeft) - dividerWidth - minScrollWidth; + if (dividerOffset < minOffset) { + dividerOffset = minOffset; + } + if (dividerOffset > maxOffset) { + dividerOffset = maxOffset; + } + int dividerX = regionLeft + dividerOffset; + leftScroll.setSize(dividerX - regionLeft, 185); + rightScroll.guiLeft = dividerX + dividerWidth; + rightScroll.setSize(regionRight - (dividerX + dividerWidth), 185); + // Update search field sizes + if (getTextField(55) != null) { + getTextField(55).width = dividerX - regionLeft; + } + if (getTextField(66) != null) { + getTextField(66).width = regionRight - (dividerX + dividerWidth); + getTextField(66).xPosition = dividerX + dividerWidth; + } + return; + } + super.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick); + } + + @Override + protected void mouseMovedOrUp(int mouseX, int mouseY, int state) { + if (isResizing) { + isResizing = false; + resizingActive = false; + return; + } + super.mouseMovedOrUp(mouseX, mouseY, state); + } + + @Override + public void keyTyped(char c, int i) { + super.keyTyped(c, i); + if (!viewByCycle) { + if (getTextField(55) != null && getTextField(55).isFocused()) { + if (!cycleSearch.equals(getTextField(55).getText())) { + cycleSearch = getTextField(55).getText().toLowerCase(); + leftScroll.resetScroll(); + leftScroll.setList(getCycleSearch()); + } + } + } + if (getTextField(66) != null && getTextField(66).isFocused()) { + if (!magicSearch.equals(getTextField(66).getText())) { + magicSearch = getTextField(66).getText().toLowerCase(); + rightScroll.resetScroll(); + rightScroll.setList(getMagicSearch()); + } + } + } + + private List getCycleSearch() { + if (cycleSearch.isEmpty()) { + return new ArrayList<>(cycleData.keySet()); + } + List list = new ArrayList<>(); + for (String name : cycleData.keySet()) { + if (name.toLowerCase().contains(cycleSearch)) + list.add(name); + } + return list; + } + + private List getMagicSearch() { + if (magicSearch.isEmpty()) { + return new ArrayList<>(magicData.keySet()); + } + List list = new ArrayList<>(); + for (String name : magicData.keySet()) { + if (name.toLowerCase().contains(magicSearch)) + list.add(name); + } + return list; + } + + @Override + public void actionPerformed(GuiButton button) { + switch (button.id) { + case 50: + viewByCycle = !viewByCycle; + initGui(); + return; + // Left side: Cycle management + case 4: // Add Cycle + { + NBTTagCompound cycleCompound = new NBTTagCompound(); + cycleCompound.setString("Title", "New Cycle"); + PacketClient.sendClient(new MagicCycleSavePacket(cycleCompound)); + } + break; + case 5: // Remove Cycle + if (selectedCycle != null) { + PacketClient.sendClient(new MagicCycleRemovePacket(selectedCycle.id)); + } + break; + case 6: // Edit Cycle + if (selectedCycle != null) { + setSubGui(new SubGuiMagicCycleEdit(selectedCycle)); + } + break; + // Right side: Magic management (in viewByCycle) + case 0: // Add Magic to selected cycle + if (selectedCycle != null) { + NBTTagCompound magicCompound = new NBTTagCompound(); + magicCompound.setString("Name", "New Magic"); + magicCompound.setInteger("CycleID", selectedCycle.id); + magicCompound.setInteger("Index", 0); + magicCompound.setInteger("Priority", 0); + PacketClient.sendClient(new MagicSavePacket(magicCompound)); + } + break; + case 1: // Edit Magic + if (selectedMagic != null) { + setSubGui(new SubGuiMagicEdit(selectedMagic)); + } + break; + case 2: // Remove Magic + if (selectedMagic != null) { + PacketClient.sendClient(new MagicRemovePacket(selectedMagic.id)); + } + break; + case 3: // Edit Interactions + if (selectedMagic != null) { + setSubGui(new SubGuiMagicInteractionsEdit(selectedMagic)); + } + break; + // Default mode buttons (global view) + case 21: + if (selectedMagic != null) { + setSubGui(new SubGuiMagicEdit(selectedMagic)); + } + break; + case 22: + if (selectedMagic != null) { + PacketClient.sendClient(new MagicRemovePacket(selectedMagic.id)); + } + break; + case 23: + if (selectedMagic != null) { + setSubGui(new SubGuiMagicInteractionsEdit(selectedMagic)); + } + break; + } + } + + @Override + public void customScrollClicked(int id, int index, int clickType, GuiCustomScroll scroll) { + if (!viewByCycle) { + if (scroll.id == 0) { // Left scroll: cycles + String cycleName = scroll.getSelected(); + for (MagicCycle cycle : MagicController.getInstance().cycles.values()) { + if (cycle.title.equals(cycleName)) { + selectedCycle = cycle; + break; + } + } + // Update right scroll with magics in selected cycle + if (selectedCycle != null) { + List magicNames = new ArrayList<>(); + for (Integer magicId : selectedCycle.associations.keySet()) { + Magic m = MagicController.getInstance().magics.get(magicId); + if (m != null) { + magicNames.add(m.name); + } + } + rightScroll.setList(magicNames); + } + } else if (scroll.id == 1) { // Right scroll: magics + String magicName = scroll.getSelected(); + for (Magic m : MagicController.getInstance().magics.values()) { + if (m.name.equals(magicName)) { + selectedMagic = m; + break; + } + } + } + } else { + if (scroll.id == 1) { + String magicName = scroll.getSelected(); + for (Magic m : MagicController.getInstance().magics.values()) { + if (m.name.equals(magicName)) { + selectedMagic = m; + break; + } + } + } + } + } + + @Override + public void customScrollDoubleClicked(String selection, GuiCustomScroll scroll) {} + + @Override + public void subGuiClosed(SubGuiInterface subgui) { + PacketClient.sendClient(new MagicGetAllPacket()); + initGui(); + } + + @Override + public void setGuiData(NBTTagCompound compound) { + cycleData.clear(); + magicData.clear(); + if (compound.hasKey("CycleNames")) { + String cyclesStr = compound.getString("CycleNames"); + String[] names = cyclesStr.split(","); + int id = 0; + for (String name : names) { + if (!name.trim().isEmpty()) { + cycleData.put(name.trim(), id++); + } + } + } + if (compound.hasKey("MagicNames")) { + String magicsStr = compound.getString("MagicNames"); + String[] names = magicsStr.split(","); + int id = 0; + for (String name : names) { + if (!name.trim().isEmpty()) { + magicData.put(name.trim(), id++); + } + } + } + if (!viewByCycle) { + leftScroll.setList(new ArrayList<>(cycleData.keySet())); + } + rightScroll.setList(new ArrayList<>(magicData.keySet())); + initGui(); + } +} diff --git a/src/main/java/noppes/npcs/client/gui/magic/SubGuiMagicCycleEdit.java b/src/main/java/noppes/npcs/client/gui/magic/SubGuiMagicCycleEdit.java new file mode 100644 index 000000000..0b7b6a996 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/magic/SubGuiMagicCycleEdit.java @@ -0,0 +1,108 @@ +package noppes.npcs.client.gui.magic; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import kamkeel.npcs.network.PacketClient; +import kamkeel.npcs.network.packets.request.magic.MagicCycleSavePacket; +import net.minecraft.client.gui.GuiButton; +import noppes.npcs.client.gui.util.*; +import noppes.npcs.controllers.data.MagicAssociation; +import noppes.npcs.controllers.data.MagicCycle; +import net.minecraft.nbt.NBTTagCompound; + +public class SubGuiMagicCycleEdit extends SubGuiInterface implements ITextfieldListener { + + private MagicCycle cycle; + private GuiCustomScroll assocScroll; + private List assocList = new ArrayList<>(); + + public SubGuiMagicCycleEdit(MagicCycle cycle) { + this.cycle = cycle; + setBackground("menubg.png"); + xSize = 360; + ySize = 240; + } + + @Override + public void initGui() { + super.initGui(); + addLabel(new GuiNpcLabel(0, "Cycle: " + cycle.title, guiLeft + 4, guiTop + 4)); + + // Build list of associations in the cycle (format: "MagicID: X | Index: Y | Priority: Z") + assocList.clear(); + for (Map.Entry entry : cycle.associations.entrySet()) { + MagicAssociation assoc = entry.getValue(); + assocList.add("MagicID: " + entry.getKey() + " | Index: " + assoc.index + " | Priority: " + assoc.priority); + } + if (assocScroll == null) { + assocScroll = new GuiCustomScroll(this, 0, 0); + } + assocScroll.guiLeft = guiLeft + 4; + assocScroll.guiTop = guiTop + 20; + assocScroll.setSize(200, 100); + assocScroll.setList(assocList); + this.addScroll(assocScroll); + + // Text fields for editing the selected association’s index and priority + addLabel(new GuiNpcLabel(1, "Index:", guiLeft + 210, guiTop + 30)); + addTextField(new GuiNpcTextField(1, this, fontRendererObj, guiLeft + 250, guiTop + 26, 50, 20, "")); + addLabel(new GuiNpcLabel(2, "Priority:", guiLeft + 210, guiTop + 60)); + addTextField(new GuiNpcTextField(2, this, fontRendererObj, guiLeft + 250, guiTop + 56, 50, 20, "")); + + // Buttons to update or remove the selected association + addButton(new GuiNpcButton(10, guiLeft + 210, guiTop + 90, 70, 20, "Update")); + addButton(new GuiNpcButton(11, guiLeft + 290, guiTop + 90, 70, 20, "Remove")); + + // Done button to save cycle changes via packet + addButton(new GuiNpcButton(99, guiLeft + 4, guiTop + 130, 60, 20, "Done")); + } + + @Override + public void actionPerformed(GuiButton button) { + if (button.id == 10) { // Update association + String selected = assocScroll.getSelected(); + if (selected != null && !selected.isEmpty()) { + try { + String[] parts = selected.split(" "); + int magicId = Integer.parseInt(parts[1]); + MagicAssociation assoc = cycle.associations.get(magicId); + if (assoc != null) { + int newIndex = Integer.parseInt(getTextField(1).getText()); + int newPriority = Integer.parseInt(getTextField(2).getText()); + assoc.index = newIndex; + assoc.priority = newPriority; + } + } catch (NumberFormatException e) { + // Handle parse error if needed. + } + initGui(); + } + } + if (button.id == 11) { // Remove association + String selected = assocScroll.getSelected(); + if (selected != null && !selected.isEmpty()) { + try { + String[] parts = selected.split(" "); + int magicId = Integer.parseInt(parts[1]); + cycle.associations.remove(magicId); + } catch (NumberFormatException e) { + // Handle error if needed. + } + initGui(); + } + } + if (button.id == 99) { // Done: send save packet + NBTTagCompound compound = new NBTTagCompound(); + cycle.writeNBT(compound); + PacketClient.sendClient(new MagicCycleSavePacket(compound)); + close(); + } + } + + @Override + public void unFocused(GuiNpcTextField textfield) { + + } +} diff --git a/src/main/java/noppes/npcs/client/gui/magic/SubGuiMagicEdit.java b/src/main/java/noppes/npcs/client/gui/magic/SubGuiMagicEdit.java new file mode 100644 index 000000000..42a1bec9e --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/magic/SubGuiMagicEdit.java @@ -0,0 +1,60 @@ +package noppes.npcs.client.gui.magic; + +import kamkeel.npcs.network.PacketClient; +import kamkeel.npcs.network.packets.request.magic.MagicSavePacket; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.nbt.NBTTagCompound; +import noppes.npcs.client.gui.util.*; +import noppes.npcs.controllers.data.Magic; + +public class SubGuiMagicEdit extends SubGuiInterface implements ITextfieldListener { + + private Magic magic; + + public SubGuiMagicEdit(Magic magic) { + this.magic = magic; + setBackground("menubg.png"); + xSize = 360; + ySize = 240; + } + + @Override + public void initGui() { + super.initGui(); + // Display the Magic's ID + addLabel(new GuiNpcLabel(0, "ID: " + magic.id, guiLeft + 4, guiTop + 4)); + + // Edit Magic Name + addLabel(new GuiNpcLabel(1, "Name:", guiLeft + 4, guiTop + 28)); + addTextField(new GuiNpcTextField(1, this, fontRendererObj, guiLeft + 60, guiTop + 24, 200, 20, magic.name)); + + // Edit Magic Display Name + addLabel(new GuiNpcLabel(2, "Display Name:", guiLeft + 4, guiTop + 52)); + addTextField(new GuiNpcTextField(2, this, fontRendererObj, guiLeft + 90, guiTop + 48, 200, 20, magic.displayName)); + + // Button to edit interactions + addButton(new GuiNpcButton(10, guiLeft + 4, guiTop + 80, 120, 20, "Edit Interactions")); + + // Done button to save changes + addButton(new GuiNpcButton(99, guiLeft + 4, guiTop + 110, 60, 20, "Done")); + } + + @Override + public void actionPerformed(GuiButton button) { + if (button.id == 10) { + setSubGui(new SubGuiMagicInteractionsEdit(magic)); + } + if (button.id == 99) { + // Update magic fields and send save packet + magic.name = getTextField(1).getText(); + magic.displayName = getTextField(2).getText(); + NBTTagCompound compound = new NBTTagCompound(); + magic.writeNBT(compound); + PacketClient.sendClient(new MagicSavePacket(compound)); + close(); + } + } + + @Override + public void unFocused(GuiNpcTextField textField) {} +} diff --git a/src/main/java/noppes/npcs/client/gui/magic/SubGuiMagicInteractionsEdit.java b/src/main/java/noppes/npcs/client/gui/magic/SubGuiMagicInteractionsEdit.java new file mode 100644 index 000000000..0419cf3a8 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/magic/SubGuiMagicInteractionsEdit.java @@ -0,0 +1,100 @@ +package noppes.npcs.client.gui.magic; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import kamkeel.npcs.network.PacketClient; +import net.minecraft.client.gui.GuiButton; +import noppes.npcs.client.gui.util.*; +import noppes.npcs.controllers.data.Magic; +import net.minecraft.nbt.NBTTagCompound; + +public class SubGuiMagicInteractionsEdit extends SubGuiInterface implements ITextfieldListener { + + private Magic magic; + private GuiCustomScroll interactionsScroll; + private List interactionsList = new ArrayList<>(); + + public SubGuiMagicInteractionsEdit(Magic magic) { + this.magic = magic; + setBackground("menubg.png"); + xSize = 360; + ySize = 280; + } + + @Override + public void initGui() { + super.initGui(); + addLabel(new GuiNpcLabel(0, "Edit Interactions: " + magic.name, guiLeft + 4, guiTop + 4)); + + // Build interactions list from magic.interactions map. + interactionsList.clear(); + for (Map.Entry entry : magic.interactions.entrySet()) { + interactionsList.add("MagicID: " + entry.getKey() + " | Percent: " + entry.getValue()); + } + if (interactionsScroll == null) { + interactionsScroll = new GuiCustomScroll(this, 0, 0); + } + interactionsScroll.guiLeft = guiLeft + 4; + interactionsScroll.guiTop = guiTop + 20; + interactionsScroll.setSize(200, 100); + interactionsScroll.setList(interactionsList); + this.addScroll(interactionsScroll); + + // Text fields for adding/updating an interaction + addLabel(new GuiNpcLabel(1, "Target Magic ID:", guiLeft + 210, guiTop + 30)); + addTextField(new GuiNpcTextField(1, this, fontRendererObj, guiLeft + 310, guiTop + 26, 40, 20, "")); + addLabel(new GuiNpcLabel(2, "Percent:", guiLeft + 210, guiTop + 60)); + addTextField(new GuiNpcTextField(2, this, fontRendererObj, guiLeft + 310, guiTop + 56, 40, 20, "")); + + // Buttons to add, update, or remove an interaction + addButton(new GuiNpcButton(10, guiLeft + 210, guiTop + 90, 70, 20, "Add")); + addButton(new GuiNpcButton(11, guiLeft + 290, guiTop + 90, 70, 20, "Update")); + addButton(new GuiNpcButton(12, guiLeft + 210, guiTop + 115, 70, 20, "Remove")); + + // Done button to send changes + addButton(new GuiNpcButton(99, guiLeft + 4, guiTop + 240, 60, 20, "Done")); + } + + @Override + public void actionPerformed(GuiButton button) { + if (button.id == 10) { // Add interaction + try { + int targetId = Integer.parseInt(getTextField(1).getText()); + float percent = Float.parseFloat(getTextField(2).getText()); + magic.interactions.put(targetId, percent); + } catch (NumberFormatException e) { } + initGui(); + } + if (button.id == 11) { // Update interaction + String selected = interactionsScroll.getSelected(); + if (selected != null && !selected.isEmpty()) { + try { + int targetId = Integer.parseInt(selected.split(" ")[1]); + float percent = Float.parseFloat(getTextField(2).getText()); + magic.interactions.put(targetId, percent); + } catch (NumberFormatException e) { } + initGui(); + } + } + if (button.id == 12) { // Remove interaction + String selected = interactionsScroll.getSelected(); + if (selected != null && !selected.isEmpty()) { + try { + int targetId = Integer.parseInt(selected.split(" ")[1]); + magic.interactions.remove(targetId); + } catch (NumberFormatException e) { } + initGui(); + } + } + + if (button.id == 99) { + close(); + } + } + + @Override + public void unFocused(noppes.npcs.client.gui.util.GuiNpcTextField textField) { + } +} diff --git a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNPCGlobalMainMenu.java b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNPCGlobalMainMenu.java index a4b38906e..1a5f413bb 100644 --- a/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNPCGlobalMainMenu.java +++ b/src/main/java/noppes/npcs/client/gui/mainmenu/GuiNPCGlobalMainMenu.java @@ -32,6 +32,7 @@ public class GuiNPCGlobalMainMenu extends GuiNPCInterface2 { private GuiNpcSquareButton animationButton; private GuiNpcSquareButton tagButton; private GuiNpcSquareButton effectsButton; + private GuiNpcSquareButton magicsButton; public GuiNPCGlobalMainMenu(EntityNPCInterface npc) { super(npc, 5); @@ -85,6 +86,10 @@ public class GuiNPCGlobalMainMenu extends GuiNPCInterface2 { registerButton(effectsButton = new GuiNpcSquareButton(19, 0, 0, 20, "global.customeffects", 0xFF333333)); effectsButton.setIconPos(24, 24, 24, 56).setIconTexture(specialIcons); + registerButton(magicsButton = new GuiNpcSquareButton(20, 0, 0, 20, "global.magic", 0xFF333333)); + magicsButton.setIconPos(24, 24, 48, 56).setIconTexture(specialIcons); + + // Layout composite buttons optimally. layoutButtons(); // Add all composite buttons to the GUI. @@ -220,6 +225,9 @@ public class GuiNPCGlobalMainMenu extends GuiNPCInterface2 { if (id == 16) { NoppesUtil.requestOpenGUI(EnumGuiType.ManageLinked); } + if (id == 20) { + NoppesUtil.requestOpenGUI(EnumGuiType.ManageMagic); + } if (id == 19) { NoppesUtil.requestOpenGUI(EnumGuiType.ManageEffects); } diff --git a/src/main/java/noppes/npcs/constants/EnumGuiType.java b/src/main/java/noppes/npcs/constants/EnumGuiType.java index b95544a8a..c35c619c0 100644 --- a/src/main/java/noppes/npcs/constants/EnumGuiType.java +++ b/src/main/java/noppes/npcs/constants/EnumGuiType.java @@ -1,5 +1,7 @@ package noppes.npcs.constants; +import noppes.npcs.scripted.ScriptBlock; + public enum EnumGuiType { MainMenuDisplay, MainMenuInv, @@ -58,6 +60,7 @@ public enum EnumGuiType { CompanionTalent, CompanionTrader, ManageLinked, + ManageMagic, CustomGui, ScriptItem, ScriptBlock, diff --git a/src/main/java/noppes/npcs/controllers/MagicController.java b/src/main/java/noppes/npcs/controllers/MagicController.java index 244cd11e0..e04238742 100644 --- a/src/main/java/noppes/npcs/controllers/MagicController.java +++ b/src/main/java/noppes/npcs/controllers/MagicController.java @@ -8,7 +8,7 @@ import noppes.npcs.CustomItems; import noppes.npcs.CustomNpcs; import noppes.npcs.LogWriter; import noppes.npcs.controllers.data.Magic; -import noppes.npcs.controllers.data.MagicCategory; +import noppes.npcs.controllers.data.MagicCycle; import noppes.npcs.controllers.data.MagicAssociation; import java.io.BufferedInputStream; @@ -24,10 +24,10 @@ public class MagicController { public HashMap magics = new HashMap<>(); public HashMap magicSync = new HashMap<>(); - public HashMap categories = new HashMap<>(); - public HashMap categoriesSync = new HashMap<>(); + public HashMap cycles = new HashMap<>(); + public HashMap cyclesSync = new HashMap<>(); - public int lastUsedCategoryID = 0; + public int lastUsedCycleID = 0; private int lastUsedID = 0; private static MagicController instance; @@ -44,8 +44,8 @@ public class MagicController { return magics.get(magicId); } - public MagicCategory getCategory(int categoryId) { - return categories.get(categoryId); + public MagicCycle getCycle(int cycleID) { + return cycles.get(cycleID); } public void load() { @@ -136,7 +136,7 @@ public class MagicController { public void loadMagic(DataInputStream stream) throws IOException { NBTTagCompound compound = CompressedStreamTools.read(stream); lastUsedID = compound.getInteger("lastID"); - lastUsedCategoryID = compound.getInteger("lastCatID"); + lastUsedCycleID = compound.getInteger("lastCatID"); // Load magics magics.clear(); @@ -149,13 +149,13 @@ public class MagicController { } // Load categories - categories.clear(); - NBTTagList catList = compound.getTagList("Categories", 10); + cycles.clear(); + NBTTagList catList = compound.getTagList("Cycles", 10); for (int i = 0; i < catList.tagCount(); i++) { NBTTagCompound catCompound = catList.getCompoundTagAt(i); - MagicCategory cat = new MagicCategory(); + MagicCycle cat = new MagicCycle(); cat.readNBT(catCompound); - categories.put(cat.id, cat); + cycles.put(cat.id, cat); } } @@ -167,16 +167,16 @@ public class MagicController { magicList.appendTag(magCompound); } NBTTagList catList = new NBTTagList(); - for (MagicCategory cat : categories.values()) { + for (MagicCycle cat : cycles.values()) { NBTTagCompound catCompound = new NBTTagCompound(); cat.writeNBT(catCompound); catList.appendTag(catCompound); } NBTTagCompound compound = new NBTTagCompound(); compound.setInteger("lastID", lastUsedID); - compound.setInteger("lastCatID", lastUsedCategoryID); + compound.setInteger("lastCycleID", lastUsedCycleID); compound.setTag("Magics", magicList); - compound.setTag("Categories", catList); + compound.setTag("Cycles", catList); return compound; } @@ -232,21 +232,21 @@ public class MagicController { // === Category management methods === - public void addCategory(MagicCategory category) { + public void addCycle(MagicCycle category) { if (category.id < 0) { - lastUsedCategoryID++; - category.id = lastUsedCategoryID; + lastUsedCycleID++; + category.id = lastUsedCycleID; } else { while (containsCategoryName(category.title)) category.title += "_"; } - categories.put(category.id, category); + cycles.put(category.id, category); saveMagicData(); } public boolean containsCategoryName(String title) { title = title.toLowerCase(); - for (MagicCategory cat : categories.values()) { + for (MagicCycle cat : cycles.values()) { if (cat.title.toLowerCase().equals(title)) return true; } @@ -254,8 +254,8 @@ public class MagicController { } public void removeCategory(int categoryId) { - if (categories.containsKey(categoryId)) { - categories.remove(categoryId); + if (cycles.containsKey(categoryId)) { + cycles.remove(categoryId); saveMagicData(); } } @@ -263,8 +263,8 @@ public class MagicController { /** * Associates a magic with a category along with its per-category ordering data. */ - public void addMagicToCategory(int magicId, int categoryId, int index, int priority) { - MagicCategory cat = categories.get(categoryId); + public void addMagicToCycle(int magicId, int categoryId, int index, int priority) { + MagicCycle cat = cycles.get(categoryId); if (cat == null) return; MagicAssociation assoc = new MagicAssociation(); assoc.magicId = magicId; @@ -274,8 +274,8 @@ public class MagicController { saveMagicData(); } - public void removeMagicFromCategory(int magicId, int categoryId) { - MagicCategory cat = categories.get(categoryId); + public void removeMagicFromCycle(int magicId, int categoryId) { + MagicCycle cat = cycles.get(categoryId); if (cat == null) return; cat.associations.remove(magicId); saveMagicData(); diff --git a/src/main/java/noppes/npcs/controllers/data/MagicCategory.java b/src/main/java/noppes/npcs/controllers/data/MagicCycle.java similarity index 96% rename from src/main/java/noppes/npcs/controllers/data/MagicCategory.java rename to src/main/java/noppes/npcs/controllers/data/MagicCycle.java index d3a3b029e..ac645a3df 100644 --- a/src/main/java/noppes/npcs/controllers/data/MagicCategory.java +++ b/src/main/java/noppes/npcs/controllers/data/MagicCycle.java @@ -8,12 +8,12 @@ import java.util.HashMap; * Holds category information for magic. * Each category can have many magic associations. */ -public class MagicCategory { +public class MagicCycle { public int id = -1; public String title = ""; public HashMap associations = new HashMap<>(); - public MagicCategory() {} + public MagicCycle() {} public void readNBT(NBTTagCompound compound) { id = compound.getInteger("CategoryID"); diff --git a/src/main/resources/assets/customnpcs/textures/gui/icons.png b/src/main/resources/assets/customnpcs/textures/gui/icons.png index 49c1b77e922e80daced989d904c4eff3c02c3c60..86bf094c4c9681be9d316b9dced36f8b635d2a81 100644 GIT binary patch delta 4662 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 Y_m2Jd`gk%8@a^ojR>v*N%*k>81>)L4p8x;= delta 4604 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