From 5a6bb9a13dc7d40439f5d69a831c1411649cc59e Mon Sep 17 00:00:00 2001 From: Marcos Paulo Date: Thu, 20 Aug 2026 12:55:38 -0300 Subject: [PATCH] feat(chunkloader): add /chunkloader limite command and tab completion --- .../canalhandia/CanalhandiaCommand.java | 72 ++++++++++++++++++- 1 file changed, 71 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/marcospaulo/canalhandia/CanalhandiaCommand.java b/src/main/java/dev/marcospaulo/canalhandia/CanalhandiaCommand.java index 0ede027..5e7f3ae 100644 --- a/src/main/java/dev/marcospaulo/canalhandia/CanalhandiaCommand.java +++ b/src/main/java/dev/marcospaulo/canalhandia/CanalhandiaCommand.java @@ -1822,6 +1822,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { case "info", "chunk" -> chunkloaderInfo(sender); case "remover", "remove", "del" -> chunkloaderRemove(sender, rest); case "receita", "craft" -> chunkloaderRecipe(sender); + case "limite", "limit" -> chunkloaderLimit(sender, rest); case "admin" -> chunkloaderAdmin(sender, rest); case "dar", "give" -> { if (admin(sender)) { @@ -2040,6 +2041,68 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { Msg.ok(target, "Você recebeu " + amount + "x Âncora de Chunk!"); } + private void chunkloaderLimit(CommandSender sender, String[] args) { + if (args.length == 0) { + int defaultLimit = plugin.settings().chunkLoaderDefaultLimit(); + Msg.header(sender, "Limite de Âncoras de Chunk"); + sender.sendMessage(Component.text(" Limite padrão global: ", NamedTextColor.GRAY) + .append(Component.text(defaultLimit, NamedTextColor.YELLOW))); + if (sender instanceof Player player) { + int myLimit = ChunkLoaders.playerLimit(player, defaultLimit); + String myLimitStr = myLimit == Integer.MAX_VALUE ? "ilimitado" : String.valueOf(myLimit); + int current = plugin.chunkLoaders().byOwner(player.getUniqueId().toString()).size(); + sender.sendMessage(Component.text(" Seu limite atual: ", NamedTextColor.GRAY) + .append(Component.text(current + "/" + myLimitStr, NamedTextColor.AQUA))); + } + if (admin(sender)) { + sender.sendMessage(Component.text(" Alterar padrão global: ", NamedTextColor.GRAY) + .append(Component.text("/chunkloader limite padrao ", NamedTextColor.YELLOW))); + sender.sendMessage(Component.text(" Definir por jogador (LuckPerms): ", NamedTextColor.GRAY) + .append(Component.text("/chunkloader limite ", NamedTextColor.YELLOW))); + } + return; + } + + if (!admin(sender)) { + return; + } + + if (args[0].equalsIgnoreCase("padrao") || args[0].equalsIgnoreCase("default")) { + if (args.length < 2) { + Msg.error(sender, "Uso: /chunkloader limite padrao "); + return; + } + try { + int newLimit = Math.max(0, Integer.parseInt(args[1])); + plugin.settings().chunkLoaderDefaultLimit(newLimit); + Msg.ok(sender, "Limite padrão global de Âncoras alterado para " + newLimit + "."); + } catch (NumberFormatException e) { + Msg.error(sender, "Quantidade inválida: " + args[1]); + } + return; + } + + Player target = Bukkit.getPlayerExact(args[0]); + if (target == null) { + Msg.error(sender, "Jogador '" + args[0] + "' não encontrado online."); + return; + } + if (args.length < 2) { + int targetLimit = ChunkLoaders.playerLimit(target, plugin.settings().chunkLoaderDefaultLimit()); + String str = targetLimit == Integer.MAX_VALUE ? "ilimitado" : String.valueOf(targetLimit); + int current = plugin.chunkLoaders().byOwner(target.getUniqueId().toString()).size(); + Msg.ok(sender, "Limite de " + target.getName() + ": " + current + "/" + str + " âncoras ativas."); + return; + } + try { + int newLimit = Math.max(0, Integer.parseInt(args[1])); + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "lp user " + target.getName() + " permission set canalhandia.chunkloader.limite." + newLimit); + Msg.ok(sender, "Limite de " + target.getName() + " definido para " + newLimit + " âncoras."); + } catch (NumberFormatException e) { + Msg.error(sender, "Quantidade inválida: " + args[1]); + } + } + private boolean chunkloaderHelp(CommandSender sender) { Msg.header(sender, "Âncoras de Chunk"); sender.sendMessage(Component.text(" /chunkloader info", NamedTextColor.AQUA) @@ -2050,6 +2113,8 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { .append(Component.text(" — Desativa e recolhe uma de suas âncoras", NamedTextColor.GRAY))); sender.sendMessage(Component.text(" /chunkloader receita", NamedTextColor.AQUA) .append(Component.text(" — Mostra a receita de criação do bloco", NamedTextColor.GRAY))); + sender.sendMessage(Component.text(" /chunkloader limite", NamedTextColor.AQUA) + .append(Component.text(" — Mostra ou configura os limites de âncoras", NamedTextColor.GRAY))); if (sender.hasPermission(ADMIN) || sender.hasPermission("canalhandia.chunkloader.admin")) { sender.sendMessage(Component.text(" /chunkloader admin", NamedTextColor.YELLOW) .append(Component.text(" — Comandos de administração", NamedTextColor.GRAY))); @@ -2219,7 +2284,7 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { } if (name.equals("chunkloader") || name.equals("ancora") || name.equals("ancoras")) { if (args.length == 1) { - List options = new ArrayList<>(List.of("info", "listar", "remover", "receita")); + List options = new ArrayList<>(List.of("info", "listar", "remover", "receita", "limite")); if (sender.hasPermission(ADMIN) || sender.hasPermission("canalhandia.chunkloader.admin")) { options.addAll(List.of("admin", "dar")); } @@ -2234,6 +2299,11 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { return filter(ids, args[1]); } } + if (args.length == 2 && args[0].equalsIgnoreCase("limite")) { + List opts = new ArrayList<>(List.of("padrao")); + opts.addAll(onlineNames()); + return filter(opts, args[1]); + } if (args.length == 2 && args[0].equalsIgnoreCase("admin")) { return filter(List.of("listar", "remover", "dar"), args[1]); }