Update from Git Manager GUI

This commit is contained in:
2026-02-28 08:38:01 +01:00
parent 6de8184d0a
commit ce1b67754d
11 changed files with 660 additions and 62 deletions

View File

@@ -5,8 +5,10 @@ import de.fussball.plugin.arena.Arena;
import de.fussball.plugin.game.Ball;
import de.fussball.plugin.game.Game;
import de.fussball.plugin.game.GameState;
import de.fussball.plugin.game.Team;
import de.fussball.plugin.hologram.FussballHologram;
import de.fussball.plugin.hologram.HologramManager;
import de.fussball.plugin.stats.MatchHistory;
import de.fussball.plugin.stats.StatsManager;
import de.fussball.plugin.utils.MessageUtil;
import org.bukkit.Bukkit;
@@ -202,6 +204,82 @@ public class FussballCommand implements CommandExecutor, TabCompleter {
handleDebug(player, arena);
}
// ── Teamwahl ─────────────────────────────────────────────────────
case "team" -> {
if (!(sender instanceof Player player)) { sender.sendMessage("Nur für Spieler!"); return true; }
if (args.length < 2) {
player.sendMessage(MessageUtil.error("Benutze: /fb team rot|blau"));
return true;
}
Game game = plugin.getGameManager().getPlayerGame(player);
if (game == null) {
// Noch nicht im Spiel Wunsch für nächstes Beitreten speichern
// (Spiel muss noch gesucht werden Wunsch für alle Spiele gilt nicht;
// Spieler muss zuerst beitreten)
player.sendMessage(MessageUtil.warn("Du bist in keinem Spiel. Tritt zuerst mit /fb join <arena> bei."));
return true;
}
if (game.getState() != GameState.WAITING && game.getState() != GameState.STARTING) {
player.sendMessage(MessageUtil.error("Teamwahl ist nur vor Spielstart möglich!"));
return true;
}
Team desired = switch (args[1].toLowerCase()) {
case "rot", "red", "r" -> Team.RED;
case "blau", "blue", "b" -> Team.BLUE;
default -> null;
};
if (desired == null) {
player.sendMessage(MessageUtil.error("Ungültiges Team! Benutze: rot oder blau"));
return true;
}
game.requestTeam(player, desired);
}
// ── Match-History ────────────────────────────────────────────────
case "history" -> {
int count = 5;
if (args.length >= 2) { try { count = Integer.parseInt(args[1]); } catch (NumberFormatException ignored) {} }
count = Math.max(1, Math.min(count, 20));
List<Map<?, ?>> matches = plugin.getMatchHistory().getMatches(count);
sender.sendMessage(MessageUtil.header("📋 Match-History (" + matches.size() + " Einträge)"));
if (matches.isEmpty()) {
sender.sendMessage(MessageUtil.warn("Noch keine Spiele gespeichert."));
return true;
}
for (int i = 0; i < matches.size(); i++) {
Map<?, ?> raw = matches.get(i);
// Sicher auslesen über Object → String/Number-Cast
String date = raw.get("date") instanceof String s ? s : "?";
String arena = raw.get("arena") instanceof String s ? s : "?";
String winner = raw.get("winner") instanceof String s ? s : "Unentschieden";
int rs = raw.get("redScore") instanceof Number n ? n.intValue() : 0;
int bs = raw.get("blueScore") instanceof Number n ? n.intValue() : 0;
int rp = raw.get("redPoss") instanceof Number n ? n.intValue() : 50;
int bp = raw.get("bluePoss") instanceof Number n ? n.intValue() : 50;
int pr = raw.get("penaltyRed") instanceof Number n ? n.intValue() : 0;
int pb = raw.get("penaltyBlue") instanceof Number n ? n.intValue() : 0;
String penStr = (pr + pb > 0) ? " §8(Elfm. §c" + pr + "§8:§9" + pb + "§8)" : "";
String winColor = winner.equals("Rot") ? "§c" : winner.equals("Blau") ? "§9" : "§7";
sender.sendMessage("§e#" + (i+1) + " §8[" + date + "] §7" + arena
+ " §c" + rs + "§7:§9" + bs + penStr
+ " §8│ " + winColor + winner
+ " §8│ §7Besitz §c" + rp + "% §7/ §9" + bp + "%");
}
}
// ── Drop Ball (Admin) ─────────────────────────────────────────────
case "dropball" -> {
if (!sender.hasPermission("fussball.admin")) { sender.sendMessage(MessageUtil.error("Keine Berechtigung!")); return true; }
if (args.length < 2) { sender.sendMessage(MessageUtil.error("Benutze: /fb dropball <arena>")); return true; }
Game dropGame = plugin.getGameManager().getGame(args[1]);
if (dropGame == null) { sender.sendMessage(MessageUtil.error("Kein aktives Spiel in §e" + args[1] + "§c!")); return true; }
Location dropLoc = null;
if (sender instanceof Player p) dropLoc = p.getLocation();
dropGame.dropBall(dropLoc);
sender.sendMessage(MessageUtil.success("Schiedsrichterball ausgeführt!"));
}
// ── Hologramm-Verwaltung ─────────────────────────────────────────
// /fb hologram set <id> goals|wins Hologramm erstellen
// /fb hologram remove Nächstes Hologramm (< 5 Blöcke) entfernen
@@ -302,9 +380,21 @@ public class FussballCommand implements CommandExecutor, TabCompleter {
case "redpenaltyspot" -> { arena.setRedPenaltySpot(player.getLocation()); player.sendMessage(MessageUtil.success("Roter Elfmeter-Punkt gesetzt: " + locStr(player.getLocation()))); }
case "bluepenaltyspot" -> { arena.setBluePenaltySpot(player.getLocation()); player.sendMessage(MessageUtil.success("Blauer Elfmeter-Punkt gesetzt: " + locStr(player.getLocation()))); }
case "spectatorspawn" -> { arena.setSpectatorSpawn(player.getLocation()); player.sendMessage(MessageUtil.success("Zuschauer-Spawn gesetzt: " + locStr(player.getLocation()))); }
case "minplayers" -> { if (args.length < 4) return; arena.setMinPlayers(Integer.parseInt(args[3])); player.sendMessage(MessageUtil.success("Min-Spieler: §e" + args[3])); }
case "maxplayers" -> { if (args.length < 4) return; arena.setMaxPlayers(Integer.parseInt(args[3])); player.sendMessage(MessageUtil.success("Max-Spieler: §e" + args[3])); }
case "duration" -> { if (args.length < 4) return; arena.setGameDuration(Integer.parseInt(args[3])); player.sendMessage(MessageUtil.success("Spieldauer: §e" + args[3] + "s")); }
case "minplayers" -> {
if (args.length < 4) return;
try { arena.setMinPlayers(Integer.parseInt(args[3])); player.sendMessage(MessageUtil.success("Min-Spieler: §e" + args[3])); }
catch (NumberFormatException ex) { player.sendMessage(MessageUtil.error("§e" + args[3] + " §cist keine gültige Zahl!")); }
}
case "maxplayers" -> {
if (args.length < 4) return;
try { arena.setMaxPlayers(Integer.parseInt(args[3])); player.sendMessage(MessageUtil.success("Max-Spieler: §e" + args[3])); }
catch (NumberFormatException ex) { player.sendMessage(MessageUtil.error("§e" + args[3] + " §cist keine gültige Zahl!")); }
}
case "duration" -> {
if (args.length < 4) return;
try { arena.setGameDuration(Integer.parseInt(args[3])); player.sendMessage(MessageUtil.success("Spieldauer: §e" + args[3] + "s")); }
catch (NumberFormatException ex) { player.sendMessage(MessageUtil.error("§e" + args[3] + " §cist keine gültige Zahl!")); }
}
case "info" -> {
player.sendMessage(MessageUtil.header("Arena: " + arena.getName()));
player.sendMessage("§7 Lobby: " + check(arena.getLobby()));
@@ -388,11 +478,13 @@ public class FussballCommand implements CommandExecutor, TabCompleter {
s.sendMessage("§e/fb join <arena> §7- Spiel beitreten");
s.sendMessage("§e/fb leave §7- Spiel / Zuschauer verlassen");
s.sendMessage("§e/fb spectate <arena> §7- Spiel zuschauen");
s.sendMessage("§e/fb team rot|blau §7- Teamwahl (vor Spielstart)");
s.sendMessage("§e/fb list §7- Arenen anzeigen");
s.sendMessage("§e/fb stats [spieler] §7- Statistiken anzeigen");
s.sendMessage("§e/fb top [goals|wins] §7- Bestenliste");
s.sendMessage("§e/fb history [n] §7- Letzte Spiele anzeigen");
if (s.hasPermission("fussball.admin")) {
s.sendMessage("§c§lAdmin: §ccreate / delete / setup / stop / debug");
s.sendMessage("§c§lAdmin: §ccreate / delete / setup / stop / debug / dropball");
s.sendMessage("§c§lAdmin: §chologram set goals|wins / remove / reload");
}
}
@@ -418,9 +510,9 @@ public class FussballCommand implements CommandExecutor, TabCompleter {
public List<String> onTabComplete(CommandSender sender, Command cmd, String alias, String[] args) {
List<String> list = new ArrayList<>();
if (args.length == 1) {
list.addAll(List.of("join", "leave", "list", "stats", "top", "spectate"));
if (sender.hasPermission("fussball.admin")) list.addAll(List.of("create", "delete", "setup", "stop", "setgk", "debug", "hologram"));
} else if (args.length == 2 && List.of("join","delete","setup","stop","setgk","debug","spectate").contains(args[0].toLowerCase())) {
list.addAll(List.of("join", "leave", "list", "stats", "top", "spectate", "team", "history"));
if (sender.hasPermission("fussball.admin")) list.addAll(List.of("create", "delete", "setup", "stop", "setgk", "debug", "hologram", "dropball"));
} else if (args.length == 2 && List.of("join","delete","setup","stop","setgk","debug","spectate","dropball").contains(args[0].toLowerCase())) {
list.addAll(plugin.getArenaManager().getArenaNames());
} else if (args.length == 2 && args[0].equalsIgnoreCase("hologram")) {
list.addAll(List.of("set", "remove", "delete", "reload", "list"));
@@ -448,6 +540,8 @@ public class FussballCommand implements CommandExecutor, TabCompleter {
"minplayers","maxplayers","duration","info"));
} else if (args.length == 2 && args[0].equalsIgnoreCase("top")) {
list.addAll(List.of("goals", "wins"));
} else if (args.length == 2 && args[0].equalsIgnoreCase("team")) {
list.addAll(List.of("rot", "blau"));
}
String input = args[args.length - 1].toLowerCase();
list.removeIf(s -> !s.toLowerCase().startsWith(input));