Files
NexusLobby/src/main/java/de/nexuslobby/commands/NexusLobbyCommand.java
2026-02-05 22:44:21 +01:00

241 lines
11 KiB
Java

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<Entity> 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"));
}
}