diff --git a/src/main/java/net/viper/status/modules/navigation/NavigationModule.java b/src/main/java/net/viper/status/modules/navigation/NavigationModule.java new file mode 100644 index 0000000..27e9906 --- /dev/null +++ b/src/main/java/net/viper/status/modules/navigation/NavigationModule.java @@ -0,0 +1,149 @@ +package net.viper.status.modules.navigation; + +import net.md_5.bungee.api.ChatColor; +import net.md_5.bungee.api.CommandSender; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.config.ServerInfo; +import net.md_5.bungee.api.connection.ProxiedPlayer; +import net.md_5.bungee.api.plugin.Command; +import net.md_5.bungee.api.plugin.Plugin; +import net.viper.status.module.Module; + +import java.io.*; +import java.util.*; + +/** + * NavigationModule - Erstellt automatisch Server-Switch Befehle basierend auf der verify.properties. + */ +public class NavigationModule implements Module { + + private Plugin plugin; + private boolean isEnabled = true; + + @Override + public String getName() { + return "NavigationModule"; + } + + @Override + public void onEnable(Plugin plugin) { + this.plugin = plugin; + loadConfig(plugin); + } + + @Override + public void onDisable(Plugin plugin) { + // Befehle müssen nicht manuell entfernt werden (handled by Bungee) + } + + private void loadConfig(Plugin plugin) { + String fileName = "verify.properties"; + File file = new File(plugin.getDataFolder(), fileName); + Properties props = new Properties(); + + // 1. Datei kopieren falls nicht vorhanden + if (!file.exists()) { + // Wir müssen hier nichts erstellen, da GlobalChat oder Verify das schon tun + // Wir versuchen einfach nur zu laden + } + + // 2. Laden + try (InputStream in = new FileInputStream(file)) { + props.load(in); + } catch (IOException e) { + plugin.getLogger().warning("Konnte " + fileName + " nicht für Navigation laden."); + return; + } + + // 3. Aktivierung prüfen + isEnabled = Boolean.parseBoolean(props.getProperty("navigation.enabled", "true")); + + if (!isEnabled) { + plugin.getLogger().info("§eNavigation ist DEAKTIVIERT."); + return; + } + + // 4. Befehle generieren + int registered = 0; + for (String key : props.stringPropertyNames()) { + if (key.startsWith("server.")) { + // Struktur: server.= + // Wir ignorieren Unterpunkte wie .id oder .secret (teilen wir am Punkt) + String[] parts = key.split("\\."); + + if (parts.length == 2) { + String targetServer = parts[1]; // Z.B. "bungee-server-1" oder "lobby" + String displayName = props.getProperty(key); // Z.B. "&aSurvival" + + // Befehlsnamen generieren: Farbcodes entfernen und Leerzeichen entfernen + // "&aSurvival" -> "Survival" -> "/survival" + String alias = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', displayName)) + .toLowerCase() + .replace(" ", ""); + + if (alias.isEmpty()) continue; + + // Command registrieren + try { + plugin.getProxy().getPluginManager().registerCommand(plugin, new ServerSwitchCommand(targetServer, displayName, alias)); + registered++; + plugin.getLogger().info("§aBefehl registered: /" + alias + " -> " + targetServer); + } catch (Exception e) { + plugin.getLogger().warning("Konnte Befehl für " + targetServer + " nicht registrieren: " + e.getMessage()); + } + } + } + } + + if (registered > 0) { + plugin.getLogger().info("§aNavigation aktiviert! " + registered + " Server-Befehle erstellt."); + } else { + plugin.getLogger().warning("§cKeine Server für Navigation gefunden (Überprüfe verify.properties)."); + } + } + + /** + * Interne Klasse für den Switch-Befehl. + * Ein Objekt davon wird für jeden Server erstellt. + */ + private class ServerSwitchCommand extends Command { + + private final String targetServer; // Der technische Name (z.B. bungee-server-1) + private final String displayName; // Der hübsche Name (z.B. &aSurvival) + + public ServerSwitchCommand(String targetServer, String displayName, String alias) { + super(alias); // Befehl name + this.targetServer = targetServer; + this.displayName = displayName; + } + + @Override + public void execute(CommandSender sender, String[] args) { + if (!(sender instanceof ProxiedPlayer)) { + sender.sendMessage(ChatColor.RED + "Nur Spieler können den Server wechseln."); + return; + } + + ProxiedPlayer p = (ProxiedPlayer) sender; + + // Check ob Spieler schon auf dem Server ist + if (p.getServer() != null && p.getServer().getInfo().getName().equalsIgnoreCase(targetServer)) { + String name = ChatColor.stripColor(ChatColor.translateAlternateColorCodes('&', displayName)); + p.sendMessage(ChatColor.YELLOW + "Du bist bereits auf " + name + ChatColor.YELLOW + "!"); + return; + } + + // Server Info holen + ServerInfo target = plugin.getProxy().getServerInfo(targetServer); + + if (target == null) { + p.sendMessage(ChatColor.RED + "Der Server '" + targetServer + "' wurde nicht gefunden."); + return; + } + + // Connecten + p.sendMessage(ChatColor.GRAY + "Verbinde dich mit " + displayName + ChatColor.GRAY + "..."); + p.connect(target); + } + } +} \ No newline at end of file