diff --git a/src/main/java/dev/lotus/studio/Main.java b/src/main/java/dev/lotus/studio/Main.java index fe77483..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; @@ -15,6 +16,9 @@ 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 { private static Main instance; @@ -27,35 +31,49 @@ public final class Main extends JavaPlugin { @Override public void onEnable() { metric(); - instance = this; - PlayerManager.getInstance().startGlobalTask(); - //cfg - itemManager = new CustomItemManager(); - databaseInitializer = new DatabaseInitializer(this); - playerDataBase = databaseInitializer.getPlayerDataBase(); - safeZoneDataService = databaseInitializer.getSaveZoneDataService(); + if (initialize()){ + getLogger().log(Level.INFO, "Plugin has been enabled!"); + } + } + 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 MainCommand("lotus", itemManager); + new PlayerBar(this,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 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 2c8c652..1d83301 100644 --- a/src/main/java/dev/lotus/studio/command/MainCommand.java +++ b/src/main/java/dev/lotus/studio/command/MainCommand.java @@ -1,347 +1,87 @@ 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.reload.factory.ReloadSubCommandFactory; +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 safeZoneManager) { 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", + "/main safezone ", + SafeZoneSubCommandFactory.createAll(safeZoneManager) + )); - // --- 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 GenericCommand<>( + "reload", + "main", + ReloadSubCommandFactory.createAll(itemManager))); - 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()); - } + register(new HelpCommand()); - private void handleListCommand(Player player) { - player.sendMessage("Доступные предметы:"); - itemManager.getItems().keySet().forEach(key -> player.sendMessage("- " + key)); } - 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 b5f0c1e..0000000 --- a/src/main/java/dev/lotus/studio/command/SafeZoneCommand.java +++ /dev/null @@ -1,113 +0,0 @@ -package dev.lotus.studio.command; - -import dev.lotus.studio.database.savezone.SafeZoneDataBase; -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..04d0c31 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/GenericCommand.java @@ -0,0 +1,81 @@ +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 usage; + private final Collection subCommands; + + public GenericCommand(String name, String usage, Collection subCommands) { + this.name = name; + this.usage = usage; + this.subCommands = subCommands; + } + + @Override + public String getName() { return name; } + + + @Override + 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) { + 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..e11f695 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/HelpCommand.java @@ -0,0 +1,29 @@ +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 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/SubCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/SubCommand.java new file mode 100644 index 0000000..97a321c --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/SubCommand.java @@ -0,0 +1,22 @@ +package dev.lotus.studio.command.subcommand; + + +import org.bukkit.entity.Player; + +import java.util.List; + +public interface SubCommand { + String getName(); + 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/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..f1f98e6 --- /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.command.subcommand.SubCommandFactory; +import dev.lotus.studio.item.CustomItemManager; + +import java.util.Collection; + +public class ItemSubCommandFactory { + public static Collection createAll(CustomItemManager itemManager) { + return SubCommandFactory.createAll(ItemSubCommandType.class, + type -> type.create(itemManager)); + } +} + + 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..ab08f9a --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ArmorCommand.java @@ -0,0 +1,76 @@ +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 getUsage() { + return ""; + } + + @Override + public boolean execute(Player player, String[] args) { + if (args.length == 0) { + player.sendMessage("§7Использование: " + getFullUsage("lotus item")); + return true; + } + + switch (args[0].toLowerCase()) { + case "give" -> { + if (args.length != 2) { + player.sendMessage("§7Использование: /lotus 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Неизвестная команда. " + getFullUsage("lotus item")); + } + + 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..bb3e207 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/EatCommand.java @@ -0,0 +1,79 @@ +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 getUsage() { + return ""; + } + + @Override + public boolean execute(Player player, String[] args) { + if (args.length == 0) { + player.sendMessage("§7Использование: " + getFullUsage("lotus item")); + return true; + } + + switch (args[0].toLowerCase()) { + case "give" -> { + if (args.length != 2) { + player.sendMessage("§7Использование: /lotus 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Неизвестная команда. " + getFullUsage("lotus item")); + } + + 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..6305d9a --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/item/subcommand/ViewCommand.java @@ -0,0 +1,79 @@ +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 getUsage() { + return ""; + } + + @Override + public boolean execute(Player player, String[] args) { + if (args.length == 0) { + player.sendMessage("§7Использование: " + getFullUsage("lotus item")); + return true; + } + + switch (args[0].toLowerCase()) { + case "give" -> { + if (args.length != 2) { + player.sendMessage("§7Использование: /lotus 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Неизвестная команда. " + getFullUsage("lotus item")); + } + + 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/reload/factory/AbstractReloadCommand.java b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/AbstractReloadCommand.java new file mode 100644 index 0000000..3d53086 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/AbstractReloadCommand.java @@ -0,0 +1,12 @@ +package dev.lotus.studio.command.subcommand.reload.factory; + +import dev.lotus.studio.command.subcommand.SubCommand; +import dev.lotus.studio.item.CustomItemManager; + +public abstract class AbstractReloadCommand implements SubCommand { + protected final CustomItemManager itemManager; + + protected AbstractReloadCommand(CustomItemManager itemManager) { + this.itemManager = itemManager; + } +} \ 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 new file mode 100644 index 0000000..99187fb --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/factory/ReloadSubCommandType.java @@ -0,0 +1,27 @@ +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; + +public enum ReloadSubCommandType { + ITEMS(ItemReloadSub.class), + ALL(AllReloadSub.class); + + private final Class clazz; + + ReloadSubCommandType(Class clazz) { + this.clazz = clazz; + } + + public AbstractReloadCommand create(CustomItemManager itemManager) { + try { + var constructor = clazz.getDeclaredConstructor(CustomItemManager.class); + constructor.setAccessible(true); + 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 new file mode 100644 index 0000000..a5ebee0 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/AllReloadSub.java @@ -0,0 +1,48 @@ +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 net.kyori.adventure.text.Component; +import net.kyori.adventure.text.format.TextColor; +import org.bukkit.entity.Player; + +import java.util.List; +import java.util.Optional; + +public class AllReloadSub extends AbstractReloadCommand { + public AllReloadSub(CustomItemManager itemManager) { + super(itemManager); + } + + @Override + public String getName() { + return "all"; + } + + + @Override + public String getUsage() { + return ""; + } + + @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(getFullUsage("lotus reload")); + 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..1727a47 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/reload/subcommand/ItemReloadSub.java @@ -0,0 +1,46 @@ +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 org.bukkit.entity.Player; + +import java.util.List; +import java.util.logging.Level; + +public class ItemReloadSub extends AbstractReloadCommand { + + public ItemReloadSub(CustomItemManager itemManager) { + super(itemManager); + } + + @Override + public String getName() { + return "item"; + } + + + @Override + public String getUsage() { + return ""; + } + + @Override + public boolean execute(Player player, String[] args) { + if (args.length == 0){ + try { + itemManager.reloadItemConfig(); + } catch (Exception e){ + Main.getInstance().getLogger().log(Level.WARNING, "Failed to reload item config:" + e.getMessage()); + } + } else { + player.sendMessage(getFullUsage("lotus reload")); + } + return false; + } + + @Override + public List tabComplete(Player player, String[] args) { + 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..c01d0e7 --- /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.command.subcommand.SubCommandFactory; +import dev.lotus.studio.safezone.SafeZoneManager; + +import java.util.Collection; + +public class SafeZoneSubCommandFactory { + public static Collection createAll(SafeZoneManager manager) { + return SubCommandFactory.createAll(SafeZoneSubCommandType.class, + type -> type.create(manager)); + } +} + + 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..02ea416 --- /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 getUsage() { + 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()) { + 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..38d6552 --- /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 getUsage() { + 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)); + 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..d6eb5b8 --- /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 getUsage() { + 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; + } + + @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..f19c801 --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneRemoveCommand.java @@ -0,0 +1,59 @@ +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 { + + SafeZoneRemoveCommand(SafeZoneManager manager) { + super(manager); + } + + @Override + public String getName() { + return "remove"; + } + + + @Override + public String getUsage() { + return ""; + } + + @Override + public boolean execute(Player player, String[] args) { + if (args.length < 1) { // перевіряємо, що після remove є аргумент + player.sendMessage(getFullUsage("lotus safezone")); + return true; + } + + int zoneId; + try { + zoneId = Integer.parseInt(args[0]); // тут беремо args[0], бо виклик передає вже відсічені аргументи + } catch (NumberFormatException e) { + player.sendMessage("§cНекоректний ID зони!"); + return true; + } + if (manager.getZoneById(zoneId)){ + manager.removeSafeZone(zoneId); + player.sendMessage(Component.text("SafeZone з ID " + zoneId + " видалено!")); + return true; + } + 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..611de6e --- /dev/null +++ b/src/main/java/dev/lotus/studio/command/subcommand/safezone/subcommand/SafeZoneSaveCommand.java @@ -0,0 +1,58 @@ +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 getUsage() { + return ""; + } + + @Override + public boolean execute(Player player, String[] args) { + System.out.println(Arrays.toString(args)); + if (args.length < 1) { + player.sendMessage(getFullUsage("lotus safezone")); + 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 + "' успішно збережена."); + manager.removeTempPositions(player.getUniqueId()); + 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..dc63311 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,18 +54,18 @@ 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) { + + public boolean getZoneById(int zoneID) { SafeZone cached = zoneCache.getIfPresent(zoneID); if (cached != null) { - return; + return true; } SafeZoneDataBase dbData = safeZoneDataService.getZoneById(zoneID); @@ -68,13 +75,15 @@ 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; } } - // Перевірка чи гравець в якійсь зоні + public boolean isPlayerInAnyZone(Player player) { Location playerLoc = player.getLocation(); for (SafeZone zone : zoneCache.asMap().values()) { @@ -86,7 +95,6 @@ public boolean isPlayerInAnyZone(Player player) { } return false; } - public List getDataZones(){ return safeZoneDataService.getAllSaveZones(); } @@ -95,4 +103,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); + } +}