package me.lethunderhawk.clans.command; import me.lethunderhawk.clans.Clan; import me.lethunderhawk.clans.ClanManager; import me.lethunderhawk.clans.ClanModule; import me.lethunderhawk.clans.claim.Claim; import me.lethunderhawk.clans.claim.ClaimManager; import me.lethunderhawk.clans.gui.ClanMenu; import me.lethunderhawk.custom.item.abstraction.instance.ItemInstance; import me.lethunderhawk.custom.item.abstraction.registry.CustomItemRegistry; import me.lethunderhawk.fluxapi.FluxService; import me.lethunderhawk.fluxapi.util.command.CommandNode; import me.lethunderhawk.fluxapi.util.command.CustomCommand; import me.lethunderhawk.fluxapi.util.gui.InventoryManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.NamedTextColor; import net.kyori.adventure.text.format.TextDecoration; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.List; import java.util.UUID; import java.util.stream.Collectors; public class ClanCommand extends CustomCommand { private final ClanManager manager; public ClanCommand(ClanManager manager) { super(FluxService.get(ClanModule.class)); this.manager = manager; } @Override public CommandNode getRootCommand(){ return new CommandNode("clan", "Main clan command", null); } @Override public void createCommands() { registerSubCommand("list", "List all clans", this::handleList); registerSubCommand("leave", "Leave your current clan", this::handleLeaveClan); registerSubCommand("reload", "Reload the clan Plugin", this::handleReload); registerSubCommand("members", "Show the members of your clan", this::handleShowMembers); registerSubCommand("save", "Save all clans and Claims", this::handleSave); registerSubCommand("menu", "Shows a GUI to handle your clan if you are the owner", this::handleGUI); CommandNode claimNode = registerSubCommand("claim", "Claim land for your clan", this::handleClaim); claimNode.registerSubCommand("info", "Get information about your claims", this::infoClaims); claimNode.registerSubCommand("removeAll", "Remove all current claims", this::removeAllClaims); claimNode.registerSubCommand("tool", "Get the claimTool", this::getClaimTool); CommandNode acceptNode = registerSubCommand("acceptRequest", "Accept a pending request of a player", this::handleAcceptRequest); acceptNode.setTabCompleter(this::completeRequests); CommandNode declineNode = registerSubCommand("declineRequest", "Decline a pending request of a player", this::handleDeclineRequest); declineNode.setTabCompleter(this::completeRequests); CommandNode removeNode = registerSubCommand("remove", "Remove a Clan", this::removeClan); removeNode.setTabCompleter(this::completeClans); CommandNode joinNode = registerSubCommand("join", "Join a clan", this::handleJoin); joinNode.setTabCompleter(this::completeClans); registerSubCommand("create", "Create a new clan", this::handleCreate); } private void getClaimTool(CommandSender sender, String[] strings) { if(!(sender instanceof Player p)) return; CustomItemRegistry registry = FluxService.get(CustomItemRegistry.class); p.getInventory().addItem(new ItemInstance(registry.get("claim_tool")).buildItemStack()); module.sendText(p, Component.text("The tool magically appears in your inventory! How convenient!")); } private void handleSave(CommandSender sender, String[] strings) { if(!sender.isOp()) return; FluxService.get(ClanManager.class).saveClans(); } private void removeAllClaims(CommandSender sender, String[] strings) { if(!(sender instanceof Player player) || !sender.isOp()) return; FluxService.get(ClaimManager.class).removeAllClaims(); } private void infoClaims(CommandSender sender, String[] strings) { if(!(sender instanceof Player player)) return; UUID uuid = player.getUniqueId(); Clan myClan = manager.getMyClan(uuid); if(myClan == null) return; module.sendText(player, Component.text("List of all claims in clan " + myClan.getName(), NamedTextColor.GREEN, TextDecoration.UNDERLINED)); for(Claim claim : myClan.getClaims()){ module.sendText(player, Component.text("Claim: " + claim.getName(), NamedTextColor.GOLD)); module.sendText(player, Component.text("This claim spans from X: " + claim.getMaxX() + " to X: " + claim.getMinX(), NamedTextColor.GRAY) .appendNewline() .append(Component.text( " and from Z: " + claim.getMaxZ() + " to Z: " + claim.getMinZ(), NamedTextColor.GRAY))); module.sendText(player, Component.text("Volume of this claim is " + claim.getVolume() + " Blocks", NamedTextColor.GRAY)); } } private void handleClaim(CommandSender sender, String[] strings) { } private void handleGUI(CommandSender sender, String[] strings) { if(!(sender instanceof Player player)) return; Clan myClan = manager.getMyClan(player.getUniqueId()); if(myClan == null) return; InventoryManager.openFor(player, new ClanMenu(myClan, player)); } private void handleDeclineRequest(CommandSender sender, String[] strings) { if (!(sender instanceof Player player) || strings[0] == null || strings[0].isEmpty()) return; UUID uuid = player.getUniqueId(); Clan clan = manager.getMyClan(uuid); if(clan.denyRequest(uuid, strings[0])){ module.sendText(player, Component.text("You declined the request from " + strings[0] + ".")); }else{ module.sendText(player, Component.text("You are not the owner, or " + strings[0] + " hasn't requested to join your clan.")); } } private void handleAcceptRequest(CommandSender sender, String[] strings) { if (!(sender instanceof Player player) || strings[0] == null || strings[0].isEmpty()) return; UUID uuid = player.getUniqueId(); Clan clan = manager.getMyClan(uuid); if(clan.acceptRequest(uuid, strings[0])){ module.sendText(player, Component.text("You accepted the request from " + strings[0] + ".")); }else{ module.sendText(player, Component.text("You are not the owner, or " + strings[0] + " hasn't requested to join your clan.")); } } private void handleShowMembers(CommandSender sender, String[] strings) { if (!(sender instanceof Player player)) return; UUID uuid = player.getUniqueId(); Clan clan = manager.getMyClan(uuid); if(clan == null) return; module.sendText(player, Component.text("ยง6=== Clan Members - " + clan.getName() + " ===")); Player owner = clan.getOwner(); module.sendText(player, Component.text("Owner: ", NamedTextColor.RED) .append(Component.text(owner.getName(), NamedTextColor.GRAY))); for(UUID member : clan.getMembers()){ Player p = Bukkit.getPlayer(member); if(p == null) continue; module.sendText(player, Component.text(p.getName())); } } private void handleReload(CommandSender sender, String[] strings) { if(sender.isOp()) { reload(); module.sendText(sender, Component.text("Reloading...")); } } private void handleLeaveClan(CommandSender sender, String[] strings) { if (!(sender instanceof Player player)) return; UUID uuid = player.getUniqueId(); Clan clan = manager.getMyClan(uuid); if(manager.leaveClan(uuid)){ module.sendText(player,Component.text("You left your Clan ")); if(clan.getOwner().equals(player)){ manager.removeClan(clan.getName()); module.sendText(player,Component.text("The clan was deleted since you are the only one left!")); } }else{ 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!")); } } private void handleHelp(CommandSender sender, String[] strings) { sendHelp(sender); } private void removeClan(CommandSender commandSender, String[] strings) { if(!commandSender.isOp()) return; if(strings[0] != null && !strings[0].isEmpty()) manager.removeClan(strings[0]); } private void handleCreate(CommandSender commandSender, String[] strings) { if (!(commandSender instanceof Player player)) return; String name = String.join("-", strings); if (manager.getMyClan(player.getUniqueId()) != null){ module.sendText(player,Component.text("You are already in a clan! Leave your clan first!")); return; } if(manager.createClan(player, name)) module.sendText(player,Component.text("Creating the Clan " + name + " ...")); else module.sendText(player,Component.text("The Name for the Clan " + name + " is already taken or you are already in a clan!")); } // Example command handlers private void handleList(CommandSender sender, String[] args) { module.sendText(sender,Component.text("Aktuelle Liste an Clans: ")); for (Clan clan : manager.getClans()) { module.sendText(sender,Component.text(clan.getName())); } } private void handleJoin(CommandSender sender, String[] args) { if (!(sender instanceof Player player)) return; if (args.length < 1) { module.sendText(sender,Component.text("Usage: /clan join ")); return; } if(manager.joinClan(player.getUniqueId(), args[0])) module.sendText(player, Component.text("Sent a request to join the clan " + args[0])); } private List completeClans(CommandSender sender, String[] args) { if(!(sender instanceof Player player)) return List.of("Your not a player!"); String partial = args.length > 0 ? args[args.length - 1].toLowerCase() : ""; if(manager.getClans() == null) return List.of("No Clan found!"); return manager.getClans().stream() .map(Clan::getName) .filter(name -> name.toLowerCase().startsWith(partial)) .collect(Collectors.toList()); } private List completeRequests(CommandSender sender, String[] args) { if(!(sender instanceof Player player)) return List.of("Your not a player!"); Clan clan = manager.getMyClan(player.getUniqueId()); if (clan == null) return List.of("You are not in a clan!"); String partial = args.length > 0 ? args[args.length - 1].toLowerCase() : ""; return clan.getRequests().stream() .filter(name -> name.toLowerCase().startsWith(partial)) .collect(Collectors.toList()); } }