ScriptModule.java 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. package me.km.snuviscript;
  2. import me.km.KajetansMod;
  3. import me.km.api.Module;
  4. import java.util.HashMap;
  5. import java.util.HashSet;
  6. import java.util.UUID;
  7. import me.hammerle.code.SnuviParser;
  8. import me.hammerle.code.ScriptUtils;
  9. import me.hammerle.exceptions.PreScriptException;
  10. import net.minecraft.command.ICommandSender;
  11. import net.minecraft.entity.player.EntityPlayer;
  12. import net.minecraft.util.text.TextFormatting;
  13. public class ScriptModule extends Module
  14. {
  15. private final SnuviParser parser;
  16. protected final MinecraftFunctions logger;
  17. private final HashMap<UUID, Integer> playerScript;
  18. private final HashSet<String> scriptCommands;
  19. public ScriptModule(String mname, String prefix, TextFormatting color)
  20. {
  21. super(mname, prefix, color);
  22. logger = new MinecraftFunctions();
  23. parser = new SnuviParser(logger, KajetansMod.scheduler);
  24. MinecraftFunctions.registerFunctions(parser);
  25. playerScript = new HashMap<>();
  26. scriptCommands = new HashSet<>();
  27. }
  28. public SnuviParser getSnuviParser()
  29. {
  30. return parser;
  31. }
  32. // -------------------------------------------------------------------------
  33. // custom commands
  34. // -------------------------------------------------------------------------
  35. public boolean isRegisteredScriptCommand(String s)
  36. {
  37. return scriptCommands.contains(s);
  38. }
  39. public void registerScriptCommand(String s)
  40. {
  41. scriptCommands.add(s);
  42. }
  43. public void unregisterScriptCommand(String s)
  44. {
  45. scriptCommands.remove(s);
  46. }
  47. public void clearScriptCommands()
  48. {
  49. scriptCommands.clear();
  50. }
  51. // -------------------------------------------------------------------------
  52. // Quest - Control
  53. // -------------------------------------------------------------------------
  54. private void addPlayerToScript(EntityPlayer p, EntityPlayer p2, PlayerScript qd)
  55. {
  56. if(hasScript(p))
  57. {
  58. this.send(p, "Du hast bereits eine Quest.");
  59. return;
  60. }
  61. if(qd == null)
  62. {
  63. if(p2 != null)
  64. {
  65. this.send(p, p2.getName() + " hat keine aktive Quest.");
  66. }
  67. return;
  68. }
  69. if(qd.getBooleanVar("no_join"))
  70. {
  71. this.send(p, "Du darfst dieser Quest nicht beitreten.");
  72. return;
  73. }
  74. playerScript.put(p.getUniqueID(), qd.getId());
  75. qd.addPlayer(p);
  76. if(!qd.getBooleanVar("no_quest_msg"))
  77. {
  78. MinecraftFunctions.sendMessageWithSuffix(qd, p.getName() + " ist deiner Quest beigetreten.");
  79. if(p2 != null)
  80. {
  81. this.send(p, "Du bist nun in der Quest von " + p2.getName() + ".");
  82. }
  83. else
  84. {
  85. this.send(p, "Du bist einer bereits laufenden Quest beigetreten.");
  86. }
  87. }
  88. qd.setVar("event", "player_join");
  89. ScriptVars.setPlayerVars(qd, p);
  90. qd.runCode();
  91. }
  92. public void addPlayerToPlayer(EntityPlayer p, EntityPlayer p2)
  93. {
  94. addPlayerToScript(p, p2, getScript(p2));
  95. }
  96. public void addPlayerToQuest(EntityPlayer p, PlayerScript qd)
  97. {
  98. addPlayerToScript(p, null, qd);
  99. }
  100. public boolean hasScript(EntityPlayer p)
  101. {
  102. return playerScript.containsKey(p.getUniqueID());
  103. }
  104. public PlayerScript getScript(EntityPlayer p)
  105. {
  106. Integer id = playerScript.get(p.getUniqueID());
  107. if(id == null)
  108. {
  109. return null;
  110. }
  111. try
  112. {
  113. PlayerScript qd = (PlayerScript) parser.getScript(id);
  114. if(qd == null)
  115. {
  116. playerScript.remove(p.getUniqueID());
  117. MinecraftFunctions.sendWarningToAllDevs("Die ungültige Quest von '" + p.getName() + "' wurde entfernt.");
  118. return null;
  119. }
  120. return qd;
  121. }
  122. catch(ClassCastException ex)
  123. {
  124. return null;
  125. }
  126. }
  127. public void removePlayerFromScript(EntityPlayer p, PlayerScript qd)
  128. {
  129. if(qd == null)
  130. {
  131. return;
  132. }
  133. if(qd.isValid() && qd.removePlayer(p))
  134. {
  135. parser.termSafe(qd);
  136. }
  137. playerScript.remove(p.getUniqueID());
  138. }
  139. public boolean isActive(String name)
  140. {
  141. return parser.getScripts().stream().anyMatch(sc -> sc.getName().equals(name));
  142. }
  143. // -----------------------
  144. // Quests / Scripts loading and starting
  145. // -----------------------
  146. public void startQuest(ICommandSender sender, String name, EntityPlayer p)
  147. {
  148. if(hasScript(p))
  149. {
  150. this.send(sender, "Du hast bereits eine Quest.");
  151. return;
  152. }
  153. PlayerScript other = (PlayerScript) parser.getScripts().stream()
  154. .filter(qd -> qd.getClass() == PlayerScript.class)
  155. .filter(qd -> qd.getVar("add_if_name") != null)
  156. .filter(qd -> qd.getVar("add_if_name").equals(name))
  157. .findAny().orElse(null);
  158. if(other != null)
  159. {
  160. addPlayerToQuest(p, other);
  161. return;
  162. }
  163. PlayerScript ps = parser.startScript(PlayerScript.class, name, ScriptUtils.readCode("scripts/" + name, ".txt"), false, p);
  164. playerScript.put(p.getUniqueID(), ps.getId());
  165. }
  166. public void startScript(ICommandSender sender, String name)
  167. {
  168. try
  169. {
  170. parser.startScript(MinecraftScript.class, name, ScriptUtils.readCode("scripts/" + name, ".txt"), true);
  171. }
  172. catch(PreScriptException ex)
  173. {
  174. logger.printException(ex, null, name, ex.getLine());
  175. }
  176. }
  177. }