From 98e886703c9fcf52f71bb20ba04b9ccff5c6d424 Mon Sep 17 00:00:00 2001 From: Kam Date: Thu, 20 Feb 2025 00:31:52 -0500 Subject: [PATCH] Push a TERRIBLY INCOMPLETE CODE!!! :DDDDD --- .../kamkeel/npcs/network/PacketHandler.java | 14 +- .../npcs/network/enums/EnumDataPacket.java | 1 + .../npcs/network/enums/EnumRequestPacket.java | 2 +- .../playerdata/PlayerDataGetPacket.java | 2 +- .../java/kamkeel/npcs/util/ByteBufUtils.java | 2 +- .../npcs/client/gui/SubGuiPlayerData.java | 928 ++++++++++++++++++ .../client/gui/global/GuiNPCManageLinked.java | 2 - .../client/gui/global/GuiNPCManageMagic.java | 2 +- .../gui/global/GuiNpcManagePlayerData.java | 248 ++--- .../gui/player/inventory/GuiProfiles.java | 2 +- .../npcs/client/gui/test/IPlayerDataInfo.java | 11 + .../client/gui/test/NoppesUtilClientNew.java | 74 ++ .../client/gui/test/NoppesUtilServerNew.java | 155 +++ .../gui/test/PlayerDataGetPacketNew.java | 47 + .../gui/test/PlayerDataRemovePacketNew.java | 56 ++ .../gui/test/PlayerDataSendPacketNew.java | 101 ++ .../npcs/client/gui/test/PlayerDataTab.java | 9 + .../client/gui/test/SubGuiPlayerDataNew.java | 864 ++++++++++++++++ .../npcs/client/gui/util/GuiCustomScroll.java | 2 +- .../npcs/client/gui/util/GuiNPCInterface.java | 18 + 20 files changed, 2392 insertions(+), 148 deletions(-) create mode 100644 src/main/java/noppes/npcs/client/gui/SubGuiPlayerData.java create mode 100644 src/main/java/noppes/npcs/client/gui/test/IPlayerDataInfo.java create mode 100644 src/main/java/noppes/npcs/client/gui/test/NoppesUtilClientNew.java create mode 100644 src/main/java/noppes/npcs/client/gui/test/NoppesUtilServerNew.java create mode 100644 src/main/java/noppes/npcs/client/gui/test/PlayerDataGetPacketNew.java create mode 100644 src/main/java/noppes/npcs/client/gui/test/PlayerDataRemovePacketNew.java create mode 100644 src/main/java/noppes/npcs/client/gui/test/PlayerDataSendPacketNew.java create mode 100644 src/main/java/noppes/npcs/client/gui/test/PlayerDataTab.java create mode 100644 src/main/java/noppes/npcs/client/gui/test/SubGuiPlayerDataNew.java diff --git a/src/main/java/kamkeel/npcs/network/PacketHandler.java b/src/main/java/kamkeel/npcs/network/PacketHandler.java index 8b115635c..10a5fd259 100644 --- a/src/main/java/kamkeel/npcs/network/PacketHandler.java +++ b/src/main/java/kamkeel/npcs/network/PacketHandler.java @@ -82,6 +82,9 @@ import noppes.npcs.CustomNpcs; import noppes.npcs.CustomNpcsPermissions; import noppes.npcs.LogWriter; import noppes.npcs.NoppesUtilServer; +import noppes.npcs.client.gui.test.PlayerDataGetPacketNew; +import noppes.npcs.client.gui.test.PlayerDataRemovePacketNew; +import noppes.npcs.client.gui.test.PlayerDataSendPacketNew; import noppes.npcs.config.ConfigMain; import noppes.npcs.entity.EntityNPCInterface; @@ -225,8 +228,14 @@ public class PacketHandler { REQUEST_PACKET.registerPacket(new TagRemovePacket()); // PlayerData Packets + + REQUEST_PACKET.registerPacket(new PlayerDataGetPacket()); - REQUEST_PACKET.registerPacket(new PlayerDataRemovePacket()); +// REQUEST_PACKET.registerPacket(new PlayerDataRemovePacket()); + + REQUEST_PACKET.registerPacket(new PlayerDataGetPacketNew()); + REQUEST_PACKET.registerPacket(new PlayerDataRemovePacketNew()); + REQUEST_PACKET.registerPacket(new PlayerDataMapRegenPacket()); // Main Menu Packets @@ -346,6 +355,9 @@ public class PacketHandler { } public void registerDataPackets(){ + + DATA_PACKET.registerPacket(new PlayerDataSendPacketNew()); + // Data Packets DATA_PACKET.registerPacket(new LoginPacket()); DATA_PACKET.registerPacket(new AchievementPacket()); diff --git a/src/main/java/kamkeel/npcs/network/enums/EnumDataPacket.java b/src/main/java/kamkeel/npcs/network/enums/EnumDataPacket.java index afde0e87e..874677af9 100644 --- a/src/main/java/kamkeel/npcs/network/enums/EnumDataPacket.java +++ b/src/main/java/kamkeel/npcs/network/enums/EnumDataPacket.java @@ -38,6 +38,7 @@ public enum EnumDataPacket { GUI_TELEPORTER, GUI_BOOK, GUI_DATA, + PLAYER_DATA, GUI_ERROR, GUI_CLOSE, ISGUIOPEN, diff --git a/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java b/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java index febd0386b..3036d9a88 100644 --- a/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java +++ b/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java @@ -186,5 +186,5 @@ public enum EnumRequestPacket { ColorSet, ColorBrush, - ProfileGet, ProfileGetAll, ProfileGetInfo, ProfileCreate, ProfileRemove, ProfileRename, ProfileChange, + ProfileGet, ProfileGetAll, ProfileGetInfo, ProfileCreate, ProfileRemove, ProfileRename, ProfileChange, PlayerDataGetOld, } diff --git a/src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetPacket.java b/src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetPacket.java index 557698999..9f4ea14f6 100644 --- a/src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetPacket.java +++ b/src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetPacket.java @@ -32,7 +32,7 @@ public final class PlayerDataGetPacket extends AbstractPacket { @Override public Enum getType() { - return EnumRequestPacket.PlayerDataGet; + return EnumRequestPacket.PlayerDataGetOld; } @Override diff --git a/src/main/java/kamkeel/npcs/util/ByteBufUtils.java b/src/main/java/kamkeel/npcs/util/ByteBufUtils.java index f470e17c0..225327935 100644 --- a/src/main/java/kamkeel/npcs/util/ByteBufUtils.java +++ b/src/main/java/kamkeel/npcs/util/ByteBufUtils.java @@ -102,7 +102,7 @@ public class ByteBufUtils extends cpw.mods.fml.common.network.ByteBufUtils { int length = buffer.readInt(); byte[] bytes = new byte[length]; buffer.readBytes(bytes); - return CompressedStreamTools.func_152457_a(bytes, new NBTSizeTracker(15728640L)); + return CompressedStreamTools.func_152457_a(bytes, new NBTSizeTracker(31457280L)); } public static void writeString(ByteBuf buffer, String s){ diff --git a/src/main/java/noppes/npcs/client/gui/SubGuiPlayerData.java b/src/main/java/noppes/npcs/client/gui/SubGuiPlayerData.java new file mode 100644 index 000000000..f4db0f16d --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/SubGuiPlayerData.java @@ -0,0 +1,928 @@ +package noppes.npcs.client.gui; + +import kamkeel.npcs.network.PacketClient; +import kamkeel.npcs.network.packets.request.playerdata.PlayerDataGetPacket; +import kamkeel.npcs.network.packets.request.playerdata.PlayerDataRemovePacket; +import net.minecraft.client.gui.GuiYesNo; +import net.minecraft.client.gui.GuiYesNoCallback; +import noppes.npcs.client.NoppesUtil; +import noppes.npcs.client.gui.util.*; +import noppes.npcs.constants.EnumPlayerData; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.util.StatCollector; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Vector; + +public class SubGuiPlayerData extends SubGuiInterface implements GuiYesNoCallback, ICustomScrollListener, IScrollData { + + private String playerName; + private int currentTab = 10; // 10: Quests, 11: Dialog, 12: Transport, 13: Bank, 14: Faction. + private int viewMode = 0; // 0: Categorical, 1: Compact. + private int lastDataType = 0; + + // ----- Quest Tab (10) ----- + private GuiCustomScroll questCatScroll, questFinishedScroll, questActiveScroll; + private String questCatSearch = "", questFinishedSearch = "", questActiveSearch = ""; + // Maps for category display (questCatData) and for quest entries: + private HashMap questCatData = new HashMap<>(); + private HashMap questFinishedData = new HashMap<>(); + private HashMap questActiveData = new HashMap<>(); + // New: maps storing the extracted category for each quest entry (keyed by the displayed quest title) + private HashMap questFinishedCategory = new HashMap<>(); + private HashMap questActiveCategory = new HashMap<>(); + private String selectedQuestCategory = ""; + + // ----- Dialog Tab (11) ----- + private GuiCustomScroll dialogCatScroll, dialogReadScroll; + private String dialogCatSearch = "", dialogReadSearch = ""; + private HashMap dialogCatData = new HashMap<>(); + private HashMap dialogReadData = new HashMap<>(); + // For dialog entries, we split off the category from the key ("Category: Title") + private HashMap dialogCategory = new HashMap<>(); + private GuiCustomScroll dialogCompactScroll; + private String dialogCompactSearch = ""; + private HashMap dialogCompactData = new HashMap<>(); + private String selectedDialogCategory = ""; + + // ----- Transport Tab (12) ----- + private GuiCustomScroll transCatScroll, transLocScroll; + private String transCatSearch = "", transLocSearch = ""; + private HashMap transCatData = new HashMap<>(); + private HashMap transLocData = new HashMap<>(); + // For transport locations, also store their category: + private HashMap transLocationCategory = new HashMap<>(); + private GuiCustomScroll transCompactScroll; + private String transCompactSearch = ""; + private HashMap transCompactData = new HashMap<>(); + private String selectedTransCategory = ""; + + // ----- Bank & Faction Tabs (13 & 14) ----- + private GuiCustomScroll singleScroll; + private String singleSearch = ""; + private HashMap singleData = new HashMap<>(); + + // ----- Divider/resizing variables ----- +// We use margins so that scrolls have room on the right for buttons. + private final int leftMargin = guiLeft + 4; + private final int rightMargin = guiLeft + xSize - 80; // leave 80px for the buttons on the right + private int dividerOffset1 = 120; + private int dividerOffset2 = 240; + private final int dividerWidth = 5; + private final int minScrollWidth = 50; + private int draggingDivider = 0; + private int initialDragX = 0; + private boolean isResizing = false; + + public SubGuiPlayerData(String playerName) { + this.playerName = playerName; + xSize = 420; + ySize = 216; + setBackground("menubg.png"); + lastDataType = 11; + PacketClient.sendClient(new PlayerDataGetPacket(EnumPlayerData.Quest, playerName)); + closeOnEsc = true; + } + + @Override + public void initGui() { + super.initGui(); + // --- Top Buttons --- + GuiMenuTopButton close = new GuiMenuTopButton(-5, guiLeft + xSize - 22, guiTop - 10, "X"); + GuiMenuTopButton quests = new GuiMenuTopButton(10, guiLeft + 4, guiTop - 10, StatCollector.translateToLocal("tab.quests")); + GuiMenuTopButton dialog = new GuiMenuTopButton(11, quests.xPosition + quests.getWidth(), guiTop - 10, StatCollector.translateToLocal("tab.dialog")); + GuiMenuTopButton transport = new GuiMenuTopButton(12, dialog.xPosition + dialog.getWidth(), guiTop - 10, StatCollector.translateToLocal("tab.transport")); + GuiMenuTopButton bank = new GuiMenuTopButton(13, transport.xPosition + transport.getWidth(), guiTop - 10, StatCollector.translateToLocal("tab.bank")); + GuiMenuTopButton faction = new GuiMenuTopButton(14, bank.xPosition + bank.getWidth(), guiTop - 10, StatCollector.translateToLocal("tab.faction")); + + quests.active = (currentTab == 10); + dialog.active = (currentTab == 11); + transport.active = (currentTab == 12); + bank.active = (currentTab == 13); + faction.active = (currentTab == 14); + close.active = false; + + addTopButton(close); + addTopButton(quests); + addTopButton(dialog); + addTopButton(transport); + addTopButton(bank); + addTopButton(faction); + + if (currentTab == 10 || currentTab == 11 || currentTab == 12) { + addButton(new GuiNpcButton(20, guiLeft + xSize - 80, guiTop - 10, 75, 20, + viewMode == 0 ? StatCollector.translateToLocal("view.categorical") : StatCollector.translateToLocal("view.compact"))); + } + + guiTop += 7; + + if (currentTab == 10) + lastDataType = 11; + else if (currentTab == 11) + lastDataType = (viewMode == 0) ? 21 : 22; + else if (currentTab == 12) + lastDataType = (viewMode == 0) ? 31 : 32; + else if (currentTab == 13 || currentTab == 14) + lastDataType = 40; + + switch (currentTab) { + case 10: + initQuestTab(); + break; + case 11: + initDialogTab(); + break; + case 12: + initTransportTab(); + break; + case 13: + case 14: + initSingleScroll(); + break; + } + + addButton(new GuiNpcButton(30, guiLeft + xSize - 80, guiTop + ySize - 30, 75, 20, StatCollector.translateToLocal("button.delete"))); + } + + private void initQuestTab() { + int regionLeft = leftMargin; + int regionRight = rightMargin; + int dividerX1 = regionLeft + dividerOffset1; + int dividerX2 = regionLeft + dividerOffset2; + + if (viewMode == 0) { + if (questCatScroll == null) { + questCatScroll = new GuiCustomScroll(this, 0, 0); + } + questCatScroll.guiLeft = regionLeft; + questCatScroll.guiTop = guiTop + 30; + questCatScroll.setSize(dividerX1 - regionLeft, 150); + addScroll(questCatScroll); + addLabel(new GuiNpcLabel(1000, "Categories", regionLeft, guiTop + 15, 0xFFFFFF)); + + if (questFinishedScroll == null) { + questFinishedScroll = new GuiCustomScroll(this, 1, 0); + } + questFinishedScroll.guiLeft = dividerX1 + dividerWidth; + questFinishedScroll.guiTop = guiTop + 30; + questFinishedScroll.setSize(dividerX2 - dividerX1 - dividerWidth, 150); + addScroll(questFinishedScroll); + addLabel(new GuiNpcLabel(1001, "Finished", dividerX1 + dividerWidth, guiTop + 15, 0xFFFFFF)); + + if (questActiveScroll == null) { + questActiveScroll = new GuiCustomScroll(this, 2, 0); + } + questActiveScroll.guiLeft = dividerX2 + dividerWidth; + questActiveScroll.guiTop = guiTop + 30; + questActiveScroll.setSize(regionRight - dividerX2 - dividerWidth, 150); + addScroll(questActiveScroll); + addLabel(new GuiNpcLabel(1002, "Active", dividerX2 + dividerWidth, guiTop + 15, 0xFFFFFF)); + + // When a category is selected, filter using our extra maps. + if (!selectedQuestCategory.isEmpty()) { + questFinishedScroll.setList(filterQuestsByCategory(questFinishedData, questFinishedCategory, selectedQuestCategory)); + questActiveScroll.setList(filterQuestsByCategory(questActiveData, questActiveCategory, selectedQuestCategory)); + } else { + questFinishedScroll.setList(getSearchList(questFinishedData, questFinishedSearch)); + questActiveScroll.setList(getSearchList(questActiveData, questActiveSearch)); + } + } else { + if (questFinishedScroll == null) { + questFinishedScroll = new GuiCustomScroll(this, 1, 0); + } + questFinishedScroll.guiLeft = regionLeft; + questFinishedScroll.guiTop = guiTop + 30; + questFinishedScroll.setSize((regionRight - regionLeft) / 2, 150); + addScroll(questFinishedScroll); + addLabel(new GuiNpcLabel(1003, "Finished", regionLeft, guiTop + 15, 0xFFFFFF)); + + if (questActiveScroll == null) { + questActiveScroll = new GuiCustomScroll(this, 2, 0); + } + questActiveScroll.guiLeft = regionLeft + (regionRight - regionLeft) / 2; + questActiveScroll.guiTop = guiTop + 30; + questActiveScroll.setSize((regionRight - regionLeft) / 2, 150); + addScroll(questActiveScroll); + addLabel(new GuiNpcLabel(1004, "Active", questActiveScroll.guiLeft, guiTop + 15, 0xFFFFFF)); + } + if (viewMode == 0) { + addTextField(new GuiNpcTextField(55, this, fontRendererObj, regionLeft, guiTop + 30 + 153, dividerX1 - regionLeft, 20, questCatSearch)); + addTextField(new GuiNpcTextField(56, this, fontRendererObj, dividerX1 + dividerWidth, guiTop + 30 + 153, dividerX2 - dividerX1 - dividerWidth, 20, questFinishedSearch)); + addTextField(new GuiNpcTextField(57, this, fontRendererObj, dividerX2 + dividerWidth, guiTop + 30 + 153, regionRight - dividerX2 - dividerWidth, 20, questActiveSearch)); + } else { + addTextField(new GuiNpcTextField(55, this, fontRendererObj, regionLeft, guiTop + 30 + 153, (regionRight - regionLeft) / 2, 20, questFinishedSearch)); + addTextField(new GuiNpcTextField(56, this, fontRendererObj, questActiveScroll.guiLeft, guiTop + 30 + 153, (regionRight - regionLeft) / 2, 20, questActiveSearch)); + } + } + + private void initDialogTab() { + int regionLeft = leftMargin; + int regionRight = rightMargin; + int dividerX = regionLeft + dividerOffset1; + + if (viewMode == 0) { + if (dialogCatScroll == null) { + dialogCatScroll = new GuiCustomScroll(this, 0, 0); + } + dialogCatScroll.guiLeft = regionLeft; + dialogCatScroll.guiTop = guiTop + 30; + dialogCatScroll.setSize(dividerX - regionLeft, 150); + addScroll(dialogCatScroll); + addLabel(new GuiNpcLabel(2000, "Categories", regionLeft, guiTop + 15, 0xFFFFFF)); + + if (dialogReadScroll == null) { + dialogReadScroll = new GuiCustomScroll(this, 1, 0); + } + dialogReadScroll.guiLeft = dividerX + dividerWidth; + dialogReadScroll.guiTop = guiTop + 30; + dialogReadScroll.setSize(regionRight - dividerX - dividerWidth, 150); + addScroll(dialogReadScroll); + addLabel(new GuiNpcLabel(2001, "Read", dividerX + dividerWidth, guiTop + 15, 0xFFFFFF)); + + if (!selectedDialogCategory.isEmpty()) { + dialogReadScroll.setList(filterDialogsByCategory(dialogReadData, dialogCategory, selectedDialogCategory)); + } else { + dialogReadScroll.setList(getSearchList(dialogReadData, dialogReadSearch)); + } + } else { + if (dialogCompactScroll == null) { + dialogCompactScroll = new GuiCustomScroll(this, 5, 0); + } + dialogCompactScroll.guiLeft = regionLeft; + dialogCompactScroll.guiTop = guiTop + 30; + dialogCompactScroll.setSize(regionRight - regionLeft, 150); + addScroll(dialogCompactScroll); + addLabel(new GuiNpcLabel(2002, "All", regionLeft, guiTop + 15, 0xFFFFFF)); + dialogCompactScroll.setList(getSearchList(dialogCompactData, dialogCompactSearch)); + addTextField(new GuiNpcTextField(55, this, fontRendererObj, regionLeft, guiTop + 30 + 153, regionRight - regionLeft, 20, dialogCompactSearch)); + } + if (viewMode == 0) { + addTextField(new GuiNpcTextField(55, this, fontRendererObj, regionLeft, guiTop + 30 + 153, dividerX - regionLeft, 20, dialogCatSearch)); + addTextField(new GuiNpcTextField(56, this, fontRendererObj, dividerX + dividerWidth, guiTop + 30 + 153, regionRight - dividerX - dividerWidth, 20, dialogReadSearch)); + } + } + + private void initTransportTab() { + int regionLeft = leftMargin; + int regionRight = rightMargin; + int dividerX = regionLeft + dividerOffset1; + + if (viewMode == 0) { + if (transCatScroll == null) { + transCatScroll = new GuiCustomScroll(this, 3, 0); + } + transCatScroll.guiLeft = regionLeft; + transCatScroll.guiTop = guiTop + 30; + transCatScroll.setSize(dividerX - regionLeft, 150); + addScroll(transCatScroll); + addLabel(new GuiNpcLabel(3000, "Categories", regionLeft, guiTop + 15, 0xFFFFFF)); + + if (transLocScroll == null) { + transLocScroll = new GuiCustomScroll(this, 4, 0); + } + transLocScroll.guiLeft = dividerX + dividerWidth; + transLocScroll.guiTop = guiTop + 30; + transLocScroll.setSize(regionRight - dividerX - dividerWidth, 150); + addScroll(transLocScroll); + addLabel(new GuiNpcLabel(3001, "Locations", dividerX + dividerWidth, guiTop + 15, 0xFFFFFF)); + + if (!selectedTransCategory.isEmpty()) { + transLocScroll.setList(filterTransportsByCategory(transLocData, transLocationCategory, selectedTransCategory)); + } else { + transLocScroll.setList(getSearchList(transLocData, transLocSearch)); + } + } else { + if (transCompactScroll == null) { + transCompactScroll = new GuiCustomScroll(this, 5, 0); + } + transCompactScroll.guiLeft = regionLeft; + transCompactScroll.guiTop = guiTop + 30; + transCompactScroll.setSize(regionRight - regionLeft, 150); + addScroll(transCompactScroll); + addLabel(new GuiNpcLabel(3002, "All", regionLeft, guiTop + 15, 0xFFFFFF)); + transCompactScroll.setList(getSearchList(transCompactData, transCompactSearch)); + addTextField(new GuiNpcTextField(60, this, fontRendererObj, regionLeft, guiTop + 30 + 153, regionRight - regionLeft, 20, transCompactSearch)); + } + if (viewMode == 0) { + addTextField(new GuiNpcTextField(60, this, fontRendererObj, regionLeft, guiTop + 30 + 153, dividerX - regionLeft, 20, transCatSearch)); + addTextField(new GuiNpcTextField(61, this, fontRendererObj, dividerX + dividerWidth, guiTop + 30 + 153, regionRight - dividerX - dividerWidth, 20, transLocSearch)); + } + } + + private void initSingleScroll() { + int regionLeft = leftMargin; + int regionRight = rightMargin; + if (singleScroll == null) { + singleScroll = new GuiCustomScroll(this, 6, 0); + } + singleScroll.guiLeft = regionLeft; + singleScroll.guiTop = guiTop + 30; + singleScroll.setSize(regionRight - regionLeft, 150); + addScroll(singleScroll); + addLabel(new GuiNpcLabel(4000, "Data", regionLeft, guiTop + 15, 0xFFFFFF)); + addTextField(new GuiNpcTextField(70, this, fontRendererObj, regionLeft, guiTop + 30 + 153, regionRight - regionLeft, 20, singleSearch)); + } + + @Override + public void actionPerformed(GuiButton button) { + int id = button.id; + if (id >= 10 && id <= 14) { + currentTab = id; + clearData(); + selectedQuestCategory = ""; + selectedDialogCategory = ""; + selectedTransCategory = ""; + switch (currentTab) { + case 10: + PacketClient.sendClient(new PlayerDataGetPacket(EnumPlayerData.Quest, playerName)); + break; + case 11: + PacketClient.sendClient(new PlayerDataGetPacket(EnumPlayerData.Dialog, playerName)); + break; + case 12: + PacketClient.sendClient(new PlayerDataGetPacket(EnumPlayerData.Transport, playerName)); + break; + case 13: + PacketClient.sendClient(new PlayerDataGetPacket(EnumPlayerData.Bank, playerName)); + break; + case 14: + PacketClient.sendClient(new PlayerDataGetPacket(EnumPlayerData.Factions, playerName)); + break; + } + initGui(); + return; + } + if (id == 20) { + viewMode = (viewMode == 0) ? 1 : 0; + initGui(); + return; + } + if (id == 30) { + displayGuiScreen(new GuiYesNo(this, StatCollector.translateToLocal("gui.deleteconfirm"), "", 100 + currentTab)); + return; + } + } + + private void clearData() { + questCatData.clear(); + questFinishedData.clear(); + questActiveData.clear(); + questFinishedCategory.clear(); + questActiveCategory.clear(); + dialogCatData.clear(); + dialogReadData.clear(); + dialogCompactData.clear(); + dialogCategory.clear(); + transCatData.clear(); + transLocData.clear(); + transLocationCategory.clear(); + transCompactData.clear(); + singleData.clear(); + } + + @Override + public void keyTyped(char c, int i) { + super.keyTyped(c, i); + if (currentTab == 10) { + if (getTextField(55) != null && getTextField(55).isFocused()) { + String newSearch = getTextField(55).getText().toLowerCase(); + if (!questCatSearch.equals(newSearch)) { + questCatSearch = newSearch; + if (questCatScroll != null) + questCatScroll.setList(getSearchList(questCatData, questCatSearch)); + } + } + if (getTextField(56) != null && getTextField(56).isFocused()) { + String newSearch = getTextField(56).getText().toLowerCase(); + if (!questFinishedSearch.equals(newSearch)) { + questFinishedSearch = newSearch; + if (questFinishedScroll != null) + questFinishedScroll.setList(getSearchList(questFinishedData, questFinishedSearch)); + } + } + if (getTextField(57) != null && getTextField(57).isFocused()) { + String newSearch = getTextField(57).getText().toLowerCase(); + if (!questActiveSearch.equals(newSearch)) { + questActiveSearch = newSearch; + if (questActiveScroll != null) + questActiveScroll.setList(getSearchList(questActiveData, questActiveSearch)); + } + } + } + if (currentTab == 11) { + if (viewMode == 0) { + if (getTextField(55) != null && getTextField(55).isFocused()) { + String newSearch = getTextField(55).getText().toLowerCase(); + if (!dialogCatSearch.equals(newSearch)) { + dialogCatSearch = newSearch; + if (dialogCatScroll != null) + dialogCatScroll.setList(getSearchList(dialogCatData, dialogCatSearch)); + } + } + if (getTextField(56) != null && getTextField(56).isFocused()) { + String newSearch = getTextField(56).getText().toLowerCase(); + if (!dialogReadSearch.equals(newSearch)) { + dialogReadSearch = newSearch; + if (dialogReadScroll != null) + dialogReadScroll.setList(getSearchList(dialogReadData, dialogReadSearch)); + } + } + } else { + if (getTextField(55) != null && getTextField(55).isFocused()) { + String newSearch = getTextField(55).getText().toLowerCase(); + if (!dialogCompactSearch.equals(newSearch)) { + dialogCompactSearch = newSearch; + if (dialogCompactScroll != null) + dialogCompactScroll.setList(getSearchList(dialogCompactData, dialogCompactSearch)); + } + } + } + } + if (currentTab == 12) { + if (viewMode == 0) { + if (getTextField(60) != null && getTextField(60).isFocused()) { + String newSearch = getTextField(60).getText().toLowerCase(); + if (!transCatSearch.equals(newSearch)) { + transCatSearch = newSearch; + if (transCatScroll != null) + transCatScroll.setList(getSearchList(transCatData, transCatSearch)); + } + } + if (getTextField(61) != null && getTextField(61).isFocused()) { + String newSearch = getTextField(61).getText().toLowerCase(); + if (!transLocSearch.equals(newSearch)) { + transLocSearch = newSearch; + if (transLocScroll != null) + transLocScroll.setList(getSearchList(transLocData, transLocSearch)); + } + } + } else { + if (getTextField(60) != null && getTextField(60).isFocused()) { + String newSearch = getTextField(60).getText().toLowerCase(); + if (!transCompactSearch.equals(newSearch)) { + transCompactSearch = newSearch; + if (transCompactScroll != null) + transCompactScroll.setList(getSearchList(transCompactData, transCompactSearch)); + } + } + } + } + if (currentTab == 13 || currentTab == 14) { + if (getTextField(70) != null && getTextField(70).isFocused()) { + String newSearch = getTextField(70).getText().toLowerCase(); + if (!singleSearch.equals(newSearch)) { + singleSearch = newSearch; + if (singleScroll != null) + singleScroll.setList(getSearchList(singleData, singleSearch)); + } + } + } + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) { + if ((currentTab == 10 || currentTab == 11 || currentTab == 12) && viewMode == 0) { + int regionLeft = leftMargin; + if (currentTab == 10) { + int dividerX1 = regionLeft + dividerOffset1; + int dividerX2 = regionLeft + dividerOffset2; + int regionTop = guiTop + 30; + int regionHeight = 150; + int dividerLineHeight = 20; + int dividerLineYOffset = (regionHeight - dividerLineHeight) / 2; + if (mouseX >= dividerX1 && mouseX <= dividerX1 + dividerWidth && + mouseY >= regionTop + dividerLineYOffset && mouseY <= regionTop + dividerLineYOffset + dividerLineHeight) { + isResizing = true; + draggingDivider = 1; + initialDragX = mouseX; + return; + } + if (mouseX >= dividerX2 && mouseX <= dividerX2 + dividerWidth && + mouseY >= regionTop + dividerLineYOffset && mouseY <= regionTop + dividerLineYOffset + dividerLineHeight) { + isResizing = true; + draggingDivider = 2; + initialDragX = mouseX; + return; + } + } else { + int dividerX = regionLeft + dividerOffset1; + int regionTop = guiTop + 30; + int regionHeight = 150; + int dividerLineHeight = 20; + int dividerLineYOffset = (regionHeight - dividerLineHeight) / 2; + if (mouseX >= dividerX && mouseX <= dividerX + dividerWidth && + mouseY >= regionTop + dividerLineYOffset && mouseY <= regionTop + dividerLineYOffset + dividerLineHeight) { + isResizing = true; + draggingDivider = 1; + initialDragX = mouseX; + return; + } + } + } + super.mouseClicked(mouseX, mouseY, mouseButton); + } + + @Override + public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { + if (isResizing) { + int dx = mouseX - initialDragX; + initialDragX = mouseX; + if (currentTab == 10) { + if (draggingDivider == 1) { + dividerOffset1 += dx; + int regionLeft = leftMargin; + if (dividerOffset1 < minScrollWidth) + dividerOffset1 = minScrollWidth; + if (dividerOffset1 > dividerOffset2 - dividerWidth - minScrollWidth) + dividerOffset1 = dividerOffset2 - dividerWidth - minScrollWidth; + } + if (draggingDivider == 2) { + dividerOffset2 += dx; + int regionLeft = leftMargin; + int regionRight = rightMargin; + if (dividerOffset2 < dividerOffset1 + dividerWidth + minScrollWidth) + dividerOffset2 = dividerOffset1 + dividerWidth + minScrollWidth; + if (dividerOffset2 > (regionRight - regionLeft) - minScrollWidth) + dividerOffset2 = (regionRight - regionLeft) - minScrollWidth; + } + int regionLeft = leftMargin; + int regionRight = rightMargin; + int dividerX1 = regionLeft + dividerOffset1; + int dividerX2 = regionLeft + dividerOffset2; + if (questCatScroll != null) + questCatScroll.setSize(dividerX1 - regionLeft, 150); + if (questFinishedScroll != null) { + questFinishedScroll.guiLeft = dividerX1 + dividerWidth; + questFinishedScroll.setSize(dividerX2 - dividerX1 - dividerWidth, 150); + } + if (questActiveScroll != null) { + questActiveScroll.guiLeft = dividerX2 + dividerWidth; + questActiveScroll.setSize(regionRight - dividerX2 - dividerWidth, 150); + } + if (getTextField(55) != null) + getTextField(55).width = dividerX1 - regionLeft; + if (getTextField(56) != null) + getTextField(56).width = dividerX2 - dividerX1 - dividerWidth; + if (getTextField(57) != null) + getTextField(57).width = regionRight - dividerX2 - dividerWidth; + } else if ((currentTab == 11 || currentTab == 12) && viewMode == 0) { + int regionLeft = leftMargin; + int regionRight = rightMargin; + dividerOffset1 += dx; + if (dividerOffset1 < minScrollWidth) + dividerOffset1 = minScrollWidth; + if (dividerOffset1 > (regionRight - regionLeft) - dividerWidth - minScrollWidth) + dividerOffset1 = (regionRight - regionLeft) - dividerWidth - minScrollWidth; + int dividerX = regionLeft + dividerOffset1; + if (currentTab == 11) { + if (dialogCatScroll != null) + dialogCatScroll.setSize(dividerX - regionLeft, 150); + if (dialogReadScroll != null) { + dialogReadScroll.guiLeft = dividerX + dividerWidth; + dialogReadScroll.setSize(regionRight - dividerX - dividerWidth, 150); + } + if (getTextField(55) != null) + getTextField(55).width = dividerX - regionLeft; + if (getTextField(56) != null) + getTextField(56).width = regionRight - dividerX - dividerWidth; + } else { + if (transCatScroll != null) + transCatScroll.setSize(dividerX - regionLeft, 150); + if (transLocScroll != null) { + transLocScroll.guiLeft = dividerX + dividerWidth; + transLocScroll.setSize(regionRight - dividerX - dividerWidth, 150); + } + if (getTextField(60) != null) + getTextField(60).width = dividerX - regionLeft; + if (getTextField(61) != null) + getTextField(61).width = regionRight - dividerX - dividerWidth; + } + } + return; + } + super.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick); + } + + @Override + protected void mouseMovedOrUp(int mouseX, int mouseY, int state) { + if (isResizing) { + isResizing = false; + draggingDivider = 0; + return; + } + super.mouseMovedOrUp(mouseX, mouseY, state); + } + + @Override + public void confirmClicked(boolean confirm, int id) { + if (confirm && id == 100 + currentTab) { + int removeId = -1; + String selected = null; + switch (currentTab) { + case 10: + if (questFinishedScroll != null && questFinishedScroll.getSelected() != null) { + selected = questFinishedScroll.getSelected(); + removeId = questFinishedData.get(selected); + } else if (questActiveScroll != null && questActiveScroll.getSelected() != null) { + selected = questActiveScroll.getSelected(); + removeId = questActiveData.get(selected); + } + if (removeId != -1) + PacketClient.sendClient(new PlayerDataRemovePacket(EnumPlayerData.Quest, playerName, removeId)); + break; + case 11: + if (viewMode == 0) { + if (dialogReadScroll != null && dialogReadScroll.getSelected() != null) { + selected = dialogReadScroll.getSelected(); + removeId = dialogReadData.get(selected); + } + } else { + if (dialogCompactScroll != null && dialogCompactScroll.getSelected() != null) { + selected = dialogCompactScroll.getSelected(); + removeId = dialogCompactData.get(selected); + } + } + if (removeId != -1) + PacketClient.sendClient(new PlayerDataRemovePacket(EnumPlayerData.Dialog, playerName, removeId)); + break; + case 12: + if (viewMode == 0) { + if (transLocScroll != null && transLocScroll.getSelected() != null) { + selected = transLocScroll.getSelected(); + removeId = transLocData.get(selected); + } + } else { + if (transCompactScroll != null && transCompactScroll.getSelected() != null) { + selected = transCompactScroll.getSelected(); + removeId = transCompactData.get(selected); + } + } + if (removeId != -1) + PacketClient.sendClient(new PlayerDataRemovePacket(EnumPlayerData.Transport, playerName, removeId)); + break; + case 13: + case 14: + if (singleScroll != null && singleScroll.getSelected() != null) { + selected = singleScroll.getSelected(); + removeId = singleData.get(selected); + } + if (removeId != -1) { + EnumPlayerData type = (currentTab == 13) ? EnumPlayerData.Bank : EnumPlayerData.Factions; + PacketClient.sendClient(new PlayerDataRemovePacket(type, playerName, removeId)); + } + break; + default: + break; + } + } + NoppesUtil.openGUI(mc.thePlayer, this); + } + + // In setData, for quests we now extract category and remove the suffix from the displayed quest title. + public void setData(Vector list, HashMap data, int dataType) { + lastDataType = dataType; + if (currentTab == 10 && viewMode == 0 && (dataType == 11 || dataType == 12)) { + if (dataType == 11) { + questFinishedData.clear(); + questFinishedCategory.clear(); + for (String key : data.keySet()) { + int colon = key.indexOf(":"); + int paren = key.lastIndexOf("("); + if (colon != -1 && paren != -1) { + String category = key.substring(0, colon).trim(); + String questName = key.substring(colon + 1, paren).trim(); + questFinishedData.put(questName, data.get(key)); + questFinishedCategory.put(questName, category); + if (!questCatData.containsKey(category)) + questCatData.put(category, -1); + } else { + questFinishedData.put(key, data.get(key)); + } + } + if (questFinishedScroll != null) + questFinishedScroll.setList(getSearchList(questFinishedData, questFinishedSearch)); + } else if (dataType == 12) { + questActiveData.clear(); + questActiveCategory.clear(); + for (String key : data.keySet()) { + int colon = key.indexOf(":"); + int paren = key.lastIndexOf("("); + if (colon != -1 && paren != -1) { + String category = key.substring(0, colon).trim(); + String questName = key.substring(colon + 1, paren).trim(); + questActiveData.put(questName, data.get(key)); + questActiveCategory.put(questName, category); + if (!questCatData.containsKey(category)) + questCatData.put(category, -1); + } else { + questActiveData.put(key, data.get(key)); + } + } + if (questActiveScroll != null) + questActiveScroll.setList(getSearchList(questActiveData, questActiveSearch)); + } + if (questCatScroll != null) + questCatScroll.setList(new ArrayList<>(questCatData.keySet())); + return; + } + switch (dataType) { + case 10: + questCatData.clear(); + questCatData.putAll(data); + if (questCatScroll != null) + questCatScroll.setList(getSearchList(questCatData, questCatSearch)); + break; + case 20: + dialogCatData.clear(); + dialogCatData.putAll(data); + // For dialogs, split key into category and title: + dialogCategory.clear(); + HashMap temp = new HashMap<>(); + for (String key : data.keySet()) { + int colon = key.indexOf(":"); + if (colon != -1) { + String cat = key.substring(0, colon).trim(); + String title = key.substring(colon + 1).trim(); + temp.put(title, data.get(key)); + dialogCategory.put(title, cat); + if (!dialogCatData.containsKey(cat)) + dialogCatData.put(cat, -1); + } else { + temp.put(key, data.get(key)); + } + } + dialogCatData.putAll(temp); + if (dialogCatScroll != null) + dialogCatScroll.setList(getSearchList(dialogCatData, dialogCatSearch)); + break; + case 21: + dialogReadData.clear(); + dialogReadData.putAll(data); + if (dialogReadScroll != null) + dialogReadScroll.setList(getSearchList(dialogReadData, dialogReadSearch)); + break; + case 22: + dialogCompactData.clear(); + dialogCompactData.putAll(data); + if (dialogCompactScroll != null) + dialogCompactScroll.setList(getSearchList(dialogCompactData, dialogCompactSearch)); + break; + case 30: + transCatData.clear(); + transCatData.putAll(data); + if (transCatScroll != null) + transCatScroll.setList(getSearchList(transCatData, transCatSearch)); + break; + case 31: + transLocData.clear(); + transLocData.putAll(data); + // For transports, split key into category and location name: + transLocationCategory.clear(); + HashMap temp2 = new HashMap<>(); + for (String key : data.keySet()) { + int colon = key.indexOf(":"); + if (colon != -1) { + String cat = key.substring(0, colon).trim(); + String loc = key.substring(colon + 1).trim(); + temp2.put(loc, data.get(key)); + transLocationCategory.put(loc, cat); + if (!transCatData.containsKey(cat)) + transCatData.put(cat, -1); + } else { + temp2.put(key, data.get(key)); + } + } + transLocData.putAll(temp2); + if (transLocScroll != null) + transLocScroll.setList(getSearchList(transLocData, transLocSearch)); + break; + case 32: + transCompactData.clear(); + transCompactData.putAll(data); + if (transCompactScroll != null) + transCompactScroll.setList(getSearchList(transCompactData, transCompactSearch)); + break; + case 40: + singleData.clear(); + singleData.putAll(data); + if (singleScroll != null) + singleScroll.setList(getSearchList(singleData, singleSearch)); + break; + default: + break; + } + } + + @Override + public void setData(Vector list, HashMap data) { + setData(list, data, lastDataType); + } + + @Override + public void setSelected(String selected) { + // Handled in customScrollClicked. + } + + @Override + public void customScrollClicked(int i, int j, int k, GuiCustomScroll scroll) { + if (currentTab == 10) { + if (scroll.id == 0) { + selectedQuestCategory = scroll.getSelected(); + questFinishedScroll.setList(filterQuestsByCategory(questFinishedData, questFinishedCategory, selectedQuestCategory)); + questActiveScroll.setList(filterQuestsByCategory(questActiveData, questActiveCategory, selectedQuestCategory)); + } else if (scroll.id == 1) { + lastDataType = 11; + if (questActiveScroll != null) + questActiveScroll.setSelected(null); + } else if (scroll.id == 2) { + lastDataType = 12; + if (questFinishedScroll != null) + questFinishedScroll.setSelected(null); + } + } else if (currentTab == 11) { + if (viewMode == 0) { + if (scroll.id == 0) { + selectedDialogCategory = scroll.getSelected(); + dialogReadScroll.setList(filterDialogsByCategory(dialogReadData, dialogCategory, selectedDialogCategory)); + } else if (scroll.id == 1) { + lastDataType = 21; + if (dialogCatScroll != null) + dialogCatScroll.setSelected(null); + } + } else { + lastDataType = 22; + } + } else if (currentTab == 12) { + if (viewMode == 0) { + if (scroll.id == 3) { + selectedTransCategory = scroll.getSelected(); + transLocScroll.setList(filterTransportsByCategory(transLocData, transLocationCategory, selectedTransCategory)); + } else if (scroll.id == 4) { + lastDataType = 31; + if (transCatScroll != null) + transCatScroll.setSelected(null); + } + } else { + lastDataType = 32; + } + } else if (currentTab == 13 || currentTab == 14) { + lastDataType = 40; + } + } + + @Override + public void customScrollDoubleClicked(String selection, GuiCustomScroll scroll) { + // Optional double-click behavior. + } + + private List getSearchList(HashMap dataMap, String searchTerm) { + if (searchTerm.isEmpty()) + return new ArrayList<>(dataMap.keySet()); + List list = new ArrayList<>(); + for (String key : dataMap.keySet()) { + if (key.toLowerCase().contains(searchTerm)) + list.add(key); + } + return list; + } + + private List filterQuestsByCategory(HashMap questMap, HashMap catMap, String category) { + List filtered = new ArrayList<>(); + for (String title : questMap.keySet()) { + if (catMap.containsKey(title) && catMap.get(title).equalsIgnoreCase(category)) + filtered.add(title); + } + return filtered; + } + + private List filterDialogsByCategory(HashMap dialogMap, HashMap catMap, String category) { + List filtered = new ArrayList<>(); + for (String title : dialogMap.keySet()) { + if (catMap.containsKey(title) && catMap.get(title).equalsIgnoreCase(category)) + filtered.add(title); + } + return filtered; + } + + private List filterTransportsByCategory(HashMap transMap, HashMap catMap, String category) { + List filtered = new ArrayList<>(); + for (String name : transMap.keySet()) { + if (catMap.containsKey(name) && catMap.get(name).equalsIgnoreCase(category)) + filtered.add(name); + } + return filtered; + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + drawDefaultBackground(); + super.drawScreen(mouseX, mouseY, partialTicks); + } + + @Override + public void close() { + super.close(); + } +} diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageLinked.java b/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageLinked.java index 4c37aa728..9677742f7 100644 --- a/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageLinked.java +++ b/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageLinked.java @@ -26,9 +26,7 @@ import noppes.npcs.client.gui.item.SubGuiLinkedItem; import noppes.npcs.client.gui.util.*; import noppes.npcs.client.renderer.ImageData; -import noppes.npcs.controllers.data.CustomEffect; import noppes.npcs.controllers.data.LinkedItem; -import noppes.npcs.controllers.data.Quest; import noppes.npcs.entity.EntityCustomNpc; import noppes.npcs.entity.EntityNPCInterface; import org.lwjgl.input.Mouse; diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageMagic.java b/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageMagic.java index b5ccdc8e6..e1b35b31e 100644 --- a/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageMagic.java +++ b/src/main/java/noppes/npcs/client/gui/global/GuiNPCManageMagic.java @@ -26,7 +26,7 @@ public class GuiNPCManageMagic extends GuiNPCInterface2 { } @Override - protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { + public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { if (magicMap != null) { magicMap.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick); } diff --git a/src/main/java/noppes/npcs/client/gui/global/GuiNpcManagePlayerData.java b/src/main/java/noppes/npcs/client/gui/global/GuiNpcManagePlayerData.java index 4b505c9d3..6b9b02e6f 100644 --- a/src/main/java/noppes/npcs/client/gui/global/GuiNpcManagePlayerData.java +++ b/src/main/java/noppes/npcs/client/gui/global/GuiNpcManagePlayerData.java @@ -4,13 +4,14 @@ import kamkeel.npcs.network.PacketClient; import kamkeel.npcs.network.packets.request.playerdata.PlayerDataGetPacket; import kamkeel.npcs.network.packets.request.playerdata.PlayerDataMapRegenPacket; import kamkeel.npcs.network.packets.request.playerdata.PlayerDataRemovePacket; -import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiYesNo; import net.minecraft.client.gui.GuiYesNoCallback; - +import noppes.npcs.client.gui.SubGuiPlayerData; +import noppes.npcs.client.gui.test.SubGuiPlayerDataNew; import noppes.npcs.client.gui.util.*; - import noppes.npcs.constants.EnumPlayerData; +import net.minecraft.util.StatCollector; +import net.minecraft.client.gui.GuiButton; import noppes.npcs.entity.EntityNPCInterface; import java.util.ArrayList; @@ -18,167 +19,136 @@ import java.util.HashMap; import java.util.List; import java.util.Vector; -public class GuiNpcManagePlayerData extends GuiNPCInterface2 implements IScrollData,ICustomScrollListener,GuiYesNoCallback -{ - private GuiCustomScroll scroll; - private String selectedPlayer = null; - private String selected = null; - private HashMap data = new HashMap(); - private EnumPlayerData selection = EnumPlayerData.Players; - private String search = ""; +public class GuiNpcManagePlayerData extends GuiNPCInterface2 implements GuiYesNoCallback, IScrollData, ICustomScrollListener, ISubGuiListener { - public GuiNpcManagePlayerData(EntityNPCInterface npc) - { - super(npc); - PacketClient.sendClient(new PlayerDataGetPacket(selection, "")); + private GuiCustomScroll playerScroll; + private String selectedPlayer = null; + private HashMap playerData = new HashMap<>(); + private String search = ""; + + public GuiNpcManagePlayerData(EntityNPCInterface npcInterface) { + super(npcInterface); + // Request the complete list of players. + PacketClient.sendClient(new PlayerDataGetPacket(EnumPlayerData.Players, "")); } - public void initGui() - { + @Override + public void initGui() { super.initGui(); - scroll = new GuiCustomScroll(this,0, 0); - scroll.setSize(303, 175); - scroll.guiLeft = guiLeft + 4; - scroll.guiTop = guiTop + 16; - addScroll(scroll); + if (playerScroll == null) { + playerScroll = new GuiCustomScroll(this, 0, 0); + } + playerScroll.guiLeft = guiLeft + 4; + playerScroll.guiTop = guiTop + 16; + playerScroll.setSize(303, 175); + addScroll(playerScroll); - addLabel(new GuiNpcLabel(0,"All Players", guiLeft + 10, guiTop + 6)); + addLabel(new GuiNpcLabel(0, StatCollector.translateToLocal("All Players"), guiLeft + 10, guiTop + 6)); - this.addButton(new GuiNpcButton(0, guiLeft + 313, guiTop + 10,98, 20, "selectWorld.deleteButton")); - this.addButton(new GuiNpcButton(1, guiLeft + 313, guiTop + 32,98, 20, "Players")); - this.addButton(new GuiNpcButton(2, guiLeft + 313, guiTop + 54,98, 20, "Quest Data")); - this.addButton(new GuiNpcButton(3, guiLeft + 313, guiTop + 76,98, 20, "Dialog Data")); - this.addButton(new GuiNpcButton(4, guiLeft + 313, guiTop + 98,98, 20, "Transport Data")); - this.addButton(new GuiNpcButton(5, guiLeft + 313, guiTop + 120,98, 20, "Bank Data")); - this.addButton(new GuiNpcButton(6, guiLeft + 313, guiTop + 142,98, 20, "Faction Data")); + addButton(new GuiNpcButton(0, guiLeft + 313, guiTop + 10, 98, 20, StatCollector.translateToLocal("button.delete"))); + addButton(new GuiNpcButton(1, guiLeft + 313, guiTop + 32, 98, 20, StatCollector.translateToLocal("button.view"))); + addButton(new GuiNpcButton(2, guiLeft + 313, guiTop + 54, 98, 20, StatCollector.translateToLocal("button.regenPlayerMap"))); - this.addButton(new GuiNpcButton(7, guiLeft + 313, guiTop + 193,98, 20, "Regen PlayerMap")); + addTextField(new GuiNpcTextField(0, this, fontRendererObj, guiLeft + 4, guiTop + 193, 303, 20, search)); - addTextField(new GuiNpcTextField(0, this, fontRendererObj, guiLeft + 4, guiTop + 193, 303, 20, search)); - getTextField(0).enabled = selection == EnumPlayerData.Players; - - initButtons(); + playerScroll.setList(getSearchList()); } - public void initButtons(){ - getButton(1).setEnabled(selection != EnumPlayerData.Players); - getButton(2).setEnabled(selection != EnumPlayerData.Quest); - getButton(3).setEnabled(selection != EnumPlayerData.Dialog); - getButton(4).setEnabled(selection != EnumPlayerData.Transport); - getButton(5).setEnabled(selection != EnumPlayerData.Bank); - getButton(6).setEnabled(selection != EnumPlayerData.Factions); - - if(selection == EnumPlayerData.Players) - getLabel(0).label = "All Players"; - else - getLabel(0).label = "Selected player: " + selectedPlayer; - } - public void drawScreen(int i, int j, float f) - { + @Override + public void drawScreen(int i, int j, float f) { super.drawScreen(i, j, f); - scroll.drawScreen(i, j, f); + playerScroll.drawScreen(i, j, f); } - public void mouseClicked(int i, int j, int k) - { - super.mouseClicked(i, j, k); - if(k == 0 && scroll != null) - scroll.mouseClicked(i, j, k); + @Override + public void mouseClicked(int i, int j, int k) {; + super.mouseClicked(i, j, k); + if (k == 0 && playerScroll != null) + playerScroll.mouseClicked(i, j, k); } - public void keyTyped(char c, int i) - { - super.keyTyped(c, i); + @Override + public void save() {} - if(search.equals(getTextField(0).getText())) - return; - search = getTextField(0).getText().toLowerCase(); - scroll.setList(getSearchList()); - } - private List getSearchList(){ - if(search.isEmpty()) - return new ArrayList(this.data.keySet()); - List list = new ArrayList(); - for(String name : data.keySet()){ - if(name.toLowerCase().contains(search)) - list.add(name); - } - return list; + @Override + public void keyTyped(char c, int i) { + super.keyTyped(c, i); + String newText = getTextField(0).getText(); + if (!search.equals(newText)) { + search = newText.toLowerCase(); + playerScroll.setList(getSearchList()); + } } - protected void actionPerformed(GuiButton guibutton) - { - int id = guibutton.id; - if(id < 7){ - GuiNpcTextField tf = getTextField(0); - if(tf != null){ - tf.setText(""); - } - search = ""; - if(id == 0) - { - if(selected != null){ - if(selection == EnumPlayerData.Players) - PacketClient.sendClient(new PlayerDataRemovePacket(selection, selectedPlayer, selected)); - else - PacketClient.sendClient(new PlayerDataRemovePacket(selection, selectedPlayer, data.get(selected))); - data.clear(); - } - selected = null; - } - if(id >= 1 && id <= 6) - { - if(selectedPlayer == null && id != 1) - return; - selection = EnumPlayerData.values()[id - 1]; - initButtons(); - scroll.clear(); - data.clear(); - - PacketClient.sendClient(new PlayerDataGetPacket(selection, selectedPlayer)); - selected = null; - } - } - if(id == 7){ - displayGuiScreen(new GuiYesNo(this, "Warning", "Do not operate on PlayerData as its regenerating", 1)); - } + private List getSearchList() { + if (search.isEmpty()) + return new ArrayList<>(playerData.keySet()); + List list = new ArrayList<>(); + for (String name : playerData.keySet()) { + if (name.toLowerCase().contains(search)) + list.add(name); + } + return list; } - @Override - public void save() { - } + @Override + public void actionPerformed(GuiButton button) { + int id = button.id; + if (id == 0) { + if (selectedPlayer != null) { + displayGuiScreen(new GuiYesNo(this, selectedPlayer, StatCollector.translateToLocal("gui.deleteconfirm"), 0)); + } + } + if (id == 1) { + if (selectedPlayer != null) { + setSubGui(new SubGuiPlayerDataNew(selectedPlayer)); + } + } + if (id == 2) { + displayGuiScreen(new GuiYesNo(this, StatCollector.translateToLocal("gui.warning"), StatCollector.translateToLocal("gui.regenconfirm"), 1)); + } + } - @Override - public void setData(Vector list, HashMap data) { - this.data.putAll(data); + @Override + public void confirmClicked(boolean confirm, int id) { + if (confirm) { + if (id == 0) { + PacketClient.sendClient(new PlayerDataRemovePacket(EnumPlayerData.Players, selectedPlayer, null)); + playerData.remove(selectedPlayer); + selectedPlayer = null; + playerScroll.setList(getSearchList()); + } + if (id == 1) { + PacketClient.sendClient(new PlayerDataMapRegenPacket()); + close(); + } + } else { + displayGuiScreen(this); + } + } - scroll.setList(getSearchList()); + // IScrollData interface. + @Override + public void setData(Vector list, HashMap data) { + playerData.clear(); + playerData.putAll(data); + playerScroll.setList(getSearchList()); + } - if(selection == EnumPlayerData.Players && selectedPlayer != null){ - scroll.setSelected(selectedPlayer); - selected = selectedPlayer; - } - } + // ICustomScrollListener interface. + @Override + public void setSelected(String selected) { + selectedPlayer = selected; + } - @Override - public void setSelected(String selected) { - } + @Override + public void customScrollClicked(int i, int j, int k, GuiCustomScroll scroll) { + selectedPlayer = scroll.getSelected(); + } - @Override - public void customScrollClicked(int i, int j, int k, GuiCustomScroll guiCustomScroll) { - selected = guiCustomScroll.getSelected(); - if(selection == EnumPlayerData.Players) - selectedPlayer = selected; - } + @Override + public void customScrollDoubleClicked(String selection, GuiCustomScroll scroll) {} - @Override - public void confirmClicked(boolean confirm, int id){ - if(confirm){ - PacketClient.sendClient(new PlayerDataMapRegenPacket()); - close(); - } - else - displayGuiScreen(this); - } + public void subGuiClosed(SubGuiInterface subgui) {} } diff --git a/src/main/java/noppes/npcs/client/gui/player/inventory/GuiProfiles.java b/src/main/java/noppes/npcs/client/gui/player/inventory/GuiProfiles.java index 7ec782a8c..0d467129d 100644 --- a/src/main/java/noppes/npcs/client/gui/player/inventory/GuiProfiles.java +++ b/src/main/java/noppes/npcs/client/gui/player/inventory/GuiProfiles.java @@ -390,7 +390,7 @@ public class GuiProfiles extends GuiCNPCInventory implements ISubGuiListener, IC * Handles mouse dragging while clicking. */ @Override - protected void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { + public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { if (draggingScrollbar) { int mouseDiff = mouseY - lastMouseY; scrollY += (mouseDiff * maxScrollY) / (ySize - 70); diff --git a/src/main/java/noppes/npcs/client/gui/test/IPlayerDataInfo.java b/src/main/java/noppes/npcs/client/gui/test/IPlayerDataInfo.java new file mode 100644 index 000000000..3aef92ad8 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/test/IPlayerDataInfo.java @@ -0,0 +1,11 @@ +package noppes.npcs.client.gui.test; + +import java.util.Map; + +public interface IPlayerDataInfo { + void setQuestData(Map questCategories, Map questActive, Map questFinished); + void setDialogData(Map dialogCategories, Map dialogRead); + void setTransportData(Map transportCategories, Map transportLocations); + void setBankData(Map bankData); + void setFactionData(Map factionData); +} diff --git a/src/main/java/noppes/npcs/client/gui/test/NoppesUtilClientNew.java b/src/main/java/noppes/npcs/client/gui/test/NoppesUtilClientNew.java new file mode 100644 index 000000000..ecb62dc6f --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/test/NoppesUtilClientNew.java @@ -0,0 +1,74 @@ +package noppes.npcs.client.gui.test; + +import io.netty.buffer.ByteBuf; +import kamkeel.npcs.util.ByteBufUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.entity.player.EntityPlayer; +import noppes.npcs.client.gui.util.GuiContainerNPCInterface; +import noppes.npcs.client.gui.util.GuiNPCInterface; +import noppes.npcs.client.gui.util.IScrollData; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Vector; + +public class NoppesUtilClientNew { + + /** + * Handles the incoming large packet with full player data. + * The packet writes: + * - player name (String) + * - questCategories, questActive, questFinished (maps) + * - dialogCategories, dialogRead (maps) + * - transportCategories, transportLocations (maps) + * - bankData, factionData (maps) + * + * The existing PlayerDataController functions are used on the server side; + * here we simply update the active SubGuiPlayerDataNew if present. + */ + public static void handlePlayerData(ByteBuf data, EntityPlayer player) throws IOException { + String playerName = ByteBufUtils.readString(data); + Map questCategories = readMap(data); + Map questActive = readMap(data); + Map questFinished = readMap(data); + Map dialogCategories = readMap(data); + Map dialogRead = readMap(data); + Map transportCategories = readMap(data); + Map transportLocations = readMap(data); + Map bankData = readMap(data); + Map factionData = readMap(data); + + + GuiScreen gui = Minecraft.getMinecraft().currentScreen; + if(gui == null) + return; + if(gui instanceof GuiNPCInterface && ((GuiNPCInterface)gui).hasSubGui()){ + gui = (GuiScreen) ((GuiNPCInterface)gui).getSubGui(); + } + + if(gui instanceof GuiContainerNPCInterface && ((GuiContainerNPCInterface)gui).hasSubGui()){ + gui = (GuiScreen) ((GuiContainerNPCInterface)gui).getSubGui(); + } + if (gui instanceof IPlayerDataInfo) { + IPlayerDataInfo info = (IPlayerDataInfo) gui; + info.setQuestData(questCategories, questActive, questFinished); + info.setDialogData(dialogCategories, dialogRead); + info.setTransportData(transportCategories, transportLocations); + info.setBankData(bankData); + info.setFactionData(factionData); + } + } + + private static Map readMap(ByteBuf data) { + int size = data.readInt(); + Map map = new HashMap<>(); + for (int i = 0; i < size; i++) { + String key = ByteBufUtils.readString(data); + int value = data.readInt(); + map.put(key, value); + } + return map; + } +} diff --git a/src/main/java/noppes/npcs/client/gui/test/NoppesUtilServerNew.java b/src/main/java/noppes/npcs/client/gui/test/NoppesUtilServerNew.java new file mode 100644 index 000000000..4fc9d15d5 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/test/NoppesUtilServerNew.java @@ -0,0 +1,155 @@ +package noppes.npcs.client.gui.test; + +import kamkeel.npcs.controllers.SyncController; +import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.server.MinecraftServer; +import kamkeel.npcs.network.PacketHandler; +import noppes.npcs.controllers.*; +import noppes.npcs.controllers.data.*; +import noppes.npcs.config.ConfigMain; +import net.minecraft.nbt.NBTTagCompound; +import java.io.File; +import java.util.HashMap; +import java.util.Map; + +public class NoppesUtilServerNew { + + /** + * Retrieves the player's data from the existing PlayerDataController and sends + * a large packet to the client containing all the maps, including categories. + */ + public static void sendPlayerData(String playerName, EntityPlayerMP player) { + PlayerData playerdata; + EntityPlayer pl = MinecraftServer.getServer().getConfigurationManager().func_152612_a(playerName); + if(pl == null) + playerdata = PlayerDataController.Instance.getDataFromUsername(playerName); + else + playerdata = PlayerDataController.Instance.getPlayerData(pl); + + // Assemble quest maps: + Map questActiveMap = new HashMap<>(); + Map questFinishedMap = new HashMap<>(); + Map questCategoriesMap = new HashMap<>(); + QuestController qc = QuestController.Instance; + PlayerQuestData qData = playerdata.questData; + for (Integer questId : qData.activeQuests.keySet()) { + if(!qc.quests.containsKey(questId)) + continue; + Quest quest = qc.quests.get(questId); + questActiveMap.put(quest.category.title + ": " + quest.title, questId); + if (!questCategoriesMap.containsKey(quest.category.title)) + questCategoriesMap.put(quest.category.title, quest.category.id); + } + for (Integer questId : qData.finishedQuests.keySet()) { + if(!qc.quests.containsKey(questId)) + continue; + Quest quest = qc.quests.get(questId); + questFinishedMap.put(quest.category.title + ": " + quest.title, questId); + if (!questCategoriesMap.containsKey(quest.category.title)) + questCategoriesMap.put(quest.category.title, quest.category.id); + } + + // Assemble dialog maps: + Map dialogReadMap = new HashMap<>(); + Map dialogCategoriesMap = new HashMap<>(); + PlayerDialogData dData = playerdata.dialogData; + for (Integer dialogId : dData.dialogsRead) { + if(!DialogController.Instance.dialogs.containsKey(dialogId)) + continue; + Dialog dialog = DialogController.Instance.dialogs.get(dialogId); + dialogReadMap.put(dialog.category.title + ": " + dialog.title, dialogId); + if (!dialogCategoriesMap.containsKey(dialog.category.title)) + dialogCategoriesMap.put(dialog.category.title, dialog.category.id); + } + + // Assemble transport maps: + Map transportLocationsMap = new HashMap<>(); + Map transportCategoriesMap = new HashMap<>(); + PlayerTransportData tData = playerdata.transportData; + TransportController tc = TransportController.getInstance(); + for (Integer id : tData.transports) { + TransportLocation location = tc.getTransport(id); + if(location == null) + continue; + transportLocationsMap.put(location.category.title + ": " + location.name, id); + if (!transportCategoriesMap.containsKey(location.category.title)) + transportCategoriesMap.put(location.category.title, location.category.id); + } + + // Assemble bank map: + Map bankMap = new HashMap<>(); + PlayerBankData bData = playerdata.bankData; + BankController bc = BankController.getInstance(); + for (Integer bankId : bData.banks.keySet()) { + if(!bc.banks.containsKey(bankId)) + continue; + Bank bank = bc.banks.get(bankId); + bankMap.put(bank.name, bankId); + } + + // Assemble faction map: + Map factionMap = new HashMap<>(); + PlayerFactionData fData = playerdata.factionData; + FactionController fc = FactionController.getInstance(); + for (Integer factionId : fData.factionData.keySet()) { + if(!fc.factions.containsKey(factionId)) + continue; + Faction faction = fc.factions.get(factionId); + factionMap.put(faction.name + "(" + fData.getFactionPoints(factionId) + ")", factionId); + } + + // Send the full packet with categories, active/finished data, dialogs, transports, banks, and factions. + PlayerDataSendPacketNew packet = new PlayerDataSendPacketNew(playerName, + questCategoriesMap, questActiveMap, questFinishedMap, + dialogCategoriesMap, dialogReadMap, + transportCategoriesMap, transportLocationsMap, + bankMap, factionMap); + PacketHandler.Instance.sendToPlayer(packet, player); + } + + /** + * Removes a specific data entry from the player's data. + * + * The tabType parameter is used as follows: + * 0: Quest – remove from both activeQuests and finishedQuests. + * 1: Dialog – remove from dialogsRead. + * 2: Transport – remove from transports. + * 3: Bank – remove from banks. + * 4: Factions – remove from factionData. + * + * The selectedKey is expected to be the string representation of the entry's ID. + */ + public static void removePlayerData(String playerName, int tabType, int value, EntityPlayerMP player) { + EntityPlayer pl = MinecraftServer.getServer().getConfigurationManager().func_152612_a(playerName); + PlayerData playerdata; + if(pl == null) + playerdata = PlayerDataController.Instance.getDataFromUsername(playerName); + else + playerdata = PlayerDataController.Instance.getPlayerData(pl); + + if(tabType == 0) { // Quest removal + playerdata.questData.activeQuests.remove(value); + playerdata.questData.finishedQuests.remove(value); + } + if(tabType == 1) { // Dialog removal + playerdata.dialogData.dialogsRead.remove(value); + } + if(tabType == 2) { // Transport removal + playerdata.transportData.transports.remove(value); + } + if(tabType == 3) { // Bank removal + playerdata.bankData.banks.remove(value); + } + if(tabType == 4) { // Faction removal + playerdata.factionData.factionData.remove(value); + } + playerdata.save(); + + if(pl != null) { + SyncController.syncPlayer((EntityPlayerMP) pl); + } + // Resend the updated data to the client. + sendPlayerData(playerName, player); + } +} diff --git a/src/main/java/noppes/npcs/client/gui/test/PlayerDataGetPacketNew.java b/src/main/java/noppes/npcs/client/gui/test/PlayerDataGetPacketNew.java new file mode 100644 index 000000000..fe12b0333 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/test/PlayerDataGetPacketNew.java @@ -0,0 +1,47 @@ +package noppes.npcs.client.gui.test; + +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 net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; + +import java.io.IOException; + +public final class PlayerDataGetPacketNew extends AbstractPacket { + public static final String packetName = "Request|PlayerDataGetNew"; + private String playerName; + + public PlayerDataGetPacketNew() {} + + public PlayerDataGetPacketNew(String playerName) { + this.playerName = playerName; + } + + @Override + public Enum getType() { + return EnumRequestPacket.PlayerDataGet; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.REQUEST_PACKET; + } + + @Override + public void sendData(ByteBuf out) throws IOException { + ByteBufUtils.writeString(out, playerName); + } + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + if (!(player instanceof EntityPlayerMP)) + return; + + String playerName = ByteBufUtils.readString(in); + NoppesUtilServerNew.sendPlayerData(playerName, (EntityPlayerMP) player); + } +} diff --git a/src/main/java/noppes/npcs/client/gui/test/PlayerDataRemovePacketNew.java b/src/main/java/noppes/npcs/client/gui/test/PlayerDataRemovePacketNew.java new file mode 100644 index 000000000..ea5133271 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/test/PlayerDataRemovePacketNew.java @@ -0,0 +1,56 @@ +package noppes.npcs.client.gui.test; + +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 net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; +import noppes.npcs.constants.EnumPlayerData; + +import java.io.IOException; + +public final class PlayerDataRemovePacketNew extends AbstractPacket { + public static final String packetName = "Request|PlayerDataRemoveNew"; + + private String playerName; + private EnumPlayerData tabType; + private int value; + + public PlayerDataRemovePacketNew() {} + + public PlayerDataRemovePacketNew(String playerName, EnumPlayerData tabType, int selectedKey) { + this.playerName = playerName; + this.tabType = tabType; + this.value = selectedKey; + } + + @Override + public Enum getType() { + return EnumRequestPacket.PlayerDataRemove; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.REQUEST_PACKET; + } + + @Override + public void sendData(ByteBuf out) throws IOException { + ByteBufUtils.writeString(out, playerName); + out.writeInt(tabType.ordinal()); + out.writeInt(this.value); + } + + @Override + public void receiveData(ByteBuf in, EntityPlayer player) throws IOException { + if (!(player instanceof EntityPlayerMP)) + return; + String playerName = ByteBufUtils.readString(in); + int tabType = in.readInt(); + int value = in.readInt(); + NoppesUtilServerNew.removePlayerData(playerName, tabType, value, (EntityPlayerMP) player); + } +} diff --git a/src/main/java/noppes/npcs/client/gui/test/PlayerDataSendPacketNew.java b/src/main/java/noppes/npcs/client/gui/test/PlayerDataSendPacketNew.java new file mode 100644 index 000000000..2352fd063 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/test/PlayerDataSendPacketNew.java @@ -0,0 +1,101 @@ +package noppes.npcs.client.gui.test; + +import io.netty.buffer.ByteBuf; +import io.netty.buffer.Unpooled; +import kamkeel.npcs.network.LargeAbstractPacket; +import kamkeel.npcs.network.PacketChannel; +import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.enums.EnumDataPacket; +import kamkeel.npcs.util.ByteBufUtils; +import net.minecraft.entity.player.EntityPlayer; +import java.io.IOException; +import java.util.Map; + +public final class PlayerDataSendPacketNew extends LargeAbstractPacket { + public static final String packetName = "Large|PlayerDataSendNew"; + + private String playerName; + private Map questCategories; + private Map questActive; + private Map questFinished; + + private Map dialogCategories; + private Map dialogRead; + + private Map transportCategories; + private Map transportLocations; + + private Map bankData; + private Map factionData; + + public PlayerDataSendPacketNew() {} + + public PlayerDataSendPacketNew(String playerName, + Map questCategories, Map questActive, Map questFinished, + Map dialogCategories, Map dialogRead, + Map transportCategories, Map transportLocations, + Map bankData, Map factionData) { + this.playerName = playerName; + this.questCategories = questCategories; + this.questActive = questActive; + this.questFinished = questFinished; + this.dialogCategories = dialogCategories; + this.dialogRead = dialogRead; + this.transportCategories = transportCategories; + this.transportLocations = transportLocations; + this.bankData = bankData; + this.factionData = factionData; + } + + @Override + public Enum getType() { + return EnumDataPacket.PLAYER_DATA; + } + + @Override + public PacketChannel getChannel() { + return PacketHandler.DATA_PACKET; + } + + @Override + protected byte[] getData() throws IOException { + ByteBuf buffer = Unpooled.buffer(); + // Write player name: + ByteBufUtils.writeString(buffer, playerName); + // Write quest data maps: + writeMap(buffer, questCategories); + writeMap(buffer, questActive); + writeMap(buffer, questFinished); + // Write dialog data maps: + writeMap(buffer, dialogCategories); + writeMap(buffer, dialogRead); + // Write transport data maps: + writeMap(buffer, transportCategories); + writeMap(buffer, transportLocations); + // Write bank data map: + writeMap(buffer, bankData); + // Write faction data map: + writeMap(buffer, factionData); + + byte[] bytes = new byte[buffer.readableBytes()]; + buffer.readBytes(bytes); + return bytes; + } + + private void writeMap(ByteBuf buffer, Map map) { + if (map != null) { + buffer.writeInt(map.size()); + for (Map.Entry entry : map.entrySet()) { + ByteBufUtils.writeString(buffer, entry.getKey()); + buffer.writeInt(entry.getValue()); + } + } else { + buffer.writeInt(0); + } + } + + @Override + protected void handleCompleteData(ByteBuf data, EntityPlayer player) throws IOException { + NoppesUtilClientNew.handlePlayerData(data, player); + } +} diff --git a/src/main/java/noppes/npcs/client/gui/test/PlayerDataTab.java b/src/main/java/noppes/npcs/client/gui/test/PlayerDataTab.java new file mode 100644 index 000000000..713836dd3 --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/test/PlayerDataTab.java @@ -0,0 +1,9 @@ +package noppes.npcs.client.gui.test; + +public enum PlayerDataTab { + QUEST, + DIALOG, + TRANSPORT, + BANK, + FACTION; +} diff --git a/src/main/java/noppes/npcs/client/gui/test/SubGuiPlayerDataNew.java b/src/main/java/noppes/npcs/client/gui/test/SubGuiPlayerDataNew.java new file mode 100644 index 000000000..bd382d07f --- /dev/null +++ b/src/main/java/noppes/npcs/client/gui/test/SubGuiPlayerDataNew.java @@ -0,0 +1,864 @@ +package noppes.npcs.client.gui.test; + +import kamkeel.npcs.network.PacketClient; +import noppes.npcs.client.CustomNpcResourceListener; +import noppes.npcs.client.gui.util.*; +import net.minecraft.client.gui.GuiButton; +import net.minecraft.util.StatCollector; +import noppes.npcs.constants.EnumPlayerData; +import org.lwjgl.input.Mouse; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class SubGuiPlayerDataNew extends SubGuiInterface implements IPlayerDataInfo, ICustomScrollListener { + + // Tabs: 10 = Quest, 11 = Dialog, 12 = Transport, 13 = Bank, 14 = Faction. + private int currentTab = 10; + // View mode: 0 = Categorical (3 or 2 scrolls), 1 = Compact (2 or 1 scroll). + private int viewMode = 0; + + // Quest Tab components: + protected GuiCustomScroll questCatScroll, questActiveScroll, questFinishedScroll; + private String questCatSearch = "", questActiveSearch = "", questFinishedSearch = ""; + private HashMap questCatData = new HashMap<>(); + private HashMap questActiveData = new HashMap<>(); + private HashMap questFinishedData = new HashMap<>(); + private String selectedQuestCategory = ""; + + // Dialog Tab components: + protected GuiCustomScroll dialogCatScroll, dialogReadScroll, dialogCompactScroll; + private String dialogCatSearch = "", dialogReadSearch = "", dialogCompactSearch = ""; + private HashMap dialogCatData = new HashMap<>(); + private HashMap dialogReadData = new HashMap<>(); + private String selectedDialogCategory = ""; + + // Transport Tab components: + protected GuiCustomScroll transCatScroll, transLocScroll, transCompactScroll; + private String transCatSearch = "", transLocSearch = "", transCompactSearch = ""; + private HashMap transCatData = new HashMap<>(); + private HashMap transLocData = new HashMap<>(); + private String selectedTransCategory = ""; + + // Bank and Faction tabs – separate data and one scroll: + protected GuiCustomScroll singleScroll; + private String singleSearch = ""; + private HashMap bankData = new HashMap<>(); + private HashMap factionData = new HashMap<>(); + + // Divider/resizing variables for categorical mode. + // For Quest tab: in categorical mode we use 2 dividers (3 scrolls) + // In compact mode for Quests we use one divider between the two scrolls. + private int dividerOffset1 = 0; // In categorical: width of left scroll; in compact for quests: width of left scroll. + private int dividerOffset2 = 0; // Only for Quest categorical mode. + private final int dividerWidth = 5; + private final int minScrollWidth = 50; + private boolean isResizing = false; + private int resizingDivider = 0; + private int initialDragX = 0; + + // Layout constants. + private final int leftPadding = 6; + private final int rightPadding = 6; + private final int scrollTopOffset = 30; + private final int verticalGapAboveTF = 3; + private final int textFieldHeight = 20; + private final int verticalGapBelowTF = 3; + + // The player name for which we are displaying data. + private String playerName; + + public SubGuiPlayerDataNew(String playerName) { + this.playerName = playerName; + xSize = 420; + ySize = 215; + setBackground("menubg.png"); + closeOnEsc = true; + PacketClient.sendClient(new PlayerDataGetPacketNew(playerName)); + } + + @Override + public void handleMouseInput() { + super.handleMouseInput(); + } + + @Override + public void initGui() { + super.initGui(); + // Top tab buttons: + GuiMenuTopButton btnQuest = new GuiMenuTopButton(10, guiLeft + 4, guiTop - 10, StatCollector.translateToLocal("tab.quests")); + GuiMenuTopButton btnDialog = new GuiMenuTopButton(11, btnQuest.xPosition + btnQuest.getWidth(), guiTop - 10, StatCollector.translateToLocal("tab.dialog")); + GuiMenuTopButton btnTransport = new GuiMenuTopButton(12, btnDialog.xPosition + btnDialog.getWidth(), guiTop - 10, StatCollector.translateToLocal("tab.transport")); + GuiMenuTopButton btnBank = new GuiMenuTopButton(13, btnTransport.xPosition + btnTransport.getWidth(), guiTop - 10, StatCollector.translateToLocal("tab.bank")); + GuiMenuTopButton btnFaction = new GuiMenuTopButton(14, btnBank.xPosition + btnBank.getWidth(), guiTop - 10, StatCollector.translateToLocal("tab.faction")); + GuiMenuTopButton close = new GuiMenuTopButton(-5, guiLeft + xSize - 22, guiTop - 10, "X"); + + btnQuest.active = (currentTab == 10); + btnDialog.active = (currentTab == 11); + btnTransport.active = (currentTab == 12); + btnBank.active = (currentTab == 13); + btnFaction.active = (currentTab == 14); + addTopButton(btnQuest); + addTopButton(btnDialog); + addTopButton(btnTransport); + addTopButton(btnBank); + addTopButton(btnFaction); + addTopButton(close); + + // Mode toggle button (50px wide) + if (currentTab == 10 || currentTab == 11 || currentTab == 12) { + String modeText = viewMode == 0 ? StatCollector.translateToLocal("view.categorical") : StatCollector.translateToLocal("view.compact"); + addButton(new GuiNpcButton(20, guiLeft + xSize - 60, guiTop + 10, 50, 20, modeText)); + } + + guiTop += 7; + + + // Initialize components for the current tab: + switch (currentTab) { + case 10: initQuestTab(); break; + case 11: initDialogTab(); break; + case 12: initTransportTab(); break; + case 13: + case 14: initSingleTab(); break; + } + // Delete button (50px wide) + addButton(new GuiNpcButton(30, guiLeft + xSize - 60, guiTop + ySize - 30, 50, 20, StatCollector.translateToLocal("button.delete"))); + } + + private int getScrollHeight() { + return ySize - (scrollTopOffset + verticalGapAboveTF + textFieldHeight + verticalGapBelowTF); + } + + private int getTextFieldY() { + return guiTop + scrollTopOffset + getScrollHeight() + verticalGapAboveTF; + } + + // Init Quest Tab. + private void initQuestTab() { + int regionLeft = guiLeft + leftPadding; + int regionRight = guiLeft + xSize - rightPadding; + int availableWidth = regionRight - regionLeft; + int scrollHeight = getScrollHeight(); + + if (viewMode == 0) { // Categorical: 3 scrolls. + if (!isResizing) { + dividerOffset1 = (availableWidth - 2 * dividerWidth) / 3; + dividerOffset2 = dividerOffset1 + dividerWidth + (availableWidth - 2 * dividerWidth) / 3; + } + if (questCatScroll == null) questCatScroll = new GuiCustomScroll(this, 0, 0); + questCatScroll.guiLeft = regionLeft; + questCatScroll.guiTop = guiTop + scrollTopOffset; + questCatScroll.setSize(dividerOffset1, scrollHeight); + questCatScroll.setList(new ArrayList<>(questCatData.keySet())); + questCatScroll.selected = -1; + questCatSearch = ""; + addScroll(questCatScroll); + addLabel(new GuiNpcLabel(1000, "Categories", regionLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + + if (questFinishedScroll == null) questFinishedScroll = new GuiCustomScroll(this, 1, 0); + questFinishedScroll.guiLeft = regionLeft + dividerOffset1 + dividerWidth; + questFinishedScroll.guiTop = guiTop + scrollTopOffset; + questFinishedScroll.setSize(dividerOffset2 - dividerOffset1 - dividerWidth, scrollHeight); + questFinishedScroll.setList(new ArrayList<>()); + questFinishedScroll.selected = -1; + questFinishedSearch = ""; + addScroll(questFinishedScroll); + addLabel(new GuiNpcLabel(1001, "Finished", regionLeft + dividerOffset1 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + + if (questActiveScroll == null) + questActiveScroll = new GuiCustomScroll(this, 2, 0); + + questActiveScroll.guiLeft = regionLeft + dividerOffset2 + dividerWidth; + questActiveScroll.guiTop = guiTop + scrollTopOffset; + questActiveScroll.setSize(regionRight - (regionLeft + dividerOffset2 + dividerWidth), scrollHeight); + questActiveScroll.setList(new ArrayList<>()); + questActiveScroll.selected = -1; + questActiveSearch = ""; + addScroll(questActiveScroll); + addLabel(new GuiNpcLabel(1002, "Active", regionLeft + dividerOffset2 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + + addTextField(new GuiNpcTextField(55, this, fontRendererObj, regionLeft, getTextFieldY(), dividerOffset1, textFieldHeight, questCatSearch)); + addTextField(new GuiNpcTextField(56, this, fontRendererObj, regionLeft + dividerOffset1 + dividerWidth, getTextFieldY(), dividerOffset2 - dividerOffset1 - dividerWidth, textFieldHeight, questFinishedSearch)); + addTextField(new GuiNpcTextField(57, this, fontRendererObj, regionLeft + dividerOffset2 + dividerWidth, getTextFieldY(), regionRight - (regionLeft + dividerOffset2 + dividerWidth), textFieldHeight, questActiveSearch)); + } else { // Compact: 2 scrolls with resizable divider. + // Default divider for compact mode. + if (!isResizing) { + dividerOffset1 = (availableWidth - dividerWidth) / 2; + } + if (questFinishedScroll == null) questFinishedScroll = new GuiCustomScroll(this, 1, 0); + questFinishedScroll.guiLeft = regionLeft; + questFinishedScroll.guiTop = guiTop + scrollTopOffset; + questFinishedScroll.setSize(dividerOffset1, scrollHeight); + questFinishedScroll.setList(new ArrayList<>(questFinishedData.keySet())); + questFinishedSearch = ""; + addScroll(questFinishedScroll); + addLabel(new GuiNpcLabel(1003, "Finished", regionLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + + if (questActiveScroll == null) questActiveScroll = new GuiCustomScroll(this, 2, 0); + questActiveScroll.guiLeft = regionLeft + dividerOffset1 + dividerWidth; + questActiveScroll.guiTop = guiTop + scrollTopOffset; + questActiveScroll.setSize(availableWidth - dividerOffset1 - dividerWidth, scrollHeight); + questActiveScroll.setList(new ArrayList<>(questActiveData.keySet())); + questActiveSearch = ""; + addScroll(questActiveScroll); + addLabel(new GuiNpcLabel(1004, "Active", regionLeft + dividerOffset1 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + + addTextField(new GuiNpcTextField(55, this, fontRendererObj, regionLeft, getTextFieldY(), dividerOffset1, textFieldHeight, questFinishedSearch)); + addTextField(new GuiNpcTextField(56, this, fontRendererObj, regionLeft + dividerOffset1 + dividerWidth, getTextFieldY(), availableWidth - dividerOffset1 - dividerWidth, textFieldHeight, questActiveSearch)); + } + } + + private void initDialogTab() { + int regionLeft = guiLeft + leftPadding; + int regionRight = guiLeft + xSize - rightPadding; + int availableWidth = regionRight - regionLeft; + int scrollHeight = getScrollHeight(); + if (viewMode == 0) { // Categorical: 2 scrolls. + if (!isResizing) { + dividerOffset1 = (availableWidth - dividerWidth) / 2; + } + if (dialogCatScroll == null) dialogCatScroll = new GuiCustomScroll(this, 0, 0); + dialogCatScroll.guiLeft = regionLeft; + dialogCatScroll.guiTop = guiTop + scrollTopOffset; + dialogCatScroll.setSize(dividerOffset1, scrollHeight); + dialogCatScroll.setList(new ArrayList<>(dialogCatData.keySet())); + addScroll(dialogCatScroll); + addLabel(new GuiNpcLabel(2000, "Categories", regionLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + + if (dialogReadScroll == null) dialogReadScroll = new GuiCustomScroll(this, 1, 0); + dialogReadScroll.guiLeft = regionLeft + dividerOffset1 + dividerWidth; + dialogReadScroll.guiTop = guiTop + scrollTopOffset; + dialogReadScroll.setSize(availableWidth - dividerOffset1 - dividerWidth, scrollHeight); + dialogReadScroll.setList(new ArrayList<>(dialogReadData.keySet())); + addScroll(dialogReadScroll); + addLabel(new GuiNpcLabel(2001, "Read", regionLeft + dividerOffset1 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + + addTextField(new GuiNpcTextField(55, this, fontRendererObj, regionLeft, getTextFieldY(), dividerOffset1, textFieldHeight, dialogCatSearch)); + addTextField(new GuiNpcTextField(56, this, fontRendererObj, regionLeft + dividerOffset1 + dividerWidth, getTextFieldY(), availableWidth - dividerOffset1 - dividerWidth, textFieldHeight, dialogReadSearch)); + } else { // Compact: 1 scroll – no divider. + if (dialogCompactScroll == null) dialogCompactScroll = new GuiCustomScroll(this, 5, 0); + dialogCompactScroll.guiLeft = regionLeft; + dialogCompactScroll.guiTop = guiTop + scrollTopOffset; + dialogCompactScroll.setSize(availableWidth, scrollHeight); + dialogCompactScroll.setList(new ArrayList<>(dialogReadData.keySet())); + addScroll(dialogCompactScroll); + addLabel(new GuiNpcLabel(2002, "All", regionLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + addTextField(new GuiNpcTextField(55, this, fontRendererObj, regionLeft, getTextFieldY(), availableWidth, textFieldHeight, dialogCompactSearch)); + } + } + + private void initTransportTab() { + int regionLeft = guiLeft + leftPadding; + int regionRight = guiLeft + xSize - rightPadding; + int availableWidth = regionRight - regionLeft; + int scrollHeight = getScrollHeight(); + if (viewMode == 0) { // Categorical: 2 scrolls. + if (!isResizing) { + dividerOffset1 = (availableWidth - dividerWidth) / 2; + } + if (transCatScroll == null) transCatScroll = new GuiCustomScroll(this, 3, 0); + transCatScroll.guiLeft = regionLeft; + transCatScroll.guiTop = guiTop + scrollTopOffset; + transCatScroll.setSize(dividerOffset1, scrollHeight); + transCatScroll.setList(new ArrayList<>(transCatData.keySet())); + addScroll(transCatScroll); + addLabel(new GuiNpcLabel(3000, "Categories", regionLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + + if (transLocScroll == null) transLocScroll = new GuiCustomScroll(this, 4, 0); + transLocScroll.guiLeft = regionLeft + dividerOffset1 + dividerWidth; + transLocScroll.guiTop = guiTop + scrollTopOffset; + transLocScroll.setSize(availableWidth - dividerOffset1 - dividerWidth, scrollHeight); + transLocScroll.setList(new ArrayList<>(transLocData.keySet())); + addScroll(transLocScroll); + addLabel(new GuiNpcLabel(3001, "Locations", regionLeft + dividerOffset1 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + + addTextField(new GuiNpcTextField(60, this, fontRendererObj, regionLeft, getTextFieldY(), dividerOffset1, textFieldHeight, transCatSearch)); + addTextField(new GuiNpcTextField(61, this, fontRendererObj, regionLeft + dividerOffset1 + dividerWidth, getTextFieldY(), availableWidth - dividerOffset1 - dividerWidth, textFieldHeight, transLocSearch)); + } else { // Compact: 1 scroll – no divider. + if (transCompactScroll == null) transCompactScroll = new GuiCustomScroll(this, 5, 0); + transCompactScroll.guiLeft = regionLeft; + transCompactScroll.guiTop = guiTop + scrollTopOffset; + transCompactScroll.setSize(availableWidth, scrollHeight); + transCompactScroll.setList(new ArrayList<>(transLocData.keySet())); + addScroll(transCompactScroll); + addLabel(new GuiNpcLabel(3002, "All", regionLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + addTextField(new GuiNpcTextField(60, this, fontRendererObj, regionLeft, getTextFieldY(), availableWidth, textFieldHeight, transCompactSearch)); + } + } + + private void initSingleTab() { + int regionLeft = guiLeft + leftPadding; + int regionRight = guiLeft + xSize - rightPadding; + int availableWidth = regionRight - regionLeft; + int scrollHeight = getScrollHeight(); + if (singleScroll == null) singleScroll = new GuiCustomScroll(this, 0, 0); + singleScroll.guiLeft = regionLeft; + singleScroll.guiTop = guiTop + scrollTopOffset; + if (currentTab == 13) { + singleScroll.setSize(availableWidth, scrollHeight); + singleScroll.setList(new ArrayList<>(bankData.keySet())); + addLabel(new GuiNpcLabel(4000, "Bank", regionLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + } else { + singleScroll.setSize(availableWidth, scrollHeight); + singleScroll.setList(new ArrayList<>(factionData.keySet())); + addLabel(new GuiNpcLabel(4000, "Faction", regionLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + } + addScroll(singleScroll); + addTextField(new GuiNpcTextField(70, this, fontRendererObj, regionLeft, getTextFieldY(), availableWidth, textFieldHeight, singleSearch)); + } + + @Override + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + super.drawScreen(mouseX, mouseY, partialTicks); + int scrollHeight = getScrollHeight(); + int regionLeft = guiLeft + leftPadding; + int regionRight = guiLeft + xSize - rightPadding; + int availableWidth = regionRight - regionLeft; + // In compact mode for Quests (2-scroll) draw divider. + if (currentTab == 10 && viewMode != 0 && !hasSubGui()) { + int dividerX = regionLeft + dividerOffset1; + drawRect(dividerX, guiTop + scrollTopOffset, dividerX + dividerWidth, guiTop + scrollTopOffset + scrollHeight, 0xFF707070); + } + // In categorical mode, draw dividers. + if (currentTab == 10 && viewMode == 0 && !hasSubGui()) { + int dividerX1 = regionLeft + dividerOffset1; + int dividerX2 = regionLeft + dividerOffset2; + drawRect(dividerX1, guiTop + scrollTopOffset, dividerX1 + dividerWidth, guiTop + scrollTopOffset + scrollHeight, 0xFF707070); + drawRect(dividerX2, guiTop + scrollTopOffset, dividerX2 + dividerWidth, guiTop + scrollTopOffset + scrollHeight, 0xFF707070); + } else if ((currentTab == 11 || currentTab == 12) && viewMode == 0 && !hasSubGui()) { + int dividerX = regionLeft + dividerOffset1; + drawRect(dividerX, guiTop + scrollTopOffset, dividerX + dividerWidth, guiTop + scrollTopOffset + scrollHeight, 0xFF707070); + } + // Do not draw any divider for compact mode in Dialog/Transport. + } + + @Override + public void mouseClicked(int mouseX, int mouseY, int mouseButton) { + int hitMargin = 3; + int regionTop = guiTop + scrollTopOffset; + int regionBottom = regionTop + getScrollHeight(); + int regionLeft = guiLeft + leftPadding; + int availableWidth = (guiLeft + xSize - rightPadding) - regionLeft; + if (!hasSubGui() && mouseY >= regionTop && mouseY <= regionBottom) { + if (viewMode == 0) { + if (currentTab == 10) { // Categorical: 3 scrolls. + int dividerX1 = regionLeft + dividerOffset1; + int dividerX2 = regionLeft + dividerOffset2; + if (mouseX >= dividerX1 - hitMargin && mouseX <= dividerX1 + dividerWidth + hitMargin) { + isResizing = true; + resizingDivider = 1; + initialDragX = mouseX; + return; + } else if (mouseX >= dividerX2 - hitMargin && mouseX <= dividerX2 + dividerWidth + hitMargin) { + isResizing = true; + resizingDivider = 2; + initialDragX = mouseX; + return; + } + } else if (currentTab == 11 || currentTab == 12) { // Categorical for Dialog/Transport. + int dividerX = regionLeft + dividerOffset1; + if (mouseX >= dividerX - hitMargin && mouseX <= dividerX + dividerWidth + hitMargin) { + isResizing = true; + resizingDivider = 1; + initialDragX = mouseX; + return; + } + } + } else { // Compact mode. + if (currentTab == 10) { // Compact mode for Quests (2 scrolls) + // Use dividerOffset1 as the divider between the two scrolls. + int defaultWidth = (availableWidth - dividerWidth) / 2; + if (!isResizing) dividerOffset1 = defaultWidth; + int dividerX = regionLeft + dividerOffset1; + if (mouseX >= dividerX - hitMargin && mouseX <= dividerX + dividerWidth + hitMargin) { + isResizing = true; + resizingDivider = 1; + initialDragX = mouseX; + return; + } + } + // For Dialog/Transport compact, there's no divider. + } + } + super.mouseClicked(mouseX, mouseY, mouseButton); + } + + @Override + public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { + int regionLeft = guiLeft + leftPadding; + int regionRight = guiLeft + xSize - rightPadding; + int availableWidth = regionRight - regionLeft; + if (isResizing) { + int dx = mouseX - initialDragX; + initialDragX = mouseX; + // For Quest tab: + if (currentTab == 10) { + if (viewMode == 0) { // Categorical (3 scrolls) + if (resizingDivider == 1) { + dividerOffset1 += dx; + int maxOffset = dividerOffset2 - dividerWidth - minScrollWidth; + if (dividerOffset1 < minScrollWidth) dividerOffset1 = minScrollWidth; + if (dividerOffset1 > maxOffset) dividerOffset1 = maxOffset; + questCatScroll.setSize(dividerOffset1, getScrollHeight()); + questFinishedScroll.guiLeft = regionLeft + dividerOffset1 + dividerWidth; + questFinishedScroll.setSize(dividerOffset2 - dividerOffset1 - dividerWidth, getScrollHeight()); + questActiveScroll.guiLeft = regionLeft + dividerOffset2 + dividerWidth; + questActiveScroll.setSize(availableWidth - (dividerOffset2 + dividerWidth), getScrollHeight()); + // Update textfields and labels. + GuiNpcTextField tf55 = getTextField(55); + if(tf55 != null) { tf55.xPosition = regionLeft; tf55.width = dividerOffset1; } + GuiNpcTextField tf56 = getTextField(56); + if(tf56 != null) { tf56.xPosition = regionLeft + dividerOffset1 + dividerWidth; tf56.width = dividerOffset2 - dividerOffset1 - dividerWidth; } + GuiNpcTextField tf57 = getTextField(57); + if(tf57 != null) { tf57.xPosition = regionLeft + dividerOffset2 + dividerWidth; tf57.width = availableWidth - (dividerOffset2 + dividerWidth); } + GuiNpcLabel lbl1000 = getLabel(1000); + if(lbl1000 != null) { lbl1000.x = regionLeft; } + GuiNpcLabel lbl1001 = getLabel(1001); + if(lbl1001 != null) { lbl1001.x = regionLeft + dividerOffset1 + dividerWidth; } + GuiNpcLabel lbl1002 = getLabel(1002); + if(lbl1002 != null) { lbl1002.x = regionLeft + dividerOffset2 + dividerWidth; } + } else if (resizingDivider == 2) { + dividerOffset2 += dx; + int minOffset = dividerOffset1 + dividerWidth + minScrollWidth; + int maxOffset = availableWidth - minScrollWidth; + if (dividerOffset2 < minOffset) dividerOffset2 = minOffset; + if (dividerOffset2 > maxOffset) dividerOffset2 = maxOffset; + questFinishedScroll.setSize(dividerOffset2 - dividerOffset1 - dividerWidth, getScrollHeight()); + questActiveScroll.guiLeft = regionLeft + dividerOffset2 + dividerWidth; + questActiveScroll.setSize(availableWidth - (dividerOffset2 + dividerWidth), getScrollHeight()); + GuiNpcTextField tf56 = getTextField(56); + if(tf56 != null) { tf56.xPosition = regionLeft + dividerOffset1 + dividerWidth; tf56.width = dividerOffset2 - dividerOffset1 - dividerWidth; } + GuiNpcTextField tf57 = getTextField(57); + if(tf57 != null) { tf57.xPosition = regionLeft + dividerOffset2 + dividerWidth; tf57.width = availableWidth - (dividerOffset2 + dividerWidth); } + GuiNpcLabel lbl1001 = getLabel(1001); + if(lbl1001 != null) { lbl1001.x = regionLeft + dividerOffset1 + dividerWidth; } + GuiNpcLabel lbl1002 = getLabel(1002); + if(lbl1002 != null) { lbl1002.x = regionLeft + dividerOffset2 + dividerWidth; } + } + } else { // Compact mode for Quests (2 scrolls) + if (resizingDivider == 1) { + dividerOffset1 += dx; + if (dividerOffset1 < minScrollWidth) dividerOffset1 = minScrollWidth; + if (dividerOffset1 > availableWidth - dividerWidth - minScrollWidth) + dividerOffset1 = availableWidth - dividerWidth - minScrollWidth; + questFinishedScroll.setSize(dividerOffset1, getScrollHeight()); + questActiveScroll.guiLeft = regionLeft + dividerOffset1 + dividerWidth; + questActiveScroll.setSize(availableWidth - dividerOffset1 - dividerWidth, getScrollHeight()); + // Update textfields and labels. + GuiNpcTextField tf55 = getTextField(55); + if(tf55 != null) { tf55.xPosition = regionLeft; tf55.width = dividerOffset1; } + GuiNpcTextField tf56 = getTextField(56); + if(tf56 != null) { tf56.xPosition = regionLeft + dividerOffset1 + dividerWidth; tf56.width = availableWidth - dividerOffset1 - dividerWidth; } + GuiNpcLabel lbl1003 = getLabel(1003); + if(lbl1003 != null) { lbl1003.x = regionLeft; } + GuiNpcLabel lbl1004 = getLabel(1004); + if(lbl1004 != null) { lbl1004.x = regionLeft + dividerOffset1 + dividerWidth; } + } + } + } + return; + } + super.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick); + } + + @Override + protected void mouseMovedOrUp(int mouseX, int mouseY, int state) { + if (isResizing) { + isResizing = false; + resizingDivider = 0; + return; + } + super.mouseMovedOrUp(mouseX, mouseY, state); + } + + @Override + public void keyTyped(char c, int i) { + super.keyTyped(c, i); + GuiNpcTextField tf; + if (currentTab == 10) { + if (viewMode == 0) { + tf = getTextField(55); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!questCatSearch.equals(newText)) { + questCatSearch = newText; + if (questCatScroll != null) { + if (selectedQuestCategory.isEmpty()) + questCatScroll.setList(new ArrayList<>()); + else + questCatScroll.setList(filterList(questCatData, questCatSearch)); + } + } + } + tf = getTextField(56); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!questFinishedSearch.equals(newText)) { + questFinishedSearch = newText; + if (questFinishedScroll != null) + questFinishedScroll.setList( + selectedQuestCategory.isEmpty() ? + new ArrayList<>() : + filterAndTrimListByCategory(questFinishedData, selectedQuestCategory, questFinishedSearch) + ); + } + } + tf = getTextField(57); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!questActiveSearch.equals(newText)) { + questActiveSearch = newText; + if (questActiveScroll != null) + questActiveScroll.setList( + selectedQuestCategory.isEmpty() ? + new ArrayList<>() : + filterAndTrimListByCategory(questActiveData, selectedQuestCategory, questActiveSearch) + ); + } + } + } else { + tf = getTextField(55); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!questFinishedSearch.equals(newText)) { + questFinishedSearch = newText; + if (questFinishedScroll != null) + questFinishedScroll.setList(filterList(questFinishedData, questFinishedSearch)); + } + } + tf = getTextField(56); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!questActiveSearch.equals(newText)) { + questActiveSearch = newText; + if (questActiveScroll != null) + questActiveScroll.setList(filterList(questActiveData, questActiveSearch)); + } + } + } + } else if (currentTab == 11) { + if (viewMode == 0) { + tf = getTextField(55); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!dialogCatSearch.equals(newText)) { + dialogCatSearch = newText; + if (dialogCatScroll != null) + dialogCatScroll.setList(selectedDialogCategory.isEmpty() ? + new ArrayList<>() : + filterList(dialogCatData, dialogCatSearch)); + } + } + tf = getTextField(56); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!dialogReadSearch.equals(newText)) { + dialogReadSearch = newText; + if (dialogReadScroll != null) + dialogReadScroll.setList( + selectedDialogCategory.isEmpty() ? + new ArrayList<>() : + filterAndTrimListByCategory(dialogReadData, selectedDialogCategory, dialogReadSearch) + ); + } + } + } else { + tf = getTextField(55); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!dialogCompactSearch.equals(newText)) { + dialogCompactSearch = newText; + if (dialogCompactScroll != null) + dialogCompactScroll.setList(filterList(dialogReadData, dialogCompactSearch)); + } + } + } + } else if (currentTab == 12) { + if (viewMode == 0) { + tf = getTextField(60); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!transCatSearch.equals(newText)) { + transCatSearch = newText; + if (transCatScroll != null) + transCatScroll.setList(selectedTransCategory.isEmpty() ? + new ArrayList<>() : + filterList(transCatData, transCatSearch)); + } + } + tf = getTextField(61); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!transLocSearch.equals(newText)) { + transLocSearch = newText; + if (transLocScroll != null) + transLocScroll.setList( + selectedTransCategory.isEmpty() ? + new ArrayList<>() : + filterAndTrimListByCategory(transLocData, selectedTransCategory, transLocSearch) + ); + } + } + } else { + tf = getTextField(60); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!transCompactSearch.equals(newText)) { + transCompactSearch = newText; + if (transCompactScroll != null) + transCompactScroll.setList(filterList(transLocData, transCompactSearch)); + } + } + } + } else if (currentTab == 13 || currentTab == 14) { + tf = getTextField(70); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!singleSearch.equals(newText)) { + singleSearch = newText; + if (singleScroll != null) + singleScroll.setList(filterList(currentTab == 13 ? bankData : factionData, singleSearch)); + } + } + } + } + + private List filterList(HashMap data, String search) { + List list = new ArrayList<>(); + for (String key : data.keySet()) { + if (key.toLowerCase().contains(search)) { + list.add(key); + } + } + return list; + } + + private List filterAndTrimListByCategory(HashMap data, String category, String search) { + List list = new ArrayList<>(); + String prefix = category + ":"; + for (String key : data.keySet()) { + if (key.startsWith(prefix)) { + String trimmed = key.substring(prefix.length()).trim(); + if (trimmed.toLowerCase().contains(search)) { + list.add(trimmed); + } + } + } + return list; + } + + @Override + public void actionPerformed(GuiButton button) { + if(button.id == -5){ + close(); + return; + } + if (button.id >= 10 && button.id <= 14) { + currentTab = button.id; + initGui(); + return; + } + if (button.id == 20) { + viewMode = (viewMode == 0) ? 1 : 0; + initGui(); + } else if (button.id == 30) { + Integer selectedID = null; + EnumPlayerData tabType = null; + if (currentTab == 10) { + if(viewMode == 0){ + if(questCatScroll.getSelected() == null) + return; + if (questActiveScroll.getSelected() != null) { + selectedID = questActiveData.get(questCatScroll.getSelected() + ": " + questActiveScroll.getSelected()); + if(selectedID != null){ + questActiveScroll.list.remove(questActiveScroll.selected); + questActiveData.remove(questCatScroll.getSelected() + ": " + questActiveScroll.getSelected()); + } + tabType = EnumPlayerData.Quest; + } else if (questFinishedScroll.getSelected() != null) { + selectedID = questFinishedData.get(questCatScroll.getSelected() + ": " + questFinishedScroll.getSelected()); + if(selectedID != null){ + questFinishedScroll.list.remove(questFinishedScroll.selected); + questFinishedData.remove(questCatScroll.getSelected() + ": " + questFinishedScroll.getSelected()); + } + tabType = EnumPlayerData.Quest; + } + } else { + if (questActiveScroll.getSelected() != null) { + selectedID = questActiveData.get(questActiveScroll.getSelected()); + if(selectedID != null){ + questActiveScroll.list.remove(questActiveScroll.selected); + questActiveData.remove(questActiveScroll.getSelected()); + } + tabType = EnumPlayerData.Quest; + } else if (questFinishedScroll.getSelected() != null) { + selectedID = questFinishedData.get(questFinishedScroll.getSelected()); + if(selectedID != null){ + questFinishedScroll.list.remove(questFinishedScroll.selected); + questFinishedData.remove(questFinishedScroll.getSelected()); + } + tabType = EnumPlayerData.Quest; + } + } + } else if (currentTab == 11) { + if (viewMode == 0) { + if (dialogReadScroll.getSelected() != null && dialogCatScroll.getSelected() != null) { + selectedID = dialogReadData.get(dialogCatScroll.getSelected() + ": " + dialogReadScroll.getSelected()); + if(selectedID != null){ + dialogReadScroll.list.remove(dialogReadScroll.selected); + dialogReadData.remove(dialogCatScroll.getSelected() + ": " + dialogReadScroll.getSelected()); + } + tabType = EnumPlayerData.Dialog; + } + } else { + if (dialogCompactScroll.getSelected() != null) { + selectedID = dialogReadData.get(dialogCompactScroll.getSelected()); + if(selectedID != null){ + dialogCompactScroll.list.remove(dialogCompactScroll.selected); + dialogReadData.remove(dialogCompactScroll.getSelected()); + } + tabType = EnumPlayerData.Dialog; + } + } + } else if (currentTab == 12) { + if (viewMode == 0) { + if (transLocScroll.getSelected() != null && transCatScroll.getSelected() != null) { + selectedID = transLocData.get(transCatScroll.getSelected() + ": " + transLocScroll.getSelected()); + if(selectedID != null){ + transLocScroll.list.remove(transLocScroll.selected); + transLocData.remove(transCatScroll.getSelected() + ": " + transLocScroll.getSelected()); + } + tabType = EnumPlayerData.Transport; + } + } else { + if (transCompactScroll.getSelected() != null) { + selectedID = transLocData.get(transCompactScroll.getSelected()); + if(selectedID != null){ + transCompactScroll.list.remove(transCompactScroll.selected); + transLocData.remove(transCompactScroll.getSelected()); + } + tabType = EnumPlayerData.Transport; + } + } + } else if (currentTab == 13) { + if (singleScroll.getSelected() != null) { + selectedID = bankData.get(singleScroll.getSelected()); + if(selectedID != null){ + singleScroll.list.remove(singleScroll.selected); + bankData.remove(singleScroll.getSelected()); + } + tabType = EnumPlayerData.Bank; + } + } else if (currentTab == 14) { + if (singleScroll.getSelected() != null) { + selectedID = factionData.get(singleScroll.getSelected()); + if(selectedID != null){ + singleScroll.list.remove(singleScroll.selected); + bankData.remove(singleScroll.getSelected()); + } + tabType = EnumPlayerData.Factions; + } + } + if (selectedID != null) { + PacketClient.sendClient(new PlayerDataRemovePacketNew(playerName, tabType, selectedID)); + } + } + } + + @Override + public void setQuestData(Map questCategories, Map questActive, Map questFinished) { + this.questCatData = new HashMap<>(questCategories); + this.questActiveData = new HashMap<>(questActive); + this.questFinishedData = new HashMap<>(questFinished); + if (questCatScroll != null) { + questCatScroll.setList(new ArrayList<>(questCatData.keySet())); + } + } + + @Override + public void setDialogData(Map dialogCategories, Map dialogRead) { + this.dialogCatData = new HashMap<>(dialogCategories); + this.dialogReadData = new HashMap<>(dialogRead); + if (dialogCatScroll != null) { + dialogCatScroll.setList(new ArrayList<>(dialogCatData.keySet())); + } + if (dialogReadScroll != null) { + dialogReadScroll.setList(new ArrayList<>(dialogReadData.keySet())); + } + if (dialogCompactScroll != null) { + List merged = new ArrayList<>(dialogReadData.keySet()); + dialogCompactScroll.setList(merged); + } + } + + @Override + public void setTransportData(Map transportCategories, Map transportLocations) { + this.transCatData = new HashMap<>(transportCategories); + this.transLocData = new HashMap<>(transportLocations); + if (transCatScroll != null) { + transCatScroll.setList(new ArrayList<>(transCatData.keySet())); + } + if (transLocScroll != null) { + transLocScroll.setList(new ArrayList<>(transLocData.keySet())); + } + if (transCompactScroll != null) { + List merged = new ArrayList<>(transLocData.keySet()); + transCompactScroll.setList(merged); + } + } + + @Override + public void setBankData(Map bankData) { + this.bankData = new HashMap<>(bankData); + if (singleScroll != null && currentTab == 13) { + singleScroll.setList(new ArrayList<>(this.bankData.keySet())); + } + } + + @Override + public void setFactionData(Map factionData) { + this.factionData = new HashMap<>(factionData); + if (singleScroll != null && currentTab == 14) { + singleScroll.setList(new ArrayList<>(this.factionData.keySet())); + } + } + + @Override + public void customScrollClicked(int i, int j, int k, GuiCustomScroll guiCustomScroll) { + if (guiCustomScroll == questCatScroll) { + selectedQuestCategory = questCatScroll.getSelected(); + questFinishedScroll.resetScroll(); + questActiveScroll.resetScroll(); + if (!selectedQuestCategory.isEmpty()) { + questFinishedScroll.setList(filterAndTrimListByCategory(questFinishedData, selectedQuestCategory, questFinishedSearch)); + questActiveScroll.setList(filterAndTrimListByCategory(questActiveData, selectedQuestCategory, questActiveSearch)); + } else { + questFinishedScroll.setList(new ArrayList<>()); + questActiveScroll.setList(new ArrayList<>()); + } + } else if (guiCustomScroll == dialogCatScroll) { + selectedDialogCategory = dialogCatScroll.getSelected(); + dialogReadScroll.resetScroll(); + if (!selectedDialogCategory.isEmpty()) { + dialogReadScroll.setList(filterAndTrimListByCategory(dialogReadData, selectedDialogCategory, dialogReadSearch)); + } else { + dialogReadScroll.setList(new ArrayList<>()); + } + } else if (guiCustomScroll == transCatScroll) { + selectedTransCategory = transCatScroll.getSelected(); + transLocScroll.resetScroll(); + if (!selectedTransCategory.isEmpty()) { + transLocScroll.setList(filterAndTrimListByCategory(transLocData, selectedTransCategory, transLocSearch)); + } else { + transLocScroll.setList(new ArrayList<>()); + } + } else if (guiCustomScroll == questActiveScroll) { + questFinishedScroll.selected = -1; + } else if (guiCustomScroll == questFinishedScroll) { + questActiveScroll.selected = -1; + } + } +} diff --git a/src/main/java/noppes/npcs/client/gui/util/GuiCustomScroll.java b/src/main/java/noppes/npcs/client/gui/util/GuiCustomScroll.java index 68f5e6de7..4e466040d 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiCustomScroll.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiCustomScroll.java @@ -15,7 +15,7 @@ import static noppes.npcs.client.gui.util.GuiNPCInterface.resizingActive; public class GuiCustomScroll extends GuiScreen { public static final ResourceLocation resource = new ResourceLocation("customnpcs","textures/gui/misc.png"); - protected List list; + public List list; public final HashMap colors = new HashMap<>(); public int id; diff --git a/src/main/java/noppes/npcs/client/gui/util/GuiNPCInterface.java b/src/main/java/noppes/npcs/client/gui/util/GuiNPCInterface.java index 7ffbc3b34..d605aaa76 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiNPCInterface.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiNPCInterface.java @@ -162,6 +162,24 @@ public abstract class GuiNPCInterface extends GuiScreen { } } + @Override + public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { + if (subgui != null) { + subgui.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick); + return; + } + super.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick); + } + + @Override + protected void mouseMovedOrUp(int mouseX, int mouseY, int state) { + if (subgui != null) { + subgui.mouseMovedOrUp(mouseX, mouseY, state); + return; + } + super.mouseMovedOrUp(mouseX, mouseY, state); + } + public void mouseEvent(int i, int j, int k){} @Override