package scripting.item;
import client.MapleClient;
import client.inventory.Item;
import java.util.Map;
import java.util.WeakHashMap;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import scripting.AbstractScriptManager;
import tools.FileoutputUtil;
public class ItemScriptManager extends AbstractScriptManager {
private static final ItemScriptManager instance = new ItemScriptManager();
private final Map<MapleClient, ItemActionManager> ims = new WeakHashMap();
public static final ItemScriptManager getInstance() {
return instance;
}
public void start(MapleClient c, int npc, Item item) {
try {
if (this.ims.containsKey(c)) {
dispose(c);
return;
}
if (c.getPlayer().isShowPacket()) {
c.getPlayer().dropMessage(5, "开始道具脚本 NPC:" + npc + " 道具Id:" + item.getItemId());
}
Invocable iv = getInvocable("道具/" + item.getItemId() + ".js", c, true);
ScriptEngine scriptengine = (ScriptEngine) iv;
ItemActionManager im = new ItemActionManager(c, npc, item, iv);
if (iv == null) {
im.sendOk("对不起,我并没有被管理员设置可使用,如果您觉得我应该工作的,那就请您汇报给管理员。\r\n我的信息: #b#i" + item.getItemId() + ":##z" + item.getItemId() + "##k ID: " + item.getItemId());
dispose(c);
return;
}
this.ims.put(c, im);
scriptengine.put("im", im);
c.getPlayer().setConversation(1);
c.setClickedNPC();
try {
iv.invokeFunction("start", new Object[0]);
} catch (NoSuchMethodException nsme) {
iv.invokeFunction("action", new Object[]{(byte) 1, (byte) 0, (int) (byte) 0});
}
} catch (ScriptException | NoSuchMethodException e) {
System.err.println("执行道具脚本失败 道具ID: (" + item.getItemId() + ")..NPCID: " + npc + ":" + e);
FileoutputUtil.log(FileoutputUtil.Item_ScriptEx_Log, "执行道具脚本失败 道具ID: (" + item.getItemId() + ")..NPCID: " + npc + ". \r\n错误信息: " + e);
dispose(c);
notice(c, item.getItemId());
}
}
public void action(MapleClient c, byte mode, byte type, int selection) {
if (mode != -1) {
ItemActionManager im = (ItemActionManager) this.ims.get(c);
if (im == null) {
return;
}
try {
if (im.pendingDisposal) {
dispose(c);
} else {
c.setClickedNPC();
im.getIv().invokeFunction("action", new Object[]{mode, type, selection});
}
} catch (ScriptException | NoSuchMethodException e) {
int npcId = im.getNpc();
int itemId = im.getItemId();
System.err.println("执行NPC脚本出错 NPC ID : " + npcId + " 道具ID: " + itemId + " 错误信息: " + e);
FileoutputUtil.log(FileoutputUtil.Item_ScriptEx_Log, "执行NPC脚本出错 NPC ID : " + npcId + " 道具ID: " + itemId + ". \r\n错误信息: " + e);
dispose(c);
notice(c, itemId);
}
}
}
public void dispose(MapleClient c) {
ItemActionManager im = (ItemActionManager) this.ims.get(c);
if (im != null) {
this.ims.remove(c);
c.removeScriptEngine("脚本/道具/" + im.getItemId() + ".js");
}
if ((c.getPlayer() != null) && (c.getPlayer().getConversation() == 1)) {
c.getPlayer().setConversation(0);
}
}
public void dispose(ItemActionManager im, MapleClient c) {
if (im != null) {
this.ims.remove(c);
c.removeScriptEngine("脚本/道具/" + im.getItemId() + ".js");
}
if ((c.getPlayer() != null) && (c.getPlayer().getConversation() == 1)) {
c.getPlayer().setConversation(0);
}
}
public ItemActionManager getIM(MapleClient c) {
return (ItemActionManager) this.ims.get(c);
}
private void notice(MapleClient c, int itemId) {
c.getPlayer().dropMessage(1, "这个道具脚本是错误的,请联系管理员修复它.道具ID: " + itemId);
}
}