package de.viper.survivalplus.commands; import de.viper.survivalplus.SurvivalPlus; import de.viper.survivalplus.economy.BalanceManager; import net.milkbowl.vault.economy.Economy; import net.milkbowl.vault.economy.EconomyResponse; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.*; public class MoneyCommand implements CommandExecutor { private final SurvivalPlus plugin; public MoneyCommand(SurvivalPlus plugin) { this.plugin = plugin; } @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { Economy economy = plugin.getEconomy(); if (economy == null) { sender.sendMessage(ChatColor.RED + "Economy-System ist nicht verfügbar."); return true; } // /money oder /money → Guthaben anzeigen if (args.length == 0) { if (!(sender instanceof Player)) { sender.sendMessage(ChatColor.RED + "Als Konsole bitte /money benutzen."); return true; } Player player = (Player) sender; double bal = economy.getBalance(player); player.sendMessage(ChatColor.GOLD + "Dein Guthaben: " + ChatColor.GREEN + String.format("%.2f", bal) + " " + economy.currencyNamePlural()); return true; } String sub = args[0].toLowerCase(); // /money → Guthaben eines anderen Spielers anzeigen (nur OP) if (args.length == 1 && !isSubCommand(sub)) { if (!sender.hasPermission("survivalplus.money.admin")) { sender.sendMessage(ChatColor.RED + "Du hast keine Berechtigung, das Guthaben anderer Spieler zu sehen."); return true; } OfflinePlayer target = getOfflinePlayer(args[0]); if (target == null) { sender.sendMessage(ChatColor.RED + "Spieler '" + args[0] + "' nicht gefunden."); return true; } double bal = economy.getBalance(target); sender.sendMessage(ChatColor.GOLD + "Guthaben von " + ChatColor.YELLOW + target.getName() + ChatColor.GOLD + ": " + ChatColor.GREEN + String.format("%.2f", bal) + " " + economy.currencyNamePlural()); return true; } switch (sub) { // /money pay case "pay": { if (!(sender instanceof Player)) { sender.sendMessage(ChatColor.RED + "Dieser Befehl ist nur für Spieler."); return true; } if (!sender.hasPermission("survivalplus.money.pay")) { sender.sendMessage(ChatColor.RED + "Du hast keine Berechtigung für diesen Befehl."); return true; } if (args.length < 3) { sender.sendMessage(ChatColor.RED + "Benutzung: /money pay "); return true; } Player payer = (Player) sender; OfflinePlayer target = getOfflinePlayer(args[1]); if (target == null || !target.isOnline()) { sender.sendMessage(ChatColor.RED + "Spieler '" + args[1] + "' ist nicht online."); return true; } if (target.getUniqueId().equals(payer.getUniqueId())) { sender.sendMessage(ChatColor.RED + "Du kannst dir nicht selbst Geld überweisen."); return true; } double amount = parseAmount(sender, args[2]); if (amount < 0) return true; if (amount == 0) { sender.sendMessage(ChatColor.RED + "Der Betrag muss größer als 0 sein."); return true; } EconomyResponse withdraw = economy.withdrawPlayer(payer, amount); if (!withdraw.transactionSuccess()) { sender.sendMessage(ChatColor.RED + "Nicht genug Guthaben! Du hast " + String.format("%.2f", economy.getBalance(payer)) + " " + economy.currencyNamePlural() + "."); return true; } economy.depositPlayer(target, amount); payer.sendMessage(ChatColor.GREEN + "Du hast " + ChatColor.YELLOW + String.format("%.2f", amount) + " " + economy.currencyNamePlural() + ChatColor.GREEN + " an " + ChatColor.YELLOW + target.getName() + ChatColor.GREEN + " überwiesen."); if (target.getPlayer() != null) { target.getPlayer().sendMessage(ChatColor.GREEN + ChatColor.BOLD.toString() + "+" + String.format("%.2f", amount) + " " + economy.currencyNamePlural() + ChatColor.RESET + ChatColor.GREEN + " von " + ChatColor.YELLOW + payer.getName()); } return true; } // /money set case "set": { if (!sender.hasPermission("survivalplus.money.admin")) { sender.sendMessage(ChatColor.RED + "Du hast keine Berechtigung für diesen Befehl."); return true; } if (args.length < 3) { sender.sendMessage(ChatColor.RED + "Benutzung: /money set "); return true; } OfflinePlayer target = getOfflinePlayer(args[1]); if (target == null) { sender.sendMessage(ChatColor.RED + "Spieler '" + args[1] + "' nicht gefunden."); return true; } double amount = parseAmount(sender, args[2]); if (amount < 0) return true; plugin.getBalanceManager().setBalance(target.getUniqueId(), amount); sender.sendMessage(ChatColor.GREEN + "Guthaben von " + ChatColor.YELLOW + target.getName() + ChatColor.GREEN + " wurde auf " + ChatColor.YELLOW + String.format("%.2f", amount) + " " + economy.currencyNamePlural() + ChatColor.GREEN + " gesetzt."); notifyTarget(target, ChatColor.YELLOW + "Dein Guthaben wurde auf " + String.format("%.2f", amount) + " " + economy.currencyNamePlural() + " gesetzt."); return true; } // /money add case "add": { if (!sender.hasPermission("survivalplus.money.admin")) { sender.sendMessage(ChatColor.RED + "Du hast keine Berechtigung für diesen Befehl."); return true; } if (args.length < 3) { sender.sendMessage(ChatColor.RED + "Benutzung: /money add "); return true; } OfflinePlayer target = getOfflinePlayer(args[1]); if (target == null) { sender.sendMessage(ChatColor.RED + "Spieler '" + args[1] + "' nicht gefunden."); return true; } double amount = parseAmount(sender, args[2]); if (amount < 0) return true; economy.depositPlayer(target, amount); sender.sendMessage(ChatColor.GREEN + "Du hast " + ChatColor.YELLOW + String.format("%.2f", amount) + " " + economy.currencyNamePlural() + ChatColor.GREEN + " zu " + ChatColor.YELLOW + target.getName() + ChatColor.GREEN + " hinzugefügt. Neues Guthaben: " + ChatColor.YELLOW + String.format("%.2f", economy.getBalance(target))); notifyTarget(target, ChatColor.GREEN + "+" + String.format("%.2f", amount) + " " + economy.currencyNamePlural() + " von einem Admin gutgeschrieben."); return true; } // /money remove case "remove": { if (!sender.hasPermission("survivalplus.money.admin")) { sender.sendMessage(ChatColor.RED + "Du hast keine Berechtigung für diesen Befehl."); return true; } if (args.length < 3) { sender.sendMessage(ChatColor.RED + "Benutzung: /money remove "); return true; } OfflinePlayer target = getOfflinePlayer(args[1]); if (target == null) { sender.sendMessage(ChatColor.RED + "Spieler '" + args[1] + "' nicht gefunden."); return true; } double amount = parseAmount(sender, args[2]); if (amount < 0) return true; EconomyResponse response = economy.withdrawPlayer(target, amount); if (!response.transactionSuccess()) { sender.sendMessage(ChatColor.RED + target.getName() + " hat nicht genug Guthaben. " + "Aktuell: " + String.format("%.2f", economy.getBalance(target))); return true; } sender.sendMessage(ChatColor.GREEN + "Du hast " + ChatColor.YELLOW + String.format("%.2f", amount) + " " + economy.currencyNamePlural() + ChatColor.GREEN + " von " + ChatColor.YELLOW + target.getName() + ChatColor.GREEN + " abgezogen. Neues Guthaben: " + ChatColor.YELLOW + String.format("%.2f", economy.getBalance(target))); notifyTarget(target, ChatColor.RED + "-" + String.format("%.2f", amount) + " " + economy.currencyNamePlural() + " von einem Admin abgezogen."); return true; } // /money top → Top 10 reichste Spieler case "top": { if (!sender.hasPermission("survivalplus.baltop")) { sender.sendMessage(ChatColor.RED + "Du hast keine Berechtigung für diesen Befehl."); return true; } BalanceManager bm = plugin.getBalanceManager(); // Alle Einträge aus dem BalanceManager holen und sortieren Map allBalances = bm.getAllBalances(); List> sorted = new ArrayList<>(allBalances.entrySet()); sorted.sort((a, b) -> Double.compare(b.getValue(), a.getValue())); sender.sendMessage(ChatColor.GOLD + "--- " + ChatColor.YELLOW + "Top 10 Reichste Spieler" + ChatColor.GOLD + " ---"); int shown = 0; for (Map.Entry entry : sorted) { if (shown >= 10) break; OfflinePlayer p = Bukkit.getOfflinePlayer(entry.getKey()); String name = (p.getName() != null) ? p.getName() : entry.getKey().toString(); shown++; sender.sendMessage(ChatColor.YELLOW + "#" + shown + " " + ChatColor.WHITE + name + ChatColor.GRAY + " - " + ChatColor.GREEN + String.format("%.2f", entry.getValue()) + " " + economy.currencyNamePlural()); } if (shown == 0) { sender.sendMessage(ChatColor.GRAY + "Noch keine Kontodaten vorhanden."); } return true; } default: sender.sendMessage(ChatColor.RED + "Unbekannter Unterbefehl!"); sender.sendMessage(ChatColor.GRAY + "/money [pay ]"); sender.sendMessage(ChatColor.GRAY + "/money [set|add|remove ]"); sender.sendMessage(ChatColor.GRAY + "/money top"); return true; } } // ---- Hilfsmethoden ---- private boolean isSubCommand(String s) { return s.equals("pay") || s.equals("set") || s.equals("add") || s.equals("remove") || s.equals("top"); } /** * Parst einen Betrag. Gibt -1 zurück und sendet eine Fehlermeldung bei ungültigem Wert. */ private double parseAmount(CommandSender sender, String raw) { try { double val = Double.parseDouble(raw); if (val < 0) { sender.sendMessage(ChatColor.RED + "Der Betrag darf nicht negativ sein."); return -1; } return val; } catch (NumberFormatException e) { sender.sendMessage(ChatColor.RED + "'" + raw + "' ist keine gültige Zahl!"); return -1; } } /** * Sucht zuerst online, dann offline. */ @SuppressWarnings("deprecation") private OfflinePlayer getOfflinePlayer(String name) { Player online = Bukkit.getPlayer(name); if (online != null) return online; OfflinePlayer offline = Bukkit.getOfflinePlayer(name); // hasPlayedBefore() verhindert, dass komplett unbekannte Namen akzeptiert werden return offline.hasPlayedBefore() ? offline : null; } /** * Schickt einer OfflinePlayer-Benachrichtigung, falls sie online sind. */ private void notifyTarget(OfflinePlayer target, String message) { if (target.isOnline() && target.getPlayer() != null) { target.getPlayer().sendMessage(message); } } }