From e15e72d478dd1f5c8fe52f6f587ed99a7c1d39f4 Mon Sep 17 00:00:00 2001 From: Kam Date: Thu, 20 Feb 2025 00:41:45 -0500 Subject: [PATCH] =?UTF-8?q?Full=20Refactor=20and=20Now=20it=20looks=20bett?= =?UTF-8?q?er=20=F0=9F=92=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kamkeel/npcs/network/PacketHandler.java | 22 +- .../npcs/network/enums/EnumRequestPacket.java | 13 +- .../packets/data/PlayerDataInfoPacket.java} | 20 +- .../playerdata/PlayerDataGetInfoPacket.java} | 13 +- ...ket.java => PlayerDataGetNamesPacket.java} | 8 +- .../PlayerDataRemoveInfoPacket.java} | 11 +- .../java/noppes/npcs/NoppesUtilServer.java | 139 ++ .../java/noppes/npcs/client/NoppesUtil.java | 58 + .../npcs/client/gui/SubGuiPlayerData.java | 1565 +++++++++-------- .../gui/global/GuiNpcManagePlayerData.java | 7 +- .../client/gui/test/NoppesUtilClientNew.java | 74 - .../client/gui/test/NoppesUtilServerNew.java | 155 -- .../npcs/client/gui/test/PlayerDataTab.java | 9 - .../client/gui/test/SubGuiPlayerDataNew.java | 864 --------- .../gui/{test => util}/IPlayerDataInfo.java | 2 +- 15 files changed, 1073 insertions(+), 1887 deletions(-) rename src/main/java/{noppes/npcs/client/gui/test/PlayerDataSendPacketNew.java => kamkeel/npcs/network/packets/data/PlayerDataInfoPacket.java} (79%) rename src/main/java/{noppes/npcs/client/gui/test/PlayerDataGetPacketNew.java => kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetInfoPacket.java} (73%) rename src/main/java/kamkeel/npcs/network/packets/request/playerdata/{PlayerDataGetPacket.java => PlayerDataGetNamesPacket.java} (88%) rename src/main/java/{noppes/npcs/client/gui/test/PlayerDataRemovePacketNew.java => kamkeel/npcs/network/packets/request/playerdata/PlayerDataRemoveInfoPacket.java} (77%) delete mode 100644 src/main/java/noppes/npcs/client/gui/test/NoppesUtilClientNew.java delete mode 100644 src/main/java/noppes/npcs/client/gui/test/NoppesUtilServerNew.java delete mode 100644 src/main/java/noppes/npcs/client/gui/test/PlayerDataTab.java delete mode 100644 src/main/java/noppes/npcs/client/gui/test/SubGuiPlayerDataNew.java rename src/main/java/noppes/npcs/client/gui/{test => util}/IPlayerDataInfo.java (93%) diff --git a/src/main/java/kamkeel/npcs/network/PacketHandler.java b/src/main/java/kamkeel/npcs/network/PacketHandler.java index 10a5fd259..b1ba1f217 100644 --- a/src/main/java/kamkeel/npcs/network/PacketHandler.java +++ b/src/main/java/kamkeel/npcs/network/PacketHandler.java @@ -53,7 +53,7 @@ import kamkeel.npcs.network.packets.request.npc.*; import kamkeel.npcs.network.packets.request.party.*; import kamkeel.npcs.network.packets.request.pather.MovingPathGetPacket; import kamkeel.npcs.network.packets.request.pather.MovingPathSavePacket; -import kamkeel.npcs.network.packets.request.playerdata.PlayerDataGetPacket; +import kamkeel.npcs.network.packets.request.playerdata.PlayerDataGetNamesPacket; import kamkeel.npcs.network.packets.request.playerdata.PlayerDataMapRegenPacket; import kamkeel.npcs.network.packets.request.playerdata.PlayerDataRemovePacket; import kamkeel.npcs.network.packets.request.profile.*; @@ -82,9 +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 kamkeel.npcs.network.packets.request.playerdata.PlayerDataGetInfoPacket; +import kamkeel.npcs.network.packets.request.playerdata.PlayerDataRemoveInfoPacket; +import kamkeel.npcs.network.packets.data.PlayerDataInfoPacket; import noppes.npcs.config.ConfigMain; import noppes.npcs.entity.EntityNPCInterface; @@ -230,12 +230,10 @@ public class PacketHandler { // PlayerData Packets - REQUEST_PACKET.registerPacket(new PlayerDataGetPacket()); -// REQUEST_PACKET.registerPacket(new PlayerDataRemovePacket()); - - REQUEST_PACKET.registerPacket(new PlayerDataGetPacketNew()); - REQUEST_PACKET.registerPacket(new PlayerDataRemovePacketNew()); - + REQUEST_PACKET.registerPacket(new PlayerDataGetNamesPacket()); + REQUEST_PACKET.registerPacket(new PlayerDataRemovePacket()); + REQUEST_PACKET.registerPacket(new PlayerDataGetInfoPacket()); + REQUEST_PACKET.registerPacket(new PlayerDataRemoveInfoPacket()); REQUEST_PACKET.registerPacket(new PlayerDataMapRegenPacket()); // Main Menu Packets @@ -355,9 +353,6 @@ public class PacketHandler { } public void registerDataPackets(){ - - DATA_PACKET.registerPacket(new PlayerDataSendPacketNew()); - // Data Packets DATA_PACKET.registerPacket(new LoginPacket()); DATA_PACKET.registerPacket(new AchievementPacket()); @@ -375,6 +370,7 @@ public class PacketHandler { DATA_PACKET.registerPacket(new SwingPlayerArmPacket()); DATA_PACKET.registerPacket(new UpdateAnimationsPacket()); DATA_PACKET.registerPacket(new VillagerListPacket()); + DATA_PACKET.registerPacket(new PlayerDataInfoPacket()); // Data | GUI Packets DATA_PACKET.registerPacket(new GuiClosePacket()); diff --git a/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java b/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java index 3036d9a88..9f7278368 100644 --- a/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java +++ b/src/main/java/kamkeel/npcs/network/enums/EnumRequestPacket.java @@ -136,7 +136,9 @@ public enum EnumRequestPacket { QuestCategoryGet, - PlayerDataGet, + PlayerDataInfo, + PlayerDataGetNames, + PlayerDataDelete, PlayerDataRemove, PlayerDataMapRegen, @@ -186,5 +188,12 @@ public enum EnumRequestPacket { ColorSet, ColorBrush, - ProfileGet, ProfileGetAll, ProfileGetInfo, ProfileCreate, ProfileRemove, ProfileRename, ProfileChange, PlayerDataGetOld, + + ProfileGet, + ProfileGetAll, + ProfileGetInfo, + ProfileCreate, + ProfileRemove, + ProfileRename, + ProfileChange } diff --git a/src/main/java/noppes/npcs/client/gui/test/PlayerDataSendPacketNew.java b/src/main/java/kamkeel/npcs/network/packets/data/PlayerDataInfoPacket.java similarity index 79% rename from src/main/java/noppes/npcs/client/gui/test/PlayerDataSendPacketNew.java rename to src/main/java/kamkeel/npcs/network/packets/data/PlayerDataInfoPacket.java index 2352fd063..ca639fb21 100644 --- a/src/main/java/noppes/npcs/client/gui/test/PlayerDataSendPacketNew.java +++ b/src/main/java/kamkeel/npcs/network/packets/data/PlayerDataInfoPacket.java @@ -1,4 +1,4 @@ -package noppes.npcs.client.gui.test; +package kamkeel.npcs.network.packets.data; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; @@ -8,10 +8,12 @@ import kamkeel.npcs.network.PacketHandler; import kamkeel.npcs.network.enums.EnumDataPacket; import kamkeel.npcs.util.ByteBufUtils; import net.minecraft.entity.player.EntityPlayer; +import noppes.npcs.client.NoppesUtil; + import java.io.IOException; import java.util.Map; -public final class PlayerDataSendPacketNew extends LargeAbstractPacket { +public final class PlayerDataInfoPacket extends LargeAbstractPacket { public static final String packetName = "Large|PlayerDataSendNew"; private String playerName; @@ -28,13 +30,13 @@ public final class PlayerDataSendPacketNew extends LargeAbstractPacket { private Map bankData; private Map factionData; - public PlayerDataSendPacketNew() {} + public PlayerDataInfoPacket() {} - public PlayerDataSendPacketNew(String playerName, - Map questCategories, Map questActive, Map questFinished, - Map dialogCategories, Map dialogRead, - Map transportCategories, Map transportLocations, - Map bankData, Map factionData) { + public PlayerDataInfoPacket(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; @@ -96,6 +98,6 @@ public final class PlayerDataSendPacketNew extends LargeAbstractPacket { @Override protected void handleCompleteData(ByteBuf data, EntityPlayer player) throws IOException { - NoppesUtilClientNew.handlePlayerData(data, player); + NoppesUtil.handlePlayerData(data, player); } } diff --git a/src/main/java/noppes/npcs/client/gui/test/PlayerDataGetPacketNew.java b/src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetInfoPacket.java similarity index 73% rename from src/main/java/noppes/npcs/client/gui/test/PlayerDataGetPacketNew.java rename to src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetInfoPacket.java index fe12b0333..f4037e2c7 100644 --- a/src/main/java/noppes/npcs/client/gui/test/PlayerDataGetPacketNew.java +++ b/src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetInfoPacket.java @@ -1,4 +1,4 @@ -package noppes.npcs.client.gui.test; +package kamkeel.npcs.network.packets.request.playerdata; import io.netty.buffer.ByteBuf; import kamkeel.npcs.network.AbstractPacket; @@ -8,22 +8,23 @@ 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.NoppesUtilServer; import java.io.IOException; -public final class PlayerDataGetPacketNew extends AbstractPacket { +public final class PlayerDataGetInfoPacket extends AbstractPacket { public static final String packetName = "Request|PlayerDataGetNew"; private String playerName; - public PlayerDataGetPacketNew() {} + public PlayerDataGetInfoPacket() {} - public PlayerDataGetPacketNew(String playerName) { + public PlayerDataGetInfoPacket(String playerName) { this.playerName = playerName; } @Override public Enum getType() { - return EnumRequestPacket.PlayerDataGet; + return EnumRequestPacket.PlayerDataInfo; } @Override @@ -42,6 +43,6 @@ public final class PlayerDataGetPacketNew extends AbstractPacket { return; String playerName = ByteBufUtils.readString(in); - NoppesUtilServerNew.sendPlayerData(playerName, (EntityPlayerMP) player); + NoppesUtilServer.sendPlayerDataInfo(playerName, (EntityPlayerMP) player); } } diff --git a/src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetPacket.java b/src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetNamesPacket.java similarity index 88% rename from src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetPacket.java rename to src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetNamesPacket.java index 9f4ea14f6..7bc09452e 100644 --- a/src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetPacket.java +++ b/src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataGetNamesPacket.java @@ -17,22 +17,22 @@ import noppes.npcs.constants.EnumPlayerData; import java.io.IOException; -public final class PlayerDataGetPacket extends AbstractPacket { +public final class PlayerDataGetNamesPacket extends AbstractPacket { public static String packetName = "Request|PlayerDataGet"; private EnumPlayerData playerData; private String name; - public PlayerDataGetPacket() {} + public PlayerDataGetNamesPacket() {} - public PlayerDataGetPacket(EnumPlayerData playerData, String name) { + public PlayerDataGetNamesPacket(EnumPlayerData playerData, String name) { this.playerData = playerData; this.name = name; } @Override public Enum getType() { - return EnumRequestPacket.PlayerDataGetOld; + return EnumRequestPacket.PlayerDataGetNames; } @Override diff --git a/src/main/java/noppes/npcs/client/gui/test/PlayerDataRemovePacketNew.java b/src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataRemoveInfoPacket.java similarity index 77% rename from src/main/java/noppes/npcs/client/gui/test/PlayerDataRemovePacketNew.java rename to src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataRemoveInfoPacket.java index ea5133271..38d4dab7a 100644 --- a/src/main/java/noppes/npcs/client/gui/test/PlayerDataRemovePacketNew.java +++ b/src/main/java/kamkeel/npcs/network/packets/request/playerdata/PlayerDataRemoveInfoPacket.java @@ -1,4 +1,4 @@ -package noppes.npcs.client.gui.test; +package kamkeel.npcs.network.packets.request.playerdata; import io.netty.buffer.ByteBuf; import kamkeel.npcs.network.AbstractPacket; @@ -8,20 +8,21 @@ 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.NoppesUtilServer; import noppes.npcs.constants.EnumPlayerData; import java.io.IOException; -public final class PlayerDataRemovePacketNew extends AbstractPacket { +public final class PlayerDataRemoveInfoPacket extends AbstractPacket { public static final String packetName = "Request|PlayerDataRemoveNew"; private String playerName; private EnumPlayerData tabType; private int value; - public PlayerDataRemovePacketNew() {} + public PlayerDataRemoveInfoPacket() {} - public PlayerDataRemovePacketNew(String playerName, EnumPlayerData tabType, int selectedKey) { + public PlayerDataRemoveInfoPacket(String playerName, EnumPlayerData tabType, int selectedKey) { this.playerName = playerName; this.tabType = tabType; this.value = selectedKey; @@ -51,6 +52,6 @@ public final class PlayerDataRemovePacketNew extends AbstractPacket { String playerName = ByteBufUtils.readString(in); int tabType = in.readInt(); int value = in.readInt(); - NoppesUtilServerNew.removePlayerData(playerName, tabType, value, (EntityPlayerMP) player); + NoppesUtilServer.removePlayerDataInfo(playerName, tabType, value, (EntityPlayerMP) player); } } diff --git a/src/main/java/noppes/npcs/NoppesUtilServer.java b/src/main/java/noppes/npcs/NoppesUtilServer.java index cbda4ae2d..0d11add1b 100644 --- a/src/main/java/noppes/npcs/NoppesUtilServer.java +++ b/src/main/java/noppes/npcs/NoppesUtilServer.java @@ -3,6 +3,7 @@ package noppes.npcs; import io.netty.buffer.ByteBuf; import kamkeel.npcs.controllers.SyncController; import kamkeel.npcs.network.PacketHandler; +import kamkeel.npcs.network.packets.data.PlayerDataInfoPacket; import kamkeel.npcs.network.packets.data.gui.GuiClosePacket; import kamkeel.npcs.network.packets.data.gui.GuiErrorPacket; import kamkeel.npcs.network.packets.data.gui.GuiOpenPacket; @@ -975,4 +976,142 @@ public class NoppesUtilServer { sb.append(seconds).append(" second").append(seconds == 1 ? "" : "s"); return sb.toString(); } + + /** + * 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 sendPlayerDataInfo(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. + PlayerDataInfoPacket packet = new PlayerDataInfoPacket(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 removePlayerDataInfo(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. + sendPlayerDataInfo(playerName, player); + } } diff --git a/src/main/java/noppes/npcs/client/NoppesUtil.java b/src/main/java/noppes/npcs/client/NoppesUtil.java index 2de2178d7..cc07e9d47 100644 --- a/src/main/java/noppes/npcs/client/NoppesUtil.java +++ b/src/main/java/noppes/npcs/client/NoppesUtil.java @@ -17,6 +17,7 @@ import net.minecraft.util.Util; import noppes.npcs.CustomNpcs; import noppes.npcs.client.gui.player.GuiDialogInteract; import noppes.npcs.client.gui.player.GuiQuestCompletion; +import noppes.npcs.client.gui.util.IPlayerDataInfo; import noppes.npcs.client.gui.util.GuiContainerNPCInterface; import noppes.npcs.client.gui.util.GuiNPCInterface; import noppes.npcs.client.gui.util.IScrollData; @@ -32,6 +33,7 @@ import java.io.File; import java.io.IOException; import java.net.URI; import java.util.HashMap; +import java.util.Map; import java.util.Vector; public class NoppesUtil { @@ -258,4 +260,60 @@ public class NoppesUtil { public static void isGUIOpen(boolean isGUIOpen) { PacketClient.sendClient(new IsGuiOpenInform(isGUIOpen)); } + + /** + * 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/SubGuiPlayerData.java b/src/main/java/noppes/npcs/client/gui/SubGuiPlayerData.java index f4db0f16d..12e50d7d6 100644 --- a/src/main/java/noppes/npcs/client/gui/SubGuiPlayerData.java +++ b/src/main/java/noppes/npcs/client/gui/SubGuiPlayerData.java @@ -1,11 +1,10 @@ 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.CustomNpcResourceListener; +import noppes.npcs.client.gui.util.IPlayerDataInfo; +import kamkeel.npcs.network.packets.request.playerdata.PlayerDataGetInfoPacket; +import kamkeel.npcs.network.packets.request.playerdata.PlayerDataRemoveInfoPacket; import noppes.npcs.client.gui.util.*; import noppes.npcs.constants.EnumPlayerData; import net.minecraft.client.gui.GuiButton; @@ -14,119 +13,177 @@ import net.minecraft.util.StatCollector; import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import java.util.Vector; +import java.util.Map; -public class SubGuiPlayerData extends SubGuiInterface implements GuiYesNoCallback, ICustomScrollListener, IScrollData { +public class SubGuiPlayerData extends SubGuiInterface implements IPlayerDataInfo, ICustomScrollListener { - 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; + //////////////////////////////////////////////////////////////////////////////// + // Fields + //////////////////////////////////////////////////////////////////////////////// - // ----- Quest Tab (10) ----- - private GuiCustomScroll questCatScroll, questFinishedScroll, questActiveScroll; - private String questCatSearch = "", questFinishedSearch = "", questActiveSearch = ""; - // Maps for category display (questCatData) and for quest entries: + // Current tab (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 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 HashMap questFinishedData = new HashMap<>(); private String selectedQuestCategory = ""; - // ----- Dialog Tab (11) ----- - private GuiCustomScroll dialogCatScroll, dialogReadScroll; - private String dialogCatSearch = "", dialogReadSearch = ""; + // ----- Dialog Tab Components ----- + protected GuiCustomScroll dialogCatScroll, dialogReadScroll, dialogCompactScroll; + private String dialogCatSearch = "", dialogReadSearch = "", dialogCompactSearch = ""; 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 = ""; + // ----- Transport Tab Components ----- + protected GuiCustomScroll transCatScroll, transLocScroll, transCompactScroll; + private String transCatSearch = "", transLocSearch = "", transCompactSearch = ""; 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; + // ----- Bank and Faction (Single Scroll) ----- + protected GuiCustomScroll singleScroll; private String singleSearch = ""; - private HashMap singleData = new HashMap<>(); + private HashMap bankData = new HashMap<>(); + private HashMap factionData = 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; + // ----- Divider & Resizing Variables ----- + // In categorical mode for Quest: two dividers (3 scrolls). + // In compact mode for Quest: one divider between 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 used for Quest categorical mode. private final int dividerWidth = 5; private final int minScrollWidth = 50; - private int draggingDivider = 0; - private int initialDragX = 0; 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; + + // ----- Other ----- + private String playerName; + + //////////////////////////////////////////////////////////////////////////////// + // Constructor + //////////////////////////////////////////////////////////////////////////////// public SubGuiPlayerData(String playerName) { this.playerName = playerName; xSize = 420; - ySize = 216; + ySize = 215; setBackground("menubg.png"); - lastDataType = 11; - PacketClient.sendClient(new PlayerDataGetPacket(EnumPlayerData.Quest, playerName)); closeOnEsc = true; + PacketClient.sendClient(new PlayerDataGetInfoPacket(playerName)); } + //////////////////////////////////////////////////////////////////////////////// + // Layout Helpers + //////////////////////////////////////////////////////////////////////////////// + + private int getPaddedLeft() { + return guiLeft + leftPadding; + } + + private int getPaddedRight() { + return guiLeft + xSize - rightPadding; + } + + private int getAvailableWidth() { + return getPaddedRight() - getPaddedLeft(); + } + + // Height available for scroll windows. + private int getScrollHeight() { + return ySize - (scrollTopOffset + verticalGapAboveTF + textFieldHeight + verticalGapBelowTF); + } + + // Y coordinate for textfields. + private int getTextFieldY() { + return guiTop + scrollTopOffset + getScrollHeight() + verticalGapAboveTF; + } + + //////////////////////////////////////////////////////////////////////////////// + // Component Setup Helpers + //////////////////////////////////////////////////////////////////////////////// + + // Create top buttons. + private void setupTopButtons() { + 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")); + // Close button. + 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); + } + + // Helper to ensure scroll exists. + private GuiCustomScroll ensureScroll(GuiCustomScroll scroll, int id) { + if (scroll == null) { + scroll = new GuiCustomScroll(this, id, 0); + } + return scroll; + } + + // Helper to update a text field's position and width. + private void updateComponentPosition(int fieldId, int newX, int newWidth) { + GuiNpcTextField tf = getTextField(fieldId); + if (tf != null) { + tf.xPosition = newX; + tf.width = newWidth; + } + } + + // Helper to update a label's x position. + private void updateLabelPosition(int labelId, int newX) { + GuiNpcLabel lbl = getLabel(labelId); + if (lbl != null) { + lbl.x = newX; + } + } + + //////////////////////////////////////////////////////////////////////////////// + // initGui() & Tab Initialization + //////////////////////////////////////////////////////////////////////////////// + @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); + setupTopButtons(); + // Mode toggle button (50px wide) 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"))); + 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; - - 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; - + // Initialize components based on current tab. switch (currentTab) { case 10: initQuestTab(); @@ -139,386 +196,268 @@ public class SubGuiPlayerData extends SubGuiInterface implements GuiYesNoCallbac break; case 13: case 14: - initSingleScroll(); + initSingleTab(); break; } - - addButton(new GuiNpcButton(30, guiLeft + xSize - 80, guiTop + ySize - 30, 75, 20, StatCollector.translateToLocal("button.delete"))); + // Delete button. + addButton(new GuiNpcButton(30, guiLeft + xSize - 60, guiTop + ySize - 30, 50, 20, StatCollector.translateToLocal("button.delete"))); } + // ----- Quest Tab Initialization ----- private void initQuestTab() { - int regionLeft = leftMargin; - int regionRight = rightMargin; - int dividerX1 = regionLeft + dividerOffset1; - int dividerX2 = regionLeft + dividerOffset2; + int paddedLeft = getPaddedLeft(); + int paddedRight = getPaddedRight(); + int availableWidth = getAvailableWidth(); + int scrollHeight = getScrollHeight(); - if (viewMode == 0) { - if (questCatScroll == null) { - questCatScroll = new GuiCustomScroll(this, 0, 0); + if (viewMode == 0) { // Categorical: 3 scrolls. + if (!isResizing) { + dividerOffset1 = (availableWidth - 2 * dividerWidth) / 3; + dividerOffset2 = dividerOffset1 + dividerWidth + (availableWidth - 2 * dividerWidth) / 3; } - questCatScroll.guiLeft = regionLeft; - questCatScroll.guiTop = guiTop + 30; - questCatScroll.setSize(dividerX1 - regionLeft, 150); + // Quest Category Scroll. + questCatScroll = ensureScroll(questCatScroll, 0); + questCatScroll.guiLeft = paddedLeft; + 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, 0xFFFFFF)); + addLabel(new GuiNpcLabel(1000, "Categories", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); - if (questFinishedScroll == null) { - questFinishedScroll = new GuiCustomScroll(this, 1, 0); - } - questFinishedScroll.guiLeft = dividerX1 + dividerWidth; - questFinishedScroll.guiTop = guiTop + 30; - questFinishedScroll.setSize(dividerX2 - dividerX1 - dividerWidth, 150); + // Quest Finished Scroll. + questFinishedScroll = ensureScroll(questFinishedScroll, 1); + questFinishedScroll.guiLeft = paddedLeft + 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", dividerX1 + dividerWidth, guiTop + 15, 0xFFFFFF)); + addLabel(new GuiNpcLabel(1001, "Finished", paddedLeft + dividerOffset1 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); - if (questActiveScroll == null) { - questActiveScroll = new GuiCustomScroll(this, 2, 0); - } - questActiveScroll.guiLeft = dividerX2 + dividerWidth; - questActiveScroll.guiTop = guiTop + 30; - questActiveScroll.setSize(regionRight - dividerX2 - dividerWidth, 150); + // Quest Active Scroll. + questActiveScroll = ensureScroll(questActiveScroll, 2); + questActiveScroll.guiLeft = paddedLeft + dividerOffset2 + dividerWidth; + questActiveScroll.guiTop = guiTop + scrollTopOffset; + questActiveScroll.setSize(paddedRight - (paddedLeft + dividerOffset2 + dividerWidth), scrollHeight); + questActiveScroll.setList(new ArrayList<>()); + questActiveScroll.selected = -1; + questActiveSearch = ""; addScroll(questActiveScroll); - addLabel(new GuiNpcLabel(1002, "Active", dividerX2 + dividerWidth, guiTop + 15, 0xFFFFFF)); + addLabel(new GuiNpcLabel(1002, "Active", paddedLeft + dividerOffset2 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); - // 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)); + // Text Fields. + addTextField(new GuiNpcTextField(55, this, fontRendererObj, paddedLeft, getTextFieldY(), dividerOffset1, textFieldHeight, questCatSearch)); + addTextField(new GuiNpcTextField(56, this, fontRendererObj, paddedLeft + dividerOffset1 + dividerWidth, getTextFieldY(), dividerOffset2 - dividerOffset1 - dividerWidth, textFieldHeight, questFinishedSearch)); + addTextField(new GuiNpcTextField(57, this, fontRendererObj, paddedLeft + dividerOffset2 + dividerWidth, getTextFieldY(), paddedRight - (paddedLeft + dividerOffset2 + dividerWidth), textFieldHeight, questActiveSearch)); + } else { // Compact: 2 scrolls with resizable divider. + if (!isResizing) { + dividerOffset1 = (availableWidth - dividerWidth) / 2; } - } else { - if (questFinishedScroll == null) { - questFinishedScroll = new GuiCustomScroll(this, 1, 0); - } - questFinishedScroll.guiLeft = regionLeft; - questFinishedScroll.guiTop = guiTop + 30; - questFinishedScroll.setSize((regionRight - regionLeft) / 2, 150); + questFinishedScroll = ensureScroll(questFinishedScroll, 1); + questFinishedScroll.guiLeft = paddedLeft; + 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, 0xFFFFFF)); + addLabel(new GuiNpcLabel(1003, "Finished", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); - 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); + questActiveScroll = ensureScroll(questActiveScroll, 2); + questActiveScroll.guiLeft = paddedLeft + 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", 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)); + addLabel(new GuiNpcLabel(1004, "Active", paddedLeft + dividerOffset1 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + + addTextField(new GuiNpcTextField(55, this, fontRendererObj, paddedLeft, getTextFieldY(), dividerOffset1, textFieldHeight, questFinishedSearch)); + addTextField(new GuiNpcTextField(56, this, fontRendererObj, paddedLeft + dividerOffset1 + dividerWidth, getTextFieldY(), availableWidth - dividerOffset1 - dividerWidth, textFieldHeight, questActiveSearch)); } } + // ----- Dialog Tab Initialization ----- private void initDialogTab() { - int regionLeft = leftMargin; - int regionRight = rightMargin; - int dividerX = regionLeft + dividerOffset1; + int paddedLeft = getPaddedLeft(); + int availableWidth = getAvailableWidth(); + int scrollHeight = getScrollHeight(); - if (viewMode == 0) { - if (dialogCatScroll == null) { - dialogCatScroll = new GuiCustomScroll(this, 0, 0); + if (viewMode == 0) { // Categorical: 2 scrolls. + if (!isResizing) { + dividerOffset1 = (availableWidth - dividerWidth) / 2; } - dialogCatScroll.guiLeft = regionLeft; - dialogCatScroll.guiTop = guiTop + 30; - dialogCatScroll.setSize(dividerX - regionLeft, 150); + dialogCatScroll = ensureScroll(dialogCatScroll, 0); + dialogCatScroll.guiLeft = paddedLeft; + dialogCatScroll.guiTop = guiTop + scrollTopOffset; + dialogCatScroll.setSize(dividerOffset1, scrollHeight); + dialogCatScroll.setList(new ArrayList<>(dialogCatData.keySet())); addScroll(dialogCatScroll); - addLabel(new GuiNpcLabel(2000, "Categories", regionLeft, guiTop + 15, 0xFFFFFF)); + addLabel(new GuiNpcLabel(2000, "Categories", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); - if (dialogReadScroll == null) { - dialogReadScroll = new GuiCustomScroll(this, 1, 0); - } - dialogReadScroll.guiLeft = dividerX + dividerWidth; - dialogReadScroll.guiTop = guiTop + 30; - dialogReadScroll.setSize(regionRight - dividerX - dividerWidth, 150); + dialogReadScroll = ensureScroll(dialogReadScroll, 1); + dialogReadScroll.guiLeft = paddedLeft + 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", dividerX + dividerWidth, guiTop + 15, 0xFFFFFF)); + addLabel(new GuiNpcLabel(2001, "Read", paddedLeft + dividerOffset1 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); - 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); + addTextField(new GuiNpcTextField(55, this, fontRendererObj, paddedLeft, getTextFieldY(), dividerOffset1, textFieldHeight, dialogCatSearch)); + addTextField(new GuiNpcTextField(56, this, fontRendererObj, paddedLeft + dividerOffset1 + dividerWidth, getTextFieldY(), availableWidth - dividerOffset1 - dividerWidth, textFieldHeight, dialogReadSearch)); + } else { // Compact: 1 scroll (no divider). + dialogCompactScroll = ensureScroll(dialogCompactScroll, 5); + dialogCompactScroll.guiLeft = paddedLeft; + dialogCompactScroll.guiTop = guiTop + scrollTopOffset; + dialogCompactScroll.setSize(availableWidth, getScrollHeight()); + dialogCompactScroll.setList(new ArrayList<>(dialogReadData.keySet())); 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)); + addLabel(new GuiNpcLabel(2002, "All", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + addTextField(new GuiNpcTextField(55, this, fontRendererObj, paddedLeft, getTextFieldY(), availableWidth, textFieldHeight, dialogCompactSearch)); } } + // ----- Transport Tab Initialization ----- private void initTransportTab() { - int regionLeft = leftMargin; - int regionRight = rightMargin; - int dividerX = regionLeft + dividerOffset1; + int paddedLeft = getPaddedLeft(); + int availableWidth = getAvailableWidth(); + int scrollHeight = getScrollHeight(); - if (viewMode == 0) { - if (transCatScroll == null) { - transCatScroll = new GuiCustomScroll(this, 3, 0); + if (viewMode == 0) { // Categorical: 2 scrolls. + if (!isResizing) { + dividerOffset1 = (availableWidth - dividerWidth) / 2; } - transCatScroll.guiLeft = regionLeft; - transCatScroll.guiTop = guiTop + 30; - transCatScroll.setSize(dividerX - regionLeft, 150); + transCatScroll = ensureScroll(transCatScroll, 3); + transCatScroll.guiLeft = paddedLeft; + transCatScroll.guiTop = guiTop + scrollTopOffset; + transCatScroll.setSize(dividerOffset1, scrollHeight); + transCatScroll.setList(new ArrayList<>(transCatData.keySet())); addScroll(transCatScroll); - addLabel(new GuiNpcLabel(3000, "Categories", regionLeft, guiTop + 15, 0xFFFFFF)); + addLabel(new GuiNpcLabel(3000, "Categories", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); - if (transLocScroll == null) { - transLocScroll = new GuiCustomScroll(this, 4, 0); - } - transLocScroll.guiLeft = dividerX + dividerWidth; - transLocScroll.guiTop = guiTop + 30; - transLocScroll.setSize(regionRight - dividerX - dividerWidth, 150); + transLocScroll = ensureScroll(transLocScroll, 4); + transLocScroll.guiLeft = paddedLeft + 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", dividerX + dividerWidth, guiTop + 15, 0xFFFFFF)); + addLabel(new GuiNpcLabel(3001, "Locations", paddedLeft + dividerOffset1 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); - 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); + addTextField(new GuiNpcTextField(60, this, fontRendererObj, paddedLeft, getTextFieldY(), dividerOffset1, textFieldHeight, transCatSearch)); + addTextField(new GuiNpcTextField(61, this, fontRendererObj, paddedLeft + dividerOffset1 + dividerWidth, getTextFieldY(), availableWidth - dividerOffset1 - dividerWidth, textFieldHeight, transLocSearch)); + } else { // Compact: 1 scroll (no divider). + transCompactScroll = ensureScroll(transCompactScroll, 5); + transCompactScroll.guiLeft = paddedLeft; + transCompactScroll.guiTop = guiTop + scrollTopOffset; + transCompactScroll.setSize(availableWidth, getScrollHeight()); + transCompactScroll.setList(new ArrayList<>(transLocData.keySet())); 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)); + addLabel(new GuiNpcLabel(3002, "All", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + addTextField(new GuiNpcTextField(60, this, fontRendererObj, paddedLeft, getTextFieldY(), availableWidth, textFieldHeight, transCompactSearch)); } } - private void initSingleScroll() { - int regionLeft = leftMargin; - int regionRight = rightMargin; - if (singleScroll == null) { - singleScroll = new GuiCustomScroll(this, 6, 0); + // ----- Single Tab Initialization (Bank/Faction) ----- + private void initSingleTab() { + int paddedLeft = getPaddedLeft(); + int availableWidth = getAvailableWidth(); + int scrollHeight = getScrollHeight(); + singleScroll = ensureScroll(singleScroll, 0); + singleScroll.guiLeft = paddedLeft; + singleScroll.guiTop = guiTop + scrollTopOffset; + if (currentTab == 13) { + singleScroll.setSize(availableWidth, scrollHeight); + singleScroll.setList(new ArrayList<>(bankData.keySet())); + addLabel(new GuiNpcLabel(4000, "Bank", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); + } else { + singleScroll.setSize(availableWidth, scrollHeight); + singleScroll.setList(new ArrayList<>(factionData.keySet())); + addLabel(new GuiNpcLabel(4000, "Faction", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor)); } - 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)); + addTextField(new GuiNpcTextField(70, this, fontRendererObj, paddedLeft, getTextFieldY(), availableWidth, textFieldHeight, singleSearch)); } + //////////////////////////////////////////////////////////////////////////////// + // Drawing Helpers + //////////////////////////////////////////////////////////////////////////////// + @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; + public void drawScreen(int mouseX, int mouseY, float partialTicks) { + super.drawScreen(mouseX, mouseY, partialTicks); + int scrollHeight = getScrollHeight(); + int paddedLeft = getPaddedLeft(); + int availableWidth = getAvailableWidth(); + + // In compact mode for Quests, draw divider between the two scrolls. + if (currentTab == 10 && viewMode != 0 && !hasSubGui()) { + int dividerX = paddedLeft + dividerOffset1; + drawRect(dividerX, guiTop + scrollTopOffset, dividerX + dividerWidth, guiTop + scrollTopOffset + scrollHeight, 0xFF707070); } - if (id == 20) { - viewMode = (viewMode == 0) ? 1 : 0; - initGui(); - return; - } - if (id == 30) { - displayGuiScreen(new GuiYesNo(this, StatCollector.translateToLocal("gui.deleteconfirm"), "", 100 + currentTab)); - return; + // In categorical mode for Quest, draw both dividers. + if (currentTab == 10 && viewMode == 0 && !hasSubGui()) { + int dividerX1 = paddedLeft + dividerOffset1; + int dividerX2 = paddedLeft + 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 = paddedLeft + dividerOffset1; + drawRect(dividerX, guiTop + scrollTopOffset, dividerX + dividerWidth, guiTop + scrollTopOffset + scrollHeight, 0xFF707070); } + // Compact mode for Dialog/Transport uses one scroll => no divider. } - 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)); - } - } - } - } + //////////////////////////////////////////////////////////////////////////////// + // Mouse & Resizing Handlers + //////////////////////////////////////////////////////////////////////////////// @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; + int hitMargin = 3; + int regionTop = guiTop + scrollTopOffset; + int regionBottom = regionTop + getScrollHeight(); + int paddedLeft = getPaddedLeft(); + int availableWidth = getAvailableWidth(); + if (!hasSubGui() && mouseY >= regionTop && mouseY <= regionBottom) { + if (viewMode == 0) { + if (currentTab == 10) { // Quest categorical: 3 scrolls. + int dividerX1 = paddedLeft + dividerOffset1; + int dividerX2 = paddedLeft + 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) { + int dividerX = paddedLeft + dividerOffset1; + if (mouseX >= dividerX - hitMargin && mouseX <= dividerX + dividerWidth + hitMargin) { + isResizing = true; + resizingDivider = 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; + } else { // Compact mode. + if (currentTab == 10) { // Quest compact: 2 scrolls. + int defaultWidth = (availableWidth - dividerWidth) / 2; + if (!isResizing) dividerOffset1 = defaultWidth; + int dividerX = paddedLeft + dividerOffset1; + if (mouseX >= dividerX - hitMargin && mouseX <= dividerX + dividerWidth + hitMargin) { + isResizing = true; + resizingDivider = 1; + initialDragX = mouseX; + return; + } } + // Dialog/Transport compact have only one scroll => no divider. } } super.mouseClicked(mouseX, mouseY, mouseButton); @@ -526,78 +465,76 @@ public class SubGuiPlayerData extends SubGuiInterface implements GuiYesNoCallbac @Override public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) { + int paddedLeft = getPaddedLeft(); + int paddedRight = getPaddedRight(); + int availableWidth = getAvailableWidth(); if (isResizing) { int dx = mouseX - initialDragX; initialDragX = mouseX; + // Handle Quest tab resizing. 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 (viewMode == 0) { // Categorical (3 scrolls) + if (resizingDivider == 1) { + dividerOffset1 += dx; + int maxOffset = dividerOffset2 - dividerWidth - minScrollWidth; + dividerOffset1 = clamp(dividerOffset1, minScrollWidth, maxOffset); + questCatScroll.setSize(dividerOffset1, getScrollHeight()); + questFinishedScroll.guiLeft = paddedLeft + dividerOffset1 + dividerWidth; + questFinishedScroll.setSize(dividerOffset2 - dividerOffset1 - dividerWidth, getScrollHeight()); + questActiveScroll.guiLeft = paddedLeft + dividerOffset2 + dividerWidth; + questActiveScroll.setSize(availableWidth - (dividerOffset2 + dividerWidth), getScrollHeight()); + updateComponentPosition(55, paddedLeft, dividerOffset1); + updateComponentPosition(56, paddedLeft + dividerOffset1 + dividerWidth, dividerOffset2 - dividerOffset1 - dividerWidth); + updateComponentPosition(57, paddedLeft + dividerOffset2 + dividerWidth, availableWidth - (dividerOffset2 + dividerWidth)); + updateLabelPosition(1000, paddedLeft); + updateLabelPosition(1001, paddedLeft + dividerOffset1 + dividerWidth); + updateLabelPosition(1002, paddedLeft + dividerOffset2 + dividerWidth); + } else if (resizingDivider == 2) { + dividerOffset2 += dx; + int minOffset = dividerOffset1 + dividerWidth + minScrollWidth; + int maxOffset = availableWidth - minScrollWidth; + dividerOffset2 = clamp(dividerOffset2, minOffset, maxOffset); + questFinishedScroll.setSize(dividerOffset2 - dividerOffset1 - dividerWidth, getScrollHeight()); + questActiveScroll.guiLeft = paddedLeft + dividerOffset2 + dividerWidth; + questActiveScroll.setSize(availableWidth - (dividerOffset2 + dividerWidth), getScrollHeight()); + updateComponentPosition(56, paddedLeft + dividerOffset1 + dividerWidth, dividerOffset2 - dividerOffset1 - dividerWidth); + updateComponentPosition(57, paddedLeft + dividerOffset2 + dividerWidth, availableWidth - (dividerOffset2 + dividerWidth)); + updateLabelPosition(1001, paddedLeft + dividerOffset1 + dividerWidth); + updateLabelPosition(1002, paddedLeft + dividerOffset2 + dividerWidth); + } + } else { // Compact mode for Quests (2 scrolls) + if (resizingDivider == 1) { + dividerOffset1 += dx; + dividerOffset1 = clamp(dividerOffset1, minScrollWidth, availableWidth - dividerWidth - minScrollWidth); + questFinishedScroll.setSize(dividerOffset1, getScrollHeight()); + questActiveScroll.guiLeft = paddedLeft + dividerOffset1 + dividerWidth; + questActiveScroll.setSize(availableWidth - dividerOffset1 - dividerWidth, getScrollHeight()); + updateComponentPosition(55, paddedLeft, dividerOffset1); + updateComponentPosition(56, paddedLeft + dividerOffset1 + dividerWidth, availableWidth - dividerOffset1 - dividerWidth); + updateLabelPosition(1003, paddedLeft); + updateLabelPosition(1004, paddedLeft + dividerOffset1 + dividerWidth); + } } - 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; + // For Dialog and Transport in categorical mode. dividerOffset1 += dx; - if (dividerOffset1 < minScrollWidth) - dividerOffset1 = minScrollWidth; - if (dividerOffset1 > (regionRight - regionLeft) - dividerWidth - minScrollWidth) - dividerOffset1 = (regionRight - regionLeft) - dividerWidth - minScrollWidth; - int dividerX = regionLeft + dividerOffset1; + dividerOffset1 = clamp(dividerOffset1, minScrollWidth, availableWidth - minScrollWidth); 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; + dialogCatScroll.setSize(dividerOffset1, getScrollHeight()); + dialogReadScroll.guiLeft = paddedLeft + dividerOffset1 + dividerWidth; + dialogReadScroll.setSize(availableWidth - dividerOffset1 - dividerWidth, getScrollHeight()); + updateComponentPosition(55, paddedLeft, dividerOffset1); + updateComponentPosition(56, paddedLeft + dividerOffset1 + dividerWidth, availableWidth - dividerOffset1 - dividerWidth); + updateLabelPosition(2000, paddedLeft); + updateLabelPosition(2001, paddedLeft + dividerOffset1 + dividerWidth); + } else if (currentTab == 12) { + transCatScroll.setSize(dividerOffset1, getScrollHeight()); + transLocScroll.guiLeft = paddedLeft + dividerOffset1 + dividerWidth; + transLocScroll.setSize(availableWidth - dividerOffset1 - dividerWidth, getScrollHeight()); + updateComponentPosition(60, paddedLeft, dividerOffset1); + updateComponentPosition(61, paddedLeft + dividerOffset1 + dividerWidth, availableWidth - dividerOffset1 - dividerWidth); + updateLabelPosition(3000, paddedLeft); + updateLabelPosition(3001, paddedLeft + dividerOffset1 + dividerWidth); } } return; @@ -609,320 +546,466 @@ public class SubGuiPlayerData extends SubGuiInterface implements GuiYesNoCallbac protected void mouseMovedOrUp(int mouseX, int mouseY, int state) { if (isResizing) { isResizing = false; - draggingDivider = 0; + resizingDivider = 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); + // Simple clamp helper. + private int clamp(int value, int min, int max) { + if (value < min) + return min; + if (value > max) + return max; + return value; } - // 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; - } - } + //////////////////////////////////////////////////////////////////////////////// + // Key & Search Field Handling + //////////////////////////////////////////////////////////////////////////////// @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) { + public void keyTyped(char c, int i) { + super.keyTyped(c, i); 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); + if (viewMode == 0) { + updateQuestSearchField(55, 56, 57); + } else { + updateQuestSearchFieldCompact(55, 56); } } 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); - } + updateDialogSearchField(55, 56); } else { - lastDataType = 22; + updateDialogSearchFieldCompact(55); } } 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); - } + updateTransportSearchField(60, 61); } else { - lastDataType = 32; + updateTransportSearchFieldCompact(60); } } else if (currentTab == 13 || currentTab == 14) { - lastDataType = 40; + updateSingleSearchField(70); } } - @Override - public void customScrollDoubleClicked(String selection, GuiCustomScroll scroll) { - // Optional double-click behavior. + // Update quest search fields (categorical mode). + private void updateQuestSearchField(int catFieldId, int finishedFieldId, int activeFieldId) { + GuiNpcTextField tf = getTextField(catFieldId); + 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(finishedFieldId); + 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(activeFieldId); + 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) + ); + } + } } - private List getSearchList(HashMap dataMap, String searchTerm) { - if (searchTerm.isEmpty()) - return new ArrayList<>(dataMap.keySet()); + // Update quest search fields in compact mode. + private void updateQuestSearchFieldCompact(int finishedFieldId, int activeFieldId) { + GuiNpcTextField tf = getTextField(finishedFieldId); + 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(activeFieldId); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!questActiveSearch.equals(newText)) { + questActiveSearch = newText; + if (questActiveScroll != null) + questActiveScroll.setList(filterList(questActiveData, questActiveSearch)); + } + } + } + + // Update dialog search fields (categorical). + private void updateDialogSearchField(int catFieldId, int readFieldId) { + GuiNpcTextField tf = getTextField(catFieldId); + 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(readFieldId); + 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) + ); + } + } + } + + // Update dialog search fields (compact). + private void updateDialogSearchFieldCompact(int fieldId) { + GuiNpcTextField tf = getTextField(fieldId); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!dialogCompactSearch.equals(newText)) { + dialogCompactSearch = newText; + if (dialogCompactScroll != null) + dialogCompactScroll.setList(filterList(dialogReadData, dialogCompactSearch)); + } + } + } + + // Update transport search fields (categorical). + private void updateTransportSearchField(int catFieldId, int locFieldId) { + GuiNpcTextField tf = getTextField(catFieldId); + 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(locFieldId); + 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) + ); + } + } + } + + // Update transport search fields (compact). + private void updateTransportSearchFieldCompact(int fieldId) { + GuiNpcTextField tf = getTextField(fieldId); + if (tf != null && tf.isFocused()) { + String newText = tf.getText().toLowerCase(); + if (!transCompactSearch.equals(newText)) { + transCompactSearch = newText; + if (transCompactScroll != null) + transCompactScroll.setList(filterList(transLocData, transCompactSearch)); + } + } + } + + // Update search field for single scroll (Bank/Faction). + private void updateSingleSearchField(int fieldId) { + GuiNpcTextField tf = getTextField(fieldId); + 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)); + } + } + } + + // Standard filtering helpers. + private List filterList(HashMap data, String search) { List list = new ArrayList<>(); - for (String key : dataMap.keySet()) { - if (key.toLowerCase().contains(searchTerm)) + for (String key : data.keySet()) { + if (key.toLowerCase().contains(search)) { 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); + 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 filtered; + return list; } - 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); + //////////////////////////////////////////////////////////////////////////////// + // Action Handling + //////////////////////////////////////////////////////////////////////////////// + + @Override + public void actionPerformed(GuiButton button) { + // Close if the "X" button was clicked. + if (button.id == -5) { + close(); + return; + } + // Tab switching. + if (button.id >= 10 && button.id <= 14) { + currentTab = button.id; + initGui(); // Reinitialize components using stored data. + return; + } + // Mode toggle. + if (button.id == 20) { + viewMode = (viewMode == 0) ? 1 : 0; + initGui(); + } + // Delete button. + 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); + factionData.remove(singleScroll.getSelected()); + } + tabType = EnumPlayerData.Factions; + } + } + if (selectedID != null) { + PacketClient.sendClient(new PlayerDataRemoveInfoPacket(playerName, tabType, selectedID)); + } } - 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); + //////////////////////////////////////////////////////////////////////////////// + // Data Setting Methods (IPlayerDataInfo) + //////////////////////////////////////////////////////////////////////////////// + + @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())); } - return filtered; } @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks) { - drawDefaultBackground(); - super.drawScreen(mouseX, mouseY, partialTicks); + 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 close() { - super.close(); + 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())); + } + } + + //////////////////////////////////////////////////////////////////////////////// + // Custom Scroll Click Handling + //////////////////////////////////////////////////////////////////////////////// + + @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/global/GuiNpcManagePlayerData.java b/src/main/java/noppes/npcs/client/gui/global/GuiNpcManagePlayerData.java index 6b9b02e6f..e3c5cc9d8 100644 --- a/src/main/java/noppes/npcs/client/gui/global/GuiNpcManagePlayerData.java +++ b/src/main/java/noppes/npcs/client/gui/global/GuiNpcManagePlayerData.java @@ -1,13 +1,12 @@ package noppes.npcs.client.gui.global; import kamkeel.npcs.network.PacketClient; -import kamkeel.npcs.network.packets.request.playerdata.PlayerDataGetPacket; +import kamkeel.npcs.network.packets.request.playerdata.PlayerDataGetNamesPacket; import kamkeel.npcs.network.packets.request.playerdata.PlayerDataMapRegenPacket; import kamkeel.npcs.network.packets.request.playerdata.PlayerDataRemovePacket; 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; @@ -29,7 +28,7 @@ public class GuiNpcManagePlayerData extends GuiNPCInterface2 implements GuiYesNo public GuiNpcManagePlayerData(EntityNPCInterface npcInterface) { super(npcInterface); // Request the complete list of players. - PacketClient.sendClient(new PlayerDataGetPacket(EnumPlayerData.Players, "")); + PacketClient.sendClient(new PlayerDataGetNamesPacket(EnumPlayerData.Players, "")); } @Override @@ -101,7 +100,7 @@ public class GuiNpcManagePlayerData extends GuiNPCInterface2 implements GuiYesNo } if (id == 1) { if (selectedPlayer != null) { - setSubGui(new SubGuiPlayerDataNew(selectedPlayer)); + setSubGui(new SubGuiPlayerData(selectedPlayer)); } } if (id == 2) { diff --git a/src/main/java/noppes/npcs/client/gui/test/NoppesUtilClientNew.java b/src/main/java/noppes/npcs/client/gui/test/NoppesUtilClientNew.java deleted file mode 100644 index ecb62dc6f..000000000 --- a/src/main/java/noppes/npcs/client/gui/test/NoppesUtilClientNew.java +++ /dev/null @@ -1,74 +0,0 @@ -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 deleted file mode 100644 index 4fc9d15d5..000000000 --- a/src/main/java/noppes/npcs/client/gui/test/NoppesUtilServerNew.java +++ /dev/null @@ -1,155 +0,0 @@ -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/PlayerDataTab.java b/src/main/java/noppes/npcs/client/gui/test/PlayerDataTab.java deleted file mode 100644 index 713836dd3..000000000 --- a/src/main/java/noppes/npcs/client/gui/test/PlayerDataTab.java +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index bd382d07f..000000000 --- a/src/main/java/noppes/npcs/client/gui/test/SubGuiPlayerDataNew.java +++ /dev/null @@ -1,864 +0,0 @@ -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/test/IPlayerDataInfo.java b/src/main/java/noppes/npcs/client/gui/util/IPlayerDataInfo.java similarity index 93% rename from src/main/java/noppes/npcs/client/gui/test/IPlayerDataInfo.java rename to src/main/java/noppes/npcs/client/gui/util/IPlayerDataInfo.java index 3aef92ad8..c41b9b626 100644 --- a/src/main/java/noppes/npcs/client/gui/test/IPlayerDataInfo.java +++ b/src/main/java/noppes/npcs/client/gui/util/IPlayerDataInfo.java @@ -1,4 +1,4 @@ -package noppes.npcs.client.gui.test; +package noppes.npcs.client.gui.util; import java.util.Map;