294 lines
14 KiB
Java
294 lines
14 KiB
Java
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 <Spieler> → Guthaben anzeigen
|
|
if (args.length == 0) {
|
|
if (!(sender instanceof Player)) {
|
|
sender.sendMessage(ChatColor.RED + "Als Konsole bitte /money <Spieler> 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 <Spieler> → 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 <Spieler> <Betrag>
|
|
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 <Spieler> <Betrag>");
|
|
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 <Spieler> <Betrag>
|
|
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 <Spieler> <Betrag>");
|
|
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 <Spieler> <Betrag>
|
|
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 <Spieler> <Betrag>");
|
|
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 <Spieler> <Betrag>
|
|
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 <Spieler> <Betrag>");
|
|
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<UUID, Double> allBalances = bm.getAllBalances();
|
|
List<Map.Entry<UUID, Double>> 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<UUID, Double> 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 <Spieler> <Betrag>]");
|
|
sender.sendMessage(ChatColor.GRAY + "/money [set|add|remove <Spieler> <Betrag>]");
|
|
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);
|
|
}
|
|
}
|
|
} |