ScriptAPI.java 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. package me.km.snuviscript;
  2. import me.km.KajetansMod;
  3. import me.km.api.Module;
  4. import java.util.Collection;
  5. import java.util.HashMap;
  6. import java.util.HashSet;
  7. import java.util.UUID;
  8. import net.minecraft.command.ICommandSender;
  9. import net.minecraft.entity.Entity;
  10. import net.minecraft.entity.player.EntityPlayer;
  11. import net.minecraft.util.text.TextFormatting;
  12. public class ScriptAPI extends Module
  13. {
  14. private final SnuviParser qparser;
  15. private int idCounter;
  16. private final HashMap<Integer, Script> questData;
  17. private final HashMap<UUID, Integer> playerQuestID;
  18. private final HashMap<Integer, Script> scripts;
  19. private final HashSet<String> scriptCommands;
  20. public ScriptAPI(String mname, String prefix, TextFormatting color)
  21. {
  22. super(mname, prefix, color);
  23. questData = new HashMap<>();
  24. playerQuestID = new HashMap<>();
  25. scripts = new HashMap<>();
  26. idCounter = 0;
  27. qparser = new SnuviParser();
  28. scriptCommands = new HashSet<>();
  29. }
  30. // -------------------------------------------------------------------------
  31. // QuestParser
  32. // -------------------------------------------------------------------------
  33. public SnuviParser getQuestParser()
  34. {
  35. return qparser;
  36. }
  37. // -------------------------------------------------------------------------
  38. // custom commands
  39. // -------------------------------------------------------------------------
  40. public boolean isRegisteredScriptCommand(String s)
  41. {
  42. return scriptCommands.contains(s);
  43. }
  44. public void registerScriptCommand(String s)
  45. {
  46. scriptCommands.add(s);
  47. }
  48. public void unregisterScriptCommand(String s)
  49. {
  50. scriptCommands.remove(s);
  51. }
  52. public void clearScriptCommands()
  53. {
  54. scriptCommands.clear();
  55. }
  56. // -------------------------------------------------------------------------
  57. // Quest - Control
  58. // -------------------------------------------------------------------------
  59. private void addPlayerToQuest(EntityPlayer p, EntityPlayer p2, Script qd)
  60. {
  61. if(hasQuest(p))
  62. {
  63. this.send(p, "Du hast bereits eine Quest.");;
  64. return;
  65. }
  66. if(qd == null)
  67. {
  68. if(p2 != null)
  69. {
  70. this.send(p, p2.getName() + " hat keine aktive Quest.");
  71. }
  72. return;
  73. }
  74. if(qd.getBoolean("no-join"))
  75. {
  76. this.send(p, "Du darfst dieser Quest nicht beitreten.");
  77. return;
  78. }
  79. playerQuestID.put(p.getUniqueID(), qd.getId());
  80. qd.addPlayer(p);
  81. if(!qd.getBoolean("no-quest-msg"))
  82. {
  83. qparser.sendMessageWithSuffix(qd, p.getName() + " ist deiner Quest beigetreten.");
  84. if(p2 != null)
  85. {
  86. this.send(p, "Du bist nun in der Quest von " + p2.getName() + ".");
  87. }
  88. else
  89. {
  90. this.send(p, "Du bist einer bereits laufenden Quest beigetreten.");
  91. }
  92. }
  93. qd.setVar("event", "player-join");
  94. ScriptVars.setPlayerVars(qd, p);
  95. qd.runCode();
  96. }
  97. public void addPlayerToPlayer(EntityPlayer p, EntityPlayer p2)
  98. {
  99. addPlayerToQuest(p, p2, getQuestData(p2));
  100. }
  101. public void addPlayerToQuest(EntityPlayer p, Script qd)
  102. {
  103. addPlayerToQuest(p, null, qd);
  104. }
  105. public Collection<Script> getQuests()
  106. {
  107. return questData.values();
  108. }
  109. public boolean hasQuest(EntityPlayer p)
  110. {
  111. return playerQuestID.containsKey(p.getUniqueID());
  112. }
  113. public Script getQuestData(EntityPlayer p)
  114. {
  115. Integer id = playerQuestID.get(p.getUniqueID());
  116. if(id == null)
  117. {
  118. return null;
  119. }
  120. Script qd = questData.get(id);
  121. if(qd == null)
  122. {
  123. qparser.sendWarningToAllDevs("Die ungültige Quest von '" + p.getName() + "' wurde entfernt.");
  124. return null;
  125. }
  126. return qd;
  127. }
  128. public void removePlayerFromQuest(EntityPlayer p, Script qd)
  129. {
  130. if(qd == null)
  131. {
  132. return;
  133. }
  134. if(qd.removePlayer(p))
  135. {
  136. qd.setIsValid(false);
  137. questData.remove(qd.getId());
  138. }
  139. playerQuestID.remove(p.getUniqueID());
  140. }
  141. public void removeQuests()
  142. {
  143. questData.values().forEach(qd -> qd.setIsValid(false));
  144. questData.clear();
  145. playerQuestID.clear();
  146. }
  147. // -------------------------------------------------------------------------
  148. // Script - Control
  149. // -------------------------------------------------------------------------
  150. public Script getScript(int id)
  151. {
  152. return scripts.get(id);
  153. }
  154. public void removeScripts()
  155. {
  156. scripts.values().forEach(qd -> qd.setIsValid(false));
  157. scripts.clear();
  158. }
  159. public Collection<Script> getScripts()
  160. {
  161. return scripts.values();
  162. }
  163. // -------------------------------------------------------------------------
  164. // Quest / Script - Control
  165. // -------------------------------------------------------------------------
  166. public void add(Script qd, EntityPlayer p)
  167. {
  168. if(p != null)
  169. {
  170. questData.put(idCounter, qd);
  171. playerQuestID.put(p.getUniqueID(), qd.getId());
  172. }
  173. else
  174. {
  175. scripts.put(idCounter, qd);
  176. }
  177. idCounter++;
  178. }
  179. public boolean term(Script qd)
  180. {
  181. if(qd == null)
  182. {
  183. return false;
  184. }
  185. qd.setIsValid(false);
  186. int id = qd.getId();
  187. if(qd.isScript())
  188. {
  189. KajetansMod.scheduler.scheduleTask(() -> scripts.remove(id), 0);
  190. return scripts.containsKey(id);
  191. }
  192. qd.getPlayers().stream().forEach((player) ->
  193. {
  194. playerQuestID.remove(player.getUniqueID());
  195. });
  196. questData.remove(id);
  197. return true;
  198. }
  199. // -----------------------
  200. // Quests / Scripts loading and starting
  201. // -----------------------
  202. public void startQuest(ICommandSender sender, String chosenQuest, EntityPlayer p, Entity executor, String forcedQuest)
  203. {
  204. /*List<String> contents = getQuestCode(sender, chosenQuest, false);
  205. if(contents == null)
  206. {
  207. return;
  208. } */
  209. if(hasQuest(p))
  210. {
  211. this.send(sender, "Du hast bereits eine Quest.");
  212. return;
  213. }
  214. Script other = getQuests().stream()
  215. .filter(qd -> qd.getVar("add-if-name") != null)
  216. .filter(qd -> qd.getVar("add-if-name").equals(chosenQuest))
  217. .findAny().orElse(null);
  218. if(other != null)
  219. {
  220. addPlayerToQuest(p, other);
  221. return;
  222. }
  223. Script qd = new Script(idCounter, p, chosenQuest, sender);
  224. ScriptVars.setPlayerVars(qd, p);
  225. if(executor != null)
  226. {
  227. ScriptVars.setEntityVars(qd, executor);
  228. }
  229. if(forcedQuest != null)
  230. {
  231. qd.setVar("force", forcedQuest);
  232. }
  233. add(qd, p);
  234. qd.runCode();
  235. }
  236. public void startScript(ICommandSender sender, String chosenQuest)
  237. {
  238. /*List<String> contents = getQuestCode(sender, chosenQuest, true);
  239. if(contents == null)
  240. {
  241. return;
  242. } */
  243. Script qd = new Script(idCounter, null, chosenQuest, sender);
  244. add(qd, null);
  245. if(qd.isValid())
  246. {
  247. qd.runCode();
  248. }
  249. }
  250. }