package de.nexuslobby.commands; import de.nexuslobby.NexusLobby; import de.nexuslobby.modules.ScoreboardModule; import de.nexuslobby.modules.parkour.ParkourManager; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Sound; import org.bukkit.World; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import java.util.List; public class NexusLobbyCommand implements CommandExecutor { @Override public boolean onCommand(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { if (!(sender instanceof Player player)) { sender.sendMessage(de.nexuslobby.utils.LangManager.get("only_player")); return true; } String cmdName = command.getName().toLowerCase(); ParkourManager pm = NexusLobby.getInstance().getParkourManager(); // --- DIREKTE KURZ-BEFEHLE --- if (cmdName.equalsIgnoreCase("setstart")) { if (!player.hasPermission("nexuslobby.admin")) return noPerm(player); handleSetStart(player, pm); return true; } if (cmdName.equalsIgnoreCase("setcheckpoint")) { if (!player.hasPermission("nexuslobby.admin")) return noPerm(player); pm.setCheckpoint(player, player.getLocation()); player.sendMessage(de.nexuslobby.utils.LangManager.get("parkour_checkpoint_set")); return true; } if (cmdName.equalsIgnoreCase("setfinish")) { if (!player.hasPermission("nexuslobby.admin")) return noPerm(player); pm.setFinishLocation(player.getLocation()); player.sendMessage(de.nexuslobby.utils.LangManager.get("parkour_finish_set")); return true; } // --- SPAWN BEFEHL --- if (cmdName.equalsIgnoreCase("spawn")) { FileConfiguration config = NexusLobby.getInstance().getConfig(); if (config.contains("spawn.world")) { Location loc = getSpawnFromConfig(config); if (loc != null) { player.teleport(loc); player.playSound(player.getLocation(), Sound.ENTITY_ENDERMAN_TELEPORT, 1.0f, 1.2f); player.sendMessage(de.nexuslobby.utils.LangManager.get("teleport_spawn")); } else { player.sendMessage(de.nexuslobby.utils.LangManager.get("spawn_world_missing")); } } else { player.sendMessage(de.nexuslobby.utils.LangManager.get("spawn_not_set")); } return true; } // --- HAUPTBEFEHL /NEXUSLOBBY oder /NEXUS --- if (args.length == 0) { sendInfo(player); return true; } switch (args[0].toLowerCase()) { case "reload": if (!player.hasPermission("nexuslobby.admin")) return noPerm(player); NexusLobby.getInstance().reloadPlugin(); player.sendMessage(de.nexuslobby.utils.LangManager.get("plugin_reloaded")); player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1f, 1.5f); break; case "setspawn": if (!player.hasPermission("nexuslobby.admin")) return noPerm(player); Location loc = player.getLocation(); FileConfiguration config = NexusLobby.getInstance().getConfig(); config.set("spawn.world", loc.getWorld().getName()); config.set("spawn.x", loc.getX()); config.set("spawn.y", loc.getY()); config.set("spawn.z", loc.getZ()); config.set("spawn.yaw", (double) loc.getYaw()); config.set("spawn.pitch", (double) loc.getPitch()); NexusLobby.getInstance().saveConfig(); player.sendMessage(de.nexuslobby.utils.LangManager.get("spawn_set")); break; case "silentjoin": if (!player.hasPermission("nexuslobby.silentjoin")) return noPerm(player); if (NexusLobby.getInstance().getSilentPlayers().contains(player.getUniqueId())) { NexusLobby.getInstance().getSilentPlayers().remove(player.getUniqueId()); player.sendMessage(de.nexuslobby.utils.LangManager.get("silentjoin_off")); } else { NexusLobby.getInstance().getSilentPlayers().add(player.getUniqueId()); player.sendMessage(de.nexuslobby.utils.LangManager.get("silentjoin_on")); } break; case "sb": handleScoreboard(player, args); break; case "ball": // NEU: Weiterleitung an das SoccerModule if (NexusLobby.getInstance().getSoccerModule() != null) { return NexusLobby.getInstance().getSoccerModule().onCommand(sender, command, label, args); } player.sendMessage(de.nexuslobby.utils.LangManager.get("soccer_module_not_loaded")); break; case "parkour": if (args.length < 2) { player.sendMessage(de.nexuslobby.utils.LangManager.get("parkour_usage")); return true; } String sub = args[1].toLowerCase(); if (!player.hasPermission("nexuslobby.admin") && !sub.equals("reset")) return noPerm(player); switch (sub) { case "setstart": handleSetStart(player, pm); break; case "setfinish": pm.setFinishLocation(player.getLocation()); player.sendMessage(de.nexuslobby.utils.LangManager.get("parkour_finish_set")); break; case "setcheckpoint": pm.setCheckpoint(player, player.getLocation()); break; case "reset": pm.stopParkour(player); player.sendMessage(de.nexuslobby.utils.LangManager.get("parkour_run_aborted")); break; case "clear": pm.clearStats(); player.sendMessage(de.nexuslobby.utils.LangManager.get("parkour_besttimes_cleared")); break; case "removeall": pm.removeAllPoints(); player.sendMessage(de.nexuslobby.utils.LangManager.get("parkour_track_removed")); player.playSound(player.getLocation(), Sound.ENTITY_ITEM_BREAK, 1f, 1f); break; default: player.sendMessage(de.nexuslobby.utils.LangManager.get("unknown_subcommand")); break; } break; default: sendInfo(player); break; } return true; } private void handleSetStart(Player player, ParkourManager pm) { // NPC Erkennung (Blickrichtung auf ArmorStand) ArmorStand targetAs = null; List nearby = player.getNearbyEntities(4, 4, 4); for (Entity e : nearby) { if (e instanceof ArmorStand as) { double dot = player.getLocation().getDirection().dot(as.getLocation().toVector().subtract(player.getLocation().toVector()).normalize()); if (dot > 0.9) { targetAs = as; break; } } } if (targetAs != null) { targetAs.addScoreboardTag("parkour_npc"); player.sendMessage(de.nexuslobby.utils.LangManager.get("parkour_npc_marked")); } pm.setStartLocation(player.getLocation()); player.sendMessage(de.nexuslobby.utils.LangManager.get("parkour_start_set")); } private boolean noPerm(Player player) { player.sendMessage(de.nexuslobby.utils.LangManager.get("no_permission")); return true; } private void handleScoreboard(Player player, String[] args) { if (args.length < 2) { player.sendMessage(de.nexuslobby.utils.LangManager.get("scoreboard_usage")); return; } ScoreboardModule sbModule = (ScoreboardModule) NexusLobby.getInstance().getModuleManager().getModule(ScoreboardModule.class); if (sbModule == null) { player.sendMessage(de.nexuslobby.utils.LangManager.get("scoreboard_module_disabled")); return; } String sub = args[1].toLowerCase(); switch (sub) { case "on": sbModule.setVisibility(player, true); break; case "off": sbModule.setVisibility(player, false); break; case "admin": if (player.hasPermission("nexuslobby.scoreboard.admin")) sbModule.setAdminMode(player, true); else player.sendMessage(de.nexuslobby.utils.LangManager.get("no_permission")); break; case "spieler": if (player.hasPermission("nexuslobby.scoreboard.admin")) sbModule.setAdminMode(player, false); else player.sendMessage(de.nexuslobby.utils.LangManager.get("no_permission")); break; } } private Location getSpawnFromConfig(FileConfiguration config) { World world = Bukkit.getWorld(config.getString("spawn.world", "world")); if (world == null) return null; return new Location(world, config.getDouble("spawn.x"), config.getDouble("spawn.y"), config.getDouble("spawn.z"), (float) config.getDouble("spawn.yaw"), (float) config.getDouble("spawn.pitch")); } private void sendInfo(Player player) { player.sendMessage(de.nexuslobby.utils.LangManager.get("info_header")); player.sendMessage(de.nexuslobby.utils.LangManager.get("info_title")); player.sendMessage(""); player.sendMessage(de.nexuslobby.utils.LangManager.get("info_spawn")); player.sendMessage(de.nexuslobby.utils.LangManager.get("info_parkour")); player.sendMessage(de.nexuslobby.utils.LangManager.get("info_removeall")); player.sendMessage(de.nexuslobby.utils.LangManager.get("info_ball")); player.sendMessage(de.nexuslobby.utils.LangManager.get("info_setspawn")); player.sendMessage(de.nexuslobby.utils.LangManager.get("info_scoreboard")); player.sendMessage(de.nexuslobby.utils.LangManager.get("info_reload")); player.sendMessage(de.nexuslobby.utils.LangManager.get("info_footer")); } }