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 3e16377f4..0dc4036b0 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java @@ -1,9 +1,9 @@ package noppes.npcs.client.gui.script; +import net.minecraft.client.Minecraft; import net.minecraft.client.gui.*; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; -import net.minecraft.util.ResourceLocation; import net.minecraft.util.StatCollector; import noppes.npcs.NoppesStringUtils; import noppes.npcs.client.NoppesUtil; @@ -29,7 +29,6 @@ import noppes.npcs.controllers.data.IScriptHandler; import noppes.npcs.controllers.data.IScriptUnit; import noppes.npcs.scripted.item.ScriptCustomItem; import org.lwjgl.opengl.Display; -import org.lwjgl.opengl.GL11; import java.util.ArrayList; import java.util.Date; @@ -50,6 +49,9 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb protected Map textAreas = new HashMap<>(); protected GuiScreen parent; + /** Single script being edited (handler-less mode) */ + protected IScriptUnit singleScript; + public boolean singleContainer = false; /** If true, uses scroll-based tab selection instead of top buttons */ @@ -88,6 +90,39 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb this.setBackground("menubg.png"); } + /** + * Constructor for single JaninoScript editing (handler-less mode). + * Used for scripts like OverlayScript that don't have an IScriptHandler. + * + * @param parent The parent GUI to return to when closing + * @param script The JaninoScript to edit + */ + public GuiScriptInterface(GuiScreen parent, IScriptUnit script) { + this(); + this.parent = parent; + this.singleScript = script; + this.singleContainer = true; + this.loaded = true; + + // Start on script tab (tab 1) + this.activeTab = 1; + + // Build hook list from the script's type using reflection + // this.hookList = script.getHookList(); + } + + /** + * Create and initialize a GuiScriptInterface for a JaninoScript. + * This is the main entry point for handler-less script editing. + */ + public static GuiScriptInterface create(GuiScreen parent, IScriptUnit script) { + GuiScriptInterface gui = new GuiScriptInterface(parent, script); + gui.setWorldAndResolution(Minecraft.getMinecraft(), gui.width, gui.height); + Minecraft.getMinecraft().currentScreen = gui; + gui.initGui(); + return gui; + } + public void initGui() { // ==================== BASE LAYOUT CALCULATION ==================== this.ySize = (int) ((double) this.xSize * 0.56D); @@ -302,6 +337,12 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb this.addButton(new GuiNpcButton(111, var9 + 81, this.guiTop + 99, 80, 20, "script.apisrc")); } + public GuiScriptInterface setDimensions(int x, int y) { + this.xSize = x; + this.ySize = y; + return this; + } + // ==================== RENDERING ==================== @Override @@ -448,6 +489,10 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb * Override in subclasses with different container access patterns. */ protected IScriptUnit getCurrentContainer() { + // Handler-less single JaninoScript mode + if (singleScript != null) + return singleScript; + int idx = getActiveScriptIndex(); if (idx >= 0 && idx < this.handler.getScripts().size()) return this.handler.getScripts().get(idx); @@ -475,6 +520,11 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb this.setScript(); this.activeTab = guibutton.id; this.initGui(); + + // Ensure JaninoScript is compiled after editing + IScriptUnit current = getCurrentContainer(); + if (current != null) + current.ensureCompiled(); } if (guibutton.id == scriptLimit) { @@ -590,9 +640,11 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb } protected void setScript() { - if (this.activeTab > 0 || useScrollTabs) { + if (this.activeTab > 0 || useScrollTabs || singleScript != null) { IScriptUnit container = getCurrentContainer(); - if (container == null) { + + // Skip container creation for single JaninoScript mode + if (container == null && singleScript == null) { container = new ScriptContainer(this.handler); if (singleContainer) setHandlerContainer(container); @@ -600,10 +652,12 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb this.handler.getScripts().add(container); } - String text = (this.getTextField(2)).getText(); - text = text.replace("\r\n", "\n"); - text = text.replace("\r", "\n"); - container.setScript(text); + if (container != null) { + String text = (this.getTextField(2)).getText(); + text = text.replace("\r\n", "\n"); + text = text.replace("\r", "\n"); + container.setScript(text); + } } } @@ -753,6 +807,11 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb @Override public void close() { + // Ensure JaninoScript is compiled after editing + IScriptUnit current = getCurrentContainer(); + if (current != null) + current.ensureCompiled(); + if (parent != null) { this.save(); parent.setWorldAndResolution(mc, width, height); diff --git a/src/main/java/noppes/npcs/controllers/ScriptContainer.java b/src/main/java/noppes/npcs/controllers/ScriptContainer.java index b85bb1407..eb0b8b1c4 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptContainer.java +++ b/src/main/java/noppes/npcs/controllers/ScriptContainer.java @@ -328,7 +328,10 @@ public class ScriptContainer implements IScriptUnit { // ECMAScript function template return "function " + hookName + "(event) {\n \n}\n"; } - + + @Override + public void ensureCompiled() {} + @Override public boolean hasErrored() { return this.errored; diff --git a/src/main/java/noppes/npcs/controllers/data/IScriptUnit.java b/src/main/java/noppes/npcs/controllers/data/IScriptUnit.java index 392901ede..1cd661a6e 100644 --- a/src/main/java/noppes/npcs/controllers/data/IScriptUnit.java +++ b/src/main/java/noppes/npcs/controllers/data/IScriptUnit.java @@ -135,6 +135,12 @@ public interface IScriptUnit { void readFromNBT(NBTTagCompound compound); // ==================== STATE ==================== + + /** + * Ensure this script unit is compiled (for Janino). + * No-op for ScriptContainer. + */ + void ensureCompiled(); /** * Check if this script unit has any code (script or external scripts).