Update from Git Manager GUI

This commit is contained in:
2026-02-05 22:15:08 +01:00
parent 8693ef41af
commit 253515862e
9 changed files with 796 additions and 309 deletions

View File

@@ -43,6 +43,7 @@ import de.viper.survivalplus.commands.WarpsCommand;
import de.viper.survivalplus.fun.FunChallengeManager; import de.viper.survivalplus.fun.FunChallengeManager;
import de.viper.survivalplus.listeners.ChallengeCollectListener; import de.viper.survivalplus.listeners.ChallengeCollectListener;
import de.viper.survivalplus.commands.StartFunChallengeCommand; import de.viper.survivalplus.commands.StartFunChallengeCommand;
import de.viper.survivalplus.commands.SurvivalPlusTabCompleter;
// --- NEU: Imports für Heads, Vanish & Shops --- // --- NEU: Imports für Heads, Vanish & Shops ---
import de.viper.survivalplus.commands.HeadCommand; import de.viper.survivalplus.commands.HeadCommand;
@@ -339,6 +340,7 @@ public class SurvivalPlus extends JavaPlugin {
getCommand("sethome").setExecutor(new HomeCommand(this)); getCommand("sethome").setExecutor(new HomeCommand(this));
getCommand("delhome").setExecutor(new HomeCommand(this)); getCommand("delhome").setExecutor(new HomeCommand(this));
getCommand("homelist").setExecutor(new HomeCommand(this)); getCommand("homelist").setExecutor(new HomeCommand(this));
getCommand("home").setExecutor(new HomeCommand(this));
getCommand("inv").setExecutor(new InventoryCommand(this)); getCommand("inv").setExecutor(new InventoryCommand(this));
getCommand("ec").setExecutor(new EnderchestCommand(this)); getCommand("ec").setExecutor(new EnderchestCommand(this));
getCommand("setspawn").setExecutor(new SetSpawnCommand(this)); getCommand("setspawn").setExecutor(new SetSpawnCommand(this));
@@ -429,7 +431,7 @@ public class SurvivalPlus extends JavaPlugin {
lockSystem = new LockSystem(this); lockSystem = new LockSystem(this);
pluginManager.registerEvents(lockSystem, this); pluginManager.registerEvents(lockSystem, this);
getCommand("sp").setExecutor(lockSystem); getCommand("splock").setExecutor(lockSystem);
getCommand("sp").setExecutor(new CommandExecutor() { getCommand("sp").setExecutor(new CommandExecutor() {
@Override @Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { 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 RepairSignListener(getConfig(), getLangConfig()), this);
pluginManager.registerEvents(new ToolUpgradeListener(this), this); pluginManager.registerEvents(new ToolUpgradeListener(this), this);
registerTabCompleters();
startAutoClearTask(); startAutoClearTask();
spawnArmorStandExample(); spawnArmorStandExample();
getLogger().info(getMessage("plugin.enabled")); getLogger().info(getMessage("plugin.enabled"));
@@ -459,13 +462,13 @@ public class SurvivalPlus extends JavaPlugin {
if (Bukkit.getWorlds().isEmpty()) return; if (Bukkit.getWorlds().isEmpty()) return;
Bukkit.getWorlds().forEach(world -> { Bukkit.getWorlds().forEach(world -> {
world.setGameRule(GameRule.KEEP_INVENTORY, false); 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); }, 20L);
} }
if (getConfig().getBoolean("force-survival", true)) { if (getConfig().getBoolean("force-survival", true)) {
pluginManager.registerEvents(new ForceSurvivalListener(this), this); 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 { try {
if (tablistFile == null) tablistFile = new File(getDataFolder(), "tablist.yml"); if (tablistFile == null) tablistFile = new File(getDataFolder(), "tablist.yml");
@@ -477,7 +480,7 @@ public class SurvivalPlus extends JavaPlugin {
if (defStream != null) { if (defStream != null) {
tablistConfig.setDefaults(YamlConfiguration.loadConfiguration(new InputStreamReader(defStream))); tablistConfig.setDefaults(YamlConfiguration.loadConfiguration(new InputStreamReader(defStream)));
} }
getLogger().info("Animierte Tablist wurde geladen!"); logDebug("Animierte Tablist wurde geladen!");
} catch (Exception e) { } catch (Exception e) {
getLogger().log(Level.WARNING, "Fehler beim Laden der Tablist-Konfiguration", 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) { } catch (NoSuchMethodError | NoClassDefFoundError e) {
world.setGameRuleValue(GameRule.COMMAND_BLOCK_OUTPUT.getName(), Boolean.toString(cmdAllowed)); 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); 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) { 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); 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) { } catch (IOException e) {
getLogger().warning("Konnte Version in config.yml nicht setzen: " + e.getMessage()); 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 // Save updated config
try { try {
currentConfig.save(file); currentConfig.save(file);
getLogger().info(fileName + " erfolgreich aktualisiert."); logDebug(fileName + " erfolgreich aktualisiert.");
} catch (IOException e) { } catch (IOException e) {
getLogger().severe("Fehler beim Speichern der " + fileName + ": " + e.getMessage()); 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()) { if (!leashesFile.exists()) {
try { try {
leashesFile.createNewFile(); leashesFile.createNewFile();
getLogger().info("leashes.yml wurde erstellt."); logDebug("leashes.yml wurde erstellt.");
} catch (IOException e) { } catch (IOException e) {
getLogger().severe("Fehler beim Erstellen der leashes.yml: " + e.getMessage()); 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() { public void saveLeashesConfig() {
try { try {
leashesConfig.save(leashesFile); leashesConfig.save(leashesFile);
getLogger().info("leashes.yml erfolgreich gespeichert."); logDebug("leashes.yml erfolgreich gespeichert.");
} catch (IOException e) { } catch (IOException e) {
getLogger().log(Level.SEVERE, "Fehler beim Speichern der leashes.yml: " + e.getMessage()); 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() { public void reloadLeashesConfig() {
leashesConfig = YamlConfiguration.loadConfiguration(leashesFile); leashesConfig = YamlConfiguration.loadConfiguration(leashesFile);
getLogger().info("leashes.yml erfolgreich neu geladen."); logDebug("leashes.yml erfolgreich neu geladen.");
} }
// === MobCap.yml === // === MobCap.yml ===
@@ -1145,7 +1148,7 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver
if (!mobCapFile.exists()) { if (!mobCapFile.exists()) {
try { try {
mobCapFile.createNewFile(); mobCapFile.createNewFile();
getLogger().info("mobcap.yml wurde erstellt."); logDebug("mobcap.yml wurde erstellt.");
} catch (IOException e) { } catch (IOException e) {
getLogger().severe("Fehler beim Erstellen der mobcap.yml: " + e.getMessage()); 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() { public void saveMobCapConfig() {
try { try {
mobCapConfig.save(mobCapFile); mobCapConfig.save(mobCapFile);
getLogger().info("mobcap.yml erfolgreich gespeichert."); logDebug("mobcap.yml erfolgreich gespeichert.");
} catch (IOException e) { } catch (IOException e) {
getLogger().log(Level.SEVERE, "Fehler beim Speichern der mobcap.yml: " + e.getMessage()); 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() { public void reloadMobCapConfig() {
mobCapConfig = YamlConfiguration.loadConfiguration(mobCapFile); mobCapConfig = YamlConfiguration.loadConfiguration(mobCapFile);
getLogger().info("mobcap.yml erfolgreich neu geladen."); logDebug("mobcap.yml erfolgreich neu geladen.");
} }
// === NEU: MobAdapt.yml === // === 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 int intervalTicks = intervalMinutes * 60 * 20; // Minuten in Ticks umrechnen
if (intervalTicks > 0) { if (intervalTicks > 0) {
autoClearTaskId = Bukkit.getScheduler().scheduleSyncRepeatingTask(this, new AutoClearTask(this), intervalTicks, intervalTicks); 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 { } 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); LockSystem lockSystem = new LockSystem(this);
pm.registerEvents(lockSystem, this); pm.registerEvents(lockSystem, this);
getCommand("lock").setExecutor(lockSystem); getCommand("splock").setExecutor(lockSystem);
// Commands neu registrieren // Commands neu registrieren
getCommand("friend").setExecutor(friendCommand); getCommand("friend").setExecutor(friendCommand);
registerTabCompleters();
getLogger().info(getMessage("plugin.reloaded")); getLogger().info(getMessage("plugin.reloaded"));
} catch (Exception e) { } catch (Exception e) {
getLogger().severe("Fehler beim Neuladen des Plugins: " + e.getMessage()); getLogger().severe("Fehler beim Neuladen des Plugins: " + e.getMessage());
@@ -1299,6 +1304,14 @@ private void ensureConfigVersion(FileConfiguration config, File file, String ver
return bannerManager; return bannerManager;
} }
public WarpManager getWarpManager() {
return warpManager;
}
public FunChallengeManager getFunChallengeManager() {
return funChallengeManager;
}
// Nur Fehler/Exceptions // Nur Fehler/Exceptions
public void log(String msg) { public void log(String msg) {
if (getConfig().getBoolean("debug-logging", false) && debugWriter != null) { 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) { public void logError(String msg, Throwable t) {
if (getConfig().getBoolean("debug-logging", false) && debugWriter != null) { if (getConfig().getBoolean("debug-logging", false) && debugWriter != null) {
debugWriter.println("[" + new java.util.Date() + "] ERROR: " + msg); 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 // Komplette Plugin-Logs in console.log
public void logConsole(String msg) { public void logConsole(String msg) {
if (getConfig().getBoolean("debug-logging", false) && consoleWriter != null) { if (getConfig().getBoolean("debug-logging", false) && consoleWriter != null) {

View File

@@ -30,20 +30,32 @@ public class PluginCommand implements CommandExecutor {
// /sp oder /sp help // /sp oder /sp help
if (args.length == 0 || args[0].equalsIgnoreCase("help")) { if (args.length == 0 || args[0].equalsIgnoreCase("help")) {
String mode = "all";
int page = 1; int page = 1;
if (args.length > 1 && args[0].equalsIgnoreCase("help")) { if (args.length > 1 && args[0].equalsIgnoreCase("help")) {
try { String arg1 = args[1];
page = Integer.parseInt(args[1]); if (isInteger(arg1)) {
if (page < 1) page = 1; page = Integer.parseInt(arg1);
} catch (NumberFormatException e) { } else {
sender.sendMessage(color(lang.getString( mode = arg1.toLowerCase();
"sp.invalid-subcommand", if (args.length > 2) {
"§cUngültiger Unterbefehl! Verwendung: /sp [reload|help|info|share]" String arg2 = args[2];
))); if (isInteger(arg2)) {
return true; 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; return true;
} }
@@ -175,7 +187,7 @@ public class PluginCommand implements CommandExecutor {
return true; return true;
} }
private void showHelp(CommandSender sender, int page) { private void showHelp(CommandSender sender, String mode, int page) {
FileConfiguration help = plugin.getHelpConfig(); FileConfiguration help = plugin.getHelpConfig();
FileConfiguration lang = plugin.getLangConfig(); FileConfiguration lang = plugin.getLangConfig();
@@ -184,7 +196,30 @@ public class PluginCommand implements CommandExecutor {
return; return;
} }
List<String> commands = new ArrayList<>(help.getConfigurationSection("commands").getKeys(false)); List<String> 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<String> 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()) { if (commands.isEmpty()) {
sender.sendMessage(color(lang.getString("sp.help-not-found", "&cKeine Befehle verfügbar."))); sender.sendMessage(color(lang.getString("sp.help-not-found", "&cKeine Befehle verfügbar.")));
return; return;
@@ -199,19 +234,30 @@ public class PluginCommand implements CommandExecutor {
int startIndex = (page - 1) * COMMANDS_PER_PAGE; int startIndex = (page - 1) * COMMANDS_PER_PAGE;
int endIndex = Math.min(startIndex + COMMANDS_PER_PAGE, commands.size()); int endIndex = Math.min(startIndex + COMMANDS_PER_PAGE, commands.size());
String lastGroup = null;
for (int i = startIndex; i < endIndex; i++) { for (int i = startIndex; i < endIndex; i++) {
String cmd = commands.get(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 usage = help.getString("commands." + cmd + ".usage", "");
String description = help.getString("commands." + cmd + ".description", ""); String description = help.getString("commands." + cmd + ".description", "");
sender.sendMessage(color(usage + " §7- " + description)); sender.sendMessage(color(usage + " §7- " + description));
} }
if (sender instanceof Player player) { if (sender instanceof Player player) {
String modeSuffix = normalizedMode.equals("all") ? "" : " " + normalizedMode;
String navBase = "/sp help" + modeSuffix + " ";
TextComponent navigation = new TextComponent(); TextComponent navigation = new TextComponent();
if (page > 1) { if (page > 1) {
TextComponent prev = new TextComponent(color(help.getString("navigation.prev", "« Vorherige "))); 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); navigation.addExtra(prev);
} else { } else {
navigation.addExtra(color(help.getString("navigation.prev-disabled", "« "))); navigation.addExtra(color(help.getString("navigation.prev-disabled", "« ")));
@@ -224,7 +270,9 @@ public class PluginCommand implements CommandExecutor {
if (page < totalPages) { if (page < totalPages) {
TextComponent next = new TextComponent(color(help.getString("navigation.next", " Nächste »"))); 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); navigation.addExtra(next);
} else { } else {
navigation.addExtra(color(help.getString("navigation.next-disabled", " »"))); navigation.addExtra(color(help.getString("navigation.next-disabled", " »")));
@@ -242,6 +290,18 @@ public class PluginCommand implements CommandExecutor {
sender.sendMessage(color(help.getString("footer", "&7=========================="))); 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) { private String color(String input) {
return ChatColor.translateAlternateColorCodes('&', input == null ? "" : input); return ChatColor.translateAlternateColorCodes('&', input == null ? "" : input);
} }

View File

@@ -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<String> SP_SUBCOMMANDS = List.of(
"help", "reload", "info", "share", "shareconfirm", "sharecancel", "cb",
"lock", "unlock", "friendadd", "friendremove"
);
private static final List<String> SP_CB_SUBCOMMANDS = List.of("add", "remove", "list");
private static final List<String> FRIEND_SUBCOMMANDS = List.of("add", "accept", "deny", "list", "del", "confirm", "tp");
private static final List<String> CLAIM_SUBCOMMANDS = List.of("mark", "unclaim", "del", "delete", "trust", "untrust", "info", "kick", "ban", "unban");
private static final List<String> SPLOCK_SUBCOMMANDS = List.of("lock", "unlock", "friendadd", "friendremove");
private static final List<String> SHOP_SUBCOMMANDS = List.of("gui", "add");
private static final List<String> NICK_SUBCOMMANDS = List.of("off", "remove", "reset");
private static final List<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> 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<String> completePlayerArg(CommandSender sender, String[] args) {
if (args.length == 1) {
return filterPrefix(getOnlinePlayerNames(sender), args[0]);
}
return Collections.emptyList();
}
private List<String> completeOptionalPlayerArg(CommandSender sender, String[] args) {
if (args.length == 1) {
return filterPrefix(getOnlinePlayerNames(sender), args[0]);
}
return Collections.emptyList();
}
private List<String> completeTploot(String[] args) {
if (args.length == 1) {
return filterPrefix(getWorldNames(), args[0]);
}
return Collections.emptyList();
}
private List<String> completeChallenges(String[] args) {
if (args.length == 1) {
return filterPrefix(getChallengeNames(), args[0]);
}
return Collections.emptyList();
}
private List<String> completePlayerHomeNames(CommandSender sender, String[] args) {
if (args.length == 1) {
return filterPrefix(getHomeNames(sender), args[0]);
}
return Collections.emptyList();
}
private List<String> completePlayerWarpNames(CommandSender sender, String[] args) {
if (args.length == 1) {
return filterPrefix(getWarpNames(sender), args[0]);
}
return Collections.emptyList();
}
private List<String> getOnlinePlayerNames(CommandSender sender) {
List<String> names = new ArrayList<>();
for (Player player : Bukkit.getOnlinePlayers()) {
if (!player.getName().equalsIgnoreCase(sender.getName())) {
names.add(player.getName());
}
}
return names;
}
private List<String> getBlockedCommands() {
FileConfiguration blocked = plugin.getBlockedCommandsConfig();
if (blocked == null) {
return Collections.emptyList();
}
List<String> commands = blocked.getStringList("blocked-commands");
return commands == null ? Collections.emptyList() : commands;
}
private List<String> getFriendNames(CommandSender sender) {
if (!(sender instanceof Player player)) {
return Collections.emptyList();
}
FileConfiguration friends = plugin.getFriendsConfig();
if (friends == null) {
return Collections.emptyList();
}
List<String> friendIds = friends.getStringList(player.getUniqueId().toString() + ".friends");
if (friendIds == null || friendIds.isEmpty()) {
return Collections.emptyList();
}
List<String> 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<String> 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<String> getWarpNames(CommandSender sender) {
if (!(sender instanceof Player player)) {
return Collections.emptyList();
}
WarpManager warpManager = plugin.getWarpManager();
if (warpManager == null) {
return Collections.emptyList();
}
List<String> warps = new ArrayList<>();
for (Warp warp : warpManager.getWarps().values()) {
if (warp.getOwner().equalsIgnoreCase(player.getName())) {
warps.add(warp.getName());
}
}
return warps;
}
private List<String> getChallengeNames() {
if (plugin.getFunChallengeManager() == null) {
return Collections.emptyList();
}
List<String> names = new ArrayList<>();
for (FunChallenge challenge : plugin.getFunChallengeManager().getChallenges()) {
names.add(challenge.getName());
}
return names;
}
private List<String> getWorldNames() {
List<String> names = new ArrayList<>();
for (World world : Bukkit.getWorlds()) {
names.add(world.getName());
}
return names;
}
private List<String> getMaterialNames(String prefix) {
List<String> 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<String> filterPrefix(Collection<String> options, String prefix) {
if (options == null || options.isEmpty()) {
return Collections.emptyList();
}
String normalized = prefix == null ? "" : prefix.toLowerCase(Locale.ROOT);
List<String> results = new ArrayList<>();
Set<String> 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;
}
}

View File

@@ -32,7 +32,7 @@ public class MobCapListener implements Listener {
public void reloadConfig(FileConfiguration config) { public void reloadConfig(FileConfiguration config) {
this.enabled = config.getBoolean("mob-cap.enabled", true); this.enabled = config.getBoolean("mob-cap.enabled", true);
this.maxAnimalsPerChunk = config.getInt("mob-cap.max-animals-per-chunk", 10); 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 // Bereinige bestehende Daten
chunkAnimalMap.clear(); chunkAnimalMap.clear();
@@ -40,7 +40,7 @@ public class MobCapListener implements Listener {
if (!enabled) { if (!enabled) {
plugin.getMobCapConfig().set("mobcap", null); // Bereinige mobcap.yml plugin.getMobCapConfig().set("mobcap", null); // Bereinige mobcap.yml
plugin.saveMobCapConfig(); plugin.saveMobCapConfig();
plugin.getLogger().info("MobCapListener: Daten bereinigt, da enabled=false"); plugin.logDebug("MobCapListener: Daten bereinigt, da enabled=false");
return; return;
} }
@@ -89,7 +89,7 @@ public class MobCapListener implements Listener {
// Speichere aktualisierte mobcap.yml // Speichere aktualisierte mobcap.yml
saveChunkAnimalMap(); 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 @EventHandler
@@ -106,7 +106,7 @@ public class MobCapListener implements Listener {
int animalCount = animalToPlayer.size(); int animalCount = animalToPlayer.size();
if (animalCount >= maxAnimalsPerChunk) { if (animalCount >= maxAnimalsPerChunk) {
event.setCancelled(true); 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 // 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 // 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) { if (animalCount >= maxAnimalsPerChunk) {
event.setCancelled(true); event.setCancelled(true);
player.sendMessage(plugin.getMessage("mob-cap.limit-reached").replace("%max%", String.valueOf(maxAnimalsPerChunk))); 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 { } else {
animalToPlayer.put(entity.getUniqueId(), player.getUniqueId()); animalToPlayer.put(entity.getUniqueId(), player.getUniqueId());
saveChunkAnimalMap(); saveChunkAnimalMap();
@@ -157,7 +157,7 @@ public class MobCapListener implements Listener {
chunkAnimalMap.remove(chunkKey); chunkAnimalMap.remove(chunkKey);
} }
saveChunkAnimalMap(); 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());
} }
} }

View File

@@ -30,7 +30,7 @@ public class MobLeashLimitListener implements Listener {
public void reloadConfig(FileConfiguration config) { public void reloadConfig(FileConfiguration config) {
this.enabled = config.getBoolean("mob-leash-limit.enabled", true); this.enabled = config.getBoolean("mob-leash-limit.enabled", true);
this.maxLeashCount = config.getInt("mob-leash-limit.max-leash-count", 5); 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 // Bereinige bestehende Daten
leashedEntities.clear(); leashedEntities.clear();
@@ -40,7 +40,7 @@ public class MobLeashLimitListener implements Listener {
if (!enabled) { if (!enabled) {
plugin.getLeashesConfig().set("leashes", null); // Bereinige leashes.yml plugin.getLeashesConfig().set("leashes", null); // Bereinige leashes.yml
plugin.saveLeashesConfig(); plugin.saveLeashesConfig();
plugin.getLogger().info("MobLeashLimitListener: Daten bereinigt, da enabled=false"); plugin.logDebug("MobLeashLimitListener: Daten bereinigt, da enabled=false");
return; return;
} }
@@ -119,7 +119,7 @@ public class MobLeashLimitListener implements Listener {
// Speichere aktualisierte leashes.yml // Speichere aktualisierte leashes.yml
plugin.saveLeashesConfig(); 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 @EventHandler
@@ -135,7 +135,7 @@ public class MobLeashLimitListener implements Listener {
if (itemInHand != null && itemInHand.getType() == Material.LEAD) { if (itemInHand != null && itemInHand.getType() == Material.LEAD) {
Set<UUID> playerLeashedEntities = leashedEntities.computeIfAbsent(playerId, k -> new HashSet<>()); Set<UUID> playerLeashedEntities = leashedEntities.computeIfAbsent(playerId, k -> new HashSet<>());
int currentCount = playerLeashedEntities.size(); 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)) { if (playerLeashedEntities.contains(entityId)) {
// Ableinen // Ableinen

View File

@@ -196,7 +196,7 @@ public class SitListener implements Listener {
} }
} }
} }
plugin.getLogger().info("Ghost Stands (Sit) bereinigt."); plugin.logDebug("Ghost Stands (Sit) bereinigt.");
}, 20L); }, 20L);
} }
} }

View File

@@ -1,362 +1,364 @@
header: "&6=== SurvivalPlus Hilfe ===" header: "&6=== SurvivalPlus Hilfe ==="
footer: "&6===========================" 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: commands:
gm:
description: "&eÄndert den Spielmodus eines Spielers (survival, creative, adventure, spectator)."
usage: "&b/gm <modus> [spieler]"
sp: sp:
description: "&eHauptbefehl für SurvivalPlus mit Unterbefehlen." group: system
usage: "&b/sp [reload | help | info | share | lock]" description: "&eHauptbefehl für SurvivalPlus."
usage: "&b/sp [help|info|share|cb|reload]"
sp_reload:
description: "&eLädt das Plugin neu."
usage: "&b/sp reload"
sp_help: sp_help:
description: "&eZeigt die Hilfe für SurvivalPlus-Befehle an." group: system
usage: "&b/sp help" description: "&eZeigt die Hilfe an (Spieler/Admin/System)."
usage: "&b/sp help [player|admin|system|all] [seite]"
sp_info: sp_info:
description: "&eZeigt Informationen über das Plugin an." group: system
description: "&eZeigt Plugin-Infos und Links."
usage: "&b/sp info" usage: "&b/sp info"
sp_share: 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" 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: sp_cb_add:
group: admin
description: "&eFügt einen Befehl zur Blockierliste hinzu." description: "&eFügt einen Befehl zur Blockierliste hinzu."
usage: "&b/sp cb add <befehl>" usage: "&b/sp cb add <befehl>"
sp_cb_remove: sp_cb_remove:
group: admin
description: "&eEntfernt einen Befehl aus der Blockierliste." description: "&eEntfernt einen Befehl aus der Blockierliste."
usage: "&b/sp cb remove <befehl>" usage: "&b/sp cb remove <befehl>"
sp_cb_list: sp_cb_list:
group: admin
description: "&eZeigt die Liste der blockierten Befehle an." description: "&eZeigt die Liste der blockierten Befehle an."
usage: "&b/sp cb list" 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: sp_lock_lock:
description: "&eSperrt einen Container (z.B. Kiste oder Tür)." group: player
usage: "&b/sp lock " description: "&eStartet den Lock-Modus (Block anklicken)."
usage: "&b/sp lock"
sp_lock_unlock: sp_lock_unlock:
description: "&eEntsperrt einen Container (z.B. Kiste oder Tür)." group: player
usage: "&b/sp lock " description: "&eEntsperrt einen Block, den du ansiehst."
usage: "&b/sp unlock"
sp_lock_friendadd: sp_lock_friendadd:
description: "&eFügt einen Freund zum Container-Sperrsystem hinzu." group: player
usage: "&b/sp lock friendadd <Spieler>" description: "&eFügt einen Freund zum Lock-System hinzu."
usage: "&b/sp friendadd <spieler>"
sp_lock_friendremove: sp_lock_friendremove:
description: "&eEntfernt einen Freund aus dem Container-Sperrsystem." group: player
usage: "&b/sp lock friendremove <Spieler>" description: "&eEntfernt einen Freund aus dem Lock-System."
usage: "&b/sp friendremove <spieler>"
shareconfirm: home:
description: "&eBestätigt das Teilen deiner Koordinaten mit allen Spielern." group: player
usage: "&b/sp shareconfirm" description: "&eTeleportiert dich zu einem Home."
usage: "&b/home <name>"
sharecancel:
description: "&eBricht das Teilen deiner Koordinaten ab."
usage: "&b/sp sharecancel"
sethome: sethome:
description: "&eSetzt ein Home mit dem angegebenen Namen." group: player
description: "&eSetzt ein Home mit Namen."
usage: "&b/sethome <name>" usage: "&b/sethome <name>"
delhome: delhome:
description: "&eLöscht ein Home mit dem angegebenen Namen." group: player
description: "&eLöscht ein Home."
usage: "&b/delhome <name>" usage: "&b/delhome <name>"
homelist: homelist:
description: "&eÖffnet eine GUI mit allen Homes." group: player
description: "&eÖffnet die Homes-Übersicht."
usage: "&b/homelist" usage: "&b/homelist"
home: warps:
description: "&eTeleportiert zu einem Home." group: player
usage: "&b/home <name>" description: "&eÖffnet die Warps-Übersicht."
usage: "&b/warps"
inv: setwarp:
description: "&eÖffnet das Inventar (eigenes oder das eines anderen Spielers)." group: player
usage: "&b/inv [spieler]" description: "&eSetzt einen persönlichen Warp."
usage: "&b/setwarp <name>"
ec: delwarp:
description: "&eÖffnet die Endertruhe (eigene oder die eines anderen Spielers)." group: player
usage: "&b/ec [spieler]" description: "&eLöscht einen persönlichen Warp."
usage: "&b/delwarp <name>"
setworldspawn: spawn:
description: "&eSetzt den Weltspawnpunkt auf die Position des Spielers." group: player
usage: "&b/setworldspawn" description: "&eTeleportiert dich zum Weltspawn."
usage: "&b/spawn"
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 <radius>"
sit:
description: "&eLässt den Spieler sich hinsetzen oder aufstehen."
usage: "&b/sit"
back: back:
group: player
description: "&eTeleportiert zum letzten Todespunkt." description: "&eTeleportiert zum letzten Todespunkt."
usage: "&b/back" 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 <Spieler>"
accept:
description: "&eAkzeptiert eine Freundschaftsanfrage."
usage: "&b/friend accept <Spieler>"
deny:
description: "&eLehnt eine Freundschaftsanfrage ab."
usage: "&b/friend deny <Spieler>"
list:
description: "&eZeigt die Freundesliste an."
usage: "&b/friend list"
del:
description: "&eEntfernt einen Spieler aus der Freundesliste."
usage: "&b/friend del <Spieler>"
tp:
description: "&eTeleportiert dich zu einem Freund."
usage: "&b/friend tp <Spieler>"
freeze:
description: "&eFriert einen Spieler ein (Bewegung unmöglich)."
usage: "&b/freeze <Spieler>"
ir:
description: "&eBenennt das Item in der Hand um."
usage: "&b/ir <neuer_name>"
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 <Spieler>"
tphere:
description: "&eTeleportiert einen Spieler zu dir."
usage: "&b/tphere <Spieler>"
tpa: tpa:
description: "&eSendet eine Teleportanfrage an einen Spieler." group: player
usage: "&b/tpa <Spieler>" description: "&eSendet eine Teleportanfrage."
usage: "&b/tpa <spieler>"
tpaccept: tpaccept:
group: player
description: "&eAkzeptiert eine Teleportanfrage." description: "&eAkzeptiert eine Teleportanfrage."
usage: "&b/tpaccept" usage: "&b/tpaccept"
tpdeny: tpdeny:
group: player
description: "&eLehnt eine Teleportanfrage ab." description: "&eLehnt eine Teleportanfrage ab."
usage: "&b/tpdeny" usage: "&b/tpdeny"
friend:
group: player
description: "&eFreundesliste verwalten."
usage: "&b/friend [add|accept|deny|list|del|confirm|tp] [spieler]"
block: block:
description: "&eBlockiert einen Spieler." group: player
usage: "&b/block <Spieler>" description: "&eBlockiert einen Spieler im Chat."
usage: "&b/block <spieler>"
unblock: unblock:
description: "&eEntblockt einen Spieler." group: player
usage: "&b/unblock <Spieler>" description: "&eEntblockt einen Spieler im Chat."
usage: "&b/unblock <spieler>"
blocklist: blocklist:
description: "&eZeigt eine Liste der blockierten Spieler." group: player
description: "&eZeigt deine Blockliste."
usage: "&b/blocklist" usage: "&b/blocklist"
vanish: trade:
description: "&eMacht dich für andere Spieler unsichtbar." group: player
usage: "&b/vanish" description: "&eStartet einen Handel."
usage: "&b/trade <spieler>"
tradeaccept:
group: player
description: "&eAkzeptiert einen Handel."
usage: "&b/tradeaccept <spieler>"
report:
group: player
description: "&eMeldet einen Spieler an Admins."
usage: "&b/report <spieler> [grund]"
stats:
group: player
description: "&eZeigt deine Statistiken."
usage: "&b/stats"
kit: kit:
group: player
description: "&eHolt das Starterkit." description: "&eHolt das Starterkit."
usage: "&b/kit" usage: "&b/kit"
leashcount:
description: "&eZeigt die Anzahl der geleinten Tiere an."
usage: "&b/leashcount"
nick: nick:
description: "&eÄndert deinen Nicknamen mit Farb- und Hex-Support." group: player
usage: "&b/nick <Name>" description: "&eSetzt deinen Nickname."
usage: "&b/nick <name> | off"
ride: ride:
group: player
description: "&eReite einen Spieler oder Mob." description: "&eReite einen Spieler oder Mob."
usage: "&b/ride [spieler]" 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 <neuer_name>"
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: 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" usage: "&b/lootchests"
tploot: tploot:
description: "&eTeleportiert dich zu einer Loot-Kiste (nur Admins)." group: admin
description: "&eTeleportiert zu einer Loot-Kiste."
usage: "&b/tploot <welt> <x> <y> <z>" usage: "&b/tploot <welt> <x> <y> <z>"
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 <name>"
head:
group: player
description: "&eGibt dir den Kopf eines Spielers."
usage: "&b/head <spieler>"
heal:
group: admin
description: "&eHeilt einen Spieler vollständig."
usage: "&b/heal [spieler]"
gm:
group: admin
description: "&eÄndert den Spielmodus."
usage: "&b/gm <modus> [spieler]"
tp:
group: admin
description: "&eTeleportiert dich zu einem Spieler."
usage: "&b/tp <spieler>"
tphere:
group: admin
description: "&eTeleportiert einen Spieler zu dir."
usage: "&b/tphere <spieler>"
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 <radius>"
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 <spieler>"
day: day:
group: admin
description: "&eSetzt die Zeit auf Tag." description: "&eSetzt die Zeit auf Tag."
usage: "&b/day" usage: "&b/day"
night: night:
group: admin
description: "&eSetzt die Zeit auf Nacht." description: "&eSetzt die Zeit auf Nacht."
usage: "&b/night" usage: "&b/night"
trade:
description: "&eStartet einen Handel mit einem Spieler."
usage: "&b/trade <Spieler>"
tradeaccept:
description: "&eAkzeptiert eine Handelsanfrage."
usage: "&b/tradeaccept <Spieler>"
report:
description: "&eMeldet einen Spieler an die Admins."
usage: "&b/report <Spieler> [Grund]"
showreport: showreport:
description: "&eZeigt alle Reports eines Spielers an." group: admin
usage: "&b/showreport <Spieler>" description: "&eZeigt Reports eines Spielers."
usage: "&b/showreport <spieler>"
clearreport: clearreport:
description: "&eLöscht alle Reports eines Spielers." group: admin
usage: "&b/clearreport <Spieler>" description: "&eLöscht Reports eines Spielers."
usage: "&b/clearreport <spieler>"
shop:
description: "&eVerwaltet den Server-Shop (z.B. Items hinzufügen)."
usage: "&b/shop add <item> <basispreis> <lagerbestand>"
setwarp:
description: "&eSetzt einen persönlichen Warp mit dem Item in der Hand."
usage: "&b/setwarp <name>"
delwarp:
description: "&eLöscht einen persönlichen Warp."
usage: "&b/delwarp <name>"
warps:
description: "&eÖffnet die GUI mit allen Spieler-Warps."
usage: "&b/warps"
startchallenge:
description: "&eStartet eine Fun-Challenge."
usage: "&b/startchallenge <name>"
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 <spieler> | untrust <spieler> | info | kick <spieler> | ban <spieler> | unban <spieler>]"
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 <spieler>"
untrust:
description: "&eEntfernt die Vertrauensberechtigung eines Spielers für den Bereich."
usage: "&b/claim untrust <spieler>"
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 <Spieler>"
ban:
description: "&eVerbannt einen Spieler permanent aus dem Claim."
usage: "&b/claim ban <Spieler>"
unban:
description: "&eEntbannt einen Spieler aus dem Claim."
usage: "&b/claim unban <Spieler>"
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."

View File

@@ -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: sp:
no-permission: "§cDu hast keine Berechtigung für diesen Befehl!" no-permission: "§cDu hast keine Berechtigung für diesen Befehl!"
plugin.reloaded: "§aSurvivalPlus wurde erfolgreich neu geladen!" 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!" help-not-found: "§cHilfedatei (help.yml) konnte nicht geladen werden!"
share: share:

View File

@@ -1,5 +1,5 @@
name: SurvivalPlus name: SurvivalPlus
version: 1.1.2 version: 1.1.3
main: de.viper.survivalplus.SurvivalPlus main: de.viper.survivalplus.SurvivalPlus
api-version: 1.21 api-version: 1.21