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) {
|
||||
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 [reload|help|info|share]"
|
||||
"§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);
|
||||
}
|
||||
}
|
||||
@@ -1,362 +1,364 @@
|
||||
header: "&6=== SurvivalPlus Hilfe ==="
|
||||
footer: "&6==========================="
|
||||
help-usage: "&cVerwendung: /sp help [player|admin|system|all] [seite]"
|
||||
|
||||
commands:
|
||||
gm:
|
||||
description: "&eÄndert den Spielmodus eines Spielers (survival, creative, adventure, spectator)."
|
||||
usage: "&b/gm <modus> [spieler]"
|
||||
|
||||
sp:
|
||||
description: "&eHauptbefehl für SurvivalPlus mit Unterbefehlen."
|
||||
usage: "&b/sp [reload | help | info | share | lock]"
|
||||
|
||||
sp_reload:
|
||||
description: "&eLädt das Plugin neu."
|
||||
usage: "&b/sp reload"
|
||||
|
||||
sp_help:
|
||||
description: "&eZeigt die Hilfe für SurvivalPlus-Befehle an."
|
||||
usage: "&b/sp help"
|
||||
|
||||
sp_info:
|
||||
description: "&eZeigt Informationen über das Plugin an."
|
||||
usage: "&b/sp info"
|
||||
|
||||
sp_share:
|
||||
description: "&eTeilt deine Koordinaten nach Bestätigung mit allen Spielern."
|
||||
usage: "&b/sp share"
|
||||
|
||||
sp_cb_add:
|
||||
description: "&eFügt einen Befehl zur Blockierliste hinzu."
|
||||
usage: "&b/sp cb add <befehl>"
|
||||
|
||||
sp_cb_remove:
|
||||
description: "&eEntfernt einen Befehl aus der Blockierliste."
|
||||
usage: "&b/sp cb remove <befehl>"
|
||||
|
||||
sp_cb_list:
|
||||
description: "&eZeigt die Liste der blockierten Befehle an."
|
||||
usage: "&b/sp cb list"
|
||||
|
||||
sp_lock_lock:
|
||||
description: "&eSperrt einen Container (z.B. Kiste oder Tür)."
|
||||
usage: "&b/sp lock "
|
||||
|
||||
sp_lock_unlock:
|
||||
description: "&eEntsperrt einen Container (z.B. Kiste oder Tür)."
|
||||
usage: "&b/sp lock "
|
||||
|
||||
sp_lock_friendadd:
|
||||
description: "&eFügt einen Freund zum Container-Sperrsystem hinzu."
|
||||
usage: "&b/sp lock friendadd <Spieler>"
|
||||
|
||||
sp_lock_friendremove:
|
||||
description: "&eEntfernt einen Freund aus dem Container-Sperrsystem."
|
||||
usage: "&b/sp lock friendremove <Spieler>"
|
||||
|
||||
shareconfirm:
|
||||
description: "&eBestätigt das Teilen deiner Koordinaten mit allen Spielern."
|
||||
usage: "&b/sp shareconfirm"
|
||||
|
||||
sharecancel:
|
||||
description: "&eBricht das Teilen deiner Koordinaten ab."
|
||||
usage: "&b/sp sharecancel"
|
||||
|
||||
sethome:
|
||||
description: "&eSetzt ein Home mit dem angegebenen Namen."
|
||||
usage: "&b/sethome <name>"
|
||||
|
||||
delhome:
|
||||
description: "&eLöscht ein Home mit dem angegebenen Namen."
|
||||
usage: "&b/delhome <name>"
|
||||
|
||||
homelist:
|
||||
description: "&eÖffnet eine GUI mit allen Homes."
|
||||
usage: "&b/homelist"
|
||||
|
||||
home:
|
||||
description: "&eTeleportiert zu einem Home."
|
||||
usage: "&b/home <name>"
|
||||
|
||||
inv:
|
||||
description: "&eÖffnet das Inventar (eigenes oder das eines anderen Spielers)."
|
||||
usage: "&b/inv [spieler]"
|
||||
|
||||
ec:
|
||||
description: "&eÖffnet die Endertruhe (eigene oder die eines anderen Spielers)."
|
||||
usage: "&b/ec [spieler]"
|
||||
|
||||
setworldspawn:
|
||||
description: "&eSetzt den Weltspawnpunkt auf die Position des Spielers."
|
||||
usage: "&b/setworldspawn"
|
||||
|
||||
setspawn:
|
||||
description: "&eSetzt den Server-Spawnpunkt auf die Position des Spielers."
|
||||
usage: "&b/setspawn"
|
||||
|
||||
clearchat:
|
||||
description: "&eLöscht den Chat für alle Spieler."
|
||||
usage: "&b/clearchat"
|
||||
|
||||
clearitems:
|
||||
description: "&eLöscht alle herumliegenden Items."
|
||||
usage: "&b/clearitems"
|
||||
|
||||
closedoors:
|
||||
description: "&eSchließt alle Türen im angegebenen Radius."
|
||||
usage: "&b/closedoors <radius>"
|
||||
|
||||
sit:
|
||||
description: "&eLässt den Spieler sich hinsetzen oder aufstehen."
|
||||
usage: "&b/sit"
|
||||
|
||||
back:
|
||||
description: "&eTeleportiert zum letzten Todespunkt."
|
||||
usage: "&b/back"
|
||||
|
||||
friend:
|
||||
description: "&eVerwaltet die Freundesliste (hinzufügen, entfernen, anzeigen, teleportieren)."
|
||||
usage: "&b/friend [add | accept | deny | list | del | tp] [Spieler]"
|
||||
subcommands:
|
||||
add:
|
||||
description: "&eFügt einen Spieler zur Freundesliste hinzu."
|
||||
usage: "&b/friend add <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:
|
||||
description: "&eSendet eine Teleportanfrage an einen Spieler."
|
||||
usage: "&b/tpa <Spieler>"
|
||||
|
||||
tpaccept:
|
||||
description: "&eAkzeptiert eine Teleportanfrage."
|
||||
usage: "&b/tpaccept"
|
||||
|
||||
tpdeny:
|
||||
description: "&eLehnt eine Teleportanfrage ab."
|
||||
usage: "&b/tpdeny"
|
||||
|
||||
block:
|
||||
description: "&eBlockiert einen Spieler."
|
||||
usage: "&b/block <Spieler>"
|
||||
|
||||
unblock:
|
||||
description: "&eEntblockt einen Spieler."
|
||||
usage: "&b/unblock <Spieler>"
|
||||
|
||||
blocklist:
|
||||
description: "&eZeigt eine Liste der blockierten Spieler."
|
||||
usage: "&b/blocklist"
|
||||
|
||||
vanish:
|
||||
description: "&eMacht dich für andere Spieler unsichtbar."
|
||||
usage: "&b/vanish"
|
||||
|
||||
kit:
|
||||
description: "&eHolt das Starterkit."
|
||||
usage: "&b/kit"
|
||||
|
||||
leashcount:
|
||||
description: "&eZeigt die Anzahl der geleinten Tiere an."
|
||||
usage: "&b/leashcount"
|
||||
|
||||
nick:
|
||||
description: "&eÄndert deinen Nicknamen mit Farb- und Hex-Support."
|
||||
usage: "&b/nick <Name>"
|
||||
|
||||
ride:
|
||||
description: "&eReite einen Spieler oder Mob."
|
||||
usage: "&b/ride [spieler]"
|
||||
|
||||
lootchests:
|
||||
description: "&eZeigt eine Liste aller aktiven Loot-Kisten an. Admins können per Klick teleportieren."
|
||||
usage: "&b/lootchests"
|
||||
|
||||
tploot:
|
||||
description: "&eTeleportiert dich zu einer Loot-Kiste (nur Admins)."
|
||||
usage: "&b/tploot <welt> <x> <y> <z>"
|
||||
|
||||
day:
|
||||
description: "&eSetzt die Zeit auf Tag."
|
||||
usage: "&b/day"
|
||||
|
||||
night:
|
||||
description: "&eSetzt die Zeit auf Nacht."
|
||||
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:
|
||||
description: "&eZeigt alle Reports eines Spielers an."
|
||||
usage: "&b/showreport <Spieler>"
|
||||
|
||||
clearreport:
|
||||
description: "&eLöscht alle 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:
|
||||
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:
|
||||
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."
|
||||
group: system
|
||||
description: "&eHauptbefehl für SurvivalPlus."
|
||||
usage: "&b/sp [help|info|share|cb|reload]"
|
||||
|
||||
sp_help:
|
||||
group: system
|
||||
description: "&eZeigt die Hilfe an (Spieler/Admin/System)."
|
||||
usage: "&b/sp help [player|admin|system|all] [seite]"
|
||||
|
||||
sp_info:
|
||||
group: system
|
||||
description: "&eZeigt Plugin-Infos und Links."
|
||||
usage: "&b/sp info"
|
||||
|
||||
sp_share:
|
||||
group: player
|
||||
description: "&eTeilt deine Koordinaten nach Bestätigung."
|
||||
usage: "&b/sp share"
|
||||
|
||||
shareconfirm:
|
||||
group: player
|
||||
description: "&eBestätigt das Teilen der Koordinaten."
|
||||
usage: "&b/sp shareconfirm"
|
||||
|
||||
sharecancel:
|
||||
group: player
|
||||
description: "&eBricht das Teilen der Koordinaten ab."
|
||||
usage: "&b/sp sharecancel"
|
||||
|
||||
sp_cb_add:
|
||||
group: admin
|
||||
description: "&eFügt einen Befehl zur Blockierliste hinzu."
|
||||
usage: "&b/sp cb add <befehl>"
|
||||
|
||||
sp_cb_remove:
|
||||
group: admin
|
||||
description: "&eEntfernt einen Befehl aus der Blockierliste."
|
||||
usage: "&b/sp cb remove <befehl>"
|
||||
|
||||
sp_cb_list:
|
||||
group: admin
|
||||
description: "&eZeigt die Liste der blockierten Befehle an."
|
||||
usage: "&b/sp cb list"
|
||||
|
||||
sp_reload:
|
||||
group: admin
|
||||
description: "&eLädt das Plugin neu."
|
||||
usage: "&b/sp reload"
|
||||
|
||||
splock:
|
||||
group: player
|
||||
description: "&eSperrt/entsperrt Container und verwaltet Freunde."
|
||||
usage: "&b/splock lock|unlock|friendadd|friendremove [spieler]"
|
||||
|
||||
sp_lock_lock:
|
||||
group: player
|
||||
description: "&eStartet den Lock-Modus (Block anklicken)."
|
||||
usage: "&b/sp lock"
|
||||
|
||||
sp_lock_unlock:
|
||||
group: player
|
||||
description: "&eEntsperrt einen Block, den du ansiehst."
|
||||
usage: "&b/sp unlock"
|
||||
|
||||
sp_lock_friendadd:
|
||||
group: player
|
||||
description: "&eFügt einen Freund zum Lock-System hinzu."
|
||||
usage: "&b/sp friendadd <spieler>"
|
||||
|
||||
sp_lock_friendremove:
|
||||
group: player
|
||||
description: "&eEntfernt einen Freund aus dem Lock-System."
|
||||
usage: "&b/sp friendremove <spieler>"
|
||||
|
||||
home:
|
||||
group: player
|
||||
description: "&eTeleportiert dich zu einem Home."
|
||||
usage: "&b/home <name>"
|
||||
|
||||
sethome:
|
||||
group: player
|
||||
description: "&eSetzt ein Home mit Namen."
|
||||
usage: "&b/sethome <name>"
|
||||
|
||||
delhome:
|
||||
group: player
|
||||
description: "&eLöscht ein Home."
|
||||
usage: "&b/delhome <name>"
|
||||
|
||||
homelist:
|
||||
group: player
|
||||
description: "&eÖffnet die Homes-Übersicht."
|
||||
usage: "&b/homelist"
|
||||
|
||||
warps:
|
||||
group: player
|
||||
description: "&eÖffnet die Warps-Übersicht."
|
||||
usage: "&b/warps"
|
||||
|
||||
setwarp:
|
||||
group: player
|
||||
description: "&eSetzt einen persönlichen Warp."
|
||||
usage: "&b/setwarp <name>"
|
||||
|
||||
delwarp:
|
||||
group: player
|
||||
description: "&eLöscht einen persönlichen Warp."
|
||||
usage: "&b/delwarp <name>"
|
||||
|
||||
spawn:
|
||||
group: player
|
||||
description: "&eTeleportiert dich zum Weltspawn."
|
||||
usage: "&b/spawn"
|
||||
|
||||
back:
|
||||
group: player
|
||||
description: "&eTeleportiert zum letzten Todespunkt."
|
||||
usage: "&b/back"
|
||||
|
||||
tpa:
|
||||
group: player
|
||||
description: "&eSendet eine Teleportanfrage."
|
||||
usage: "&b/tpa <spieler>"
|
||||
|
||||
tpaccept:
|
||||
group: player
|
||||
description: "&eAkzeptiert eine Teleportanfrage."
|
||||
usage: "&b/tpaccept"
|
||||
|
||||
tpdeny:
|
||||
group: player
|
||||
description: "&eLehnt eine Teleportanfrage ab."
|
||||
usage: "&b/tpdeny"
|
||||
|
||||
friend:
|
||||
group: player
|
||||
description: "&eFreundesliste verwalten."
|
||||
usage: "&b/friend [add|accept|deny|list|del|confirm|tp] [spieler]"
|
||||
|
||||
block:
|
||||
group: player
|
||||
description: "&eBlockiert einen Spieler im Chat."
|
||||
usage: "&b/block <spieler>"
|
||||
|
||||
unblock:
|
||||
group: player
|
||||
description: "&eEntblockt einen Spieler im Chat."
|
||||
usage: "&b/unblock <spieler>"
|
||||
|
||||
blocklist:
|
||||
group: player
|
||||
description: "&eZeigt deine Blockliste."
|
||||
usage: "&b/blocklist"
|
||||
|
||||
trade:
|
||||
group: player
|
||||
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:
|
||||
group: player
|
||||
description: "&eHolt das Starterkit."
|
||||
usage: "&b/kit"
|
||||
|
||||
nick:
|
||||
group: player
|
||||
description: "&eSetzt deinen Nickname."
|
||||
usage: "&b/nick <name> | off"
|
||||
|
||||
ride:
|
||||
group: player
|
||||
description: "&eReite einen Spieler oder Mob."
|
||||
usage: "&b/ride [spieler]"
|
||||
|
||||
sit:
|
||||
group: player
|
||||
description: "&eHinsetzen/Aufstehen."
|
||||
usage: "&b/sit"
|
||||
|
||||
ir:
|
||||
group: player
|
||||
description: "&eBenennt das Item in der Hand um."
|
||||
usage: "&b/ir <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:
|
||||
group: admin
|
||||
description: "&eListet aktive Loot-Kisten."
|
||||
usage: "&b/lootchests"
|
||||
|
||||
tploot:
|
||||
group: admin
|
||||
description: "&eTeleportiert zu einer Loot-Kiste."
|
||||
usage: "&b/tploot <welt> <x> <y> <z>"
|
||||
|
||||
shop:
|
||||
group: player
|
||||
description: "&eShop GUI (Admin: /shop add ...)."
|
||||
usage: "&b/shop [gui|add]"
|
||||
|
||||
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."
|
||||
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:
|
||||
group: admin
|
||||
description: "&eSetzt die Zeit auf Tag."
|
||||
usage: "&b/day"
|
||||
|
||||
night:
|
||||
group: admin
|
||||
description: "&eSetzt die Zeit auf Nacht."
|
||||
usage: "&b/night"
|
||||
|
||||
showreport:
|
||||
group: admin
|
||||
description: "&eZeigt Reports eines Spielers."
|
||||
usage: "&b/showreport <spieler>"
|
||||
|
||||
clearreport:
|
||||
group: admin
|
||||
description: "&eLöscht Reports eines Spielers."
|
||||
usage: "&b/clearreport <spieler>"
|
||||
@@ -1,7 +1,21 @@
|
||||
|
||||
reload:
|
||||
success: "§aSurvivalPlus wurde erfolgreich neu geladen!"
|
||||
|
||||
invalid-subcommand: "§cUngültiger Unterbefehl! Verwendung: /sp [reload|help|info|share]"
|
||||
|
||||
player-only: "§cDieser Befehl ist nur für Spieler!"
|
||||
|
||||
not-found: "§cKeine Befehle verfügbar."
|
||||
|
||||
groups:
|
||||
system: "&6-- System --"
|
||||
player: "&6-- Spieler --"
|
||||
admin: "&6-- Admin --"
|
||||
sp:
|
||||
no-permission: "§cDu hast keine Berechtigung für diesen Befehl!"
|
||||
plugin.reloaded: "§aSurvivalPlus wurde erfolgreich neu geladen!"
|
||||
invalid-subcommand: "§cUngültiger Unterbefehl! Verwendung: /sp [ reload | help | info | share ]"
|
||||
invalid-subcommand: "§cUngültiger Unterbefehl! Verwendung: /sp [help|info|share|shareconfirm|sharecancel|cb|reload]"
|
||||
help-not-found: "§cHilfedatei (help.yml) konnte nicht geladen werden!"
|
||||
|
||||
share:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: SurvivalPlus
|
||||
version: 1.1.2
|
||||
version: 1.1.3
|
||||
|
||||
main: de.viper.survivalplus.SurvivalPlus
|
||||
api-version: 1.21
|
||||
|
||||
Reference in New Issue
Block a user