NPCScriptManager.java
上传用户:gwt600
上传日期:2021-06-03
资源大小:704k
文件大小:7k
源码类别:

游戏

开发平台:

Java

  1. /*
  2. This file is part of the OdinMS Maple Story Server
  3. Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc>
  4. Matthias Butz <matze@odinms.de>
  5. Jan Christian Meyer <vimes@odinms.de>
  6. This program is free software: you can redistribute it and/or modify
  7. it under the terms of the GNU Affero General Public License version 3
  8. as published by the Free Software Foundation. You may not use, modify
  9. or distribute this program under any other version of the
  10. GNU Affero General Public License.
  11. This program is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. GNU Affero General Public License for more details.
  15. You should have received a copy of the GNU Affero General Public License
  16. along with this program.  If not, see <http://www.gnu.org/licenses/>.
  17.  */
  18. package net.sf.odinms.scripting.npc;
  19. import java.util.ArrayList;
  20. import java.util.HashMap;
  21. import java.util.List;
  22. import java.util.Map;
  23. import javax.script.Invocable;
  24. import net.sf.odinms.client.MapleClient;
  25. import net.sf.odinms.client.MapleCharacter;
  26. import net.sf.odinms.scripting.AbstractScriptManager;
  27. import net.sf.odinms.tools.Pair;
  28. /**
  29.  *
  30.  * @author Matze
  31.  */
  32. public class NPCScriptManager extends AbstractScriptManager {
  33.     private Map<MapleClient, NPCConversationManager> cms = new HashMap<MapleClient, NPCConversationManager>();
  34.     private Map<MapleClient, NPCScript> scripts = new HashMap<MapleClient, NPCScript>();
  35.     private static NPCScriptManager instance = new NPCScriptManager();
  36.     public synchronized static NPCScriptManager getInstance() {
  37.         return instance;
  38.     }
  39.      public void start(MapleClient c, int i,String npc) {
  40. try {
  41. if (cms.containsKey(c)) {
  42. return;
  43.                         } else {
  44.                         }
  45. } catch (Exception e) {
  46. System.err.println("NPC脚本发生错误.请检查NPC编号:(" + npc + ")的JS.");
  47. dispose(c);
  48. cms.remove(c);
  49. }
  50. }
  51.     public void start(MapleClient c, int npc) {
  52.         start(c, npc, null, null);
  53.     }
  54.     public void start(MapleClient c, int npc, String filename, MapleCharacter chr) {
  55. try {
  56. NPCConversationManager cm = new NPCConversationManager(c, npc, chr);
  57. if (cms.containsKey(c)) {
  58. return;
  59. }
  60. cms.put(c, cm);
  61. Invocable iv = getInvocable("npc/" + npc + ".js", c);
  62.                         NPCScriptManager npcsm = NPCScriptManager.getInstance();
  63. if (filename != null) {
  64. iv = getInvocable("npc/" + filename + ".js", c);
  65. }
  66.                         if (iv == null || npcsm == null || NPCScriptManager.getInstance() == null) {
  67.                             cm.sendSimple("5555,我无法为你服务哦,我编号: (" + npc + ")快去加脚本吧 ");
  68.                             cm.dispose();
  69.                             return;
  70.                         }
  71. engine.put("cm", cm);
  72. NPCScript ns = iv.getInterface(NPCScript.class);
  73. scripts.put(c, ns);
  74. if (chr != null) {
  75. ns.start(chr);
  76. } else {
  77. ns.start();
  78.                         }
  79. } catch (Exception e) {
  80. System.err.println("NPC脚本发生错误.请检查NPC编号:(" + npc + ")的JS.");
  81. dispose(c);
  82. cms.remove(c);
  83. }
  84. }
  85.      public void start(MapleClient c, String filename, int npc, MapleCharacter cha) {
  86. try {
  87. NPCConversationManager cm = new NPCConversationManager(c, npc, cha);
  88. if (cms.containsKey(c)) {
  89. return;
  90. }
  91. cms.put(c, cm);
  92. Invocable iv = getInvocable("npc/" + filename + ".js", c);
  93. if (iv == null || NPCScriptManager.getInstance() == null) {
  94. cm.dispose();
  95. return;
  96. }
  97. engine.put("cm", cm);
  98. NPCScript ns = iv.getInterface(NPCScript.class);
  99. scripts.put(c, ns);
  100. ns.start(cha);
  101. } catch (Exception e) {
  102. System.err.println("NPC脚本发生错误.请检查NPC编号:(" + npc + ")的JS.");
  103. dispose(c);
  104. cms.remove(c);
  105. }
  106. }
  107.          public void action(MapleClient c, byte mode, byte type, int selection) {
  108. NPCScript ns = scripts.get(c);
  109. if (ns != null) {
  110. try {
  111. ns.action(mode, type, selection);
  112. } catch (Exception e) {
  113. System.err.println("执行NPC脚本过程中发生错误.请检查NPC文件.");
  114. dispose(c);
  115. }
  116. }
  117. }
  118.     public void action(MapleClient c, byte mode, byte type, int selection, int npc ) {
  119.         NPCScript ns = scripts.get(c);
  120.         if (ns != null) {
  121.             try {
  122.                 ns.action(mode, type, selection);
  123.             } catch (Exception e) {
  124.                 System.err.println("NPC脚本发生错误.请检查NPC编号:(" + npc + ")的JS.");
  125.                 dispose(c);
  126.             }
  127.         }
  128.     }
  129.     public void dispose(NPCConversationManager cm) {
  130.         cms.remove(cm.getC());
  131.         scripts.remove(cm.getC());
  132.         if (cm.getFileName() != null) {
  133.             resetContext("npc/" + cm.getFileName() + ".js", cm.getC());
  134.         } else {
  135.             resetContext("npc/" + cm.getNpc() + ".js", cm.getC());
  136.         }
  137.     }
  138.     public void dispose(MapleClient c) {
  139.         NPCConversationManager npccm = cms.get(c);
  140.         if (npccm != null) {
  141.             dispose(npccm);
  142.         }
  143.     }
  144.     public NPCConversationManager getCM(MapleClient c) {
  145.         return cms.get(c);
  146.     }
  147.     private Map<Pair<Integer, Integer>, Integer> npcTalk = new HashMap<Pair<Integer, Integer>, Integer>();
  148.     public int getNpcTalkTimes(int chrid, int npc) {
  149.         Pair<Integer, Integer> pplayer = new Pair<Integer, Integer>(chrid, npc); // first time <3 looks wrong.
  150.         if (!npcTalk.containsKey(pplayer)) {
  151.             npcTalk.put(pplayer, 0);
  152.         }
  153.         return npcTalk.get(pplayer);
  154.     }
  155.     public void addNpcTalkTimes(int chrid, int npc) {
  156.         Pair<Integer, Integer> pplayer = new Pair<Integer, Integer>(chrid, npc);
  157.         if (!npcTalk.containsKey(pplayer)) {
  158.             npcTalk.put(pplayer, 0);
  159.         }
  160.         int talk = 1 + npcTalk.get(pplayer);
  161.         npcTalk.remove(pplayer);
  162.         npcTalk.put(pplayer, talk);
  163.     }
  164.     public void setNpcTalkTimes(int chrid, int npc, int amount) {
  165.         Pair<Integer, Integer> pplayer = new Pair<Integer, Integer>(chrid, npc);
  166.         if (!npcTalk.containsKey(pplayer)) {
  167.             npcTalk.put(pplayer, 0);
  168.         }
  169.         npcTalk.remove(pplayer);
  170.         npcTalk.put(pplayer, amount);
  171.     }
  172.     public List<Integer> listTalkedNpcsByID(int chrid) {
  173.         List<Integer> npcs = new ArrayList<Integer>();
  174.         for (Pair<Integer, Integer> rawr : npcTalk.keySet()) {
  175.             if (rawr.getLeft().equals(chrid)) {
  176.                 npcs.add(rawr.getRight());
  177.             }
  178.         }
  179.         return npcs;
  180.     }
  181.     public List<Integer> listAllTalkedNpcs() {
  182.         List<Integer> npcs = new ArrayList<Integer>();
  183.         for (Pair<Integer, Integer> rawr : npcTalk.keySet()) {
  184.             npcs.add(rawr.getRight());
  185.         }
  186.         return npcs;
  187.     }
  188.     public int talkedTimesByNpc(int npc) {
  189.         int i = 0;
  190.         for (Pair<Integer, Integer> rawr : npcTalk.keySet()) {
  191.             if (rawr.getRight().equals(npc)) {
  192.                 i += npcTalk.get(rawr);
  193.             }
  194.         }
  195.         return i;
  196.     }
  197. }