diff --git a/src/main/java/kamkeel/npcs/network/PacketUtil.java b/src/main/java/kamkeel/npcs/network/PacketUtil.java index f262bce45..cb2881eb8 100644 --- a/src/main/java/kamkeel/npcs/network/PacketUtil.java +++ b/src/main/java/kamkeel/npcs/network/PacketUtil.java @@ -15,6 +15,7 @@ import noppes.npcs.NBTTags; import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.ScriptController; import noppes.npcs.controllers.data.IScriptHandler; +import noppes.npcs.controllers.data.IScriptUnit; import noppes.npcs.items.ItemNpcTool; import java.io.IOException; @@ -221,9 +222,9 @@ public class PacketUtil { compound.setTag("Languages", ScriptController.Instance.nbtLanguages()); compound.setTag("ScriptConsole", NBTTags.NBTLongStringMap(data.getConsoleText())); GuiDataPacket.sendGuiData(player, compound); - List containers = data.getScripts(); + List containers = data.getScripts(); for (int i = 0; i < containers.size(); i++) { - ScriptContainer container = containers.get(i); + IScriptUnit container = containers.get(i); NBTTagCompound tabCompound = new NBTTagCompound(); tabCompound.setInteger("Tab", i); tabCompound.setTag("Script", container.writeToNBT(new NBTTagCompound())); diff --git a/src/main/java/kamkeel/npcs/network/packets/request/script/item/ItemScriptErrorPacket.java b/src/main/java/kamkeel/npcs/network/packets/request/script/item/ItemScriptErrorPacket.java index b4a8c619e..c1a7c74c5 100644 --- a/src/main/java/kamkeel/npcs/network/packets/request/script/item/ItemScriptErrorPacket.java +++ b/src/main/java/kamkeel/npcs/network/packets/request/script/item/ItemScriptErrorPacket.java @@ -16,7 +16,7 @@ import noppes.npcs.CustomNpcsPermissions; import noppes.npcs.NBTTags; import noppes.npcs.api.item.IItemStack; import noppes.npcs.config.ConfigScript; -import noppes.npcs.controllers.ScriptContainer; +import noppes.npcs.controllers.data.IScriptUnit; import noppes.npcs.scripted.NpcAPI; import noppes.npcs.scripted.item.ScriptCustomItem; @@ -72,10 +72,10 @@ public final class ItemScriptErrorPacket extends AbstractPacket { if (requestedAction == Action.GET) { TreeMap map = new TreeMap<>(); int tab = 0; - for (ScriptContainer script : ((ScriptCustomItem) iw).scripts) { + for (IScriptUnit script : ((ScriptCustomItem) iw).scripts) { ++tab; - for (Map.Entry longStringEntry : script.console.entrySet()) { + for (Map.Entry longStringEntry : script.getConsole().entrySet()) { map.put(longStringEntry.getKey(), " tab " + tab + ":\n" + longStringEntry.getValue()); } } @@ -84,8 +84,8 @@ public final class ItemScriptErrorPacket extends AbstractPacket { compound.setTag("ItemScriptConsole", NBTTags.NBTLongStringMap(map)); GuiDataPacket.sendGuiData((EntityPlayerMP) player, compound); } else { - for (ScriptContainer script : ((ScriptCustomItem) iw).scripts) { - script.console.clear(); + for (IScriptUnit script : ((ScriptCustomItem) iw).scripts) { + script.clearConsole(); } } } diff --git a/src/main/java/noppes/npcs/NBTTags.java b/src/main/java/noppes/npcs/NBTTags.java index ebf30ab94..21e751f11 100644 --- a/src/main/java/noppes/npcs/NBTTags.java +++ b/src/main/java/noppes/npcs/NBTTags.java @@ -8,6 +8,7 @@ import net.minecraft.nbt.NBTTagInt; import net.minecraft.nbt.NBTTagList; import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.data.IScriptHandler; +import noppes.npcs.controllers.data.IScriptUnit; import java.util.ArrayList; import java.util.HashMap; @@ -540,8 +541,8 @@ public class NBTTags { } } - public static List GetScriptOld(NBTTagList list, IScriptHandler handler) { - ArrayList scripts = new ArrayList(); + public static List GetScriptOld(NBTTagList list, IScriptHandler handler) { + ArrayList scripts = new ArrayList<>(); for (int i = 0; i < list.tagCount(); ++i) { NBTTagCompound compoundd = list.getCompoundTagAt(i); @@ -553,8 +554,8 @@ public class NBTTags { return scripts; } - public static List GetScript(NBTTagCompound compound, IScriptHandler handler) { - ArrayList scripts = new ArrayList<>(); + public static List GetScript(NBTTagCompound compound, IScriptHandler handler) { + ArrayList scripts = new ArrayList<>(); for (int i = 0; i < compound.getInteger("TotalScripts"); ++i) { NBTTagCompound containerCompound = compound.getCompoundTag("Tab" + i); @@ -566,12 +567,9 @@ public class NBTTags { return scripts; } - public static NBTTagList NBTScript(List scripts) { + public static NBTTagList NBTScript(List scripts) { NBTTagList list = new NBTTagList(); - Iterator var2 = scripts.iterator(); - - while (var2.hasNext()) { - ScriptContainer script = (ScriptContainer) var2.next(); + for (IScriptUnit script : scripts) { NBTTagCompound compound = new NBTTagCompound(); script.writeToNBT(compound); list.appendTag(compound); diff --git a/src/main/java/noppes/npcs/blocks/tiles/TileScripted.java b/src/main/java/noppes/npcs/blocks/tiles/TileScripted.java index 8babf8936..2ecdb518e 100644 --- a/src/main/java/noppes/npcs/blocks/tiles/TileScripted.java +++ b/src/main/java/noppes/npcs/blocks/tiles/TileScripted.java @@ -28,6 +28,7 @@ import noppes.npcs.constants.EnumScriptType; import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.ScriptController; import noppes.npcs.controllers.data.IScriptBlockHandler; +import noppes.npcs.controllers.data.IScriptUnit; import noppes.npcs.entity.data.DataTimers; import noppes.npcs.scripted.BlockScriptedWrapper; import noppes.npcs.util.ValueUtil; @@ -40,7 +41,7 @@ import java.util.Map.Entry; import java.util.TreeMap; public class TileScripted extends TileEntity implements IScriptBlockHandler { - public List scripts = new ArrayList<>(); + public List scripts = new ArrayList<>(); public Map tempData = new HashMap<>(); @@ -367,8 +368,10 @@ public class TileScripted extends TileEntity implements IScriptBlockHandler { EventHooks.onScriptBlockInit(this); } - for (ScriptContainer script : scripts) { - script.run(type, event); + for (IScriptUnit script : scripts) { + if (script instanceof ScriptContainer) { + ((ScriptContainer) script).run(type, event); + } } } @@ -408,12 +411,12 @@ public class TileScripted extends TileEntity implements IScriptBlockHandler { } @Override - public void setScripts(List list) { + public void setScripts(List list) { scripts = list; } @Override - public List getScripts() { + public List getScripts() { return scripts; } @@ -421,9 +424,9 @@ public class TileScripted extends TileEntity implements IScriptBlockHandler { public Map getConsoleText() { Map map = new TreeMap<>(); int tab = 0; - for (ScriptContainer script : getScripts()) { + for (IScriptUnit script : getScripts()) { tab++; - for (Entry entry : script.console.entrySet()) { + for (Entry entry : script.getConsole().entrySet()) { map.put(entry.getKey(), " tab " + tab + ":\n" + entry.getValue()); } } @@ -432,8 +435,8 @@ public class TileScripted extends TileEntity implements IScriptBlockHandler { @Override public void clearConsole() { - for (ScriptContainer script : getScripts()) { - script.console.clear(); + for (IScriptUnit script : getScripts()) { + script.clearConsole(); } } diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiNPCEventScripts.java b/src/main/java/noppes/npcs/client/gui/script/GuiNPCEventScripts.java index 5b4693a10..a2811b1a0 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiNPCEventScripts.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiNPCEventScripts.java @@ -5,6 +5,7 @@ import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.NBTTags; import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.data.DataScript; +import noppes.npcs.controllers.data.IScriptUnit; import noppes.npcs.entity.EntityNPCInterface; import java.util.ArrayList; @@ -65,9 +66,9 @@ public class GuiNPCEventScripts extends GuiScriptInterface { public void save() { if (loaded) { super.save(); - List containers = this.script.getScripts(); + List containers = this.script.getScripts(); for (int i = 0; i < containers.size(); i++) { - ScriptContainer container = containers.get(i); + IScriptUnit container = containers.get(i); EventScriptPacket.Save(i, containers.size(), container.writeToNBT(new NBTTagCompound())); } NBTTagCompound scriptData = new NBTTagCompound(); diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptAllNPCs.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptAllNPCs.java index 6f0927cbc..492945d71 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptAllNPCs.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptAllNPCs.java @@ -5,6 +5,7 @@ import net.minecraft.nbt.NBTTagCompound; import noppes.npcs.NBTTags; import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.data.GlobalNPCDataScript; +import noppes.npcs.controllers.data.IScriptUnit; import java.util.List; @@ -61,9 +62,9 @@ public class GuiScriptAllNPCs extends GuiScriptInterface { public void save() { if (loaded) { super.save(); - List containers = this.script.getScripts(); + List containers = this.script.getScripts(); for (int i = 0; i < containers.size(); i++) { - ScriptContainer container = containers.get(i); + IScriptUnit container = containers.get(i); GlobalNPCScriptPacket.Save(i, containers.size(), container.writeToNBT(new NBTTagCompound())); } NBTTagCompound scriptData = new NBTTagCompound(); diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptForge.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptForge.java index aea39d1a5..31c73478c 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptForge.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptForge.java @@ -15,6 +15,7 @@ import net.minecraftforge.event.world.WorldEvent; import noppes.npcs.NBTTags; import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.data.ForgeDataScript; +import noppes.npcs.controllers.data.IScriptUnit; import org.apache.commons.lang3.StringUtils; import java.io.IOException; @@ -91,9 +92,9 @@ public class GuiScriptForge extends GuiScriptInterface { public void save() { if (loaded) { super.save(); - List containers = this.script.getScripts(); + List containers = this.script.getScripts(); for (int i = 0; i < containers.size(); i++) { - ScriptContainer container = containers.get(i); + IScriptUnit container = containers.get(i); ForgeScriptPacket.Save(i, containers.size(), container.writeToNBT(new NBTTagCompound())); } NBTTagCompound scriptData = 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 98911941b..04d4f0595 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptInterface.java @@ -25,6 +25,7 @@ import noppes.npcs.controllers.ScriptController; import noppes.npcs.constants.ScriptContext; import noppes.npcs.controllers.data.ForgeDataScript; import noppes.npcs.controllers.data.IScriptHandler; +import noppes.npcs.controllers.data.IScriptUnit; import noppes.npcs.scripted.item.ScriptCustomItem; import org.lwjgl.opengl.Display; @@ -158,7 +159,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb * Handles both normal and fullscreen modes. */ private void initScriptEditorTab(int yoffset) { - ScriptContainer container = getCurrentContainer(); + IScriptUnit container = getCurrentContainer(); // ==================== CALCULATE VIEWPORT BOUNDS ==================== int editorX, editorY, editorWidth, editorHeight; @@ -206,13 +207,13 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb GuiScriptTextArea activeArea = getActiveScriptArea(); if (activeArea == null) { activeArea = new GuiScriptTextArea(this, 2, editorX, editorY, editorWidth, editorHeight, - container == null ? "" : container.script); + container == null ? "" : container.getScript()); activeArea.setListener(this); this.closeOnEsc(activeArea::closeOnEsc); textAreas.put(idx, activeArea); } else { activeArea.init(editorX, editorY, editorWidth, editorHeight, - container == null ? "" : container.script); + container == null ? "" : container.getScript()); } // Set the scripting language for proper syntax highlighting @@ -249,7 +250,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb scroll.guiLeft = left1; scroll.guiTop = this.guiTop + 88 + yoffset; if (container != null) { - scroll.setList(container.scripts); + scroll.setList(container.getExternalScripts()); } this.addScroll(scroll); } @@ -431,7 +432,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb * Get the current script container. * Override in subclasses with different container access patterns. */ - protected ScriptContainer getCurrentContainer() { + protected IScriptUnit getCurrentContainer() { int idx = getActiveScriptIndex(); if (idx >= 0 && idx < this.handler.getScripts().size()) return this.handler.getScripts().get(idx); @@ -448,7 +449,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb return super.getTextField(id); } - public ScriptContainer getFirst() { + public IScriptUnit getFirst() { if (this.handler.getScripts().isEmpty()) return null; return this.handler.getScripts().get(0); @@ -541,7 +542,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb protected void setScript() { if (this.activeTab > 0 || useScrollTabs) { - ScriptContainer container = getCurrentContainer(); + IScriptUnit container = getCurrentContainer(); if (container == null) { container = new ScriptContainer(this.handler); if (singleContainer) @@ -553,7 +554,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb String text = (this.getTextField(2)).getText(); text = text.replace("\r\n", "\n"); text = text.replace("\r", "\n"); - container.script = text; + container.setScript(text); } } @@ -640,7 +641,7 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb /** * Set the handler's container. Override if handler is not IScriptHandler. */ - protected void setHandlerContainer(ScriptContainer container) { + protected void setHandlerContainer(IScriptUnit container) { // Default implementation - subclasses may need to cast and set differently // e.g., ((LinkedItemScript) handler).container = container; } @@ -653,9 +654,9 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb if (loaded) { this.setScript(); - List containers = this.handler.getScripts(); + List containers = this.handler.getScripts(); for (int i = 0; i < containers.size(); i++) { - ScriptContainer container = containers.get(i); + IScriptUnit container = containers.get(i); sendSavePacket(i, containers.size(), container.writeToNBT(new NBTTagCompound())); } @@ -684,9 +685,9 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb } public void textUpdate(String text) { - ScriptContainer container = getCurrentContainer(); + IScriptUnit container = getCurrentContainer(); if (container != null) { - container.script = text; + container.setScript(text); } } @@ -695,9 +696,9 @@ public class GuiScriptInterface extends GuiNPCInterface implements GuiYesNoCallb @Override //NEVER USED public void saveText(String text) { - ScriptContainer container = getCurrentContainer(); + IScriptUnit container = getCurrentContainer(); if (container != null) - container.script = text; + container.setScript(text); initGui(); } diff --git a/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java b/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java index 9bb3ebdfd..4d2bffde2 100644 --- a/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java +++ b/src/main/java/noppes/npcs/client/gui/script/GuiScriptPlayers.java @@ -8,6 +8,7 @@ import noppes.npcs.constants.ScriptContext; import noppes.npcs.constants.EnumScriptType; import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.data.EffectScript; +import noppes.npcs.controllers.data.IScriptUnit; import noppes.npcs.controllers.data.PlayerDataScript; import java.util.List; @@ -123,9 +124,9 @@ public class GuiScriptPlayers extends GuiScriptInterface { public void save() { if (loaded) { super.save(); - List containers = this.script.getScripts(); + List containers = this.script.getScripts(); for (int i = 0; i < containers.size(); i++) { - ScriptContainer container = containers.get(i); + IScriptUnit container = containers.get(i); PlayerScriptPacket.Save(i, containers.size(), container.writeToNBT(new NBTTagCompound())); } NBTTagCompound scriptData = new NBTTagCompound(); diff --git a/src/main/java/noppes/npcs/controllers/ScriptContainer.java b/src/main/java/noppes/npcs/controllers/ScriptContainer.java index 5b2c21cdd..f8649ac47 100644 --- a/src/main/java/noppes/npcs/controllers/ScriptContainer.java +++ b/src/main/java/noppes/npcs/controllers/ScriptContainer.java @@ -7,6 +7,7 @@ import noppes.npcs.NBTTags; import noppes.npcs.config.ConfigScript; import noppes.npcs.constants.EnumScriptType; import noppes.npcs.controllers.data.IScriptHandler; +import noppes.npcs.controllers.data.IScriptUnit; import noppes.npcs.scripted.NpcAPI; import javax.script.Compilable; @@ -24,7 +25,7 @@ import java.util.Map; import java.util.Objects; import java.util.TreeMap; -public class ScriptContainer { +public class ScriptContainer implements IScriptUnit { private static final String lock = "lock"; public static ScriptContainer Current; private static String CurrentType; @@ -251,6 +252,7 @@ public class ScriptContainer { return evaluated && !errored; } + @Override public boolean hasCode() { if (!scripts.isEmpty()) return true; @@ -267,4 +269,73 @@ public class ScriptContainer { this.evaluated = false; } } + + // ==================== IScriptUnit IMPLEMENTATION ==================== + + @Override + public String getScript() { + return this.script; + } + + @Override + public void setScript(String script) { + this.script = script; + this.evaluated = false; + } + + @Override + public List getExternalScripts() { + return this.scripts; + } + + @Override + public void setExternalScripts(List scripts) { + this.scripts = scripts; + this.evaluated = false; + } + + @Override + public TreeMap getConsole() { + return this.console; + } + + @Override + public void clearConsole() { + this.console.clear(); + } + + @Override + public String getLanguage() { + // If a specific language is set for this container, use it + // Otherwise fall back to the handler's language + if (currentScriptLanguage != null) { + return currentScriptLanguage; + } + return handler != null ? handler.getLanguage() : "ECMAScript"; + } + + @Override + public void setLanguage(String language) { + if (!Objects.equals(this.currentScriptLanguage, language)) { + this.currentScriptLanguage = language; + this.evaluated = false; + } + } + + @Override + public String generateHookStub(String hookName, Object hookData) { + // ECMAScript function template + return "function " + hookName + "(event) {\n \n}\n"; + } + + @Override + public boolean hasErrored() { + return this.errored; + } + + @Override + public void setErrored(boolean errored) { + this.errored = errored; + } } + diff --git a/src/main/java/noppes/npcs/controllers/data/DataScript.java b/src/main/java/noppes/npcs/controllers/data/DataScript.java index bf4327d38..45ba9a966 100644 --- a/src/main/java/noppes/npcs/controllers/data/DataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/DataScript.java @@ -36,7 +36,7 @@ import java.util.Map; import java.util.TreeMap; public class DataScript implements INpcScriptHandler { - public List eventScripts = new ArrayList<>(); + public List eventScripts = new ArrayList<>(); private HashMap scripts = new HashMap<>(); private final static EntityType entities = new EntityType(); @@ -146,14 +146,16 @@ public class DataScript implements INpcScriptHandler { if (!hasInited && !npc.isRemote() && type != EnumScriptType.INIT) { hasInited = true; - for (ScriptContainer scriptContainer : this.eventScripts) { - scriptContainer.errored = false; + for (IScriptUnit scriptUnit : this.eventScripts) { + scriptUnit.setErrored(false); } EventHooks.onNPCInit(this.npc); } - for (ScriptContainer script : this.eventScripts) { - script.run(type, event); + for (IScriptUnit script : this.eventScripts) { + if (script instanceof ScriptContainer) { + ((ScriptContainer) script).run(type, event); + } } ScriptContainer script = scripts.get(type); @@ -224,10 +226,10 @@ public class DataScript implements INpcScriptHandler { public Map getConsoleText() { TreeMap map = new TreeMap<>(); int tab = 0; - for (ScriptContainer script : this.getScripts()) { + for (IScriptUnit script : this.getScripts()) { ++tab; - for (Map.Entry longStringEntry : script.console.entrySet()) { + for (Map.Entry longStringEntry : script.getConsole().entrySet()) { map.put(longStringEntry.getKey(), " tab " + tab + ":\n" + longStringEntry.getValue()); } } @@ -235,8 +237,8 @@ public class DataScript implements INpcScriptHandler { } public void clearConsole() { - for (ScriptContainer script : this.getScripts()) { - script.console.clear(); + for (IScriptUnit script : this.getScripts()) { + script.clearConsole(); } } @@ -274,11 +276,11 @@ public class DataScript implements INpcScriptHandler { this.scriptLanguage = lang; } - public void setScripts(List list) { + public void setScripts(List list) { this.eventScripts = list; } - public List getScripts() { + public List getScripts() { return this.eventScripts; } diff --git a/src/main/java/noppes/npcs/controllers/data/EffectScript.java b/src/main/java/noppes/npcs/controllers/data/EffectScript.java index bd2b75dae..497b46421 100644 --- a/src/main/java/noppes/npcs/controllers/data/EffectScript.java +++ b/src/main/java/noppes/npcs/controllers/data/EffectScript.java @@ -15,13 +15,12 @@ import noppes.npcs.scripted.event.player.PlayerEvent; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; public class EffectScript implements INpcScriptHandler { - public ScriptContainer container; + public IScriptUnit container; public String scriptLanguage = "ECMAScript"; public boolean enabled = false; @@ -64,7 +63,8 @@ public class EffectScript implements INpcScriptHandler { if (!this.isEnabled()) { return; } - container.run(s, event); + if (container instanceof ScriptContainer) + ((ScriptContainer) container).run(s, event); } @Override @@ -93,7 +93,7 @@ public class EffectScript implements INpcScriptHandler { } @Override - public void setScripts(List list) { + public void setScripts(List list) { if (list == null || list.isEmpty()) { container = null; return; @@ -102,7 +102,7 @@ public class EffectScript implements INpcScriptHandler { } @Override - public List getScripts() { + public List getScripts() { if (container == null) return new ArrayList<>(); return Collections.singletonList(container); @@ -115,31 +115,21 @@ public class EffectScript implements INpcScriptHandler { @Override public Map getConsoleText() { - TreeMap map = new TreeMap(); + TreeMap map = new TreeMap<>(); int tab = 0; - Iterator var3 = this.getScripts().iterator(); - - while (var3.hasNext()) { - ScriptContainer script = (ScriptContainer) var3.next(); + for (IScriptUnit script : this.getScripts()) { ++tab; - Iterator var5 = script.console.entrySet().iterator(); - - while (var5.hasNext()) { - Map.Entry longStringEntry = (Map.Entry) var5.next(); - map.put(longStringEntry.getKey(), " tab " + tab + ":\n" + (String) longStringEntry.getValue()); + for (Map.Entry entry : script.getConsole().entrySet()) { + map.put(entry.getKey(), " tab " + tab + ":\n" + entry.getValue()); } } - return map; } @Override public void clearConsole() { - Iterator var1 = this.getScripts().iterator(); - - while (var1.hasNext()) { - ScriptContainer script = (ScriptContainer) var1.next(); - script.console.clear(); + for (IScriptUnit script : this.getScripts()) { + script.clearConsole(); } } @@ -180,4 +170,4 @@ public class EffectScript implements INpcScriptHandler { this.function = functionName; } } -} +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java b/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java index dde123aae..d38342f0e 100644 --- a/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/ForgeDataScript.java @@ -16,7 +16,7 @@ import java.util.Map.Entry; import java.util.TreeMap; public class ForgeDataScript implements INpcScriptHandler { - private List scripts = new ArrayList(); + private List scripts = new ArrayList<>(); private String scriptLanguage = "ECMAScript"; public long lastInited = -1L; private long lastForgeUpdate = -1L; @@ -26,14 +26,14 @@ public class ForgeDataScript implements INpcScriptHandler { } public void clear() { - this.scripts = new ArrayList(); + this.scripts = new ArrayList<>(); } public void readFromNBT(NBTTagCompound compound) { if (compound.hasKey("Scripts")) { - this.scripts = NBTTags.GetScriptOld(compound.getTagList("Scripts", 10), this); + this.scripts = new ArrayList<>(NBTTags.GetScriptOld(compound.getTagList("Scripts", 10), this)); } else { - this.scripts = NBTTags.GetScript(compound, this); + this.scripts = new ArrayList<>(NBTTags.GetScript(compound, this)); } this.scriptLanguage = compound.getString("ScriptLanguage"); if (!ScriptController.Instance.languages.containsKey(scriptLanguage)) { @@ -67,8 +67,9 @@ public class ForgeDataScript implements INpcScriptHandler { this.lastInited = ScriptController.Instance.lastLoaded; this.lastForgeUpdate = ScriptController.Instance.lastForgeUpdate; - for (ScriptContainer script : this.scripts) { - script.errored = false; + for (IScriptUnit script : this.scripts) { + if (script instanceof ScriptContainer) + ((ScriptContainer) script).errored = false; } if (!type.equals("init")) { @@ -76,11 +77,15 @@ public class ForgeDataScript implements INpcScriptHandler { } } - for (ScriptContainer script : this.scripts) { - if (script == null || script.errored || !script.hasCode()) + for (IScriptUnit script : this.scripts) { + if (script == null || !script.hasCode()) continue; - - script.run(type, event); + if (script instanceof ScriptContainer) { + ScriptContainer container = (ScriptContainer) script; + if (container.errored) + continue; + container.run(type, event); + } } } } @@ -109,11 +114,11 @@ public class ForgeDataScript implements INpcScriptHandler { this.scriptLanguage = lang; } - public void setScripts(List list) { + public void setScripts(List list) { this.scripts = list; } - public List getScripts() { + public List getScripts() { return this.scripts; } @@ -124,19 +129,18 @@ public class ForgeDataScript implements INpcScriptHandler { public Map getConsoleText() { TreeMap map = new TreeMap<>(); int tab = 0; - for (ScriptContainer script : this.getScripts()) { + for (IScriptUnit script : this.getScripts()) { ++tab; - - for (Entry longStringEntry : script.console.entrySet()) { - map.put(longStringEntry.getKey(), " tab " + tab + ":\n" + longStringEntry.getValue()); + for (Entry entry : script.getConsole().entrySet()) { + map.put(entry.getKey(), " tab " + tab + ":\n" + entry.getValue()); } } return map; } public void clearConsole() { - for (ScriptContainer script : this.getScripts()) { - script.console.clear(); + for (IScriptUnit script : this.getScripts()) { + script.clearConsole(); } } } diff --git a/src/main/java/noppes/npcs/controllers/data/GlobalNPCDataScript.java b/src/main/java/noppes/npcs/controllers/data/GlobalNPCDataScript.java index 335256e0f..f21818136 100644 --- a/src/main/java/noppes/npcs/controllers/data/GlobalNPCDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/GlobalNPCDataScript.java @@ -27,7 +27,7 @@ import java.util.OptionalLong; import java.util.TreeMap; public class GlobalNPCDataScript implements INpcScriptHandler { - public List scripts = new ArrayList(); + public List scripts = new ArrayList<>(); public String scriptLanguage = "ECMAScript"; private EntityNPCInterface npc; private ICustomNpc npcAPI; @@ -42,14 +42,14 @@ public class GlobalNPCDataScript implements INpcScriptHandler { } public void clear() { - this.scripts = new ArrayList(); + this.scripts = new ArrayList<>(); } public void readFromNBT(NBTTagCompound compound) { if (compound.hasKey("Scripts")) { - this.scripts = NBTTags.GetScriptOld(compound.getTagList("Scripts", 10), this); + this.scripts = new ArrayList<>(NBTTags.GetScriptOld(compound.getTagList("Scripts", 10), this)); } else { - this.scripts = NBTTags.GetScript(compound, this); + this.scripts = new ArrayList<>(NBTTags.GetScript(compound, this)); } this.scriptLanguage = compound.getString("ScriptLanguage"); if (!ScriptController.Instance.languages.containsKey(scriptLanguage)) { @@ -87,16 +87,21 @@ public class GlobalNPCDataScript implements INpcScriptHandler { this.lastInited = ScriptController.Instance.lastLoaded; this.lastNpcUpdate = ScriptController.Instance.lastGlobalNpcUpdate; - for (ScriptContainer script : this.scripts) { - script.errored = false; + for (IScriptUnit script : this.scripts) { + if (script instanceof ScriptContainer) + ((ScriptContainer) script).errored = false; } } - for (ScriptContainer script : this.scripts) { - if (script == null || script.errored || !script.hasCode()) + for (IScriptUnit script : this.scripts) { + if (script == null || !script.hasCode()) continue; - - script.run(hookName, event); + if (script instanceof ScriptContainer) { + ScriptContainer container = (ScriptContainer) script; + if (container.errored) + continue; + container.run(hookName, event); + } } } } @@ -121,11 +126,11 @@ public class GlobalNPCDataScript implements INpcScriptHandler { this.scriptLanguage = lang; } - public void setScripts(List list) { + public void setScripts(List list) { this.scripts = list; } - public List getScripts() { + public List getScripts() { return this.scripts; } @@ -148,19 +153,18 @@ public class GlobalNPCDataScript implements INpcScriptHandler { public Map getConsoleText() { TreeMap map = new TreeMap<>(); int tab = 0; - for (ScriptContainer script : this.getScripts()) { + for (IScriptUnit script : this.getScripts()) { ++tab; - - for (Map.Entry longStringEntry : script.console.entrySet()) { - map.put(longStringEntry.getKey(), " tab " + tab + ":\n" + longStringEntry.getValue()); + for (Map.Entry entry : script.getConsole().entrySet()) { + map.put(entry.getKey(), " tab " + tab + ":\n" + entry.getValue()); } } return map; } public void clearConsole() { - for (ScriptContainer script : this.getScripts()) { - script.console.clear(); + for (IScriptUnit script : this.getScripts()) { + script.clearConsole(); } } diff --git a/src/main/java/noppes/npcs/controllers/data/IScriptHandler.java b/src/main/java/noppes/npcs/controllers/data/IScriptHandler.java index be37c86f1..d89fbc7a2 100644 --- a/src/main/java/noppes/npcs/controllers/data/IScriptHandler.java +++ b/src/main/java/noppes/npcs/controllers/data/IScriptHandler.java @@ -1,7 +1,6 @@ package noppes.npcs.controllers.data; import cpw.mods.fml.common.eventhandler.Event; -import noppes.npcs.controllers.ScriptContainer; import java.util.List; import java.util.Map; @@ -19,9 +18,9 @@ public interface IScriptHandler { void setLanguage(String language); - void setScripts(List list); + void setScripts(List list); - List getScripts(); + List getScripts(); String noticeString(); diff --git a/src/main/java/noppes/npcs/controllers/data/IScriptUnit.java b/src/main/java/noppes/npcs/controllers/data/IScriptUnit.java new file mode 100644 index 000000000..d8d280be0 --- /dev/null +++ b/src/main/java/noppes/npcs/controllers/data/IScriptUnit.java @@ -0,0 +1,117 @@ +package noppes.npcs.controllers.data; + +import net.minecraft.nbt.NBTTagCompound; + +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * Common interface for script units that can be edited in a script GUI. + * Implemented by both ScriptContainer (ECMAScript) and JaninoScript (Java/Janino). + * This allows GuiScriptInterface to work with both script types uniformly. + */ +public interface IScriptUnit { + + // ==================== SCRIPT CONTENT ==================== + + /** + * Get the main script text content. + */ + String getScript(); + + /** + * Set the main script text content. + */ + void setScript(String script); + + /** + * Get the list of external script file names loaded for this unit. + */ + List getExternalScripts(); + + /** + * Set the list of external script file names to load. + */ + void setExternalScripts(List scripts); + + // ==================== CONSOLE ==================== + + /** + * Get the console output map (timestamp -> message). + */ + TreeMap getConsole(); + + /** + * Clear all console output. + */ + void clearConsole(); + + /** + * Append a message to the console. + */ + void appendConsole(String message); + + // ==================== LANGUAGE ==================== + + /** + * Get the scripting language for this unit. + * Returns "ECMAScript", "Java", etc. + */ + String getLanguage(); + + /** + * Set the scripting language for this unit. + * @param language The language name (e.g., "ECMAScript", "Java") + */ + void setLanguage(String language); + + /** + * Check if this script unit uses Janino (Java) compilation. + */ + default boolean isJanino() { + return "Java".equals(getLanguage()); + } + + // ==================== HOOK GENERATION ==================== + + /** + * Generate a stub/template for the given hook name. + * ECMAScript: function hookName(event) { } + * Janino: full Java method signature with return type + * + * @param hookName The hook name to generate a stub for + * @param hookData Optional data (e.g., Method object for Janino) + * @return The generated stub string + */ + String generateHookStub(String hookName, Object hookData); + + // ==================== NBT ==================== + + /** + * Write this script unit to NBT. + */ + NBTTagCompound writeToNBT(NBTTagCompound compound); + + /** + * Read this script unit from NBT. + */ + void readFromNBT(NBTTagCompound compound); + + // ==================== STATE ==================== + + /** + * Check if this script unit has any code (script or external scripts). + */ + boolean hasCode(); + + /** + * Check if this script unit has encountered an error during execution. + */ + boolean hasErrored(); + + /** + * Set the error state of this script unit. + */ + void setErrored(boolean errored); +} diff --git a/src/main/java/noppes/npcs/controllers/data/LinkedItemScript.java b/src/main/java/noppes/npcs/controllers/data/LinkedItemScript.java index cce8df255..18df07229 100644 --- a/src/main/java/noppes/npcs/controllers/data/LinkedItemScript.java +++ b/src/main/java/noppes/npcs/controllers/data/LinkedItemScript.java @@ -14,13 +14,12 @@ import noppes.npcs.controllers.ScriptController; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; public class LinkedItemScript implements INpcScriptHandler { - public ScriptContainer container; + public IScriptUnit container; public String scriptLanguage = "ECMAScript"; public boolean enabled = false; @@ -58,7 +57,8 @@ public class LinkedItemScript implements INpcScriptHandler { if (!this.isEnabled()) { return; } - container.run(s, event); + if (container instanceof ScriptContainer) + ((ScriptContainer) container).run(s, event); } @Override @@ -87,7 +87,7 @@ public class LinkedItemScript implements INpcScriptHandler { } @Override - public void setScripts(List list) { + public void setScripts(List list) { if (list == null || list.isEmpty()) { container = null; return; @@ -96,7 +96,7 @@ public class LinkedItemScript implements INpcScriptHandler { } @Override - public List getScripts() { + public List getScripts() { if (container == null) return new ArrayList<>(); return Collections.singletonList(container); @@ -109,31 +109,21 @@ public class LinkedItemScript implements INpcScriptHandler { @Override public Map getConsoleText() { - TreeMap map = new TreeMap(); + TreeMap map = new TreeMap<>(); int tab = 0; - Iterator var3 = this.getScripts().iterator(); - - while (var3.hasNext()) { - ScriptContainer script = (ScriptContainer) var3.next(); + for (IScriptUnit script : this.getScripts()) { ++tab; - Iterator var5 = script.console.entrySet().iterator(); - - while (var5.hasNext()) { - Map.Entry longStringEntry = (Map.Entry) var5.next(); - map.put(longStringEntry.getKey(), " tab " + tab + ":\n" + (String) longStringEntry.getValue()); + for (Map.Entry entry : script.getConsole().entrySet()) { + map.put(entry.getKey(), " tab " + tab + ":\n" + entry.getValue()); } } - return map; } @Override public void clearConsole() { - Iterator var1 = this.getScripts().iterator(); - - while (var1.hasNext()) { - ScriptContainer script = (ScriptContainer) var1.next(); - script.console.clear(); + for (IScriptUnit script : this.getScripts()) { + script.clearConsole(); } } diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java index a425bdcd4..5d2eee9f9 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerDataScript.java @@ -31,7 +31,7 @@ import java.util.OptionalLong; import java.util.TreeMap; public class PlayerDataScript implements INpcScriptHandler { - public List scripts = new ArrayList(); + public List scripts = new ArrayList<>(); public String scriptLanguage = "ECMAScript"; private EntityPlayer player; private IPlayer playerAPI; @@ -53,14 +53,14 @@ public class PlayerDataScript implements INpcScriptHandler { public void clear() { console = new TreeMap(); errored = new ArrayList(); - scripts = new ArrayList(); + scripts = new ArrayList<>(); } public void readFromNBT(NBTTagCompound compound) { if (compound.hasKey("Scripts")) { - this.scripts = NBTTags.GetScriptOld(compound.getTagList("Scripts", 10), this); + this.scripts = new ArrayList<>(NBTTags.GetScriptOld(compound.getTagList("Scripts", 10), this)); } else { - this.scripts = NBTTags.GetScript(compound, this); + this.scripts = new ArrayList<>(NBTTags.GetScript(compound, this)); } this.scriptLanguage = compound.getString("ScriptLanguage"); if (!ScriptController.Instance.languages.containsKey(scriptLanguage)) { @@ -104,10 +104,12 @@ public class PlayerDataScript implements INpcScriptHandler { errored.clear(); if (player != null) { scripts.clear(); - for (ScriptContainer script : ScriptController.Instance.playerScripts.scripts) { - ScriptContainer s = new ScriptContainer(this); - s.readFromNBT(script.writeToNBT(new NBTTagCompound())); - scripts.add(s); + for (IScriptUnit script : ScriptController.Instance.playerScripts.scripts) { + if (script instanceof ScriptContainer) { + ScriptContainer s = new ScriptContainer(this); + s.readFromNBT(((ScriptContainer) script).writeToNBT(new NBTTagCompound())); + scripts.add(s); + } } } lastPlayerUpdate = ScriptController.Instance.lastPlayerUpdate; @@ -117,26 +119,30 @@ public class PlayerDataScript implements INpcScriptHandler { } } for (int i = 0; i < scripts.size(); i++) { - ScriptContainer script = scripts.get(i); + IScriptUnit script = scripts.get(i); if (errored.contains(i)) continue; - script.run(hookName, event); - if (script.errored) { - errored.add(i); + if (script instanceof ScriptContainer) { + ScriptContainer container = (ScriptContainer) script; + container.run(hookName, event); + if (container.errored) { + errored.add(i); + } + for (Entry entry : container.console.entrySet()) { + if (!console.containsKey(entry.getKey())) + console.put(entry.getKey(), " tab " + (i + 1) + ":\n" + entry.getValue()); + } + container.console.clear(); } - for (Entry entry : script.console.entrySet()) { - if (!console.containsKey(entry.getKey())) - console.put(entry.getKey(), " tab " + (i + 1) + ":\n" + entry.getValue()); - } - script.console.clear(); } } else { if (ScriptController.Instance.lastLoaded > this.lastInited || ScriptController.Instance.lastPlayerUpdate > this.lastPlayerUpdate) { this.lastInited = ScriptController.Instance.lastLoaded; this.lastPlayerUpdate = ScriptController.Instance.lastPlayerUpdate; - for (ScriptContainer scriptContainer : this.scripts) { - scriptContainer.errored = false; + for (IScriptUnit script : this.scripts) { + if (script instanceof ScriptContainer) + ((ScriptContainer) script).errored = false; } if (!Objects.equals(hookName, EnumScriptType.INIT.function) && event instanceof PlayerEvent) { @@ -145,11 +151,13 @@ public class PlayerDataScript implements INpcScriptHandler { } } - for (ScriptContainer script : this.scripts) { - if (script == null || script.errored || !script.hasCode()) + for (IScriptUnit script : this.scripts) { + if (script == null || script.hasErrored()|| !script.hasCode()) continue; - - script.run(hookName, event); + if (script instanceof ScriptContainer) { + ScriptContainer container = (ScriptContainer) script; + container.run(hookName, event); + } } } } @@ -175,11 +183,11 @@ public class PlayerDataScript implements INpcScriptHandler { this.scriptLanguage = lang; } - public void setScripts(List list) { + public void setScripts(List list) { this.scripts = list; } - public List getScripts() { + public List getScripts() { return this.scripts; } @@ -205,11 +213,10 @@ public class PlayerDataScript implements INpcScriptHandler { TreeMap map = new TreeMap<>(); int tab = 0; - for (ScriptContainer script : this.getScripts()) { + for (IScriptUnit script : this.getScripts()) { ++tab; - - for (Entry longStringEntry : script.console.entrySet()) { - map.put(longStringEntry.getKey(), " tab " + tab + ":\n" + longStringEntry.getValue()); + for (Entry entry : script.getConsole().entrySet()) { + map.put(entry.getKey(), " tab " + tab + ":\n" + entry.getValue()); } } return map; @@ -219,8 +226,8 @@ public class PlayerDataScript implements INpcScriptHandler { if (ConfigScript.IndividualPlayerScripts) console.clear(); else { - for (ScriptContainer script : this.getScripts()) { - script.console.clear(); + for (IScriptUnit script : this.getScripts()) { + script.clearConsole(); } } } diff --git a/src/main/java/noppes/npcs/controllers/data/RecipeScript.java b/src/main/java/noppes/npcs/controllers/data/RecipeScript.java index b94acfbc6..b42595cf5 100644 --- a/src/main/java/noppes/npcs/controllers/data/RecipeScript.java +++ b/src/main/java/noppes/npcs/controllers/data/RecipeScript.java @@ -19,7 +19,7 @@ import java.util.Map; import java.util.TreeMap; public class RecipeScript implements INpcScriptHandler { - public ScriptContainer container; + public IScriptUnit container; public String scriptLanguage = "ECMAScript"; public boolean enabled = false; @@ -54,7 +54,8 @@ public class RecipeScript implements INpcScriptHandler { public void callScript(String s, Event event) { if (!this.isEnabled()) return; - container.run(s, event); + if (container instanceof ScriptContainer) + ((ScriptContainer) container).run(s, event); } @Override @@ -83,7 +84,7 @@ public class RecipeScript implements INpcScriptHandler { } @Override - public void setScripts(List list) { + public void setScripts(List list) { if (list == null || list.isEmpty()) { container = null; return; @@ -92,7 +93,7 @@ public class RecipeScript implements INpcScriptHandler { } @Override - public List getScripts() { + public List getScripts() { if (container == null) return new ArrayList<>(); return Collections.singletonList(container); @@ -107,9 +108,9 @@ public class RecipeScript implements INpcScriptHandler { public Map getConsoleText() { TreeMap map = new TreeMap<>(); int tab = 0; - for (ScriptContainer script : this.getScripts()) { + for (IScriptUnit script : this.getScripts()) { ++tab; - for (Map.Entry entry : script.console.entrySet()) { + for (Map.Entry entry : script.getConsole().entrySet()) { map.put(entry.getKey(), " tab " + tab + ":\n" + entry.getValue()); } } @@ -118,8 +119,8 @@ public class RecipeScript implements INpcScriptHandler { @Override public void clearConsole() { - for (ScriptContainer script : this.getScripts()) { - script.console.clear(); + for (IScriptUnit script : this.getScripts()) { + script.clearConsole(); } } @@ -156,4 +157,4 @@ public class RecipeScript implements INpcScriptHandler { this.function = functionName; } } -} +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/janino/JaninoScript.java b/src/main/java/noppes/npcs/janino/JaninoScript.java index f836e97cf..5fb02a46e 100644 --- a/src/main/java/noppes/npcs/janino/JaninoScript.java +++ b/src/main/java/noppes/npcs/janino/JaninoScript.java @@ -8,16 +8,21 @@ import noppes.npcs.CustomNpcs; import noppes.npcs.NBTTags; import noppes.npcs.config.ConfigScript; import noppes.npcs.controllers.ScriptController; +import noppes.npcs.controllers.data.IScriptUnit; import org.codehaus.commons.compiler.InternalCompilerException; import org.codehaus.commons.compiler.Sandbox; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; import java.security.*; import java.util.*; import java.util.function.Consumer; import java.util.function.Function; +import java.util.stream.Collectors; -public abstract class JaninoScript { +public abstract class JaninoScript implements IScriptUnit { public boolean enabled; + public boolean errored = false; private String language = "Java"; public TreeMap console = new TreeMap(); @@ -184,18 +189,132 @@ public abstract class JaninoScript { sb.append(code).append("\n"); } } + + // ==================== IScriptUnit IMPLEMENTATION ==================== + @Override + public String getScript() { + return this.script; + } + + @Override public void setScript(String script) { this.script = script; this.evaluated = false; } + + @Override + public List getExternalScripts() { + return this.externalScripts; + } + @Override public void setExternalScripts(List externalScripts) { this.externalScripts = externalScripts; this.evaluated = false; } + + @Override + public TreeMap getConsole() { + return this.console; + } + + @Override + public void clearConsole() { + console.clear(); + } + + @Override + public void appendConsole(String message) { + if (message != null && !message.isEmpty()) { + long time = System.currentTimeMillis(); + if (this.console.containsKey(time)) { + message = (String) this.console.get(time) + "\n" + message; + } + + this.console.put(time, message); + + while (this.console.size() > 40) { + this.console.remove(this.console.firstKey()); + } + } + } + + @Override + public String getLanguage() { + return this.language; + } + + @Override + public void setLanguage(String language) { + // JaninoScript is always Java, ignore attempts to change + // This method exists for IScriptUnit interface compatibility + } + + @Override + public boolean hasCode() { + if (!externalScripts.isEmpty()) + return true; + return script != null && !script.isEmpty(); + } + + @Override + public String generateHookStub(String hookName, Object hookData) { + // If hookData is a Method, generate full Java method stub + if (hookData instanceof Method) { + return generateMethodStub((Method) hookData); + } + // Fallback for simple hook names - generate basic override + return String.format("@Override\npublic void %s() {\n \n}\n", hookName); + } + + /** + * Generates a stub string for a given Method. + */ + public static String generateMethodStub(Method method) { + String mods = Modifier.toString(method.getModifiers()); + // Remove 'abstract' from modifiers for implementation + mods = mods.replace("abstract ", "").replace("abstract", "").trim(); + if (!mods.isEmpty()) + mods += " "; + + String returnTypeStr = method.getReturnType().getSimpleName(); + String name = method.getName(); + + Map typeCount = new HashMap<>(); + String params = Arrays.stream(method.getParameters()) + .map(p -> { + String typeName = p.getType().getSimpleName(); + String baseName = Character.toLowerCase(typeName.charAt(0)) + typeName.substring(1); + + int count = typeCount.getOrDefault(baseName, 0) + 1; + typeCount.put(baseName, count); + + String paramName = count == 1 ? baseName : baseName + (count - 1); + return typeName + " " + paramName; + }) + .collect(Collectors.joining(", ")); + + String body; + Class returnType = method.getReturnType(); + if (returnType == void.class) + body = ""; + else if (returnType.isPrimitive()) { + if (returnType == boolean.class) + body = " return false;"; + else if (returnType == char.class) + body = " return '\\0';"; + else + body = " return 0;"; + } else { + body = " return null;"; + } + + return String.format("@Override\n%s%s %s(%s) {\n%s\n}\n", mods, returnTypeStr, name, params, body); + } + @Override public NBTTagCompound writeToNBT(NBTTagCompound compound) { compound.setBoolean("enabled", enabled); compound.setTag("console", NBTTags.NBTLongStringMap(this.console)); @@ -204,12 +323,12 @@ public abstract class JaninoScript { return compound; } - public JaninoScript readFromNBT(NBTTagCompound compound) { + @Override + public void readFromNBT(NBTTagCompound compound) { this.enabled = compound.getBoolean("enabled"); this.console = NBTTags.GetLongStringMap(compound.getTagList("console", 10)); setExternalScripts(NBTTags.getStringList(compound.getTagList("externalScripts", 10))); - setScript(compound.getString("script")); //after everything else is read - return this; + setScript(compound.getString("script")); } public boolean isEnabled() { @@ -233,25 +352,6 @@ public abstract class JaninoScript { } } - public String getLanguage() { - return this.language; - } - - public void appendConsole(String message) { - if (message != null && !message.isEmpty()) { - long time = System.currentTimeMillis(); - if (this.console.containsKey(time)) { - message = (String) this.console.get(time) + "\n" + message; - } - - this.console.put(time, message); - - while (this.console.size() > 40) { - this.console.remove(this.console.firstKey()); - } - } - } - public Map getConsoleText() { TreeMap map = new TreeMap(); int tab = 0; @@ -264,13 +364,16 @@ public abstract class JaninoScript { map.put(longStringEntry.getKey(), " tab " + tab + ":\n" + (String) longStringEntry.getValue()); } - return map; } - - public void clearConsole() { - console.clear(); + + @Override + public boolean hasErrored() { + return this.errored; } -} - - + + @Override + public void setErrored(boolean errored) { + this.errored = errored; + } +} \ No newline at end of file diff --git a/src/main/java/noppes/npcs/scripted/item/ScriptCustomItem.java b/src/main/java/noppes/npcs/scripted/item/ScriptCustomItem.java index 6e85e1555..e03995e16 100644 --- a/src/main/java/noppes/npcs/scripted/item/ScriptCustomItem.java +++ b/src/main/java/noppes/npcs/scripted/item/ScriptCustomItem.java @@ -7,6 +7,7 @@ import noppes.npcs.EventHooks; import noppes.npcs.NBTTags; import noppes.npcs.api.item.IItemCustom; import noppes.npcs.constants.EnumScriptType; +import noppes.npcs.controllers.data.IScriptUnit; import noppes.npcs.controllers.ScriptContainer; import noppes.npcs.controllers.ScriptController; import noppes.npcs.controllers.data.INpcScriptHandler; @@ -19,7 +20,7 @@ import java.util.Objects; import java.util.TreeMap; public class ScriptCustomItem extends ScriptCustomizableItem implements IItemCustom, INpcScriptHandler { - public List scripts = new ArrayList(); + public List scripts = new ArrayList(); public List errored = new ArrayList(); public String scriptLanguage = "ECMAScript"; public boolean enabled = false; @@ -95,14 +96,16 @@ public class ScriptCustomItem extends ScriptCustomizableItem implements IItemCus } for (int i = 0; i < this.scripts.size(); i++) { - ScriptContainer script = this.scripts.get(i); + IScriptUnit script = this.scripts.get(i); if (!this.errored.contains(i)) { - if (script == null || script.errored || !script.hasCode()) + if (script == null || script.hasErrored() || !script.hasCode()) continue; - script.run(hookName, event); + if (script instanceof ScriptContainer) { + ((ScriptContainer) script).run(hookName, event); + } - if (script.errored) { + if (script.hasErrored()) { this.errored.add(i); } } @@ -129,11 +132,11 @@ public class ScriptCustomItem extends ScriptCustomizableItem implements IItemCus this.scriptLanguage = lang; } - public void setScripts(List list) { + public void setScripts(List list) { this.scripts = list; } - public List getScripts() { + public List getScripts() { return this.scripts; }