From 253515862eaf3a476111b317ef6bb0191da563c2 Mon Sep 17 00:00:00 2001 From: M_Viper Date: Thu, 5 Feb 2026 22:15:08 +0100 Subject: [PATCH] Update from Git Manager GUI --- .../de/viper/survivalplus/SurvivalPlus.java | 76 ++- .../survivalplus/commands/PluginCommand.java | 88 ++- .../commands/SurvivalPlusTabCompleter.java | 369 ++++++++++++ .../listeners/MobCapListener.java | 12 +- .../listeners/MobLeashLimitListener.java | 8 +- .../survivalplus/listeners/SitListener.java | 2 +- src/main/resources/help.yml | 532 +++++++++--------- src/main/resources/lang.yml | 16 +- src/main/resources/plugin.yml | 2 +- 9 files changed, 796 insertions(+), 309 deletions(-) create mode 100644 src/main/java/de/viper/survivalplus/commands/SurvivalPlusTabCompleter.java diff --git a/src/main/java/de/viper/survivalplus/SurvivalPlus.java b/src/main/java/de/viper/survivalplus/SurvivalPlus.java index 72e1ded..736291a 100644 --- a/src/main/java/de/viper/survivalplus/SurvivalPlus.java +++ b/src/main/java/de/viper/survivalplus/SurvivalPlus.java @@ -43,6 +43,7 @@ import de.viper.survivalplus.commands.WarpsCommand; import de.viper.survivalplus.fun.FunChallengeManager; import de.viper.survivalplus.listeners.ChallengeCollectListener; import de.viper.survivalplus.commands.StartFunChallengeCommand; +import de.viper.survivalplus.commands.SurvivalPlusTabCompleter; // --- NEU: Imports für Heads, Vanish & Shops --- import de.viper.survivalplus.commands.HeadCommand; @@ -339,6 +340,7 @@ public class SurvivalPlus extends JavaPlugin { getCommand("sethome").setExecutor(new HomeCommand(this)); getCommand("delhome").setExecutor(new HomeCommand(this)); getCommand("homelist").setExecutor(new HomeCommand(this)); + getCommand("home").setExecutor(new HomeCommand(this)); getCommand("inv").setExecutor(new InventoryCommand(this)); getCommand("ec").setExecutor(new EnderchestCommand(this)); getCommand("setspawn").setExecutor(new SetSpawnCommand(this)); @@ -429,7 +431,7 @@ public class SurvivalPlus extends JavaPlugin { lockSystem = new LockSystem(this); pluginManager.registerEvents(lockSystem, this); - getCommand("sp").setExecutor(lockSystem); + getCommand("splock").setExecutor(lockSystem); getCommand("sp").setExecutor(new CommandExecutor() { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { @@ -451,6 +453,7 @@ public class SurvivalPlus extends JavaPlugin { }); pluginManager.registerEvents(new RepairSignListener(getConfig(), getLangConfig()), this); pluginManager.registerEvents(new ToolUpgradeListener(this), this); + registerTabCompleters(); startAutoClearTask(); spawnArmorStandExample(); getLogger().info(getMessage("plugin.enabled")); @@ -459,13 +462,13 @@ public class SurvivalPlus extends JavaPlugin { if (Bukkit.getWorlds().isEmpty()) return; Bukkit.getWorlds().forEach(world -> { world.setGameRule(GameRule.KEEP_INVENTORY, false); - getLogger().info("Gamerule keepInventory in Welt '" + world.getName() + "' wurde auf false gesetzt."); + logDebug("Gamerule keepInventory in Welt '" + world.getName() + "' wurde auf false gesetzt."); }); }, 20L); } if (getConfig().getBoolean("force-survival", true)) { pluginManager.registerEvents(new ForceSurvivalListener(this), this); - getLogger().info("Force-Survival ist aktiv. Spieler werden beim Joinen in Survival gesetzt."); + logDebug("Force-Survival ist aktiv. Spieler werden beim Joinen in Survival gesetzt."); } try { if (tablistFile == null) tablistFile = new File(getDataFolder(), "tablist.yml"); @@ -477,7 +480,7 @@ public class SurvivalPlus extends JavaPlugin { if (defStream != null) { tablistConfig.setDefaults(YamlConfiguration.loadConfiguration(new InputStreamReader(defStream))); } - getLogger().info("Animierte Tablist wurde geladen!"); + logDebug("Animierte Tablist wurde geladen!"); } catch (Exception e) { getLogger().log(Level.WARNING, "Fehler beim Laden der Tablist-Konfiguration", e); } @@ -493,10 +496,10 @@ public class SurvivalPlus extends JavaPlugin { } catch (NoSuchMethodError | NoClassDefFoundError e) { world.setGameRuleValue(GameRule.COMMAND_BLOCK_OUTPUT.getName(), Boolean.toString(cmdAllowed)); } - getLogger().info("Gamerule commandBlockOutput in Welt '" + world.getName() + "' gesetzt auf " + cmdAllowed); + logDebug("Gamerule commandBlockOutput in Welt '" + world.getName() + "' gesetzt auf " + cmdAllowed); } removeForbiddenBlocksFromInventories(cmdAllowed, structAllowed); - getLogger().info("Block-Regeln angewendet: CommandBlocks erlaubt=" + cmdAllowed + ", StructureBlocks erlaubt=" + structAllowed); + logDebug("Block-Regeln angewendet: CommandBlocks erlaubt=" + cmdAllowed + ", StructureBlocks erlaubt=" + structAllowed); } private void ensureVersionAtTop(File file, String version) { @@ -563,7 +566,7 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver } Files.write(file.toPath(), lines, StandardCharsets.UTF_8); - getLogger().info("config.yml: Version oben gesetzt auf " + version); + logDebug("config.yml: Version oben gesetzt auf " + version); } catch (IOException e) { getLogger().warning("Konnte Version in config.yml nicht setzen: " + e.getMessage()); } @@ -885,7 +888,7 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver // Save updated config try { currentConfig.save(file); - getLogger().info(fileName + " erfolgreich aktualisiert."); + logDebug(fileName + " erfolgreich aktualisiert."); } catch (IOException e) { getLogger().severe("Fehler beim Speichern der " + fileName + ": " + e.getMessage()); } @@ -1113,7 +1116,7 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver if (!leashesFile.exists()) { try { leashesFile.createNewFile(); - getLogger().info("leashes.yml wurde erstellt."); + logDebug("leashes.yml wurde erstellt."); } catch (IOException e) { getLogger().severe("Fehler beim Erstellen der leashes.yml: " + e.getMessage()); } @@ -1128,7 +1131,7 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver public void saveLeashesConfig() { try { leashesConfig.save(leashesFile); - getLogger().info("leashes.yml erfolgreich gespeichert."); + logDebug("leashes.yml erfolgreich gespeichert."); } catch (IOException e) { getLogger().log(Level.SEVERE, "Fehler beim Speichern der leashes.yml: " + e.getMessage()); } @@ -1136,7 +1139,7 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver public void reloadLeashesConfig() { leashesConfig = YamlConfiguration.loadConfiguration(leashesFile); - getLogger().info("leashes.yml erfolgreich neu geladen."); + logDebug("leashes.yml erfolgreich neu geladen."); } // === MobCap.yml === @@ -1145,7 +1148,7 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver if (!mobCapFile.exists()) { try { mobCapFile.createNewFile(); - getLogger().info("mobcap.yml wurde erstellt."); + logDebug("mobcap.yml wurde erstellt."); } catch (IOException e) { getLogger().severe("Fehler beim Erstellen der mobcap.yml: " + e.getMessage()); } @@ -1160,7 +1163,7 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver public void saveMobCapConfig() { try { mobCapConfig.save(mobCapFile); - getLogger().info("mobcap.yml erfolgreich gespeichert."); + logDebug("mobcap.yml erfolgreich gespeichert."); } catch (IOException e) { getLogger().log(Level.SEVERE, "Fehler beim Speichern der mobcap.yml: " + e.getMessage()); } @@ -1168,7 +1171,7 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver public void reloadMobCapConfig() { mobCapConfig = YamlConfiguration.loadConfiguration(mobCapFile); - getLogger().info("mobcap.yml erfolgreich neu geladen."); + logDebug("mobcap.yml erfolgreich neu geladen."); } // === NEU: MobAdapt.yml === @@ -1210,10 +1213,10 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver int intervalTicks = intervalMinutes * 60 * 20; // Minuten in Ticks umrechnen if (intervalTicks > 0) { autoClearTaskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new AutoClearTask(this), intervalTicks, intervalTicks); - getLogger().info("AutoClearTask gestartet mit Intervall von " + intervalMinutes + " Minuten."); + logDebug("AutoClearTask gestartet mit Intervall von " + intervalMinutes + " Minuten."); } } else { - getLogger().info("AutoClearTask deaktiviert, da auto-clear-enabled auf false gesetzt ist."); + logDebug("AutoClearTask deaktiviert, da auto-clear-enabled auf false gesetzt ist."); } } @@ -1283,11 +1286,13 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver LockSystem lockSystem = new LockSystem(this); pm.registerEvents(lockSystem, this); - getCommand("lock").setExecutor(lockSystem); + getCommand("splock").setExecutor(lockSystem); // Commands neu registrieren getCommand("friend").setExecutor(friendCommand); + registerTabCompleters(); + getLogger().info(getMessage("plugin.reloaded")); } catch (Exception e) { getLogger().severe("Fehler beim Neuladen des Plugins: " + e.getMessage()); @@ -1299,6 +1304,14 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver return bannerManager; } + public WarpManager getWarpManager() { + return warpManager; + } + + public FunChallengeManager getFunChallengeManager() { + return funChallengeManager; + } + // Nur Fehler/Exceptions public void log(String msg) { if (getConfig().getBoolean("debug-logging", false) && debugWriter != null) { @@ -1308,6 +1321,25 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver } } + private void registerTabCompleters() { + SurvivalPlusTabCompleter completer = new SurvivalPlusTabCompleter(this); + String[] commands = { + "sp", "ir", "gm", "sethome", "delhome", "homelist", "home", "inv", "ec", + "setworldspawn", "setspawn", "clearchat", "clearitems", "closedoors", "sit", + "back", "friend", "stats", "showarmorstands", "cleardebugarmorstands", "trash", + "workbench", "anvil", "leashcount", "splock", "tp", "tphere", "tpa", + "tpaccept", "tpdeny", "block", "unblock", "blocklist", "kit", "nick", "ride", + "vanish", "freeze", "lootchests", "tploot", "day", "night", "trade", "tradeaccept", + "report", "showreport", "clearreport", "shop", "spawn", "setwarp", "delwarp", + "warps", "startchallenge", "heal", "claim", "head" + }; + for (String name : commands) { + if (getCommand(name) != null) { + getCommand(name).setTabCompleter(completer); + } + } + } + public void logError(String msg, Throwable t) { if (getConfig().getBoolean("debug-logging", false) && debugWriter != null) { debugWriter.println("[" + new java.util.Date() + "] ERROR: " + msg); @@ -1317,6 +1349,16 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver } } + public void logDebug(String msg) { + if (!getConfig().getBoolean("debug-logging", false)) { + return; + } + if (debugWriter != null) { + debugWriter.println("[" + new java.util.Date() + "] " + msg); + } + getLogger().info(msg); + } + // Komplette Plugin-Logs in console.log public void logConsole(String msg) { if (getConfig().getBoolean("debug-logging", false) && consoleWriter != null) { diff --git a/src/main/java/de/viper/survivalplus/commands/PluginCommand.java b/src/main/java/de/viper/survivalplus/commands/PluginCommand.java index ca5e0a2..ab592f8 100644 --- a/src/main/java/de/viper/survivalplus/commands/PluginCommand.java +++ b/src/main/java/de/viper/survivalplus/commands/PluginCommand.java @@ -30,20 +30,32 @@ public class PluginCommand implements CommandExecutor { // /sp oder /sp help if (args.length == 0 || args[0].equalsIgnoreCase("help")) { + String mode = "all"; int page = 1; + if (args.length > 1 && args[0].equalsIgnoreCase("help")) { - try { - page = Integer.parseInt(args[1]); - if (page < 1) page = 1; - } catch (NumberFormatException e) { - sender.sendMessage(color(lang.getString( - "sp.invalid-subcommand", - "§cUngültiger Unterbefehl! Verwendung: /sp [reload|help|info|share]" - ))); - return true; + String arg1 = args[1]; + if (isInteger(arg1)) { + page = Integer.parseInt(arg1); + } else { + mode = arg1.toLowerCase(); + if (args.length > 2) { + String arg2 = args[2]; + if (isInteger(arg2)) { + page = Integer.parseInt(arg2); + } else { + sender.sendMessage(color(lang.getString( + "sp.invalid-subcommand", + "§cUngültiger Unterbefehl! Verwendung: /sp help [player|admin|system|all] [seite]" + ))); + return true; + } + } } } - showHelp(sender, page); + + if (page < 1) page = 1; + showHelp(sender, mode, page); return true; } @@ -175,7 +187,7 @@ public class PluginCommand implements CommandExecutor { return true; } - private void showHelp(CommandSender sender, int page) { + private void showHelp(CommandSender sender, String mode, int page) { FileConfiguration help = plugin.getHelpConfig(); FileConfiguration lang = plugin.getLangConfig(); @@ -184,7 +196,30 @@ public class PluginCommand implements CommandExecutor { return; } - List commands = new ArrayList<>(help.getConfigurationSection("commands").getKeys(false)); + List orderedCommands = new ArrayList<>(help.getConfigurationSection("commands").getKeys(false)); + if (orderedCommands.isEmpty()) { + sender.sendMessage(color(lang.getString("sp.help-not-found", "&cKeine Befehle verfügbar."))); + return; + } + + String normalizedMode = mode == null ? "all" : mode.toLowerCase(); + if (!normalizedMode.equals("all") && !normalizedMode.equals("player") + && !normalizedMode.equals("admin") && !normalizedMode.equals("system")) { + sender.sendMessage(color(help.getString( + "help-usage", + "&cVerwendung: /sp help [player|admin|system|all] [seite]" + ))); + return; + } + + List commands = new ArrayList<>(); + for (String key : orderedCommands) { + String group = help.getString("commands." + key + ".group", "player").toLowerCase(); + if (normalizedMode.equals("all") || group.equals(normalizedMode)) { + commands.add(key); + } + } + if (commands.isEmpty()) { sender.sendMessage(color(lang.getString("sp.help-not-found", "&cKeine Befehle verfügbar."))); return; @@ -199,19 +234,30 @@ public class PluginCommand implements CommandExecutor { int startIndex = (page - 1) * COMMANDS_PER_PAGE; int endIndex = Math.min(startIndex + COMMANDS_PER_PAGE, commands.size()); + String lastGroup = null; for (int i = startIndex; i < endIndex; i++) { String cmd = commands.get(i); + String group = help.getString("commands." + cmd + ".group", "player").toLowerCase(); + if (lastGroup == null || !lastGroup.equals(group)) { + String groupTitle = help.getString("groups." + group + ".title", "&6-- " + group + " --"); + sender.sendMessage(color(groupTitle)); + lastGroup = group; + } String usage = help.getString("commands." + cmd + ".usage", ""); String description = help.getString("commands." + cmd + ".description", ""); sender.sendMessage(color(usage + " §7- " + description)); } if (sender instanceof Player player) { + String modeSuffix = normalizedMode.equals("all") ? "" : " " + normalizedMode; + String navBase = "/sp help" + modeSuffix + " "; TextComponent navigation = new TextComponent(); if (page > 1) { TextComponent prev = new TextComponent(color(help.getString("navigation.prev", "« Vorherige "))); - prev.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/sp help " + (page - 1))); + prev.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, navBase + (page - 1))); + prev.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + new ComponentBuilder("§7Klicke für Seite " + (page - 1)).create())); navigation.addExtra(prev); } else { navigation.addExtra(color(help.getString("navigation.prev-disabled", "« "))); @@ -224,7 +270,9 @@ public class PluginCommand implements CommandExecutor { if (page < totalPages) { TextComponent next = new TextComponent(color(help.getString("navigation.next", " Nächste »"))); - next.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/sp help " + (page + 1))); + next.setClickEvent(new ClickEvent(ClickEvent.Action.SUGGEST_COMMAND, navBase + (page + 1))); + next.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, + new ComponentBuilder("§7Klicke für Seite " + (page + 1)).create())); navigation.addExtra(next); } else { navigation.addExtra(color(help.getString("navigation.next-disabled", " »"))); @@ -242,6 +290,18 @@ public class PluginCommand implements CommandExecutor { sender.sendMessage(color(help.getString("footer", "&7=========================="))); } + private boolean isInteger(String value) { + if (value == null || value.isEmpty()) { + return false; + } + for (int i = 0; i < value.length(); i++) { + if (!Character.isDigit(value.charAt(i))) { + return false; + } + } + return true; + } + private String color(String input) { return ChatColor.translateAlternateColorCodes('&', input == null ? "" : input); } diff --git a/src/main/java/de/viper/survivalplus/commands/SurvivalPlusTabCompleter.java b/src/main/java/de/viper/survivalplus/commands/SurvivalPlusTabCompleter.java new file mode 100644 index 0000000..e0b83dd --- /dev/null +++ b/src/main/java/de/viper/survivalplus/commands/SurvivalPlusTabCompleter.java @@ -0,0 +1,369 @@ +package de.viper.survivalplus.commands; + +import de.viper.survivalplus.SurvivalPlus; +import de.viper.survivalplus.Manager.Warp; +import de.viper.survivalplus.Manager.WarpManager; +import de.viper.survivalplus.fun.FunChallenge; +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.OfflinePlayer; +import org.bukkit.World; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Locale; +import java.util.Set; +import java.util.UUID; + +public class SurvivalPlusTabCompleter implements TabCompleter { + + private static final List SP_SUBCOMMANDS = List.of( + "help", "reload", "info", "share", "shareconfirm", "sharecancel", "cb", + "lock", "unlock", "friendadd", "friendremove" + ); + private static final List SP_CB_SUBCOMMANDS = List.of("add", "remove", "list"); + private static final List FRIEND_SUBCOMMANDS = List.of("add", "accept", "deny", "list", "del", "confirm", "tp"); + private static final List CLAIM_SUBCOMMANDS = List.of("mark", "unclaim", "del", "delete", "trust", "untrust", "info", "kick", "ban", "unban"); + private static final List SPLOCK_SUBCOMMANDS = List.of("lock", "unlock", "friendadd", "friendremove"); + private static final List SHOP_SUBCOMMANDS = List.of("gui", "add"); + private static final List NICK_SUBCOMMANDS = List.of("off", "remove", "reset"); + private static final List GAMEMODE_SUBCOMMANDS = List.of("0", "1", "2", "3", "survival", "creative", "adventure", "spectator"); + + private final SurvivalPlus plugin; + + public SurvivalPlusTabCompleter(SurvivalPlus plugin) { + this.plugin = plugin; + } + + @Override + public List onTabComplete(CommandSender sender, Command command, String alias, String[] args) { + String cmd = command.getName().toLowerCase(Locale.ROOT); + if (args.length == 0) { + return Collections.emptyList(); + } + + switch (cmd) { + case "sp": + return completeSp(sender, args); + case "friend": + return completeFriend(sender, args); + case "claim": + return completeClaim(sender, args); + case "splock": + return completeSplock(sender, args); + case "shop": + return completeShop(sender, args); + case "nick": + return filterPrefix(NICK_SUBCOMMANDS, args[0]); + case "gm": + return completeGamemode(sender, args); + case "tp": + case "tphere": + case "tpa": + case "trade": + case "tradeaccept": + case "report": + case "showreport": + case "clearreport": + case "block": + case "unblock": + case "head": + case "freeze": + return completePlayerArg(sender, args); + case "heal": + case "inv": + case "ec": + case "ride": + return completeOptionalPlayerArg(sender, args); + case "tploot": + return completeTploot(args); + case "startchallenge": + return completeChallenges(args); + case "delwarp": + return completePlayerWarpNames(sender, args); + case "home": + case "delhome": + return completePlayerHomeNames(sender, args); + default: + return Collections.emptyList(); + } + } + + private List completeSp(CommandSender sender, String[] args) { + if (args.length == 1) { + return filterPrefix(SP_SUBCOMMANDS, args[0]); + } + if (args.length == 2 && args[0].equalsIgnoreCase("cb")) { + return filterPrefix(SP_CB_SUBCOMMANDS, args[1]); + } + if (args.length == 3 && args[0].equalsIgnoreCase("cb") && args[1].equalsIgnoreCase("remove")) { + return filterPrefix(getBlockedCommands(), args[2]); + } + if (args.length == 2 && (args[0].equalsIgnoreCase("friendadd") || args[0].equalsIgnoreCase("friendremove"))) { + return filterPrefix(getOnlinePlayerNames(sender), args[1]); + } + return Collections.emptyList(); + } + + private List completeFriend(CommandSender sender, String[] args) { + if (args.length == 1) { + return filterPrefix(FRIEND_SUBCOMMANDS, args[0]); + } + if (args.length == 2) { + String sub = args[0].toLowerCase(Locale.ROOT); + if (sub.equals("add") || sub.equals("accept") || sub.equals("deny") || sub.equals("tp")) { + return filterPrefix(getOnlinePlayerNames(sender), args[1]); + } + if (sub.equals("del") || sub.equals("confirm")) { + return filterPrefix(getFriendNames(sender), args[1]); + } + } + return Collections.emptyList(); + } + + private List completeClaim(CommandSender sender, String[] args) { + if (args.length == 1) { + return filterPrefix(CLAIM_SUBCOMMANDS, args[0]); + } + if (args.length == 2) { + String sub = args[0].toLowerCase(Locale.ROOT); + if (sub.equals("mark")) { + return filterPrefix(List.of("1", "2"), args[1]); + } + if (sub.equals("trust") || sub.equals("untrust") || sub.equals("kick") || sub.equals("ban") || sub.equals("unban") + || sub.equals("unclaim") || sub.equals("del") || sub.equals("delete")) { + return filterPrefix(getOnlinePlayerNames(sender), args[1]); + } + } + return Collections.emptyList(); + } + + private List completeSplock(CommandSender sender, String[] args) { + if (args.length == 1) { + return filterPrefix(SPLOCK_SUBCOMMANDS, args[0]); + } + if (args.length == 2) { + String sub = args[0].toLowerCase(Locale.ROOT); + if (sub.equals("friendadd") || sub.equals("friendremove")) { + return filterPrefix(getOnlinePlayerNames(sender), args[1]); + } + } + return Collections.emptyList(); + } + + private List completeShop(CommandSender sender, String[] args) { + if (args.length == 1) { + return filterPrefix(SHOP_SUBCOMMANDS, args[0]); + } + if (args.length == 2 && args[0].equalsIgnoreCase("add")) { + String prefix = args[1]; + if (prefix.length() < 2) { + return Collections.emptyList(); + } + return getMaterialNames(prefix); + } + return Collections.emptyList(); + } + + private List completeGamemode(CommandSender sender, String[] args) { + if (args.length == 1) { + return filterPrefix(GAMEMODE_SUBCOMMANDS, args[0]); + } + if (args.length == 2) { + return filterPrefix(getOnlinePlayerNames(sender), args[1]); + } + return Collections.emptyList(); + } + + private List completePlayerArg(CommandSender sender, String[] args) { + if (args.length == 1) { + return filterPrefix(getOnlinePlayerNames(sender), args[0]); + } + return Collections.emptyList(); + } + + private List completeOptionalPlayerArg(CommandSender sender, String[] args) { + if (args.length == 1) { + return filterPrefix(getOnlinePlayerNames(sender), args[0]); + } + return Collections.emptyList(); + } + + private List completeTploot(String[] args) { + if (args.length == 1) { + return filterPrefix(getWorldNames(), args[0]); + } + return Collections.emptyList(); + } + + private List completeChallenges(String[] args) { + if (args.length == 1) { + return filterPrefix(getChallengeNames(), args[0]); + } + return Collections.emptyList(); + } + + private List completePlayerHomeNames(CommandSender sender, String[] args) { + if (args.length == 1) { + return filterPrefix(getHomeNames(sender), args[0]); + } + return Collections.emptyList(); + } + + private List completePlayerWarpNames(CommandSender sender, String[] args) { + if (args.length == 1) { + return filterPrefix(getWarpNames(sender), args[0]); + } + return Collections.emptyList(); + } + + private List getOnlinePlayerNames(CommandSender sender) { + List names = new ArrayList<>(); + for (Player player : Bukkit.getOnlinePlayers()) { + if (!player.getName().equalsIgnoreCase(sender.getName())) { + names.add(player.getName()); + } + } + return names; + } + + private List getBlockedCommands() { + FileConfiguration blocked = plugin.getBlockedCommandsConfig(); + if (blocked == null) { + return Collections.emptyList(); + } + List commands = blocked.getStringList("blocked-commands"); + return commands == null ? Collections.emptyList() : commands; + } + + private List getFriendNames(CommandSender sender) { + if (!(sender instanceof Player player)) { + return Collections.emptyList(); + } + FileConfiguration friends = plugin.getFriendsConfig(); + if (friends == null) { + return Collections.emptyList(); + } + List friendIds = friends.getStringList(player.getUniqueId().toString() + ".friends"); + if (friendIds == null || friendIds.isEmpty()) { + return Collections.emptyList(); + } + List names = new ArrayList<>(); + for (String id : friendIds) { + try { + UUID uuid = UUID.fromString(id); + OfflinePlayer offline = Bukkit.getOfflinePlayer(uuid); + if (offline.getName() != null) { + names.add(offline.getName()); + continue; + } + String storedName = friends.getString(id + ".name"); + if (storedName != null && !storedName.isEmpty()) { + names.add(storedName); + } + } catch (IllegalArgumentException ignored) { + } + } + return names; + } + + private List getHomeNames(CommandSender sender) { + if (!(sender instanceof Player player)) { + return Collections.emptyList(); + } + FileConfiguration homes = plugin.getHomesConfig(); + if (homes == null) { + return Collections.emptyList(); + } + String path = "homes." + player.getUniqueId(); + if (homes.getConfigurationSection(path) == null) { + return Collections.emptyList(); + } + return new ArrayList<>(homes.getConfigurationSection(path).getKeys(false)); + } + + private List getWarpNames(CommandSender sender) { + if (!(sender instanceof Player player)) { + return Collections.emptyList(); + } + WarpManager warpManager = plugin.getWarpManager(); + if (warpManager == null) { + return Collections.emptyList(); + } + List warps = new ArrayList<>(); + for (Warp warp : warpManager.getWarps().values()) { + if (warp.getOwner().equalsIgnoreCase(player.getName())) { + warps.add(warp.getName()); + } + } + return warps; + } + + private List getChallengeNames() { + if (plugin.getFunChallengeManager() == null) { + return Collections.emptyList(); + } + List names = new ArrayList<>(); + for (FunChallenge challenge : plugin.getFunChallengeManager().getChallenges()) { + names.add(challenge.getName()); + } + return names; + } + + private List getWorldNames() { + List names = new ArrayList<>(); + for (World world : Bukkit.getWorlds()) { + names.add(world.getName()); + } + return names; + } + + private List getMaterialNames(String prefix) { + List names = new ArrayList<>(); + String normalized = prefix == null ? "" : prefix.toUpperCase(Locale.ROOT); + for (Material material : Material.values()) { + if (!material.isItem() || material == Material.AIR) { + continue; + } + String name = material.name(); + if (name.startsWith(normalized)) { + names.add(name); + } + } + Collections.sort(names); + if (names.size() > 25) { + return new ArrayList<>(names.subList(0, 25)); + } + return names; + } + + private List filterPrefix(Collection options, String prefix) { + if (options == null || options.isEmpty()) { + return Collections.emptyList(); + } + String normalized = prefix == null ? "" : prefix.toLowerCase(Locale.ROOT); + List results = new ArrayList<>(); + Set dedup = new HashSet<>(); + for (String option : options) { + if (option == null) { + continue; + } + String value = option.toString(); + if (value.toLowerCase(Locale.ROOT).startsWith(normalized)) { + if (dedup.add(value)) { + results.add(value); + } + } + } + Collections.sort(results); + return results; + } +} diff --git a/src/main/java/de/viper/survivalplus/listeners/MobCapListener.java b/src/main/java/de/viper/survivalplus/listeners/MobCapListener.java index c0e5cc3..b711386 100644 --- a/src/main/java/de/viper/survivalplus/listeners/MobCapListener.java +++ b/src/main/java/de/viper/survivalplus/listeners/MobCapListener.java @@ -32,7 +32,7 @@ public class MobCapListener implements Listener { public void reloadConfig(FileConfiguration config) { this.enabled = config.getBoolean("mob-cap.enabled", true); this.maxAnimalsPerChunk = config.getInt("mob-cap.max-animals-per-chunk", 10); - plugin.getLogger().info("MobCapListener: enabled=" + enabled + ", maxAnimalsPerChunk=" + maxAnimalsPerChunk); + plugin.logDebug("MobCapListener: enabled=" + enabled + ", maxAnimalsPerChunk=" + maxAnimalsPerChunk); // Bereinige bestehende Daten chunkAnimalMap.clear(); @@ -40,7 +40,7 @@ public class MobCapListener implements Listener { if (!enabled) { plugin.getMobCapConfig().set("mobcap", null); // Bereinige mobcap.yml plugin.saveMobCapConfig(); - plugin.getLogger().info("MobCapListener: Daten bereinigt, da enabled=false"); + plugin.logDebug("MobCapListener: Daten bereinigt, da enabled=false"); return; } @@ -89,7 +89,7 @@ public class MobCapListener implements Listener { // Speichere aktualisierte mobcap.yml saveChunkAnimalMap(); - plugin.getLogger().info("MobCapListener: Nach Reload " + chunkAnimalMap.size() + " Chunks mit Tieren gefunden."); + plugin.logDebug("MobCapListener: Nach Reload " + chunkAnimalMap.size() + " Chunks mit Tieren gefunden."); } @EventHandler @@ -106,7 +106,7 @@ public class MobCapListener implements Listener { int animalCount = animalToPlayer.size(); if (animalCount >= maxAnimalsPerChunk) { event.setCancelled(true); - plugin.getLogger().info("Spawn von " + entity.getType() + " in Chunk " + chunkKey + " verhindert: Limit von " + maxAnimalsPerChunk + " erreicht."); + plugin.logDebug("Spawn von " + entity.getType() + " in Chunk " + chunkKey + " verhindert: Limit von " + maxAnimalsPerChunk + " erreicht."); // HINWEIS: Wenn du dem Züchter eine Nachricht schicken willst, nutze EntityBreedEvent // Hier ist das nicht möglich, weil man beim Spawn keinen Spielerzugriff hat @@ -132,7 +132,7 @@ public class MobCapListener implements Listener { if (animalCount >= maxAnimalsPerChunk) { event.setCancelled(true); player.sendMessage(plugin.getMessage("mob-cap.limit-reached").replace("%max%", String.valueOf(maxAnimalsPerChunk))); - plugin.getLogger().info("Interaktion mit " + entity.getType() + " in Chunk " + chunkKey + " verhindert: Limit von " + maxAnimalsPerChunk + " erreicht."); + plugin.logDebug("Interaktion mit " + entity.getType() + " in Chunk " + chunkKey + " verhindert: Limit von " + maxAnimalsPerChunk + " erreicht."); } else { animalToPlayer.put(entity.getUniqueId(), player.getUniqueId()); saveChunkAnimalMap(); @@ -157,7 +157,7 @@ public class MobCapListener implements Listener { chunkAnimalMap.remove(chunkKey); } saveChunkAnimalMap(); - plugin.getLogger().info("Tier " + entity.getType() + " in Chunk " + chunkKey + " gestorben. Verbleibende Tiere: " + animalToPlayer.size()); + plugin.logDebug("Tier " + entity.getType() + " in Chunk " + chunkKey + " gestorben. Verbleibende Tiere: " + animalToPlayer.size()); } } diff --git a/src/main/java/de/viper/survivalplus/listeners/MobLeashLimitListener.java b/src/main/java/de/viper/survivalplus/listeners/MobLeashLimitListener.java index 2ab8fe3..035f84f 100644 --- a/src/main/java/de/viper/survivalplus/listeners/MobLeashLimitListener.java +++ b/src/main/java/de/viper/survivalplus/listeners/MobLeashLimitListener.java @@ -30,7 +30,7 @@ public class MobLeashLimitListener implements Listener { public void reloadConfig(FileConfiguration config) { this.enabled = config.getBoolean("mob-leash-limit.enabled", true); this.maxLeashCount = config.getInt("mob-leash-limit.max-leash-count", 5); - plugin.getLogger().info("MobLeashLimitListener: enabled=" + enabled + ", maxLeashCount=" + maxLeashCount); + plugin.logDebug("MobLeashLimitListener: enabled=" + enabled + ", maxLeashCount=" + maxLeashCount); // Bereinige bestehende Daten leashedEntities.clear(); @@ -40,7 +40,7 @@ public class MobLeashLimitListener implements Listener { if (!enabled) { plugin.getLeashesConfig().set("leashes", null); // Bereinige leashes.yml plugin.saveLeashesConfig(); - plugin.getLogger().info("MobLeashLimitListener: Daten bereinigt, da enabled=false"); + plugin.logDebug("MobLeashLimitListener: Daten bereinigt, da enabled=false"); return; } @@ -119,7 +119,7 @@ public class MobLeashLimitListener implements Listener { // Speichere aktualisierte leashes.yml plugin.saveLeashesConfig(); - plugin.getLogger().info("MobLeashLimitListener: Nach Reload " + leashedEntities.size() + " Spieler mit angeleinten Tieren gefunden."); + plugin.logDebug("MobLeashLimitListener: Nach Reload " + leashedEntities.size() + " Spieler mit angeleinten Tieren gefunden."); } @EventHandler @@ -135,7 +135,7 @@ public class MobLeashLimitListener implements Listener { if (itemInHand != null && itemInHand.getType() == Material.LEAD) { Set playerLeashedEntities = leashedEntities.computeIfAbsent(playerId, k -> new HashSet<>()); int currentCount = playerLeashedEntities.size(); - plugin.getLogger().info("PlayerInteractEntity: player=" + player.getName() + ", currentCount=" + currentCount + ", maxLeashCount=" + maxLeashCount); + plugin.logDebug("PlayerInteractEntity: player=" + player.getName() + ", currentCount=" + currentCount + ", maxLeashCount=" + maxLeashCount); if (playerLeashedEntities.contains(entityId)) { // Ableinen diff --git a/src/main/java/de/viper/survivalplus/listeners/SitListener.java b/src/main/java/de/viper/survivalplus/listeners/SitListener.java index fe67d4f..c46868b 100644 --- a/src/main/java/de/viper/survivalplus/listeners/SitListener.java +++ b/src/main/java/de/viper/survivalplus/listeners/SitListener.java @@ -196,7 +196,7 @@ public class SitListener implements Listener { } } } - plugin.getLogger().info("Ghost Stands (Sit) bereinigt."); + plugin.logDebug("Ghost Stands (Sit) bereinigt."); }, 20L); } } \ No newline at end of file diff --git a/src/main/resources/help.yml b/src/main/resources/help.yml index b1dbdab..0cf2d16 100644 --- a/src/main/resources/help.yml +++ b/src/main/resources/help.yml @@ -1,362 +1,364 @@ header: "&6=== SurvivalPlus Hilfe ===" footer: "&6===========================" +help-usage: "&cVerwendung: /sp help [player|admin|system|all] [seite]" + +navigation: + prev: "&7« Vorherige Seite" + next: "&7Nächste Seite »" + prev-disabled: "&8« Vorherige Seite" + next-disabled: "&8Nächste Seite »" + page: "&fSeite {current} von {total}" + +groups: + system: + title: "&6-- System --" + player: + title: "&6-- Spieler --" + admin: + title: "&6-- Admin --" commands: - gm: - description: "&eÄndert den Spielmodus eines Spielers (survival, creative, adventure, spectator)." - usage: "&b/gm [spieler]" - sp: - description: "&eHauptbefehl für SurvivalPlus mit Unterbefehlen." - usage: "&b/sp [reload | help | info | share | lock]" - - sp_reload: - description: "&eLädt das Plugin neu." - usage: "&b/sp reload" + group: system + description: "&eHauptbefehl für SurvivalPlus." + usage: "&b/sp [help|info|share|cb|reload]" sp_help: - description: "&eZeigt die Hilfe für SurvivalPlus-Befehle an." - usage: "&b/sp help" + group: system + description: "&eZeigt die Hilfe an (Spieler/Admin/System)." + usage: "&b/sp help [player|admin|system|all] [seite]" sp_info: - description: "&eZeigt Informationen über das Plugin an." + group: system + description: "&eZeigt Plugin-Infos und Links." usage: "&b/sp info" sp_share: - description: "&eTeilt deine Koordinaten nach Bestätigung mit allen Spielern." + group: player + description: "&eTeilt deine Koordinaten nach Bestätigung." usage: "&b/sp share" + shareconfirm: + group: player + description: "&eBestätigt das Teilen der Koordinaten." + usage: "&b/sp shareconfirm" + + sharecancel: + group: player + description: "&eBricht das Teilen der Koordinaten ab." + usage: "&b/sp sharecancel" + sp_cb_add: + group: admin description: "&eFügt einen Befehl zur Blockierliste hinzu." usage: "&b/sp cb add " sp_cb_remove: + group: admin description: "&eEntfernt einen Befehl aus der Blockierliste." usage: "&b/sp cb remove " sp_cb_list: + group: admin description: "&eZeigt die Liste der blockierten Befehle an." usage: "&b/sp cb list" + sp_reload: + group: admin + description: "&eLädt das Plugin neu." + usage: "&b/sp reload" + + splock: + group: player + description: "&eSperrt/entsperrt Container und verwaltet Freunde." + usage: "&b/splock lock|unlock|friendadd|friendremove [spieler]" + sp_lock_lock: - description: "&eSperrt einen Container (z.B. Kiste oder Tür)." - usage: "&b/sp lock " + group: player + description: "&eStartet den Lock-Modus (Block anklicken)." + usage: "&b/sp lock" sp_lock_unlock: - description: "&eEntsperrt einen Container (z.B. Kiste oder Tür)." - usage: "&b/sp lock " + group: player + description: "&eEntsperrt einen Block, den du ansiehst." + usage: "&b/sp unlock" sp_lock_friendadd: - description: "&eFügt einen Freund zum Container-Sperrsystem hinzu." - usage: "&b/sp lock friendadd " + group: player + description: "&eFügt einen Freund zum Lock-System hinzu." + usage: "&b/sp friendadd " sp_lock_friendremove: - description: "&eEntfernt einen Freund aus dem Container-Sperrsystem." - usage: "&b/sp lock friendremove " + group: player + description: "&eEntfernt einen Freund aus dem Lock-System." + usage: "&b/sp friendremove " - shareconfirm: - description: "&eBestätigt das Teilen deiner Koordinaten mit allen Spielern." - usage: "&b/sp shareconfirm" - - sharecancel: - description: "&eBricht das Teilen deiner Koordinaten ab." - usage: "&b/sp sharecancel" + home: + group: player + description: "&eTeleportiert dich zu einem Home." + usage: "&b/home " sethome: - description: "&eSetzt ein Home mit dem angegebenen Namen." + group: player + description: "&eSetzt ein Home mit Namen." usage: "&b/sethome " delhome: - description: "&eLöscht ein Home mit dem angegebenen Namen." + group: player + description: "&eLöscht ein Home." usage: "&b/delhome " homelist: - description: "&eÖffnet eine GUI mit allen Homes." + group: player + description: "&eÖffnet die Homes-Übersicht." usage: "&b/homelist" - home: - description: "&eTeleportiert zu einem Home." - usage: "&b/home " + warps: + group: player + description: "&eÖffnet die Warps-Übersicht." + usage: "&b/warps" - inv: - description: "&eÖffnet das Inventar (eigenes oder das eines anderen Spielers)." - usage: "&b/inv [spieler]" + setwarp: + group: player + description: "&eSetzt einen persönlichen Warp." + usage: "&b/setwarp " - ec: - description: "&eÖffnet die Endertruhe (eigene oder die eines anderen Spielers)." - usage: "&b/ec [spieler]" + delwarp: + group: player + description: "&eLöscht einen persönlichen Warp." + usage: "&b/delwarp " - setworldspawn: - description: "&eSetzt den Weltspawnpunkt auf die Position des Spielers." - usage: "&b/setworldspawn" - - setspawn: - description: "&eSetzt den Server-Spawnpunkt auf die Position des Spielers." - usage: "&b/setspawn" - - clearchat: - description: "&eLöscht den Chat für alle Spieler." - usage: "&b/clearchat" - - clearitems: - description: "&eLöscht alle herumliegenden Items." - usage: "&b/clearitems" - - closedoors: - description: "&eSchließt alle Türen im angegebenen Radius." - usage: "&b/closedoors " - - sit: - description: "&eLässt den Spieler sich hinsetzen oder aufstehen." - usage: "&b/sit" + spawn: + group: player + description: "&eTeleportiert dich zum Weltspawn." + usage: "&b/spawn" back: + group: player description: "&eTeleportiert zum letzten Todespunkt." usage: "&b/back" - friend: - description: "&eVerwaltet die Freundesliste (hinzufügen, entfernen, anzeigen, teleportieren)." - usage: "&b/friend [add | accept | deny | list | del | tp] [Spieler]" - subcommands: - add: - description: "&eFügt einen Spieler zur Freundesliste hinzu." - usage: "&b/friend add " - accept: - description: "&eAkzeptiert eine Freundschaftsanfrage." - usage: "&b/friend accept " - deny: - description: "&eLehnt eine Freundschaftsanfrage ab." - usage: "&b/friend deny " - list: - description: "&eZeigt die Freundesliste an." - usage: "&b/friend list" - del: - description: "&eEntfernt einen Spieler aus der Freundesliste." - usage: "&b/friend del " - tp: - description: "&eTeleportiert dich zu einem Freund." - usage: "&b/friend tp " - - freeze: - description: "&eFriert einen Spieler ein (Bewegung unmöglich)." - usage: "&b/freeze " - - ir: - description: "&eBenennt das Item in der Hand um." - usage: "&b/ir " - - showarmorstands: - description: "&eMacht alle unsichtbaren Armor Stands sichtbar." - usage: "&b/showarmorstands" - - cleardebugarmorstands: - description: "&eEntfernt alle Debug-ArmorStands." - usage: "&b/cleardebugarmorstands" - - trash: - description: "&eÖffnet den Mülleimer." - usage: "&b/trash" - - workbench: - description: "&eÖffnet eine Werkbank-GUI." - usage: "&b/workbench" - - anvil: - description: "&eÖffnet eine Amboss-GUI." - usage: "&b/anvil" - - stats: - description: "&eZeigt deine Statistiken an." - usage: "&b/stats" - - spawn: - description: "&eTeleportiert dich zum Weltspawnpunkt." - usage: "&b/spawn" - - tp: - description: "&eTeleportiert dich zu einem Spieler." - usage: "&b/tp " - - tphere: - description: "&eTeleportiert einen Spieler zu dir." - usage: "&b/tphere " - tpa: - description: "&eSendet eine Teleportanfrage an einen Spieler." - usage: "&b/tpa " + group: player + description: "&eSendet eine Teleportanfrage." + usage: "&b/tpa " tpaccept: + group: player description: "&eAkzeptiert eine Teleportanfrage." usage: "&b/tpaccept" tpdeny: + group: player description: "&eLehnt eine Teleportanfrage ab." usage: "&b/tpdeny" + friend: + group: player + description: "&eFreundesliste verwalten." + usage: "&b/friend [add|accept|deny|list|del|confirm|tp] [spieler]" + block: - description: "&eBlockiert einen Spieler." - usage: "&b/block " + group: player + description: "&eBlockiert einen Spieler im Chat." + usage: "&b/block " unblock: - description: "&eEntblockt einen Spieler." - usage: "&b/unblock " + group: player + description: "&eEntblockt einen Spieler im Chat." + usage: "&b/unblock " blocklist: - description: "&eZeigt eine Liste der blockierten Spieler." + group: player + description: "&eZeigt deine Blockliste." usage: "&b/blocklist" - vanish: - description: "&eMacht dich für andere Spieler unsichtbar." - usage: "&b/vanish" + trade: + group: player + description: "&eStartet einen Handel." + usage: "&b/trade " + + tradeaccept: + group: player + description: "&eAkzeptiert einen Handel." + usage: "&b/tradeaccept " + + report: + group: player + description: "&eMeldet einen Spieler an Admins." + usage: "&b/report [grund]" + + stats: + group: player + description: "&eZeigt deine Statistiken." + usage: "&b/stats" kit: + group: player description: "&eHolt das Starterkit." usage: "&b/kit" - leashcount: - description: "&eZeigt die Anzahl der geleinten Tiere an." - usage: "&b/leashcount" - nick: - description: "&eÄndert deinen Nicknamen mit Farb- und Hex-Support." - usage: "&b/nick " + group: player + description: "&eSetzt deinen Nickname." + usage: "&b/nick | off" ride: + group: player description: "&eReite einen Spieler oder Mob." usage: "&b/ride [spieler]" + sit: + group: player + description: "&eHinsetzen/Aufstehen." + usage: "&b/sit" + + ir: + group: player + description: "&eBenennt das Item in der Hand um." + usage: "&b/ir " + + trash: + group: player + description: "&eÖffnet den Mülleimer." + usage: "&b/trash" + + workbench: + group: player + description: "&eÖffnet eine Werkbank-GUI." + usage: "&b/workbench" + + anvil: + group: player + description: "&eÖffnet eine Amboss-GUI." + usage: "&b/anvil" + + leashcount: + group: player + description: "&eZeigt die Anzahl geleinter Tiere." + usage: "&b/leashcount" + lootchests: - description: "&eZeigt eine Liste aller aktiven Loot-Kisten an. Admins können per Klick teleportieren." + group: admin + description: "&eListet aktive Loot-Kisten." usage: "&b/lootchests" tploot: - description: "&eTeleportiert dich zu einer Loot-Kiste (nur Admins)." + group: admin + description: "&eTeleportiert zu einer Loot-Kiste." usage: "&b/tploot " + shop: + group: player + description: "&eShop GUI (Admin: /shop add ...)." + usage: "&b/shop [gui|add]" + + claim: + group: player + description: "&eClaim-System verwalten." + usage: "&b/claim [mark|unclaim|trust|untrust|info|kick|ban|unban]" + + startchallenge: + group: admin + description: "&eStartet eine Fun-Challenge." + usage: "&b/startchallenge " + + head: + group: player + description: "&eGibt dir den Kopf eines Spielers." + usage: "&b/head " + + heal: + group: admin + description: "&eHeilt einen Spieler vollständig." + usage: "&b/heal [spieler]" + + gm: + group: admin + description: "&eÄndert den Spielmodus." + usage: "&b/gm [spieler]" + + tp: + group: admin + description: "&eTeleportiert dich zu einem Spieler." + usage: "&b/tp " + + tphere: + group: admin + description: "&eTeleportiert einen Spieler zu dir." + usage: "&b/tphere " + + inv: + group: admin + description: "&eÖffnet ein Inventar (eigen/anderer)." + usage: "&b/inv [spieler]" + + ec: + group: admin + description: "&eÖffnet eine Endertruhe (eigene/andere)." + usage: "&b/ec [spieler]" + + setworldspawn: + group: admin + description: "&eSetzt den Weltspawn auf deine Position." + usage: "&b/setworldspawn" + + setspawn: + group: admin + description: "&eSetzt den Serverspawn auf deine Position." + usage: "&b/setspawn" + + clearchat: + group: admin + description: "&eLeert den Chat." + usage: "&b/clearchat" + + clearitems: + group: admin + description: "&eEntfernt herumliegende Items." + usage: "&b/clearitems" + + closedoors: + group: admin + description: "&eSchließt Türen im Radius." + usage: "&b/closedoors " + + showarmorstands: + group: admin + description: "&eMacht Debug-ArmorStands sichtbar." + usage: "&b/showarmorstands" + + cleardebugarmorstands: + group: admin + description: "&eEntfernt Debug-ArmorStands." + usage: "&b/cleardebugarmorstands" + + vanish: + group: admin + description: "&eMacht dich unsichtbar." + usage: "&b/vanish" + + freeze: + group: admin + description: "&eFriert einen Spieler ein." + usage: "&b/freeze " + day: + group: admin description: "&eSetzt die Zeit auf Tag." usage: "&b/day" night: + group: admin description: "&eSetzt die Zeit auf Nacht." usage: "&b/night" - trade: - description: "&eStartet einen Handel mit einem Spieler." - usage: "&b/trade " - - tradeaccept: - description: "&eAkzeptiert eine Handelsanfrage." - usage: "&b/tradeaccept " - - report: - description: "&eMeldet einen Spieler an die Admins." - usage: "&b/report [Grund]" - showreport: - description: "&eZeigt alle Reports eines Spielers an." - usage: "&b/showreport " + group: admin + description: "&eZeigt Reports eines Spielers." + usage: "&b/showreport " clearreport: - description: "&eLöscht alle Reports eines Spielers." - usage: "&b/clearreport " - - shop: - description: "&eVerwaltet den Server-Shop (z.B. Items hinzufügen)." - usage: "&b/shop add " - - setwarp: - description: "&eSetzt einen persönlichen Warp mit dem Item in der Hand." - usage: "&b/setwarp " - - delwarp: - description: "&eLöscht einen persönlichen Warp." - usage: "&b/delwarp " - - warps: - description: "&eÖffnet die GUI mit allen Spieler-Warps." - usage: "&b/warps" - - startchallenge: - description: "&eStartet eine Fun-Challenge." - usage: "&b/startchallenge " - - heal: - description: "&eHeilt einen Spieler vollständig." - usage: "&b/heal [spieler]" - - claim: - description: "&eVerwaltet Claims für den Anti-Grief-Schutz." - usage: "&b/claim [mark <1|2>| unclaim | trust | untrust | info | kick | ban | unban ]" - subcommands: - mark: - description: "&eMarkiert die erste oder zweite Ecke eines zu schützenden Bereichs." - usage: "&b/claim mark <1|2>" - unclaim: - description: "&eGibt den geschützten Bereich frei, in dem du stehst." - usage: "&b/claim unclaim" - trust: - description: "&eFügt einen Spieler als vertrauenswürdig hinzu, sodass er im Bereich bauen kann." - usage: "&b/claim trust " - untrust: - description: "&eEntfernt die Vertrauensberechtigung eines Spielers für den Bereich." - usage: "&b/claim untrust " - info: - description: "&eZeigt Informationen über den aktuellen Claim an." - usage: "&b/claim info" - kick: - description: "&eWirft einen Spieler aus dem Claim." - usage: "&b/claim kick " - ban: - description: "&eVerbannt einen Spieler permanent aus dem Claim." - usage: "&b/claim ban " - unban: - description: "&eEntbannt einen Spieler aus dem Claim." - usage: "&b/claim unban " - -messages: - header: "&6=== Befehle ===" - footer: "&6================" - navigation: - prev: "&7« Vorherige Seite" - next: "&7Nächste Seite »" - prev-disabled: "&8« Vorherige Seite" - next-disabled: "&8Nächste Seite »" - page: "&fSeite {current} von {total}" - sp: - invalid-subcommand: "&cUngültiger Unterbefehl! Verwendung: /sp [reload|help|info|share|lock]" - no-permission: "&cDu hast keine Berechtigung für diesen Befehl!" - plugin: - reloaded: "&aSurvivalPlus wurde erfolgreich neu geladen!" - info: - header: "&7===== SurvivalPlus Info =====" - name: "&ePlugin-Name: &f" - version: "&eVersion: &f" - author: "&eErsteller: &f" - description: "&eBeschreibung:\n&f" - footer: "&7==========================" - share: - preview-title: "&aDeine aktuellen Koordinaten wären:" - preview-format: "&e%player% &7teilt Koordinaten: &eX: %x%, Y: %y%, Z: %z% &7in Welt &e%world%" - send-button: "&a[✅ Senden]" - cancel-button: "&c[❌ Abbrechen]" - send-hover: "&aKlicke, um deine Koordinaten an alle zu senden." - cancel-hover: "&cKlicke, um das Senden abzubrechen." - sent: "&aKoordinaten gesendet." - cancelled: "&eSenden der Koordinaten abgebrochen." - help-not-found: "&cHilfedatei (help.yml) konnte nicht geladen werden!" - vanish: - activated: "&aDu bist nun unsichtbar." - deactivated: "&cDu bist nun sichtbar." - freeze: - frozen: "&cDu wurdest von einem Admin eingefroren! &lKeine Bewegung möglich!" - unfrozen: "&aDu bist nicht mehr eingefroren." - player-frozen: "&a%player% wurde eingefroren." - player-unfrozen: "&a%player% wurde aufgetaut." - claim: - kicked: "&cDu wurdest aus dem Claim geworfen!" - kicked-target: "&aSpieler wurde aus dem Claim geworfen." - banned: "&cDu bist aus diesem Gebiet verbannt!" - unbanned: "&aDu bist für dieses Gebiet entbannt." - admin-banned: "&aSpieler wurde von diesem Claim gebannt." - admin-unbanned: "&aSpieler wurde für diesen Claim entbannt." \ No newline at end of file + group: admin + description: "&eLöscht Reports eines Spielers." + usage: "&b/clearreport " \ No newline at end of file diff --git a/src/main/resources/lang.yml b/src/main/resources/lang.yml index d9eff97..f5512f1 100644 --- a/src/main/resources/lang.yml +++ b/src/main/resources/lang.yml @@ -1,7 +1,21 @@ + +reload: + success: "§aSurvivalPlus wurde erfolgreich neu geladen!" + +invalid-subcommand: "§cUngültiger Unterbefehl! Verwendung: /sp [reload|help|info|share]" + +player-only: "§cDieser Befehl ist nur für Spieler!" + +not-found: "§cKeine Befehle verfügbar." + +groups: + system: "&6-- System --" + player: "&6-- Spieler --" + admin: "&6-- Admin --" sp: no-permission: "§cDu hast keine Berechtigung für diesen Befehl!" plugin.reloaded: "§aSurvivalPlus wurde erfolgreich neu geladen!" - invalid-subcommand: "§cUngültiger Unterbefehl! Verwendung: /sp [ reload | help | info | share ]" + invalid-subcommand: "§cUngültiger Unterbefehl! Verwendung: /sp [help|info|share|shareconfirm|sharecancel|cb|reload]" help-not-found: "§cHilfedatei (help.yml) konnte nicht geladen werden!" share: diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ebaefdd..649aa1a 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: SurvivalPlus -version: 1.1.2 +version: 1.1.3 main: de.viper.survivalplus.SurvivalPlus api-version: 1.21