CommandBlock.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. package me.km.blockprotections;
  2. import com.mojang.authlib.GameProfile;
  3. import java.util.ArrayList;
  4. import java.util.List;
  5. import me.km.KajetansMod;
  6. import me.km.api.GlobalText;
  7. import me.km.api.Module;
  8. import me.km.api.ModuleCommand;
  9. import me.km.api.Utils;
  10. import me.km.permissions.Permissions;
  11. import me.km.scheduler.SnuviScheduler;
  12. import net.minecraft.block.Block;
  13. import net.minecraft.block.BlockDoor;
  14. import net.minecraft.block.state.IBlockState;
  15. import net.minecraft.command.ICommandSender;
  16. import net.minecraft.entity.player.EntityPlayerMP;
  17. import net.minecraft.init.Blocks;
  18. import net.minecraft.util.math.BlockPos;
  19. import net.minecraft.world.World;
  20. public class CommandBlock extends ModuleCommand
  21. {
  22. private final BlockProtectionBank bank;
  23. private int counter;
  24. private int index;
  25. private List<BlockPos> locs;
  26. private final ArrayList<Block> blocks;
  27. private boolean checker;
  28. public CommandBlock(Module m)
  29. {
  30. super("block", m);
  31. super.setDescription("Zeigt alles für die Block-Verwaltung");
  32. super.setUsage("/block für die Hilfe");
  33. super.setPermission(Permissions.BLOCK);
  34. super.addAlias("blocks");
  35. super.addAlias("pro");
  36. super.addAlias("protect");
  37. bank = KajetansMod.blocks.getDataBank(BlockProtectionBank.class);
  38. locs = new ArrayList<>();
  39. blocks = new ArrayList<>();
  40. }
  41. @Override
  42. public boolean execute(ICommandSender cs, String[] arg)
  43. {
  44. if(!(cs instanceof EntityPlayerMP))
  45. {
  46. this.getModule().send(cs, GlobalText.onlyPlayer());
  47. return true;
  48. }
  49. Module m = this.getModule();
  50. EntityPlayerMP p = (EntityPlayerMP) cs;
  51. World w = p.getEntityWorld();
  52. if(!KajetansMod.worldManager.getWorldPreferences(w).blockProtection && !KajetansMod.perms.has(cs, Permissions.BLOCK_BYPASS))
  53. {
  54. m.send(cs, "Du darfst hier keine Blöcke schützen.");
  55. return true;
  56. }
  57. if(arg.length > 0)
  58. {
  59. BlockPos pos = Utils.getPlayerTarget(p);
  60. IBlockState state = w.getBlockState(pos);
  61. Block b = state.getBlock();
  62. if(!Utils.shouldBeProtected(b) && !KajetansMod.perms.has(cs, Permissions.BLOCK_ALL))
  63. {
  64. m.send(cs, "Du kannst diesen Block nicht bearbeiten.");
  65. m.send(cs, "Du bist auf folgenden Block gerichtet: " + b.toString());
  66. return true;
  67. }
  68. if(Utils.getStateValue(state, BlockDoor.HALF) == BlockDoor.EnumDoorHalf.UPPER)
  69. {
  70. pos = pos.add(0, -1, 0);
  71. }
  72. switch(arg[0])
  73. {
  74. case "protect":
  75. {
  76. String name = null;
  77. if(arg.length >= 2 && KajetansMod.perms.has(cs, Permissions.BLOCK_OTHER))
  78. {
  79. name = arg[1];
  80. }
  81. bank.addBlock(pos, w, p, name);
  82. if(b != Blocks.CHEST && b != Blocks.TRAPPED_CHEST)
  83. {
  84. return true;
  85. }
  86. BlockPos otherChest = Utils.getSameNearbyBlock(w, pos, b);
  87. if(otherChest != null)
  88. {
  89. bank.addBlock(otherChest, w, p, name);
  90. }
  91. return true;
  92. }
  93. case "remove":
  94. {
  95. if(!bank.doesExist(pos, w))
  96. {
  97. this.getModule().send(p, "Der Block ist nicht gesichert.");
  98. return true;
  99. }
  100. if(!bank.hasAccess(pos, w, p, false) && !KajetansMod.perms.has(cs, Permissions.BLOCK_BYPASS))
  101. {
  102. m.send(cs, "Du hast keinen Zugriff auf diesen Block.");
  103. return true;
  104. }
  105. bank.removeBlock(pos, w, p);
  106. if(b != Blocks.CHEST && b != Blocks.TRAPPED_CHEST)
  107. {
  108. return true;
  109. }
  110. BlockPos otherChest = Utils.getSameNearbyBlock(w, pos, b);
  111. if(otherChest != null)
  112. {
  113. bank.removeBlock(otherChest, w, p);
  114. }
  115. return true;
  116. }
  117. case "info":
  118. {
  119. bank.printInfo(pos, w, p);
  120. return true;
  121. }
  122. case "share":
  123. {
  124. if(arg.length >= 2)
  125. {
  126. if(!bank.doesExist(pos, w))
  127. {
  128. this.getModule().send(p, "Der Block ist nicht gesichert.");
  129. return true;
  130. }
  131. if(!bank.hasAccess(pos, w, p, false) && !KajetansMod.perms.has(cs, Permissions.BLOCK_BYPASS))
  132. {
  133. m.send(cs, "Du hast keinen Zugriff auf diesen Block.");
  134. return true;
  135. }
  136. GameProfile player = KajetansMod.playerbank.getDataBank().getOfflinePlayer(arg[1]);
  137. if(player == null)
  138. {
  139. m.send(cs, GlobalText.cantFindPlayer(arg[1]));
  140. return true;
  141. }
  142. bank.addPlayer(pos, w, player, p);
  143. if(b != Blocks.CHEST && b != Blocks.TRAPPED_CHEST)
  144. {
  145. return true;
  146. }
  147. BlockPos otherChest = Utils.getSameNearbyBlock(w, pos, b);
  148. if(otherChest != null)
  149. {
  150. bank.addPlayer(otherChest, w, player, p);
  151. }
  152. return true;
  153. }
  154. }
  155. case "kick":
  156. {
  157. if(arg.length >= 2)
  158. {
  159. if(!bank.doesExist(pos, w))
  160. {
  161. this.getModule().send(p, "Der Block ist nicht gesichert.");
  162. return true;
  163. }
  164. if(!bank.hasAccess(pos, w, p, true) && !KajetansMod.perms.has(cs, Permissions.BLOCK_BYPASS))
  165. {
  166. m.send(cs, "Du hast keinen Zugriff auf diesen Block.");
  167. return true;
  168. }
  169. GameProfile player = KajetansMod.playerbank.getDataBank().getOfflinePlayer(arg[1]);
  170. if(player == null)
  171. {
  172. m.send(cs, GlobalText.cantFindPlayer(arg[1]));
  173. return true;
  174. }
  175. bank.removePlayer(pos, w, player, p);
  176. if(b != Blocks.CHEST && b != Blocks.TRAPPED_CHEST)
  177. {
  178. return true;
  179. }
  180. BlockPos otherChest = Utils.getSameNearbyBlock(w, pos, b);
  181. if(otherChest != null)
  182. {
  183. bank.removePlayer(otherChest, w, player, p);
  184. }
  185. return true;
  186. }
  187. }
  188. case "clear":
  189. {
  190. if(KajetansMod.perms.has(cs, Permissions.BLOCK_CLEAR))
  191. {
  192. checker = false;
  193. SnuviScheduler.scheduleAsyncTask(() ->
  194. {
  195. this.getModule().send(cs, "Blöcke aus Datenbank abrufen ...");
  196. counter = 0;
  197. locs = bank.getAllFromWorld(w);
  198. checker = true;
  199. this.getModule().send(cs, "Fertig ...");
  200. });
  201. SnuviScheduler.scheduleAsyncTask(() ->
  202. {
  203. this.getModule().send(cs, "Schedule: Blöcke aus Welt abrufen ...");
  204. if(!checker)
  205. {
  206. this.getModule().send(cs, "Das Abrufen aller Einträge hat zu lange gedauert.");
  207. locs.clear();
  208. blocks.clear();
  209. return;
  210. }
  211. for(int i = 0; i < locs.size(); i+=50)
  212. {
  213. final int end = i + 50;
  214. KajetansMod.scheduler.scheduleTask(() ->
  215. {
  216. this.getModule().send(cs, "Blöcke aus Welt abrufen " + (end / 50));
  217. for(int j = end - 50; j < locs.size() && j < end; j++)
  218. {
  219. try
  220. {
  221. blocks.add(w.getBlockState(locs.get(j)).getBlock());
  222. }
  223. catch(NullPointerException ex)
  224. {
  225. blocks.add(null);
  226. }
  227. }
  228. this.getModule().send(cs, "Fertig ...");
  229. }, 0);
  230. }
  231. this.getModule().send(cs, "Fertig ...");
  232. }, 200);
  233. SnuviScheduler.scheduleAsyncTask(() ->
  234. {
  235. this.getModule().send(cs, "Ungültige Entfernen ...");
  236. index = 0;
  237. blocks.stream().forEach(bl ->
  238. {
  239. if(Utils.shouldBeProtected(bl))
  240. {
  241. index++;
  242. return;
  243. }
  244. bank.removeBlock(locs.get(index), w, p);
  245. index++;
  246. counter++;
  247. });
  248. this.getModule().send(cs, "Alle ungültigen Protections wurden entfernt. (" + counter + ")");
  249. locs.clear();
  250. blocks.clear();
  251. }, 400);
  252. return true;
  253. }
  254. break;
  255. }
  256. }
  257. }
  258. m.send(cs, "/block ...");
  259. m.sendHelpListElement(cs, "protect [player]", "Erstellt eine Block-Protection");
  260. m.sendHelpListElement(cs, "remove", "Löscht eine Block-Protection");
  261. m.sendHelpListElement(cs, "info", "Gibt Information über den Block");
  262. m.sendHelpListElement(cs, "share <player>", "Teilt eine Block-Protection mit einem Spieler");
  263. m.sendHelpListElement(cs, "kick <player>", "Kickt einen Spieler von einer Block-Protection");
  264. if(KajetansMod.perms.has(cs, Permissions.BLOCK_CLEAR))
  265. {
  266. m.sendHelpListElement(cs, "clear", "Entfernt ungültige Block-Protections auf jeden Block");
  267. }
  268. return true;
  269. }
  270. }