ScriptAPI.java 7.0 KB

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