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.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) {

View File

@@ -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<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()) {
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);
}

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) {
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());
}
}

View File

@@ -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<UUID> 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

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);
}
}