package scripting.quest;
import client.MapleClient;
import java.util.Map;
import java.util.WeakHashMap;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptException;
import scripting.AbstractScriptManager;
import scripting.ScriptType;
import server.quest.MapleQuest;
import tools.FileoutputUtil;
public class QuestScriptManager extends AbstractScriptManager {
private static final QuestScriptManager instance = new QuestScriptManager();
private final Map<MapleClient, QuestActionManager> qms = new WeakHashMap();
public static final QuestScriptManager getInstance() {
return instance;
}
public void startQuest(MapleClient c, int npcId, int questId) {
try {
if (this.qms.containsKey(c)) {
FileoutputUtil.log("脚本任务挂了!!!!");
dispose(c);
return;
}
Invocable iv = getInvocable("任务/" + questId + ".js", c, true);
FileoutputUtil.log("读取脚本任务完成!!!");
if (iv == null) {
//c.getPlayer().forceCompleteQuest(questId);
if (c.getPlayer().isShowPacket()) {
c.getPlayer().dropMessage(5, "开始任务脚本不存在 NPC:" + npcId + " Quest:" + questId);
}
dispose(c);
FileoutputUtil.log(FileoutputUtil.Quest_ScriptEx_Log, "开始任务脚本不存在 NPC:" + npcId + " Quest:" + questId);
return;
}
if (c.getPlayer().isShowPacket()) {
c.getPlayer().dropMessage(5, "开始脚本任务 NPC:" + npcId + " Quest:" + questId);
}
ScriptEngine scriptengine = (ScriptEngine) iv;
QuestActionManager qm = new QuestActionManager(c, npcId, questId, true, ScriptType.QUEST_START, iv);
this.qms.put(c, qm);
scriptengine.put("qm", qm);
c.getPlayer().setConversation(1);
c.setClickedNPC();
iv.invokeFunction("start", new Object[]{(byte) 1, (byte) 0, (int) (byte) 0});
} catch (ScriptException | NoSuchMethodException e) {
System.err.println("执行任务脚本失败 任务ID: (" + questId + ")..NPCID: " + npcId + ":" + e);
FileoutputUtil.log(FileoutputUtil.Quest_ScriptEx_Log, "执行任务脚本失败 任务ID: (" + questId + ")..NPCID: " + npcId + ". \r\n错误信息: " + e);
dispose(c);
notice(c, questId);
}
}
public void startAction(MapleClient c, byte mode, byte type, int selection) {
QuestActionManager qm = (QuestActionManager) this.qms.get(c);
if (qm == null) {
return;
}
try {
if (qm.pendingDisposal) {
dispose(c);
} else {
c.setClickedNPC();
qm.getIv().invokeFunction("start", new Object[]{mode, type, selection});
}
} catch (ScriptException | NoSuchMethodException e) {
int npcId = qm.getNpc();
int questId = qm.getQuest();
System.err.println("执行任务脚本失败 任务ID: (" + questId + ")...NPC: " + npcId + ":" + e);
FileoutputUtil.log(FileoutputUtil.Quest_ScriptEx_Log, "执行任务脚本失败 任务ID: (" + questId + ")..NPCID: " + npcId + ". \r\n错误信息: " + e);
dispose(c);
notice(c, questId);
}
}
public void endQuest(MapleClient c, int npcId, int questId, boolean customEnd) {
if ((!customEnd) && (!MapleQuest.getInstance(questId).canComplete(c.getPlayer()))) {
if (c.getPlayer().isShowPacket()) {
c.getPlayer().dropMessage(6, "不能完成这个任务 NPC:" + npcId + " Quest:" + questId);
}
return;
}
try {
if ((!this.qms.containsKey(c)) && (c.canClickNPC())) {
Invocable iv = getInvocable("任务/" + questId + ".js", c, true);
if (iv == null) {
//c.getPlayer().forceCompleteQuest(questId);
// if (c.getPlayer().isAdmin()) {
// c.getPlayer().dropMessage(5, "完成任务脚本不存在 NPC:" + npcId + " Quest:" + questId);
// }
dispose(c);
FileoutputUtil.log(FileoutputUtil.Quest_ScriptEx_Log, "完成任务脚本不存在 NPC:" + npcId + " Quest:" + questId);
return;
}
// if (c.getPlayer().isAdmin()) {
// c.getPlayer().dropMessage(5, "完成脚本任务 NPC:" + npcId + " Quest:" + questId);
// }
ScriptEngine scriptengine = (ScriptEngine) iv;
QuestActionManager qm = new QuestActionManager(c, npcId, questId, false, ScriptType.QUEST_END, iv);
this.qms.put(c, qm);
scriptengine.put("qm", qm);
c.getPlayer().setConversation(1);
c.setClickedNPC();
iv.invokeFunction("end", new Object[]{(byte) 1, (byte) 0, (int) (byte) 0});
} else {
dispose(c);
}
} catch (ScriptException | NoSuchMethodException e) {
System.err.println("执行任务脚本失败 任务ID: (" + questId + ")..NPCID: " + npcId + ":" + e);
FileoutputUtil.log(FileoutputUtil.Quest_ScriptEx_Log, "执行任务脚本失败 任务ID: (" + questId + ")..NPCID: " + npcId + ". \r\n错误信息: " + e);
dispose(c);
notice(c, questId);
}
}
public void endAction(MapleClient c, byte mode, byte type, int selection) {
QuestActionManager qm = (QuestActionManager) this.qms.get(c);
if (qm == null) {
return;
}
try {
if (qm.pendingDisposal) {
dispose(c);
} else {
c.setClickedNPC();
qm.getIv().invokeFunction("end", new Object[]{mode, type, selection});
}
} catch (ScriptException | NoSuchMethodException e) {
int npcId = qm.getNpc();
int questId = qm.getQuest();
System.err.println("完成任务脚本失败 任务ID (" + questId + ")...NPC: " + npcId + ":" + e);
FileoutputUtil.log(FileoutputUtil.Quest_ScriptEx_Log, "完成任务脚本失败 任务ID (" + questId + ")..NPCID: " + npcId + ". \r\n错误信息: " + e);
dispose(c);
notice(c, questId);
}
}
public void dispose(MapleClient c) {
QuestActionManager qm = (QuestActionManager) this.qms.get(c);
if (qm != null) {
this.qms.remove(c);
c.removeScriptEngine("脚本/任务/" + qm.getQuest() + ".js");
}
if ((c.getPlayer() != null) && (c.getPlayer().getConversation() == 1)) {
c.getPlayer().setConversation(0);
}
}
public void dispose(QuestActionManager qm, MapleClient c) {
if (qm != null) {
this.qms.remove(c);
c.removeScriptEngine("脚本/任务/" + qm.getQuest() + ".js");
}
if ((c.getPlayer() != null) && (c.getPlayer().getConversation() == 1)) {
c.getPlayer().setConversation(0);
}
}
public QuestActionManager getQM(MapleClient c) {
return (QuestActionManager) this.qms.get(c);
}
private void notice(MapleClient c, int questId) {
c.getPlayer().dropMessage(1, "这个任务脚本是错误的,请联系管理员修复它.任务ID: " + questId);
}
}