Update from Git Manager GUI

This commit is contained in:
2026-03-10 23:20:22 +01:00
parent f371a9d1d8
commit 3f5499653a
15 changed files with 2604 additions and 230 deletions

View File

@@ -0,0 +1,294 @@
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);
}
}
}