package scripting.map;
import client.MapleClient;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
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 javax.script.ScriptException;
import tools.EncodingDetect;
import tools.FileoutputUtil;
public class MapScriptManager {
private static final MapScriptManager instance = new MapScriptManager();
private final Map<String, MapScript> scripts = new HashMap();
private static final ScriptEngineFactory sef = new ScriptEngineManager().getEngineByName("javascript").getFactory();
public static final MapScriptManager getInstance() {
return instance;
}
public void getMapScript(MapleClient c, String scriptName, boolean firstUser) {
if (this.scripts.containsKey(scriptName)) {
((MapScript) this.scripts.get(scriptName)).start(new MapScriptMethods(c));
return;
}
String type = "onUserEnter/";
if (firstUser) {
type = "onFirstUserEnter/";
}
File scriptFile = new File("脚本/地图/" + type + scriptName + ".js");
if (!scriptFile.exists()) {
if (c.getPlayer().isShowPacket()) {
c.getPlayer().dropMessage(5, "地图触发: 未找到 地图/" + type + " 文件中的 " + scriptName + ".js 文件.");
}
FileoutputUtil.log(FileoutputUtil.Map_ScriptEx_Log, "地图触发: 未找到 地图/" + type + " 文件中的 " + scriptName + ".js 文件. 在地图 " + c.getPlayer().getMapId() + " - " + c.getPlayer().getMap().getMapName());
return;
}
BufferedReader bf = null;
ScriptEngine map = sef.getScriptEngine();
try {
InputStream in = new FileInputStream(scriptFile);
bf = new BufferedReader(new InputStreamReader(in, EncodingDetect.getJavaEncode(scriptFile)));
CompiledScript compiled = ((Compilable) map).compile(bf);
compiled.eval();
} catch (FileNotFoundException | ScriptException | UnsupportedEncodingException e) {
System.err.println("请检查(地图/" + type + " 文件中的 " + scriptName + ".js)的文件." + e);
FileoutputUtil.log(FileoutputUtil.Map_ScriptEx_Log, "请检查(地图/" + type + " 文件中的 " + scriptName + ".js)的文件." + e);
} finally {
if (bf != null) {
try {
bf.close();
} catch (IOException e) {
System.err.println("ERROR CLOSING" + e);
}
}
}
if (c.getPlayer().isShowPacket()) {
c.getPlayer().dropMessage(5, "开始执行地图触发: 地图/" + type + " 文件中的 " + scriptName + ".js 文件.");
}
MapScript script = (MapScript) ((Invocable) map).getInterface(MapScript.class);
this.scripts.put(scriptName, script);
script.start(new MapScriptMethods(c));
}
public void clearScripts() {
this.scripts.clear();
}
}