Scripts.java 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package me.km.snuviscript;
  2. import java.util.ArrayList;
  3. import java.util.Arrays;
  4. import java.util.Collections;
  5. import java.util.HashMap;
  6. import java.util.HashSet;
  7. import java.util.List;
  8. import java.util.UUID;
  9. import me.hammerle.snuviscript.code.ISnuviLogger;
  10. import me.hammerle.snuviscript.code.ISnuviScheduler;
  11. import me.hammerle.snuviscript.code.Script;
  12. import me.hammerle.snuviscript.code.ScriptManager;
  13. import me.km.events.CustomEventCaller;
  14. import net.minecraft.entity.player.PlayerEntity;
  15. public class Scripts {
  16. private final ScriptManager manager;
  17. private final ISnuviLogger logger;
  18. private CustomEventCaller cec = null;
  19. private final HashMap<UUID, Integer> playerScript = new HashMap<>();
  20. private final HashMap<Integer, List<UUID>> registeredPlayers = new HashMap<>();
  21. private final HashSet<String> scriptCommands = new HashSet<>();
  22. public Scripts(ISnuviLogger logger, ISnuviScheduler scheduler) {
  23. this.logger = logger;
  24. manager = new ScriptManager(logger, scheduler);
  25. }
  26. public void setCustomEventCaller(CustomEventCaller cec) {
  27. this.cec = cec;
  28. }
  29. public ScriptManager getScriptManager() {
  30. return manager;
  31. }
  32. public ISnuviLogger getLogger() {
  33. return logger;
  34. }
  35. // -------------------------------------------------------------------------
  36. // custom commands
  37. // -------------------------------------------------------------------------
  38. public boolean isRegisteredScriptCommand(String s) {
  39. return scriptCommands.contains(s);
  40. }
  41. public void registerScriptCommand(String s) {
  42. if(s.equals("script")) {
  43. return;
  44. }
  45. scriptCommands.add(s);
  46. }
  47. public void unregisterScriptCommand(String s) {
  48. scriptCommands.remove(s);
  49. }
  50. public void clearScriptCommands() {
  51. scriptCommands.clear();
  52. }
  53. // -------------------------------------------------------------------------
  54. // player script
  55. // -------------------------------------------------------------------------
  56. public List<UUID> getPlayerList(int id) {
  57. return registeredPlayers.getOrDefault(id, Collections.EMPTY_LIST);
  58. }
  59. private List<UUID> getOrCreatePlayerList(int id) {
  60. List<UUID> list = registeredPlayers.get(id);
  61. if(list == null) {
  62. list = new ArrayList<>();
  63. registeredPlayers.put(id, list);
  64. }
  65. return list;
  66. }
  67. public boolean registerPlayer(Script sc, PlayerEntity p) {
  68. if(playerScript.putIfAbsent(p.getUniqueID(), sc.getId()) != null) {
  69. return false;
  70. }
  71. getOrCreatePlayerList(sc.getId()).add(p.getUniqueID());
  72. ScriptVars.setPlayerVars(sc, p);
  73. manager.callEvent("player_join", sc, null, null);
  74. return true;
  75. }
  76. public boolean isRegistered(PlayerEntity p) {
  77. return playerScript.containsKey(p.getUniqueID());
  78. }
  79. public Script getScript(PlayerEntity p) {
  80. // check if the player is mapped to a script
  81. Integer id = playerScript.get(p.getUniqueID());
  82. if(id == null) {
  83. return null;
  84. }
  85. // player mapping does not necessary mean the script is valid
  86. Script sc = manager.getScript(id);
  87. if(sc == null) {
  88. playerScript.remove(p.getUniqueID());
  89. logger.print(String.format("invalid script of '%s' was removed. (1)", p.getName()));
  90. return null;
  91. }
  92. return sc;
  93. }
  94. public boolean unregisterPlayer(Script callingScript, PlayerEntity p) {
  95. Integer id = playerScript.remove(p.getUniqueID());
  96. if(id == null) {
  97. return false;
  98. }
  99. List<UUID> list = registeredPlayers.get(id);
  100. if(list == null) {
  101. return false;
  102. }
  103. boolean b = list.remove(p.getUniqueID());
  104. if(list.isEmpty()) {
  105. Script sc = manager.getScript(id);
  106. if(sc == null) {
  107. logger.print(String.format("invalid script of '%s' was removed. (2)", p.getName()));
  108. return true;
  109. }
  110. if(sc != callingScript) {
  111. manager.callEvent("player_kicked", sc, (innerSc) -> ScriptVars.setPlayerVars(innerSc, p), null);
  112. }
  113. manager.removeScriptSafe(sc);
  114. }
  115. return b;
  116. }
  117. public void clearPlayerRegistry() {
  118. playerScript.clear();
  119. registeredPlayers.clear();
  120. }
  121. // -------------------------------------------------------------------------
  122. // script starting
  123. // -------------------------------------------------------------------------
  124. public boolean startPlayerScript(PlayerEntity p, String... names) {
  125. if(isRegistered(p)) {
  126. return false;
  127. }
  128. Arrays.setAll(names, i -> "scripts/" + names[i] + ".txt");
  129. manager.startScript(false, sc -> {
  130. int id = sc.getId();
  131. playerScript.put(p.getUniqueID(), id);
  132. getOrCreatePlayerList(id).add(p.getUniqueID());
  133. }, sc -> {
  134. getPlayerList(sc.getId()).forEach(uuid -> playerScript.remove(uuid));
  135. registeredPlayers.remove(sc.getId());
  136. cec.removeScriptData(sc);
  137. }, names[0], names);
  138. return true;
  139. }
  140. public void startScript(String... names) {
  141. Arrays.setAll(names, i -> "scripts/" + names[i] + ".txt");
  142. manager.startScript(true, sc -> {
  143. }, sc -> cec.removeScriptData(sc), names[0], names);
  144. }
  145. }