From ed1f308ca8c0dd403ed34456e262461ed07a1485 Mon Sep 17 00:00:00 2001 From: Referix Date: Thu, 25 Sep 2025 00:22:19 +0300 Subject: [PATCH 1/4] Refactor commands: unify Item and SafeZone subcommand handling with GenericCommand structure --- src/main/java/dev/lotus/studio/Main.java | 43 ++- .../dev/lotus/studio/command/MainCommand.java | 362 +++--------------- .../lotus/studio/command/SafeZoneCommand.java | 114 ------ .../command/subcommand/GenericCommand.java | 70 ++++ .../command/subcommand/HelpCommand.java | 31 ++ .../command/subcommand/ReloadCommand.java | 4 + .../command/subcommand/SaveZoneCommand.java | 4 + .../studio/command/subcommand/SubCommand.java | 15 + .../item/factory/AbstractItemSubCommand.java | 13 + .../item/factory/ItemSubCommandFactory.java | 15 + .../item/factory/ItemSubCommandType.java | 32 ++ .../item/subcommand/ArmorCommand.java | 80 ++++ .../item/subcommand/EatCommand.java | 83 ++++ .../item/subcommand/ViewCommand.java | 83 ++++ .../factory/AbstractSafeZoneSubCommand.java | 14 + .../factory/SafeZoneSubCommandFactory.java | 16 + .../factory/SafeZoneSubCommandType.java | 29 ++ .../subcommand/SafeZoneListCommand.java | 53 +++ .../subcommand/SafeZonePos1Command.java | 45 +++ .../subcommand/SafeZonePos2Command.java | 43 +++ .../subcommand/SafeZoneRemoveCommand.java | 64 ++++ .../subcommand/SafeZoneSaveCommand.java | 64 ++++ .../studio/safezone/SafeZoneManager.java | 37 +- .../dev/lotus/studio/utils/ItemNameUtil.java | 16 + 24 files changed, 884 insertions(+), 446 deletions(-) delete mode 100644 src/main/java/dev/lotus/studio/command/SafeZoneCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/GenericCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/HelpCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/ReloadCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/SaveZoneCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/SubCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/item/factory/AbstractItemSubCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/item/factory/ItemSubCommandFactory.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/item/factory/ItemSubCommandType.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ArmorCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/EatCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ViewCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/AbstractSafeZoneSubCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/SafeZoneSubCommandFactory.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/SafeZoneSubCommandType.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneListCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos1Command.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos2Command.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneRemoveCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneSaveCommand.java create mode 100644 src/main/java/dev/lotus/studio/utils/ItemNameUtil.java diff --git a/src/main/java/dev/lotus/studio/Main.java b/src/main/java/dev/lotus/studio/Main.java index 2375c27..d304c84 100644 --- a/src/main/java/dev/lotus/studio/Main.java +++ b/src/main/java/dev/lotus/studio/Main.java @@ -14,6 +14,8 @@ import dev.lotus.studio.playerdata.PlayerManager; import dev.lotus.studio.safezone.SafeZoneManager; +import java.util.logging.Level; + public final class Main extends JavaPlugin { private static Main instance; @@ -25,30 +27,41 @@ public final class Main extends JavaPlugin { @Override public void onEnable() { + if (initialize()){ + getLogger().log(Level.INFO, "Plugin has been enabled!"); + } + } - instance = this; - PlayerManager.getInstance().startGlobalTask(); - //cfg - itemManager = new CustomItemManager(); - databaseInitializer = new DatabaseInitializer(this); - playerDataBase = databaseInitializer.getPlayerDataBase(); - safeZoneDataService = databaseInitializer.getSaveZoneDataService(); + public boolean initialize() { + try { + instance = this; + PlayerManager.getInstance().startGlobalTask(); + //cfg + itemManager = new CustomItemManager(); + databaseInitializer = new DatabaseInitializer(this); + playerDataBase = databaseInitializer.getPlayerDataBase(); + safeZoneDataService = databaseInitializer.getSaveZoneDataService(); - itemManager.loadItems(); - getServer().getPluginManager().registerEvents(new ArmorEvent(itemManager),this); - getServer().getPluginManager().registerEvents(new EatEvent(itemManager),this); - getServer().getPluginManager().registerEvents(new JoinLeaveEvent(playerDataBase),this); - getLogger().info("Предметы загружены из items.yml."); - new PlayerBar(this,itemManager); + itemManager.loadItems(); + getServer().getPluginManager().registerEvents(new ArmorEvent(itemManager),this); + getServer().getPluginManager().registerEvents(new EatEvent(itemManager),this); + getServer().getPluginManager().registerEvents(new JoinLeaveEvent(playerDataBase),this); + getLogger().info("Предметы загружены из items.yml."); + new PlayerBar(this,itemManager); - new MainCommand("lotus", itemManager); - SafeZoneManager.getInstance().initialize(safeZoneDataService); + new MainCommand("lotus", itemManager, SafeZoneManager.getInstance()); + SafeZoneManager.getInstance().initialize(safeZoneDataService); + } catch (Exception e) { + getLogger().severe("Exeption Initialize plugin: " + e.getMessage()); + return false; + } + return true; } @Override diff --git a/src/main/java/dev/lotus/studio/command/MainCommand.java b/src/main/java/dev/lotus/studio/command/MainCommand.java index 2c8c652..7f97577 100644 --- a/src/main/java/dev/lotus/studio/command/MainCommand.java +++ b/src/main/java/dev/lotus/studio/command/MainCommand.java @@ -1,347 +1,85 @@ package dev.lotus.studio.command; -import net.kyori.adventure.text.Component; +import dev.lotus.studio.command.subcommand.GenericCommand; +import dev.lotus.studio.command.subcommand.HelpCommand; +import dev.lotus.studio.command.subcommand.SubCommand; +import dev.lotus.studio.command.subcommand.item.factory.ItemSubCommandFactory; +import dev.lotus.studio.command.subcommand.safezone.factory.SafeZoneSubCommandFactory; +import dev.lotus.studio.item.CustomItemManager; +import dev.lotus.studio.safezone.SafeZoneManager; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import dev.lotus.studio.database.savezone.SafeZoneDataService; -import dev.lotus.studio.item.CustomItemManager; -import java.util.ArrayList; -import java.util.List; +import java.util.*; public class MainCommand extends AbstractCommand { - private final CustomItemManager itemManager; - private final SafeZoneCommand saveZoneCommand; + private final Map subCommands = new HashMap<>(); - public MainCommand(String command, CustomItemManager itemManager) { + public MainCommand(String command, CustomItemManager itemManager, SafeZoneManager manager) { super(command); - this.itemManager = itemManager; - this.saveZoneCommand =new SafeZoneCommand(); - } - - @Override - public boolean execute(CommandSender sender, String label, String[] args) { - if (!(sender instanceof Player player)) { - sender.sendMessage("Эту команду можно выполнять только как игрок."); - return true; - } - - if (args.length < 1) { - sendMainHelp(player, label); - return true; - } - - String category = args[0].toLowerCase(); - - switch (category) { - case "item" -> handleItemCommands(player, label, args); - case "savezone" -> saveZoneCommand.execute(player, label,args); - case "reload" -> reloadConfig(player, label, args); - default -> player.sendMessage("Неизвестная категория. Используйте /" + label + " для помощи."); - } - - return true; - } - - // --- Command Reload --- - private void reloadConfig(Player player, String label, String[] args) { - if (args.length < 2) { - sendReloadHelp(player, label); - } -// if (args[0].equalsIgnoreCase("reload")){ -// itemManager.reloadItemConfig(); -// } - String reload = args[1].toLowerCase(); - - switch (reload) { - case "items" -> itemReloadCommand(player, args); - case "all" -> allReloadCommand(player, args); - case "help" -> sendReloadHelp(player, label); - default -> player.sendMessage("Неизвестная команда для item. Используйте /" + label + " item help."); - } - - } - - private void sendReloadHelp(Player player, String label) { - player.sendMessage("§aКоманды для reload:"); - player.sendMessage("§7/" + label + " items - Reload items configuration"); - player.sendMessage("§7/" + label + " villager - Reload villager configuration"); - player.sendMessage("§7/" + label + " all - Reload all configuration"); - } - - private void itemReloadCommand(Player player, String[] args) { - player.sendMessage("Reloading config " + args[1]); - try { - itemManager.reloadItemConfig(); - } catch (Exception e) { - player.sendMessage("Config reload failed."); - } - player.sendMessage("Reload complete."); - } - - - - private void allReloadCommand(Player player, String[] args) { - player.sendMessage("Reloading config " + args[1]); - try { - itemReloadCommand(player, args); - } catch (Exception e) { - player.sendMessage("Config reload failed."); - } - } - - - // --- Main help command ---- - private void sendMainHelp(Player player, String label) { - player.sendMessage("§aОсновные команды:"); - player.sendMessage("§7/" + label + " armor - Управление предметами (броня)."); - player.sendMessage("§7/" + label + " horder - Управление торговцами (Holder)."); - player.sendMessage("§7/" + label + " reload - Reload Configs."); - player.sendMessage("§7/" + label + " help - Показать эту справку."); - } - - //--- item --- - private void handleItemCommands(Player player, String label, String[] args) { - if (args.length < 2) { - sendItemHelp(player, label); - return; - } - - String subCommand = args[1].toLowerCase(); - - switch (subCommand) { - case "armor" -> handleArmorCommands(player, label, args); - case "view" -> handleViewCommands(player, label, args); - case "eat" -> handleEatCommands(player, label, args); - default -> player.sendMessage("Неизвестная команда для item. Используйте /" + label + " item help."); - } - } - - private void sendItemHelp(Player player, String label) { - player.sendMessage("§aКоманды для item:"); - player.sendMessage("§7/" + label + " item armor - Управление предметами брони."); - player.sendMessage("§7/" + label + " item view - Управление view item."); - player.sendMessage("§7/" + label + " item eat - Управление съедобными предметами."); - player.sendMessage("§7/" + label + " item help - Показать помощь для item."); - } - - - - // --- View Commands --- - private void handleViewCommands(Player player, String label, String[] args) { - if (args.length < 3) { - sendViewHelp(player, label); - return; - } - - String action = args[2].toLowerCase(); - - switch (action) { - case "give" -> handleViewGiveCommand(player, label, args); - case "list" -> handleViewListCommand(player); - case "help" -> sendViewHelp(player, label); - default -> player.sendMessage("Неизвестная команда для view. Используйте /" + label + " view help."); - } - } - - private void handleViewGiveCommand(Player player, String label, String[] args) { - if (args.length < 4) { - player.sendMessage("Использование: /" + label + " view give "); - return; - } - - String itemKey = args[3]; - var viewItem = itemManager.getViewItem(itemKey); - - if (viewItem == null) { - player.sendMessage("View item с ключом '" + itemKey + "' не найден."); - return; - } - - ItemStack itemStack = viewItem.getItemStack(); - if (itemStack == null) { - player.sendMessage("View item с ключом '" + itemKey + "' имеет некорректный ItemStack."); - return; - } - - player.getInventory().addItem(itemStack); - Component displayName = itemStack.getItemMeta().displayName(); - player.sendMessage("Вам выдан view item: " + (itemStack.getItemMeta() != null ? displayName : "Без имени")); - } - - - private void handleViewListCommand(Player player) { - player.sendMessage("Доступные view items:"); - itemManager.getViewItems().keySet().forEach(key -> player.sendMessage("- " + key)); - } - - private void sendViewHelp(Player player, String label) { - player.sendMessage("Команды для view:"); - player.sendMessage("/" + label + " view give - Выдать view item."); - player.sendMessage("/" + label + " view list - Показать список доступных view items."); - player.sendMessage("/" + label + " view help - Показать помощь для view."); - } + // тут реєструєш усі "верхньорівневі" команди тобто усі реалізації SubCommand + register(new GenericCommand<>( + "item", + "Управление предметами", + "/main item ", + ItemSubCommandFactory.createAll(itemManager) + )); + register(new GenericCommand<>( + "safezone", + "Управление SafeZone зонами", + "/main safezone ", + SafeZoneSubCommandFactory.createAll(manager) + )); - // --- Armor Commands --- - private void handleArmorCommands(Player player, String label, String[] args) { - if (args.length < 4) { - sendArmorHelp(player, label); - return; - } - - String action = args[2].toLowerCase(); - - switch (action) { - case "give" -> handleGiveCommand(player, label, args); - case "list" -> handleListCommand(player); - case "help" -> sendArmorHelp(player, label); - default -> player.sendMessage("Неизвестная команда для armor. Используйте /" + label + " armor help."); - } - } + register(new HelpCommand()); - private void handleGiveCommand(Player player, String label, String[] args) { - if (args.length < 4) { - player.sendMessage("Использование: /" + label + " armor give "); - return; - } - - String itemKey = args[3]; - var customItem = itemManager.getItem(itemKey); - - if (customItem == null) { - player.sendMessage("Предмет с ключом '" + itemKey + "' не найден."); - return; - } - - player.getInventory().addItem(customItem.getItemStack()); - player.sendMessage("Вам выдан предмет: " + customItem.getItemStack().getItemMeta().getDisplayName()); - } - private void handleListCommand(Player player) { - player.sendMessage("Доступные предметы:"); - itemManager.getItems().keySet().forEach(key -> player.sendMessage("- " + key)); + // register(new ReloadCommand(...)); } - private void sendArmorHelp(Player player, String label) { - player.sendMessage("Команды для armor:"); - player.sendMessage("/" + label + " armor give - Выдать предмет."); - player.sendMessage("/" + label + " armor list - Показать список доступных предметов."); - player.sendMessage("/" + label + " armor help - Показать помощь для armor."); + private void register(SubCommand subCommand) { + subCommands.put(subCommand.getName().toLowerCase(), subCommand); } - // --- Eat Commands --- - - private void handleEatCommands(Player player, String label, String[] args) { - if (args.length < 4) { - sendEatHelp(player, label); - return; - } - - String action = args[2].toLowerCase(); - - switch (action) { - case "give" -> handleEatGiveCommand(player, label, args); - case "list" -> handleEatListCommand(player); - case "help" -> sendEatHelp(player, label); - default -> player.sendMessage("Неизвестная команда для eat. Используйте /" + label + " eat help."); - } - } - private void handleEatGiveCommand(Player player, String label, String[] args) { - if (args.length < 4) { - player.sendMessage("Использование: /" + label + " eat give "); - return; + @Override + public boolean execute(CommandSender sender, String label, String[] args) { + if (!(sender instanceof Player player)) { + sender.sendMessage("Эту команду можно выполнять только игроком."); + return true; } - String itemKey = args[3]; - var eatItem = itemManager.getEatItem(itemKey); - - if (eatItem == null) { - player.sendMessage("Eat item с ключом '" + itemKey + "' не найден."); - return; + if (args.length == 0) { + player.sendMessage("§aИспользуйте /" + label + " help"); + return true; } - ItemStack itemStack = eatItem.getItemStack(); - if (itemStack == null) { - player.sendMessage("Eat item с ключом '" + itemKey + "' имеет некорректный ItemStack."); - return; + SubCommand sub = subCommands.get(args[0].toLowerCase()); + if (sub == null) { + player.sendMessage("§cНеизвестная подкоманда. Используйте /" + label + " help"); + return true; } - player.getInventory().addItem(itemStack); - player.sendMessage("Вам выдан eat item: " + (itemStack.getItemMeta() != null ? itemStack.getItemMeta().getDisplayName() : "Без имени")); + // делегуємо вниз, напр. в ItemCommand + return sub.execute(player, Arrays.copyOfRange(args, 1, args.length)); } - private void handleEatListCommand(Player player) { - player.sendMessage("Доступные eat items:"); - itemManager.getEatItems().keySet().forEach(key -> player.sendMessage("- " + key)); - } - - private void sendEatHelp(Player player, String label) { - player.sendMessage("Команды для eat:"); - player.sendMessage("/" + label + " eat give - Выдать eat item."); - player.sendMessage("/" + label + " eat list - Показать список доступных eat items."); - player.sendMessage("/" + label + " eat help - Показать помощь для eat."); - } - - @Override public List complete(CommandSender sender, String[] args) { - List suggestions = new ArrayList<>(); + if (!(sender instanceof Player player)) return List.of(); if (args.length == 1) { - // Предлагаем категории верхнего уровня - suggestions.addAll(List.of("item", "savezone")); - } else if (args.length == 2) { - String category = args[0].toLowerCase(); - if ("item".equals(category)) { - suggestions.addAll(List.of("armor", "view", "eat", "help")); - } - else if ("savezone".equals(category)) { - suggestions.addAll(List.of("pos1", "pos2", "save","list","remove")); - } - } else if (args.length == 3) { - String category = args[0].toLowerCase(); - String subCommand = args[1].toLowerCase(); - - if ("item".equals(category)) { - suggestions.add("give"); // Добавить сюда команду "give" - switch (subCommand) { - case "armor", "view", "eat" -> suggestions.addAll(List.of("give", "list", "help")); - } - } - - } else if (args.length == 4) { - String category = args[0].toLowerCase(); - String subCommand = args[1].toLowerCase(); - String action = args[2].toLowerCase(); + // показати верхньорівневі команди: item, savezone, reload + return new ArrayList<>(subCommands.keySet()); + } - if ("item".equals(category)) { - switch (subCommand) { - case "armor" -> { - if ("give".equals(action)) { - suggestions.addAll(itemManager.getItems().keySet()); - } - } - case "view" -> { - if ("give".equals(action)) { - suggestions.addAll(itemManager.getViewItems().keySet()); - } - } - case "eat" -> { - if ("give".equals(action)) { - suggestions.addAll(itemManager.getEatItems().keySet()); - } - } - } - } + SubCommand sub = subCommands.get(args[0].toLowerCase()); + if (sub != null) { + // делегуємо вниз, напр. ItemCommand → ArmorCommand → give + return sub.tabComplete(player, Arrays.copyOfRange(args, 1, args.length)); } - return suggestions; + return List.of(); } - - - - } diff --git a/src/main/java/dev/lotus/studio/command/SafeZoneCommand.java b/src/main/java/dev/lotus/studio/command/SafeZoneCommand.java deleted file mode 100644 index 38dd1d7..0000000 --- a/src/main/java/dev/lotus/studio/command/SafeZoneCommand.java +++ /dev/null @@ -1,114 +0,0 @@ -package dev.lotus.studio.command; - -import dev.lotus.studio.database.savezone.SafeZoneDataBase; -import dev.lotus.studio.database.savezone.SafeZoneDataService; -import dev.lotus.studio.safezone.SafeZone; -import dev.lotus.studio.safezone.SafeZoneManager; -import net.kyori.adventure.text.Component; -import org.apache.commons.lang3.tuple.ImmutablePair; -import org.apache.commons.lang3.tuple.Pair; -import org.bukkit.Location; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.HashMap; -import java.util.List; - -import static dev.lotus.studio.utils.MapperUtils.formatLocation; - -public class SafeZoneCommand { - private final SafeZoneManager safeZoneManager = SafeZoneManager.getInstance(); - - private Location pos1 = null; - private Location pos2 = null; - - - public boolean execute(CommandSender sender, String label, String[] args) { - if (!(sender instanceof Player player)) { - sender.sendMessage("only players can execute this command"); - return true; - } - if (!player.hasPermission("lotusOffSeason.savezone")) { - player.sendMessage("dont have permission"); - return true; - } - if (args.length < 2) { - player.sendMessage("no valid command: /lotus savezone pos1|pos2|save "); - return true; - } - - switch (args[1].toLowerCase()) { - case "pos1": - pos1 = player.getLocation(); - player.sendMessage("first point: " + formatLocation(pos1)); - break; - - case "pos2": - pos2 = player.getLocation(); - player.sendMessage("second point: " + formatLocation(pos2)); - break; - - case "save": - if (args.length < 3) { - player.sendMessage("set name to savezone: /lotus savezone save <назва>"); - return true; - } - saveZone(player, pos1, pos2, args[2]); - break; - - case "list": - listZones(player); - return true; - - case "remove": - if (args.length < 3) { - player.sendMessage("Укажіть ID зони: /lotus savezone remove "); - return true; - } - removeZone(player, Integer.parseInt(args[2])); - break; - - default: - player.sendMessage("Невідома команда. Використовуйте: pos1, pos2, save, list, remove."); - } - return true; - } - - private void saveZone(Player player, Location pos1, Location pos2, String zoneName) { - if (pos1 != null && pos2 != null) { - Pair zoneLoc = new ImmutablePair<>(pos1, pos2); - SafeZone safeZone = new SafeZone(zoneName, zoneLoc); - - // runtime - safeZoneManager.addSafeZone(safeZone); - - player.sendMessage("Зона '" + zoneName + "' успішно збережена."); - } else { - player.sendMessage("Будь ласка, спочатку встановіть обидві точки (pos1 і pos2)."); - } - } - - private void listZones(Player player) { - List safeZones = safeZoneManager.getDataZones(); - - if (safeZones.isEmpty()) { - player.sendMessage("немає зон."); - return; - } - - HashMap saveId = new HashMap<>(); - safeZones.forEach(zone -> saveId.put(zone.getSafeZoneName(), zone.getSafeZoneId())); - - player.sendMessage("Список зон:"); - saveId.forEach((name, id) -> - player.sendMessage(" - Назва: " + name + ", ID: " + id) - ); - } - - private void removeZone(Player player, int id) { - // runtime - safeZoneManager.removeSafeZone(id); - - player.sendMessage(Component.text("Safe zone with ID " + id + " deleted!")); - } -} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/GenericCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/GenericCommand.java new file mode 100644 index 0000000..9af02c6 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/GenericCommand.java @@ -0,0 +1,70 @@ +package dev.lotus.studio.command.subcommand; + + +import org.bukkit.entity.Player; + +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.stream.Collectors; + +public class GenericCommand implements SubCommand { + + private final String name; + private final String description; + private final String usage; + private final Collection subCommands; + + public GenericCommand(String name, String description, String usage, Collection subCommands) { + this.name = name; + this.description = description; + this.usage = usage; + this.subCommands = subCommands; + } + + @Override + public String getName() { return name; } + + @Override + public String getDescription() { return description; } + + @Override + public String getUsage() { return usage; } + + @Override + public boolean execute(Player player, String[] args) { + if (args.length == 0) { + player.sendMessage(getUsage()); + return true; + } + + String sub = args[0].toLowerCase(); + for (SubCommand cmd : subCommands) { + if (cmd.getName().equalsIgnoreCase(sub)) { + return cmd.execute(player, Arrays.copyOfRange(args, 1, args.length)); + } + } + + player.sendMessage("§cНеизвестная подкоманда. " + getUsage()); + return true; + } + + @Override + public List tabComplete(Player player, String[] args) { + if (args.length == 1) { + return subCommands.stream() + .map(SubCommand::getName) + .collect(Collectors.toList()); + } + + String sub = args[0].toLowerCase(); + for (SubCommand cmd : subCommands) { + if (cmd.getName().equalsIgnoreCase(sub)) { + return cmd.tabComplete(player, Arrays.copyOfRange(args, 1, args.length)); + } + } + + return List.of(); + } +} + diff --git a/src/main/java/dev/lotus/studio/command/subcommand/HelpCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/HelpCommand.java new file mode 100644 index 0000000..dc39e08 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/HelpCommand.java @@ -0,0 +1,31 @@ +package dev.lotus.studio.command.subcommand; + +import org.bukkit.entity.Player; + +import java.util.List; + +public class HelpCommand implements SubCommand { + @Override + public String getName() { return "help"; } + + @Override + public String getDescription() { return "Показує список доступних команд"; } + + @Override + public String getUsage() { return "/main help"; } + + @Override + public boolean execute(Player player, String[] args) { + player.sendMessage("§aДоступні команди:"); + player.sendMessage(" §e/item "); + player.sendMessage(" §e/savezone "); + player.sendMessage(" §e/help"); + return true; + } + + @Override + public List tabComplete(Player player, String[] args) { + return List.of(); + } +} + diff --git a/src/main/java/dev/lotus/studio/command/subcommand/ReloadCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/ReloadCommand.java new file mode 100644 index 0000000..e100dc2 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/ReloadCommand.java @@ -0,0 +1,4 @@ +package dev.lotus.studio.command.subcommand; + +public class ReloadCommand { +} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/SaveZoneCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/SaveZoneCommand.java new file mode 100644 index 0000000..5f49327 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/SaveZoneCommand.java @@ -0,0 +1,4 @@ +package dev.lotus.studio.command.subcommand; + +public class SaveZoneCommand { +} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/SubCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/SubCommand.java new file mode 100644 index 0000000..6df9e15 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/SubCommand.java @@ -0,0 +1,15 @@ +package dev.lotus.studio.command.subcommand; + + +import org.bukkit.entity.Player; + +import java.util.List; + +public interface SubCommand { + String getName(); + String getDescription(); + String getUsage(); + boolean execute(Player player, String[] args); + List tabComplete(Player player, String[] args); +} + diff --git a/src/main/java/dev/lotus/studio/command/subcommand/item/factory/AbstractItemSubCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/item/factory/AbstractItemSubCommand.java new file mode 100644 index 0000000..ee406cd --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/factory/AbstractItemSubCommand.java @@ -0,0 +1,13 @@ +package dev.lotus.studio.command.subcommand.item.factory; + +import dev.lotus.studio.command.subcommand.SubCommand; +import dev.lotus.studio.item.CustomItemManager; + +public abstract class AbstractItemSubCommand implements SubCommand { + protected final CustomItemManager itemManager; + + public AbstractItemSubCommand(CustomItemManager itemManager) { + this.itemManager = itemManager; + } + +} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/item/factory/ItemSubCommandFactory.java b/src/main/java/dev/lotus/studio/command/subcommand/item/factory/ItemSubCommandFactory.java new file mode 100644 index 0000000..0fa307a --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/factory/ItemSubCommandFactory.java @@ -0,0 +1,15 @@ +package dev.lotus.studio.command.subcommand.item.factory; + +import dev.lotus.studio.item.CustomItemManager; + +import java.util.Arrays; +import java.util.Collection; + +public class ItemSubCommandFactory { + public static Collection createAll(CustomItemManager itemManager) { + return Arrays.stream(ItemSubCommandType.values()) + .map(type -> type.create(itemManager)) + .toList(); + } +} + diff --git a/src/main/java/dev/lotus/studio/command/subcommand/item/factory/ItemSubCommandType.java b/src/main/java/dev/lotus/studio/command/subcommand/item/factory/ItemSubCommandType.java new file mode 100644 index 0000000..7b310c9 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/factory/ItemSubCommandType.java @@ -0,0 +1,32 @@ +package dev.lotus.studio.command.subcommand.item.factory; + +import dev.lotus.studio.command.subcommand.item.subcommand.ArmorCommand; +import dev.lotus.studio.command.subcommand.item.subcommand.EatCommand; +import dev.lotus.studio.command.subcommand.item.subcommand.ViewCommand; +import dev.lotus.studio.item.CustomItemManager; + + + +public enum ItemSubCommandType { + ARMOR(ArmorCommand.class), + VIEW(ViewCommand.class), + EAT(EatCommand.class); + + private final Class clazz; + + ItemSubCommandType(Class clazz) { + this.clazz = clazz; + } + + public AbstractItemSubCommand create(CustomItemManager itemManager) { + try { + var constructor = clazz.getDeclaredConstructor(CustomItemManager.class); + constructor.setAccessible(true); // робимо доступним навіть якщо protected/package-private + return constructor.newInstance(itemManager); + } catch (Exception e) { + throw new RuntimeException("Не удалось создать команду: " + clazz.getSimpleName(), e); + } + } +} + + diff --git a/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ArmorCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ArmorCommand.java new file mode 100644 index 0000000..63cd1af --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ArmorCommand.java @@ -0,0 +1,80 @@ +package dev.lotus.studio.command.subcommand.item.subcommand; + + +import dev.lotus.studio.command.subcommand.item.factory.AbstractItemSubCommand; +import dev.lotus.studio.item.CustomItemManager; +import dev.lotus.studio.utils.ItemNameUtil; +import org.bukkit.entity.Player; + +import java.util.List; + +public class ArmorCommand extends AbstractItemSubCommand { + + ArmorCommand(CustomItemManager itemManager) { + super(itemManager); + } + + @Override + public String getName() { + return "armor"; + } + + @Override + public String getDescription() { + return "Управление предметами брони"; + } + + @Override + public String getUsage() { + return "/main item armor "; + } + + @Override + public boolean execute(Player player, String[] args) { + if (args.length == 0) { + player.sendMessage("§7Использование: " + getUsage()); + return true; + } + + switch (args[0].toLowerCase()) { + case "give" -> { + if (args.length < 2) { + player.sendMessage("§7Использование: /main item armor give "); + return true; + } + var customItem = itemManager.getItem(args[1]); + if (customItem == null) { + player.sendMessage("§cItem '" + args[1] + "' не найден!"); + return true; + } + player.getInventory().addItem(customItem.getItemStack()); + player.sendMessage("§aВыдан предмет: " + ItemNameUtil.getItemName(customItem.getItemStack())); + } + case "list" -> { + player.sendMessage("§aСписок предметов брони:"); + itemManager.getItems().keySet().forEach(key -> player.sendMessage("- " + key)); + } + case "help" -> { + player.sendMessage("§aArmor команды:"); + player.sendMessage("/main item armor give "); + player.sendMessage("/main item armor list"); + player.sendMessage("/main item armor help"); + } + default -> player.sendMessage("§cНеизвестная команда. " + getUsage()); + } + + return true; + } + + @Override + public List tabComplete(Player player, String[] args) { + if (args.length == 1) { + return List.of("give", "list", "help"); + } + if (args.length == 2 && args[0].equalsIgnoreCase("give")) { + return itemManager.getItems().keySet().stream().toList(); + } + return List.of(); + } +} + diff --git a/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/EatCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/EatCommand.java new file mode 100644 index 0000000..5d6a240 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/EatCommand.java @@ -0,0 +1,83 @@ +package dev.lotus.studio.command.subcommand.item.subcommand; + +import dev.lotus.studio.command.subcommand.item.factory.AbstractItemSubCommand; +import dev.lotus.studio.item.CustomItemManager; +import dev.lotus.studio.utils.ItemNameUtil; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public class EatCommand extends AbstractItemSubCommand { + + EatCommand(CustomItemManager itemManager) { + super(itemManager); + } + + @Override + public String getName() { + return "eat"; + } + + @Override + public String getDescription() { + return "Управление съедобными предметами"; + } + + @Override + public String getUsage() { + return "/main item eat "; + } + + @Override + public boolean execute(Player player, String[] args) { + if (args.length == 0) { + player.sendMessage("§7Использование: " + getUsage()); + return true; + } + + switch (args[0].toLowerCase()) { + case "give" -> { + if (args.length < 2) { + player.sendMessage("§7Использование: /main item eat give "); + return true; + } + var eatItem = itemManager.getEatItem(args[1]); + if (eatItem == null) { + player.sendMessage("§cEat item '" + args[1] + "' не найден!"); + return true; + } + ItemStack itemStack = eatItem.getItemStack(); + player.getInventory().addItem(itemStack); + player.sendMessage("§aВыдан eat item: " + + (itemStack.getItemMeta() != null + ? ItemNameUtil.getItemName(itemStack) + : "Без имени")); + } + case "list" -> { + player.sendMessage("§aСписок съедобных предметов:"); + itemManager.getEatItems().keySet().forEach(key -> player.sendMessage("- " + key)); + } + case "help" -> { + player.sendMessage("§aEat команды:"); + player.sendMessage("/main item eat give "); + player.sendMessage("/main item eat list"); + player.sendMessage("/main item eat help"); + } + default -> player.sendMessage("§cНеизвестная команда. " + getUsage()); + } + + return true; + } + + @Override + public List tabComplete(Player player, String[] args) { + if (args.length == 1) { + return List.of("give", "list", "help"); + } + if (args.length == 2 && args[0].equalsIgnoreCase("give")) { + return itemManager.getEatItems().keySet().stream().toList(); + } + return List.of(); + } +} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ViewCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ViewCommand.java new file mode 100644 index 0000000..b4323bd --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ViewCommand.java @@ -0,0 +1,83 @@ +package dev.lotus.studio.command.subcommand.item.subcommand; + +import dev.lotus.studio.command.subcommand.item.factory.AbstractItemSubCommand; +import dev.lotus.studio.item.CustomItemManager; +import dev.lotus.studio.utils.ItemNameUtil; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import java.util.List; + +public class ViewCommand extends AbstractItemSubCommand { + + ViewCommand(CustomItemManager itemManager) { + super(itemManager); + } + + @Override + public String getName() { + return "view"; + } + + @Override + public String getDescription() { + return "Управление view предметами"; + } + + @Override + public String getUsage() { + return "/main item view "; + } + + @Override + public boolean execute(Player player, String[] args) { + if (args.length == 0) { + player.sendMessage("§7Использование: " + getUsage()); + return true; + } + + switch (args[0].toLowerCase()) { + case "give" -> { + if (args.length < 2) { + player.sendMessage("§7Использование: /main item view give "); + return true; + } + var viewItem = itemManager.getViewItem(args[1]); + if (viewItem == null) { + player.sendMessage("§cView item '" + args[1] + "' не найден!"); + return true; + } + ItemStack itemStack = viewItem.getItemStack(); + player.getInventory().addItem(itemStack); + player.sendMessage("§aВыдан view item: " + + (itemStack.getItemMeta() != null + ? ItemNameUtil.getItemName(itemStack) + : "Без имени")); + } + case "list" -> { + player.sendMessage("§aСписок view предметов:"); + itemManager.getViewItems().keySet().forEach(key -> player.sendMessage("- " + key)); + } + case "help" -> { + player.sendMessage("§aView команды:"); + player.sendMessage("/main item view give "); + player.sendMessage("/main item view list"); + player.sendMessage("/main item view help"); + } + default -> player.sendMessage("§cНеизвестная команда. " + getUsage()); + } + + return true; + } + + @Override + public List tabComplete(Player player, String[] args) { + if (args.length == 1) { + return List.of("give", "list", "help"); + } + if (args.length == 2 && args[0].equalsIgnoreCase("give")) { + return itemManager.getViewItems().keySet().stream().toList(); + } + return List.of(); + } +} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/AbstractSafeZoneSubCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/AbstractSafeZoneSubCommand.java new file mode 100644 index 0000000..69c2e31 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/AbstractSafeZoneSubCommand.java @@ -0,0 +1,14 @@ +package dev.lotus.studio.command.subcommand.safezone.factory; + + +import dev.lotus.studio.command.subcommand.SubCommand; +import dev.lotus.studio.safezone.SafeZoneManager; + +public abstract class AbstractSafeZoneSubCommand implements SubCommand { + protected final SafeZoneManager manager; + + protected AbstractSafeZoneSubCommand(SafeZoneManager manager) { + this.manager = manager; + } +} + diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/SafeZoneSubCommandFactory.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/SafeZoneSubCommandFactory.java new file mode 100644 index 0000000..216a7a5 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/SafeZoneSubCommandFactory.java @@ -0,0 +1,16 @@ +package dev.lotus.studio.command.subcommand.safezone.factory; + + +import dev.lotus.studio.safezone.SafeZoneManager; + +import java.util.Arrays; +import java.util.Collection; + +public class SafeZoneSubCommandFactory { + public static Collection createAll(SafeZoneManager manager) { + return Arrays.stream(SafeZoneSubCommandType.values()) + .map(type -> type.create(manager)) + .toList(); + } +} + diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/SafeZoneSubCommandType.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/SafeZoneSubCommandType.java new file mode 100644 index 0000000..c007a55 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/SafeZoneSubCommandType.java @@ -0,0 +1,29 @@ +package dev.lotus.studio.command.subcommand.safezone.factory; + +import dev.lotus.studio.command.subcommand.safezone.subcommand.*; +import dev.lotus.studio.item.CustomItemManager; +import dev.lotus.studio.safezone.SafeZoneManager; + +public enum SafeZoneSubCommandType { + POS1(SafeZonePos1Command.class), + POS2(SafeZonePos2Command.class), + SAVE(SafeZoneSaveCommand.class), + LIST(SafeZoneListCommand.class), + REMOVE(SafeZoneRemoveCommand.class); + + private final Class clazz; + + SafeZoneSubCommandType(Class clazz) { + this.clazz = clazz; + } + + public AbstractSafeZoneSubCommand create(SafeZoneManager manager) { + try { + var constructor = clazz.getDeclaredConstructor(SafeZoneManager.class); + constructor.setAccessible(true); // робимо доступним навіть якщо protected/package-private + return constructor.newInstance(manager); + } catch (Exception e) { + throw new RuntimeException("Не удалось создать команду: " + clazz.getSimpleName(), e); + } + } +} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneListCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneListCommand.java new file mode 100644 index 0000000..1accf1a --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneListCommand.java @@ -0,0 +1,53 @@ +package dev.lotus.studio.command.subcommand.safezone.subcommand; + +import dev.lotus.studio.command.subcommand.safezone.factory.AbstractSafeZoneSubCommand; +import dev.lotus.studio.database.savezone.SafeZoneDataBase; +import dev.lotus.studio.safezone.SafeZoneManager; +import org.bukkit.entity.Player; + +import java.util.List; + +public class SafeZoneListCommand extends AbstractSafeZoneSubCommand { + + SafeZoneListCommand(SafeZoneManager manager) { + super(manager); + } + + @Override + public String getName() { + return "list"; + } + + @Override + public String getDescription() { + return "Список усіх збережених зон"; + } + + @Override + public String getUsage() { + return "/main safezone list"; + } + + @Override + public boolean execute(Player player, String[] args) { + List safeZones = manager.getDataZones(); + + if (safeZones.isEmpty()) { + player.sendMessage("§cНемає збережених зон."); + return true; + } + + player.sendMessage("§aСписок зон:"); + for (SafeZoneDataBase zone : safeZones) { + player.sendMessage(" - Назва: " + zone.getSafeZoneName() + ", ID: " + zone.getSafeZoneId()); + } + + return true; + } + + @Override + public List tabComplete(Player player, String[] args) { + // Для списку зон автозаповнення не потрібне + return List.of(); + } +} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos1Command.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos1Command.java new file mode 100644 index 0000000..86e7b6c --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos1Command.java @@ -0,0 +1,45 @@ +package dev.lotus.studio.command.subcommand.safezone.subcommand; + +import dev.lotus.studio.command.subcommand.safezone.factory.AbstractSafeZoneSubCommand; +import dev.lotus.studio.safezone.SafeZoneManager; +import org.bukkit.entity.Player; +import org.bukkit.Location; + +import java.util.List; + +import static dev.lotus.studio.utils.MapperUtils.formatLocation; + +public class SafeZonePos1Command extends AbstractSafeZoneSubCommand { + + SafeZonePos1Command(SafeZoneManager manager) { + super(manager); + } + + @Override + public String getName() { + return "pos1"; + } + + @Override + public String getDescription() { + return "Встановлює першу точку зони"; + } + + @Override + public String getUsage() { + return "/main safezone pos1"; + } + + @Override + public boolean execute(Player player, String[] args) { + Location pos1 = player.getLocation(); + manager.setTempPos1(player.getUniqueId(), pos1); // зберігаємо тимчасово у менеджері + player.sendMessage("§aПерша точка зони встановлена: " + formatLocation(pos1)); + return true; + } + + @Override + public List tabComplete(Player player, String[] args) { + return List.of(); + } +} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos2Command.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos2Command.java new file mode 100644 index 0000000..d4a6629 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos2Command.java @@ -0,0 +1,43 @@ +package dev.lotus.studio.command.subcommand.safezone.subcommand; + +import dev.lotus.studio.command.subcommand.safezone.factory.AbstractSafeZoneSubCommand; +import dev.lotus.studio.safezone.SafeZoneManager; +import org.bukkit.entity.Player; + +import java.util.List; + +import static dev.lotus.studio.utils.MapperUtils.formatLocation; + +public class SafeZonePos2Command extends AbstractSafeZoneSubCommand { + + SafeZonePos2Command(SafeZoneManager manager) { + super(manager); + } + + @Override + public String getName() { + return "pos2"; + } + + @Override + public String getDescription() { + return "Встановлює другу точку для SafeZone"; + } + + @Override + public String getUsage() { + return "/main safezone pos2"; + } + + @Override + public boolean execute(Player player, String[] args) { + manager.setTempPos2(player.getUniqueId(), player.getLocation()); + player.sendMessage("Друга точка встановлена: " + formatLocation(player.getLocation())); + return true; + } + + @Override + public List tabComplete(Player player, String[] args) { + return List.of(); + } +} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneRemoveCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneRemoveCommand.java new file mode 100644 index 0000000..31c6957 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneRemoveCommand.java @@ -0,0 +1,64 @@ +package dev.lotus.studio.command.subcommand.safezone.subcommand; + +import dev.lotus.studio.command.subcommand.safezone.factory.AbstractSafeZoneSubCommand; +import dev.lotus.studio.safezone.SafeZoneManager; +import net.kyori.adventure.text.Component; +import org.bukkit.entity.Player; + +import java.util.List; + +public class SafeZoneRemoveCommand extends AbstractSafeZoneSubCommand { + /** + * TODO: Зробити по іменні видалення зон + * @param manager + */ + SafeZoneRemoveCommand(SafeZoneManager manager) { + super(manager); + } + + @Override + public String getName() { + return "remove"; + } + + @Override + public String getDescription() { + return "Видаляє SafeZone за вказаним ID"; + } + + @Override + public String getUsage() { + return "/main safezone remove "; + } + + @Override + public boolean execute(Player player, String[] args) { + if (args.length < 1) { // перевіряємо, що після remove є аргумент + player.sendMessage("Вкажіть ID зони: " + getUsage()); + return true; + } + + int zoneId; + try { + zoneId = Integer.parseInt(args[0]); // тут беремо args[0], бо виклик передає вже відсічені аргументи + } catch (NumberFormatException e) { + player.sendMessage("§cНекоректний ID зони!"); + return true; + } + + manager.removeSafeZone(zoneId); + player.sendMessage(Component.text("SafeZone з ID " + zoneId + " видалено!")); + return true; + } + + + @Override + public List tabComplete(Player player, String[] args) { + if (args.length == 1) { + return manager.getDataZones().stream() + .map(zone -> String.valueOf(zone.getSafeZoneId())) + .toList(); + } + return List.of(); + } +} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneSaveCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneSaveCommand.java new file mode 100644 index 0000000..a2d35a1 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneSaveCommand.java @@ -0,0 +1,64 @@ +package dev.lotus.studio.command.subcommand.safezone.subcommand; + +import dev.lotus.studio.command.subcommand.safezone.factory.AbstractSafeZoneSubCommand; +import dev.lotus.studio.safezone.SafeZoneManager; +import dev.lotus.studio.safezone.SafeZone; +import org.apache.commons.lang3.tuple.ImmutablePair; +import org.bukkit.entity.Player; + +import java.util.Arrays; +import java.util.List; + +public class SafeZoneSaveCommand extends AbstractSafeZoneSubCommand { + + SafeZoneSaveCommand(SafeZoneManager manager) { + super(manager); + } + + @Override + public String getName() { + return "save"; + } + + @Override + public String getDescription() { + return "Зберігає SafeZone після встановлення pos1 та pos2"; + } + + @Override + public String getUsage() { + return "/main safezone save <назва>"; + } + + @Override + public boolean execute(Player player, String[] args) { + System.out.println(Arrays.toString(args)); + if (args.length < 1) { + player.sendMessage("Вкажіть назву зони: " + getUsage()); + return true; + } + + + String zoneName = args[0]; + + var pos1 = manager.getTempPos1(player.getUniqueId()); + var pos2 = manager.getTempPos2(player.getUniqueId()); + + if (pos1 == null || pos2 == null) { + player.sendMessage("Будь ласка, спочатку встановіть обидві точки (pos1 і pos2)."); + return true; + } + + SafeZone safeZone = new SafeZone(zoneName, new ImmutablePair<>(pos1, pos2)); + manager.addSafeZone(safeZone); + + player.sendMessage("Зона '" + zoneName + "' успішно збережена."); + return true; + } + + + @Override + public List tabComplete(Player player, String[] args) { + return List.of(); + } +} diff --git a/src/main/java/dev/lotus/studio/safezone/SafeZoneManager.java b/src/main/java/dev/lotus/studio/safezone/SafeZoneManager.java index 596bd81..2b23513 100644 --- a/src/main/java/dev/lotus/studio/safezone/SafeZoneManager.java +++ b/src/main/java/dev/lotus/studio/safezone/SafeZoneManager.java @@ -11,6 +11,9 @@ import dev.lotus.studio.database.savezone.SafeZoneDataService; import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; public class SafeZoneManager { @@ -20,12 +23,15 @@ public class SafeZoneManager { private SafeZoneDataService safeZoneDataService; + private final Map tempPos1 = new ConcurrentHashMap<>(); + private final Map tempPos2 = new ConcurrentHashMap<>(); + // Кеш із TTL (щоб вивантажувати непотрібні зони) + private final Cache zoneCache = CacheBuilder.newBuilder() .expireAfterAccess(5, TimeUnit.MINUTES) .maximumSize(500) // захист від переповнення .build(); - private SafeZonePreloaded preloader; public static SafeZoneManager getInstance() { @@ -40,6 +46,7 @@ public void initialize(SafeZoneDataService safeZoneDataService) { } // Додавання нової зони + public void addSafeZone(SafeZone safeZone) { zoneCache.put(safeZone.getZoneID(), safeZone); safeZoneDataService.saveProtectZone( @@ -47,14 +54,14 @@ public void addSafeZone(SafeZone safeZone) { SafeZoneUtils.serializeZone(safeZone.getLocationPair()) ); } - // Видалення + public void removeSafeZone(int zoneID) { zoneCache.invalidate(zoneID); safeZoneDataService.removeProtectZone(zoneID); } - // Отримання зони з кешу (або БД, якщо немає в кеші) + public void getZoneById(int zoneID) { SafeZone cached = zoneCache.getIfPresent(zoneID); if (cached != null) { @@ -73,8 +80,8 @@ public void getZoneById(int zoneID) { } } - // Перевірка чи гравець в якійсь зоні + public boolean isPlayerInAnyZone(Player player) { Location playerLoc = player.getLocation(); for (SafeZone zone : zoneCache.asMap().values()) { @@ -86,7 +93,6 @@ public boolean isPlayerInAnyZone(Player player) { } return false; } - public List getDataZones(){ return safeZoneDataService.getAllSaveZones(); } @@ -95,4 +101,25 @@ public List getDataZones(){ public SafeZonePreloaded getPreloaded() { return preloader; } + + public void setTempPos1(UUID playerUUID, Location pos) { + tempPos1.put(playerUUID, pos); + } + + public Location getTempPos1(UUID playerUUID) { + return tempPos1.get(playerUUID); + } + + public void setTempPos2(UUID playerUUID, Location pos) { + tempPos2.put(playerUUID, pos); + } + + public Location getTempPos2(UUID playerUUID) { + return tempPos2.get(playerUUID); + } + + public void removeTempPositions(UUID playerUUID) { + tempPos1.remove(playerUUID); + tempPos2.remove(playerUUID); + } } diff --git a/src/main/java/dev/lotus/studio/utils/ItemNameUtil.java b/src/main/java/dev/lotus/studio/utils/ItemNameUtil.java new file mode 100644 index 0000000..a669163 --- /dev/null +++ b/src/main/java/dev/lotus/studio/utils/ItemNameUtil.java @@ -0,0 +1,16 @@ +package dev.lotus.studio.utils; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; + +public class ItemNameUtil { + public static String getItemName(ItemStack itemStack) { + ItemMeta meta = itemStack.getItemMeta(); + if (meta == null || !meta.hasDisplayName()) { + return itemStack.getType().name(); // якщо нема кастомного імені + } + Component name = meta.displayName(); + return PlainTextComponentSerializer.plainText().serialize(name); + } +} From 76c45caf93f142e6d504781fbdf13c129a7da535 Mon Sep 17 00:00:00 2001 From: Referix Date: Thu, 25 Sep 2025 01:52:54 +0300 Subject: [PATCH 2/4] start work reload command --- src/main/java/dev/lotus/studio/Main.java | 6 ++- .../dev/lotus/studio/command/MainCommand.java | 13 +++-- .../command/subcommand/ReloadCommand.java | 4 -- .../command/subcommand/SaveZoneCommand.java | 4 -- .../reload/factory/AbstractReloadCommand.java | 15 ++++++ .../reload/factory/ReloadSubCommandType.java | 28 ++++++++++ .../reload/subcommand/AllReloadSub.java | 54 +++++++++++++++++++ .../reload/subcommand/ItemReloadSub.java | 51 ++++++++++++++++++ 8 files changed, 162 insertions(+), 13 deletions(-) delete mode 100644 src/main/java/dev/lotus/studio/command/subcommand/ReloadCommand.java delete mode 100644 src/main/java/dev/lotus/studio/command/subcommand/SaveZoneCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/reload/factory/AbstractReloadCommand.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandType.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/AllReloadSub.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/ItemReloadSub.java diff --git a/src/main/java/dev/lotus/studio/Main.java b/src/main/java/dev/lotus/studio/Main.java index d304c84..2c17938 100644 --- a/src/main/java/dev/lotus/studio/Main.java +++ b/src/main/java/dev/lotus/studio/Main.java @@ -2,6 +2,7 @@ import dev.lotus.studio.database.DatabaseInitializer; import dev.lotus.studio.database.playerdata.PlayerDataService; +import dev.lotus.studio.safezone.SafeZonePreloaded; import org.bukkit.event.HandlerList; import org.bukkit.plugin.java.JavaPlugin; import dev.lotus.studio.database.savezone.SafeZoneDataService; @@ -14,6 +15,7 @@ import dev.lotus.studio.playerdata.PlayerManager; import dev.lotus.studio.safezone.SafeZoneManager; +import java.util.Optional; import java.util.logging.Level; public final class Main extends JavaPlugin { @@ -67,7 +69,9 @@ public boolean initialize() { @Override public void onDisable() { PlayerManager.getInstance().getGlobalTask().cancel(); - SafeZoneManager.getInstance().getPreloaded().stopTask(); + Optional.ofNullable(SafeZoneManager.getInstance().getPreloaded()) + .ifPresent(SafeZonePreloaded::stopTask); + // Закриття DataBase if (databaseInitializer != null) { databaseInitializer.closeConnection(); diff --git a/src/main/java/dev/lotus/studio/command/MainCommand.java b/src/main/java/dev/lotus/studio/command/MainCommand.java index 7f97577..9e51ed3 100644 --- a/src/main/java/dev/lotus/studio/command/MainCommand.java +++ b/src/main/java/dev/lotus/studio/command/MainCommand.java @@ -4,6 +4,7 @@ import dev.lotus.studio.command.subcommand.HelpCommand; import dev.lotus.studio.command.subcommand.SubCommand; import dev.lotus.studio.command.subcommand.item.factory.ItemSubCommandFactory; +import dev.lotus.studio.command.subcommand.reload.factory.ReloadSubCommandFactory; import dev.lotus.studio.command.subcommand.safezone.factory.SafeZoneSubCommandFactory; import dev.lotus.studio.item.CustomItemManager; import dev.lotus.studio.safezone.SafeZoneManager; @@ -15,7 +16,7 @@ public class MainCommand extends AbstractCommand { private final Map subCommands = new HashMap<>(); - public MainCommand(String command, CustomItemManager itemManager, SafeZoneManager manager) { + public MainCommand(String command, CustomItemManager itemManager, SafeZoneManager safeZoneManager) { super(command); // тут реєструєш усі "верхньорівневі" команди тобто усі реалізації SubCommand @@ -30,13 +31,17 @@ public MainCommand(String command, CustomItemManager itemManager, SafeZoneManage "safezone", "Управление SafeZone зонами", "/main safezone ", - SafeZoneSubCommandFactory.createAll(manager) + SafeZoneSubCommandFactory.createAll(safeZoneManager) )); - register(new HelpCommand()); + register(new GenericCommand<>( + "reload", + "Reload commands", + "main", + ReloadSubCommandFactory.createAll(safeZoneManager, itemManager))); + register(new HelpCommand()); - // register(new ReloadCommand(...)); } private void register(SubCommand subCommand) { diff --git a/src/main/java/dev/lotus/studio/command/subcommand/ReloadCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/ReloadCommand.java deleted file mode 100644 index e100dc2..0000000 --- a/src/main/java/dev/lotus/studio/command/subcommand/ReloadCommand.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.lotus.studio.command.subcommand; - -public class ReloadCommand { -} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/SaveZoneCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/SaveZoneCommand.java deleted file mode 100644 index 5f49327..0000000 --- a/src/main/java/dev/lotus/studio/command/subcommand/SaveZoneCommand.java +++ /dev/null @@ -1,4 +0,0 @@ -package dev.lotus.studio.command.subcommand; - -public class SaveZoneCommand { -} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/AbstractReloadCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/AbstractReloadCommand.java new file mode 100644 index 0000000..da87677 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/AbstractReloadCommand.java @@ -0,0 +1,15 @@ +package dev.lotus.studio.command.subcommand.reload.factory; + +import dev.lotus.studio.command.subcommand.SubCommand; +import dev.lotus.studio.item.CustomItemManager; +import dev.lotus.studio.safezone.SafeZoneManager; + +public abstract class AbstractReloadCommand implements SubCommand { + protected final CustomItemManager itemManager; + protected final SafeZoneManager safeZoneManager; + + protected AbstractReloadCommand(CustomItemManager itemManager , SafeZoneManager safeZoneManager) { + this.itemManager = itemManager; + this.safeZoneManager = safeZoneManager; + } +} \ No newline at end of file diff --git a/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandType.java b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandType.java new file mode 100644 index 0000000..89b1caf --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandType.java @@ -0,0 +1,28 @@ +package dev.lotus.studio.command.subcommand.reload.factory; + + +import dev.lotus.studio.command.subcommand.reload.subcommand.AllReloadSub; +import dev.lotus.studio.command.subcommand.reload.subcommand.ItemReloadSub; +import dev.lotus.studio.item.CustomItemManager; +import dev.lotus.studio.safezone.SafeZoneManager; + +public enum ReloadSubCommandType { + ITEMS(ItemReloadSub.class), + ALL(AllReloadSub.class); + + private final Class clazz; + + ReloadSubCommandType(Class clazz) { + this.clazz = clazz; + } + + public AbstractReloadCommand create(SafeZoneManager manager, CustomItemManager itemManager) { + try { + var constructor = clazz.getDeclaredConstructor(CustomItemManager.class, SafeZoneManager.class); + constructor.setAccessible(true); + return constructor.newInstance(itemManager, manager); + } catch (Exception e) { + throw new RuntimeException("Не удалось создать команду: " + clazz.getSimpleName(), e); + } + } +} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/AllReloadSub.java b/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/AllReloadSub.java new file mode 100644 index 0000000..4738594 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/AllReloadSub.java @@ -0,0 +1,54 @@ +package dev.lotus.studio.command.subcommand.reload.subcommand; + +import dev.lotus.studio.Main; +import dev.lotus.studio.command.subcommand.reload.factory.AbstractReloadCommand; +import dev.lotus.studio.item.CustomItemManager; +import dev.lotus.studio.safezone.SafeZoneManager; +import net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.entity.Player; +import org.enginehub.piston.CommandManager; + +import java.util.List; +import java.util.Optional; + +public class AllReloadSub extends AbstractReloadCommand { + public AllReloadSub(CustomItemManager itemManager , SafeZoneManager safeZoneManager) { + super(itemManager, safeZoneManager); + } + + @Override + public String getName() { + return "all"; + } + + @Override + public String getDescription() { + return "test"; + } + + @Override + public String getUsage() { + return "/main reload all"; + } + + @Override + public boolean execute(Player player, String[] args) { + if (args.length == 0){ + try { + Optional.ofNullable(Main.getInstance()).ifPresent(Main::initialize); + player.sendMessage(Component.text("Reload successful!").color(TextColor.color(0x980B))); + } catch (IllegalStateException e) { + player.sendMessage(Component.text(e.getMessage()).color(TextColor.color(0x981A00))); + System.out.println(e.getMessage()); + } + return true; + } else player.sendMessage(getUsage()); + return true; + } + + @Override + public List tabComplete(Player player, String[] args) { + return List.of(); + } +} diff --git a/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/ItemReloadSub.java b/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/ItemReloadSub.java new file mode 100644 index 0000000..7a27e02 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/ItemReloadSub.java @@ -0,0 +1,51 @@ +package dev.lotus.studio.command.subcommand.reload.subcommand; + +import dev.lotus.studio.command.subcommand.reload.factory.AbstractReloadCommand; +import dev.lotus.studio.item.CustomItemManager; +import dev.lotus.studio.safezone.SafeZoneManager; +import org.bukkit.entity.Player; + +import java.util.List; + +public class ItemReloadSub extends AbstractReloadCommand { + /** + * TODO: Прибрати @param safeZoneManager повныстю з архітектури релоаду! + * @param itemManager + * @param safeZoneManager + */ + public ItemReloadSub(CustomItemManager itemManager , SafeZoneManager safeZoneManager) { + super(itemManager, safeZoneManager); + } + + @Override + public String getName() { + return "item"; + } + + @Override + public String getDescription() { + return "items reload"; + } + + @Override + public String getUsage() { + return "reload all items"; + } + + @Override + public boolean execute(Player player, String[] args) { + if (args.length == 0){ + try { + itemManager.reloadItemConfig(); + } catch (Exception ignored){ + + } + } + return false; + } + + @Override + public List tabComplete(Player player, String[] args) { + return List.of(); + } +} From 73b8e6677cf4950189a695ac0acb6f3baf027ba2 Mon Sep 17 00:00:00 2001 From: Referix Date: Thu, 25 Sep 2025 13:43:57 +0300 Subject: [PATCH 3/4] feat: finish work system command, all work a generic(remove duplicate code), easy to integrate api, --- .../dev/lotus/studio/command/MainCommand.java | 5 +--- .../command/subcommand/GenericCommand.java | 23 ++++++++++++----- .../command/subcommand/HelpCommand.java | 2 -- .../studio/command/subcommand/SubCommand.java | 9 ++++++- .../command/subcommand/SubCommandFactory.java | 18 +++++++++++++ .../item/factory/ItemSubCommandFactory.java | 8 +++--- .../item/subcommand/ArmorCommand.java | 14 ++++------- .../item/subcommand/EatCommand.java | 14 ++++------- .../item/subcommand/ViewCommand.java | 14 ++++------- .../reload/factory/AbstractReloadCommand.java | 5 +--- .../factory/ReloadSubCommandFactory.java | 18 +++++++++++++ .../reload/factory/ReloadSubCommandType.java | 7 +++--- .../reload/subcommand/AllReloadSub.java | 14 +++-------- .../reload/subcommand/ItemReloadSub.java | 25 ++++++++----------- .../factory/SafeZoneSubCommandFactory.java | 8 +++--- .../subcommand/SafeZoneListCommand.java | 12 ++++----- .../subcommand/SafeZonePos1Command.java | 10 ++++---- .../subcommand/SafeZonePos2Command.java | 10 ++++---- .../subcommand/SafeZoneRemoveCommand.java | 21 ++++++---------- .../subcommand/SafeZoneSaveCommand.java | 12 +++------ .../studio/safezone/SafeZoneManager.java | 6 +++-- 21 files changed, 134 insertions(+), 121 deletions(-) create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/SubCommandFactory.java create mode 100644 src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandFactory.java diff --git a/src/main/java/dev/lotus/studio/command/MainCommand.java b/src/main/java/dev/lotus/studio/command/MainCommand.java index 9e51ed3..1d83301 100644 --- a/src/main/java/dev/lotus/studio/command/MainCommand.java +++ b/src/main/java/dev/lotus/studio/command/MainCommand.java @@ -22,23 +22,20 @@ public MainCommand(String command, CustomItemManager itemManager, SafeZoneManage // тут реєструєш усі "верхньорівневі" команди тобто усі реалізації SubCommand register(new GenericCommand<>( "item", - "Управление предметами", "/main item ", ItemSubCommandFactory.createAll(itemManager) )); register(new GenericCommand<>( "safezone", - "Управление SafeZone зонами", "/main safezone ", SafeZoneSubCommandFactory.createAll(safeZoneManager) )); register(new GenericCommand<>( "reload", - "Reload commands", "main", - ReloadSubCommandFactory.createAll(safeZoneManager, itemManager))); + ReloadSubCommandFactory.createAll(itemManager))); register(new HelpCommand()); diff --git a/src/main/java/dev/lotus/studio/command/subcommand/GenericCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/GenericCommand.java index 9af02c6..04d0c31 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/GenericCommand.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/GenericCommand.java @@ -11,13 +11,11 @@ public class GenericCommand implements SubCommand { private final String name; - private final String description; private final String usage; private final Collection subCommands; - public GenericCommand(String name, String description, String usage, Collection subCommands) { + public GenericCommand(String name, String usage, Collection subCommands) { this.name = name; - this.description = description; this.usage = usage; this.subCommands = subCommands; } @@ -25,11 +23,24 @@ public GenericCommand(String name, String description, String usage, Collection< @Override public String getName() { return name; } - @Override - public String getDescription() { return description; } @Override - public String getUsage() { return usage; } + public String getUsage() { + String children = subCommands.stream() + .map(SubCommand::getName) + .reduce((a, b) -> a + "|" + b) + .orElse(""); + return "/" + name + " <" + children + ">"; + } + + public String getFullUsage(String parentChain) { + String full = (parentChain == null || parentChain.isEmpty()) + ? name + : parentChain + " " + name; + + return "/" + full + " ..."; // для опису групи + } + @Override public boolean execute(Player player, String[] args) { diff --git a/src/main/java/dev/lotus/studio/command/subcommand/HelpCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/HelpCommand.java index dc39e08..e11f695 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/HelpCommand.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/HelpCommand.java @@ -8,8 +8,6 @@ public class HelpCommand implements SubCommand { @Override public String getName() { return "help"; } - @Override - public String getDescription() { return "Показує список доступних команд"; } @Override public String getUsage() { return "/main help"; } diff --git a/src/main/java/dev/lotus/studio/command/subcommand/SubCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/SubCommand.java index 6df9e15..97a321c 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/SubCommand.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/SubCommand.java @@ -7,9 +7,16 @@ public interface SubCommand { String getName(); - String getDescription(); String getUsage(); boolean execute(Player player, String[] args); List tabComplete(Player player, String[] args); + + default String getFullUsage(String parentChain) { + if (parentChain == null || parentChain.isEmpty()) { + return "/" + getName() + " " + getUsage(); + } + return "/" + parentChain + " " + getName() + + (getUsage().isEmpty() ? "" : " " + getUsage()); + } } diff --git a/src/main/java/dev/lotus/studio/command/subcommand/SubCommandFactory.java b/src/main/java/dev/lotus/studio/command/subcommand/SubCommandFactory.java new file mode 100644 index 0000000..35fd281 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/SubCommandFactory.java @@ -0,0 +1,18 @@ +package dev.lotus.studio.command.subcommand; + + +import java.util.Arrays; +import java.util.Collection; +import java.util.function.Function; + +public class SubCommandFactory { + public static , C> Collection createAll( + Class enumClass, + Function creator + ) { + return Arrays.stream(enumClass.getEnumConstants()) + .map(creator) + .toList(); + } +} + diff --git a/src/main/java/dev/lotus/studio/command/subcommand/item/factory/ItemSubCommandFactory.java b/src/main/java/dev/lotus/studio/command/subcommand/item/factory/ItemSubCommandFactory.java index 0fa307a..f1f98e6 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/item/factory/ItemSubCommandFactory.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/factory/ItemSubCommandFactory.java @@ -1,15 +1,15 @@ package dev.lotus.studio.command.subcommand.item.factory; +import dev.lotus.studio.command.subcommand.SubCommandFactory; import dev.lotus.studio.item.CustomItemManager; -import java.util.Arrays; import java.util.Collection; public class ItemSubCommandFactory { public static Collection createAll(CustomItemManager itemManager) { - return Arrays.stream(ItemSubCommandType.values()) - .map(type -> type.create(itemManager)) - .toList(); + return SubCommandFactory.createAll(ItemSubCommandType.class, + type -> type.create(itemManager)); } } + diff --git a/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ArmorCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ArmorCommand.java index 63cd1af..ab08f9a 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ArmorCommand.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ArmorCommand.java @@ -19,27 +19,23 @@ public String getName() { return "armor"; } - @Override - public String getDescription() { - return "Управление предметами брони"; - } @Override public String getUsage() { - return "/main item armor "; + return ""; } @Override public boolean execute(Player player, String[] args) { if (args.length == 0) { - player.sendMessage("§7Использование: " + getUsage()); + player.sendMessage("§7Использование: " + getFullUsage("lotus item")); return true; } switch (args[0].toLowerCase()) { case "give" -> { - if (args.length < 2) { - player.sendMessage("§7Использование: /main item armor give "); + if (args.length != 2) { + player.sendMessage("§7Использование: /lotus item armor give "); return true; } var customItem = itemManager.getItem(args[1]); @@ -60,7 +56,7 @@ public boolean execute(Player player, String[] args) { player.sendMessage("/main item armor list"); player.sendMessage("/main item armor help"); } - default -> player.sendMessage("§cНеизвестная команда. " + getUsage()); + default -> player.sendMessage("§cНеизвестная команда. " + getFullUsage("lotus item")); } return true; diff --git a/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/EatCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/EatCommand.java index 5d6a240..bb3e207 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/EatCommand.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/EatCommand.java @@ -19,27 +19,23 @@ public String getName() { return "eat"; } - @Override - public String getDescription() { - return "Управление съедобными предметами"; - } @Override public String getUsage() { - return "/main item eat "; + return ""; } @Override public boolean execute(Player player, String[] args) { if (args.length == 0) { - player.sendMessage("§7Использование: " + getUsage()); + player.sendMessage("§7Использование: " + getFullUsage("lotus item")); return true; } switch (args[0].toLowerCase()) { case "give" -> { - if (args.length < 2) { - player.sendMessage("§7Использование: /main item eat give "); + if (args.length != 2) { + player.sendMessage("§7Использование: /lotus item eat give "); return true; } var eatItem = itemManager.getEatItem(args[1]); @@ -64,7 +60,7 @@ public boolean execute(Player player, String[] args) { player.sendMessage("/main item eat list"); player.sendMessage("/main item eat help"); } - default -> player.sendMessage("§cНеизвестная команда. " + getUsage()); + default -> player.sendMessage("§cНеизвестная команда. " + getFullUsage("lotus item")); } return true; diff --git a/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ViewCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ViewCommand.java index b4323bd..6305d9a 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ViewCommand.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ViewCommand.java @@ -19,27 +19,23 @@ public String getName() { return "view"; } - @Override - public String getDescription() { - return "Управление view предметами"; - } @Override public String getUsage() { - return "/main item view "; + return ""; } @Override public boolean execute(Player player, String[] args) { if (args.length == 0) { - player.sendMessage("§7Использование: " + getUsage()); + player.sendMessage("§7Использование: " + getFullUsage("lotus item")); return true; } switch (args[0].toLowerCase()) { case "give" -> { - if (args.length < 2) { - player.sendMessage("§7Использование: /main item view give "); + if (args.length != 2) { + player.sendMessage("§7Использование: /lotus item view give "); return true; } var viewItem = itemManager.getViewItem(args[1]); @@ -64,7 +60,7 @@ public boolean execute(Player player, String[] args) { player.sendMessage("/main item view list"); player.sendMessage("/main item view help"); } - default -> player.sendMessage("§cНеизвестная команда. " + getUsage()); + default -> player.sendMessage("§cНеизвестная команда. " + getFullUsage("lotus item")); } return true; diff --git a/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/AbstractReloadCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/AbstractReloadCommand.java index da87677..3d53086 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/AbstractReloadCommand.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/AbstractReloadCommand.java @@ -2,14 +2,11 @@ import dev.lotus.studio.command.subcommand.SubCommand; import dev.lotus.studio.item.CustomItemManager; -import dev.lotus.studio.safezone.SafeZoneManager; public abstract class AbstractReloadCommand implements SubCommand { protected final CustomItemManager itemManager; - protected final SafeZoneManager safeZoneManager; - protected AbstractReloadCommand(CustomItemManager itemManager , SafeZoneManager safeZoneManager) { + protected AbstractReloadCommand(CustomItemManager itemManager) { this.itemManager = itemManager; - this.safeZoneManager = safeZoneManager; } } \ No newline at end of file diff --git a/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandFactory.java b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandFactory.java new file mode 100644 index 0000000..df6f6b6 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandFactory.java @@ -0,0 +1,18 @@ +package dev.lotus.studio.command.subcommand.reload.factory; + + +import dev.lotus.studio.command.subcommand.SubCommandFactory; +import dev.lotus.studio.item.CustomItemManager; + +import java.util.Collection; + +public class ReloadSubCommandFactory { + public static Collection createAll( + CustomItemManager itemManager + ) { + return SubCommandFactory.createAll(ReloadSubCommandType.class, + type -> type.create(itemManager)); + } +} + + diff --git a/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandType.java b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandType.java index 89b1caf..99187fb 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandType.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandType.java @@ -4,7 +4,6 @@ import dev.lotus.studio.command.subcommand.reload.subcommand.AllReloadSub; import dev.lotus.studio.command.subcommand.reload.subcommand.ItemReloadSub; import dev.lotus.studio.item.CustomItemManager; -import dev.lotus.studio.safezone.SafeZoneManager; public enum ReloadSubCommandType { ITEMS(ItemReloadSub.class), @@ -16,11 +15,11 @@ public enum ReloadSubCommandType { this.clazz = clazz; } - public AbstractReloadCommand create(SafeZoneManager manager, CustomItemManager itemManager) { + public AbstractReloadCommand create(CustomItemManager itemManager) { try { - var constructor = clazz.getDeclaredConstructor(CustomItemManager.class, SafeZoneManager.class); + var constructor = clazz.getDeclaredConstructor(CustomItemManager.class); constructor.setAccessible(true); - return constructor.newInstance(itemManager, manager); + return constructor.newInstance(itemManager); } catch (Exception e) { throw new RuntimeException("Не удалось создать команду: " + clazz.getSimpleName(), e); } diff --git a/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/AllReloadSub.java b/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/AllReloadSub.java index 4738594..a5ebee0 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/AllReloadSub.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/AllReloadSub.java @@ -3,18 +3,16 @@ import dev.lotus.studio.Main; import dev.lotus.studio.command.subcommand.reload.factory.AbstractReloadCommand; import dev.lotus.studio.item.CustomItemManager; -import dev.lotus.studio.safezone.SafeZoneManager; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.format.TextColor; import org.bukkit.entity.Player; -import org.enginehub.piston.CommandManager; import java.util.List; import java.util.Optional; public class AllReloadSub extends AbstractReloadCommand { - public AllReloadSub(CustomItemManager itemManager , SafeZoneManager safeZoneManager) { - super(itemManager, safeZoneManager); + public AllReloadSub(CustomItemManager itemManager) { + super(itemManager); } @Override @@ -22,14 +20,10 @@ public String getName() { return "all"; } - @Override - public String getDescription() { - return "test"; - } @Override public String getUsage() { - return "/main reload all"; + return ""; } @Override @@ -43,7 +37,7 @@ public boolean execute(Player player, String[] args) { System.out.println(e.getMessage()); } return true; - } else player.sendMessage(getUsage()); + } else player.sendMessage(getFullUsage("lotus reload")); return true; } diff --git a/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/ItemReloadSub.java b/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/ItemReloadSub.java index 7a27e02..1727a47 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/ItemReloadSub.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/ItemReloadSub.java @@ -1,20 +1,17 @@ package dev.lotus.studio.command.subcommand.reload.subcommand; +import dev.lotus.studio.Main; import dev.lotus.studio.command.subcommand.reload.factory.AbstractReloadCommand; import dev.lotus.studio.item.CustomItemManager; -import dev.lotus.studio.safezone.SafeZoneManager; import org.bukkit.entity.Player; import java.util.List; +import java.util.logging.Level; public class ItemReloadSub extends AbstractReloadCommand { - /** - * TODO: Прибрати @param safeZoneManager повныстю з архітектури релоаду! - * @param itemManager - * @param safeZoneManager - */ - public ItemReloadSub(CustomItemManager itemManager , SafeZoneManager safeZoneManager) { - super(itemManager, safeZoneManager); + + public ItemReloadSub(CustomItemManager itemManager) { + super(itemManager); } @Override @@ -22,14 +19,10 @@ public String getName() { return "item"; } - @Override - public String getDescription() { - return "items reload"; - } @Override public String getUsage() { - return "reload all items"; + return ""; } @Override @@ -37,9 +30,11 @@ public boolean execute(Player player, String[] args) { if (args.length == 0){ try { itemManager.reloadItemConfig(); - } catch (Exception ignored){ - + } catch (Exception e){ + Main.getInstance().getLogger().log(Level.WARNING, "Failed to reload item config:" + e.getMessage()); } + } else { + player.sendMessage(getFullUsage("lotus reload")); } return false; } diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/SafeZoneSubCommandFactory.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/SafeZoneSubCommandFactory.java index 216a7a5..c01d0e7 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/SafeZoneSubCommandFactory.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/factory/SafeZoneSubCommandFactory.java @@ -1,16 +1,16 @@ package dev.lotus.studio.command.subcommand.safezone.factory; +import dev.lotus.studio.command.subcommand.SubCommandFactory; import dev.lotus.studio.safezone.SafeZoneManager; -import java.util.Arrays; import java.util.Collection; public class SafeZoneSubCommandFactory { public static Collection createAll(SafeZoneManager manager) { - return Arrays.stream(SafeZoneSubCommandType.values()) - .map(type -> type.create(manager)) - .toList(); + return SubCommandFactory.createAll(SafeZoneSubCommandType.class, + type -> type.create(manager)); } } + diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneListCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneListCommand.java index 1accf1a..02ea416 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneListCommand.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneListCommand.java @@ -18,18 +18,19 @@ public String getName() { return "list"; } - @Override - public String getDescription() { - return "Список усіх збережених зон"; - } @Override public String getUsage() { - return "/main safezone list"; + return ""; } @Override public boolean execute(Player player, String[] args) { + if (args.length != 0){ + player.sendMessage(getFullUsage("lotus safezone")); + return true; + } + List safeZones = manager.getDataZones(); if (safeZones.isEmpty()) { @@ -47,7 +48,6 @@ public boolean execute(Player player, String[] args) { @Override public List tabComplete(Player player, String[] args) { - // Для списку зон автозаповнення не потрібне return List.of(); } } diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos1Command.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos1Command.java index 86e7b6c..38d6552 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos1Command.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos1Command.java @@ -20,18 +20,18 @@ public String getName() { return "pos1"; } - @Override - public String getDescription() { - return "Встановлює першу точку зони"; - } @Override public String getUsage() { - return "/main safezone pos1"; + return ""; } @Override public boolean execute(Player player, String[] args) { + if (args.length != 0){ + player.sendMessage(getFullUsage("lotus safezone")); + return true; + } Location pos1 = player.getLocation(); manager.setTempPos1(player.getUniqueId(), pos1); // зберігаємо тимчасово у менеджері player.sendMessage("§aПерша точка зони встановлена: " + formatLocation(pos1)); diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos2Command.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos2Command.java index d4a6629..d6eb5b8 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos2Command.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZonePos2Command.java @@ -19,18 +19,18 @@ public String getName() { return "pos2"; } - @Override - public String getDescription() { - return "Встановлює другу точку для SafeZone"; - } @Override public String getUsage() { - return "/main safezone pos2"; + return ""; } @Override public boolean execute(Player player, String[] args) { + if (args.length != 0){ + player.sendMessage(getFullUsage("lotus safezone")); + return true; + } manager.setTempPos2(player.getUniqueId(), player.getLocation()); player.sendMessage("Друга точка встановлена: " + formatLocation(player.getLocation())); return true; diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneRemoveCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneRemoveCommand.java index 31c6957..f19c801 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneRemoveCommand.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneRemoveCommand.java @@ -8,10 +8,7 @@ import java.util.List; public class SafeZoneRemoveCommand extends AbstractSafeZoneSubCommand { - /** - * TODO: Зробити по іменні видалення зон - * @param manager - */ + SafeZoneRemoveCommand(SafeZoneManager manager) { super(manager); } @@ -21,20 +18,16 @@ public String getName() { return "remove"; } - @Override - public String getDescription() { - return "Видаляє SafeZone за вказаним ID"; - } @Override public String getUsage() { - return "/main safezone remove "; + return ""; } @Override public boolean execute(Player player, String[] args) { if (args.length < 1) { // перевіряємо, що після remove є аргумент - player.sendMessage("Вкажіть ID зони: " + getUsage()); + player.sendMessage(getFullUsage("lotus safezone")); return true; } @@ -45,9 +38,11 @@ public boolean execute(Player player, String[] args) { player.sendMessage("§cНекоректний ID зони!"); return true; } - - manager.removeSafeZone(zoneId); - player.sendMessage(Component.text("SafeZone з ID " + zoneId + " видалено!")); + if (manager.getZoneById(zoneId)){ + manager.removeSafeZone(zoneId); + player.sendMessage(Component.text("SafeZone з ID " + zoneId + " видалено!")); + return true; + } return true; } diff --git a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneSaveCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneSaveCommand.java index a2d35a1..611de6e 100644 --- a/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneSaveCommand.java +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneSaveCommand.java @@ -20,21 +20,16 @@ public String getName() { return "save"; } - @Override - public String getDescription() { - return "Зберігає SafeZone після встановлення pos1 та pos2"; - } - @Override public String getUsage() { - return "/main safezone save <назва>"; + return ""; } @Override public boolean execute(Player player, String[] args) { System.out.println(Arrays.toString(args)); if (args.length < 1) { - player.sendMessage("Вкажіть назву зони: " + getUsage()); + player.sendMessage(getFullUsage("lotus safezone")); return true; } @@ -48,11 +43,10 @@ public boolean execute(Player player, String[] args) { player.sendMessage("Будь ласка, спочатку встановіть обидві точки (pos1 і pos2)."); return true; } - SafeZone safeZone = new SafeZone(zoneName, new ImmutablePair<>(pos1, pos2)); manager.addSafeZone(safeZone); - player.sendMessage("Зона '" + zoneName + "' успішно збережена."); + manager.removeTempPositions(player.getUniqueId()); return true; } diff --git a/src/main/java/dev/lotus/studio/safezone/SafeZoneManager.java b/src/main/java/dev/lotus/studio/safezone/SafeZoneManager.java index 2b23513..dc63311 100644 --- a/src/main/java/dev/lotus/studio/safezone/SafeZoneManager.java +++ b/src/main/java/dev/lotus/studio/safezone/SafeZoneManager.java @@ -62,10 +62,10 @@ public void removeSafeZone(int zoneID) { } // Отримання зони з кешу (або БД, якщо немає в кеші) - public void getZoneById(int zoneID) { + public boolean getZoneById(int zoneID) { SafeZone cached = zoneCache.getIfPresent(zoneID); if (cached != null) { - return; + return true; } SafeZoneDataBase dbData = safeZoneDataService.getZoneById(zoneID); @@ -75,8 +75,10 @@ public void getZoneById(int zoneID) { plugin.getLogger().info("[SafeZoneManager] Loaded zone from DB and cached: " + zone.getZoneName() + " (ID: " + zone.getZoneID() + ")"); + return true; } else { plugin.getLogger().warning("[SafeZoneManager] Zone " + zoneID + " not found in DB."); + return false; } } From f9a50461d89c610830e5309bb77de0fd9585a03a Mon Sep 17 00:00:00 2001 From: Referix Date: Thu, 25 Sep 2025 13:51:28 +0300 Subject: [PATCH 4/4] merge --- src/main/java/dev/lotus/studio/Main.java | 1 + src/main/java/dev/lotus/studio/command/SafeZoneCommand.java | 0 2 files changed, 1 insertion(+) delete mode 100644 src/main/java/dev/lotus/studio/command/SafeZoneCommand.java diff --git a/src/main/java/dev/lotus/studio/Main.java b/src/main/java/dev/lotus/studio/Main.java index 416db73..c8a3011 100644 --- a/src/main/java/dev/lotus/studio/Main.java +++ b/src/main/java/dev/lotus/studio/Main.java @@ -2,6 +2,7 @@ import dev.lotus.studio.database.DatabaseInitializer; import dev.lotus.studio.database.playerdata.PlayerDataService; +import dev.lotus.studio.safezone.SafeZonePreloaded; import org.bstats.bukkit.Metrics; import org.bukkit.event.HandlerList; import org.bukkit.plugin.java.JavaPlugin; diff --git a/src/main/java/dev/lotus/studio/command/SafeZoneCommand.java b/src/main/java/dev/lotus/studio/command/SafeZoneCommand.java deleted file mode 100644 index e69de29..0000000