25 Commits
1.0.0 ... 1.0.1

Author SHA1 Message Date
f22052e5f2 src/main/java/de/viper/survivalplus/Manager/AFKManager.java aktualisiert 2025-08-04 05:09:19 +00:00
bc801863e1 src/main/java/de/viper/survivalplus/listeners/AFKListener.java aktualisiert 2025-08-04 05:08:56 +00:00
c237f2b8c3 Dateien nach "src/main/java/de/viper/survivalplus/listeners" hochladen 2025-08-04 05:08:39 +00:00
7700c588ff src/main/java/de/viper/survivalplus/commands/FriendCommand.java aktualisiert 2025-08-04 05:07:50 +00:00
851ec03788 src/main/java/de/viper/survivalplus/SurvivalPlus.java aktualisiert 2025-08-04 05:07:22 +00:00
a2e75a7142 src/main/resources/lang.yml aktualisiert 2025-08-04 05:06:50 +00:00
c762eff2a1 src/main/resources/help.yml aktualisiert 2025-08-04 05:06:37 +00:00
cbaa562e1d Dateien nach "src/main/java/de/viper/survivalplus/listeners" hochladen 2025-08-03 20:28:19 +00:00
a225838f26 Dateien nach "src/main/java/de/viper/survivalplus/commands" hochladen 2025-08-03 20:27:58 +00:00
ed1948b8b4 src/main/resources/config.yml aktualisiert 2025-08-03 20:27:17 +00:00
f9948d8ccc src/main/java/de/viper/survivalplus/SurvivalPlus.java aktualisiert 2025-08-03 20:26:22 +00:00
1c5c03cf63 src/main/resources/lang.yml aktualisiert 2025-08-03 19:11:06 +00:00
e71074a453 src/main/java/de/viper/survivalplus/commands/UnblockCommand.java aktualisiert 2025-08-03 19:10:36 +00:00
c8ee265de5 src/main/java/de/viper/survivalplus/commands/BlockListCommand.java aktualisiert 2025-08-03 19:10:05 +00:00
18c041434e src/main/java/de/viper/survivalplus/SurvivalPlus.java aktualisiert 2025-08-03 19:09:50 +00:00
94d64821a6 src/main/java/de/viper/survivalplus/commands/BlockCommand.java aktualisiert 2025-08-03 19:09:37 +00:00
3e7c4cbc13 Dateien nach "src/main/java/de/viper/survivalplus/commands" hochladen 2025-08-03 18:50:31 +00:00
2df3a217e4 src/main/java/de/viper/survivalplus/SurvivalPlus.java aktualisiert 2025-08-03 18:49:59 +00:00
9078098fb0 src/main/java/de/viper/survivalplus/Manager/BlockManager.java aktualisiert 2025-08-03 18:49:32 +00:00
dc14a8dac2 src/main/resources/plugin.yml aktualisiert 2025-08-03 18:49:09 +00:00
6a221a3cbe src/main/resources/plugin.yml aktualisiert 2025-08-03 18:32:21 +00:00
4187194a3d src/main/java/de/viper/survivalplus/SurvivalPlus.java aktualisiert 2025-08-03 18:32:01 +00:00
fac39de66f Dateien nach "src/main/java/de/viper/survivalplus/commands" hochladen 2025-08-03 18:31:45 +00:00
f03efaa6e6 Dateien nach "src/main/java/de/viper/survivalplus/listeners" hochladen 2025-08-03 18:31:20 +00:00
6016d2af9b Dateien nach "src/main/java/de/viper/survivalplus/Manager" hochladen 2025-08-03 18:30:58 +00:00
16 changed files with 2476 additions and 1882 deletions

View File

@@ -1,143 +1,161 @@
package de.viper.survivalplus.tasks; package de.viper.survivalplus.tasks;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.boss.BarColor; import org.bukkit.boss.BarColor;
import org.bukkit.boss.BarFlag; import org.bukkit.boss.BarFlag;
import org.bukkit.boss.BarStyle; import org.bukkit.boss.BarStyle;
import org.bukkit.boss.BossBar; import org.bukkit.boss.BossBar;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.plugin.Plugin; import org.bukkit.plugin.Plugin;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
import java.util.*; import java.util.*;
public class AFKManager { public class AFKManager {
private final Plugin plugin; private final Plugin plugin;
private final long afkAfterMillis; private final long afkAfterMillis;
private final long kickAfterMillis; private final long kickAfterMillis;
private final long joinGracePeriodMillis = 5000; // 5 Sekunden Schonfrist
private final Map<UUID, Long> lastActivity = new HashMap<>();
private final Set<UUID> afkPlayers = new HashSet<>(); private final Map<UUID, Long> lastActivity = new HashMap<>();
private final Map<UUID, BossBar> bossBars = new WeakHashMap<>(); private final Map<UUID, Long> joinTimes = new HashMap<>();
private final Map<UUID, Integer> colorIndex = new HashMap<>(); private final Set<UUID> afkPlayers = new HashSet<>();
private final Map<UUID, BukkitRunnable> colorTasks = new HashMap<>(); private final Map<UUID, BossBar> bossBars = new WeakHashMap<>();
private final Map<UUID, Integer> colorIndex = new HashMap<>();
private final List<BarColor> colorCycle = List.of( private final Map<UUID, BukkitRunnable> colorTasks = new HashMap<>();
BarColor.RED, BarColor.YELLOW, BarColor.GREEN,
BarColor.BLUE, BarColor.PURPLE, BarColor.PINK private final List<BarColor> colorCycle = List.of(
); BarColor.RED, BarColor.YELLOW, BarColor.GREEN,
BarColor.BLUE, BarColor.PURPLE, BarColor.PINK
public AFKManager(Plugin plugin, long afkAfterSeconds, long kickAfterSeconds) { );
this.plugin = plugin;
this.afkAfterMillis = afkAfterSeconds * 1000; public AFKManager(Plugin plugin, long afkAfterSeconds, long kickAfterSeconds) {
this.kickAfterMillis = kickAfterSeconds * 1000; this.plugin = plugin;
} this.afkAfterMillis = afkAfterSeconds * 1000;
this.kickAfterMillis = kickAfterSeconds * 1000;
public void updateActivity(Player player) { }
UUID uuid = player.getUniqueId();
lastActivity.put(uuid, System.currentTimeMillis()); public void updateActivity(Player player) {
UUID uuid = player.getUniqueId();
if (afkPlayers.contains(uuid)) { lastActivity.put(uuid, System.currentTimeMillis());
afkPlayers.remove(uuid); if (!joinTimes.containsKey(uuid)) {
removeAFKBossBar(player); joinTimes.put(uuid, System.currentTimeMillis()); // Join-Zeit speichern
} }
}
if (afkPlayers.contains(uuid)) {
public void reset(Player player) { afkPlayers.remove(uuid);
UUID uuid = player.getUniqueId(); removeAFKBossBar(player);
lastActivity.remove(uuid); }
afkPlayers.remove(uuid); }
removeAFKBossBar(player);
} public void reset(Player player) {
UUID uuid = player.getUniqueId();
public boolean isAFK(Player player) { lastActivity.remove(uuid);
return afkPlayers.contains(player.getUniqueId()); joinTimes.remove(uuid); // Join-Zeit entfernen
} afkPlayers.remove(uuid);
removeAFKBossBar(player);
public void checkAFKStatus(Player player) { }
UUID uuid = player.getUniqueId();
long currentTime = System.currentTimeMillis(); public boolean isAFK(Player player) {
return afkPlayers.contains(player.getUniqueId());
if (!lastActivity.containsKey(uuid)) { }
lastActivity.put(uuid, currentTime);
return; public void checkAFKStatus(Player player) {
} UUID uuid = player.getUniqueId();
long currentTime = System.currentTimeMillis();
long last = lastActivity.get(uuid);
long diff = currentTime - last; // AFK-Prüfung überspringen, wenn Spieler in der Schonfrist ist
if (joinTimes.containsKey(uuid) && (currentTime - joinTimes.get(uuid) < joinGracePeriodMillis)) {
if (diff >= afkAfterMillis) { return;
if (!afkPlayers.contains(uuid)) { }
afkPlayers.add(uuid);
// BossBar wird im Listener angezeigt // AFK-Prüfung für Kreativ- oder Zuschauermodus überspringen
} if (player.getGameMode() == org.bukkit.GameMode.CREATIVE ||
player.getGameMode() == org.bukkit.GameMode.SPECTATOR) {
if (kickAfterMillis > 0 && diff >= kickAfterMillis) { return;
player.kickPlayer("§cDu wurdest wegen AFK gekickt."); }
}
} else { if (!lastActivity.containsKey(uuid)) {
if (afkPlayers.contains(uuid)) { lastActivity.put(uuid, currentTime);
afkPlayers.remove(uuid); return;
removeAFKBossBar(player); }
}
} long last = lastActivity.get(uuid);
} long diff = currentTime - last;
public void showAFKBossBar(Player player, String message) { if (diff >= afkAfterMillis) {
UUID uuid = player.getUniqueId(); if (!afkPlayers.contains(uuid)) {
removeAFKBossBar(player); // sicherstellen, dass nur eine BossBar aktiv ist afkPlayers.add(uuid);
showAFKBossBar(player, "§cDu bist AFK!");
BossBar bar = Bukkit.createBossBar(message, BarColor.YELLOW, BarStyle.SOLID, BarFlag.CREATE_FOG); }
bar.addPlayer(player);
bar.setVisible(true); if (kickAfterMillis > 0 && diff >= kickAfterMillis) {
plugin.getLogger().info("Spieler " + player.getName() + " wird wegen AFK gekickt. Inaktiv seit: " + (diff / 1000) + " Sekunden");
bossBars.put(uuid, bar); player.kickPlayer("§cDu wurdest wegen AFK gekickt.");
colorIndex.put(uuid, 0); }
} else {
// Alten Farbwechsel-Task stoppen, falls vorhanden if (afkPlayers.contains(uuid)) {
if (colorTasks.containsKey(uuid)) { afkPlayers.remove(uuid);
colorTasks.get(uuid).cancel(); removeAFKBossBar(player);
colorTasks.remove(uuid); }
} }
}
BukkitRunnable task = new BukkitRunnable() {
@Override public void showAFKBossBar(Player player, String message) {
public void run() { UUID uuid = player.getUniqueId();
if (!bossBars.containsKey(uuid)) { removeAFKBossBar(player); // Sicherstellen, dass nur eine BossBar aktiv ist
this.cancel();
colorTasks.remove(uuid); BossBar bar = Bukkit.createBossBar(message, BarColor.YELLOW, BarStyle.SOLID, BarFlag.CREATE_FOG);
return; bar.addPlayer(player);
} bar.setVisible(true);
int index = colorIndex.getOrDefault(uuid, 0); bossBars.put(uuid, bar);
BarColor color = colorCycle.get(index); colorIndex.put(uuid, 0);
BossBar activeBar = bossBars.get(uuid); // Alten Farbwechsel-Task stoppen, falls vorhanden
if (activeBar != null) { if (colorTasks.containsKey(uuid)) {
activeBar.setColor(color); colorTasks.get(uuid).cancel();
} colorTasks.remove(uuid);
}
colorIndex.put(uuid, (index + 1) % colorCycle.size());
} BukkitRunnable task = new BukkitRunnable() {
}; @Override
task.runTaskTimer(plugin, 0L, 20L); // alle 20 Ticks (1 Sekunde) public void run() {
colorTasks.put(uuid, task); if (!bossBars.containsKey(uuid)) {
} this.cancel();
colorTasks.remove(uuid);
public void removeAFKBossBar(Player player) { return;
UUID uuid = player.getUniqueId(); }
// Farbwechsel-Task stoppen int index = colorIndex.getOrDefault(uuid, 0);
if (colorTasks.containsKey(uuid)) { BarColor color = colorCycle.get(index);
colorTasks.get(uuid).cancel();
colorTasks.remove(uuid); BossBar activeBar = bossBars.get(uuid);
} if (activeBar != null) {
activeBar.setColor(color);
BossBar bar = bossBars.remove(uuid); }
if (bar != null) {
bar.removeAll(); colorIndex.put(uuid, (index + 1) % colorCycle.size());
} }
colorIndex.remove(uuid); };
} task.runTaskTimer(plugin, 0L, 20L); // Alle 20 Ticks (1 Sekunde)
} colorTasks.put(uuid, task);
}
public void removeAFKBossBar(Player player) {
UUID uuid = player.getUniqueId();
// Farbwechsel-Task stoppen
if (colorTasks.containsKey(uuid)) {
colorTasks.get(uuid).cancel();
colorTasks.remove(uuid);
}
BossBar bar = bossBars.remove(uuid);
if (bar != null) {
bar.removeAll();
}
colorIndex.remove(uuid);
}
}

View File

@@ -0,0 +1,37 @@
package de.viper.survivalplus.Manager;
import java.util.*;
import org.bukkit.entity.Player;
public class BlockManager {
private final Map<UUID, Set<UUID>> blockedPlayers = new HashMap<>();
public void blockPlayer(Player blocker, Player toBlock) {
blockedPlayers.computeIfAbsent(blocker.getUniqueId(), k -> new HashSet<>()).add(toBlock.getUniqueId());
}
public void unblockPlayer(Player blocker, Player toUnblock) {
Set<UUID> blocked = blockedPlayers.get(blocker.getUniqueId());
if (blocked != null) {
blocked.remove(toUnblock.getUniqueId());
if (blocked.isEmpty()) {
blockedPlayers.remove(blocker.getUniqueId());
}
}
}
public boolean hasBlocked(Player blocker, Player potentialBlocked) {
return blockedPlayers.getOrDefault(blocker.getUniqueId(), Collections.emptySet())
.contains(potentialBlocked.getUniqueId());
}
public Set<UUID> getBlockedPlayers(Player player) {
return blockedPlayers.getOrDefault(player.getUniqueId(), Collections.emptySet());
}
public void clear(Player player) {
blockedPlayers.remove(player.getUniqueId());
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,47 @@
package de.viper.survivalplus.commands;
import de.viper.survivalplus.Manager.BlockManager;
import org.bukkit.Bukkit;
import org.bukkit.command.*;
import org.bukkit.entity.Player;
import org.bukkit.configuration.file.FileConfiguration;
public class BlockCommand implements CommandExecutor {
private final BlockManager blockManager;
private final FileConfiguration config;
public BlockCommand(BlockManager blockManager, FileConfiguration config) {
this.blockManager = blockManager;
this.config = config;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player player)) {
sender.sendMessage(config.getString("messages.general.only_players"));
return true;
}
if (args.length != 1) {
player.sendMessage(config.getString("messages.block.usage"));
return true;
}
Player target = Bukkit.getPlayerExact(args[0]);
if (target == null || target == player) {
player.sendMessage(config.getString("messages.block.invalid_player"));
return true;
}
if (blockManager.hasBlocked(player, target)) {
player.sendMessage(config.getString("messages.block.already_blocked").replace("%player%", target.getName()));
} else {
blockManager.blockPlayer(player, target);
player.sendMessage(config.getString("messages.block.blocked").replace("%player%", target.getName()));
}
return true;
}
}

View File

@@ -0,0 +1,43 @@
package de.viper.survivalplus.commands;
import de.viper.survivalplus.Manager.BlockManager;
import org.bukkit.Bukkit;
import org.bukkit.command.*;
import org.bukkit.entity.Player;
import org.bukkit.configuration.file.FileConfiguration;
import java.util.stream.Collectors;
public class BlockListCommand implements CommandExecutor {
private final BlockManager blockManager;
private final FileConfiguration config;
public BlockListCommand(BlockManager blockManager, FileConfiguration config) {
this.blockManager = blockManager;
this.config = config;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player player)) {
sender.sendMessage(config.getString("messages.general.only_players"));
return true;
}
var blocked = blockManager.getBlockedPlayers(player);
if (blocked.isEmpty()) {
player.sendMessage(config.getString("messages.blocklist.no_blocked_players"));
return true;
}
String list = blocked.stream()
.map(Bukkit::getOfflinePlayer)
.map(p -> p.getName() != null ? p.getName() : "Unbekannt")
.collect(Collectors.joining(", "));
player.sendMessage(config.getString("messages.blocklist.blocked_players").replace("%list%", list));
return true;
}
}

View File

@@ -1,343 +1,423 @@
package de.viper.survivalplus.commands; package de.viper.survivalplus.commands;
import org.bukkit.Bukkit; import net.md_5.bungee.api.chat.ClickEvent;
import org.bukkit.ChatColor; import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.command.Command; import org.bukkit.Bukkit;
import org.bukkit.command.CommandExecutor; import org.bukkit.ChatColor;
import org.bukkit.command.CommandSender; import org.bukkit.command.Command;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.command.CommandExecutor;
import org.bukkit.entity.Player; import org.bukkit.command.CommandSender;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player;
import java.io.File; import org.bukkit.plugin.java.JavaPlugin;
import java.io.IOException;
import java.util.ArrayList; import java.io.File;
import java.util.List; import java.io.IOException;
import java.util.UUID; import java.text.SimpleDateFormat;
import java.util.logging.Logger; import java.util.ArrayList;
import java.util.Date;
public class FriendCommand implements CommandExecutor { import java.util.List;
private final JavaPlugin plugin; import java.util.UUID;
private final FileConfiguration friendsConfig; import java.util.logging.Logger;
private final FileConfiguration langConfig;
private final Logger logger; public class FriendCommand implements CommandExecutor {
private final JavaPlugin plugin;
public FriendCommand(JavaPlugin plugin, FileConfiguration friendsConfig, FileConfiguration langConfig, Logger logger) { private final FileConfiguration friendsConfig;
this.plugin = plugin; private final FileConfiguration langConfig;
this.friendsConfig = friendsConfig; private final Logger logger;
this.langConfig = langConfig;
this.logger = logger; public FriendCommand(JavaPlugin plugin, FileConfiguration friendsConfig, FileConfiguration langConfig, Logger logger) {
} this.plugin = plugin;
this.friendsConfig = friendsConfig;
@Override this.langConfig = langConfig;
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { this.logger = logger;
if (!(sender instanceof Player)) { }
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-only", "&cDieser Befehl ist nur für Spieler!")));
return true; @Override
} public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player)) {
Player player = (Player) sender; sender.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-only", "&cDieser Befehl ist nur für Spieler!")));
UUID playerUUID = player.getUniqueId(); return true;
}
if (args.length == 0) {
sendHelpMessage(player); Player player = (Player) sender;
return true; UUID playerUUID = player.getUniqueId();
}
if (args.length == 0) {
String subCommand = args[0].toLowerCase(); sendHelpMessage(player);
return true;
switch (subCommand) { }
case "add":
if (args.length != 2) { String subCommand = args[0].toLowerCase();
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.add-usage", "&cVerwendung: /friend add <Spielername>")));
return true; switch (subCommand) {
} case "add":
handleFriendAdd(player, args[1]); if (args.length != 2) {
break; player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.add-usage", "&cVerwendung: /friend add <Spielername>")));
return true;
case "accept": }
if (args.length != 2) { handleFriendAdd(player, args[1]);
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.accept-usage", "&cVerwendung: /friend accept <Spielername>"))); break;
return true;
} case "accept":
handleFriendAccept(player, args[1]); if (args.length != 2) {
break; player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.accept-usage", "&cVerwendung: /friend accept <Spielername>")));
return true;
case "deny": }
if (args.length != 2) { handleFriendAccept(player, args[1]);
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.deny-usage", "&cVerwendung: /friend deny <Spielername>"))); break;
return true;
} case "deny":
handleFriendDeny(player, args[1]); if (args.length != 2) {
break; player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.deny-usage", "&cVerwendung: /friend deny <Spielername>")));
return true;
case "list": }
if (args.length != 1) { handleFriendDeny(player, args[1]);
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.list-usage", "&cVerwendung: /friend list"))); break;
return true;
} case "list":
handleFriendList(player); if (args.length != 1) {
break; player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.list-usage", "&cVerwendung: /friend list")));
return true;
case "del": }
if (args.length != 2) { handleFriendList(player);
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.del-usage", "&cVerwendung: /friend del <Spielername>"))); break;
return true;
} case "del":
handleFriendDelete(player, args[1]); if (args.length != 2) {
break; player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.del-usage", "&cVerwendung: /friend del <Spielername>")));
return true;
case "tp": }
if (args.length != 2) { handleFriendDelete(player, args[1]);
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.tp-usage", "&cVerwendung: /friend tp <Spielername>"))); break;
return true;
} case "confirm":
handleFriendTeleport(player, args[1]); if (args.length != 2) {
break; player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.confirm-usage", "&cVerwendung: /friend confirm <Spielername>")));
return true;
default: }
sendHelpMessage(player); handleFriendConfirmDelete(player, args[1]);
break; break;
}
case "tp":
return true; if (args.length != 2) {
} player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.tp-usage", "&cVerwendung: /friend tp <Spielername>")));
return true;
private void sendHelpMessage(Player player) { }
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.header", "&6=== Freundesliste Hilfe ==="))); handleFriendTeleport(player, args[1]);
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.add", "&e/friend add <Spielername> &7- Freundschaftsanfrage senden"))); break;
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.accept", "&e/friend accept <Spielername> &7- Freundschaftsanfrage akzeptieren")));
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.deny", "&e/friend deny <Spielername> &7- Freundschaftsanfrage ablehnen"))); default:
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.list", "&e/friend list &7- Liste deiner Freunde anzeigen"))); sendHelpMessage(player);
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.del", "&e/friend del <Spielername> &7- Freund aus der Liste entfernen"))); break;
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.tp", "&e/friend tp <Spielername> &7- Zu einem Freund teleportieren"))); }
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.footer", "&6=====================")));
} return true;
}
private void handleFriendAdd(Player player, String targetName) {
Player target = Bukkit.getPlayerExact(targetName); private void sendHelpMessage(Player player) {
if (target == null) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.header", "&6=== Freundesliste Hilfe ===")));
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", targetName))); player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.add", "&e/friend add <Spielername> &7- Freundschaftsanfrage senden")));
return; player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.accept", "&e/friend accept <Spielername> &7- Freundschaftsanfrage akzeptieren")));
} player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.deny", "&e/friend deny <Spielername> &7- Freundschaftsanfrage ablehnen")));
if (target.getUniqueId().equals(player.getUniqueId())) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.list", "&e/friend list &7- Liste deiner Freunde anzeigen")));
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.self", "&cDu kannst dich nicht selbst hinzufügen!"))); player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.del", "&e/friend del <Spielername> &7- Freund aus der Liste entfernen")));
return; player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.tp", "&e/friend tp <Spielername> &7- Zu einem Freund teleportieren")));
} player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.footer", "&6=====================")));
}
UUID playerUUID = player.getUniqueId();
UUID targetUUID = target.getUniqueId(); private void handleFriendAdd(Player player, String targetName) {
List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends"); Player target = Bukkit.getPlayerExact(targetName);
List<String> pendingRequests = friendsConfig.getStringList(targetUUID + ".pending_requests"); if (target == null) {
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", targetName)));
if (playerFriends.contains(targetUUID.toString())) { return;
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.already-friends", "&cDu bist bereits mit %s befreundet!").replace("%s", targetName))); }
return; if (target.getUniqueId().equals(player.getUniqueId())) {
} player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.self", "&cDu kannst dich nicht selbst hinzufügen!")));
return;
if (pendingRequests.contains(playerUUID.toString())) { }
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.request-pending", "&cDu hast bereits eine Anfrage an %s gesendet!").replace("%s", targetName)));
return; UUID playerUUID = player.getUniqueId();
} UUID targetUUID = target.getUniqueId();
List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends");
pendingRequests.add(playerUUID.toString()); List<String> pendingRequests = friendsConfig.getStringList(targetUUID + ".pending_requests");
friendsConfig.set(targetUUID + ".pending_requests", pendingRequests);
friendsConfig.set(targetUUID + ".name", targetName); // Speichere den Namen für Offline-Lookups if (playerFriends.contains(targetUUID.toString())) {
saveFriendsConfig(); player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.already-friends", "&cDu bist bereits mit %s befreundet!").replace("%s", targetName)));
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.add.sent", "&aFreundschaftsanfrage an %s gesendet!").replace("%s", targetName))); return;
target.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.add.received", "&aDu hast eine Freundschaftsanfrage von %s erhalten! Verwende /friend accept %s oder /friend deny %s.").replace("%s", player.getName()))); }
logger.info("Freundschaftsanfrage von " + player.getName() + " an " + targetName + " gesendet.");
} if (pendingRequests.contains(playerUUID.toString())) {
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.request-pending", "&cDu hast bereits eine Anfrage an %s gesendet!").replace("%s", targetName)));
private void handleFriendAccept(Player player, String requesterName) { return;
Player requester = Bukkit.getPlayerExact(requesterName); }
if (requester == null) {
UUID requesterUUID = getUUIDFromName(requesterName); pendingRequests.add(playerUUID.toString());
if (requesterUUID == null) { friendsConfig.set(targetUUID + ".pending_requests", pendingRequests);
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", requesterName))); friendsConfig.set(targetUUID + ".name", targetName);
return; saveFriendsConfig();
}
acceptFriendRequest(player, requesterUUID, requesterName); player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.add.sent", "&aFreundschaftsanfrage an %s gesendet!").replace("%s", targetName)));
} else {
acceptFriendRequest(player, requester.getUniqueId(), requesterName); TextComponent message = new TextComponent(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.add.received", "&aDu hast eine Freundschaftsanfrage von %s erhalten! ").replace("%s", player.getName())));
} TextComponent accept = new TextComponent(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.add.accept-button", "&a[Accept]")));
} accept.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/friend accept " + player.getName()));
TextComponent deny = new TextComponent(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.add.deny-button", "&c [Deny]")));
private void acceptFriendRequest(Player player, UUID requesterUUID, String requesterName) { deny.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/friend deny " + player.getName()));
UUID playerUUID = player.getUniqueId(); message.addExtra(accept);
List<String> pendingRequests = friendsConfig.getStringList(playerUUID + ".pending_requests"); message.addExtra(deny);
target.spigot().sendMessage(message);
if (!pendingRequests.contains(requesterUUID.toString())) {
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.no-request", "&cKeine Anfrage von %s gefunden!").replace("%s", requesterName))); logger.info("Freundschaftsanfrage von " + player.getName() + " an " + targetName + " gesendet.");
return; }
}
private void handleFriendAccept(Player player, String requesterName) {
pendingRequests.remove(requesterUUID.toString()); Player requester = Bukkit.getPlayerExact(requesterName);
friendsConfig.set(playerUUID + ".pending_requests", pendingRequests); if (requester == null) {
UUID requesterUUID = getUUIDFromName(requesterName);
List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends"); if (requesterUUID == null) {
List<String> requesterFriends = friendsConfig.getStringList(requesterUUID + ".friends"); player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", requesterName)));
return;
playerFriends.add(requesterUUID.toString()); }
requesterFriends.add(playerUUID.toString()); acceptFriendRequest(player, requesterUUID, requesterName);
} else {
friendsConfig.set(playerUUID + ".friends", playerFriends); acceptFriendRequest(player, requester.getUniqueId(), requesterName);
friendsConfig.set(playerUUID + ".name", player.getName()); // Speichere den Namen für Offline-Lookups }
friendsConfig.set(requesterUUID + ".friends", requesterFriends); }
friendsConfig.set(requesterUUID + ".name", requesterName); // Speichere den Namen für Offline-Lookups
private void acceptFriendRequest(Player player, UUID requesterUUID, String requesterName) {
saveFriendsConfig(); UUID playerUUID = player.getUniqueId();
List<String> pendingRequests = friendsConfig.getStringList(playerUUID + ".pending_requests");
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.accept.success", "&aDu bist jetzt mit %s befreundet!").replace("%s", requesterName)));
Player requester = Bukkit.getPlayer(requesterUUID); if (!pendingRequests.contains(requesterUUID.toString())) {
if (requester != null) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.no-request", "&cKeine Anfrage von %s gefunden!").replace("%s", requesterName)));
requester.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.accept.notify", "&a%s hat deine Freundschaftsanfrage akzeptiert!").replace("%s", player.getName()))); return;
} }
logger.info(player.getName() + " hat die Freundschaftsanfrage von " + requesterName + " akzeptiert.");
} pendingRequests.remove(requesterUUID.toString());
friendsConfig.set(playerUUID + ".pending_requests", pendingRequests);
private void handleFriendDeny(Player player, String requesterName) {
UUID requesterUUID = getUUIDFromName(requesterName); List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends");
if (requesterUUID == null) { List<String> requesterFriends = friendsConfig.getStringList(requesterUUID + ".friends");
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", requesterName)));
return; playerFriends.add(requesterUUID.toString());
} requesterFriends.add(playerUUID.toString());
UUID playerUUID = player.getUniqueId(); friendsConfig.set(playerUUID + ".friends", playerFriends);
List<String> pendingRequests = friendsConfig.getStringList(playerUUID + ".pending_requests"); friendsConfig.set(playerUUID + ".name", player.getName());
friendsConfig.set(requesterUUID + ".friends", requesterFriends);
if (!pendingRequests.contains(requesterUUID.toString())) { friendsConfig.set(requesterUUID + ".name", requesterName);
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.no-request", "&cKeine Anfrage von %s gefunden!").replace("%s", requesterName)));
return; saveFriendsConfig();
}
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.accept.success", "&aDu bist jetzt mit %s befreundet!").replace("%s", requesterName)));
pendingRequests.remove(requesterUUID.toString()); Player requester = Bukkit.getPlayer(requesterUUID);
friendsConfig.set(playerUUID + ".pending_requests", pendingRequests); if (requester != null) {
saveFriendsConfig(); requester.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.accept.notify", "&a%s hat deine Freundschaftsanfrage akzeptiert!").replace("%s", player.getName())));
}
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.deny.success", "&aFreundschaftsanfrage von %s abgelehnt.").replace("%s", requesterName))); logger.info(player.getName() + " hat die Freundschaftsanfrage von " + requesterName + " akzeptiert.");
Player requester = Bukkit.getPlayer(requesterUUID); }
if (requester != null) {
requester.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.deny.notify", "&c%s hat deine Freundschaftsanfrage abgelehnt.").replace("%s", player.getName()))); private void handleFriendDeny(Player player, String requesterName) {
} UUID requesterUUID = getUUIDFromName(requesterName);
logger.info(player.getName() + " hat die Freundschaftsanfrage von " + requesterName + " abgelehnt."); if (requesterUUID == null) {
} player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", requesterName)));
return;
private void handleFriendList(Player player) { }
UUID playerUUID = player.getUniqueId();
List<String> friendUUIDs = friendsConfig.getStringList(playerUUID + ".friends"); UUID playerUUID = player.getUniqueId();
List<String> pendingRequests = friendsConfig.getStringList(playerUUID + ".pending_requests");
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.header", "&6=== Deine Freundesliste ===")));
if (friendUUIDs.isEmpty()) { if (!pendingRequests.contains(requesterUUID.toString())) {
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.empty", "&7Du hast keine Freunde."))); player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.no-request", "&cKeine Anfrage von %s gefunden!").replace("%s", requesterName)));
} else { return;
for (String friendUUID : friendUUIDs) { }
String friendName = getNameFromUUID(UUID.fromString(friendUUID));
Player friend = Bukkit.getPlayer(UUID.fromString(friendUUID)); pendingRequests.remove(requesterUUID.toString());
String status = friend != null ? langConfig.getString("friend.list.online", "&aOnline") : langConfig.getString("friend.list.offline", "&7Offline"); friendsConfig.set(playerUUID + ".pending_requests", pendingRequests);
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.entry", "&e%s: %s").replaceFirst("%s", friendName).replaceFirst("%s", status))); saveFriendsConfig();
}
} player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.deny.success", "&aFreundschaftsanfrage von %s abgelehnt.").replace("%s", requesterName)));
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.footer", "&6====================="))); Player requester = Bukkit.getPlayer(requesterUUID);
logger.info("Freundesliste für " + player.getName() + " angezeigt."); if (requester != null) {
} requester.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.deny.notify", "&c%s hat deine Freundschaftsanfrage abgelehnt.").replace("%s", player.getName())));
}
private void handleFriendDelete(Player player, String friendName) { logger.info(player.getName() + " hat die Freundschaftsanfrage von " + requesterName + " abgelehnt.");
UUID friendUUID = getUUIDFromName(friendName); }
if (friendUUID == null) {
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", friendName))); private void handleFriendList(Player player) {
return; UUID playerUUID = player.getUniqueId();
} List<String> friendUUIDs = friendsConfig.getStringList(playerUUID + ".friends");
UUID playerUUID = player.getUniqueId(); player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.header", "&6=== Deine Freundesliste ===")));
List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends"); if (friendUUIDs.isEmpty()) {
List<String> friendFriends = friendsConfig.getStringList(friendUUID + ".friends"); player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.empty", "&7Du hast keine Freunde.")));
} else {
if (!playerFriends.contains(friendUUID.toString())) { SimpleDateFormat dateFormat = new SimpleDateFormat(langConfig.getString("friend.list.date-format", "dd.MM.yyyy HH:mm:ss"));
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.not-friends", "&c%s ist nicht in deiner Freundesliste!").replace("%s", friendName))); for (String friendUUID : friendUUIDs) {
return; String friendName = getNameFromUUID(UUID.fromString(friendUUID));
} Player friend = Bukkit.getPlayer(UUID.fromString(friendUUID));
TextComponent entry = new TextComponent();
playerFriends.remove(friendUUID.toString());
friendFriends.remove(playerUUID.toString()); if (friend != null) {
entry.addExtra(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.entry", "&e%s: %s").replaceFirst("%s", friendName).replaceFirst("%s", langConfig.getString("friend.list.online", "&aOnline"))));
friendsConfig.set(playerUUID + ".friends", playerFriends); } else {
friendsConfig.set(friendUUID + ".friends", friendFriends); long lastOnline = friendsConfig.getLong(friendUUID + ".last-online", 0);
saveFriendsConfig(); String lastOnlineStr = lastOnline > 0 ? dateFormat.format(new Date(lastOnline)) : langConfig.getString("friend.list.unknown", "&7Unbekannt");
entry.addExtra(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.entry-offline", "&e%s: %s &7(Zuletzt online: %s)").replaceFirst("%s", friendName).replaceFirst("%s", langConfig.getString("friend.list.offline", "&7Offline")).replace("%s", lastOnlineStr)));
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.del.success", "&a%s wurde aus deiner Freundesliste entfernt.").replace("%s", friendName))); }
Player friend = Bukkit.getPlayer(friendUUID);
if (friend != null) { TextComponent removeButton = new TextComponent(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.remove-button", "&c[X]")));
friend.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.del.notify", "&c%s hat dich aus seiner Freundesliste entfernt.").replace("%s", player.getName()))); removeButton.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/friend del " + friendName));
} entry.addExtra(" ");
logger.info(player.getName() + " hat " + friendName + " aus der Freundesliste entfernt."); entry.addExtra(removeButton);
}
player.spigot().sendMessage(entry);
private void handleFriendTeleport(Player player, String friendName) { }
Player friend = Bukkit.getPlayerExact(friendName); }
if (friend == null) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.footer", "&6=====================")));
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", friendName))); logger.info("Freundesliste für " + player.getName() + " angezeigt.");
return; }
}
private void handleFriendDelete(Player player, String friendName) {
UUID playerUUID = player.getUniqueId(); UUID friendUUID = getUUIDFromName(friendName);
UUID friendUUID = friend.getUniqueId(); if (friendUUID == null) {
List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends"); player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", friendName)));
return;
if (!playerFriends.contains(friendUUID.toString())) { }
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.not-friends", "&c%s ist nicht in deiner Freundesliste!").replace("%s", friendName)));
return; UUID playerUUID = player.getUniqueId();
} List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends");
if (!player.getWorld().equals(friend.getWorld())) { if (!playerFriends.contains(friendUUID.toString())) {
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.different-world", "&cIhr müsst in derselben Welt sein, um zu teleportieren!"))); player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.not-friends", "&c%s ist nicht in deiner Freundesliste!").replace("%s", friendName)));
return; return;
} }
player.teleport(friend.getLocation()); TextComponent confirmMessage = new TextComponent(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.del.confirm", "&cMöchtest du %s wirklich aus deiner Freundesliste entfernen? ").replace("%s", friendName)));
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.tp.success", "&aDu wurdest zu %s teleportiert!").replace("%s", friendName))); TextComponent confirmButton = new TextComponent(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.del.confirm-button", "&a[Confirm]")));
friend.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.tp.notify", "&a%s hat sich zu dir teleportiert.").replace("%s", player.getName()))); confirmButton.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/friend confirm " + friendName));
logger.info(player.getName() + " hat sich zu " + friendName + " teleportiert."); TextComponent cancelButton = new TextComponent(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.del.cancel-button", "&c[Cancel]")));
} cancelButton.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/friend list"));
confirmMessage.addExtra(confirmButton);
private UUID getUUIDFromName(String name) { confirmMessage.addExtra(" ");
Player target = Bukkit.getPlayerExact(name); confirmMessage.addExtra(cancelButton);
if (target != null) { player.spigot().sendMessage(confirmMessage);
return target.getUniqueId();
} logger.info(player.getName() + " wurde zur Bestätigung aufgefordert, " + friendName + " aus der Freundesliste zu entfernen.");
// Fallback für Offline-Spieler }
for (String key : friendsConfig.getKeys(false)) {
try { private void handleFriendConfirmDelete(Player player, String friendName) {
UUID uuid = UUID.fromString(key); UUID friendUUID = getUUIDFromName(friendName);
String storedName = friendsConfig.getString(key + ".name"); if (friendUUID == null) {
if (storedName != null && storedName.equalsIgnoreCase(name)) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", friendName)));
return uuid; return;
} }
} catch (IllegalArgumentException ignored) {
} UUID playerUUID = player.getUniqueId();
} List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends");
return null; List<String> friendFriends = friendsConfig.getStringList(friendUUID + ".friends");
}
if (!playerFriends.contains(friendUUID.toString())) {
private String getNameFromUUID(UUID uuid) { player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.not-friends", "&c%s ist nicht in deiner Freundesliste!").replace("%s", friendName)));
Player player = Bukkit.getPlayer(uuid); return;
if (player != null) { }
return player.getName();
} playerFriends.remove(friendUUID.toString());
String storedName = friendsConfig.getString(uuid + ".name"); friendFriends.remove(playerUUID.toString());
if (storedName != null) {
return storedName; friendsConfig.set(playerUUID + ".friends", playerFriends);
} friendsConfig.set(friendUUID + ".friends", friendFriends);
return uuid.toString(); // Fallback auf UUID, falls Name nicht gefunden saveFriendsConfig();
}
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.del.success", "&a%s wurde aus deiner Freundesliste entfernt.").replace("%s", friendName)));
private void saveFriendsConfig() { Player friend = Bukkit.getPlayer(friendUUID);
try { if (friend != null) {
friendsConfig.save(new File(plugin.getDataFolder(), "friends.yml")); friend.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.del.notify", "&c%s hat dich aus seiner Freundesliste entfernt.").replace("%s", player.getName())));
logger.fine("friends.yml erfolgreich gespeichert."); }
} catch (IOException e) { logger.info(player.getName() + " hat " + friendName + " aus der Freundesliste entfernt.");
logger.severe("Fehler beim Speichern der friends.yml: " + e.getMessage()); }
e.printStackTrace();
} private void handleFriendTeleport(Player player, String friendName) {
} Player friend = Bukkit.getPlayerExact(friendName);
if (friend == null) {
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", friendName)));
return;
}
UUID playerUUID = player.getUniqueId();
UUID friendUUID = friend.getUniqueId();
List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends");
if (!playerFriends.contains(friendUUID.toString())) {
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.not-friends", "&c%s ist nicht in deiner Freundesliste!").replace("%s", friendName)));
return;
}
if (!player.getWorld().equals(friend.getWorld())) {
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.different-world", "&cIhr müsst in derselben Welt sein, um zu teleportieren!")));
return;
}
player.teleport(friend.getLocation());
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.tp.success", "&aDu wurdest zu %s teleportiert!").replace("%s", friendName)));
friend.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.tp.notify", "&a%s hat sich zu dir teleportiert.").replace("%s", player.getName())));
logger.info(player.getName() + " hat sich zu " + friendName + " teleportiert.");
}
private UUID getUUIDFromName(String name) {
Player target = Bukkit.getPlayerExact(name);
if (target != null) {
return target.getUniqueId();
}
for (String key : friendsConfig.getKeys(false)) {
try {
UUID uuid = UUID.fromString(key);
String storedName = friendsConfig.getString(key + ".name");
if (storedName != null && storedName.equalsIgnoreCase(name)) {
return uuid;
}
} catch (IllegalArgumentException ignored) {
}
}
return null;
}
private String getNameFromUUID(UUID uuid) {
Player player = Bukkit.getPlayer(uuid);
if (player != null) {
return player.getName();
}
String storedName = friendsConfig.getString(uuid + ".name");
if (storedName != null) {
return storedName;
}
return uuid.toString();
}
private void saveFriendsConfig() {
try {
friendsConfig.save(new File(plugin.getDataFolder(), "friends.yml"));
logger.fine("friends.yml erfolgreich gespeichert.");
} catch (IOException e) {
logger.severe("Fehler beim Speichern der friends.yml: " + e.getMessage());
e.printStackTrace();
}
}
public void notifyFriendsOfJoin(Player player) {
UUID playerUUID = player.getUniqueId();
for (String friendUUIDStr : friendsConfig.getStringList(playerUUID + ".friends")) {
Player friend = Bukkit.getPlayer(UUID.fromString(friendUUIDStr));
if (friend != null) {
friend.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.join.notify", "&aDein Freund %s ist dem Server beigetreten.").replace("%s", player.getName())));
}
}
}
public void updateLastOnline(Player player) {
UUID playerUUID = player.getUniqueId();
friendsConfig.set(playerUUID + ".last-online", System.currentTimeMillis());
saveFriendsConfig();
}
} }

View File

@@ -0,0 +1,65 @@
package de.viper.survivalplus.commands;
import de.viper.survivalplus.SurvivalPlus;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.inventory.meta.ItemMeta;
import java.util.List;
public class KitCommand implements CommandExecutor {
private final SurvivalPlus plugin;
public KitCommand(SurvivalPlus plugin) {
this.plugin = plugin;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (sender instanceof Player) {
Player player = (Player) sender;
// Hole die Konfiguration
FileConfiguration config = plugin.getConfig();
// Hole die Items aus der Konfiguration
List<String> items = config.getStringList("first-join-kit.items");
for (String itemString : items) {
// Teile den Item-String auf
String[] itemParts = itemString.split(",");
String materialName = itemParts[0].toUpperCase();
int amount = Integer.parseInt(itemParts[1]);
String displayName = itemParts.length > 2 ? itemParts[2] : "";
// Erstelle das Item
Material material = Material.getMaterial(materialName);
if (material == null) {
player.sendMessage("Unbekanntes Item: " + materialName);
continue; // Falls das Item ungültig ist, überspringe es
}
ItemStack item = new ItemStack(material, amount);
ItemMeta meta = item.getItemMeta();
// Setze den Display-Namen (falls vorhanden)
if (meta != null && !displayName.isEmpty()) {
meta.setDisplayName(displayName);
}
item.setItemMeta(meta);
player.getInventory().addItem(item); // Gib das Item an den Spieler
}
player.sendMessage("Du hast dein Kit erhalten!");
return true;
}
return false;
}
}

View File

@@ -0,0 +1,48 @@
package de.viper.survivalplus.commands;
import de.viper.survivalplus.Manager.BlockManager;
import org.bukkit.Bukkit;
import org.bukkit.command.*;
import org.bukkit.entity.Player;
import org.bukkit.configuration.file.FileConfiguration;
public class UnblockCommand implements CommandExecutor {
private final BlockManager blockManager;
private final FileConfiguration config;
public UnblockCommand(BlockManager blockManager, FileConfiguration config) {
this.blockManager = blockManager;
this.config = config;
}
@Override
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (!(sender instanceof Player player)) {
sender.sendMessage(config.getString("messages.general.only_players"));
return true;
}
if (args.length != 1) {
player.sendMessage(config.getString("messages.unblock.usage"));
return true;
}
Player target = Bukkit.getPlayerExact(args[0]);
if (target == null || target == player) {
player.sendMessage(config.getString("messages.unblock.invalid_player"));
return true;
}
if (blockManager.hasBlocked(player, target)) {
blockManager.unblockPlayer(player, target);
player.sendMessage(config.getString("messages.unblock.unblocked").replace("%player%", target.getName()));
target.sendMessage(config.getString("messages.unblock.unblocked_by").replace("%player%", player.getName()));
} else {
player.sendMessage(config.getString("messages.unblock.not_blocked").replace("%player%", target.getName()));
}
return true;
}
}

View File

@@ -1,120 +1,120 @@
package de.viper.survivalplus.listeners; package de.viper.survivalplus.listeners;
import de.viper.survivalplus.SurvivalPlus; import de.viper.survivalplus.SurvivalPlus;
import de.viper.survivalplus.tasks.AFKManager; import de.viper.survivalplus.tasks.AFKManager;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.*; import org.bukkit.event.player.*;
import org.bukkit.event.block.BlockBreakEvent; import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.scheduler.BukkitRunnable; import org.bukkit.scheduler.BukkitRunnable;
public class AFKListener implements Listener { public class AFKListener implements Listener {
private final SurvivalPlus plugin; private final SurvivalPlus plugin;
private AFKManager afkManager; private AFKManager afkManager;
private boolean afkEnabled; private boolean afkEnabled;
private FileConfiguration config; private FileConfiguration config;
private BukkitRunnable afkTask; private BukkitRunnable afkTask;
public AFKListener(SurvivalPlus plugin) { public AFKListener(SurvivalPlus plugin) {
this.plugin = plugin; this.plugin = plugin;
this.config = plugin.getConfig(); this.config = plugin.getConfig();
loadSettings(); loadSettings();
if (afkEnabled) { if (afkEnabled) {
startTask(); startTask();
} }
} }
private void loadSettings() { private void loadSettings() {
this.afkEnabled = config.getBoolean("afk.enabled", true); this.afkEnabled = config.getBoolean("afk.enabled", true);
long afkAfter = config.getLong("afk.afk-after-seconds", 300); long afkAfter = config.getLong("afk.afk-after-seconds", 300);
long kickAfter = config.getLong("afk.kick-after-seconds", 0); long kickAfter = config.getLong("afk.kick-after-seconds", 0);
this.afkManager = new AFKManager(plugin, afkAfter, kickAfter); this.afkManager = new AFKManager(plugin, afkAfter, kickAfter);
} }
private void startTask() { private void startTask() {
if (afkTask != null) { if (afkTask != null) {
afkTask.cancel(); afkTask.cancel();
} }
afkTask = new BukkitRunnable() { afkTask = new BukkitRunnable() {
@Override @Override
public void run() { public void run() {
for (Player player : Bukkit.getOnlinePlayers()) { for (Player player : Bukkit.getOnlinePlayers()) {
afkManager.checkAFKStatus(player); afkManager.checkAFKStatus(player);
} }
} }
}; };
afkTask.runTaskTimer(plugin, 20L, 100L); afkTask.runTaskTimer(plugin, 60L, 100L); // Start nach 3 Sekunden (60 Ticks), dann alle 5 Sekunden (100 Ticks)
} }
private void handleActivity(Player player) { private void handleActivity(Player player) {
if (!afkEnabled) return; if (!afkEnabled) return;
afkManager.updateActivity(player); afkManager.updateActivity(player);
} }
@org.bukkit.event.EventHandler @org.bukkit.event.EventHandler
public void onMove(PlayerMoveEvent event) { public void onMove(PlayerMoveEvent event) {
if (!event.getFrom().toVector().equals(event.getTo().toVector())) { if (!event.getFrom().toVector().equals(event.getTo().toVector())) {
handleActivity(event.getPlayer()); handleActivity(event.getPlayer());
} }
} }
@org.bukkit.event.EventHandler @org.bukkit.event.EventHandler
public void onChat(AsyncPlayerChatEvent event) { public void onChat(AsyncPlayerChatEvent event) {
handleActivity(event.getPlayer()); handleActivity(event.getPlayer());
} }
@org.bukkit.event.EventHandler @org.bukkit.event.EventHandler
public void onInteract(PlayerInteractEvent event) { public void onInteract(PlayerInteractEvent event) {
handleActivity(event.getPlayer()); handleActivity(event.getPlayer());
} }
@org.bukkit.event.EventHandler @org.bukkit.event.EventHandler
public void onInventoryClick(InventoryClickEvent event) { public void onInventoryClick(InventoryClickEvent event) {
if (event.getWhoClicked() instanceof Player player) { if (event.getWhoClicked() instanceof Player player) {
handleActivity(player); handleActivity(player);
} }
} }
@org.bukkit.event.EventHandler @org.bukkit.event.EventHandler
public void onBlockPlace(BlockPlaceEvent event) { public void onBlockPlace(BlockPlaceEvent event) {
handleActivity(event.getPlayer()); handleActivity(event.getPlayer());
} }
@org.bukkit.event.EventHandler @org.bukkit.event.EventHandler
public void onBlockBreak(BlockBreakEvent event) { public void onBlockBreak(BlockBreakEvent event) {
handleActivity(event.getPlayer()); handleActivity(event.getPlayer());
} }
@org.bukkit.event.EventHandler @org.bukkit.event.EventHandler
public void onJoin(PlayerJoinEvent event) { public void onJoin(PlayerJoinEvent event) {
afkManager.updateActivity(event.getPlayer()); afkManager.updateActivity(event.getPlayer());
} }
@org.bukkit.event.EventHandler @org.bukkit.event.EventHandler
public void onQuit(PlayerQuitEvent event) { public void onQuit(PlayerQuitEvent event) {
afkManager.reset(event.getPlayer()); afkManager.reset(event.getPlayer());
} }
public void reloadConfig(FileConfiguration config) { public void reloadConfig(FileConfiguration config) {
this.config = config; this.config = config;
loadSettings(); loadSettings();
if (afkTask != null) { if (afkTask != null) {
afkTask.cancel(); afkTask.cancel();
afkTask = null; afkTask = null;
} }
if (afkEnabled) { if (afkEnabled) {
startTask(); startTask();
} }
} }
} }

View File

@@ -0,0 +1,26 @@
package de.viper.survivalplus.listeners;
import de.viper.survivalplus.Manager.BlockManager;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerChatEvent;
public class ChatBlockListener implements Listener {
private final BlockManager blockManager;
public ChatBlockListener(BlockManager blockManager) {
this.blockManager = blockManager;
}
@EventHandler
public void onChat(AsyncPlayerChatEvent event) {
Player sender = event.getPlayer();
event.getRecipients().removeIf(recipient ->
blockManager.hasBlocked(recipient, sender) || blockManager.hasBlocked(sender, recipient)
);
}
}

View File

@@ -0,0 +1,35 @@
package de.viper.survivalplus.listeners;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.PotionMeta;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.Material;
import org.bukkit.inventory.PlayerInventory;
public class FirstJoinListener implements Listener {
@EventHandler
public void onPlayerFirstJoin(PlayerJoinEvent event) {
if (event.getPlayer().hasPlayedBefore()) {
return; // Nur für den ersten Join
}
// Erstelle ein ItemStack für einen Trank (z.B. Heiltrank)
ItemStack potion = new ItemStack(Material.POTION, 1);
if (potion.getItemMeta() instanceof PotionMeta) {
PotionMeta potionMeta = (PotionMeta) potion.getItemMeta();
PotionEffect effect = new PotionEffect(PotionEffectType.REGENERATION, 600, 1);
potionMeta.addCustomEffect(effect, true);
potion.setItemMeta(potionMeta);
}
// Füge das Trank-Item zum Inventar des Spielers hinzu
PlayerInventory inventory = event.getPlayer().getInventory();
inventory.addItem(potion);
}
}

View File

@@ -0,0 +1,28 @@
package de.viper.survivalplus.listeners;
import de.viper.survivalplus.commands.FriendCommand;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerQuitEvent;
public class PlayerJoinListener implements Listener {
private final FriendCommand friendCommand;
public PlayerJoinListener(FriendCommand friendCommand) {
this.friendCommand = friendCommand;
}
@EventHandler
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
friendCommand.notifyFriendsOfJoin(player);
}
@EventHandler
public void onPlayerQuit(PlayerQuitEvent event) {
Player player = event.getPlayer();
friendCommand.updateLastOnline(player);
}
}

View File

@@ -1,46 +1,53 @@
# Anzahl der erlaubten Homes für Member # Anzahl der erlaubten Homes für Member
max-homes: 3 max-homes: 3
# Aktivieren oder Deaktivieren des automatischen Löschens von Items # Aktivieren oder Deaktivieren des automatischen Löschens von Items
auto-clear-enabled: true auto-clear-enabled: true
# Intervall in Minuten für das automatische Löschen herumliegender Items # Intervall in Minuten für das automatische Löschen herumliegender Items
auto-clear-interval-minutes: 15 auto-clear-interval-minutes: 15
# Zeit in Sekunden, nach der Gräber verschwinden (Standard: 30 Minuten) # Zeit in Sekunden, nach der Gräber verschwinden (Standard: 30 Minuten)
graves: graves:
despawn-time: 1800 despawn-time: 1800
# redstone Clock Detector # redstone Clock Detector
redstone-clock-detector-enabled: true redstone-clock-detector-enabled: true
# AFK Aktivieren/Deaktivieren (Wenn du kick-after-seconds auf 0 setzt, wird kein Spieler gekickt, nur AFK markiert.) # AFK Aktivieren/Deaktivieren (Wenn du kick-after-seconds auf 0 setzt, wird kein Spieler gekickt, nur AFK markiert.)
afk: afk:
enabled: true enabled: true
# nach 5 Minuten Inaktivität als AFK markieren # nach 5 Minuten Inaktivität als AFK markieren
afk-after-seconds: 300 afk-after-seconds: 300
# nach 15 Minuten wird Spieler gekickt # nach 15 Minuten wird Spieler gekickt
kick-after-seconds: 900 kick-after-seconds: 900
# Nacht/Schlafmodus # Nacht/Schlafmodus
sleep: sleep:
required-percentage: 50.0 required-percentage: 50.0
# Mob-Leash-Limit # Mob-Leash-Limit
mob-leash-limit: mob-leash-limit:
enabled: true enabled: true
max-leash-count: 5 max-leash-count: 5
# Mobcap-Begrenzung # Mobcap-Begrenzung
mob-cap: mob-cap:
enabled: true enabled: true
max-animals-per-chunk: 10 max-animals-per-chunk: 10
# Spawn Schutz Radius # Spawn Schutz Radius
spawnprotection: spawnprotection:
enabled: true enabled: true
radius: 40 radius: 40
protect-block-break: true protect-block-break: true
protect-block-place: true protect-block-place: true
protect-pvp: true protect-pvp: true
bypass-permission: survivalplus.spawnprotection.bypass bypass-permission: survivalplus.spawnprotection.bypass
# Start Kit (Minecraft item, Menge, Custom-Name)
first-join-kit:
items:
- "bread,2,§6Bernd das Brot"
- "apple,1,§7Dornröschen Apfel"
- "wooden_sword,1,§eSchwert"
- "suspicious_stew,1,§6Heldensuppe"

View File

@@ -1,93 +1,92 @@
header: "&6=== SurvivalPlus Hilfe ===" header: "&6=== SurvivalPlus Hilfe ==="
footer: "&6===========================" footer: "&6==========================="
commands: commands:
gm: gm:
description: "&eWechselt den Spielmodus (survival, creative, adventure, spectator)." description: "&eWechselt den Spielmodus (survival, creative, adventure, spectator)."
usage: "&b/gm < survival | creative | adventure | spectator >" usage: "&b/gm <survival | creative | adventure | spectator>"
sp: sp:
description: "&eHauptbefehl für SurvivalPlus mit Unterbefehlen." description: "&eHauptbefehl für SurvivalPlus mit Unterbefehlen."
usage: "&b/sp < reload | help >" usage: "&b/sp <reload | help | info>"
sethome: sethome:
description: "&eSetzt einen neuen Homepunkt." description: "&eSetzt einen neuen Homepunkt."
usage: "&b/sethome <name>" usage: "&b/sethome <name>"
delhome: delhome:
description: "&eLöscht einen Homepunkt." description: "&eLöscht einen Homepunkt."
usage: "&b/delhome <name>" usage: "&b/delhome <name>"
homelist: homelist:
description: "&eZeigt alle deine Homes." description: "&eZeigt alle deine Homes."
usage: "&b/homelist" usage: "&b/homelist"
inv: inv:
description: "&eÖffnet dein Inventar." description: "&eÖffnet dein Inventar."
usage: "&b/inv" usage: "&b/inv"
ec: ec:
description: "&eÖffnet deine Endertruhe." description: "&eÖffnet deine Endertruhe."
usage: "&b/ec" usage: "&b/ec"
setspawn: setspawn:
description: "&eSetzt den Spawnpunkt der Welt." description: "&eSetzt den Spawnpunkt der Welt."
usage: "&b/setspawn" usage: "&b/setspawn"
setworldspawn: setworldspawn:
description: "&eSetzt den globalen Weltspawnpunkt." description: "&eSetzt den globalen Weltspawnpunkt."
usage: "&b/setworldspawn" usage: "&b/setworldspawn"
clearchat: clearchat:
description: "&eLöscht den Chat für alle Spieler." description: "&eLöscht den Chat für alle Spieler."
usage: "&b/clearchat" usage: "&b/clearchat"
clearitems: clearitems:
description: "&eEntfernt alle Items auf dem Boden." description: "&eEntfernt alle Items auf dem Boden."
usage: "&b/clearitems" usage: "&b/clearitems"
closedoors: closedoors:
description: "&eSchließt alle Türen in der Nähe." description: "&eSchließt alle Türen in der Nähe."
usage: "&b/closedoors" usage: "&b/closedoors"
sit: sit:
description: "&eSetzt dich hin oder steht wieder auf." description: "&eSetzt dich hin oder steht wieder auf."
usage: "&b/sit" usage: "&b/sit"
back: back:
description: "&eTeleportiert dich zurück zum letzten Ort." description: "&eTeleportiert dich zurück zum letzten Ort."
usage: "&b/back" usage: "&b/back"
friend: friend:
description: "&eVerwalte Freunde (add, remove, list)." description: "&eVerwalte deine Freundesliste (hinzufügen, entfernen, anzeigen, teleportieren). Unterstützt anklickbare Anfragen und Bestätigungen."
usage: "&b/friend < add | remove | list > [Spieler]" usage: "&b/friend <add | accept | deny | list | del | confirm | tp> [Spieler]"
ir: ir:
description: "&eBenennt Items um." description: "&eBenennt Items um."
usage: "&b/ir <Name>" usage: "&b/ir <Name>"
showarmorstands: showarmorstands:
description: "&eZeigt Debug ArmorStands an." description: "&eZeigt Debug ArmorStands an."
usage: "&b/showarmorstands" usage: "&b/showarmorstands"
cleardebugarmorstands: cleardebugarmorstands:
description: "&eLöscht alle Debug ArmorStands." description: "&eLöscht alle Debug ArmorStands."
usage: "&b/cleardebugarmorstands" usage: "&b/cleardebugarmorstands"
trash: trash:
description: "&eÖffnet den Müll." description: "&eÖffnet den Müll."
usage: "&b/trash" usage: "&b/trash"
workbench: workbench:
description: "&eÖffnet eine Werkbank GUI." description: "&eÖffnet eine Werkbank GUI."
usage: "&b/workbench" usage: "&b/workbench"
anvil: anvil:
description: "&eÖffnet eine Amboss GUI." description: "&eÖffnet eine Amboss GUI."
usage: "&b/anvil" usage: "&b/anvil"
stats: stats:
description: "&eZeigt deine persönlichen Statistiken an." description: "&eZeigt deine persönlichen Statistiken an."
usage: "&b/stats" usage: "&b/stats"
lock: lock:
description: "&eSchützt Container mit dem LockSystem." description: "&eSchützt Container mit dem LockSystem."
usage: "&b/lock < lock | unlock | info >" usage: "&b/lock <lock | unlock | info>"
tp:
tp: description: "&eTeleportiert dich zu einem anderen Spieler."
description: "&eTeleportiert dich zu einem anderen Spieler." usage: "&b/tp <Spieler>"
usage: "&b/tp <Spieler>" tphere:
tphere: description: "&eTeleportiert einen Spieler zu dir."
description: "&eTeleportiert einen Spieler zu dir." usage: "&b/tphere <Spieler>"
usage: "&b/tphere <Spieler>" tpa:
tpa: description: "&eSendet eine Teleport-Anfrage an einen Spieler."
description: "&eSendet eine Teleport-Anfrage an einen Spieler." usage: "&b/tpa <Spieler>"
usage: "&b/tpa <Spieler>" tpaccept:
tpaccept: description: "&eAkzeptiert eine Teleport-Anfrage."
description: "&eAkzeptiert eine Teleport-Anfrage." usage: "&b/tpaccept"
usage: "&b/tpaccept" tpdeny:
tpdeny: description: "&eLehnt eine Teleport-Anfrage ab."
description: "&eLehnt eine Teleport-Anfrage ab." usage: "&b/tpdeny"
usage: "&b/tpdeny"
messages:
messages: header: "&6=== Befehle ==="
header: "&6=== Befehle ===" footer: "&6================"
footer: "&6================"

View File

@@ -1,241 +1,304 @@
sp: sp:
no-permission: "§cDu hast keine Berechtigung für diesen Befehl!" no-permission: "§cDu hast keine Berechtigung für diesen Befehl!"
plugin.reloaded: "§aSurvivalPlus wurde erfolgreich neu geladen!" plugin.reloaded: "§aSurvivalPlus wurde erfolgreich neu geladen!"
sp.invalid-subcommand: "§cUngültiger Unterbefehl! Verwendung: /sp [reload | help]" invalid-subcommand: "§cUngültiger Unterbefehl! Verwendung: /sp [ reload | help | info ]"
sp.help-not-found: "§cHilfedatei (help.yml) konnte nicht geladen werden!" help-not-found: "§cHilfedatei (help.yml) konnte nicht geladen werden!"
info:
plugin: header: "§7===== SurvivalPlus Info ====="
enabled: "&aSurvivalPlus wurde erfolgreich aktiviert!" name: "§ePlugin-Name: §f"
reloaded: "&aSurvivalPlus wurde erfolgreich neu geladen!" version: "§eVersion: §f"
disabled: "&cSurvivalPlus wurde deaktiviert." author: "§eErsteller: §f"
info: "&6SurvivalPlus Plugin-Info: Version %version%" description: "§eBeschreibung: §f"
footer: "§7=========================="
no-permission: "§cDu hast keine Berechtigung für diesen Befehl!"
no-permission-others: "§cDu hast keine Berechtigung, den Spielmodus anderer Spieler zu ändern!" plugin:
no-permission-others-ec: "§cDu hast keine Berechtigung, die Enderchest anderer Spieler anzusehen!" enabled: "&aSurvivalPlus wurde erfolgreich aktiviert!"
no-permission-others-inv: "§cDu hast keine Berechtigung, das Inventar anderer Spieler anzusehen!" reloaded: "&aSurvivalPlus wurde erfolgreich neu geladen!"
player-not-found: "§cSpieler nicht gefunden!" disabled: "&cSurvivalPlus wurde deaktiviert."
player-only: "§cDieser Befehl ist nur für Spieler!" info: "&6SurvivalPlus Plugin-Info: Version %version%"
autoclear: no-permission: "§cDu hast keine Berechtigung für diesen Befehl!"
cleared: "&c&l%count% Items wurden automatisch gelöscht." no-permission-others: "§cDu hast keine Berechtigung, den Spielmodus anderer Spieler zu ändern!"
warning: "&e&lAchtung! &rIn 10 Sekunden werden alle Items gelöscht!" no-permission-others-ec: "§cDu hast keine Berechtigung, die Enderchest anderer Spieler anzusehen!"
no-permission-others-inv: "§cDu hast keine Berechtigung, das Inventar anderer Spieler anzusehen!"
clearchat: player-not-found: "§cSpieler nicht gefunden!"
cleared: "§aDer Chat wurde erfolgreich gelöscht." player-only: "§cDieser Befehl ist nur für Spieler!"
no-permission: "§cDu hast keine Rechte, den Chat zu löschen."
autoclear:
clearitems: cleared: "&c&l%count% Items wurden automatisch gelöscht."
no-permission: "§cDu hast keine Rechte, Items zu löschen." warning: "&e&lAchtung! &rIn 10 Sekunden werden alle Items gelöscht!"
closedoors: clearchat:
invalidradius: "Der Radius muss eine gültige positive Zahl sein!" cleared: "§aDer Chat wurde erfolgreich gelöscht."
noplayer: "Nur Spieler können diesen Befehl nutzen!" no-permission: "§cDu hast keine Rechte, den Chat zu löschen."
nopermission: "Dafür hast du keine Rechte!"
success: "Es wurden %count% Türen geschlossen." clearitems:
usage: "Benutzung: /closedoors <radius>" no-permission: "§cDu hast keine Rechte, Items zu löschen."
delhome: closedoors:
not-found: "§cDieses Home existiert nicht!" invalidradius: "Der Radius muss eine gültige positive Zahl sein!"
success: "§aHome %name% wurde gelöscht!" noplayer: "Nur Spieler können diesen Befehl nutzen!"
usage: "§cVerwendung: /delhome <name>" nopermission: "Dafür hast du keine Rechte!"
success: "Es wurden %count% Türen geschlossen."
enderchest: usage: "Benutzung: /closedoors <radius>"
data-not-found: "§cDie Enderchest-Daten des Spielers konnten nicht gefunden werden! Der Spieler war möglicherweise nie auf diesem Server."
gui-title: "Enderchest von " delhome:
load-error: "§cFehler beim Laden der Enderchest: %error%" not-found: "§cDieses Home existiert nicht!"
opened: "§aEnderchest von %player% geöffnet!" success: "§aHome %name% wurde gelöscht!"
usage: "§cVerwendung: /ec [spieler]" usage: "§cVerwendung: /delhome <name>"
gamemode: enderchest:
adventure: "Abenteuer" data-not-found: "§cDie Enderchest-Daten des Spielers konnten nicht gefunden werden! Der Spieler war möglicherweise nie auf diesem Server."
changed-other: "§aSpielmodus von %player% zu %mode% geändert!" gui-title: "Enderchest von "
changed-self: "§aDein Spielmodus wurde zu %mode% geändert!" load-error: "§cFehler beim Laden der Enderchest: %error%"
creative: "Kreativ" opened: "§aEnderchest von %player% geöffnet!"
invalid-gamemode: "§cUngültiger Spielmodus! Verwende 0, 1, 2 oder 3" usage: "§cVerwendung: /ec [spieler]"
spectator: "Zuschauer"
survival: "Überleben" gamemode:
usage: "§cVerwendung: /gm <0|1|2|3> [spieler]" adventure: "Abenteuer"
changed-other: "§aSpielmodus von %player% zu %mode% geändert!"
homelist: changed-self: "§aDein Spielmodus wurde zu %mode% geändert!"
gui-title: "Deine Homes" creative: "Kreativ"
home-deleted: "§cDieses Home existiert nicht mehr!" invalid-gamemode: "§cUngültiger Spielmodus! Verwende 0, 1, 2 oder 3"
no-homes: "§cDu hast keine Homes gesetzt!" spectator: "Zuschauer"
teleported: "§aZum Home %name% teleportiert!" survival: "Überleben"
usage: "§cVerwendung: /gm <0|1|2|3> [spieler]"
inventory:
data-not-found: "§cDie Inventardaten des Spielers konnten nicht gefunden werden! Der Spieler war möglicherweise nie auf diesem Server." homelist:
gui-title: "Inventar von " gui-title: "Deine Homes"
load-error: "§cFehler beim Laden des Inventars: %error%" home-deleted: "§cDieses Home existiert nicht mehr!"
opened: aInventar von %player% geöffnet!" no-homes: cDu hast keine Homes gesetzt!"
usage: "§cVerwendung: /inv <spieler>" teleported: "§aZum Home %name% teleportiert!"
sethome: inventory:
already-exists: "§cEin Home mit diesem Namen existiert bereits!" data-not-found: "§cDie Inventardaten des Spielers konnten nicht gefunden werden! Der Spieler war möglicherweise nie auf diesem Server."
invalid-name: "§cDer Home-Name darf nur Buchstaben, Zahlen und Unterstriche enthalten!" gui-title: "Inventar von "
limit-reached: "§cDu hast die maximale Anzahl an Homes erreicht!" load-error: "§cFehler beim Laden des Inventars: %error%"
success: "§aHome %name% wurde gesetzt!" opened: "§aInventar von %player% geöffnet!"
usage: "§cVerwendung: /sethome <name>" usage: "§cVerwendung: /inv <spieler>"
setspawn: sethome:
no-permission: "§cDu hast keine Berechtigung, den Spawnpunkt zu setzen!" already-exists: "§cEin Home mit diesem Namen existiert bereits!"
success: "§aSpawnpunkt wurde erfolgreich gesetzt!" invalid-name: "§cDer Home-Name darf nur Buchstaben, Zahlen und Unterstriche enthalten!"
limit-reached: "§cDu hast die maximale Anzahl an Homes erreicht!"
setworldspawn: success: "§aHome %name% wurde gesetzt!"
no-permission: "§cDu hast keine Berechtigung, den Weltspawn zu setzen!" usage: "§cVerwendung: /sethome <name>"
success: "§aWeltspawn wurde erfolgreich gesetzt!"
setspawn:
sit: no-permission: "§cDu hast keine Berechtigung, den Spawnpunkt zu setzen!"
stand-up: "§aDu bist aufgestanden!" success: "§aSpawnpunkt wurde erfolgreich gesetzt!"
success: "§aDu hast dich hingesetzt!"
usage: "§cVerwendung: /sit" setworldspawn:
no-permission: "§cDu hast keine Berechtigung, den Weltspawn zu setzen!"
graves: success: "§aWeltspawn wurde erfolgreich gesetzt!"
created: "§aDein Grab wurde bei x=%.2f, y=%.2f, z=%.2f erstellt!"
despawned: "§cDein Grab bei x=%.2f, y=%.2f, z=%.2f ist verschwunden!" sit:
access-denied: "§cNur der Eigentümer kann dieses Grab öffnen!" stand-up: "§aDu bist aufgestanden!"
success: "§aDu hast dich hingesetzt!"
back: usage: "§cVerwendung: /sit"
usage: "§cVerwendung: /back"
no-death-point: "§cDu hast keinen Todespunkt!" graves:
success: "§aTeleportiert zum Todespunkt bei x=%.2f, y=%.2f, z=%.2f!" created: "§aDein Grab wurde bei x=%.2f, y=%.2f, z=%.2f erstellt!"
despawned: "§cDein Grab bei x=%.2f, y=%.2f, z=%.2f ist verschwunden!"
msg: access-denied: "§cNur der Eigentümer kann dieses Grab öffnen!"
description: "Sende eine private Nachricht an einen Spieler."
usage: "/msg <Spieler> <Nachricht>" back:
usage: "§cVerwendung: /back"
r: no-death-point: "§cDu hast keinen Todespunkt!"
description: "Antworte auf die letzte private Nachricht." success: "§aTeleportiert zum Todespunkt bei x=%.2f, y=%.2f, z=%.2f!"
usage: "/r <Nachricht>"
msg:
pm: description: "Sende eine private Nachricht an einen Spieler."
description: "Schalte private Nachrichten an oder aus." usage: "/msg <Spieler> <Nachricht>"
usage: "/pm toggle"
r:
backpack: description: "Antworte auf die letzte private Nachricht."
name: "&eRucksack" usage: "/r <Nachricht>"
inventory-title: "&eDein Rucksack"
pm:
friend: description: "Schalte private Nachrichten an oder aus."
error: usage: "/pm toggle"
player-only: "&cDieser Befehl ist nur für Spieler!"
player-not-found: "&cSpieler %s nicht gefunden!" backpack:
self: "&cDu kannst dich nicht selbst hinzufügen!" name: "&eRucksack"
already-friends: "&cDu bist bereits mit %s befreundet!" inventory-title: "&eDein Rucksack"
request-pending: "&cDu hast bereits eine Anfrage an %s gesendet!"
no-request: "&cKeine Anfrage von %s gefunden!" friend:
not-friends: "&c%s ist nicht in deiner Freundesliste!" error:
different-world: "&cIhr müsst in derselben Welt sein, um zu teleportieren!" player-only: "&cDieser Befehl ist nur für Spieler!"
add-usage: "&cVerwendung: /friend add <Spielername>" player-not-found: "&cSpieler %s nicht gefunden!"
accept-usage: "&cVerwendung: /friend accept <Spielername>" self: "&cDu kannst dich nicht selbst hinzufügen!"
deny-usage: "&cVerwendung: /friend deny <Spielername>" already-friends: "&cDu bist bereits mit %s befreundet!"
list-usage: "&cVerwendung: /friend list" request-pending: "&cDu hast bereits eine Anfrage an %s gesendet!"
del-usage: "&cVerwendung: /friend del <Spielername>" no-request: "&cKeine Anfrage von %s gefunden!"
tp-usage: "&cVerwendung: /friend tp <Spielername>" not-friends: "&c%s ist nicht in deiner Freundesliste!"
different-world: "&cIhr müsst in derselben Welt sein, um zu teleportieren!"
ir: add-usage: "&cVerwendung: /friend add <Spielername>"
only-player: "&cDieser Befehl kann nur von Spielern ausgeführt werden." accept-usage: "&cVerwendung: /friend accept <Spielername>"
no-permission: "&cDu hast keine Berechtigung, diesen Befehl zu benutzen." deny-usage: "&cVerwendung: /friend deny <Spielername>"
no-name: "&cBitte gib einen neuen Namen an." list-usage: "&cVerwendung: /friend list"
usage: "&eBenutze: /ir <NeuerName>" del-usage: "&cVerwendung: /friend del <Spielername>"
no-item: "&cDu hältst kein Item in der Hand." confirm-usage: "&cVerwendung: /friend confirm <Spielername>"
cant-rename: "&cDieses Item kann nicht umbenannt werden." tp-usage: "&cVerwendung: /friend tp <Spielername>"
success: "&aDas Item wurde erfolgreich in {name} umbenannt!"
add:
afk: sent: "&aFreundschaftsanfrage an %s gesendet!"
set: "&7Du bist jetzt AFK." received: "&aDu hast eine Freundschaftsanfrage von %s erhalten! "
unset: "&7Du bist nicht mehr AFK." accept-button: "&a[Accept]"
deny-button: "&c [Deny]"
sleep:
skipped: "&aDie Nacht wurde übersprungen! (%sleeping% von %total% Spielern haben geschlafen)" accept:
progress: "&e%sleeping%/%total% Spielern schlafen... (%required%% benötigt zum Überspringen der Nacht)" success: "&aDu bist jetzt mit %s befreundet!"
notify: "&a%s hat deine Freundschaftsanfrage akzeptiert!"
orealarm:
message: "§c[Erz-Alarm] Spieler §e%player% §chat in %seconds% Sekunden ungewöhnlich viele %ore% abgebaut: §e%count%" deny:
success: "&aFreundschaftsanfrage von %s abgelehnt."
stats: notify: "&c%s hat deine Freundschaftsanfrage abgelehnt."
only_player: "&cDieser Befehl kann nur von Spielern ausgeführt werden."
no_stats: "&eDu hast noch keine Statistiken!" list:
header: "&6=== Spielerstatistiken von &e{player} &6===" header: "&6=== Deine Freundesliste ==="
playtime: "&fSpielzeit: &b{time}" entry: "&e%s: %s"
kills: "&fKills: &a{kills}" entry-offline: "&e%s: %s &7(Zuletzt online: %s)"
deaths: "&fTode: &c{deaths}" online: "&aOnline"
blocks_placed: "&fBlöcke platziert: &e{placed}" offline: "&7Offline"
blocks_broken: "&fBlöcke abgebaut: &e{broken}" unknown: "&7Unbekannt"
date-format: "dd.MM.yyyy HH:mm:ss"
welcome: remove-button: "&c[X]"
first-join-message: "&aWillkommen auf dem Server, &e{player}&a! Viel Spaß!" footer: "&6====================="
welcome.first-join-sound: ENTITY_FIREWORK_ROCKET_LAUNCH
welcome.first-join-sound-volume: 1.0 del:
welcome.first-join-sound-pitch: 1.0 success: "&a%s wurde aus deiner Freundesliste entfernt."
notify: "&c%s hat dich aus seiner Freundesliste entfernt."
return-message: "&6Willkommen zurück, &e{player}&6!" confirm: "&cMöchtest du %s wirklich aus deiner Freundesliste entfernen? "
welcome.return-sound: ENTITY_FIREWORK_ROCKET_BLAST confirm-button: "&a[Confirm]"
welcome.return-sound-volume: 1.0 cancel-button: "&c[Cancel]"
welcome.return-sound-pitch: 1.0
tp:
mob-leash-limit: success: "&aDu wurdest zu %s teleportiert!"
max-reached: "§cDu hast das maximale Leinen-Limit von §e%count%§c erreicht!" notify: "&a%s hat sich zu dir teleportiert."
leashed: "§aTier angeleint. Du hast jetzt §e%count%§a geleinte Tiere."
unleashed: "§aTier abgeleint. Du hast jetzt §e%count%§a geleinte Tiere." join:
entity-died: "§cEin angeleintes Tier ist gestorben. Du hast jetzt §e%count%§c geleinte Tiere." notify: "&aDein Freund %s ist dem Server beigetreten."
mob-cap: ir:
limit-reached: "&cZu viele Tiere in diesem Chunk! Maximal %max% Tiere erlaubt." only-player: "&cDieser Befehl kann nur von Spielern ausgeführt werden."
animal-removed: "&cEin Tier wurde entfernt, da das Chunk-Limit von %max% erreicht wurde." no-permission: "&cDu hast keine Berechtigung, diesen Befehl zu benutzen."
no-name: "&cBitte gib einen neuen Namen an."
spawnprotection: usage: "&eBenutze: /ir <NeuerName>"
blockbreak-denied: "&cDu kannst im Spawnbereich keine Blöcke abbauen." no-item: "&cDu hältst kein Item in der Hand."
blockplace-denied: "&cDu kannst im Spawnbereich keine Blöcke platzieren." cant-rename: "&cDieses Item kann nicht umbenannt werden."
pvp-denied: "&cPvP ist im Spawnbereich deaktiviert." success: "&aDas Item wurde erfolgreich in {name} umbenannt!"
lock: afk:
mode-start: "§aRechtsklicke jetzt auf eine Tür oder Kiste, um sie zu sperren!" set: "&7Du bist jetzt AFK."
mode-timeout: "§cDer Sperrmodus ist nach 30 Sekunden abgebrochen." unset: "&7Du bist nicht mehr AFK."
mode-already: "§cDu befindest dich bereits im Sperrmodus!"
only-players: "§cDieser Befehl kann nur von einem Spieler ausgeführt werden!" sleep:
usage: "§cBenutzung: /lock, /lock unlock, /lock friendadd <Spieler>, /lock friendremove <Spieler>" skipped: "&aDie Nacht wurde übersprungen! (%sleeping% von %total% Spielern haben geschlafen)"
no-target-block: "§cDu musst auf eine Tür oder Truhe schauen, um diesen Befehl zu benutzen!" progress: "&e%sleeping%/%total% Spielern schlafen... (%required%% benötigt zum Überspringen der Nacht)"
not-lockable: "§cDies kann nicht gesperrt werden!"
already-locked: "§cDies ist bereits gesperrt!" orealarm:
locked: aTür/Truhe erfolgreich gesperrt!" message: c[Erz-Alarm] Spieler §e%player% §chat in %seconds% Sekunden ungewöhnlich viele %ore% abgebaut: §e%count%"
unlocked: "§aBlock erfolgreich entsperrt!"
not-locked: "§cDies ist nicht gesperrt!" stats:
no-permission-unlock: "§cDu bist nicht der Besitzer!" only_player: "&cDieser Befehl kann nur von Spielern ausgeführt werden."
block-denied: "§cDies ist gesperrt. Du hast keinen Zugriff." no_stats: "&eDu hast noch keine Statistiken!"
no-permission-friends: "§cNur der Besitzer kann Freunde verwalten!" header: "&6=== Spielerstatistiken von &e{player} &6==="
unknown-subcommand: "§cUnbekannter Befehl." playtime: "&fSpielzeit: &b{time}"
kills: "&fKills: &a{kills}"
friendadd: deaths: "&fTode: &c{deaths}"
usage: "§cBenutzung: /lock friendadd <Spieler>" blocks_placed: "&fBlöcke platziert: &e{placed}"
not-found: "§cSpieler nicht gefunden oder nicht online!" blocks_broken: "&fBlöcke abgebaut: &e{broken}"
success: "§a{player} wurde erfolgreich als Freund hinzugefügt!"
welcome:
friendremove: first-join-message: "&aWillkommen auf dem Server, &e{player}&a! Viel Spaß!"
usage: "§cBenutzung: /lock friendremove <Spieler>" welcome.first-join-sound: ENTITY_FIREWORK_ROCKET_LAUNCH
not-found: "§cSpieler nicht gefunden oder nicht online!" welcome.first-join-sound-volume: 1.0
success: "§a{player} wurde erfolgreich als Freund entfernt!" welcome.first-join-sound-pitch: 1.0
return-message: "&6Willkommen zurück, &e{player}&6!"
welcome.return-sound: ENTITY_FIREWORK_ROCKET_BLAST
teleport-usage: "§cVerwendung: /tp <Spieler>" welcome.return-sound-volume: 1.0
teleport-success: "§aDu wurdest zu %player% teleportiert!" welcome.return-sound-pitch: 1.0
tphere-usage: "§cVerwendung: /tphere <Spieler>" mob-leash-limit:
tphere-success: "§a%player% wurde zu dir teleportiert!" max-reached: "§cDu hast das maximale Leinen-Limit von §e%count%§c erreicht!"
leashed: "§aTier angeleint. Du hast jetzt §e%count%§a geleinte Tiere."
tpa-usage: "§cVerwendung: /tpa <Spieler>" unleashed: "§aTier abgeleint. Du hast jetzt §e%count%§a geleinte Tiere."
tpa-sent: "§aTeleportanfrage an %player% gesendet!" entity-died: "§cEin angeleintes Tier ist gestorben. Du hast jetzt §e%count%§c geleinte Tiere."
tpa-received: "§e%player% möchte sich zu dir teleportieren. Nutze /tpaccept oder /tpdeny."
mob-cap:
tpaccept-success: "§aTeleportanfrage von %player% akzeptiert!" limit-reached: "&cZu viele Tiere in diesem Chunk! Maximal %max% Tiere erlaubt."
tpa-accepted: "§aDeine Teleportanfrage wurde von %player% angenommen." animal-removed: "&cEin Tier wurde entfernt, da das Chunk-Limit von %max% erreicht wurde."
tpdeny-success: "§cTeleportanfrage abgelehnt!" spawnprotection:
tpa-denied: "§cDeine Teleportanfrage wurde von %player% abgelehnt." blockbreak-denied: "&cDu kannst im Spawnbereich keine Blöcke abbauen."
blockplace-denied: "&cDu kannst im Spawnbereich keine Blöcke platzieren."
no-tpa-request: "§cDu hast keine ausstehende Teleportanfrage." pvp-denied: "&cPvP ist im Spawnbereich deaktiviert."
# Allgemeine Nachrichten für Teleport-Befehle lock:
no-permission: "§cDu hast keine Berechtigung für diesen Befehl!" mode-start: "§aRechtsklicke jetzt auf eine Tür oder Kiste, um sie zu sperren!"
only-players: "§cDieser Befehl kann nur von Spielern ausgeführt werden!" mode-timeout: "§cDer Sperrmodus ist nach 30 Sekunden abgebrochen."
player-not-found: "§cSpieler %player% nicht gefunden!" mode-already: "§cDu befindest dich bereits im Sperrmodus!"
only-players: "§cDieser Befehl kann nur von einem Spieler ausgeführt werden!"
usage: "§cBenutzung: /lock, /lock unlock, /lock friendadd <Spieler>, /lock friendremove <Spieler>"
no-target-block: "§cDu musst auf eine Tür oder Truhe schauen, um diesen Befehl zu benutzen!"
not-lockable: "§cDies kann nicht gesperrt werden!"
already-locked: "§cDies ist bereits gesperrt!"
locked: "§aTür/Truhe erfolgreich gesperrt!"
unlocked: "§aBlock erfolgreich entsperrt!"
not-locked: "§cDies ist nicht gesperrt!"
no-permission-unlock: "§cDu bist nicht der Besitzer!"
block-denied: "§cDies ist gesperrt. Du hast keinen Zugriff."
no-permission-friends: "§cNur der Besitzer kann Freunde verwalten!"
unknown-subcommand: "§cUnbekannter Befehl."
friendadd:
usage: "§cBenutzung: /lock friendadd <Spieler>"
not-found: "§cSpieler nicht gefunden oder nicht online!"
success: "§a{player} wurde erfolgreich als Freund hinzugefügt!"
friendremove:
usage: "§cBenutzung: /lock friendremove <Spieler>"
not-found: "§cSpieler nicht gefunden oder nicht online!"
success: "§a{player} wurde erfolgreich als Freund entfernt!"
teleport-usage: "§cVerwendung: /tp <Spieler>"
teleport-success: "§aDu wurdest zu %player% teleportiert!"
tphere-usage: "§cVerwendung: /tphere <Spieler>"
tphere-success: "§a%player% wurde zu dir teleportiert!"
tpa-usage: "§cVerwendung: /tpa <Spieler>"
tpa-sent: "§aTeleportanfrage an %player% gesendet!"
tpa-received: "§e%player% möchte sich zu dir teleportieren. Nutze /tpaccept oder /tpdeny."
tpaccept-success: "§aTeleportanfrage von %player% akzeptiert!"
tpa-accepted: "§aDeine Teleportanfrage wurde von %player% angenommen."
tpdeny-success: "§cTeleportanfrage abgelehnt!"
tpa-denied: "§cDeine Teleportanfrage wurde von %player% abgelehnt."
no-tpa-request: "§cDu hast keine ausstehende Teleportanfrage."
# Allgemeine Nachrichten für Teleport-Befehle
no-permission: "§cDu hast keine Berechtigung für diesen Befehl!"
only-players: "§cDieser Befehl kann nur von Spielern ausgeführt werden!"
player-not-found: "§cSpieler %player% nicht gefunden!"
block:
usage: "Benutze: /block <Spieler>"
invalid_player: "Ungültiger Spieler."
blocked: "Du hast §e%player%§c blockiert."
already_blocked: "Du hast §e%player%§c schon blockiert."
unblocked: "Du hast §e%player%§a entblockt."
unblock:
usage: "Benutze: /unblock <Spieler>"
invalid_player: "Ungültiger Spieler."
not_blocked: "Du hast §e%player%§c nicht blockiert."
unblocked: "Du hast §e%player%§a entblockt."
unblocked_by: "Du wurdest von §e%player%§a entblockt."
blocklist:
no_blocked_players: "§7Du hast aktuell niemanden blockiert."
blocked_players: "§7Blockierte Spieler: §e%list%"

View File

@@ -1,343 +1,362 @@
name: SurvivalPlus name: SurvivalPlus
version: 1.0.0 version: 1.0.0
main: de.viper.survivalplus.SurvivalPlus main: de.viper.survivalplus.SurvivalPlus
api-version: 1.21 api-version: 1.21
author: Viper author: Viper
description: A plugin for enhancing survival gameplay in Minecraft. description: A plugin for enhancing survival gameplay in Minecraft.
commands: commands:
ir: ir:
description: Benennt das Item in der Hand um. description: Benennt das Item in der Hand um.
usage: /ir <neuer_name> usage: /ir <neuer_name>
permission: survivalplus.itemrename permission: survivalplus.itemrename
permission-message: "§cDu hast keine Berechtigung für diesen Befehl." permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
gm: gm:
description: Ändert den Spielmodus eines Spielers description: Ändert den Spielmodus eines Spielers
usage: /<command> <modus> [spieler] usage: /<command> <modus> [spieler]
aliases: [gamemode] aliases: [gamemode]
permission: survivalplus.gamemode permission: survivalplus.gamemode
sp: sp:
description: Zeigt Plugin-Informationen oder Hilfe description: Zeigt Plugin-Informationen oder Hilfe
usage: /<command> [reload|help|info] [seite] usage: /<command> [reload|help|info] [seite]
permission: survivalplus.sp permission: survivalplus.sp
sethome: sethome:
description: Setzt ein Home mit dem angegebenen Namen description: Setzt ein Home mit dem angegebenen Namen
usage: /<command> <name> usage: /<command> <name>
permission: survivalplus.homes.set permission: survivalplus.homes.set
delhome: delhome:
description: Löscht ein Home mit dem angegebenen Namen description: Löscht ein Home mit dem angegebenen Namen
usage: /<command> <name> usage: /<command> <name>
permission: survivalplus.homes.delete permission: survivalplus.homes.delete
homelist: homelist:
description: Öffnet eine GUI mit allen Homes description: Öffnet eine GUI mit allen Homes
usage: /<command> usage: /<command>
permission: survivalplus.homes.list permission: survivalplus.homes.list
home: home:
description: Teleportiert zu einem Home description: Teleportiert zu einem Home
usage: /<command> <name> usage: /<command> <name>
permission: survivalplus.homes permission: survivalplus.homes
inv: inv:
description: Öffnet das Inventar (eigenes oder das eines anderen Spielers) description: Öffnet das Inventar (eigenes oder das eines anderen Spielers)
usage: /<command> [spieler] usage: /<command> [spieler]
permission: survivalplus.inventory.own permission: survivalplus.inventory.own
ec: ec:
description: Öffnet die Endertruhe (eigene oder die eines anderen Spielers) description: Öffnet die Endertruhe (eigene oder die eines anderen Spielers)
usage: /<command> [spieler] usage: /<command> [spieler]
permission: survivalplus.enderchest.own permission: survivalplus.enderchest.own
setworldspawn: setworldspawn:
description: Setzt den Weltspawnpunkt auf die Position des Spielers description: Setzt den Weltspawnpunkt auf die Position des Spielers
usage: /<command> usage: /<command>
permission: survivalplus.setworldspawn permission: survivalplus.setworldspawn
setspawn: setspawn:
description: Setzt den Server-Spawnpunkt auf die Position des Spielers description: Setzt den Server-Spawnpunkt auf die Position des Spielers
usage: /<command> usage: /<command>
permission: survivalplus.setspawn permission: survivalplus.setspawn
clearchat: clearchat:
description: Löscht den Chat für alle Spieler description: Löscht den Chat für alle Spieler
usage: /<command> usage: /<command>
permission: survivalplus.clearchat permission: survivalplus.clearchat
clearitems: clearitems:
description: Löscht alle herumliegenden Items description: Löscht alle herumliegenden Items
usage: /<command> usage: /<command>
permission: survivalplus.clearitems permission: survivalplus.clearitems
closedoors: closedoors:
description: Schließt alle Türen im angegebenen Radius description: Schließt alle Türen im angegebenen Radius
usage: /<command> <radius> usage: /<command> <radius>
permission: survivalplus.closedoors permission: survivalplus.closedoors
sit: sit:
description: Lässt den Spieler sich hinsetzen description: Lässt den Spieler sich hinsetzen
usage: /<command> usage: /<command>
permission: survivalplus.sit permission: survivalplus.sit
back: back:
description: Teleportiert zum letzten Todespunkt description: Teleportiert zum letzten Todespunkt
usage: /<command> usage: /<command>
permission: survivalplus.back permission: survivalplus.back
friend: friend:
description: Verwaltet die Freundesliste description: Verwaltet die Freundesliste
usage: /<command> [add|accept|deny|list|del|tp] [Spielername] usage: /<command> [add|accept|deny|list|del|tp] [Spielername]
permission: survivalplus.friend permission: survivalplus.friend
stats: stats:
description: Zeigt deine Statistiken an description: Zeigt deine Statistiken an
usage: /stats usage: /stats
permission: survivalplus.stats permission: survivalplus.stats
showarmorstands: showarmorstands:
description: Macht alle unsichtbaren Armor Stands sichtbar. description: Macht alle unsichtbaren Armor Stands sichtbar.
usage: /showarmorstands usage: /showarmorstands
permission: survivalplus.showarmorstands permission: survivalplus.showarmorstands
permission-message: "§cDu hast keine Rechte für diesen Befehl." permission-message: "§cDu hast keine Rechte für diesen Befehl."
cleardebugarmorstands: cleardebugarmorstands:
description: Entfernt alle Debug-ArmorStands description: Entfernt alle Debug-ArmorStands
usage: /cleardebugarmorstands usage: /cleardebugarmorstands
permission: survivalplus.cleardebugarmorstands permission: survivalplus.cleardebugarmorstands
permission-message: "§cDu hast keine Rechte für diesen Befehl." permission-message: "§cDu hast keine Rechte für diesen Befehl."
trash: trash:
description: Öffnet den Mülleimer description: Öffnet den Mülleimer
usage: /trash usage: /trash
permission: survivalplus.trash permission: survivalplus.trash
permission-message: "§cDu hast keine Berechtigung für diesen Befehl." permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
workbench: workbench:
description: Öffnet eine Werkbank GUI description: Öffnet eine Werkbank GUI
usage: /workbench usage: /workbench
permission: survivalplus.workbench permission: survivalplus.workbench
permission-message: "§cDu hast keine Berechtigung für diesen Befehl." permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
anvil: anvil:
description: Öffnet eine Amboss GUI description: Öffnet eine Amboss GUI
usage: /anvil usage: /anvil
permission: survivalplus.anvil permission: survivalplus.anvil
permission-message: "§cDu hast keine Berechtigung für diesen Befehl." permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
leashcount: leashcount:
description: Zeigt die Anzahl der geleinten Tiere an. description: Zeigt die Anzahl der geleinten Tiere an.
usage: /leashcount usage: /leashcount
permission: survivalplus.leashcount permission: survivalplus.leashcount
permission-message: "§cDu hast keine Berechtigung für diesen Befehl." permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
lock: lock:
description: Verwaltet das Sperrsystem für Kisten und Türen description: Verwaltet das Sperrsystem für Kisten und Türen
usage: /lock <lock|unlock|friendadd|friendremove> [Spieler] usage: /lock <lock|unlock|friendadd|friendremove> [Spieler]
permission: survivalplus.lock permission: survivalplus.lock
permission-message: "§cDu hast keine Berechtigung für diesen Befehl." permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
tp: tp:
description: Teleportiere dich zu einem Spieler description: Teleportiere dich zu einem Spieler
usage: /tp <Spieler> usage: /tp <Spieler>
tphere: tphere:
description: Teleportiere einen Spieler zu dir description: Teleportiere einen Spieler zu dir
usage: /tphere <Spieler> usage: /tphere <Spieler>
tpa: tpa:
description: Sende eine Teleportanfrage an einen Spieler description: Sende eine Teleportanfrage an einen Spieler
usage: /tpa <Spieler> usage: /tpa <Spieler>
tpaccept: tpaccept:
description: Akzeptiere eine Teleportanfrage description: Akzeptiere eine Teleportanfrage
usage: /tpaccept usage: /tpaccept
tpdeny: tpdeny:
description: Lehne eine Teleportanfrage ab description: Lehne eine Teleportanfrage ab
usage: /tpdeny usage: /tpdeny
block:
description: Blockiere einen Spieler
permissions: usage: /block <Spieler>
survivalplus.*: permission: survivalplus.block
description: Gibt Zugriff auf alle SurvivalPlus-Befehle
default: op unblock:
children: description: Entblocke einen Spieler
survivalplus.gamemode: true usage: /unblock <Spieler>
survivalplus.gamemode.others: true permission: survivalplus.unlock
survivalplus.sp: true
survivalplus.homes.set: true blocklist:
survivalplus.homes.delete: true description: Zeige eine Liste der blockierten Spieler
survivalplus.homes.list: true usage: /blocklist
survivalplus.homes: true permission: survivalplus.blocklist
survivalplus.homes.unlimited: true
survivalplus.inventory.own: true permissions:
survivalplus.inventory.others: true survivalplus.*:
survivalplus.enderchest.own: true description: Gibt Zugriff auf alle SurvivalPlus-Befehle
survivalplus.enderchest.others: true default: op
survivalplus.setworldspawn: true children:
survivalplus.setspawn: true survivalplus.gamemode: true
survivalplus.clearchat: true survivalplus.gamemode.others: true
survivalplus.clearitems: true survivalplus.sp: true
survivalplus.closedoors: true survivalplus.homes.set: true
survivalplus.sit: true survivalplus.homes.delete: true
survivalplus.back: true survivalplus.homes.list: true
survivalplus.graves: true survivalplus.homes: true
survivalplus.friend: true survivalplus.homes.unlimited: true
survivalplus.itemrename: true survivalplus.inventory.own: true
survivalplus.stats: true survivalplus.inventory.others: true
survivalplus.showarmorstands: true survivalplus.enderchest.own: true
survivalplus.cleardebugarmorstands: true survivalplus.enderchest.others: true
survivalplus.trash: true survivalplus.setworldspawn: true
survivalplus.workbench: true survivalplus.setspawn: true
survivalplus.anvil: true survivalplus.clearchat: true
survivalplus.leashcount: true survivalplus.clearitems: true
survivalplus.closedoors: true
survivalplus.gamemode: survivalplus.sit: true
description: Erlaubt das Ändern des eigenen Spielmodus survivalplus.back: true
default: op survivalplus.graves: true
survivalplus.friend: true
survivalplus.gamemode.others: survivalplus.itemrename: true
description: Erlaubt das Ändern des Spielmodus anderer Spieler survivalplus.stats: true
default: op survivalplus.showarmorstands: true
survivalplus.cleardebugarmorstands: true
survivalplus.sp: survivalplus.trash: true
description: Erlaubt den Zugriff auf den /sp-Befehl survivalplus.workbench: true
default: op survivalplus.anvil: true
survivalplus.leashcount: true
survivalplus.homes.set:
description: Erlaubt das Setzen von Homes survivalplus.gamemode:
default: true description: Erlaubt das Ändern des eigenen Spielmodus
default: op
survivalplus.homes.delete:
description: Erlaubt das Löschen von Homes survivalplus.gamemode.others:
default: true description: Erlaubt das Ändern des Spielmodus anderer Spieler
default: op
survivalplus.homes.list:
description: Erlaubt das Öffnen der Home-Liste GUI survivalplus.sp:
default: true description: Erlaubt den Zugriff auf den /sp-Befehl
default: op
survivalplus.homes:
description: Erlaubt das Teleportieren zu Homes survivalplus.homes.set:
default: true description: Erlaubt das Setzen von Homes
default: true
survivalplus.homes.unlimited:
description: Erlaubt unbegrenzte Homes survivalplus.homes.delete:
default: op description: Erlaubt das Löschen von Homes
default: true
survivalplus.inventory.own:
description: Erlaubt das Ansehen des eigenen Inventars survivalplus.homes.list:
default: true description: Erlaubt das Öffnen der Home-Liste GUI
default: true
survivalplus.inventory.others:
description: Erlaubt das Ansehen des Inventars anderer Spieler survivalplus.homes:
default: op description: Erlaubt das Teleportieren zu Homes
default: true
survivalplus.enderchest.own:
description: Erlaubt das Ansehen der eigenen Endertruhe survivalplus.homes.unlimited:
default: true description: Erlaubt unbegrenzte Homes
default: op
survivalplus.enderchest.others:
description: Erlaubt das Ansehen der Endertruhen anderer Spieler survivalplus.inventory.own:
default: op description: Erlaubt das Ansehen des eigenen Inventars
default: true
survivalplus.setworldspawn:
description: Erlaubt das Setzen des Weltspawnpunkts survivalplus.inventory.others:
default: op description: Erlaubt das Ansehen des Inventars anderer Spieler
default: op
survivalplus.setspawn:
description: Erlaubt das Setzen des Server-Spawnpunkts survivalplus.enderchest.own:
default: op description: Erlaubt das Ansehen der eigenen Endertruhe
default: true
survivalplus.clearchat:
description: Erlaubt das Löschen des Chats survivalplus.enderchest.others:
default: op description: Erlaubt das Ansehen der Endertruhen anderer Spieler
default: op
survivalplus.clearitems:
description: Erlaubt das manuelle Löschen der herumliegenden Items survivalplus.setworldspawn:
default: op description: Erlaubt das Setzen des Weltspawnpunkts
default: op
survivalplus.closedoors:
description: Erlaubt das Schließen von Türen mit /closedoors survivalplus.setspawn:
default: op description: Erlaubt das Setzen des Server-Spawnpunkts
default: op
survivalplus.sit:
description: Erlaubt das Sitzen auf Treppen oder mit /sit survivalplus.clearchat:
default: true description: Erlaubt das Löschen des Chats
default: op
survivalplus.graves:
description: Erlaubt das Erstellen von Gräbern bei Tod survivalplus.clearitems:
default: true description: Erlaubt das manuelle Löschen der herumliegenden Items
default: op
survivalplus.back:
description: Erlaubt das Teleportieren zum letzten Todespunkt survivalplus.closedoors:
default: true description: Erlaubt das Schließen von Türen mit /closedoors
default: op
survivalplus.friend:
description: Erlaubt die Verwaltung der Freundesliste survivalplus.sit:
default: true description: Erlaubt das Sitzen auf Treppen oder mit /sit
default: true
survivalplus.itemrename:
description: Erlaubt das Umbenennen von Items mit /ir survivalplus.graves:
default: true description: Erlaubt das Erstellen von Gräbern bei Tod
default: true
survivalplus.stats:
description: Erlaubt den Zugriff auf den /stats-Befehl survivalplus.back:
default: true description: Erlaubt das Teleportieren zum letzten Todespunkt
default: true
survivalplus.showarmorstands:
description: Erlaubt das Sichtbarmachen von Armor Stands mit /showarmorstands survivalplus.friend:
default: op description: Erlaubt die Verwaltung der Freundesliste
default: true
survivalplus.cleardebugarmorstands:
description: Erlaubt das Entfernen von Debug-ArmorStands survivalplus.itemrename:
default: op description: Erlaubt das Umbenennen von Items mit /ir
default: true
survivalplus.trash:
description: Erlaubt die Nutzung von /trash survivalplus.stats:
default: true description: Erlaubt den Zugriff auf den /stats-Befehl
default: true
survivalplus.workbench:
description: Erlaubt die Nutzung von /workbench survivalplus.showarmorstands:
default: true description: Erlaubt das Sichtbarmachen von Armor Stands mit /showarmorstands
default: op
survivalplus.anvil:
description: Erlaubt die Nutzung von /anvil survivalplus.cleardebugarmorstands:
default: true description: Erlaubt das Entfernen von Debug-ArmorStands
default: op
survivalplus.leashcount:
description: Erlaubt die Nutzung von /leashcount survivalplus.trash:
default: true description: Erlaubt die Nutzung von /trash
default: true
survivalplus.chunkanimals:
description: Erlaubt das Anzeigen der Anzahl der Tiere im aktuellen Chunk survivalplus.workbench:
default: op description: Erlaubt die Nutzung von /workbench
default: true
survivalplus.lock:
description: Erlaubt das Verwenden von /lock-Befehlen survivalplus.anvil:
default: true description: Erlaubt die Nutzung von /anvil
default: true
survivalplus.tp:
description: Erlaube das Teleportieren zu anderen Spielern survivalplus.leashcount:
default: op description: Erlaubt die Nutzung von /leashcount
default: true
survivalplus.tphere:
description: Erlaube das Teleportieren anderer Spieler zu dir survivalplus.chunkanimals:
default: op description: Erlaubt das Anzeigen der Anzahl der Tiere im aktuellen Chunk
default: op
survivalplus.tpa:
description: Erlaube das Senden von Teleportanfragen survivalplus.lock:
default: true description: Erlaubt das Verwenden von /lock-Befehlen
default: true
survivalplus.tpaccept:
description: Erlaube das Annehmen von Teleportanfragen survivalplus.tp:
default: true description: Erlaube das Teleportieren zu anderen Spielern
default: op
survivalplus.tpdeny:
description: Erlaube das Ablehnen von Teleportanfragen survivalplus.tphere:
default: true description: Erlaube das Teleportieren anderer Spieler zu dir
default: op
survivalplus.tpa:
description: Erlaube das Senden von Teleportanfragen
default: true
survivalplus.tpaccept:
description: Erlaube das Annehmen von Teleportanfragen
default: true
survivalplus.tpdeny:
description: Erlaube das Ablehnen von Teleportanfragen
default: true
survivalplus.block:
description: Erlaubt das Blockieren anderer Spieler im Chat
default: true