Files
CustomNPC-Plus/src/main/java/noppes/npcs/client/gui/SubGuiPlayerData.java
T

1011 lines
49 KiB
Java
Raw Normal View History

2025-02-20 00:31:52 -05:00
package noppes.npcs.client.gui;
import kamkeel.npcs.network.PacketClient;
2025-02-20 00:41:45 -05:00
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;
2025-02-20 00:31:52 -05:00
import noppes.npcs.client.gui.util.*;
import noppes.npcs.constants.EnumPlayerData;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.util.StatCollector;
2025-02-20 01:02:27 -05:00
import org.lwjgl.opengl.GL11;
2025-02-20 00:31:52 -05:00
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
2025-02-20 00:41:45 -05:00
import java.util.Map;
2025-02-20 00:31:52 -05:00
import static noppes.npcs.client.gui.player.inventory.GuiCNPCInventory.specialIcons;
2025-02-20 00:41:45 -05:00
public class SubGuiPlayerData extends SubGuiInterface implements IPlayerDataInfo, ICustomScrollListener {
2025-02-20 00:31:52 -05:00
2025-02-20 00:41:45 -05:00
////////////////////////////////////////////////////////////////////////////////
// Fields
////////////////////////////////////////////////////////////////////////////////
// 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 = "";
2025-02-20 00:31:52 -05:00
private HashMap<String, Integer> questCatData = new HashMap<>();
private HashMap<String, Integer> questActiveData = new HashMap<>();
2025-02-20 00:41:45 -05:00
private HashMap<String, Integer> questFinishedData = new HashMap<>();
2025-02-20 00:31:52 -05:00
private String selectedQuestCategory = "";
2025-02-20 00:41:45 -05:00
// ----- Dialog Tab Components -----
protected GuiCustomScroll dialogCatScroll, dialogReadScroll, dialogCompactScroll;
private String dialogCatSearch = "", dialogReadSearch = "", dialogCompactSearch = "";
2025-02-20 00:31:52 -05:00
private HashMap<String, Integer> dialogCatData = new HashMap<>();
private HashMap<String, Integer> dialogReadData = new HashMap<>();
private String selectedDialogCategory = "";
2025-02-20 00:41:45 -05:00
// ----- Transport Tab Components -----
protected GuiCustomScroll transCatScroll, transLocScroll, transCompactScroll;
private String transCatSearch = "", transLocSearch = "", transCompactSearch = "";
2025-02-20 00:31:52 -05:00
private HashMap<String, Integer> transCatData = new HashMap<>();
private HashMap<String, Integer> transLocData = new HashMap<>();
private String selectedTransCategory = "";
2025-02-20 00:41:45 -05:00
// ----- Bank and Faction (Single Scroll) -----
protected GuiCustomScroll singleScroll;
2025-02-20 00:31:52 -05:00
private String singleSearch = "";
2025-02-20 00:41:45 -05:00
private HashMap<String, Integer> bankData = new HashMap<>();
private HashMap<String, Integer> factionData = new HashMap<>();
// ----- 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.
2025-02-20 00:31:52 -05:00
private final int dividerWidth = 5;
private final int minScrollWidth = 50;
private boolean isResizing = false;
2025-02-20 00:41:45 -05:00
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;
2025-02-20 00:31:52 -05:00
2025-02-20 00:41:45 -05:00
////////////////////////////////////////////////////////////////////////////////
// Constructor
////////////////////////////////////////////////////////////////////////////////
2025-02-20 00:31:52 -05:00
public SubGuiPlayerData(String playerName) {
this.playerName = playerName;
xSize = 420;
2025-02-20 00:41:45 -05:00
ySize = 215;
2025-02-20 00:31:52 -05:00
setBackground("menubg.png");
closeOnEsc = true;
2025-02-20 00:41:45 -05:00
PacketClient.sendClient(new PlayerDataGetInfoPacket(playerName));
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
////////////////////////////////////////////////////////////////////////////////
// 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() {
2025-02-20 13:36:07 -05:00
// Show General Display Information
GuiMenuTopButton playerTab = new GuiMenuTopButton(-10, guiLeft + 4, guiTop - 10, playerName);
GuiMenuTopButton btnQuest = new GuiMenuTopButton(10, playerTab.xPosition + playerTab.getButtonWidth(), guiTop - 10, "quest.quests");
GuiMenuTopButton btnDialog = new GuiMenuTopButton(11, btnQuest.xPosition + btnQuest.getWidth(), guiTop - 10, "dialog.dialogs");
GuiMenuTopButton btnTransport = new GuiMenuTopButton(12, btnDialog.xPosition + btnDialog.getWidth(), guiTop - 10, "global.transport");
GuiMenuTopButton btnBank = new GuiMenuTopButton(13, btnTransport.xPosition + btnTransport.getWidth(), guiTop - 10, "global.banks");
GuiMenuTopButton btnFaction = new GuiMenuTopButton(14, btnBank.xPosition + btnBank.getWidth(), guiTop - 10, "menu.factions");
2025-02-20 00:41:45 -05:00
// Close button.
2025-02-20 00:31:52 -05:00
GuiMenuTopButton close = new GuiMenuTopButton(-5, guiLeft + xSize - 22, guiTop - 10, "X");
2025-02-20 13:36:07 -05:00
playerTab.active = (currentTab == -10);
2025-02-20 00:41:45 -05:00
btnQuest.active = (currentTab == 10);
btnDialog.active = (currentTab == 11);
btnTransport.active = (currentTab == 12);
btnBank.active = (currentTab == 13);
btnFaction.active = (currentTab == 14);
addTopButton(playerTab);
2025-02-20 00:41:45 -05:00
addTopButton(btnQuest);
addTopButton(btnDialog);
addTopButton(btnTransport);
addTopButton(btnBank);
addTopButton(btnFaction);
2025-02-20 00:31:52 -05:00
addTopButton(close);
2025-02-20 00:41:45 -05:00
}
2025-02-20 00:31:52 -05:00
2025-02-20 00:41:45 -05:00
// Helper to ensure scroll exists.
private GuiCustomScroll ensureScroll(GuiCustomScroll scroll, int id) {
if (scroll == null) {
scroll = new GuiCustomScroll(this, id, 0);
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
return scroll;
}
2025-02-20 00:31:52 -05:00
2025-02-20 00:41:45 -05:00
// 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();
setupTopButtons();
2025-02-20 00:31:52 -05:00
2025-02-20 00:41:45 -05:00
if (currentTab == 10 || currentTab == 11 || currentTab == 12) {
addButton(new GuiToggleButton(20, guiLeft + xSize - 102, guiTop + 10, viewMode == 0));
((GuiToggleButton) getButton(20)).setTextureOff(specialIcons).setTextureOffPos( 16, 0);
((GuiToggleButton) getButton(20)).setIconTexture(specialIcons).setIconPos( 16, 16, 16, 0 );
2025-02-20 00:41:45 -05:00
}
2025-02-20 00:31:52 -05:00
2025-02-20 00:41:45 -05:00
guiTop += 7;
// Initialize components based on current tab.
2025-02-20 00:31:52 -05:00
switch (currentTab) {
case 10:
initQuestTab();
break;
case 11:
initDialogTab();
break;
case 12:
initTransportTab();
break;
case 13:
case 14:
2025-02-20 00:41:45 -05:00
initSingleTab();
2025-02-20 00:31:52 -05:00
break;
}
2025-02-20 00:41:45 -05:00
// Delete button.
addButton(new GuiNpcButton(30, guiLeft + xSize - 60, guiTop + 10 - 7, 50, 20, "gui.remove"));
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
// ----- Quest Tab Initialization -----
2025-02-20 00:31:52 -05:00
private void initQuestTab() {
2025-02-20 00:41:45 -05:00
int paddedLeft = getPaddedLeft();
int paddedRight = getPaddedRight();
int availableWidth = getAvailableWidth();
int scrollHeight = getScrollHeight();
if (viewMode == 0) { // Categorical: 3 scrolls.
if (!isResizing) {
dividerOffset1 = (availableWidth - 2 * dividerWidth) / 3;
dividerOffset2 = dividerOffset1 + dividerWidth + (availableWidth - 2 * dividerWidth) / 3;
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
// 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 = "";
2025-02-20 00:31:52 -05:00
addScroll(questCatScroll);
2025-02-20 00:41:45 -05:00
addLabel(new GuiNpcLabel(1000, "Categories", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor));
// 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 = "";
2025-02-20 00:31:52 -05:00
addScroll(questFinishedScroll);
2025-02-20 00:41:45 -05:00
addLabel(new GuiNpcLabel(1001, "Finished", paddedLeft + dividerOffset1 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor));
// 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 = "";
2025-02-20 00:31:52 -05:00
addScroll(questActiveScroll);
2025-02-20 00:41:45 -05:00
addLabel(new GuiNpcLabel(1002, "Active", paddedLeft + dividerOffset2 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor));
// 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;
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
questFinishedScroll = ensureScroll(questFinishedScroll, 1);
questFinishedScroll.guiLeft = paddedLeft;
questFinishedScroll.guiTop = guiTop + scrollTopOffset;
questFinishedScroll.setSize(dividerOffset1, scrollHeight);
questFinishedScroll.setList(new ArrayList<>(questFinishedData.keySet()));
questFinishedSearch = "";
2025-02-20 00:31:52 -05:00
addScroll(questFinishedScroll);
2025-02-20 00:41:45 -05:00
addLabel(new GuiNpcLabel(1003, "Finished", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor));
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 = "";
2025-02-20 00:31:52 -05:00
addScroll(questActiveScroll);
2025-02-20 00:41:45 -05:00
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));
2025-02-20 00:31:52 -05:00
}
}
2025-02-20 00:41:45 -05:00
// ----- Dialog Tab Initialization -----
2025-02-20 00:31:52 -05:00
private void initDialogTab() {
2025-02-20 00:41:45 -05:00
int paddedLeft = getPaddedLeft();
int availableWidth = getAvailableWidth();
int scrollHeight = getScrollHeight();
2025-02-20 00:31:52 -05:00
2025-02-20 00:41:45 -05:00
if (viewMode == 0) { // Categorical: 2 scrolls.
if (!isResizing) {
dividerOffset1 = (availableWidth - dividerWidth) / 2;
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
dialogCatScroll = ensureScroll(dialogCatScroll, 0);
dialogCatScroll.guiLeft = paddedLeft;
dialogCatScroll.guiTop = guiTop + scrollTopOffset;
dialogCatScroll.setSize(dividerOffset1, scrollHeight);
2025-02-20 01:02:27 -05:00
dialogCatScroll.selected = -1;
2025-02-20 00:41:45 -05:00
dialogCatScroll.setList(new ArrayList<>(dialogCatData.keySet()));
2025-02-20 00:31:52 -05:00
addScroll(dialogCatScroll);
2025-02-20 00:41:45 -05:00
addLabel(new GuiNpcLabel(2000, "Categories", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor));
2025-02-20 00:31:52 -05:00
2025-02-20 00:41:45 -05:00
dialogReadScroll = ensureScroll(dialogReadScroll, 1);
dialogReadScroll.guiLeft = paddedLeft + dividerOffset1 + dividerWidth;
dialogReadScroll.guiTop = guiTop + scrollTopOffset;
dialogReadScroll.setSize(availableWidth - dividerOffset1 - dividerWidth, scrollHeight);
2025-02-20 01:02:27 -05:00
dialogReadScroll.selected = -1;
dialogReadScroll.setList(new ArrayList<>());
2025-02-20 00:31:52 -05:00
addScroll(dialogReadScroll);
2025-02-20 00:41:45 -05:00
addLabel(new GuiNpcLabel(2001, "Read", paddedLeft + dividerOffset1 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor));
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()));
2025-02-20 01:02:27 -05:00
dialogCompactScroll.selected = -1;
2025-02-20 00:31:52 -05:00
addScroll(dialogCompactScroll);
2025-02-20 00:41:45 -05:00
addLabel(new GuiNpcLabel(2002, "All", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor));
addTextField(new GuiNpcTextField(55, this, fontRendererObj, paddedLeft, getTextFieldY(), availableWidth, textFieldHeight, dialogCompactSearch));
2025-02-20 00:31:52 -05:00
}
}
2025-02-20 00:41:45 -05:00
// ----- Transport Tab Initialization -----
2025-02-20 00:31:52 -05:00
private void initTransportTab() {
2025-02-20 00:41:45 -05:00
int paddedLeft = getPaddedLeft();
int availableWidth = getAvailableWidth();
int scrollHeight = getScrollHeight();
2025-02-20 00:31:52 -05:00
2025-02-20 00:41:45 -05:00
if (viewMode == 0) { // Categorical: 2 scrolls.
if (!isResizing) {
dividerOffset1 = (availableWidth - dividerWidth) / 2;
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
transCatScroll = ensureScroll(transCatScroll, 3);
transCatScroll.guiLeft = paddedLeft;
transCatScroll.guiTop = guiTop + scrollTopOffset;
transCatScroll.setSize(dividerOffset1, scrollHeight);
2025-02-20 01:02:27 -05:00
transCatScroll.selected = -1;
2025-02-20 00:41:45 -05:00
transCatScroll.setList(new ArrayList<>(transCatData.keySet()));
2025-02-20 00:31:52 -05:00
addScroll(transCatScroll);
2025-02-20 00:41:45 -05:00
addLabel(new GuiNpcLabel(3000, "Categories", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor));
2025-02-20 00:31:52 -05:00
2025-02-20 00:41:45 -05:00
transLocScroll = ensureScroll(transLocScroll, 4);
transLocScroll.guiLeft = paddedLeft + dividerOffset1 + dividerWidth;
transLocScroll.guiTop = guiTop + scrollTopOffset;
transLocScroll.setSize(availableWidth - dividerOffset1 - dividerWidth, scrollHeight);
2025-02-20 01:02:27 -05:00
transLocScroll.selected = -1;
transLocScroll.setList(new ArrayList<>());
2025-02-20 00:31:52 -05:00
addScroll(transLocScroll);
2025-02-20 00:41:45 -05:00
addLabel(new GuiNpcLabel(3001, "Locations", paddedLeft + dividerOffset1 + dividerWidth, guiTop + 15, CustomNpcResourceListener.DefaultTextColor));
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;
2025-02-20 01:02:27 -05:00
transCompactScroll.selected = -1;
2025-02-20 00:41:45 -05:00
transCompactScroll.setSize(availableWidth, getScrollHeight());
transCompactScroll.setList(new ArrayList<>(transLocData.keySet()));
2025-02-20 00:31:52 -05:00
addScroll(transCompactScroll);
2025-02-20 00:41:45 -05:00
addLabel(new GuiNpcLabel(3002, "All", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor));
addTextField(new GuiNpcTextField(60, this, fontRendererObj, paddedLeft, getTextFieldY(), availableWidth, textFieldHeight, transCompactSearch));
2025-02-20 00:31:52 -05:00
}
}
2025-02-20 00:41:45 -05:00
// ----- 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()));
2025-02-20 01:02:27 -05:00
singleScroll.selected = -1;
2025-02-20 00:41:45 -05:00
addLabel(new GuiNpcLabel(4000, "Bank", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor));
} else {
singleScroll.setSize(availableWidth, scrollHeight);
singleScroll.setList(new ArrayList<>(factionData.keySet()));
2025-02-20 01:02:27 -05:00
singleScroll.selected = -1;
2025-02-20 00:41:45 -05:00
addLabel(new GuiNpcLabel(4000, "Faction", paddedLeft, guiTop + 15, CustomNpcResourceListener.DefaultTextColor));
2025-02-20 00:31:52 -05:00
}
addScroll(singleScroll);
2025-02-20 00:41:45 -05:00
addTextField(new GuiNpcTextField(70, this, fontRendererObj, paddedLeft, getTextFieldY(), availableWidth, textFieldHeight, singleSearch));
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
////////////////////////////////////////////////////////////////////////////////
// Drawing Helpers
////////////////////////////////////////////////////////////////////////////////
2025-02-20 00:31:52 -05:00
@Override
2025-02-20 00:41:45 -05:00
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
2025-02-20 13:15:49 -05:00
super.drawScreen(mouseX, mouseY, partialTicks);
}
@Override
public void drawBackground() {
super.drawBackground();
int paddingTopBottom = 25;
2025-02-20 00:41:45 -05:00
int scrollHeight = getScrollHeight();
int paddedLeft = getPaddedLeft();
2025-02-20 13:15:49 -05:00
int widthPadding = 1;
2025-02-20 00:41:45 -05:00
2025-02-20 01:02:27 -05:00
GL11.glPushAttrib(GL11.GL_ALL_ATTRIB_BITS);
GL11.glEnable(GL11.GL_DEPTH_TEST);
2025-02-20 00:41:45 -05:00
// In compact mode for Quests, draw divider between the two scrolls.
if (currentTab == 10 && viewMode != 0 && !hasSubGui()) {
int dividerX = paddedLeft + dividerOffset1;
2025-02-20 13:15:49 -05:00
drawRect(dividerX + widthPadding, guiTop + scrollTopOffset + paddingTopBottom, dividerX + dividerWidth - widthPadding, guiTop + scrollTopOffset + scrollHeight - paddingTopBottom, 0xFF707070);
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
// In categorical mode for Quest, draw both dividers.
if (currentTab == 10 && viewMode == 0 && !hasSubGui()) {
int dividerX1 = paddedLeft + dividerOffset1;
int dividerX2 = paddedLeft + dividerOffset2;
2025-02-20 13:15:49 -05:00
drawRect(dividerX1 + widthPadding, guiTop + scrollTopOffset + paddingTopBottom, dividerX1 + dividerWidth - widthPadding, guiTop + scrollTopOffset + scrollHeight - paddingTopBottom, 0xFF707070);
drawRect(dividerX2 + widthPadding, guiTop + scrollTopOffset + paddingTopBottom, dividerX2 + dividerWidth - widthPadding, guiTop + scrollTopOffset + scrollHeight - paddingTopBottom, 0xFF707070);
2025-02-20 00:41:45 -05:00
} else if ((currentTab == 11 || currentTab == 12) && viewMode == 0 && !hasSubGui()) {
int dividerX = paddedLeft + dividerOffset1;
2025-02-20 13:15:49 -05:00
drawRect(dividerX + widthPadding, guiTop + scrollTopOffset + paddingTopBottom, dividerX + dividerWidth - widthPadding, guiTop + scrollTopOffset + scrollHeight - paddingTopBottom, 0xFF707070);
2025-02-20 00:31:52 -05:00
}
2025-02-20 01:02:27 -05:00
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glPopAttrib();
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
////////////////////////////////////////////////////////////////////////////////
// Mouse & Resizing Handlers
////////////////////////////////////////////////////////////////////////////////
2025-02-20 00:31:52 -05:00
@Override
2025-02-20 00:41:45 -05:00
public void mouseClicked(int mouseX, int mouseY, int mouseButton) {
int hitMargin = 3;
int regionTop = guiTop + scrollTopOffset;
int regionBottom = regionTop + getScrollHeight();
int paddedLeft = getPaddedLeft();
int availableWidth = getAvailableWidth();
if (!hasSubGui() && mouseY >= regionTop && mouseY <= regionBottom) {
2025-02-20 00:31:52 -05:00
if (viewMode == 0) {
2025-02-20 00:41:45 -05:00
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;
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
} 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;
2025-02-20 00:31:52 -05:00
}
}
2025-02-20 00:41:45 -05:00
} 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;
2025-02-20 00:31:52 -05:00
}
}
2025-02-20 00:41:45 -05:00
// Dialog/Transport compact have only one scroll => no divider.
2025-02-20 00:31:52 -05:00
}
}
super.mouseClicked(mouseX, mouseY, mouseButton);
}
@Override
public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) {
2025-02-20 00:41:45 -05:00
int paddedLeft = getPaddedLeft();
int paddedRight = getPaddedRight();
int availableWidth = getAvailableWidth();
2025-02-20 00:31:52 -05:00
if (isResizing) {
int dx = mouseX - initialDragX;
initialDragX = mouseX;
2025-02-20 00:41:45 -05:00
// Handle Quest tab resizing.
2025-02-20 00:31:52 -05:00
if (currentTab == 10) {
2025-02-20 00:41:45 -05:00
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);
}
2025-02-20 00:31:52 -05:00
}
} else if ((currentTab == 11 || currentTab == 12) && viewMode == 0) {
2025-02-20 00:41:45 -05:00
// For Dialog and Transport in categorical mode.
2025-02-20 00:31:52 -05:00
dividerOffset1 += dx;
2025-02-20 00:41:45 -05:00
dividerOffset1 = clamp(dividerOffset1, minScrollWidth, availableWidth - minScrollWidth);
2025-02-20 00:31:52 -05:00
if (currentTab == 11) {
2025-02-20 00:41:45 -05:00
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);
2025-02-20 00:31:52 -05:00
}
}
return;
}
super.mouseClickMove(mouseX, mouseY, clickedMouseButton, timeSinceLastClick);
}
@Override
protected void mouseMovedOrUp(int mouseX, int mouseY, int state) {
if (isResizing) {
isResizing = false;
2025-02-20 00:41:45 -05:00
resizingDivider = 0;
2025-02-20 00:31:52 -05:00
return;
}
super.mouseMovedOrUp(mouseX, mouseY, state);
}
2025-02-20 00:41:45 -05:00
// Simple clamp helper.
private int clamp(int value, int min, int max) {
if (value < min)
return min;
if (value > max)
return max;
return value;
}
////////////////////////////////////////////////////////////////////////////////
// Key & Search Field Handling
////////////////////////////////////////////////////////////////////////////////
2025-02-20 00:31:52 -05:00
@Override
2025-02-20 00:41:45 -05:00
public void keyTyped(char c, int i) {
super.keyTyped(c, i);
if (currentTab == 10) {
if (viewMode == 0) {
updateQuestSearchField(55, 56, 57);
} else {
updateQuestSearchFieldCompact(55, 56);
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
} else if (currentTab == 11) {
if (viewMode == 0) {
updateDialogSearchField(55, 56);
} else {
updateDialogSearchFieldCompact(55);
}
} else if (currentTab == 12) {
if (viewMode == 0) {
updateTransportSearchField(60, 61);
} else {
updateTransportSearchFieldCompact(60);
}
} else if (currentTab == 13 || currentTab == 14) {
updateSingleSearchField(70);
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
}
// 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));
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
}
}
tf = getTextField(finishedFieldId);
if (tf != null && tf.isFocused()) {
String newText = tf.getText().toLowerCase();
if (!questFinishedSearch.equals(newText)) {
questFinishedSearch = newText;
2025-02-20 00:31:52 -05:00
if (questFinishedScroll != null)
2025-02-20 00:41:45 -05:00
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;
2025-02-20 00:31:52 -05:00
if (questActiveScroll != null)
2025-02-20 00:41:45 -05:00
questActiveScroll.setList(
selectedQuestCategory.isEmpty() ?
new ArrayList<>() :
filterAndTrimListByCategory(questActiveData, selectedQuestCategory, questActiveSearch)
);
2025-02-20 00:31:52 -05:00
}
}
2025-02-20 00:41:45 -05:00
}
// 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;
2025-02-20 00:31:52 -05:00
if (dialogCatScroll != null)
2025-02-20 00:41:45 -05:00
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;
2025-02-20 00:31:52 -05:00
if (dialogReadScroll != null)
2025-02-20 00:41:45 -05:00
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;
2025-02-20 00:31:52 -05:00
if (dialogCompactScroll != null)
2025-02-20 00:41:45 -05:00
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;
2025-02-20 00:31:52 -05:00
if (transCatScroll != null)
2025-02-20 00:41:45 -05:00
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;
2025-02-20 00:31:52 -05:00
if (transLocScroll != null)
2025-02-20 00:41:45 -05:00
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;
2025-02-20 00:31:52 -05:00
if (transCompactScroll != null)
2025-02-20 00:41:45 -05:00
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;
2025-02-20 00:31:52 -05:00
if (singleScroll != null)
2025-02-20 00:41:45 -05:00
singleScroll.setList(filterList(currentTab == 13 ? bankData : factionData, singleSearch));
}
2025-02-20 00:31:52 -05:00
}
}
2025-02-20 00:41:45 -05:00
// Standard filtering helpers.
private List<String> filterList(HashMap<String, Integer> data, String search) {
List<String> list = new ArrayList<>();
for (String key : data.keySet()) {
if (key.toLowerCase().contains(search)) {
list.add(key);
}
}
return list;
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
private List<String> filterAndTrimListByCategory(HashMap<String, Integer> data, String category, String search) {
List<String> 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;
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
////////////////////////////////////////////////////////////////////////////////
// Action Handling
////////////////////////////////////////////////////////////////////////////////
2025-02-20 00:31:52 -05:00
@Override
2025-02-20 00:41:45 -05:00
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();
2025-02-20 00:49:31 -05:00
return;
2025-02-20 00:41:45 -05:00
}
// Delete button.
2025-02-20 00:49:31 -05:00
if (button.id == 30) {
2025-02-20 00:41:45 -05:00
Integer selectedID = null;
EnumPlayerData tabType = null;
2025-02-20 00:49:31 -05:00
// Quest tab
2025-02-20 00:41:45 -05:00
if (currentTab == 10) {
2025-02-20 00:49:31 -05:00
if (viewMode == 0) { // Categorical mode
2025-02-20 00:41:45 -05:00
if (questCatScroll.getSelected() == null)
return;
2025-02-20 00:49:31 -05:00
// Use category + selection key.
2025-02-20 00:41:45 -05:00
if (questActiveScroll.getSelected() != null) {
2025-02-20 00:49:31 -05:00
selectedID = removeSelection(questActiveScroll, questActiveData, questCatScroll.getSelected());
2025-02-20 00:41:45 -05:00
} else if (questFinishedScroll.getSelected() != null) {
2025-02-20 00:49:31 -05:00
selectedID = removeSelection(questFinishedScroll, questFinishedData, questCatScroll.getSelected());
2025-02-20 00:41:45 -05:00
}
2025-02-20 00:49:31 -05:00
} else { // Compact mode: key is just the selection.
2025-02-20 00:41:45 -05:00
if (questActiveScroll.getSelected() != null) {
2025-02-20 00:49:31 -05:00
selectedID = removeSelection(questActiveScroll, questActiveData, null);
2025-02-20 00:41:45 -05:00
} else if (questFinishedScroll.getSelected() != null) {
2025-02-20 00:49:31 -05:00
selectedID = removeSelection(questFinishedScroll, questFinishedData, null);
2025-02-20 00:41:45 -05:00
}
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:49:31 -05:00
tabType = EnumPlayerData.Quest;
}
// Dialog tab
else if (currentTab == 11) {
2025-02-20 00:41:45 -05:00
if (viewMode == 0) {
if (dialogReadScroll.getSelected() != null && dialogCatScroll.getSelected() != null) {
2025-02-20 00:49:31 -05:00
selectedID = removeSelection(dialogReadScroll, dialogReadData, dialogCatScroll.getSelected());
2025-02-20 00:41:45 -05:00
}
} else {
if (dialogCompactScroll.getSelected() != null) {
2025-02-20 00:49:31 -05:00
selectedID = removeSelection(dialogCompactScroll, dialogReadData, null);
2025-02-20 00:41:45 -05:00
}
}
2025-02-20 00:49:31 -05:00
tabType = EnumPlayerData.Dialog;
}
// Transport tab
else if (currentTab == 12) {
2025-02-20 00:41:45 -05:00
if (viewMode == 0) {
if (transLocScroll.getSelected() != null && transCatScroll.getSelected() != null) {
2025-02-20 00:49:31 -05:00
selectedID = removeSelection(transLocScroll, transLocData, transCatScroll.getSelected());
2025-02-20 00:41:45 -05:00
}
} else {
if (transCompactScroll.getSelected() != null) {
2025-02-20 00:49:31 -05:00
selectedID = removeSelection(transCompactScroll, transLocData, null);
2025-02-20 00:41:45 -05:00
}
}
2025-02-20 00:49:31 -05:00
tabType = EnumPlayerData.Transport;
}
// Bank tab
else if (currentTab == 13) {
2025-02-20 00:41:45 -05:00
if (singleScroll.getSelected() != null) {
2025-02-20 00:49:31 -05:00
selectedID = removeSelection(singleScroll, bankData, null);
2025-02-20 00:41:45 -05:00
}
2025-02-20 00:49:31 -05:00
tabType = EnumPlayerData.Bank;
}
// Faction tab
else if (currentTab == 14) {
2025-02-20 00:41:45 -05:00
if (singleScroll.getSelected() != null) {
2025-02-20 00:49:31 -05:00
selectedID = removeSelection(singleScroll, factionData, null);
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:49:31 -05:00
tabType = EnumPlayerData.Factions;
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
if (selectedID != null) {
PacketClient.sendClient(new PlayerDataRemoveInfoPacket(playerName, tabType, selectedID));
}
2025-02-20 00:31:52 -05:00
}
}
2025-02-20 00:49:31 -05:00
/**
* Helper method that removes the selected entry from a scroll and its backing data.
*
* @param scroll The GuiCustomScroll in question.
* @param data The backing map holding keys and IDs.
* @param prefix If non-null and non-empty, the key is built as "prefix: " + scroll.getSelected(); otherwise,
* scroll.getSelected() is used.
* @return The ID of the removed item, or null if none was found.
*/
private Integer removeSelection(GuiCustomScroll scroll, Map<String, Integer> data, String prefix) {
if (scroll.getSelected() == null) return null;
String key = (prefix == null || prefix.isEmpty()) ? scroll.getSelected() : prefix + ": " + scroll.getSelected();
Integer id = data.get(key);
if (id != null) {
scroll.list.remove(scroll.selected);
scroll.selected = -1;
data.remove(key);
}
return id;
}
2025-02-20 00:41:45 -05:00
////////////////////////////////////////////////////////////////////////////////
// Data Setting Methods (IPlayerDataInfo)
////////////////////////////////////////////////////////////////////////////////
2025-02-20 00:31:52 -05:00
2025-02-20 00:41:45 -05:00
@Override
public void setQuestData(Map<String, Integer> questCategories, Map<String, Integer> questActive, Map<String, Integer> 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()));
2025-02-20 00:31:52 -05:00
}
}
2025-02-20 00:41:45 -05:00
@Override
public void setDialogData(Map<String, Integer> dialogCategories, Map<String, Integer> dialogRead) {
this.dialogCatData = new HashMap<>(dialogCategories);
this.dialogReadData = new HashMap<>(dialogRead);
if (dialogCatScroll != null) {
dialogCatScroll.setList(new ArrayList<>(dialogCatData.keySet()));
}
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
@Override
public void setTransportData(Map<String, Integer> transportCategories, Map<String, Integer> transportLocations) {
this.transCatData = new HashMap<>(transportCategories);
this.transLocData = new HashMap<>(transportLocations);
if (transCatScroll != null) {
transCatScroll.setList(new ArrayList<>(transCatData.keySet()));
}
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
@Override
public void setBankData(Map<String, Integer> bankData) {
this.bankData = new HashMap<>(bankData);
if (singleScroll != null && currentTab == 13) {
singleScroll.setList(new ArrayList<>(this.bankData.keySet()));
2025-02-20 00:31:52 -05:00
}
}
@Override
2025-02-20 00:41:45 -05:00
public void setFactionData(Map<String, Integer> factionData) {
this.factionData = new HashMap<>(factionData);
if (singleScroll != null && currentTab == 14) {
singleScroll.setList(new ArrayList<>(this.factionData.keySet()));
}
2025-02-20 00:31:52 -05:00
}
2025-02-20 00:41:45 -05:00
////////////////////////////////////////////////////////////////////////////////
// Custom Scroll Click Handling
////////////////////////////////////////////////////////////////////////////////
2025-02-20 00:31:52 -05:00
@Override
2025-02-20 00:41:45 -05:00
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;
}
2025-02-20 00:31:52 -05:00
}
}