feat(chunkloader): add /chunkloader limite command and tab completion

This commit is contained in:
Marcos Paulo
2026-08-20 12:55:38 -03:00
parent 4b9507b36e
commit 5a6bb9a13d
@@ -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 <quantidade>", NamedTextColor.YELLOW)));
sender.sendMessage(Component.text(" Definir por jogador (LuckPerms): ", NamedTextColor.GRAY)
.append(Component.text("/chunkloader limite <jogador> <quantidade>", 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 <quantidade>");
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<String> options = new ArrayList<>(List.of("info", "listar", "remover", "receita"));
List<String> 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<String> 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]);
}