Compare commits
30 Commits
Author | SHA1 | Date | |
---|---|---|---|
5602041fdf | |||
133243abea | |||
8ebbe282cc | |||
24a017d794 | |||
4f3bfd0403 | |||
f22052e5f2 | |||
bc801863e1 | |||
c237f2b8c3 | |||
7700c588ff | |||
851ec03788 | |||
a2e75a7142 | |||
c762eff2a1 | |||
cbaa562e1d | |||
a225838f26 | |||
ed1948b8b4 | |||
f9948d8ccc | |||
1c5c03cf63 | |||
e71074a453 | |||
c8ee265de5 | |||
18c041434e | |||
94d64821a6 | |||
3e7c4cbc13 | |||
2df3a217e4 | |||
9078098fb0 | |||
dc14a8dac2 | |||
6a221a3cbe | |||
4187194a3d | |||
fac39de66f | |||
f03efaa6e6 | |||
6016d2af9b |
@@ -1,6 +1,6 @@
|
||||
# 🧩 SurvivalPlus
|
||||
|
||||
**Version:** 1.0.0
|
||||
**Version:** 1.0.1
|
||||
**Autor:** M_Viper
|
||||
**API-Version:** 1.21
|
||||
**Beschreibung:**
|
||||
|
@@ -1,143 +1,161 @@
|
||||
package de.viper.survivalplus.tasks;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.boss.BarColor;
|
||||
import org.bukkit.boss.BarFlag;
|
||||
import org.bukkit.boss.BarStyle;
|
||||
import org.bukkit.boss.BossBar;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class AFKManager {
|
||||
|
||||
private final Plugin plugin;
|
||||
private final long afkAfterMillis;
|
||||
private final long kickAfterMillis;
|
||||
|
||||
private final Map<UUID, Long> lastActivity = new HashMap<>();
|
||||
private final Set<UUID> afkPlayers = new HashSet<>();
|
||||
private final Map<UUID, BossBar> bossBars = new WeakHashMap<>();
|
||||
private final Map<UUID, Integer> colorIndex = new HashMap<>();
|
||||
private final Map<UUID, BukkitRunnable> colorTasks = new HashMap<>();
|
||||
|
||||
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;
|
||||
this.kickAfterMillis = kickAfterSeconds * 1000;
|
||||
}
|
||||
|
||||
public void updateActivity(Player player) {
|
||||
UUID uuid = player.getUniqueId();
|
||||
lastActivity.put(uuid, System.currentTimeMillis());
|
||||
|
||||
if (afkPlayers.contains(uuid)) {
|
||||
afkPlayers.remove(uuid);
|
||||
removeAFKBossBar(player);
|
||||
}
|
||||
}
|
||||
|
||||
public void reset(Player player) {
|
||||
UUID uuid = player.getUniqueId();
|
||||
lastActivity.remove(uuid);
|
||||
afkPlayers.remove(uuid);
|
||||
removeAFKBossBar(player);
|
||||
}
|
||||
|
||||
public boolean isAFK(Player player) {
|
||||
return afkPlayers.contains(player.getUniqueId());
|
||||
}
|
||||
|
||||
public void checkAFKStatus(Player player) {
|
||||
UUID uuid = player.getUniqueId();
|
||||
long currentTime = System.currentTimeMillis();
|
||||
|
||||
if (!lastActivity.containsKey(uuid)) {
|
||||
lastActivity.put(uuid, currentTime);
|
||||
return;
|
||||
}
|
||||
|
||||
long last = lastActivity.get(uuid);
|
||||
long diff = currentTime - last;
|
||||
|
||||
if (diff >= afkAfterMillis) {
|
||||
if (!afkPlayers.contains(uuid)) {
|
||||
afkPlayers.add(uuid);
|
||||
// BossBar wird im Listener angezeigt
|
||||
}
|
||||
|
||||
if (kickAfterMillis > 0 && diff >= kickAfterMillis) {
|
||||
player.kickPlayer("§cDu wurdest wegen AFK gekickt.");
|
||||
}
|
||||
} else {
|
||||
if (afkPlayers.contains(uuid)) {
|
||||
afkPlayers.remove(uuid);
|
||||
removeAFKBossBar(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void showAFKBossBar(Player player, String message) {
|
||||
UUID uuid = player.getUniqueId();
|
||||
removeAFKBossBar(player); // sicherstellen, dass nur eine BossBar aktiv ist
|
||||
|
||||
BossBar bar = Bukkit.createBossBar(message, BarColor.YELLOW, BarStyle.SOLID, BarFlag.CREATE_FOG);
|
||||
bar.addPlayer(player);
|
||||
bar.setVisible(true);
|
||||
|
||||
bossBars.put(uuid, bar);
|
||||
colorIndex.put(uuid, 0);
|
||||
|
||||
// Alten Farbwechsel-Task stoppen, falls vorhanden
|
||||
if (colorTasks.containsKey(uuid)) {
|
||||
colorTasks.get(uuid).cancel();
|
||||
colorTasks.remove(uuid);
|
||||
}
|
||||
|
||||
BukkitRunnable task = new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!bossBars.containsKey(uuid)) {
|
||||
this.cancel();
|
||||
colorTasks.remove(uuid);
|
||||
return;
|
||||
}
|
||||
|
||||
int index = colorIndex.getOrDefault(uuid, 0);
|
||||
BarColor color = colorCycle.get(index);
|
||||
|
||||
BossBar activeBar = bossBars.get(uuid);
|
||||
if (activeBar != null) {
|
||||
activeBar.setColor(color);
|
||||
}
|
||||
|
||||
colorIndex.put(uuid, (index + 1) % colorCycle.size());
|
||||
}
|
||||
};
|
||||
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);
|
||||
}
|
||||
}
|
||||
package de.viper.survivalplus.tasks;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.boss.BarColor;
|
||||
import org.bukkit.boss.BarFlag;
|
||||
import org.bukkit.boss.BarStyle;
|
||||
import org.bukkit.boss.BossBar;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.Plugin;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class AFKManager {
|
||||
|
||||
private final Plugin plugin;
|
||||
private final long afkAfterMillis;
|
||||
private final long kickAfterMillis;
|
||||
private final long joinGracePeriodMillis = 5000; // 5 Sekunden Schonfrist
|
||||
|
||||
private final Map<UUID, Long> lastActivity = new HashMap<>();
|
||||
private final Map<UUID, Long> joinTimes = new HashMap<>();
|
||||
private final Set<UUID> afkPlayers = new HashSet<>();
|
||||
private final Map<UUID, BossBar> bossBars = new WeakHashMap<>();
|
||||
private final Map<UUID, Integer> colorIndex = new HashMap<>();
|
||||
private final Map<UUID, BukkitRunnable> colorTasks = new HashMap<>();
|
||||
|
||||
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;
|
||||
this.kickAfterMillis = kickAfterSeconds * 1000;
|
||||
}
|
||||
|
||||
public void updateActivity(Player player) {
|
||||
UUID uuid = player.getUniqueId();
|
||||
lastActivity.put(uuid, System.currentTimeMillis());
|
||||
if (!joinTimes.containsKey(uuid)) {
|
||||
joinTimes.put(uuid, System.currentTimeMillis()); // Join-Zeit speichern
|
||||
}
|
||||
|
||||
if (afkPlayers.contains(uuid)) {
|
||||
afkPlayers.remove(uuid);
|
||||
removeAFKBossBar(player);
|
||||
}
|
||||
}
|
||||
|
||||
public void reset(Player player) {
|
||||
UUID uuid = player.getUniqueId();
|
||||
lastActivity.remove(uuid);
|
||||
joinTimes.remove(uuid); // Join-Zeit entfernen
|
||||
afkPlayers.remove(uuid);
|
||||
removeAFKBossBar(player);
|
||||
}
|
||||
|
||||
public boolean isAFK(Player player) {
|
||||
return afkPlayers.contains(player.getUniqueId());
|
||||
}
|
||||
|
||||
public void checkAFKStatus(Player player) {
|
||||
UUID uuid = player.getUniqueId();
|
||||
long currentTime = System.currentTimeMillis();
|
||||
|
||||
// AFK-Prüfung überspringen, wenn Spieler in der Schonfrist ist
|
||||
if (joinTimes.containsKey(uuid) && (currentTime - joinTimes.get(uuid) < joinGracePeriodMillis)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// AFK-Prüfung für Kreativ- oder Zuschauermodus überspringen
|
||||
if (player.getGameMode() == org.bukkit.GameMode.CREATIVE ||
|
||||
player.getGameMode() == org.bukkit.GameMode.SPECTATOR) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!lastActivity.containsKey(uuid)) {
|
||||
lastActivity.put(uuid, currentTime);
|
||||
return;
|
||||
}
|
||||
|
||||
long last = lastActivity.get(uuid);
|
||||
long diff = currentTime - last;
|
||||
|
||||
if (diff >= afkAfterMillis) {
|
||||
if (!afkPlayers.contains(uuid)) {
|
||||
afkPlayers.add(uuid);
|
||||
showAFKBossBar(player, "§cDu bist AFK!");
|
||||
}
|
||||
|
||||
if (kickAfterMillis > 0 && diff >= kickAfterMillis) {
|
||||
plugin.getLogger().info("Spieler " + player.getName() + " wird wegen AFK gekickt. Inaktiv seit: " + (diff / 1000) + " Sekunden");
|
||||
player.kickPlayer("§cDu wurdest wegen AFK gekickt.");
|
||||
}
|
||||
} else {
|
||||
if (afkPlayers.contains(uuid)) {
|
||||
afkPlayers.remove(uuid);
|
||||
removeAFKBossBar(player);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void showAFKBossBar(Player player, String message) {
|
||||
UUID uuid = player.getUniqueId();
|
||||
removeAFKBossBar(player); // Sicherstellen, dass nur eine BossBar aktiv ist
|
||||
|
||||
BossBar bar = Bukkit.createBossBar(message, BarColor.YELLOW, BarStyle.SOLID, BarFlag.CREATE_FOG);
|
||||
bar.addPlayer(player);
|
||||
bar.setVisible(true);
|
||||
|
||||
bossBars.put(uuid, bar);
|
||||
colorIndex.put(uuid, 0);
|
||||
|
||||
// Alten Farbwechsel-Task stoppen, falls vorhanden
|
||||
if (colorTasks.containsKey(uuid)) {
|
||||
colorTasks.get(uuid).cancel();
|
||||
colorTasks.remove(uuid);
|
||||
}
|
||||
|
||||
BukkitRunnable task = new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!bossBars.containsKey(uuid)) {
|
||||
this.cancel();
|
||||
colorTasks.remove(uuid);
|
||||
return;
|
||||
}
|
||||
|
||||
int index = colorIndex.getOrDefault(uuid, 0);
|
||||
BarColor color = colorCycle.get(index);
|
||||
|
||||
BossBar activeBar = bossBars.get(uuid);
|
||||
if (activeBar != null) {
|
||||
activeBar.setColor(color);
|
||||
}
|
||||
|
||||
colorIndex.put(uuid, (index + 1) % colorCycle.size());
|
||||
}
|
||||
};
|
||||
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);
|
||||
}
|
||||
}
|
@@ -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
@@ -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;
|
||||
}
|
||||
}
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -1,343 +1,423 @@
|
||||
package de.viper.survivalplus.commands;
|
||||
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class FriendCommand implements CommandExecutor {
|
||||
private final JavaPlugin plugin;
|
||||
private final FileConfiguration friendsConfig;
|
||||
private final FileConfiguration langConfig;
|
||||
private final Logger logger;
|
||||
|
||||
public FriendCommand(JavaPlugin plugin, FileConfiguration friendsConfig, FileConfiguration langConfig, Logger logger) {
|
||||
this.plugin = plugin;
|
||||
this.friendsConfig = friendsConfig;
|
||||
this.langConfig = langConfig;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (!(sender instanceof Player)) {
|
||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-only", "&cDieser Befehl ist nur für Spieler!")));
|
||||
return true;
|
||||
}
|
||||
|
||||
Player player = (Player) sender;
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
|
||||
if (args.length == 0) {
|
||||
sendHelpMessage(player);
|
||||
return true;
|
||||
}
|
||||
|
||||
String subCommand = args[0].toLowerCase();
|
||||
|
||||
switch (subCommand) {
|
||||
case "add":
|
||||
if (args.length != 2) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.add-usage", "&cVerwendung: /friend add <Spielername>")));
|
||||
return true;
|
||||
}
|
||||
handleFriendAdd(player, args[1]);
|
||||
break;
|
||||
|
||||
case "accept":
|
||||
if (args.length != 2) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.accept-usage", "&cVerwendung: /friend accept <Spielername>")));
|
||||
return true;
|
||||
}
|
||||
handleFriendAccept(player, args[1]);
|
||||
break;
|
||||
|
||||
case "deny":
|
||||
if (args.length != 2) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.deny-usage", "&cVerwendung: /friend deny <Spielername>")));
|
||||
return true;
|
||||
}
|
||||
handleFriendDeny(player, args[1]);
|
||||
break;
|
||||
|
||||
case "list":
|
||||
if (args.length != 1) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.list-usage", "&cVerwendung: /friend list")));
|
||||
return true;
|
||||
}
|
||||
handleFriendList(player);
|
||||
break;
|
||||
|
||||
case "del":
|
||||
if (args.length != 2) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.del-usage", "&cVerwendung: /friend del <Spielername>")));
|
||||
return true;
|
||||
}
|
||||
handleFriendDelete(player, args[1]);
|
||||
break;
|
||||
|
||||
case "tp":
|
||||
if (args.length != 2) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.tp-usage", "&cVerwendung: /friend tp <Spielername>")));
|
||||
return true;
|
||||
}
|
||||
handleFriendTeleport(player, args[1]);
|
||||
break;
|
||||
|
||||
default:
|
||||
sendHelpMessage(player);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void sendHelpMessage(Player player) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.header", "&6=== Freundesliste Hilfe ===")));
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.add", "&e/friend add <Spielername> &7- Freundschaftsanfrage senden")));
|
||||
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")));
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.list", "&e/friend list &7- Liste deiner Freunde anzeigen")));
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.del", "&e/friend del <Spielername> &7- Freund aus der Liste entfernen")));
|
||||
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=====================")));
|
||||
}
|
||||
|
||||
private void handleFriendAdd(Player player, String targetName) {
|
||||
Player target = Bukkit.getPlayerExact(targetName);
|
||||
if (target == null) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").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;
|
||||
}
|
||||
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
UUID targetUUID = target.getUniqueId();
|
||||
List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends");
|
||||
List<String> pendingRequests = friendsConfig.getStringList(targetUUID + ".pending_requests");
|
||||
|
||||
if (playerFriends.contains(targetUUID.toString())) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.already-friends", "&cDu bist bereits mit %s befreundet!").replace("%s", targetName)));
|
||||
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;
|
||||
}
|
||||
|
||||
pendingRequests.add(playerUUID.toString());
|
||||
friendsConfig.set(targetUUID + ".pending_requests", pendingRequests);
|
||||
friendsConfig.set(targetUUID + ".name", targetName); // Speichere den Namen für Offline-Lookups
|
||||
saveFriendsConfig();
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.add.sent", "&aFreundschaftsanfrage an %s gesendet!").replace("%s", targetName)));
|
||||
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.");
|
||||
}
|
||||
|
||||
private void handleFriendAccept(Player player, String requesterName) {
|
||||
Player requester = Bukkit.getPlayerExact(requesterName);
|
||||
if (requester == null) {
|
||||
UUID requesterUUID = getUUIDFromName(requesterName);
|
||||
if (requesterUUID == null) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", requesterName)));
|
||||
return;
|
||||
}
|
||||
acceptFriendRequest(player, requesterUUID, requesterName);
|
||||
} else {
|
||||
acceptFriendRequest(player, requester.getUniqueId(), requesterName);
|
||||
}
|
||||
}
|
||||
|
||||
private void acceptFriendRequest(Player player, UUID requesterUUID, String requesterName) {
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
List<String> pendingRequests = friendsConfig.getStringList(playerUUID + ".pending_requests");
|
||||
|
||||
if (!pendingRequests.contains(requesterUUID.toString())) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.no-request", "&cKeine Anfrage von %s gefunden!").replace("%s", requesterName)));
|
||||
return;
|
||||
}
|
||||
|
||||
pendingRequests.remove(requesterUUID.toString());
|
||||
friendsConfig.set(playerUUID + ".pending_requests", pendingRequests);
|
||||
|
||||
List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends");
|
||||
List<String> requesterFriends = friendsConfig.getStringList(requesterUUID + ".friends");
|
||||
|
||||
playerFriends.add(requesterUUID.toString());
|
||||
requesterFriends.add(playerUUID.toString());
|
||||
|
||||
friendsConfig.set(playerUUID + ".friends", playerFriends);
|
||||
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
|
||||
|
||||
saveFriendsConfig();
|
||||
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.accept.success", "&aDu bist jetzt mit %s befreundet!").replace("%s", requesterName)));
|
||||
Player requester = Bukkit.getPlayer(requesterUUID);
|
||||
if (requester != null) {
|
||||
requester.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.accept.notify", "&a%s hat deine Freundschaftsanfrage akzeptiert!").replace("%s", player.getName())));
|
||||
}
|
||||
logger.info(player.getName() + " hat die Freundschaftsanfrage von " + requesterName + " akzeptiert.");
|
||||
}
|
||||
|
||||
private void handleFriendDeny(Player player, String requesterName) {
|
||||
UUID requesterUUID = getUUIDFromName(requesterName);
|
||||
if (requesterUUID == null) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", requesterName)));
|
||||
return;
|
||||
}
|
||||
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
List<String> pendingRequests = friendsConfig.getStringList(playerUUID + ".pending_requests");
|
||||
|
||||
if (!pendingRequests.contains(requesterUUID.toString())) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.no-request", "&cKeine Anfrage von %s gefunden!").replace("%s", requesterName)));
|
||||
return;
|
||||
}
|
||||
|
||||
pendingRequests.remove(requesterUUID.toString());
|
||||
friendsConfig.set(playerUUID + ".pending_requests", pendingRequests);
|
||||
saveFriendsConfig();
|
||||
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.deny.success", "&aFreundschaftsanfrage von %s abgelehnt.").replace("%s", requesterName)));
|
||||
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())));
|
||||
}
|
||||
logger.info(player.getName() + " hat die Freundschaftsanfrage von " + requesterName + " abgelehnt.");
|
||||
}
|
||||
|
||||
private void handleFriendList(Player player) {
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
List<String> friendUUIDs = friendsConfig.getStringList(playerUUID + ".friends");
|
||||
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.header", "&6=== Deine Freundesliste ===")));
|
||||
if (friendUUIDs.isEmpty()) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.empty", "&7Du hast keine Freunde.")));
|
||||
} else {
|
||||
for (String friendUUID : friendUUIDs) {
|
||||
String friendName = getNameFromUUID(UUID.fromString(friendUUID));
|
||||
Player friend = Bukkit.getPlayer(UUID.fromString(friendUUID));
|
||||
String status = friend != null ? langConfig.getString("friend.list.online", "&aOnline") : langConfig.getString("friend.list.offline", "&7Offline");
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.entry", "&e%s: %s").replaceFirst("%s", friendName).replaceFirst("%s", status)));
|
||||
}
|
||||
}
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.footer", "&6=====================")));
|
||||
logger.info("Freundesliste für " + player.getName() + " angezeigt.");
|
||||
}
|
||||
|
||||
private void handleFriendDelete(Player player, String friendName) {
|
||||
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)));
|
||||
return;
|
||||
}
|
||||
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends");
|
||||
List<String> friendFriends = friendsConfig.getStringList(friendUUID + ".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;
|
||||
}
|
||||
|
||||
playerFriends.remove(friendUUID.toString());
|
||||
friendFriends.remove(playerUUID.toString());
|
||||
|
||||
friendsConfig.set(playerUUID + ".friends", playerFriends);
|
||||
friendsConfig.set(friendUUID + ".friends", friendFriends);
|
||||
saveFriendsConfig();
|
||||
|
||||
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) {
|
||||
friend.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.del.notify", "&c%s hat dich aus seiner Freundesliste entfernt.").replace("%s", player.getName())));
|
||||
}
|
||||
logger.info(player.getName() + " hat " + friendName + " aus der Freundesliste entfernt.");
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
// Fallback für Offline-Spieler
|
||||
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(); // Fallback auf UUID, falls Name nicht gefunden
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
package de.viper.survivalplus.commands;
|
||||
|
||||
import net.md_5.bungee.api.chat.ClickEvent;
|
||||
import net.md_5.bungee.api.chat.TextComponent;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.ChatColor;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Logger;
|
||||
|
||||
public class FriendCommand implements CommandExecutor {
|
||||
private final JavaPlugin plugin;
|
||||
private final FileConfiguration friendsConfig;
|
||||
private final FileConfiguration langConfig;
|
||||
private final Logger logger;
|
||||
|
||||
public FriendCommand(JavaPlugin plugin, FileConfiguration friendsConfig, FileConfiguration langConfig, Logger logger) {
|
||||
this.plugin = plugin;
|
||||
this.friendsConfig = friendsConfig;
|
||||
this.langConfig = langConfig;
|
||||
this.logger = logger;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (!(sender instanceof Player)) {
|
||||
sender.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-only", "&cDieser Befehl ist nur für Spieler!")));
|
||||
return true;
|
||||
}
|
||||
|
||||
Player player = (Player) sender;
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
|
||||
if (args.length == 0) {
|
||||
sendHelpMessage(player);
|
||||
return true;
|
||||
}
|
||||
|
||||
String subCommand = args[0].toLowerCase();
|
||||
|
||||
switch (subCommand) {
|
||||
case "add":
|
||||
if (args.length != 2) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.add-usage", "&cVerwendung: /friend add <Spielername>")));
|
||||
return true;
|
||||
}
|
||||
handleFriendAdd(player, args[1]);
|
||||
break;
|
||||
|
||||
case "accept":
|
||||
if (args.length != 2) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.accept-usage", "&cVerwendung: /friend accept <Spielername>")));
|
||||
return true;
|
||||
}
|
||||
handleFriendAccept(player, args[1]);
|
||||
break;
|
||||
|
||||
case "deny":
|
||||
if (args.length != 2) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.deny-usage", "&cVerwendung: /friend deny <Spielername>")));
|
||||
return true;
|
||||
}
|
||||
handleFriendDeny(player, args[1]);
|
||||
break;
|
||||
|
||||
case "list":
|
||||
if (args.length != 1) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.list-usage", "&cVerwendung: /friend list")));
|
||||
return true;
|
||||
}
|
||||
handleFriendList(player);
|
||||
break;
|
||||
|
||||
case "del":
|
||||
if (args.length != 2) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.del-usage", "&cVerwendung: /friend del <Spielername>")));
|
||||
return true;
|
||||
}
|
||||
handleFriendDelete(player, args[1]);
|
||||
break;
|
||||
|
||||
case "confirm":
|
||||
if (args.length != 2) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.confirm-usage", "&cVerwendung: /friend confirm <Spielername>")));
|
||||
return true;
|
||||
}
|
||||
handleFriendConfirmDelete(player, args[1]);
|
||||
break;
|
||||
|
||||
case "tp":
|
||||
if (args.length != 2) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.tp-usage", "&cVerwendung: /friend tp <Spielername>")));
|
||||
return true;
|
||||
}
|
||||
handleFriendTeleport(player, args[1]);
|
||||
break;
|
||||
|
||||
default:
|
||||
sendHelpMessage(player);
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void sendHelpMessage(Player player) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.header", "&6=== Freundesliste Hilfe ===")));
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.add", "&e/friend add <Spielername> &7- Freundschaftsanfrage senden")));
|
||||
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")));
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.list", "&e/friend list &7- Liste deiner Freunde anzeigen")));
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.help.del", "&e/friend del <Spielername> &7- Freund aus der Liste entfernen")));
|
||||
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=====================")));
|
||||
}
|
||||
|
||||
private void handleFriendAdd(Player player, String targetName) {
|
||||
Player target = Bukkit.getPlayerExact(targetName);
|
||||
if (target == null) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").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;
|
||||
}
|
||||
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
UUID targetUUID = target.getUniqueId();
|
||||
List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends");
|
||||
List<String> pendingRequests = friendsConfig.getStringList(targetUUID + ".pending_requests");
|
||||
|
||||
if (playerFriends.contains(targetUUID.toString())) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.already-friends", "&cDu bist bereits mit %s befreundet!").replace("%s", targetName)));
|
||||
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;
|
||||
}
|
||||
|
||||
pendingRequests.add(playerUUID.toString());
|
||||
friendsConfig.set(targetUUID + ".pending_requests", pendingRequests);
|
||||
friendsConfig.set(targetUUID + ".name", targetName);
|
||||
saveFriendsConfig();
|
||||
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.add.sent", "&aFreundschaftsanfrage an %s gesendet!").replace("%s", targetName)));
|
||||
|
||||
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]")));
|
||||
deny.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/friend deny " + player.getName()));
|
||||
message.addExtra(accept);
|
||||
message.addExtra(deny);
|
||||
target.spigot().sendMessage(message);
|
||||
|
||||
logger.info("Freundschaftsanfrage von " + player.getName() + " an " + targetName + " gesendet.");
|
||||
}
|
||||
|
||||
private void handleFriendAccept(Player player, String requesterName) {
|
||||
Player requester = Bukkit.getPlayerExact(requesterName);
|
||||
if (requester == null) {
|
||||
UUID requesterUUID = getUUIDFromName(requesterName);
|
||||
if (requesterUUID == null) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", requesterName)));
|
||||
return;
|
||||
}
|
||||
acceptFriendRequest(player, requesterUUID, requesterName);
|
||||
} else {
|
||||
acceptFriendRequest(player, requester.getUniqueId(), requesterName);
|
||||
}
|
||||
}
|
||||
|
||||
private void acceptFriendRequest(Player player, UUID requesterUUID, String requesterName) {
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
List<String> pendingRequests = friendsConfig.getStringList(playerUUID + ".pending_requests");
|
||||
|
||||
if (!pendingRequests.contains(requesterUUID.toString())) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.no-request", "&cKeine Anfrage von %s gefunden!").replace("%s", requesterName)));
|
||||
return;
|
||||
}
|
||||
|
||||
pendingRequests.remove(requesterUUID.toString());
|
||||
friendsConfig.set(playerUUID + ".pending_requests", pendingRequests);
|
||||
|
||||
List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends");
|
||||
List<String> requesterFriends = friendsConfig.getStringList(requesterUUID + ".friends");
|
||||
|
||||
playerFriends.add(requesterUUID.toString());
|
||||
requesterFriends.add(playerUUID.toString());
|
||||
|
||||
friendsConfig.set(playerUUID + ".friends", playerFriends);
|
||||
friendsConfig.set(playerUUID + ".name", player.getName());
|
||||
friendsConfig.set(requesterUUID + ".friends", requesterFriends);
|
||||
friendsConfig.set(requesterUUID + ".name", requesterName);
|
||||
|
||||
saveFriendsConfig();
|
||||
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.accept.success", "&aDu bist jetzt mit %s befreundet!").replace("%s", requesterName)));
|
||||
Player requester = Bukkit.getPlayer(requesterUUID);
|
||||
if (requester != null) {
|
||||
requester.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.accept.notify", "&a%s hat deine Freundschaftsanfrage akzeptiert!").replace("%s", player.getName())));
|
||||
}
|
||||
logger.info(player.getName() + " hat die Freundschaftsanfrage von " + requesterName + " akzeptiert.");
|
||||
}
|
||||
|
||||
private void handleFriendDeny(Player player, String requesterName) {
|
||||
UUID requesterUUID = getUUIDFromName(requesterName);
|
||||
if (requesterUUID == null) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.player-not-found", "&cSpieler %s nicht gefunden!").replace("%s", requesterName)));
|
||||
return;
|
||||
}
|
||||
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
List<String> pendingRequests = friendsConfig.getStringList(playerUUID + ".pending_requests");
|
||||
|
||||
if (!pendingRequests.contains(requesterUUID.toString())) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.error.no-request", "&cKeine Anfrage von %s gefunden!").replace("%s", requesterName)));
|
||||
return;
|
||||
}
|
||||
|
||||
pendingRequests.remove(requesterUUID.toString());
|
||||
friendsConfig.set(playerUUID + ".pending_requests", pendingRequests);
|
||||
saveFriendsConfig();
|
||||
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.deny.success", "&aFreundschaftsanfrage von %s abgelehnt.").replace("%s", requesterName)));
|
||||
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())));
|
||||
}
|
||||
logger.info(player.getName() + " hat die Freundschaftsanfrage von " + requesterName + " abgelehnt.");
|
||||
}
|
||||
|
||||
private void handleFriendList(Player player) {
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
List<String> friendUUIDs = friendsConfig.getStringList(playerUUID + ".friends");
|
||||
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.header", "&6=== Deine Freundesliste ===")));
|
||||
if (friendUUIDs.isEmpty()) {
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.empty", "&7Du hast keine Freunde.")));
|
||||
} else {
|
||||
SimpleDateFormat dateFormat = new SimpleDateFormat(langConfig.getString("friend.list.date-format", "dd.MM.yyyy HH:mm:ss"));
|
||||
for (String friendUUID : friendUUIDs) {
|
||||
String friendName = getNameFromUUID(UUID.fromString(friendUUID));
|
||||
Player friend = Bukkit.getPlayer(UUID.fromString(friendUUID));
|
||||
TextComponent entry = new TextComponent();
|
||||
|
||||
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"))));
|
||||
} else {
|
||||
long lastOnline = friendsConfig.getLong(friendUUID + ".last-online", 0);
|
||||
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)));
|
||||
}
|
||||
|
||||
TextComponent removeButton = new TextComponent(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.remove-button", "&c[X]")));
|
||||
removeButton.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/friend del " + friendName));
|
||||
entry.addExtra(" ");
|
||||
entry.addExtra(removeButton);
|
||||
|
||||
player.spigot().sendMessage(entry);
|
||||
}
|
||||
}
|
||||
player.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.list.footer", "&6=====================")));
|
||||
logger.info("Freundesliste für " + player.getName() + " angezeigt.");
|
||||
}
|
||||
|
||||
private void handleFriendDelete(Player player, String friendName) {
|
||||
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)));
|
||||
return;
|
||||
}
|
||||
|
||||
UUID playerUUID = player.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;
|
||||
}
|
||||
|
||||
TextComponent confirmMessage = new TextComponent(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.del.confirm", "&cMöchtest du %s wirklich aus deiner Freundesliste entfernen? ").replace("%s", friendName)));
|
||||
TextComponent confirmButton = new TextComponent(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.del.confirm-button", "&a[Confirm]")));
|
||||
confirmButton.setClickEvent(new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/friend confirm " + friendName));
|
||||
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);
|
||||
confirmMessage.addExtra(" ");
|
||||
confirmMessage.addExtra(cancelButton);
|
||||
player.spigot().sendMessage(confirmMessage);
|
||||
|
||||
logger.info(player.getName() + " wurde zur Bestätigung aufgefordert, " + friendName + " aus der Freundesliste zu entfernen.");
|
||||
}
|
||||
|
||||
private void handleFriendConfirmDelete(Player player, String friendName) {
|
||||
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)));
|
||||
return;
|
||||
}
|
||||
|
||||
UUID playerUUID = player.getUniqueId();
|
||||
List<String> playerFriends = friendsConfig.getStringList(playerUUID + ".friends");
|
||||
List<String> friendFriends = friendsConfig.getStringList(friendUUID + ".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;
|
||||
}
|
||||
|
||||
playerFriends.remove(friendUUID.toString());
|
||||
friendFriends.remove(playerUUID.toString());
|
||||
|
||||
friendsConfig.set(playerUUID + ".friends", playerFriends);
|
||||
friendsConfig.set(friendUUID + ".friends", friendFriends);
|
||||
saveFriendsConfig();
|
||||
|
||||
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) {
|
||||
friend.sendMessage(ChatColor.translateAlternateColorCodes('&', langConfig.getString("friend.del.notify", "&c%s hat dich aus seiner Freundesliste entfernt.").replace("%s", player.getName())));
|
||||
}
|
||||
logger.info(player.getName() + " hat " + friendName + " aus der Freundesliste entfernt.");
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
65
src/main/java/de/viper/survivalplus/commands/KitCommand.java
Normal file
65
src/main/java/de/viper/survivalplus/commands/KitCommand.java
Normal 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;
|
||||
}
|
||||
}
|
@@ -1,54 +1,57 @@
|
||||
package de.viper.survivalplus.commands;
|
||||
|
||||
import de.viper.survivalplus.SurvivalPlus;
|
||||
import de.viper.survivalplus.listeners.SitListener;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
public class SitCommand implements CommandExecutor {
|
||||
private final SurvivalPlus plugin;
|
||||
private final SitListener sitListener;
|
||||
|
||||
public SitCommand(SurvivalPlus plugin, SitListener sitListener) {
|
||||
this.plugin = plugin;
|
||||
this.sitListener = sitListener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (!(sender instanceof Player)) {
|
||||
sender.sendMessage(plugin.getLangConfig().getString("player-only", "§cDieser Befehl ist nur für Spieler!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
Player player = (Player) sender;
|
||||
FileConfiguration lang = plugin.getLangConfig();
|
||||
|
||||
if (!player.hasPermission("survivalplus.sit")) {
|
||||
player.sendMessage(lang.getString("no-permission", "§cDu hast keine Berechtigung für diesen Befehl!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.length != 0) {
|
||||
player.sendMessage(lang.getString("sit.usage", "§cVerwendung: /sit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// Prüfe, ob der Spieler bereits sitzt
|
||||
if (sitListener.isSitting(player)) {
|
||||
sitListener.standUp(player);
|
||||
player.sendMessage(lang.getString("sit.stand-up", "§aDu bist aufgestanden!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// Setze den Spieler direkt auf dem Block
|
||||
Location location = player.getLocation();
|
||||
location.setY(location.getBlockY()); // Direkt auf dem Block (keine Y-Verschiebung)
|
||||
sitListener.sitPlayer(player, location);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
package de.viper.survivalplus.commands;
|
||||
|
||||
import de.viper.survivalplus.SurvivalPlus;
|
||||
import de.viper.survivalplus.listeners.SitListener;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.command.Command;
|
||||
import org.bukkit.command.CommandExecutor;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
|
||||
public class SitCommand implements CommandExecutor {
|
||||
private final SurvivalPlus plugin;
|
||||
private final SitListener sitListener;
|
||||
|
||||
public SitCommand(SurvivalPlus plugin, SitListener sitListener) {
|
||||
this.plugin = plugin;
|
||||
this.sitListener = sitListener;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
|
||||
if (!(sender instanceof Player)) {
|
||||
sender.sendMessage(plugin.getLangConfig().getString("player-only", "§cDieser Befehl ist nur für Spieler!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
Player player = (Player) sender;
|
||||
FileConfiguration lang = plugin.getLangConfig();
|
||||
|
||||
if (!player.hasPermission("survivalplus.sit")) {
|
||||
player.sendMessage(lang.getString("no-permission", "§cDu hast keine Berechtigung für diesen Befehl!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
if (args.length != 0) {
|
||||
player.sendMessage(lang.getString("sit.usage", "§cVerwendung: /sit"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// Prüfe, ob der Spieler bereits sitzt
|
||||
if (sitListener.isSitting(player)) {
|
||||
sitListener.standUp(player);
|
||||
player.sendMessage(lang.getString("sit.stand-up", "§aDu bist aufgestanden!"));
|
||||
return true;
|
||||
}
|
||||
|
||||
// Setze den Spieler mittig auf den Block und leicht oberhalb (Fix)
|
||||
Location location = player.getLocation();
|
||||
location.setX(location.getBlockX() + 0.5);
|
||||
location.setY(location.getBlockY() + 0.25);
|
||||
location.setZ(location.getBlockZ() + 0.5);
|
||||
|
||||
sitListener.sitPlayer(player, location);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
@@ -1,120 +1,120 @@
|
||||
package de.viper.survivalplus.listeners;
|
||||
|
||||
import de.viper.survivalplus.SurvivalPlus;
|
||||
import de.viper.survivalplus.tasks.AFKManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.*;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
public class AFKListener implements Listener {
|
||||
|
||||
private final SurvivalPlus plugin;
|
||||
private AFKManager afkManager;
|
||||
private boolean afkEnabled;
|
||||
private FileConfiguration config;
|
||||
|
||||
private BukkitRunnable afkTask;
|
||||
|
||||
public AFKListener(SurvivalPlus plugin) {
|
||||
this.plugin = plugin;
|
||||
this.config = plugin.getConfig();
|
||||
loadSettings();
|
||||
|
||||
if (afkEnabled) {
|
||||
startTask();
|
||||
}
|
||||
}
|
||||
|
||||
private void loadSettings() {
|
||||
this.afkEnabled = config.getBoolean("afk.enabled", true);
|
||||
|
||||
long afkAfter = config.getLong("afk.afk-after-seconds", 300);
|
||||
long kickAfter = config.getLong("afk.kick-after-seconds", 0);
|
||||
this.afkManager = new AFKManager(plugin, afkAfter, kickAfter);
|
||||
}
|
||||
|
||||
private void startTask() {
|
||||
if (afkTask != null) {
|
||||
afkTask.cancel();
|
||||
}
|
||||
afkTask = new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
afkManager.checkAFKStatus(player);
|
||||
}
|
||||
}
|
||||
};
|
||||
afkTask.runTaskTimer(plugin, 20L, 100L);
|
||||
}
|
||||
|
||||
private void handleActivity(Player player) {
|
||||
if (!afkEnabled) return;
|
||||
|
||||
afkManager.updateActivity(player);
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onMove(PlayerMoveEvent event) {
|
||||
if (!event.getFrom().toVector().equals(event.getTo().toVector())) {
|
||||
handleActivity(event.getPlayer());
|
||||
}
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onChat(AsyncPlayerChatEvent event) {
|
||||
handleActivity(event.getPlayer());
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onInteract(PlayerInteractEvent event) {
|
||||
handleActivity(event.getPlayer());
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onInventoryClick(InventoryClickEvent event) {
|
||||
if (event.getWhoClicked() instanceof Player player) {
|
||||
handleActivity(player);
|
||||
}
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onBlockPlace(BlockPlaceEvent event) {
|
||||
handleActivity(event.getPlayer());
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onBlockBreak(BlockBreakEvent event) {
|
||||
handleActivity(event.getPlayer());
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onJoin(PlayerJoinEvent event) {
|
||||
afkManager.updateActivity(event.getPlayer());
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onQuit(PlayerQuitEvent event) {
|
||||
afkManager.reset(event.getPlayer());
|
||||
}
|
||||
|
||||
public void reloadConfig(FileConfiguration config) {
|
||||
this.config = config;
|
||||
loadSettings();
|
||||
|
||||
if (afkTask != null) {
|
||||
afkTask.cancel();
|
||||
afkTask = null;
|
||||
}
|
||||
|
||||
if (afkEnabled) {
|
||||
startTask();
|
||||
}
|
||||
}
|
||||
}
|
||||
package de.viper.survivalplus.listeners;
|
||||
|
||||
import de.viper.survivalplus.SurvivalPlus;
|
||||
import de.viper.survivalplus.tasks.AFKManager;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.*;
|
||||
import org.bukkit.event.block.BlockBreakEvent;
|
||||
import org.bukkit.event.block.BlockPlaceEvent;
|
||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
public class AFKListener implements Listener {
|
||||
|
||||
private final SurvivalPlus plugin;
|
||||
private AFKManager afkManager;
|
||||
private boolean afkEnabled;
|
||||
private FileConfiguration config;
|
||||
|
||||
private BukkitRunnable afkTask;
|
||||
|
||||
public AFKListener(SurvivalPlus plugin) {
|
||||
this.plugin = plugin;
|
||||
this.config = plugin.getConfig();
|
||||
loadSettings();
|
||||
|
||||
if (afkEnabled) {
|
||||
startTask();
|
||||
}
|
||||
}
|
||||
|
||||
private void loadSettings() {
|
||||
this.afkEnabled = config.getBoolean("afk.enabled", true);
|
||||
|
||||
long afkAfter = config.getLong("afk.afk-after-seconds", 300);
|
||||
long kickAfter = config.getLong("afk.kick-after-seconds", 0);
|
||||
this.afkManager = new AFKManager(plugin, afkAfter, kickAfter);
|
||||
}
|
||||
|
||||
private void startTask() {
|
||||
if (afkTask != null) {
|
||||
afkTask.cancel();
|
||||
}
|
||||
afkTask = new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
for (Player player : Bukkit.getOnlinePlayers()) {
|
||||
afkManager.checkAFKStatus(player);
|
||||
}
|
||||
}
|
||||
};
|
||||
afkTask.runTaskTimer(plugin, 60L, 100L); // Start nach 3 Sekunden (60 Ticks), dann alle 5 Sekunden (100 Ticks)
|
||||
}
|
||||
|
||||
private void handleActivity(Player player) {
|
||||
if (!afkEnabled) return;
|
||||
|
||||
afkManager.updateActivity(player);
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onMove(PlayerMoveEvent event) {
|
||||
if (!event.getFrom().toVector().equals(event.getTo().toVector())) {
|
||||
handleActivity(event.getPlayer());
|
||||
}
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onChat(AsyncPlayerChatEvent event) {
|
||||
handleActivity(event.getPlayer());
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onInteract(PlayerInteractEvent event) {
|
||||
handleActivity(event.getPlayer());
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onInventoryClick(InventoryClickEvent event) {
|
||||
if (event.getWhoClicked() instanceof Player player) {
|
||||
handleActivity(player);
|
||||
}
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onBlockPlace(BlockPlaceEvent event) {
|
||||
handleActivity(event.getPlayer());
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onBlockBreak(BlockBreakEvent event) {
|
||||
handleActivity(event.getPlayer());
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onJoin(PlayerJoinEvent event) {
|
||||
afkManager.updateActivity(event.getPlayer());
|
||||
}
|
||||
|
||||
@org.bukkit.event.EventHandler
|
||||
public void onQuit(PlayerQuitEvent event) {
|
||||
afkManager.reset(event.getPlayer());
|
||||
}
|
||||
|
||||
public void reloadConfig(FileConfiguration config) {
|
||||
this.config = config;
|
||||
loadSettings();
|
||||
|
||||
if (afkTask != null) {
|
||||
afkTask.cancel();
|
||||
afkTask = null;
|
||||
}
|
||||
|
||||
if (afkEnabled) {
|
||||
startTask();
|
||||
}
|
||||
}
|
||||
}
|
@@ -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)
|
||||
);
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -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);
|
||||
}
|
||||
}
|
@@ -1,128 +1,128 @@
|
||||
package de.viper.survivalplus.listeners;
|
||||
|
||||
import de.viper.survivalplus.SurvivalPlus;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.ArmorStand;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.event.block.Action;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class SitListener implements Listener {
|
||||
private final SurvivalPlus plugin;
|
||||
private final Map<UUID, ArmorStand> sittingPlayers = new HashMap<>();
|
||||
|
||||
public SitListener(SurvivalPlus plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
public boolean isSitting(Player player) {
|
||||
return sittingPlayers.containsKey(player.getUniqueId());
|
||||
}
|
||||
|
||||
public void sitPlayer(Player player, Location location) {
|
||||
if (sittingPlayers.containsKey(player.getUniqueId())) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Erstelle einen unsichtbaren ArmorStand als Sitz
|
||||
ArmorStand armorStand = player.getWorld().spawn(location, ArmorStand.class);
|
||||
armorStand.setGravity(false);
|
||||
armorStand.setMarker(true);
|
||||
armorStand.setInvisible(true);
|
||||
armorStand.setInvulnerable(true);
|
||||
armorStand.addPassenger(player);
|
||||
|
||||
sittingPlayers.put(player.getUniqueId(), armorStand);
|
||||
FileConfiguration lang = plugin.getLangConfig();
|
||||
player.sendMessage(lang.getString("sit.success", "§aDu hast dich hingesetzt!"));
|
||||
plugin.getLogger().log(Level.FINE, "Spieler " + player.getName() + " sitzt bei " + locationToString(location));
|
||||
}
|
||||
|
||||
public void standUp(Player player) {
|
||||
UUID playerId = player.getUniqueId();
|
||||
ArmorStand armorStand = sittingPlayers.remove(playerId);
|
||||
if (armorStand != null) {
|
||||
armorStand.remove();
|
||||
FileConfiguration lang = plugin.getLangConfig();
|
||||
player.sendMessage(lang.getString("sit.stand-up", "§aDu bist aufgestanden!"));
|
||||
plugin.getLogger().log(Level.FINE, "Spieler " + player.getName() + " ist aufgestanden");
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if (event.getHand() != EquipmentSlot.HAND || event.getAction() != Action.RIGHT_CLICK_BLOCK) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = event.getPlayer();
|
||||
FileConfiguration lang = plugin.getLangConfig();
|
||||
|
||||
if (!player.hasPermission("survivalplus.sit")) {
|
||||
player.sendMessage(lang.getString("no-permission", "§cDu hast keine Berechtigung für diesen Befehl!"));
|
||||
return;
|
||||
}
|
||||
|
||||
Block block = event.getClickedBlock();
|
||||
if (block == null || !isStair(block.getType())) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Wenn der Spieler bereits sitzt, stehe auf
|
||||
if (sittingPlayers.containsKey(player.getUniqueId())) {
|
||||
standUp(player);
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
// Setze den Spieler genau auf der Treppenstufe
|
||||
Location location = block.getLocation();
|
||||
location.setX(location.getX() + 0.5);
|
||||
location.setY(location.getY() + 0.5); // Genau auf der Treppenstufe (halbe Blockhöhe)
|
||||
location.setZ(location.getZ() + 0.5);
|
||||
sitPlayer(player, location);
|
||||
event.setCancelled(true); // Verhindere andere Interaktionen mit der Treppe
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerMove(PlayerMoveEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
UUID playerId = player.getUniqueId();
|
||||
if (!sittingPlayers.containsKey(playerId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Prüfe, ob der Spieler sich bewegt hat (nur Positionsänderung, nicht Kopfbewegung)
|
||||
Location from = event.getFrom();
|
||||
Location to = event.getTo();
|
||||
if (from.getX() != to.getX() || from.getY() != to.getY() || from.getZ() != to.getZ()) {
|
||||
standUp(player);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
standUp(player);
|
||||
}
|
||||
|
||||
private boolean isStair(Material material) {
|
||||
return material.name().endsWith("_STAIRS");
|
||||
}
|
||||
|
||||
private String locationToString(Location loc) {
|
||||
return String.format("x=%.2f, y=%.2f, z=%.2f, world=%s", loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName());
|
||||
}
|
||||
}
|
||||
package de.viper.survivalplus.listeners;
|
||||
|
||||
import de.viper.survivalplus.SurvivalPlus;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.Block;
|
||||
import org.bukkit.entity.ArmorStand;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.EventHandler;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerMoveEvent;
|
||||
import org.bukkit.event.player.PlayerQuitEvent;
|
||||
import org.bukkit.configuration.file.FileConfiguration;
|
||||
import org.bukkit.inventory.EquipmentSlot;
|
||||
import org.bukkit.event.block.Action;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.logging.Level;
|
||||
|
||||
public class SitListener implements Listener {
|
||||
private final SurvivalPlus plugin;
|
||||
private final Map<UUID, ArmorStand> sittingPlayers = new HashMap<>();
|
||||
|
||||
public SitListener(SurvivalPlus plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
public boolean isSitting(Player player) {
|
||||
return sittingPlayers.containsKey(player.getUniqueId());
|
||||
}
|
||||
|
||||
public void sitPlayer(Player player, Location location) {
|
||||
if (sittingPlayers.containsKey(player.getUniqueId())) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Erstelle einen unsichtbaren ArmorStand als Sitz
|
||||
ArmorStand armorStand = player.getWorld().spawn(location, ArmorStand.class);
|
||||
armorStand.setGravity(false);
|
||||
armorStand.setMarker(true);
|
||||
armorStand.setInvisible(true);
|
||||
armorStand.setInvulnerable(true);
|
||||
armorStand.addPassenger(player);
|
||||
|
||||
sittingPlayers.put(player.getUniqueId(), armorStand);
|
||||
FileConfiguration lang = plugin.getLangConfig();
|
||||
player.sendMessage(lang.getString("sit.success", "§aDu hast dich hingesetzt!"));
|
||||
plugin.getLogger().log(Level.FINE, "Spieler " + player.getName() + " sitzt bei " + locationToString(location));
|
||||
}
|
||||
|
||||
public void standUp(Player player) {
|
||||
UUID playerId = player.getUniqueId();
|
||||
ArmorStand armorStand = sittingPlayers.remove(playerId);
|
||||
if (armorStand != null) {
|
||||
armorStand.remove();
|
||||
FileConfiguration lang = plugin.getLangConfig();
|
||||
player.sendMessage(lang.getString("sit.stand-up", "§aDu bist aufgestanden!"));
|
||||
plugin.getLogger().log(Level.FINE, "Spieler " + player.getName() + " ist aufgestanden");
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerInteract(PlayerInteractEvent event) {
|
||||
if (event.getHand() != EquipmentSlot.HAND || event.getAction() != Action.RIGHT_CLICK_BLOCK) {
|
||||
return;
|
||||
}
|
||||
|
||||
Player player = event.getPlayer();
|
||||
FileConfiguration lang = plugin.getLangConfig();
|
||||
|
||||
if (!player.hasPermission("survivalplus.sit")) {
|
||||
player.sendMessage(lang.getString("no-permission", "§cDu hast keine Berechtigung für diesen Befehl!"));
|
||||
return;
|
||||
}
|
||||
|
||||
Block block = event.getClickedBlock();
|
||||
if (block == null || !isStair(block.getType())) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Wenn der Spieler bereits sitzt, stehe auf
|
||||
if (sittingPlayers.containsKey(player.getUniqueId())) {
|
||||
standUp(player);
|
||||
event.setCancelled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
// Setze den Spieler genau auf der Treppenstufe
|
||||
Location location = block.getLocation();
|
||||
location.setX(location.getX() + 0.5);
|
||||
location.setY(location.getY() + 0.5); // Genau auf der Treppenstufe (halbe Blockhöhe)
|
||||
location.setZ(location.getZ() + 0.5);
|
||||
sitPlayer(player, location);
|
||||
event.setCancelled(true); // Verhindere andere Interaktionen mit der Treppe
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerMove(PlayerMoveEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
UUID playerId = player.getUniqueId();
|
||||
if (!sittingPlayers.containsKey(playerId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Prüfe, ob der Spieler sich bewegt hat (nur Positionsänderung, nicht Kopfbewegung)
|
||||
Location from = event.getFrom();
|
||||
Location to = event.getTo();
|
||||
if (from.getX() != to.getX() || from.getY() != to.getY() || from.getZ() != to.getZ()) {
|
||||
standUp(player);
|
||||
}
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
Player player = event.getPlayer();
|
||||
standUp(player);
|
||||
}
|
||||
|
||||
private boolean isStair(Material material) {
|
||||
return material.name().endsWith("_STAIRS");
|
||||
}
|
||||
|
||||
private String locationToString(Location loc) {
|
||||
return String.format("x=%.2f, y=%.2f, z=%.2f, world=%s", loc.getX(), loc.getY(), loc.getZ(), loc.getWorld().getName());
|
||||
}
|
||||
}
|
||||
|
@@ -1,46 +1,53 @@
|
||||
# Anzahl der erlaubten Homes für Member
|
||||
max-homes: 3
|
||||
|
||||
# Aktivieren oder Deaktivieren des automatischen Löschens von Items
|
||||
auto-clear-enabled: true
|
||||
# Intervall in Minuten für das automatische Löschen herumliegender Items
|
||||
auto-clear-interval-minutes: 15
|
||||
|
||||
# Zeit in Sekunden, nach der Gräber verschwinden (Standard: 30 Minuten)
|
||||
graves:
|
||||
despawn-time: 1800
|
||||
|
||||
# redstone Clock Detector
|
||||
redstone-clock-detector-enabled: true
|
||||
|
||||
# AFK Aktivieren/Deaktivieren (Wenn du kick-after-seconds auf 0 setzt, wird kein Spieler gekickt, nur AFK markiert.)
|
||||
afk:
|
||||
enabled: true
|
||||
# nach 5 Minuten Inaktivität als AFK markieren
|
||||
afk-after-seconds: 300
|
||||
# nach 15 Minuten wird Spieler gekickt
|
||||
kick-after-seconds: 900
|
||||
|
||||
# Nacht/Schlafmodus
|
||||
sleep:
|
||||
required-percentage: 50.0
|
||||
|
||||
# Mob-Leash-Limit
|
||||
mob-leash-limit:
|
||||
enabled: true
|
||||
max-leash-count: 5
|
||||
|
||||
# Mobcap-Begrenzung
|
||||
mob-cap:
|
||||
enabled: true
|
||||
max-animals-per-chunk: 10
|
||||
|
||||
# Spawn Schutz Radius
|
||||
spawnprotection:
|
||||
enabled: true
|
||||
radius: 40
|
||||
protect-block-break: true
|
||||
protect-block-place: true
|
||||
protect-pvp: true
|
||||
bypass-permission: survivalplus.spawnprotection.bypass
|
||||
|
||||
# Anzahl der erlaubten Homes für Member
|
||||
max-homes: 3
|
||||
|
||||
# Aktivieren oder Deaktivieren des automatischen Löschens von Items
|
||||
auto-clear-enabled: true
|
||||
# Intervall in Minuten für das automatische Löschen herumliegender Items
|
||||
auto-clear-interval-minutes: 15
|
||||
|
||||
# Zeit in Sekunden, nach der Gräber verschwinden (Standard: 30 Minuten)
|
||||
graves:
|
||||
despawn-time: 1800
|
||||
|
||||
# redstone Clock Detector
|
||||
redstone-clock-detector-enabled: true
|
||||
|
||||
# AFK Aktivieren/Deaktivieren (Wenn du kick-after-seconds auf 0 setzt, wird kein Spieler gekickt, nur AFK markiert.)
|
||||
afk:
|
||||
enabled: true
|
||||
# nach 5 Minuten Inaktivität als AFK markieren
|
||||
afk-after-seconds: 300
|
||||
# nach 15 Minuten wird Spieler gekickt
|
||||
kick-after-seconds: 900
|
||||
|
||||
# Nacht/Schlafmodus
|
||||
sleep:
|
||||
required-percentage: 50.0
|
||||
|
||||
# Mob-Leash-Limit
|
||||
mob-leash-limit:
|
||||
enabled: true
|
||||
max-leash-count: 5
|
||||
|
||||
# Mobcap-Begrenzung
|
||||
mob-cap:
|
||||
enabled: true
|
||||
max-animals-per-chunk: 10
|
||||
|
||||
# Spawn Schutz Radius
|
||||
spawnprotection:
|
||||
enabled: true
|
||||
radius: 40
|
||||
protect-block-break: true
|
||||
protect-block-place: true
|
||||
protect-pvp: true
|
||||
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"
|
||||
|
@@ -1,93 +1,92 @@
|
||||
header: "&6=== SurvivalPlus Hilfe ==="
|
||||
footer: "&6==========================="
|
||||
|
||||
commands:
|
||||
gm:
|
||||
description: "&eWechselt den Spielmodus (survival, creative, adventure, spectator)."
|
||||
usage: "&b/gm < survival | creative | adventure | spectator >"
|
||||
sp:
|
||||
description: "&eHauptbefehl für SurvivalPlus mit Unterbefehlen."
|
||||
usage: "&b/sp < reload | help >"
|
||||
sethome:
|
||||
description: "&eSetzt einen neuen Homepunkt."
|
||||
usage: "&b/sethome <name>"
|
||||
delhome:
|
||||
description: "&eLöscht einen Homepunkt."
|
||||
usage: "&b/delhome <name>"
|
||||
homelist:
|
||||
description: "&eZeigt alle deine Homes."
|
||||
usage: "&b/homelist"
|
||||
inv:
|
||||
description: "&eÖffnet dein Inventar."
|
||||
usage: "&b/inv"
|
||||
ec:
|
||||
description: "&eÖffnet deine Endertruhe."
|
||||
usage: "&b/ec"
|
||||
setspawn:
|
||||
description: "&eSetzt den Spawnpunkt der Welt."
|
||||
usage: "&b/setspawn"
|
||||
setworldspawn:
|
||||
description: "&eSetzt den globalen Weltspawnpunkt."
|
||||
usage: "&b/setworldspawn"
|
||||
clearchat:
|
||||
description: "&eLöscht den Chat für alle Spieler."
|
||||
usage: "&b/clearchat"
|
||||
clearitems:
|
||||
description: "&eEntfernt alle Items auf dem Boden."
|
||||
usage: "&b/clearitems"
|
||||
closedoors:
|
||||
description: "&eSchließt alle Türen in der Nähe."
|
||||
usage: "&b/closedoors"
|
||||
sit:
|
||||
description: "&eSetzt dich hin oder steht wieder auf."
|
||||
usage: "&b/sit"
|
||||
back:
|
||||
description: "&eTeleportiert dich zurück zum letzten Ort."
|
||||
usage: "&b/back"
|
||||
friend:
|
||||
description: "&eVerwalte Freunde (add, remove, list)."
|
||||
usage: "&b/friend < add | remove | list > [Spieler]"
|
||||
ir:
|
||||
description: "&eBenennt Items um."
|
||||
usage: "&b/ir <Name>"
|
||||
showarmorstands:
|
||||
description: "&eZeigt Debug ArmorStands an."
|
||||
usage: "&b/showarmorstands"
|
||||
cleardebugarmorstands:
|
||||
description: "&eLöscht alle Debug ArmorStands."
|
||||
usage: "&b/cleardebugarmorstands"
|
||||
trash:
|
||||
description: "&eÖffnet den Müll."
|
||||
usage: "&b/trash"
|
||||
workbench:
|
||||
description: "&eÖffnet eine Werkbank GUI."
|
||||
usage: "&b/workbench"
|
||||
anvil:
|
||||
description: "&eÖffnet eine Amboss GUI."
|
||||
usage: "&b/anvil"
|
||||
stats:
|
||||
description: "&eZeigt deine persönlichen Statistiken an."
|
||||
usage: "&b/stats"
|
||||
lock:
|
||||
description: "&eSchützt Container mit dem LockSystem."
|
||||
usage: "&b/lock < lock | unlock | info >"
|
||||
|
||||
tp:
|
||||
description: "&eTeleportiert dich zu einem anderen Spieler."
|
||||
usage: "&b/tp <Spieler>"
|
||||
tphere:
|
||||
description: "&eTeleportiert einen Spieler zu dir."
|
||||
usage: "&b/tphere <Spieler>"
|
||||
tpa:
|
||||
description: "&eSendet eine Teleport-Anfrage an einen Spieler."
|
||||
usage: "&b/tpa <Spieler>"
|
||||
tpaccept:
|
||||
description: "&eAkzeptiert eine Teleport-Anfrage."
|
||||
usage: "&b/tpaccept"
|
||||
tpdeny:
|
||||
description: "&eLehnt eine Teleport-Anfrage ab."
|
||||
usage: "&b/tpdeny"
|
||||
|
||||
messages:
|
||||
header: "&6=== Befehle ==="
|
||||
footer: "&6================"
|
||||
header: "&6=== SurvivalPlus Hilfe ==="
|
||||
footer: "&6==========================="
|
||||
|
||||
commands:
|
||||
gm:
|
||||
description: "&eWechselt den Spielmodus (survival, creative, adventure, spectator)."
|
||||
usage: "&b/gm <survival | creative | adventure | spectator>"
|
||||
sp:
|
||||
description: "&eHauptbefehl für SurvivalPlus mit Unterbefehlen."
|
||||
usage: "&b/sp <reload | help | info>"
|
||||
sethome:
|
||||
description: "&eSetzt einen neuen Homepunkt."
|
||||
usage: "&b/sethome <name>"
|
||||
delhome:
|
||||
description: "&eLöscht einen Homepunkt."
|
||||
usage: "&b/delhome <name>"
|
||||
homelist:
|
||||
description: "&eZeigt alle deine Homes."
|
||||
usage: "&b/homelist"
|
||||
inv:
|
||||
description: "&eÖffnet dein Inventar."
|
||||
usage: "&b/inv"
|
||||
ec:
|
||||
description: "&eÖffnet deine Endertruhe."
|
||||
usage: "&b/ec"
|
||||
setspawn:
|
||||
description: "&eSetzt den Spawnpunkt der Welt."
|
||||
usage: "&b/setspawn"
|
||||
setworldspawn:
|
||||
description: "&eSetzt den globalen Weltspawnpunkt."
|
||||
usage: "&b/setworldspawn"
|
||||
clearchat:
|
||||
description: "&eLöscht den Chat für alle Spieler."
|
||||
usage: "&b/clearchat"
|
||||
clearitems:
|
||||
description: "&eEntfernt alle Items auf dem Boden."
|
||||
usage: "&b/clearitems"
|
||||
closedoors:
|
||||
description: "&eSchließt alle Türen in der Nähe."
|
||||
usage: "&b/closedoors"
|
||||
sit:
|
||||
description: "&eSetzt dich hin oder steht wieder auf."
|
||||
usage: "&b/sit"
|
||||
back:
|
||||
description: "&eTeleportiert dich zurück zum letzten Ort."
|
||||
usage: "&b/back"
|
||||
friend:
|
||||
description: "&eVerwalte deine Freundesliste (hinzufügen, entfernen, anzeigen, teleportieren). Unterstützt anklickbare Anfragen und Bestätigungen."
|
||||
usage: "&b/friend <add | accept | deny | list | del | confirm | tp> [Spieler]"
|
||||
ir:
|
||||
description: "&eBenennt Items um."
|
||||
usage: "&b/ir <Name>"
|
||||
showarmorstands:
|
||||
description: "&eZeigt Debug ArmorStands an."
|
||||
usage: "&b/showarmorstands"
|
||||
cleardebugarmorstands:
|
||||
description: "&eLöscht alle Debug ArmorStands."
|
||||
usage: "&b/cleardebugarmorstands"
|
||||
trash:
|
||||
description: "&eÖffnet den Müll."
|
||||
usage: "&b/trash"
|
||||
workbench:
|
||||
description: "&eÖffnet eine Werkbank GUI."
|
||||
usage: "&b/workbench"
|
||||
anvil:
|
||||
description: "&eÖffnet eine Amboss GUI."
|
||||
usage: "&b/anvil"
|
||||
stats:
|
||||
description: "&eZeigt deine persönlichen Statistiken an."
|
||||
usage: "&b/stats"
|
||||
lock:
|
||||
description: "&eSchützt Container mit dem LockSystem."
|
||||
usage: "&b/lock <lock | unlock | info>"
|
||||
tp:
|
||||
description: "&eTeleportiert dich zu einem anderen Spieler."
|
||||
usage: "&b/tp <Spieler>"
|
||||
tphere:
|
||||
description: "&eTeleportiert einen Spieler zu dir."
|
||||
usage: "&b/tphere <Spieler>"
|
||||
tpa:
|
||||
description: "&eSendet eine Teleport-Anfrage an einen Spieler."
|
||||
usage: "&b/tpa <Spieler>"
|
||||
tpaccept:
|
||||
description: "&eAkzeptiert eine Teleport-Anfrage."
|
||||
usage: "&b/tpaccept"
|
||||
tpdeny:
|
||||
description: "&eLehnt eine Teleport-Anfrage ab."
|
||||
usage: "&b/tpdeny"
|
||||
|
||||
messages:
|
||||
header: "&6=== Befehle ==="
|
||||
footer: "&6================"
|
@@ -1,241 +1,304 @@
|
||||
sp:
|
||||
no-permission: "§cDu hast keine Berechtigung für diesen Befehl!"
|
||||
plugin.reloaded: "§aSurvivalPlus wurde erfolgreich neu geladen!"
|
||||
sp.invalid-subcommand: "§cUngültiger Unterbefehl! Verwendung: /sp [reload | help]"
|
||||
sp.help-not-found: "§cHilfedatei (help.yml) konnte nicht geladen werden!"
|
||||
|
||||
plugin:
|
||||
enabled: "&aSurvivalPlus wurde erfolgreich aktiviert!"
|
||||
reloaded: "&aSurvivalPlus wurde erfolgreich neu geladen!"
|
||||
disabled: "&cSurvivalPlus wurde deaktiviert."
|
||||
info: "&6SurvivalPlus Plugin-Info: Version %version%"
|
||||
|
||||
no-permission: "§cDu hast keine Berechtigung für diesen Befehl!"
|
||||
no-permission-others: "§cDu hast keine Berechtigung, den Spielmodus anderer Spieler zu ändern!"
|
||||
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!"
|
||||
player-not-found: "§cSpieler nicht gefunden!"
|
||||
player-only: "§cDieser Befehl ist nur für Spieler!"
|
||||
|
||||
autoclear:
|
||||
cleared: "&c&l%count% Items wurden automatisch gelöscht."
|
||||
warning: "&e&lAchtung! &rIn 10 Sekunden werden alle Items gelöscht!"
|
||||
|
||||
clearchat:
|
||||
cleared: "§aDer Chat wurde erfolgreich gelöscht."
|
||||
no-permission: "§cDu hast keine Rechte, den Chat zu löschen."
|
||||
|
||||
clearitems:
|
||||
no-permission: "§cDu hast keine Rechte, Items zu löschen."
|
||||
|
||||
closedoors:
|
||||
invalidradius: "Der Radius muss eine gültige positive Zahl sein!"
|
||||
noplayer: "Nur Spieler können diesen Befehl nutzen!"
|
||||
nopermission: "Dafür hast du keine Rechte!"
|
||||
success: "Es wurden %count% Türen geschlossen."
|
||||
usage: "Benutzung: /closedoors <radius>"
|
||||
|
||||
delhome:
|
||||
not-found: "§cDieses Home existiert nicht!"
|
||||
success: "§aHome %name% wurde gelöscht!"
|
||||
usage: "§cVerwendung: /delhome <name>"
|
||||
|
||||
enderchest:
|
||||
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 "
|
||||
load-error: "§cFehler beim Laden der Enderchest: %error%"
|
||||
opened: "§aEnderchest von %player% geöffnet!"
|
||||
usage: "§cVerwendung: /ec [spieler]"
|
||||
|
||||
gamemode:
|
||||
adventure: "Abenteuer"
|
||||
changed-other: "§aSpielmodus von %player% zu %mode% geändert!"
|
||||
changed-self: "§aDein Spielmodus wurde zu %mode% geändert!"
|
||||
creative: "Kreativ"
|
||||
invalid-gamemode: "§cUngültiger Spielmodus! Verwende 0, 1, 2 oder 3"
|
||||
spectator: "Zuschauer"
|
||||
survival: "Überleben"
|
||||
usage: "§cVerwendung: /gm <0|1|2|3> [spieler]"
|
||||
|
||||
homelist:
|
||||
gui-title: "Deine Homes"
|
||||
home-deleted: "§cDieses Home existiert nicht mehr!"
|
||||
no-homes: "§cDu hast keine Homes gesetzt!"
|
||||
teleported: "§aZum Home %name% teleportiert!"
|
||||
|
||||
inventory:
|
||||
data-not-found: "§cDie Inventardaten des Spielers konnten nicht gefunden werden! Der Spieler war möglicherweise nie auf diesem Server."
|
||||
gui-title: "Inventar von "
|
||||
load-error: "§cFehler beim Laden des Inventars: %error%"
|
||||
opened: "§aInventar von %player% geöffnet!"
|
||||
usage: "§cVerwendung: /inv <spieler>"
|
||||
|
||||
sethome:
|
||||
already-exists: "§cEin Home mit diesem Namen existiert bereits!"
|
||||
invalid-name: "§cDer Home-Name darf nur Buchstaben, Zahlen und Unterstriche enthalten!"
|
||||
limit-reached: "§cDu hast die maximale Anzahl an Homes erreicht!"
|
||||
success: "§aHome %name% wurde gesetzt!"
|
||||
usage: "§cVerwendung: /sethome <name>"
|
||||
|
||||
setspawn:
|
||||
no-permission: "§cDu hast keine Berechtigung, den Spawnpunkt zu setzen!"
|
||||
success: "§aSpawnpunkt wurde erfolgreich gesetzt!"
|
||||
|
||||
setworldspawn:
|
||||
no-permission: "§cDu hast keine Berechtigung, den Weltspawn zu setzen!"
|
||||
success: "§aWeltspawn wurde erfolgreich gesetzt!"
|
||||
|
||||
sit:
|
||||
stand-up: "§aDu bist aufgestanden!"
|
||||
success: "§aDu hast dich hingesetzt!"
|
||||
usage: "§cVerwendung: /sit"
|
||||
|
||||
graves:
|
||||
created: "§aDein Grab wurde bei x=%.2f, y=%.2f, z=%.2f erstellt!"
|
||||
despawned: "§cDein Grab bei x=%.2f, y=%.2f, z=%.2f ist verschwunden!"
|
||||
access-denied: "§cNur der Eigentümer kann dieses Grab öffnen!"
|
||||
|
||||
back:
|
||||
usage: "§cVerwendung: /back"
|
||||
no-death-point: "§cDu hast keinen Todespunkt!"
|
||||
success: "§aTeleportiert zum Todespunkt bei x=%.2f, y=%.2f, z=%.2f!"
|
||||
|
||||
msg:
|
||||
description: "Sende eine private Nachricht an einen Spieler."
|
||||
usage: "/msg <Spieler> <Nachricht>"
|
||||
|
||||
r:
|
||||
description: "Antworte auf die letzte private Nachricht."
|
||||
usage: "/r <Nachricht>"
|
||||
|
||||
pm:
|
||||
description: "Schalte private Nachrichten an oder aus."
|
||||
usage: "/pm toggle"
|
||||
|
||||
backpack:
|
||||
name: "&eRucksack"
|
||||
inventory-title: "&eDein Rucksack"
|
||||
|
||||
friend:
|
||||
error:
|
||||
player-only: "&cDieser Befehl ist nur für Spieler!"
|
||||
player-not-found: "&cSpieler %s nicht gefunden!"
|
||||
self: "&cDu kannst dich nicht selbst hinzufügen!"
|
||||
already-friends: "&cDu bist bereits mit %s befreundet!"
|
||||
request-pending: "&cDu hast bereits eine Anfrage an %s gesendet!"
|
||||
no-request: "&cKeine Anfrage von %s gefunden!"
|
||||
not-friends: "&c%s ist nicht in deiner Freundesliste!"
|
||||
different-world: "&cIhr müsst in derselben Welt sein, um zu teleportieren!"
|
||||
add-usage: "&cVerwendung: /friend add <Spielername>"
|
||||
accept-usage: "&cVerwendung: /friend accept <Spielername>"
|
||||
deny-usage: "&cVerwendung: /friend deny <Spielername>"
|
||||
list-usage: "&cVerwendung: /friend list"
|
||||
del-usage: "&cVerwendung: /friend del <Spielername>"
|
||||
tp-usage: "&cVerwendung: /friend tp <Spielername>"
|
||||
|
||||
ir:
|
||||
only-player: "&cDieser Befehl kann nur von Spielern ausgeführt werden."
|
||||
no-permission: "&cDu hast keine Berechtigung, diesen Befehl zu benutzen."
|
||||
no-name: "&cBitte gib einen neuen Namen an."
|
||||
usage: "&eBenutze: /ir <NeuerName>"
|
||||
no-item: "&cDu hältst kein Item in der Hand."
|
||||
cant-rename: "&cDieses Item kann nicht umbenannt werden."
|
||||
success: "&aDas Item wurde erfolgreich in {name} umbenannt!"
|
||||
|
||||
afk:
|
||||
set: "&7Du bist jetzt AFK."
|
||||
unset: "&7Du bist nicht mehr AFK."
|
||||
|
||||
sleep:
|
||||
skipped: "&aDie Nacht wurde übersprungen! (%sleeping% von %total% Spielern haben geschlafen)"
|
||||
progress: "&e%sleeping%/%total% Spielern schlafen... (%required%% benötigt zum Überspringen der Nacht)"
|
||||
|
||||
orealarm:
|
||||
message: "§c[Erz-Alarm] Spieler §e%player% §chat in %seconds% Sekunden ungewöhnlich viele %ore% abgebaut: §e%count%"
|
||||
|
||||
stats:
|
||||
only_player: "&cDieser Befehl kann nur von Spielern ausgeführt werden."
|
||||
no_stats: "&eDu hast noch keine Statistiken!"
|
||||
header: "&6=== Spielerstatistiken von &e{player} &6==="
|
||||
playtime: "&fSpielzeit: &b{time}"
|
||||
kills: "&fKills: &a{kills}"
|
||||
deaths: "&fTode: &c{deaths}"
|
||||
blocks_placed: "&fBlöcke platziert: &e{placed}"
|
||||
blocks_broken: "&fBlöcke abgebaut: &e{broken}"
|
||||
|
||||
welcome:
|
||||
first-join-message: "&aWillkommen auf dem Server, &e{player}&a! Viel Spaß!"
|
||||
welcome.first-join-sound: ENTITY_FIREWORK_ROCKET_LAUNCH
|
||||
welcome.first-join-sound-volume: 1.0
|
||||
welcome.first-join-sound-pitch: 1.0
|
||||
|
||||
return-message: "&6Willkommen zurück, &e{player}&6!"
|
||||
welcome.return-sound: ENTITY_FIREWORK_ROCKET_BLAST
|
||||
welcome.return-sound-volume: 1.0
|
||||
welcome.return-sound-pitch: 1.0
|
||||
|
||||
mob-leash-limit:
|
||||
max-reached: "§cDu hast das maximale Leinen-Limit von §e%count%§c erreicht!"
|
||||
leashed: "§aTier angeleint. Du hast jetzt §e%count%§a geleinte Tiere."
|
||||
unleashed: "§aTier abgeleint. Du hast jetzt §e%count%§a geleinte Tiere."
|
||||
entity-died: "§cEin angeleintes Tier ist gestorben. Du hast jetzt §e%count%§c geleinte Tiere."
|
||||
|
||||
mob-cap:
|
||||
limit-reached: "&cZu viele Tiere in diesem Chunk! Maximal %max% Tiere erlaubt."
|
||||
animal-removed: "&cEin Tier wurde entfernt, da das Chunk-Limit von %max% erreicht wurde."
|
||||
|
||||
spawnprotection:
|
||||
blockbreak-denied: "&cDu kannst im Spawnbereich keine Blöcke abbauen."
|
||||
blockplace-denied: "&cDu kannst im Spawnbereich keine Blöcke platzieren."
|
||||
pvp-denied: "&cPvP ist im Spawnbereich deaktiviert."
|
||||
|
||||
lock:
|
||||
mode-start: "§aRechtsklicke jetzt auf eine Tür oder Kiste, um sie zu sperren!"
|
||||
mode-timeout: "§cDer Sperrmodus ist nach 30 Sekunden abgebrochen."
|
||||
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!"
|
||||
sp:
|
||||
no-permission: "§cDu hast keine Berechtigung für diesen Befehl!"
|
||||
plugin.reloaded: "§aSurvivalPlus wurde erfolgreich neu geladen!"
|
||||
invalid-subcommand: "§cUngültiger Unterbefehl! Verwendung: /sp [ reload | help | info ]"
|
||||
help-not-found: "§cHilfedatei (help.yml) konnte nicht geladen werden!"
|
||||
info:
|
||||
header: "§7===== SurvivalPlus Info ====="
|
||||
name: "§ePlugin-Name: §f"
|
||||
version: "§eVersion: §f"
|
||||
author: "§eErsteller: §f"
|
||||
description: "§eBeschreibung: §f"
|
||||
footer: "§7=========================="
|
||||
|
||||
plugin:
|
||||
enabled: "&aSurvivalPlus wurde erfolgreich aktiviert!"
|
||||
reloaded: "&aSurvivalPlus wurde erfolgreich neu geladen!"
|
||||
disabled: "&cSurvivalPlus wurde deaktiviert."
|
||||
info: "&6SurvivalPlus Plugin-Info: Version %version%"
|
||||
|
||||
no-permission: "§cDu hast keine Berechtigung für diesen Befehl!"
|
||||
no-permission-others: "§cDu hast keine Berechtigung, den Spielmodus anderer Spieler zu ändern!"
|
||||
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!"
|
||||
player-not-found: "§cSpieler nicht gefunden!"
|
||||
player-only: "§cDieser Befehl ist nur für Spieler!"
|
||||
|
||||
autoclear:
|
||||
cleared: "&c&l%count% Items wurden automatisch gelöscht."
|
||||
warning: "&e&lAchtung! &rIn 10 Sekunden werden alle Items gelöscht!"
|
||||
|
||||
clearchat:
|
||||
cleared: "§aDer Chat wurde erfolgreich gelöscht."
|
||||
no-permission: "§cDu hast keine Rechte, den Chat zu löschen."
|
||||
|
||||
clearitems:
|
||||
no-permission: "§cDu hast keine Rechte, Items zu löschen."
|
||||
|
||||
closedoors:
|
||||
invalidradius: "Der Radius muss eine gültige positive Zahl sein!"
|
||||
noplayer: "Nur Spieler können diesen Befehl nutzen!"
|
||||
nopermission: "Dafür hast du keine Rechte!"
|
||||
success: "Es wurden %count% Türen geschlossen."
|
||||
usage: "Benutzung: /closedoors <radius>"
|
||||
|
||||
delhome:
|
||||
not-found: "§cDieses Home existiert nicht!"
|
||||
success: "§aHome %name% wurde gelöscht!"
|
||||
usage: "§cVerwendung: /delhome <name>"
|
||||
|
||||
enderchest:
|
||||
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 "
|
||||
load-error: "§cFehler beim Laden der Enderchest: %error%"
|
||||
opened: "§aEnderchest von %player% geöffnet!"
|
||||
usage: "§cVerwendung: /ec [spieler]"
|
||||
|
||||
gamemode:
|
||||
adventure: "Abenteuer"
|
||||
changed-other: "§aSpielmodus von %player% zu %mode% geändert!"
|
||||
changed-self: "§aDein Spielmodus wurde zu %mode% geändert!"
|
||||
creative: "Kreativ"
|
||||
invalid-gamemode: "§cUngültiger Spielmodus! Verwende 0, 1, 2 oder 3"
|
||||
spectator: "Zuschauer"
|
||||
survival: "Überleben"
|
||||
usage: "§cVerwendung: /gm <0|1|2|3> [spieler]"
|
||||
|
||||
homelist:
|
||||
gui-title: "Deine Homes"
|
||||
home-deleted: "§cDieses Home existiert nicht mehr!"
|
||||
no-homes: "§cDu hast keine Homes gesetzt!"
|
||||
teleported: "§aZum Home %name% teleportiert!"
|
||||
|
||||
inventory:
|
||||
data-not-found: "§cDie Inventardaten des Spielers konnten nicht gefunden werden! Der Spieler war möglicherweise nie auf diesem Server."
|
||||
gui-title: "Inventar von "
|
||||
load-error: "§cFehler beim Laden des Inventars: %error%"
|
||||
opened: "§aInventar von %player% geöffnet!"
|
||||
usage: "§cVerwendung: /inv <spieler>"
|
||||
|
||||
sethome:
|
||||
already-exists: "§cEin Home mit diesem Namen existiert bereits!"
|
||||
invalid-name: "§cDer Home-Name darf nur Buchstaben, Zahlen und Unterstriche enthalten!"
|
||||
limit-reached: "§cDu hast die maximale Anzahl an Homes erreicht!"
|
||||
success: "§aHome %name% wurde gesetzt!"
|
||||
usage: "§cVerwendung: /sethome <name>"
|
||||
|
||||
setspawn:
|
||||
no-permission: "§cDu hast keine Berechtigung, den Spawnpunkt zu setzen!"
|
||||
success: "§aSpawnpunkt wurde erfolgreich gesetzt!"
|
||||
|
||||
setworldspawn:
|
||||
no-permission: "§cDu hast keine Berechtigung, den Weltspawn zu setzen!"
|
||||
success: "§aWeltspawn wurde erfolgreich gesetzt!"
|
||||
|
||||
sit:
|
||||
stand-up: "§aDu bist aufgestanden!"
|
||||
success: "§aDu hast dich hingesetzt!"
|
||||
usage: "§cVerwendung: /sit"
|
||||
|
||||
graves:
|
||||
created: "§aDein Grab wurde bei x=%.2f, y=%.2f, z=%.2f erstellt!"
|
||||
despawned: "§cDein Grab bei x=%.2f, y=%.2f, z=%.2f ist verschwunden!"
|
||||
access-denied: "§cNur der Eigentümer kann dieses Grab öffnen!"
|
||||
|
||||
back:
|
||||
usage: "§cVerwendung: /back"
|
||||
no-death-point: "§cDu hast keinen Todespunkt!"
|
||||
success: "§aTeleportiert zum Todespunkt bei x=%.2f, y=%.2f, z=%.2f!"
|
||||
|
||||
msg:
|
||||
description: "Sende eine private Nachricht an einen Spieler."
|
||||
usage: "/msg <Spieler> <Nachricht>"
|
||||
|
||||
r:
|
||||
description: "Antworte auf die letzte private Nachricht."
|
||||
usage: "/r <Nachricht>"
|
||||
|
||||
pm:
|
||||
description: "Schalte private Nachrichten an oder aus."
|
||||
usage: "/pm toggle"
|
||||
|
||||
backpack:
|
||||
name: "&eRucksack"
|
||||
inventory-title: "&eDein Rucksack"
|
||||
|
||||
friend:
|
||||
error:
|
||||
player-only: "&cDieser Befehl ist nur für Spieler!"
|
||||
player-not-found: "&cSpieler %s nicht gefunden!"
|
||||
self: "&cDu kannst dich nicht selbst hinzufügen!"
|
||||
already-friends: "&cDu bist bereits mit %s befreundet!"
|
||||
request-pending: "&cDu hast bereits eine Anfrage an %s gesendet!"
|
||||
no-request: "&cKeine Anfrage von %s gefunden!"
|
||||
not-friends: "&c%s ist nicht in deiner Freundesliste!"
|
||||
different-world: "&cIhr müsst in derselben Welt sein, um zu teleportieren!"
|
||||
add-usage: "&cVerwendung: /friend add <Spielername>"
|
||||
accept-usage: "&cVerwendung: /friend accept <Spielername>"
|
||||
deny-usage: "&cVerwendung: /friend deny <Spielername>"
|
||||
list-usage: "&cVerwendung: /friend list"
|
||||
del-usage: "&cVerwendung: /friend del <Spielername>"
|
||||
confirm-usage: "&cVerwendung: /friend confirm <Spielername>"
|
||||
tp-usage: "&cVerwendung: /friend tp <Spielername>"
|
||||
|
||||
add:
|
||||
sent: "&aFreundschaftsanfrage an %s gesendet!"
|
||||
received: "&aDu hast eine Freundschaftsanfrage von %s erhalten! "
|
||||
accept-button: "&a[Accept]"
|
||||
deny-button: "&c [Deny]"
|
||||
|
||||
accept:
|
||||
success: "&aDu bist jetzt mit %s befreundet!"
|
||||
notify: "&a%s hat deine Freundschaftsanfrage akzeptiert!"
|
||||
|
||||
deny:
|
||||
success: "&aFreundschaftsanfrage von %s abgelehnt."
|
||||
notify: "&c%s hat deine Freundschaftsanfrage abgelehnt."
|
||||
|
||||
list:
|
||||
header: "&6=== Deine Freundesliste ==="
|
||||
entry: "&e%s: %s"
|
||||
entry-offline: "&e%s: %s &7(Zuletzt online: %s)"
|
||||
online: "&aOnline"
|
||||
offline: "&7Offline"
|
||||
unknown: "&7Unbekannt"
|
||||
date-format: "dd.MM.yyyy HH:mm:ss"
|
||||
remove-button: "&c[X]"
|
||||
footer: "&6====================="
|
||||
|
||||
del:
|
||||
success: "&a%s wurde aus deiner Freundesliste entfernt."
|
||||
notify: "&c%s hat dich aus seiner Freundesliste entfernt."
|
||||
confirm: "&cMöchtest du %s wirklich aus deiner Freundesliste entfernen? "
|
||||
confirm-button: "&a[Confirm]"
|
||||
cancel-button: "&c[Cancel]"
|
||||
|
||||
tp:
|
||||
success: "&aDu wurdest zu %s teleportiert!"
|
||||
notify: "&a%s hat sich zu dir teleportiert."
|
||||
|
||||
join:
|
||||
notify: "&aDein Freund %s ist dem Server beigetreten."
|
||||
|
||||
ir:
|
||||
only-player: "&cDieser Befehl kann nur von Spielern ausgeführt werden."
|
||||
no-permission: "&cDu hast keine Berechtigung, diesen Befehl zu benutzen."
|
||||
no-name: "&cBitte gib einen neuen Namen an."
|
||||
usage: "&eBenutze: /ir <NeuerName>"
|
||||
no-item: "&cDu hältst kein Item in der Hand."
|
||||
cant-rename: "&cDieses Item kann nicht umbenannt werden."
|
||||
success: "&aDas Item wurde erfolgreich in {name} umbenannt!"
|
||||
|
||||
afk:
|
||||
set: "&7Du bist jetzt AFK."
|
||||
unset: "&7Du bist nicht mehr AFK."
|
||||
|
||||
sleep:
|
||||
skipped: "&aDie Nacht wurde übersprungen! (%sleeping% von %total% Spielern haben geschlafen)"
|
||||
progress: "&e%sleeping%/%total% Spielern schlafen... (%required%% benötigt zum Überspringen der Nacht)"
|
||||
|
||||
orealarm:
|
||||
message: "§c[Erz-Alarm] Spieler §e%player% §chat in %seconds% Sekunden ungewöhnlich viele %ore% abgebaut: §e%count%"
|
||||
|
||||
stats:
|
||||
only_player: "&cDieser Befehl kann nur von Spielern ausgeführt werden."
|
||||
no_stats: "&eDu hast noch keine Statistiken!"
|
||||
header: "&6=== Spielerstatistiken von &e{player} &6==="
|
||||
playtime: "&fSpielzeit: &b{time}"
|
||||
kills: "&fKills: &a{kills}"
|
||||
deaths: "&fTode: &c{deaths}"
|
||||
blocks_placed: "&fBlöcke platziert: &e{placed}"
|
||||
blocks_broken: "&fBlöcke abgebaut: &e{broken}"
|
||||
|
||||
welcome:
|
||||
first-join-message: "&aWillkommen auf dem Server, &e{player}&a! Viel Spaß!"
|
||||
welcome.first-join-sound: ENTITY_FIREWORK_ROCKET_LAUNCH
|
||||
welcome.first-join-sound-volume: 1.0
|
||||
welcome.first-join-sound-pitch: 1.0
|
||||
return-message: "&6Willkommen zurück, &e{player}&6!"
|
||||
welcome.return-sound: ENTITY_FIREWORK_ROCKET_BLAST
|
||||
welcome.return-sound-volume: 1.0
|
||||
welcome.return-sound-pitch: 1.0
|
||||
|
||||
mob-leash-limit:
|
||||
max-reached: "§cDu hast das maximale Leinen-Limit von §e%count%§c erreicht!"
|
||||
leashed: "§aTier angeleint. Du hast jetzt §e%count%§a geleinte Tiere."
|
||||
unleashed: "§aTier abgeleint. Du hast jetzt §e%count%§a geleinte Tiere."
|
||||
entity-died: "§cEin angeleintes Tier ist gestorben. Du hast jetzt §e%count%§c geleinte Tiere."
|
||||
|
||||
mob-cap:
|
||||
limit-reached: "&cZu viele Tiere in diesem Chunk! Maximal %max% Tiere erlaubt."
|
||||
animal-removed: "&cEin Tier wurde entfernt, da das Chunk-Limit von %max% erreicht wurde."
|
||||
|
||||
spawnprotection:
|
||||
blockbreak-denied: "&cDu kannst im Spawnbereich keine Blöcke abbauen."
|
||||
blockplace-denied: "&cDu kannst im Spawnbereich keine Blöcke platzieren."
|
||||
pvp-denied: "&cPvP ist im Spawnbereich deaktiviert."
|
||||
|
||||
lock:
|
||||
mode-start: "§aRechtsklicke jetzt auf eine Tür oder Kiste, um sie zu sperren!"
|
||||
mode-timeout: "§cDer Sperrmodus ist nach 30 Sekunden abgebrochen."
|
||||
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%"
|
@@ -1,343 +1,362 @@
|
||||
name: SurvivalPlus
|
||||
version: 1.0.0
|
||||
main: de.viper.survivalplus.SurvivalPlus
|
||||
api-version: 1.21
|
||||
author: Viper
|
||||
description: A plugin for enhancing survival gameplay in Minecraft.
|
||||
|
||||
commands:
|
||||
ir:
|
||||
description: Benennt das Item in der Hand um.
|
||||
usage: /ir <neuer_name>
|
||||
permission: survivalplus.itemrename
|
||||
permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
|
||||
|
||||
gm:
|
||||
description: Ändert den Spielmodus eines Spielers
|
||||
usage: /<command> <modus> [spieler]
|
||||
aliases: [gamemode]
|
||||
permission: survivalplus.gamemode
|
||||
|
||||
sp:
|
||||
description: Zeigt Plugin-Informationen oder Hilfe
|
||||
usage: /<command> [reload|help|info] [seite]
|
||||
permission: survivalplus.sp
|
||||
|
||||
sethome:
|
||||
description: Setzt ein Home mit dem angegebenen Namen
|
||||
usage: /<command> <name>
|
||||
permission: survivalplus.homes.set
|
||||
|
||||
delhome:
|
||||
description: Löscht ein Home mit dem angegebenen Namen
|
||||
usage: /<command> <name>
|
||||
permission: survivalplus.homes.delete
|
||||
|
||||
homelist:
|
||||
description: Öffnet eine GUI mit allen Homes
|
||||
usage: /<command>
|
||||
permission: survivalplus.homes.list
|
||||
|
||||
home:
|
||||
description: Teleportiert zu einem Home
|
||||
usage: /<command> <name>
|
||||
permission: survivalplus.homes
|
||||
|
||||
inv:
|
||||
description: Öffnet das Inventar (eigenes oder das eines anderen Spielers)
|
||||
usage: /<command> [spieler]
|
||||
permission: survivalplus.inventory.own
|
||||
|
||||
ec:
|
||||
description: Öffnet die Endertruhe (eigene oder die eines anderen Spielers)
|
||||
usage: /<command> [spieler]
|
||||
permission: survivalplus.enderchest.own
|
||||
|
||||
setworldspawn:
|
||||
description: Setzt den Weltspawnpunkt auf die Position des Spielers
|
||||
usage: /<command>
|
||||
permission: survivalplus.setworldspawn
|
||||
|
||||
setspawn:
|
||||
description: Setzt den Server-Spawnpunkt auf die Position des Spielers
|
||||
usage: /<command>
|
||||
permission: survivalplus.setspawn
|
||||
|
||||
clearchat:
|
||||
description: Löscht den Chat für alle Spieler
|
||||
usage: /<command>
|
||||
permission: survivalplus.clearchat
|
||||
|
||||
clearitems:
|
||||
description: Löscht alle herumliegenden Items
|
||||
usage: /<command>
|
||||
permission: survivalplus.clearitems
|
||||
|
||||
closedoors:
|
||||
description: Schließt alle Türen im angegebenen Radius
|
||||
usage: /<command> <radius>
|
||||
permission: survivalplus.closedoors
|
||||
|
||||
sit:
|
||||
description: Lässt den Spieler sich hinsetzen
|
||||
usage: /<command>
|
||||
permission: survivalplus.sit
|
||||
|
||||
back:
|
||||
description: Teleportiert zum letzten Todespunkt
|
||||
usage: /<command>
|
||||
permission: survivalplus.back
|
||||
|
||||
friend:
|
||||
description: Verwaltet die Freundesliste
|
||||
usage: /<command> [add|accept|deny|list|del|tp] [Spielername]
|
||||
permission: survivalplus.friend
|
||||
|
||||
stats:
|
||||
description: Zeigt deine Statistiken an
|
||||
usage: /stats
|
||||
permission: survivalplus.stats
|
||||
|
||||
showarmorstands:
|
||||
description: Macht alle unsichtbaren Armor Stands sichtbar.
|
||||
usage: /showarmorstands
|
||||
permission: survivalplus.showarmorstands
|
||||
permission-message: "§cDu hast keine Rechte für diesen Befehl."
|
||||
|
||||
cleardebugarmorstands:
|
||||
description: Entfernt alle Debug-ArmorStands
|
||||
usage: /cleardebugarmorstands
|
||||
permission: survivalplus.cleardebugarmorstands
|
||||
permission-message: "§cDu hast keine Rechte für diesen Befehl."
|
||||
|
||||
trash:
|
||||
description: Öffnet den Mülleimer
|
||||
usage: /trash
|
||||
permission: survivalplus.trash
|
||||
permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
|
||||
|
||||
workbench:
|
||||
description: Öffnet eine Werkbank GUI
|
||||
usage: /workbench
|
||||
permission: survivalplus.workbench
|
||||
permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
|
||||
|
||||
anvil:
|
||||
description: Öffnet eine Amboss GUI
|
||||
usage: /anvil
|
||||
permission: survivalplus.anvil
|
||||
permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
|
||||
|
||||
leashcount:
|
||||
description: Zeigt die Anzahl der geleinten Tiere an.
|
||||
usage: /leashcount
|
||||
permission: survivalplus.leashcount
|
||||
permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
|
||||
|
||||
lock:
|
||||
description: Verwaltet das Sperrsystem für Kisten und Türen
|
||||
usage: /lock <lock|unlock|friendadd|friendremove> [Spieler]
|
||||
permission: survivalplus.lock
|
||||
permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
|
||||
|
||||
tp:
|
||||
description: Teleportiere dich zu einem Spieler
|
||||
usage: /tp <Spieler>
|
||||
|
||||
tphere:
|
||||
description: Teleportiere einen Spieler zu dir
|
||||
usage: /tphere <Spieler>
|
||||
|
||||
tpa:
|
||||
description: Sende eine Teleportanfrage an einen Spieler
|
||||
usage: /tpa <Spieler>
|
||||
|
||||
tpaccept:
|
||||
description: Akzeptiere eine Teleportanfrage
|
||||
usage: /tpaccept
|
||||
|
||||
tpdeny:
|
||||
description: Lehne eine Teleportanfrage ab
|
||||
usage: /tpdeny
|
||||
|
||||
|
||||
|
||||
permissions:
|
||||
survivalplus.*:
|
||||
description: Gibt Zugriff auf alle SurvivalPlus-Befehle
|
||||
default: op
|
||||
children:
|
||||
survivalplus.gamemode: true
|
||||
survivalplus.gamemode.others: true
|
||||
survivalplus.sp: true
|
||||
survivalplus.homes.set: true
|
||||
survivalplus.homes.delete: true
|
||||
survivalplus.homes.list: true
|
||||
survivalplus.homes: true
|
||||
survivalplus.homes.unlimited: true
|
||||
survivalplus.inventory.own: true
|
||||
survivalplus.inventory.others: true
|
||||
survivalplus.enderchest.own: true
|
||||
survivalplus.enderchest.others: true
|
||||
survivalplus.setworldspawn: true
|
||||
survivalplus.setspawn: true
|
||||
survivalplus.clearchat: true
|
||||
survivalplus.clearitems: true
|
||||
survivalplus.closedoors: true
|
||||
survivalplus.sit: true
|
||||
survivalplus.back: true
|
||||
survivalplus.graves: true
|
||||
survivalplus.friend: true
|
||||
survivalplus.itemrename: true
|
||||
survivalplus.stats: true
|
||||
survivalplus.showarmorstands: true
|
||||
survivalplus.cleardebugarmorstands: true
|
||||
survivalplus.trash: true
|
||||
survivalplus.workbench: true
|
||||
survivalplus.anvil: true
|
||||
survivalplus.leashcount: true
|
||||
|
||||
survivalplus.gamemode:
|
||||
description: Erlaubt das Ändern des eigenen Spielmodus
|
||||
default: op
|
||||
|
||||
survivalplus.gamemode.others:
|
||||
description: Erlaubt das Ändern des Spielmodus anderer Spieler
|
||||
default: op
|
||||
|
||||
survivalplus.sp:
|
||||
description: Erlaubt den Zugriff auf den /sp-Befehl
|
||||
default: op
|
||||
|
||||
survivalplus.homes.set:
|
||||
description: Erlaubt das Setzen von Homes
|
||||
default: true
|
||||
|
||||
survivalplus.homes.delete:
|
||||
description: Erlaubt das Löschen von Homes
|
||||
default: true
|
||||
|
||||
survivalplus.homes.list:
|
||||
description: Erlaubt das Öffnen der Home-Liste GUI
|
||||
default: true
|
||||
|
||||
survivalplus.homes:
|
||||
description: Erlaubt das Teleportieren zu Homes
|
||||
default: true
|
||||
|
||||
survivalplus.homes.unlimited:
|
||||
description: Erlaubt unbegrenzte Homes
|
||||
default: op
|
||||
|
||||
survivalplus.inventory.own:
|
||||
description: Erlaubt das Ansehen des eigenen Inventars
|
||||
default: true
|
||||
|
||||
survivalplus.inventory.others:
|
||||
description: Erlaubt das Ansehen des Inventars anderer Spieler
|
||||
default: op
|
||||
|
||||
survivalplus.enderchest.own:
|
||||
description: Erlaubt das Ansehen der eigenen Endertruhe
|
||||
default: true
|
||||
|
||||
survivalplus.enderchest.others:
|
||||
description: Erlaubt das Ansehen der Endertruhen anderer Spieler
|
||||
default: op
|
||||
|
||||
survivalplus.setworldspawn:
|
||||
description: Erlaubt das Setzen des Weltspawnpunkts
|
||||
default: op
|
||||
|
||||
survivalplus.setspawn:
|
||||
description: Erlaubt das Setzen des Server-Spawnpunkts
|
||||
default: op
|
||||
|
||||
survivalplus.clearchat:
|
||||
description: Erlaubt das Löschen des Chats
|
||||
default: op
|
||||
|
||||
survivalplus.clearitems:
|
||||
description: Erlaubt das manuelle Löschen der herumliegenden Items
|
||||
default: op
|
||||
|
||||
survivalplus.closedoors:
|
||||
description: Erlaubt das Schließen von Türen mit /closedoors
|
||||
default: op
|
||||
|
||||
survivalplus.sit:
|
||||
description: Erlaubt das Sitzen auf Treppen oder mit /sit
|
||||
default: true
|
||||
|
||||
survivalplus.graves:
|
||||
description: Erlaubt das Erstellen von Gräbern bei Tod
|
||||
default: true
|
||||
|
||||
survivalplus.back:
|
||||
description: Erlaubt das Teleportieren zum letzten Todespunkt
|
||||
default: true
|
||||
|
||||
survivalplus.friend:
|
||||
description: Erlaubt die Verwaltung der Freundesliste
|
||||
default: true
|
||||
|
||||
survivalplus.itemrename:
|
||||
description: Erlaubt das Umbenennen von Items mit /ir
|
||||
default: true
|
||||
|
||||
survivalplus.stats:
|
||||
description: Erlaubt den Zugriff auf den /stats-Befehl
|
||||
default: true
|
||||
|
||||
survivalplus.showarmorstands:
|
||||
description: Erlaubt das Sichtbarmachen von Armor Stands mit /showarmorstands
|
||||
default: op
|
||||
|
||||
survivalplus.cleardebugarmorstands:
|
||||
description: Erlaubt das Entfernen von Debug-ArmorStands
|
||||
default: op
|
||||
|
||||
survivalplus.trash:
|
||||
description: Erlaubt die Nutzung von /trash
|
||||
default: true
|
||||
|
||||
survivalplus.workbench:
|
||||
description: Erlaubt die Nutzung von /workbench
|
||||
default: true
|
||||
|
||||
survivalplus.anvil:
|
||||
description: Erlaubt die Nutzung von /anvil
|
||||
default: true
|
||||
|
||||
survivalplus.leashcount:
|
||||
description: Erlaubt die Nutzung von /leashcount
|
||||
default: true
|
||||
|
||||
survivalplus.chunkanimals:
|
||||
description: Erlaubt das Anzeigen der Anzahl der Tiere im aktuellen Chunk
|
||||
default: op
|
||||
|
||||
survivalplus.lock:
|
||||
description: Erlaubt das Verwenden von /lock-Befehlen
|
||||
default: true
|
||||
|
||||
survivalplus.tp:
|
||||
description: Erlaube das Teleportieren zu anderen Spielern
|
||||
default: op
|
||||
|
||||
survivalplus.tphere:
|
||||
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
|
||||
name: SurvivalPlus
|
||||
version: 1.0.0
|
||||
main: de.viper.survivalplus.SurvivalPlus
|
||||
api-version: 1.21
|
||||
author: Viper
|
||||
description: A plugin for enhancing survival gameplay in Minecraft.
|
||||
|
||||
commands:
|
||||
ir:
|
||||
description: Benennt das Item in der Hand um.
|
||||
usage: /ir <neuer_name>
|
||||
permission: survivalplus.itemrename
|
||||
permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
|
||||
|
||||
gm:
|
||||
description: Ändert den Spielmodus eines Spielers
|
||||
usage: /<command> <modus> [spieler]
|
||||
aliases: [gamemode]
|
||||
permission: survivalplus.gamemode
|
||||
|
||||
sp:
|
||||
description: Zeigt Plugin-Informationen oder Hilfe
|
||||
usage: /<command> [reload|help|info] [seite]
|
||||
permission: survivalplus.sp
|
||||
|
||||
sethome:
|
||||
description: Setzt ein Home mit dem angegebenen Namen
|
||||
usage: /<command> <name>
|
||||
permission: survivalplus.homes.set
|
||||
|
||||
delhome:
|
||||
description: Löscht ein Home mit dem angegebenen Namen
|
||||
usage: /<command> <name>
|
||||
permission: survivalplus.homes.delete
|
||||
|
||||
homelist:
|
||||
description: Öffnet eine GUI mit allen Homes
|
||||
usage: /<command>
|
||||
permission: survivalplus.homes.list
|
||||
|
||||
home:
|
||||
description: Teleportiert zu einem Home
|
||||
usage: /<command> <name>
|
||||
permission: survivalplus.homes
|
||||
|
||||
inv:
|
||||
description: Öffnet das Inventar (eigenes oder das eines anderen Spielers)
|
||||
usage: /<command> [spieler]
|
||||
permission: survivalplus.inventory.own
|
||||
|
||||
ec:
|
||||
description: Öffnet die Endertruhe (eigene oder die eines anderen Spielers)
|
||||
usage: /<command> [spieler]
|
||||
permission: survivalplus.enderchest.own
|
||||
|
||||
setworldspawn:
|
||||
description: Setzt den Weltspawnpunkt auf die Position des Spielers
|
||||
usage: /<command>
|
||||
permission: survivalplus.setworldspawn
|
||||
|
||||
setspawn:
|
||||
description: Setzt den Server-Spawnpunkt auf die Position des Spielers
|
||||
usage: /<command>
|
||||
permission: survivalplus.setspawn
|
||||
|
||||
clearchat:
|
||||
description: Löscht den Chat für alle Spieler
|
||||
usage: /<command>
|
||||
permission: survivalplus.clearchat
|
||||
|
||||
clearitems:
|
||||
description: Löscht alle herumliegenden Items
|
||||
usage: /<command>
|
||||
permission: survivalplus.clearitems
|
||||
|
||||
closedoors:
|
||||
description: Schließt alle Türen im angegebenen Radius
|
||||
usage: /<command> <radius>
|
||||
permission: survivalplus.closedoors
|
||||
|
||||
sit:
|
||||
description: Lässt den Spieler sich hinsetzen
|
||||
usage: /<command>
|
||||
permission: survivalplus.sit
|
||||
|
||||
back:
|
||||
description: Teleportiert zum letzten Todespunkt
|
||||
usage: /<command>
|
||||
permission: survivalplus.back
|
||||
|
||||
friend:
|
||||
description: Verwaltet die Freundesliste
|
||||
usage: /<command> [add|accept|deny|list|del|tp] [Spielername]
|
||||
permission: survivalplus.friend
|
||||
|
||||
stats:
|
||||
description: Zeigt deine Statistiken an
|
||||
usage: /stats
|
||||
permission: survivalplus.stats
|
||||
|
||||
showarmorstands:
|
||||
description: Macht alle unsichtbaren Armor Stands sichtbar.
|
||||
usage: /showarmorstands
|
||||
permission: survivalplus.showarmorstands
|
||||
permission-message: "§cDu hast keine Rechte für diesen Befehl."
|
||||
|
||||
cleardebugarmorstands:
|
||||
description: Entfernt alle Debug-ArmorStands
|
||||
usage: /cleardebugarmorstands
|
||||
permission: survivalplus.cleardebugarmorstands
|
||||
permission-message: "§cDu hast keine Rechte für diesen Befehl."
|
||||
|
||||
trash:
|
||||
description: Öffnet den Mülleimer
|
||||
usage: /trash
|
||||
permission: survivalplus.trash
|
||||
permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
|
||||
|
||||
workbench:
|
||||
description: Öffnet eine Werkbank GUI
|
||||
usage: /workbench
|
||||
permission: survivalplus.workbench
|
||||
permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
|
||||
|
||||
anvil:
|
||||
description: Öffnet eine Amboss GUI
|
||||
usage: /anvil
|
||||
permission: survivalplus.anvil
|
||||
permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
|
||||
|
||||
leashcount:
|
||||
description: Zeigt die Anzahl der geleinten Tiere an.
|
||||
usage: /leashcount
|
||||
permission: survivalplus.leashcount
|
||||
permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
|
||||
|
||||
lock:
|
||||
description: Verwaltet das Sperrsystem für Kisten und Türen
|
||||
usage: /lock <lock|unlock|friendadd|friendremove> [Spieler]
|
||||
permission: survivalplus.lock
|
||||
permission-message: "§cDu hast keine Berechtigung für diesen Befehl."
|
||||
|
||||
tp:
|
||||
description: Teleportiere dich zu einem Spieler
|
||||
usage: /tp <Spieler>
|
||||
|
||||
tphere:
|
||||
description: Teleportiere einen Spieler zu dir
|
||||
usage: /tphere <Spieler>
|
||||
|
||||
tpa:
|
||||
description: Sende eine Teleportanfrage an einen Spieler
|
||||
usage: /tpa <Spieler>
|
||||
|
||||
tpaccept:
|
||||
description: Akzeptiere eine Teleportanfrage
|
||||
usage: /tpaccept
|
||||
|
||||
tpdeny:
|
||||
description: Lehne eine Teleportanfrage ab
|
||||
usage: /tpdeny
|
||||
|
||||
block:
|
||||
description: Blockiere einen Spieler
|
||||
usage: /block <Spieler>
|
||||
permission: survivalplus.block
|
||||
|
||||
unblock:
|
||||
description: Entblocke einen Spieler
|
||||
usage: /unblock <Spieler>
|
||||
permission: survivalplus.unlock
|
||||
|
||||
blocklist:
|
||||
description: Zeige eine Liste der blockierten Spieler
|
||||
usage: /blocklist
|
||||
permission: survivalplus.blocklist
|
||||
|
||||
permissions:
|
||||
survivalplus.*:
|
||||
description: Gibt Zugriff auf alle SurvivalPlus-Befehle
|
||||
default: op
|
||||
children:
|
||||
survivalplus.gamemode: true
|
||||
survivalplus.gamemode.others: true
|
||||
survivalplus.sp: true
|
||||
survivalplus.homes.set: true
|
||||
survivalplus.homes.delete: true
|
||||
survivalplus.homes.list: true
|
||||
survivalplus.homes: true
|
||||
survivalplus.homes.unlimited: true
|
||||
survivalplus.inventory.own: true
|
||||
survivalplus.inventory.others: true
|
||||
survivalplus.enderchest.own: true
|
||||
survivalplus.enderchest.others: true
|
||||
survivalplus.setworldspawn: true
|
||||
survivalplus.setspawn: true
|
||||
survivalplus.clearchat: true
|
||||
survivalplus.clearitems: true
|
||||
survivalplus.closedoors: true
|
||||
survivalplus.sit: true
|
||||
survivalplus.back: true
|
||||
survivalplus.graves: true
|
||||
survivalplus.friend: true
|
||||
survivalplus.itemrename: true
|
||||
survivalplus.stats: true
|
||||
survivalplus.showarmorstands: true
|
||||
survivalplus.cleardebugarmorstands: true
|
||||
survivalplus.trash: true
|
||||
survivalplus.workbench: true
|
||||
survivalplus.anvil: true
|
||||
survivalplus.leashcount: true
|
||||
|
||||
survivalplus.gamemode:
|
||||
description: Erlaubt das Ändern des eigenen Spielmodus
|
||||
default: op
|
||||
|
||||
survivalplus.gamemode.others:
|
||||
description: Erlaubt das Ändern des Spielmodus anderer Spieler
|
||||
default: op
|
||||
|
||||
survivalplus.sp:
|
||||
description: Erlaubt den Zugriff auf den /sp-Befehl
|
||||
default: op
|
||||
|
||||
survivalplus.homes.set:
|
||||
description: Erlaubt das Setzen von Homes
|
||||
default: true
|
||||
|
||||
survivalplus.homes.delete:
|
||||
description: Erlaubt das Löschen von Homes
|
||||
default: true
|
||||
|
||||
survivalplus.homes.list:
|
||||
description: Erlaubt das Öffnen der Home-Liste GUI
|
||||
default: true
|
||||
|
||||
survivalplus.homes:
|
||||
description: Erlaubt das Teleportieren zu Homes
|
||||
default: true
|
||||
|
||||
survivalplus.homes.unlimited:
|
||||
description: Erlaubt unbegrenzte Homes
|
||||
default: op
|
||||
|
||||
survivalplus.inventory.own:
|
||||
description: Erlaubt das Ansehen des eigenen Inventars
|
||||
default: true
|
||||
|
||||
survivalplus.inventory.others:
|
||||
description: Erlaubt das Ansehen des Inventars anderer Spieler
|
||||
default: op
|
||||
|
||||
survivalplus.enderchest.own:
|
||||
description: Erlaubt das Ansehen der eigenen Endertruhe
|
||||
default: true
|
||||
|
||||
survivalplus.enderchest.others:
|
||||
description: Erlaubt das Ansehen der Endertruhen anderer Spieler
|
||||
default: op
|
||||
|
||||
survivalplus.setworldspawn:
|
||||
description: Erlaubt das Setzen des Weltspawnpunkts
|
||||
default: op
|
||||
|
||||
survivalplus.setspawn:
|
||||
description: Erlaubt das Setzen des Server-Spawnpunkts
|
||||
default: op
|
||||
|
||||
survivalplus.clearchat:
|
||||
description: Erlaubt das Löschen des Chats
|
||||
default: op
|
||||
|
||||
survivalplus.clearitems:
|
||||
description: Erlaubt das manuelle Löschen der herumliegenden Items
|
||||
default: op
|
||||
|
||||
survivalplus.closedoors:
|
||||
description: Erlaubt das Schließen von Türen mit /closedoors
|
||||
default: op
|
||||
|
||||
survivalplus.sit:
|
||||
description: Erlaubt das Sitzen auf Treppen oder mit /sit
|
||||
default: true
|
||||
|
||||
survivalplus.graves:
|
||||
description: Erlaubt das Erstellen von Gräbern bei Tod
|
||||
default: true
|
||||
|
||||
survivalplus.back:
|
||||
description: Erlaubt das Teleportieren zum letzten Todespunkt
|
||||
default: true
|
||||
|
||||
survivalplus.friend:
|
||||
description: Erlaubt die Verwaltung der Freundesliste
|
||||
default: true
|
||||
|
||||
survivalplus.itemrename:
|
||||
description: Erlaubt das Umbenennen von Items mit /ir
|
||||
default: true
|
||||
|
||||
survivalplus.stats:
|
||||
description: Erlaubt den Zugriff auf den /stats-Befehl
|
||||
default: true
|
||||
|
||||
survivalplus.showarmorstands:
|
||||
description: Erlaubt das Sichtbarmachen von Armor Stands mit /showarmorstands
|
||||
default: op
|
||||
|
||||
survivalplus.cleardebugarmorstands:
|
||||
description: Erlaubt das Entfernen von Debug-ArmorStands
|
||||
default: op
|
||||
|
||||
survivalplus.trash:
|
||||
description: Erlaubt die Nutzung von /trash
|
||||
default: true
|
||||
|
||||
survivalplus.workbench:
|
||||
description: Erlaubt die Nutzung von /workbench
|
||||
default: true
|
||||
|
||||
survivalplus.anvil:
|
||||
description: Erlaubt die Nutzung von /anvil
|
||||
default: true
|
||||
|
||||
survivalplus.leashcount:
|
||||
description: Erlaubt die Nutzung von /leashcount
|
||||
default: true
|
||||
|
||||
survivalplus.chunkanimals:
|
||||
description: Erlaubt das Anzeigen der Anzahl der Tiere im aktuellen Chunk
|
||||
default: op
|
||||
|
||||
survivalplus.lock:
|
||||
description: Erlaubt das Verwenden von /lock-Befehlen
|
||||
default: true
|
||||
|
||||
survivalplus.tp:
|
||||
description: Erlaube das Teleportieren zu anderen Spielern
|
||||
default: op
|
||||
|
||||
survivalplus.tphere:
|
||||
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
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user