package scripting; import client.MapleCharacter; import client.MapleClient; import java.io.File; import java.io.FileReader; import java.io.IOException; import java.io.PrintStream; import java.util.HashMap; import java.util.Map; import javax.script.Compilable; import javax.script.CompiledScript; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineFactory; import javax.script.ScriptEngineManager; import server.MaplePortal; import tools.FileoutputUtil; public class PortalScriptManager { private static final PortalScriptManager instance = new PortalScriptManager(); private final Map<String, PortalScript> scripts = new HashMap(); private static final ScriptEngineFactory sef = new ScriptEngineManager().getEngineByName("javascript").getFactory(); public static final PortalScriptManager getInstance() { return instance; } private final PortalScript getPortalScript(String scriptName) { if (this.scripts.containsKey(scriptName)) { return (PortalScript) this.scripts.get(scriptName); } File scriptFile = new File("scripts/portal/" + scriptName + ".js"); if (!scriptFile.exists()) { return null; } FileReader fr = null; ScriptEngine portal = sef.getScriptEngine(); try { fr = new FileReader(scriptFile); CompiledScript compiled = ((Compilable) portal).compile(fr); compiled.eval(); } catch (Exception e) { System.err.println("Error executing Portalscript: " + scriptName + ":" + e); FileoutputUtil.log("Log_Script_Except.txt", "Error executing Portal script. (" + scriptName + ") " + e); } finally { if (fr != null) { try { fr.close(); } catch (IOException e) { System.err.println("ERROR CLOSING" + e); } } } PortalScript script = (PortalScript) ((Invocable) portal).getInterface(PortalScript.class); this.scripts.put(scriptName, script); return script; } public final void executePortalScript(MaplePortal portal, MapleClient c) { PortalScript script = getPortalScript(portal.getScriptName()); if (script != null) { try { script.enter(new PortalPlayerInteraction(c, portal)); } catch (Exception e) { System.err.println("Error entering Portalscript: " + portal.getScriptName() + " : " + e); } } else { System.out.println("Unhandled portal script " + portal.getScriptName() + " on map " + c.getPlayer().getMapId()); FileoutputUtil.log("Log_Script_Except.txt", "Unhandled portal script " + portal.getScriptName() + " on map " + c.getPlayer().getMapId()); } } public final void clearScripts() { this.scripts.clear(); } }