package scripting.portal;
import client.MapleClient;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
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.EncodingDetect;
import tools.FileoutputUtil;
import tools.packet.NPCPacket;
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 PortalScript getPortalScript(String scriptName) {
if (this.scripts.containsKey(scriptName)) {
return this.scripts.get(scriptName);
}
File scriptFile = new File("脚本/传送点/" + scriptName + ".js");
if (!scriptFile.exists()) {
return null;
}
InputStream fr = null;
ScriptEngine portal = sef.getScriptEngine();
try {
fr = new FileInputStream(scriptFile);
BufferedReader bf = new BufferedReader(new InputStreamReader(fr, EncodingDetect.getJavaEncode(scriptFile)));
CompiledScript compiled = ((Compilable) portal).compile(bf);
compiled.eval();
} catch (Exception e) {
System.err.println("请检查传送点脚本名为:(" + scriptName + ".js)的文件." + e);
FileoutputUtil.log(FileoutputUtil.Portal_ScriptEx_Log, "请检查传送点脚本名为:(" + scriptName + ".js)的文件. " + e);
} finally {
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
System.err.println("ERROR CLOSING" + e);
}
}
}
PortalScript script = ((Invocable) portal).getInterface(PortalScript.class);
this.scripts.put(scriptName, script);
return script;
}
public void executePortalScript(MaplePortal portal, MapleClient c) {
PortalScript script = getPortalScript(portal.getScriptName());
boolean err = false;
if (script != null) {
try {
script.enter(new PortalPlayerInteraction(c, portal));
if (c.getPlayer().isShowPacket()) {
c.getPlayer().dropMessage(5, "执行传送点脚本名为:(" + portal.getScriptName() + ".js)的文件 在地图 " + c.getPlayer().getMapId() + " - " + c.getPlayer().getMap().getMapName());
}
} catch (Exception e) {
err = true;
if (c.getPlayer().isShowPacket()) {
c.getPlayer().dropMessage(5, "执行地图脚本过程中发生错误.请检查传送点脚本名为:( " + portal.getScriptName() + ".js)的文件,错误信息:" + e);
}
FileoutputUtil.log(FileoutputUtil.Portal_ScriptEx_Log, "执行地图脚本过程中发生错误.请检查传送点脚本名为:( " + portal.getScriptName() + ".js)的文件.\r\n错误信息:" + e);
}
} else {
err = true;
if (c.getPlayer().isShowPacket()) {
c.getPlayer().dropMessage(5, "未找到传送点脚本名为:(" + portal.getScriptName() + ".js)的文件 在地图 " + c.getPlayer().getMapId() + " - " + c.getPlayer().getMap().getMapName());
}
FileoutputUtil.log(FileoutputUtil.Portal_ScriptEx_Log, "执行地图脚本过程中发生错误.未找到传送点脚本名为:(" + portal.getScriptName() + ".js)的文件 在地图 " + c.getPlayer().getMapId() + " - " + c.getPlayer().getMap().getMapName());
}
if (err) {
c.getPlayer().卡图 = c.getPlayer().getMapId();
c.getSession().write(NPCPacket.sendNPCSay(9010000, "你好像被卡在了奇怪的地方,这里有个东西未处理,请联系管理员反馈信息:" + portal.getScriptName() + "\r\n你现在可以点击 拍卖 或者输入 @卡图 来移动到射手村。"));
}
}
public void clearScripts() {
this.scripts.clear();
}
}