Update from Git Manager GUI
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -196,7 +196,7 @@ public class SitListener implements Listener {
|
||||
}
|
||||
}
|
||||
}
|
||||
plugin.getLogger().info("Ghost Stands (Sit) bereinigt.");
|
||||
plugin.logDebug("Ghost Stands (Sit) bereinigt.");
|
||||
}, 20L);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user