From 69568160bcfbf2b304e764026b76c1432aed46e5 Mon Sep 17 00:00:00 2001 From: Kam Date: Thu, 19 Feb 2026 14:09:29 -0500 Subject: [PATCH] Fixes with GUI for Picking Abilities and Allow Concurrency on DBC Toggles and Zone Abilities --- .../data/ability/type/AbilityHazard.java | 5 + .../data/ability/type/AbilityTrap.java | 5 + .../client/gui/advanced/GuiNPCAbilities.java | 4 +- .../gui/advanced/SubGuiAbilityTypeSelect.java | 93 ++++++++++++++++--- .../advanced/SubGuiChainedAbilityConfig.java | 2 +- 5 files changed, 94 insertions(+), 15 deletions(-) diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityHazard.java b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityHazard.java index a23e38963..a9c505a56 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityHazard.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityHazard.java @@ -32,6 +32,11 @@ public class AbilityHazard extends AbilityZone implements IAbilityHazard { this.activeAnimationName = "Ability_Zone_Active"; } + @Override + public boolean isConcurrentCapable() { + return true; + } + @Override public float getZoneRadius() { return radius; diff --git a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityTrap.java b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityTrap.java index d875353f6..64e3e5b46 100644 --- a/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityTrap.java +++ b/src/main/java/kamkeel/npcs/controllers/data/ability/type/AbilityTrap.java @@ -38,6 +38,11 @@ public class AbilityTrap extends AbilityZone implements IAbilityTrap { this.activeAnimationName = "Ability_Zone_Active"; } + @Override + public boolean isConcurrentCapable() { + return true; + } + @Override public float getZoneRadius() { return triggerRadius; diff --git a/src/main/java/noppes/npcs/client/gui/advanced/GuiNPCAbilities.java b/src/main/java/noppes/npcs/client/gui/advanced/GuiNPCAbilities.java index d1133947e..d2cca2ab0 100644 --- a/src/main/java/noppes/npcs/client/gui/advanced/GuiNPCAbilities.java +++ b/src/main/java/noppes/npcs/client/gui/advanced/GuiNPCAbilities.java @@ -1005,7 +1005,7 @@ public class GuiNPCAbilities extends GuiNPCInterface2 implements IScrollData, IC if (chain != null && selectedEntryIndex < chain.getEntries().size()) { ChainedAbilityEntry entry = chain.getEntries().get(selectedEntryIndex); Ability resolved = entry.resolve(); - if (resolved != null) { + if (resolved != null && !resolved.isBuiltIn()) { editingChainEntryParent = true; setSubGui(resolved.createConfigGui(this)); } @@ -1025,7 +1025,7 @@ public class GuiNPCAbilities extends GuiNPCInterface2 implements IScrollData, IC } } else if (mode == SubGuiAbilityEditMode.MODE_MODIFY_PARENT) { Ability ability = slot.getAbility(); - if (ability != null) { + if (ability != null && !ability.isBuiltIn()) { setSubGui(ability.createConfigGui(this)); } } diff --git a/src/main/java/noppes/npcs/client/gui/advanced/SubGuiAbilityTypeSelect.java b/src/main/java/noppes/npcs/client/gui/advanced/SubGuiAbilityTypeSelect.java index daef52065..2f3ee97c4 100644 --- a/src/main/java/noppes/npcs/client/gui/advanced/SubGuiAbilityTypeSelect.java +++ b/src/main/java/noppes/npcs/client/gui/advanced/SubGuiAbilityTypeSelect.java @@ -1,6 +1,7 @@ package noppes.npcs.client.gui.advanced; import kamkeel.npcs.controllers.AbilityController; +import kamkeel.npcs.util.Register; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.resources.I18n; import noppes.npcs.client.gui.util.GuiCustomScroll; @@ -21,6 +22,11 @@ import java.util.Map; */ public class SubGuiAbilityTypeSelect extends SubGuiInterface implements ICustomScrollListener, ITextfieldListener { + private static final int BTN_ADD = 0; + private static final int BTN_CANCEL = 1; + private static final int BTN_SCROLL_TYPE = 2; + private static final int TF_SEARCH = 10; + private GuiCustomScroll scroll; private final HashMap displayNameToTypeId = new HashMap<>(); private final HashMap allDisplayNameToTypeId = new HashMap<>(); @@ -37,28 +43,41 @@ public class SubGuiAbilityTypeSelect extends SubGuiInterface implements ICustomS public void initGui() { super.initGui(); - addTextField(new GuiNpcTextField(10, this, fontRendererObj, guiLeft + 5, guiTop + 5, 190, 18, search)); + int y = guiTop + 5; + // Scroll type filter button + addButton(new GuiNpcButton(BTN_SCROLL_TYPE, guiLeft + 5, y, 190, 20, GuiNPCAbilities.scrollType.toString())); + y += 24; + + // Search bar + addTextField(new GuiNpcTextField(TF_SEARCH, this, fontRendererObj, guiLeft + 5, y, 190, 18, search)); + y += 20; + + // Scroll list (shortened to fit filter button within original ySize) if (scroll == null) { scroll = new GuiCustomScroll(this, 0); - scroll.setSize(190, 145); + scroll.setSize(190, 121); } scroll.guiLeft = guiLeft + 5; - scroll.guiTop = guiTop + 26; + scroll.guiTop = y; addScroll(scroll); buildAllTypes(); scroll.setUnsortedList(getFilteredTypeList()); - addButton(new GuiNpcButton(0, guiLeft + 5, guiTop + 188, 90, 20, "gui.add")); - getButton(0).setEnabled(scroll.hasSelected()); - addButton(new GuiNpcButton(1, guiLeft + 105, guiTop + 188, 90, 20, "gui.cancel")); + addButton(new GuiNpcButton(BTN_ADD, guiLeft + 5, guiTop + 188, 90, 20, "gui.add")); + getButton(BTN_ADD).setEnabled(scroll.hasSelected()); + addButton(new GuiNpcButton(BTN_CANCEL, guiLeft + 105, guiTop + 188, 90, 20, "gui.cancel")); } private void buildAllTypes() { allDisplayNameToTypeId.clear(); String[] types = AbilityController.Instance.getTypes(); for (String typeId : types) { + // Apply scroll type filter + if (!matchesScrollType(typeId)) + continue; + String displayName = I18n.format(typeId); if (AbilityController.Instance.isConcurrentCapableType(typeId)) { displayName = "\u00A7e" + displayName; @@ -67,6 +86,25 @@ public class SubGuiAbilityTypeSelect extends SubGuiInterface implements ICustomS } } + private boolean matchesScrollType(String typeId) { + GuiNPCAbilities.ScrollType type = GuiNPCAbilities.scrollType; + if (type == GuiNPCAbilities.ScrollType.ALL) { + return true; + } else if (type == GuiNPCAbilities.ScrollType.CNPC) { + return typeId.startsWith("ability.cnpc."); + } else if (type == GuiNPCAbilities.ScrollType.MODDED) { + if (!Register.isEmpty("ability")) { + List registerList = Register.REGISTERED_NAMESPACES.get("ability"); + if (!registerList.isEmpty()) { + String namespace = registerList.get(GuiNPCAbilities.modIndex); + return typeId.startsWith("ability." + namespace + "."); + } + } + return false; + } + return true; + } + private List getFilteredTypeList() { List list = new ArrayList<>(); displayNameToTypeId.clear(); @@ -85,20 +123,51 @@ public class SubGuiAbilityTypeSelect extends SubGuiInterface implements ICustomS @Override public void buttonEvent(GuiButton guibutton) { - if (guibutton.id == 0 && scroll.hasSelected()) { + int id = guibutton.id; + + if (id == BTN_ADD && scroll.hasSelected()) { String displayName = scroll.getSelected(); selectedTypeId = displayNameToTypeId.get(displayName); close(); - } else if (guibutton.id == 1) { + } else if (id == BTN_CANCEL) { selectedTypeId = null; close(); + } else if (id == BTN_SCROLL_TYPE) { + cycleScrollType(); + if (scroll != null) { + scroll.resetScroll(); + } + initGui(); + } + } + + private void cycleScrollType() { + if (GuiNPCAbilities.scrollType != GuiNPCAbilities.ScrollType.MODDED) { + GuiNPCAbilities.ScrollType[] values = GuiNPCAbilities.ScrollType.values(); + GuiNPCAbilities.ScrollType next = values[(GuiNPCAbilities.scrollType.ordinal() + 1) % values.length]; + if (next == GuiNPCAbilities.ScrollType.MODDED && Register.isEmpty("ability")) { + next = GuiNPCAbilities.ScrollType.ALL; + } + GuiNPCAbilities.scrollType = next; + } else { + List list = Register.REGISTERED_NAMESPACES.get("ability"); + if (list != null && !list.isEmpty()) { + if (GuiNPCAbilities.modIndex == list.size() - 1) { + GuiNPCAbilities.scrollType = GuiNPCAbilities.ScrollType.ALL; + } else { + GuiNPCAbilities.modIndex = (GuiNPCAbilities.modIndex + 1) % list.size(); + } + } else { + GuiNPCAbilities.modIndex = 0; + GuiNPCAbilities.scrollType = GuiNPCAbilities.ScrollType.ALL; + } } } @Override public void customScrollClicked(int i, int j, int k, GuiCustomScroll guiCustomScroll) { if (guiCustomScroll.id == 0) { - getButton(0).setEnabled(scroll.hasSelected()); + getButton(BTN_ADD).setEnabled(scroll.hasSelected()); } } @@ -113,9 +182,9 @@ public class SubGuiAbilityTypeSelect extends SubGuiInterface implements ICustomS @Override public void keyTyped(char c, int i) { super.keyTyped(c, i); - if (getTextField(10) != null && getTextField(10).isFocused()) { - if (!search.equals(getTextField(10).getText())) { - search = getTextField(10).getText().toLowerCase(); + if (getTextField(TF_SEARCH) != null && getTextField(TF_SEARCH).isFocused()) { + if (!search.equals(getTextField(TF_SEARCH).getText())) { + search = getTextField(TF_SEARCH).getText().toLowerCase(); scroll.setList(getFilteredTypeList()); scroll.resetScroll(); } diff --git a/src/main/java/noppes/npcs/client/gui/advanced/SubGuiChainedAbilityConfig.java b/src/main/java/noppes/npcs/client/gui/advanced/SubGuiChainedAbilityConfig.java index 90326b533..f5179686e 100644 --- a/src/main/java/noppes/npcs/client/gui/advanced/SubGuiChainedAbilityConfig.java +++ b/src/main/java/noppes/npcs/client/gui/advanced/SubGuiChainedAbilityConfig.java @@ -809,7 +809,7 @@ public class SubGuiChainedAbilityConfig extends SubGuiInterface implements IText editingEntryIndex = -1; } else if (mode == SubGuiAbilityEditMode.MODE_MODIFY_PARENT) { Ability resolved = entry.resolve(); - if (resolved != null) { + if (resolved != null && !resolved.isBuiltIn()) { editingParentAbility = true; setSubGui(resolved.createConfigGui(this)); return;