Scripts.java 5.5 KB

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