package dev.viper.eventengine.command; import dev.viper.eventengine.EventEngine; import dev.viper.eventengine.model.EventDefinition; import dev.viper.eventengine.model.EventRegion; import org.bukkit.entity.Player; import java.util.HashMap; import java.util.Map; import java.util.UUID; /** * Stellt Pos1/Pos2-Auswahl für Event-Regionen bereit. * Eingebaut in EventCommand via sub-commands: * * /event region pos1 → Pos1 auf Spieler-Position setzen * /event region pos2 → Pos2 setzen + Region speichern * /event region clear → Region entfernen * /event region info → Region anzeigen */ public class RegionSetupManager { private final EventEngine plugin; // Temporäre Pos1-Speicher pro Spieler: UUID → [eventId, Location] private final Map pos1Selection = new HashMap<>(); private final Map startPos1Selection = new HashMap<>(); private final Map goalPos1Selection = new HashMap<>(); public RegionSetupManager(EventEngine plugin) { this.plugin = plugin; } public void handlePos1(Player player, String eventId) { EventDefinition def = plugin.getEventRegistry().get(eventId).orElse(null); if (def == null) { player.sendMessage(plugin.prefix() + "§cEvent nicht gefunden: §f" + eventId); return; } pos1Selection.put(player.getUniqueId(), new Object[]{eventId, player.getLocation().clone()}); player.sendMessage(plugin.prefix() + "§aPos1 gesetzt: §f" + formatLoc(player)); player.sendMessage(plugin.prefix() + "§7Jetzt: §f/event region pos2 " + eventId); } public void handlePos2(Player player, String eventId) { EventDefinition def = plugin.getEventRegistry().get(eventId).orElse(null); if (def == null) { player.sendMessage(plugin.prefix() + "§cEvent nicht gefunden: §f" + eventId); return; } Object[] sel = pos1Selection.get(player.getUniqueId()); if (sel == null || !sel[0].equals(eventId)) { player.sendMessage(plugin.prefix() + "§cZuerst Pos1 setzen: §f/event region pos1 " + eventId); return; } org.bukkit.Location pos1 = (org.bukkit.Location) sel[1]; org.bukkit.Location pos2 = player.getLocation().clone(); if (!pos1.getWorld().equals(pos2.getWorld())) { player.sendMessage(plugin.prefix() + "§cBeide Positionen müssen in der gleichen Welt sein!"); return; } EventRegion region = new EventRegion(pos1, pos2); def.setRegion(region); // Custom Events direkt speichern; builtin: in memory (gilt bis Reload) if (def.isCustom()) plugin.getConfigManager().saveCustomEvent(def); pos1Selection.remove(player.getUniqueId()); player.sendMessage(plugin.prefix() + "§a✔ Region gesetzt für §e" + def.getDisplayName() + "§a:"); player.sendMessage("§7 Welt: §f" + region.getWorldName()); player.sendMessage("§7 Von: §f" + region.getMinX() + ", " + region.getMinY() + ", " + region.getMinZ()); player.sendMessage("§7 Bis: §f" + region.getMaxX() + ", " + region.getMaxY() + ", " + region.getMaxZ()); player.sendMessage("§7 Größe: §f" + region.getSizeX() + "x" + region.getSizeY() + "x" + region.getSizeZ()); } public void handleClear(Player player, String eventId) { EventDefinition def = plugin.getEventRegistry().get(eventId).orElse(null); if (def == null) { player.sendMessage(plugin.prefix() + "§cEvent nicht gefunden: §f" + eventId); return; } def.setRegion(null); if (def.isCustom()) plugin.getConfigManager().saveCustomEvent(def); player.sendMessage(plugin.prefix() + "§7Region für §e" + def.getDisplayName() + " §7entfernt (gesamte Welt)."); } public void handleStartPos1(Player player, String eventId) { EventDefinition def = plugin.getEventRegistry().get(eventId).orElse(null); if (def == null) { player.sendMessage(plugin.prefix() + "§cEvent nicht gefunden: §f" + eventId); return; } startPos1Selection.put(player.getUniqueId(), new Object[]{eventId, player.getLocation().clone()}); player.sendMessage(plugin.prefix() + "§aStart-Pos1 gesetzt: §f" + formatLoc(player)); player.sendMessage(plugin.prefix() + "§7Jetzt: §f/event race start pos2 " + eventId); } public void handleStartPos2(Player player, String eventId) { EventDefinition def = plugin.getEventRegistry().get(eventId).orElse(null); if (def == null) { player.sendMessage(plugin.prefix() + "§cEvent nicht gefunden: §f" + eventId); return; } Object[] sel = startPos1Selection.get(player.getUniqueId()); if (sel == null || !sel[0].equals(eventId)) { player.sendMessage(plugin.prefix() + "§cZuerst Start-Pos1 setzen: §f/event race start pos1 " + eventId); return; } org.bukkit.Location pos1 = (org.bukkit.Location) sel[1]; org.bukkit.Location pos2 = player.getLocation().clone(); if (!pos1.getWorld().equals(pos2.getWorld())) { player.sendMessage(plugin.prefix() + "§cBeide Positionen müssen in der gleichen Welt sein!"); return; } EventRegion region = new EventRegion(pos1, pos2); def.setStartRegion(region); if (def.isCustom()) plugin.getConfigManager().saveCustomEvent(def); startPos1Selection.remove(player.getUniqueId()); player.sendMessage(plugin.prefix() + "§a✔ Startbereich gesetzt für §e" + def.getDisplayName() + "§a:"); sendRegionInfo(player, region); } public void handleStartClear(Player player, String eventId) { EventDefinition def = plugin.getEventRegistry().get(eventId).orElse(null); if (def == null) { player.sendMessage(plugin.prefix() + "§cEvent nicht gefunden: §f" + eventId); return; } def.setStartRegion(null); if (def.isCustom()) plugin.getConfigManager().saveCustomEvent(def); player.sendMessage(plugin.prefix() + "§7Startbereich für §e" + def.getDisplayName() + " §7entfernt."); } public void handleStartInfo(Player player, String eventId) { EventDefinition def = plugin.getEventRegistry().get(eventId).orElse(null); if (def == null) { player.sendMessage(plugin.prefix() + "§cEvent nicht gefunden: §f" + eventId); return; } if (!def.hasStartRegion()) { player.sendMessage(plugin.prefix() + "§e" + def.getDisplayName() + " §7hat keinen Startbereich."); return; } player.sendMessage("§8§m══════════════════════════════"); player.sendMessage("§6 Startbereich: §e" + def.getDisplayName()); sendRegionInfo(player, def.getStartRegion()); player.sendMessage("§8§m══════════════════════════════"); } public void handleGoalPos1(Player player, String eventId) { EventDefinition def = plugin.getEventRegistry().get(eventId).orElse(null); if (def == null) { player.sendMessage(plugin.prefix() + "§cEvent nicht gefunden: §f" + eventId); return; } goalPos1Selection.put(player.getUniqueId(), new Object[]{eventId, player.getLocation().clone()}); player.sendMessage(plugin.prefix() + "§aZiel-Pos1 gesetzt: §f" + formatLoc(player)); player.sendMessage(plugin.prefix() + "§7Jetzt: §f/event race goal pos2 " + eventId); } public void handleGoalPos2(Player player, String eventId) { EventDefinition def = plugin.getEventRegistry().get(eventId).orElse(null); if (def == null) { player.sendMessage(plugin.prefix() + "§cEvent nicht gefunden: §f" + eventId); return; } Object[] sel = goalPos1Selection.get(player.getUniqueId()); if (sel == null || !sel[0].equals(eventId)) { player.sendMessage(plugin.prefix() + "§cZuerst Ziel-Pos1 setzen: §f/event race goal pos1 " + eventId); return; } org.bukkit.Location pos1 = (org.bukkit.Location) sel[1]; org.bukkit.Location pos2 = player.getLocation().clone(); if (!pos1.getWorld().equals(pos2.getWorld())) { player.sendMessage(plugin.prefix() + "§cBeide Positionen müssen in der gleichen Welt sein!"); return; } EventRegion region = new EventRegion(pos1, pos2); def.setGoalRegion(region); if (def.isCustom()) plugin.getConfigManager().saveCustomEvent(def); goalPos1Selection.remove(player.getUniqueId()); player.sendMessage(plugin.prefix() + "§a✔ Zielbereich gesetzt für §e" + def.getDisplayName() + "§a:"); sendRegionInfo(player, region); } public void handleGoalClear(Player player, String eventId) { EventDefinition def = plugin.getEventRegistry().get(eventId).orElse(null); if (def == null) { player.sendMessage(plugin.prefix() + "§cEvent nicht gefunden: §f" + eventId); return; } def.setGoalRegion(null); if (def.isCustom()) plugin.getConfigManager().saveCustomEvent(def); player.sendMessage(plugin.prefix() + "§7Zielbereich für §e" + def.getDisplayName() + " §7entfernt."); } public void handleGoalInfo(Player player, String eventId) { EventDefinition def = plugin.getEventRegistry().get(eventId).orElse(null); if (def == null) { player.sendMessage(plugin.prefix() + "§cEvent nicht gefunden: §f" + eventId); return; } if (!def.hasGoalRegion()) { player.sendMessage(plugin.prefix() + "§e" + def.getDisplayName() + " §7hat keinen Zielbereich."); return; } player.sendMessage("§8§m══════════════════════════════"); player.sendMessage("§6 Zielbereich: §e" + def.getDisplayName()); sendRegionInfo(player, def.getGoalRegion()); player.sendMessage("§8§m══════════════════════════════"); } public void handleInfo(Player player, String eventId) { EventDefinition def = plugin.getEventRegistry().get(eventId).orElse(null); if (def == null) { player.sendMessage(plugin.prefix() + "§cEvent nicht gefunden: §f" + eventId); return; } if (!def.hasRegion()) { player.sendMessage(plugin.prefix() + "§e" + def.getDisplayName() + " §7hat keine Region (gesamte Welt)."); return; } EventRegion r = def.getRegion(); player.sendMessage("§8§m══════════════════════════════"); player.sendMessage("§6 Region: §e" + def.getDisplayName()); player.sendMessage("§7 Welt: §f" + r.getWorldName()); player.sendMessage("§7 Von: §f" + r.getMinX() + ", " + r.getMinY() + ", " + r.getMinZ()); player.sendMessage("§7 Bis: §f" + r.getMaxX() + ", " + r.getMaxY() + ", " + r.getMaxZ()); player.sendMessage("§7 Größe: §f" + r.getSizeX() + "×" + r.getSizeY() + "×" + r.getSizeZ() + " Blöcke"); player.sendMessage("§8§m══════════════════════════════"); } private String formatLoc(Player p) { return p.getWorld().getName() + " " + p.getLocation().getBlockX() + ", " + p.getLocation().getBlockY() + ", " + p.getLocation().getBlockZ(); } private void sendRegionInfo(Player player, EventRegion region) { player.sendMessage("§7 Welt: §f" + region.getWorldName()); player.sendMessage("§7 Von: §f" + region.getMinX() + ", " + region.getMinY() + ", " + region.getMinZ()); player.sendMessage("§7 Bis: §f" + region.getMaxX() + ", " + region.getMaxY() + ", " + region.getMaxZ()); player.sendMessage("§7 Größe: §f" + region.getSizeX() + "x" + region.getSizeY() + "x" + region.getSizeZ()); } }