ClanCommand.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. package me.lethunderhawk.clans.command;
  2. import me.lethunderhawk.clans.Clan;
  3. import me.lethunderhawk.clans.ClanManager;
  4. import me.lethunderhawk.clans.ClanModule;
  5. import me.lethunderhawk.clans.claim.Claim;
  6. import me.lethunderhawk.clans.claim.ClaimManager;
  7. import me.lethunderhawk.clans.gui.ClanMenu;
  8. import me.lethunderhawk.custom.item.abstraction.instance.ItemInstance;
  9. import me.lethunderhawk.custom.item.abstraction.registry.CustomItemRegistry;
  10. import me.lethunderhawk.fluxapi.FluxService;
  11. import me.lethunderhawk.fluxapi.util.command.CommandNode;
  12. import me.lethunderhawk.fluxapi.util.command.CustomCommand;
  13. import me.lethunderhawk.fluxapi.util.gui.InventoryManager;
  14. import net.kyori.adventure.text.Component;
  15. import net.kyori.adventure.text.format.NamedTextColor;
  16. import net.kyori.adventure.text.format.TextDecoration;
  17. import org.bukkit.Bukkit;
  18. import org.bukkit.command.CommandSender;
  19. import org.bukkit.entity.Player;
  20. import java.util.List;
  21. import java.util.UUID;
  22. import java.util.stream.Collectors;
  23. public class ClanCommand extends CustomCommand {
  24. private final ClanManager manager;
  25. public ClanCommand(ClanManager manager) {
  26. super(FluxService.get(ClanModule.class));
  27. this.manager = manager;
  28. }
  29. @Override
  30. public CommandNode getRootCommand(){
  31. return new CommandNode("clan", "Main clan command", null);
  32. }
  33. @Override
  34. public void createCommands() {
  35. registerSubCommand("list", "List all clans", this::handleList);
  36. registerSubCommand("leave", "Leave your current clan", this::handleLeaveClan);
  37. registerSubCommand("reload", "Reload the clan Plugin", this::handleReload);
  38. registerSubCommand("members", "Show the members of your clan", this::handleShowMembers);
  39. registerSubCommand("save", "Save all clans and Claims", this::handleSave);
  40. registerSubCommand("menu", "Shows a GUI to handle your clan if you are the owner", this::handleGUI);
  41. CommandNode claimNode = registerSubCommand("claim", "Claim land for your clan", this::handleClaim);
  42. claimNode.registerSubCommand("info", "Get information about your claims", this::infoClaims);
  43. claimNode.registerSubCommand("removeAll", "Remove all current claims", this::removeAllClaims);
  44. claimNode.registerSubCommand("tool", "Get the claimTool", this::getClaimTool);
  45. CommandNode acceptNode = registerSubCommand("acceptRequest", "Accept a pending request of a player", this::handleAcceptRequest);
  46. acceptNode.setTabCompleter(this::completeRequests);
  47. CommandNode declineNode = registerSubCommand("declineRequest", "Decline a pending request of a player", this::handleDeclineRequest);
  48. declineNode.setTabCompleter(this::completeRequests);
  49. CommandNode removeNode = registerSubCommand("remove", "Remove a Clan", this::removeClan);
  50. removeNode.setTabCompleter(this::completeClans);
  51. CommandNode joinNode = registerSubCommand("join", "Join a clan", this::handleJoin);
  52. joinNode.setTabCompleter(this::completeClans);
  53. registerSubCommand("create", "Create a new clan", this::handleCreate);
  54. }
  55. private void getClaimTool(CommandSender sender, String[] strings) {
  56. if(!(sender instanceof Player p)) return;
  57. CustomItemRegistry registry = FluxService.get(CustomItemRegistry.class);
  58. p.getInventory().addItem(new ItemInstance(registry.get("claim_tool")).buildItemStack());
  59. module.sendText(p, Component.text("The tool magically appears in your inventory! How convenient!"));
  60. }
  61. private void handleSave(CommandSender sender, String[] strings) {
  62. if(!sender.isOp()) return;
  63. FluxService.get(ClanManager.class).saveClans();
  64. }
  65. private void removeAllClaims(CommandSender sender, String[] strings) {
  66. if(!(sender instanceof Player player) || !sender.isOp()) return;
  67. FluxService.get(ClaimManager.class).removeAllClaims();
  68. }
  69. private void infoClaims(CommandSender sender, String[] strings) {
  70. if(!(sender instanceof Player player)) return;
  71. UUID uuid = player.getUniqueId();
  72. Clan myClan = manager.getMyClan(uuid);
  73. if(myClan == null) return;
  74. module.sendText(player, Component.text("List of all claims in clan " + myClan.getName(), NamedTextColor.GREEN, TextDecoration.UNDERLINED));
  75. for(Claim claim : myClan.getClaims()){
  76. module.sendText(player, Component.text("Claim: " + claim.getName(), NamedTextColor.GOLD));
  77. module.sendText(player, Component.text("This claim spans from X: " + claim.getMaxX() + " to X: " + claim.getMinX(), NamedTextColor.GRAY)
  78. .appendNewline()
  79. .append(Component.text( " and from Z: " + claim.getMaxZ() + " to Z: " + claim.getMinZ(), NamedTextColor.GRAY)));
  80. module.sendText(player, Component.text("Volume of this claim is " + claim.getVolume() + " Blocks", NamedTextColor.GRAY));
  81. }
  82. }
  83. private void handleClaim(CommandSender sender, String[] strings) {
  84. }
  85. private void handleGUI(CommandSender sender, String[] strings) {
  86. if(!(sender instanceof Player player)) return;
  87. Clan myClan = manager.getMyClan(player.getUniqueId());
  88. if(myClan == null) return;
  89. InventoryManager.openFor(player, new ClanMenu(myClan, player));
  90. }
  91. private void handleDeclineRequest(CommandSender sender, String[] strings) {
  92. if (!(sender instanceof Player player) || strings[0] == null || strings[0].isEmpty()) return;
  93. UUID uuid = player.getUniqueId();
  94. Clan clan = manager.getMyClan(uuid);
  95. if(clan.denyRequest(uuid, strings[0])){
  96. module.sendText(player, Component.text("You declined the request from " + strings[0] + "."));
  97. }else{
  98. module.sendText(player, Component.text("You are not the owner, or " + strings[0] + " hasn't requested to join your clan."));
  99. }
  100. }
  101. private void handleAcceptRequest(CommandSender sender, String[] strings) {
  102. if (!(sender instanceof Player player) || strings[0] == null || strings[0].isEmpty()) return;
  103. UUID uuid = player.getUniqueId();
  104. Clan clan = manager.getMyClan(uuid);
  105. if(clan.acceptRequest(uuid, strings[0])){
  106. module.sendText(player, Component.text("You accepted the request from " + strings[0] + "."));
  107. }else{
  108. module.sendText(player, Component.text("You are not the owner, or " + strings[0] + " hasn't requested to join your clan."));
  109. }
  110. }
  111. private void handleShowMembers(CommandSender sender, String[] strings) {
  112. if (!(sender instanceof Player player)) return;
  113. UUID uuid = player.getUniqueId();
  114. Clan clan = manager.getMyClan(uuid);
  115. if(clan == null) return;
  116. module.sendText(player, Component.text("§6=== Clan Members - " + clan.getName() + " ==="));
  117. Player owner = clan.getOwner();
  118. module.sendText(player,
  119. Component.text("Owner: ", NamedTextColor.RED)
  120. .append(Component.text(owner.getName(), NamedTextColor.GRAY)));
  121. for(UUID member : clan.getMembers()){
  122. Player p = Bukkit.getPlayer(member);
  123. if(p == null) continue;
  124. module.sendText(player, Component.text(p.getName()));
  125. }
  126. }
  127. private void handleReload(CommandSender sender, String[] strings) {
  128. if(sender.isOp()) {
  129. reload();
  130. module.sendText(sender, Component.text("Reloading..."));
  131. }
  132. }
  133. private void handleLeaveClan(CommandSender sender, String[] strings) {
  134. if (!(sender instanceof Player player)) return;
  135. UUID uuid = player.getUniqueId();
  136. Clan clan = manager.getMyClan(uuid);
  137. if(manager.leaveClan(uuid)){
  138. module.sendText(player,Component.text("You left your Clan "));
  139. if(clan.getOwner().equals(player)){
  140. manager.removeClan(clan.getName());
  141. module.sendText(player,Component.text("The clan was deleted since you are the only one left!"));
  142. }
  143. }else{
  144. module.sendText(player,Component.text("You cannot leave this clan! Either join a clan or if you are an owner, please remove all members first!"));
  145. }
  146. }
  147. private void handleHelp(CommandSender sender, String[] strings) {
  148. sendHelp(sender);
  149. }
  150. private void removeClan(CommandSender commandSender, String[] strings) {
  151. if(!commandSender.isOp()) return;
  152. if(strings[0] != null && !strings[0].isEmpty()) manager.removeClan(strings[0]);
  153. }
  154. private void handleCreate(CommandSender commandSender, String[] strings) {
  155. if (!(commandSender instanceof Player player)) return;
  156. String name = String.join("-", strings);
  157. if (manager.getMyClan(player.getUniqueId()) != null){
  158. module.sendText(player,Component.text("You are already in a clan! Leave your clan first!"));
  159. return;
  160. }
  161. if(manager.createClan(player, name)) module.sendText(player,Component.text("Creating the Clan " + name + " ..."));
  162. else module.sendText(player,Component.text("The Name for the Clan " + name + " is already taken or you are already in a clan!"));
  163. }
  164. // Example command handlers
  165. private void handleList(CommandSender sender, String[] args) {
  166. module.sendText(sender,Component.text("Aktuelle Liste an Clans: "));
  167. for (Clan clan : manager.getClans()) {
  168. module.sendText(sender,Component.text(clan.getName()));
  169. }
  170. }
  171. private void handleJoin(CommandSender sender, String[] args) {
  172. if (!(sender instanceof Player player)) return;
  173. if (args.length < 1) {
  174. module.sendText(sender,Component.text("Usage: /clan join <clan>"));
  175. return;
  176. }
  177. if(manager.joinClan(player.getUniqueId(), args[0])) module.sendText(player, Component.text("Sent a request to join the clan " + args[0]));
  178. }
  179. private List<String> completeClans(CommandSender sender, String[] args) {
  180. if(!(sender instanceof Player player)) return List.of("Your not a player!");
  181. String partial = args.length > 0 ? args[args.length - 1].toLowerCase() : "";
  182. if(manager.getClans() == null) return List.of("No Clan found!");
  183. return manager.getClans().stream()
  184. .map(Clan::getName)
  185. .filter(name -> name.toLowerCase().startsWith(partial))
  186. .collect(Collectors.toList());
  187. }
  188. private List<String> completeRequests(CommandSender sender, String[] args) {
  189. if(!(sender instanceof Player player)) return List.of("Your not a player!");
  190. Clan clan = manager.getMyClan(player.getUniqueId());
  191. if (clan == null) return List.of("You are not in a clan!");
  192. String partial = args.length > 0 ? args[args.length - 1].toLowerCase() : "";
  193. return clan.getRequests().stream()
  194. .filter(name -> name.toLowerCase().startsWith(partial))
  195. .collect(Collectors.toList());
  196. }
  197. }