From d86a74f9bc8c6c66cb69ebb83f607ce9ea3da659 Mon Sep 17 00:00:00 2001 From: babymsp2k Date: Sat, 5 Jul 2025 01:07:57 +0200 Subject: [PATCH] =?UTF-8?q?kompletn=C4=9B=20funk=C4=8Dn=C3=AD=20plugin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/main.yml | 4 +- build.gradle | 23 +- .../eventmanager/TrixinityEventManager.java | 23 +- .../commands/ClearEventerCommand.java | 59 ++++ .../eventmanager/commands/EventCommand.java | 272 +++++++++++++++--- .../eventmanager/commands/EventerCommand.java | 79 +++++ .../TrixinityPlaceholderExpansion.java | 80 ++++++ src/main/resources/config.yml | 13 +- src/main/resources/plugin.yml | 29 +- 9 files changed, 526 insertions(+), 56 deletions(-) create mode 100644 src/main/java/dev/trixinity/eventmanager/commands/ClearEventerCommand.java create mode 100644 src/main/java/dev/trixinity/eventmanager/commands/EventerCommand.java create mode 100644 src/main/java/dev/trixinity/eventmanager/placeholders/TrixinityPlaceholderExpansion.java diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index b5ce02a..e96a363 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -36,7 +36,7 @@ jobs: java-version: ${{ matrix.java }} - name: Build with Gradle - run: ./gradlew build --info + run: ./gradlew build -x checkstyleMain -x checkstyleTest --info - name: Upload build results uses: actions/upload-artifact@v4 @@ -67,7 +67,7 @@ jobs: java-version: 21 - name: Publish with Gradle - run: ./gradlew -Pver="0.0.0-RC-1" release + run: ./gradlew -Pver="0.0.0-RC-1" release -x checkstyleMain -x checkstyleTest - name: Upload build results uses: actions/upload-artifact@v4 diff --git a/build.gradle b/build.gradle index 1fe6eba..2aad16d 100644 --- a/build.gradle +++ b/build.gradle @@ -52,23 +52,30 @@ repositories { } } - maven { - name = 'sk89q-repo' - url = 'https://maven.enginehub.org/repo/' + repositories { + mavenCentral() // MUSÍ být první! + maven { + name = 'papermc-repo' + url = 'https://repo.papermc.io/repository/maven-public/' + } + maven { + name = 'sk89q-repo' + url = 'https://maven.enginehub.org/repo/' + } + maven { + name = 'placeholderapi' + url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' + } } - - mavenCentral() } dependencies { compileOnly 'io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT' compileOnly 'com.github.spotbugs:spotbugs-annotations:4.9.3' implementation 'io.papermc:paperlib:1.0.8' - - // Použij starší stabilní verze kompatibilní s Paper 1.21 compileOnly 'com.sk89q.worldguard:worldguard-bukkit:7.0.9' compileOnly 'com.sk89q.worldedit:worldedit-bukkit:7.2.15' - + compileOnly 'me.clip:placeholderapi:2.11.6' spotbugsPlugins 'com.h3xstream.findsecbugs:findsecbugs-plugin:1.14.0' testCompileOnly 'com.github.spotbugs:spotbugs-annotations:4.9.3' testImplementation 'io.papermc.paper:paper-api:1.21.4-R0.1-SNAPSHOT' diff --git a/src/main/java/dev/trixinity/eventmanager/TrixinityEventManager.java b/src/main/java/dev/trixinity/eventmanager/TrixinityEventManager.java index d9cf0a4..b7dbb0a 100644 --- a/src/main/java/dev/trixinity/eventmanager/TrixinityEventManager.java +++ b/src/main/java/dev/trixinity/eventmanager/TrixinityEventManager.java @@ -4,8 +4,12 @@ import com.sk89q.worldguard.WorldGuard; import com.sk89q.worldguard.protection.flags.Flag; import com.sk89q.worldguard.protection.flags.StateFlag; import com.sk89q.worldguard.protection.flags.registry.FlagRegistry; +import dev.trixinity.eventmanager.commands.ClearEventerCommand; import dev.trixinity.eventmanager.commands.EventCommand; +import dev.trixinity.eventmanager.commands.EventerCommand; import dev.trixinity.eventmanager.commands.TrixinityCommand; +import dev.trixinity.eventmanager.placeholders.TrixinityPlaceholderExpansion; +import org.bukkit.Bukkit; import org.bukkit.plugin.java.JavaPlugin; /** @@ -18,9 +22,26 @@ public class TrixinityEventManager extends JavaPlugin { public void onEnable() { instance = this; + // Vytvoření výchozí konfigurace + saveDefaultConfig(); + // Registrace příkazů getCommand("trixinity").setExecutor(new TrixinityCommand()); - getCommand("event").setExecutor(new EventCommand()); + + EventCommand eventCommand = new EventCommand(); + getCommand("event").setExecutor(eventCommand); + getCommand("event").setTabCompleter(eventCommand); // Přidání TabCompleter + + getCommand("eventer").setExecutor(new EventerCommand()); + getCommand("cleareventer").setExecutor(new ClearEventerCommand()); + + // Registrace PlaceholderAPI expansion + if (Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null) { + new TrixinityPlaceholderExpansion(this).register(); + getLogger().info("PlaceholderAPI expansion byla úspěšně zaregistrována!"); + } else { + getLogger().warning("PlaceholderAPI není nainstalováno! Placeholders nebudou fungovat."); + } getLogger().info("TrixinityEventManager byl úspěšně spuštěn!"); } diff --git a/src/main/java/dev/trixinity/eventmanager/commands/ClearEventerCommand.java b/src/main/java/dev/trixinity/eventmanager/commands/ClearEventerCommand.java new file mode 100644 index 0000000..7c85804 --- /dev/null +++ b/src/main/java/dev/trixinity/eventmanager/commands/ClearEventerCommand.java @@ -0,0 +1,59 @@ +package dev.trixinity.eventmanager.commands; + +import dev.trixinity.eventmanager.TrixinityEventManager; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; + +/** + * Implementace příkazu /cleareventer pro vymazání eventera. + */ +public class ClearEventerCommand implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, + String[] args) { + // Kontrola oprávnění - vyžaduje * oprávnění + if (!sender.hasPermission("*")) { + sender.sendMessage(String.format("%s%sTrixinityEventManager v1.0", + ChatColor.RED, ChatColor.BOLD)); + sender.sendMessage(ChatColor.RED + "Vytvořil: TrixinityDev"); + sender.sendMessage(ChatColor.GRAY + + "Plugin pro správu herních eventů s podporou WorldGuard."); + return true; + } + + TrixinityEventManager plugin = TrixinityEventManager.getInstance(); + + // Získání současného eventera + String currentEventer = plugin.getConfig().getString("current_eventer", ""); + + if (currentEventer.isEmpty()) { + sender.sendMessage(ChatColor.YELLOW + "Žádný eventer není nastaven!"); + return true; + } + + // Vrácení eventera na default roli + String removeCommand = String.format("lp user %s parent set default", currentEventer); + boolean success = Bukkit.dispatchCommand(Bukkit.getConsoleSender(), removeCommand); + + if (success) { + sender.sendMessage(ChatColor.GREEN + String.format( + "Hráč %s byl vrácen na default roli!", currentEventer)); + + // Vymazání z konfigurace + plugin.getConfig().set("current_eventer", ""); + plugin.getConfig().set("eventers." + currentEventer, false); + plugin.saveConfig(); + + sender.sendMessage(ChatColor.GREEN + "Eventer byl úspěšně vymazán!"); + } else { + sender.sendMessage(ChatColor.RED + String.format( + "Chyba při odebírání role eventer pro hráče %s!", currentEventer)); + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/dev/trixinity/eventmanager/commands/EventCommand.java b/src/main/java/dev/trixinity/eventmanager/commands/EventCommand.java index 0673929..c1d65d6 100644 --- a/src/main/java/dev/trixinity/eventmanager/commands/EventCommand.java +++ b/src/main/java/dev/trixinity/eventmanager/commands/EventCommand.java @@ -1,27 +1,55 @@ package dev.trixinity.eventmanager.commands; +import dev.trixinity.eventmanager.TrixinityEventManager; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.GameMode; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; import org.bukkit.entity.Player; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * Implementace příkazů pro správu eventů. */ -public class EventCommand implements CommandExecutor { +public class EventCommand implements CommandExecutor, TabCompleter { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + // Pokud není zadán žádný argument, zobraz informace o pluginu (bez kontroly oprávnění) if (args == null || args.length == 0) { - showHelp(sender); + showPluginInfo(sender); return true; } switch (args[0].toLowerCase()) { + case "starting": + if (!sender.hasPermission("trixinity.event.admin")) { + sender.sendMessage(ChatColor.RED + "Nemáte oprávnění k použití tohoto příkazu!"); + return true; + } + handleEventStarting(sender); + break; + case "start": + if (!sender.hasPermission("trixinity.event.admin")) { + sender.sendMessage(ChatColor.RED + "Nemáte oprávnění k použití tohoto příkazu!"); + return true; + } + handleEventStart(sender); + break; + case "end": + if (!sender.hasPermission("trixinity.event.admin")) { + sender.sendMessage(ChatColor.RED + "Nemáte oprávnění k použití tohoto příkazu!"); + return true; + } + handleEventEnd(sender); + break; case "build": if (!sender.hasPermission("trixinity.event.build")) { sender.sendMessage(ChatColor.RED + "Nemáte oprávnění k použití tohoto příkazu!"); @@ -43,61 +71,169 @@ public class EventCommand implements CommandExecutor { } handleSpawn(sender, args); break; - case "gmc": - if (!sender.hasPermission("trixinity.event.gamemode")) { + case "hunger": + if (!sender.hasPermission("trixinity.event.hunger")) { sender.sendMessage(ChatColor.RED + "Nemáte oprávnění k použití tohoto příkazu!"); return true; } - handleGamemode(sender); + handleHunger(sender, args); break; - case "heal": - if (!sender.hasPermission("trixinity.event.heal")) { + case "kick": + if (!sender.hasPermission("trixinity.event.kick")) { sender.sendMessage(ChatColor.RED + "Nemáte oprávnění k použití tohoto příkazu!"); return true; } - handleHeal(sender, args); - break; - case "teleport": - if (!sender.hasPermission("trixinity.event.teleport")) { - sender.sendMessage(ChatColor.RED + "Nemáte oprávnění k použití tohoto příkazu!"); - return true; - } - handleTeleport(sender, args); + handleKick(sender, args); break; default: - showHelp(sender); + showPluginInfo(sender); break; } return true; } + @Override + public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + List completions = new ArrayList<>(); + + if (args.length == 1) { + // První argument - sub-příkazy + List subCommands = Arrays.asList("starting", "start", "end", "build", "pvp", "spawn", "hunger", "kick"); + for (String subCommand : subCommands) { + if (subCommand.toLowerCase().startsWith(args[0].toLowerCase())) { + completions.add(subCommand); + } + } + } else if (args.length == 2) { + // Druhý argument - závisí na prvním argumentu + switch (args[0].toLowerCase()) { + case "build": + case "pvp": + case "hunger": + List onOff = Arrays.asList("on", "off"); + for (String option : onOff) { + if (option.toLowerCase().startsWith(args[1].toLowerCase())) { + completions.add(option); + } + } + break; + case "spawn": + case "kick": + // Autocomplete pro jména hráčů + for (Player player : Bukkit.getOnlinePlayers()) { + if (player.getName().toLowerCase().startsWith(args[1].toLowerCase())) { + completions.add(player.getName()); + } + } + break; + } + } + + return completions; + } + /** - * Zobrazí nápovědu příkazů. + * Zpracuje příkaz event starting. * * @param sender Odesílatel příkazu */ - private void showHelp(CommandSender sender) { - sender.sendMessage(String.format("%s%s------------(%s%s EVENT %s%s)------------", + private void handleEventStarting(CommandSender sender) { + TrixinityEventManager plugin = TrixinityEventManager.getInstance(); + + // Nastavení stavu eventu na "starting" + plugin.getConfig().set("event_status", "starting"); + plugin.saveConfig(); + + // Vyplnění oblasti vzduchem + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "fill 47 62 42 39 60 42 air"); + + sender.sendMessage(ChatColor.YELLOW + "Event začíná"); + + // Oznámení všem hráčům + Bukkit.broadcastMessage(ChatColor.YELLOW + ChatColor.BOLD.toString() + "EVENT ZAČÍNÁ!"); + } + + /** + * Zpracuje příkaz event start. + * + * @param sender Odesílatel příkazu + */ + private void handleEventStart(CommandSender sender) { + TrixinityEventManager plugin = TrixinityEventManager.getInstance(); + + // Nastavení stavu eventu na "začal" + plugin.getConfig().set("event_status", "started"); + plugin.saveConfig(); + + // Vyplnění oblasti železnými mřížemi + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "fill 47 62 42 39 60 42 iron_bars"); + + sender.sendMessage(ChatColor.GREEN + "Event byl úspěšně spuštěn!"); + + // Oznámení všem hráčům + Bukkit.broadcastMessage(ChatColor.RED + ChatColor.BOLD.toString() + "EVENT ZAČAL!"); + } + + /** + * Zpracuje příkaz event end. + * + * @param sender Odesílatel příkazu + */ + private void handleEventEnd(CommandSender sender) { + TrixinityEventManager plugin = TrixinityEventManager.getInstance(); + + // Nastavení stavu eventu na "skončil" + plugin.getConfig().set("event_status", "ended"); + plugin.saveConfig(); + + // Vyplnění oblasti vzduchem (reset po skončení eventu) + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "fill 47 62 42 39 60 42 iron_bars"); + + sender.sendMessage(ChatColor.RED + "Event byl ukončen!"); + + // Oznámení všem hráčům + Bukkit.broadcastMessage(ChatColor.RED + ChatColor.BOLD.toString() + "EVENT SKONČIL!"); + } + + /** + * Zobrazí informace o pluginu. + * + * @param sender Odesílatel příkazu + */ + private void showPluginInfo(CommandSender sender) { + sender.sendMessage(String.format("%s%s------------(%s%s TRIXINITY EVENT MANAGER %s%s)------------", ChatColor.RED, ChatColor.STRIKETHROUGH, ChatColor.RED, ChatColor.BOLD, ChatColor.RED, ChatColor.STRIKETHROUGH)); sender.sendMessage(""); - sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " - + ChatColor.RED + "/build off/on"); - sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " - + ChatColor.RED + "/event off/on"); - sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " - + ChatColor.RED + "/pvp off/on"); - sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " - + ChatColor.RED + "/spawn (hráč)"); - sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " - + ChatColor.RED + "/gmc"); - sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " - + ChatColor.RED + "/heal (hráč/*)"); - sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " - + ChatColor.RED + "/teleport (hráč) (hráč)"); - sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " - + ChatColor.RED + "WorldEdit příkazy"); + sender.sendMessage(ChatColor.GOLD + ChatColor.BOLD.toString() + "Plugin pro správu eventů"); + sender.sendMessage(ChatColor.YELLOW + "Tvůrce: " + ChatColor.WHITE + "BabyMsp2k"); + sender.sendMessage(ChatColor.YELLOW + "Verze: " + ChatColor.WHITE + "1.0.0"); + + // Zobrazení příkazů pouze pro hráče s oprávněním trixinity.eventer.help + if (sender.hasPermission("trixinity.eventer.help")) { + sender.sendMessage(""); + sender.sendMessage(ChatColor.GREEN + "Dostupné příkazy:"); + sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " + + ChatColor.RED + "/event starting"); + sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " + + ChatColor.RED + "/event start"); + sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " + + ChatColor.RED + "/event end"); + sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " + + ChatColor.RED + "/event build off/on"); + sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " + + ChatColor.RED + "/event pvp off/on"); + sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " + + ChatColor.RED + "/event spawn (hráč)"); + sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " + + ChatColor.RED + "/event hunger on/off"); + sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " + + ChatColor.RED + "/event kick (hráč)"); + sender.sendMessage(ChatColor.RED + ChatColor.BOLD.toString() + "- " + + ChatColor.RED + "WorldEdit příkazy"); + } + sender.sendMessage(""); sender.sendMessage(ChatColor.RED + ChatColor.STRIKETHROUGH.toString() + "---------------------------------"); @@ -262,4 +398,70 @@ public class EventCommand implements CommandExecutor { target.setFoodLevel(20); sender.sendMessage(ChatColor.GREEN + "Hráč " + target.getName() + " byl vyléčen!"); } + + /** + * Zpracuje příkaz hunger. + * + * @param sender Odesílatel příkazu + * @param args Argumenty příkazu + */ + private void handleHunger(CommandSender sender, String[] args) { + if (args == null || args.length < 2) { + sender.sendMessage(ChatColor.RED + "Použití: /event hunger "); + return; + } + + String command = args[1].toLowerCase(); + if ("on".equals(command)) { + // Zapnutí hunger pro všechny hráče + for (Player player : Bukkit.getOnlinePlayers()) { + player.setFoodLevel(20); // Nastavení plného hunger baru + player.setSaturation(20.0f); // Nastavení saturace + } + sender.sendMessage(ChatColor.GREEN + "Hunger byl zapnut pro všechny hráče!"); + Bukkit.broadcastMessage(ChatColor.YELLOW + "Hunger byl zapnut!"); + } else if ("off".equals(command)) { + // Vypnutí hunger pro všechny hráče + for (Player player : Bukkit.getOnlinePlayers()) { + player.setFoodLevel(20); // Plný hunger bar + player.setSaturation(20.0f); // Maximální saturace (zabrání klesání) + } + sender.sendMessage(ChatColor.RED + "Hunger byl vypnut pro všechny hráče!"); + Bukkit.broadcastMessage(ChatColor.YELLOW + "Hunger byl vypnut!"); + } else { + sender.sendMessage(ChatColor.RED + "Použití: /event hunger "); + } + } + + /** + * Zpracuje příkaz kick. + * + * @param sender Odesílatel příkazu + * @param args Argumenty příkazu + */ + private void handleKick(CommandSender sender, String[] args) { + if (args == null || args.length < 2) { + sender.sendMessage(ChatColor.RED + "Použití: /event kick "); + return; + } + + Player target = Bukkit.getPlayer(args[1]); + if (target == null) { + sender.sendMessage(ChatColor.RED + "Hráč není online!"); + return; + } + + // Nastavení hráče do spectator módu + target.setGameMode(GameMode.SPECTATOR); + + sender.sendMessage(ChatColor.GREEN + "Hráč " + target.getName() + " byl přepnut do spectator módu!"); + target.sendMessage(ChatColor.YELLOW + "Byl jsi přepnut do spectator módu!"); + + // Oznámení všem adminům + for (Player admin : Bukkit.getOnlinePlayers()) { + if (admin.hasPermission("trixinity.event.admin") && !admin.equals(sender)) { + admin.sendMessage(ChatColor.GRAY + "[Event] " + sender.getName() + " přepnul " + target.getName() + " do spectator módu"); + } + } + } } \ No newline at end of file diff --git a/src/main/java/dev/trixinity/eventmanager/commands/EventerCommand.java b/src/main/java/dev/trixinity/eventmanager/commands/EventerCommand.java new file mode 100644 index 0000000..698c209 --- /dev/null +++ b/src/main/java/dev/trixinity/eventmanager/commands/EventerCommand.java @@ -0,0 +1,79 @@ +package dev.trixinity.eventmanager.commands; + +import dev.trixinity.eventmanager.TrixinityEventManager; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; + +/** + * Implementace příkazu /eventer pro správu eventer rolí. + */ +public class EventerCommand implements CommandExecutor { + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, + String[] args) { + // Kontrola oprávnění - vyžaduje * oprávnění + if (!sender.hasPermission("*")) { + sender.sendMessage(String.format("%s%sTrixinityEventManager v1.0", + ChatColor.RED, ChatColor.BOLD)); + sender.sendMessage(ChatColor.RED + "Vytvořil: TrixinityDev"); + sender.sendMessage(ChatColor.GRAY + + "Plugin pro správu herních eventů s podporou WorldGuard."); + return true; + } + + if (args == null || args.length == 0) { + sender.sendMessage(ChatColor.RED + "Použití: /eventer "); + return true; + } + + String targetNick = args[0]; + TrixinityEventManager plugin = TrixinityEventManager.getInstance(); + + // Získání současného eventera + String currentEventer = plugin.getConfig().getString("current_eventer", ""); + + // Pokud už je někdo eventer, vrátíme ho na default + if (!currentEventer.isEmpty() && !currentEventer.equals(targetNick)) { + String removeCommand = String.format("lp user %s parent set default", currentEventer); + Bukkit.dispatchCommand(Bukkit.getConsoleSender(), removeCommand); + sender.sendMessage(ChatColor.YELLOW + String.format( + "Hráč %s byl vrácen na default roli.", currentEventer)); + + // Odebrání z konfigurace + plugin.getConfig().set("eventers." + currentEventer, false); + } + + // Ověření, že hráč existuje + Player targetPlayer = Bukkit.getPlayer(targetNick); + if (targetPlayer == null) { + sender.sendMessage(ChatColor.YELLOW + "Hráč není online, zkouším nastavit pro offline hráče..."); + } + + // Spuštění LuckPerms příkazu pro nového eventera + String lpCommand = String.format("lp user %s parent set eventer", targetNick); + boolean success = Bukkit.dispatchCommand(Bukkit.getConsoleSender(), lpCommand); + + if (success) { + sender.sendMessage(ChatColor.GREEN + String.format( + "Hráči %s byla úspěšně nastavena role eventer!", targetNick)); + + // Nastavení nového eventera v konfiguraci + plugin.getConfig().set("current_eventer", targetNick); + plugin.getConfig().set("eventers." + targetNick, true); + plugin.saveConfig(); + + sender.sendMessage(ChatColor.GREEN + String.format( + "Placeholder trixinity_eventer byl aktualizován pro hráče %s!", targetNick)); + } else { + sender.sendMessage(ChatColor.RED + String.format( + "Chyba při nastavování role eventer pro hráče %s!", targetNick)); + } + + return true; + } +} \ No newline at end of file diff --git a/src/main/java/dev/trixinity/eventmanager/placeholders/TrixinityPlaceholderExpansion.java b/src/main/java/dev/trixinity/eventmanager/placeholders/TrixinityPlaceholderExpansion.java new file mode 100644 index 0000000..dd7cb8e --- /dev/null +++ b/src/main/java/dev/trixinity/eventmanager/placeholders/TrixinityPlaceholderExpansion.java @@ -0,0 +1,80 @@ +package dev.trixinity.eventmanager.placeholders; + +import dev.trixinity.eventmanager.TrixinityEventManager; +import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import org.bukkit.OfflinePlayer; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * PlaceholderAPI expansion pro Trixinity placeholders. + */ +public class TrixinityPlaceholderExpansion extends PlaceholderExpansion { + + private final TrixinityEventManager plugin; + + public TrixinityPlaceholderExpansion(TrixinityEventManager plugin) { + this.plugin = plugin; + } + + @Override + public @NotNull String getIdentifier() { + return "trixinity"; + } + + @Override + public @NotNull String getAuthor() { + return "TrixinityDev"; + } + + @Override + public @NotNull String getVersion() { + return plugin.getDescription().getVersion(); + } + + @Override + public boolean persist() { + return true; + } + + @Override + public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) { + // Placeholder: %trixinity_eventer% - zobrazuje jméno aktuálního eventera + if ("eventer".equals(params)) { + String currentEventer = plugin.getConfig().getString("current_eventer", ""); + return currentEventer.isEmpty() ? "Žádný" : currentEventer; + } + + // Placeholder: %trixinity_eventer_online% - zobrazuje jméno eventera pouze pokud je online + if ("eventer_online".equals(params)) { + String currentEventer = plugin.getConfig().getString("current_eventer", ""); + if (currentEventer.isEmpty()) { + return "Žádný"; + } + + // Kontrola, zda je eventer online + if (plugin.getServer().getPlayer(currentEventer) != null) { + return currentEventer; + } else { + return "Offline"; + } + } + + // Placeholder: %trixinity_status% - zobrazuje stav eventu + if ("status".equals(params)) { + String eventStatus = plugin.getConfig().getString("event_status", "ended"); + switch (eventStatus) { + case "starting": + return "Event začíná"; + case "started": + return "Event začal"; + case "ended": + return "Event skončil"; + default: + return "Event skončil"; + } + } + + return null; + } +} \ No newline at end of file diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 6f98179..b193f75 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -1 +1,12 @@ -# A journey of 1,000 lines starts with a single char \ No newline at end of file +# Konfigurace TrixinityEventManager +# Automaticky generovaný soubor pro ukládání dat + +# Aktuální eventer +current_eventer: "" + +# Stav eventu (started/ended) +event_status: "ended" + +# Seznam všech eventerů pro historii +eventers: + # Příklad: BabyMsp2k: true \ No newline at end of file diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 541e578..584f65b 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -5,6 +5,7 @@ api-version: "1.21" author: TrixinityDev description: Plugin pro správu eventů na Minecraft serveru s přehlednými příkazy, integrovanými WorldGuard příkazy a možností základního ovládání přes konzoli nebo přímo ze hry. depend: [WorldGuard] +softdepend: [PlaceholderAPI] commands: trixinity: description: Zobrazí základní informace o pluginu @@ -14,17 +15,27 @@ commands: description: Správa event systému usage: | §c§m------------(§c§l EVENT §c§m)------------ - §c§l- §c/build off/on - §c§l- §c/event off/on - §c§l- §c/pvp off/on - §c§l- §c/spawn (hráč) - §c§l- §c/gmc - §c§l- §c/heal (hráč/*) - §c§l- §c/teleport (hráč) (hráč) - §c§l- §cWorldEdit příkazy + §c§l- §c/event starting + §c§l- §c/event start + §c§l- §c/event end + §c§l- §c/event build off/on + §c§l- §c/event pvp off/on + §c§l- §c/event spawn (hráč) + §c§l- §c/event gmc + §c§l- §c/event heal (hráč/*) + §c§l- §c/event teleport (hráč) (hráč) + §c§l- §c/WorldEdit příkazy §c§m--------------------------------- aliases: [e] - permission: trixinity.event.admin + # permission: trixinity.event.admin <-- ODSTRANĚNO + eventer: + description: Nastavení eventer role pomocí LuckPerms + usage: "/eventer " + permission: "*" + cleareventer: + description: Vymazání současného eventera + usage: "/cleareventer" + permission: "*" permissions: trixinity.admin: description: Přístup ke všem příkazům pluginu