From dbca3da639b52aff9700afed35337823c0350d55 Mon Sep 17 00:00:00 2001 From: Kam Date: Thu, 5 Mar 2026 01:37:44 -0500 Subject: [PATCH] Fix some Packet / Language Handling for Race Condition --- .../noppes/npcs/client/gui/GuiScript.java | 29 +++++++++++++--- .../client/gui/script/GuiScriptInterface.java | 33 +++++++++++++++---- .../data/IScriptHandlerPacket.java | 6 ++++ 3 files changed, 57 insertions(+), 11 deletions(-) diff --git a/src/main/java/noppes/npcs/client/gui/GuiScript.java b/src/main/java/noppes/npcs/client/gui/GuiScript.java index 7420d4387..febb3c9b1 100644 --- a/src/main/java/noppes/npcs/client/gui/GuiScript.java +++ b/src/main/java/noppes/npcs/client/gui/GuiScript.java @@ -184,6 +184,14 @@ public class GuiScript extends GuiScriptInterface { addButton(new GuiNpcButton(100, guiLeft + 315, guiTop + 25, 50, 20, "gui.copy")); addButton(new GuiNpcButton(107, guiLeft + 315, guiTop + 70, 80, 20, "script.loadscript")); + // Disable all buttons until server data arrives + if (!serverDataReceived) { + for (int btnId : new int[]{100, 101, 102, 107}) { + GuiNpcButton btn = getButton(btnId); + if (btn != null) btn.enabled = false; + } + } + GuiCustomScroll scroll = new GuiCustomScroll(this, 0).setUnselectable(); scroll.setSize(100, 120); scroll.guiLeft = guiLeft + 315; @@ -222,12 +230,18 @@ public class GuiScript extends GuiScriptInterface { addButton(new GuiNpcButton(104, guiLeft + 294, guiTop + 48, 50, 20, new String[]{"gui.no", "gui.yes"}, script.enabled ? 1 : 0)); - // Disable language/enabled controls until server data actually arrives - getButton(103).enabled = serverDataReceived && languageOptions.size() > 0; - getButton(104).enabled = serverDataReceived; - if (MinecraftServer.getServer() != null) addButton(new GuiNpcButton(106, guiLeft + 232, guiTop + 71, 150, 20, "script.openfolder")); + + // Disable all buttons until server data arrives + if (!serverDataReceived) { + for (int btnId : new int[]{100, 102, 103, 104, 105, 106}) { + GuiNpcButton btn = getButton(btnId); + if (btn != null) btn.enabled = false; + } + } else { + getButton(103).enabled = languageOptions.size() > 0; + } } @Override @@ -342,6 +356,11 @@ public class GuiScript extends GuiScriptInterface { @Override public void setGuiData(NBTTagCompound compound) { + // Only process the actual NPCScriptPacket response (has ScriptLanguage + Languages) + // Ignore unrelated packets (e.g. script config with ScriptsEnabled/GlobalNPCScriptsEnabled) + if (!compound.hasKey("ScriptLanguage") && !compound.hasKey("Languages")) { + return; + } script.readFromNBT(compound); loadLanguagesData(compound); loaded = true; @@ -349,7 +368,7 @@ public class GuiScript extends GuiScriptInterface { @Override public void save() { - if (loaded) { + if (loaded && serverDataReceived) { setScript(); NPCScriptPacket.Save(script.writeToNBT(new NBTTagCompound())); } diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java index 3d91446c9..fa64fb9a9 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java @@ -311,6 +311,14 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb this.addButton(new GuiNpcButton(107, left1, this.guiTop + 66 + yoffset, 80, 20, "script.loadscript")); + // Disable all buttons until server data arrives + if (!serverDataReceived) { + for (int btnId : new int[]{100, 101, 102, 105, 107, 113}) { + GuiNpcButton btn = getButton(btnId); + if (btn != null) btn.enabled = false; + } + } + GuiCustomScroll scroll = (new GuiCustomScroll(this, 0)).setUnselectable(); scroll.setSize(100, (int) ((double) this.ySize * 0.54D) - yoffset * 2); scroll.guiLeft = left1; @@ -344,11 +352,6 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb this.addButton(new GuiNpcButton(104, var9 + 60, this.guiTop + 31, 50, 20, new String[]{"gui.no", "gui.yes"}, this.handler.getEnabled() ? 1 : 0)); - // Disable language/enabled controls until server data actually arrives - // (serverDataReceived is only set in loadLanguagesData, not by getLanguageOptions injecting Java) - this.getButton(103).enabled = serverDataReceived && languageOptions.size() > 0; - this.getButton(104).enabled = serverDataReceived; - if (this.player.worldObj.isRemote) { this.addButton(new GuiNpcButton(106, var9, this.guiTop + 55, 150, 20, "script.openfolder")); } @@ -357,6 +360,17 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb this.addButton(new GuiNpcButton(112, var9 + 81, this.guiTop + 78, 80, 20, "gui.forum")); this.addButton(new GuiNpcButton(110, var9, this.guiTop + 99, 80, 20, "script.apidoc")); this.addButton(new GuiNpcButton(111, var9 + 81, this.guiTop + 99, 80, 20, "script.apisrc")); + + // Disable all buttons until server data arrives + if (!serverDataReceived) { + for (int btnId : new int[]{100, 102, 103, 104, 106, 109, 110, 111, 112}) { + GuiNpcButton btn = getButton(btnId); + if (btn != null) btn.enabled = false; + } + } else { + // Language button requires options to be available + this.getButton(103).enabled = languageOptions.size() > 0; + } } public GuiScriptInterface setDimensions(int x, int y) { @@ -750,6 +764,9 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb public void setGuiData(NBTTagCompound compound) { if (handler instanceof IScriptHandlerPacket) { IScriptHandlerPacket.GuiDataResult result = ((IScriptHandlerPacket) handler).setGuiData(compound); + if (result == null) { + return; // Unrelated packet, ignore + } if (result.kind == IScriptHandlerPacket.GuiDataKind.LOAD_COMPLETE) { loaded = true; return; @@ -765,6 +782,10 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb return; } + // For non-IScriptHandlerPacket handlers, ignore unrelated packets + if (!compound.hasKey("ScriptLanguage") && !compound.hasKey("Languages")) { + return; + } loadLanguagesData(compound); } @@ -808,7 +829,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb } public void save() { - if (!loaded) + if (!loaded || !serverDataReceived) return; this.setScript(); diff --git a/src/main/java/noppes/npcs/controllers/data/IScriptHandlerPacket.java b/src/main/java/noppes/npcs/controllers/data/IScriptHandlerPacket.java index 88ff5fb94..fdc3e3202 100644 --- a/src/main/java/noppes/npcs/controllers/data/IScriptHandlerPacket.java +++ b/src/main/java/noppes/npcs/controllers/data/IScriptHandlerPacket.java @@ -53,6 +53,12 @@ public interface IScriptHandlerPacket extends IScriptHandler { return new GuiDataResult(GuiDataKind.LOAD_COMPLETE, -1); } + // Ignore unrelated packets (e.g. ScriptInfoPacket config data) + // that don't contain any expected keys for this handler + if (!compound.hasKey("Tab") && !compound.hasKey("ScriptLanguage") && !compound.hasKey("ScriptEnabled")) { + return null; + } + if (!compound.hasKey("Tab")) { setLanguage(compound.getString("ScriptLanguage")); setEnabled(compound.getBoolean("ScriptEnabled"));