From ff54c6d9af1ffa7931c66cbaf808576ec31099a0 Mon Sep 17 00:00:00 2001 From: Kam Date: Thu, 19 Feb 2026 01:53:26 -0500 Subject: [PATCH] Enhance Textfield to allow CTRL Operations --- .../npcs/client/gui/util/GuiNpcTextField.java | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextField.java b/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextField.java index c5ff7b680..e36e779e6 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextField.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiNpcTextField.java @@ -30,7 +30,7 @@ public class GuiNpcTextField extends GuiTextField { private boolean wasHovered = false; private int hoverCount = 0; - private final int[] allowedSpecialChars = {14, 211, 203, 205}; + private final int[] allowedSpecialChars = {14, 211, 203, 205, 199, 207}; public GuiNpcTextField(int id, GuiScreen parent, FontRenderer fontRenderer, int i, int j, int k, int l, String s) { super(fontRenderer, i, j, k, l); @@ -69,11 +69,35 @@ public class GuiNpcTextField extends GuiTextField { @Override public boolean textboxKeyTyped(char c, int i) { - if (!charAllowed(c, i) || !canEdit) + if (!canEdit) + return false; + // Allow Ctrl shortcuts (select all, copy, paste, cut) to bypass char filter + if (GuiScreen.isCtrlKeyDown()) { + // For Ctrl+V (paste) on numeric fields, filter clipboard to valid chars + if (i == 47 && isNumericField()) { + String clipboard = GuiScreen.getClipboardString(); + if (clipboard != null) { + StringBuilder filtered = new StringBuilder(); + for (char ch : clipboard.toCharArray()) { + if (Character.isDigit(ch) || ch == '-' || ((doublesOnly || floatsOnly) && ch == '.')) + filtered.append(ch); + } + if (filtered.length() > 0) + writeText(filtered.toString()); + } + return true; + } + return super.textboxKeyTyped(c, i); + } + if (!charAllowed(c, i)) return false; return super.textboxKeyTyped(c, i); } + private boolean isNumericField() { + return integersOnly || doublesOnly || floatsOnly; + } + public boolean isEmpty() { return getText().trim().length() == 0; }