From cd6415b0614c09b058c95eba3fa8e73e19fad33a Mon Sep 17 00:00:00 2001 From: P0nk Date: Sun, 18 Apr 2021 12:31:01 +0200 Subject: [PATCH] Enforce implementation of PortalScript --- .../portal/PortalPlayerInteraction.java | 3 +- .../scripting/portal/PortalScriptManager.java | 40 +++++++++++-------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/main/java/scripting/portal/PortalPlayerInteraction.java b/src/main/java/scripting/portal/PortalPlayerInteraction.java index 59589d6c47..d12ea79a1d 100644 --- a/src/main/java/scripting/portal/PortalPlayerInteraction.java +++ b/src/main/java/scripting/portal/PortalPlayerInteraction.java @@ -34,8 +34,7 @@ import java.sql.ResultSet; import java.sql.SQLException; public class PortalPlayerInteraction extends AbstractPlayerInteraction { - - private MaplePortal portal; + private final MaplePortal portal; public PortalPlayerInteraction(MapleClient c, MaplePortal portal) { super(c); diff --git a/src/main/java/scripting/portal/PortalScriptManager.java b/src/main/java/scripting/portal/PortalScriptManager.java index f54aa32cb6..7900676466 100644 --- a/src/main/java/scripting/portal/PortalScriptManager.java +++ b/src/main/java/scripting/portal/PortalScriptManager.java @@ -22,48 +22,56 @@ along with this program. If not, see . package scripting.portal; import client.MapleClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import scripting.AbstractScriptManager; import server.maps.MaplePortal; -import tools.FilePrinter; import javax.script.Invocable; +import javax.script.ScriptEngine; +import javax.script.ScriptException; import java.util.HashMap; import java.util.Map; public class PortalScriptManager extends AbstractScriptManager { + private static final Logger log = LoggerFactory.getLogger(PortalScriptManager.class); private static final PortalScriptManager instance = new PortalScriptManager(); - private final Map scripts = new HashMap<>(); + private final Map scripts = new HashMap<>(); public static PortalScriptManager getInstance() { return instance; } - private Invocable getPortalScript(String scriptName) { + private PortalScript getPortalScript(String scriptName) throws ScriptException { String scriptPath = "portal/" + scriptName + ".js"; - Invocable iv = scripts.get(scriptPath); - if (iv != null) { - return iv; + PortalScript script = scripts.get(scriptPath); + if (script != null) { + return script; } - iv = (Invocable) getInvocableScriptEngine(scriptPath); - if (iv == null) { + ScriptEngine engine = getInvocableScriptEngine(scriptPath); + if (!(engine instanceof Invocable iv)) { return null; } - - scripts.put(scriptPath, iv); - return iv; + + script = iv.getInterface(PortalScript.class); + if (script == null) { + throw new ScriptException(String.format("Portal script \"%s\" fails to implement the PortalScript interface", scriptName)); + } + + scripts.put(scriptPath, script); + return script; } public boolean executePortalScript(MaplePortal portal, MapleClient c) { try { - Invocable iv = getPortalScript(portal.getScriptName()); - if (iv != null) { - boolean couldWarp = (boolean) iv.invokeFunction("enter", new PortalPlayerInteraction(c, portal)); - return couldWarp; + PortalScript script = getPortalScript(portal.getScriptName()); + if (script != null) { + return script.enter(new PortalPlayerInteraction(c, portal)); } } catch (Exception e) { - FilePrinter.printError(FilePrinter.PORTAL + portal.getScriptName() + ".txt", e); + log.warn("Portal script {}", portal.getScriptName(), e); } return false; }