diff --git a/src/main/java/de/teleportsuite/TeleportSuite.java b/src/main/java/de/teleportsuite/TeleportSuite.java index 610a93b..f7dd4f0 100644 --- a/src/main/java/de/teleportsuite/TeleportSuite.java +++ b/src/main/java/de/teleportsuite/TeleportSuite.java @@ -42,9 +42,19 @@ public class TeleportSuite extends JavaPlugin { savePointManager = new SavePointManager(this); if (configManager.isBungeeEnabled()) { + String serverName = configManager.getServerName(); + if (serverName == null || serverName.isBlank() || serverName.equals("survival")) { + getLogger().warning("=================================================="); + getLogger().warning("BUNGEE: bungee.server-name in config.yml ist noch"); + getLogger().warning("auf dem Default-Wert 'survival'. Bitte auf den"); + getLogger().warning("tatsaechlichen BungeeCord-Servernamen aendern!"); + getLogger().warning("=================================================="); + } bungeeMessenger = new BungeeMessenger(this); bungeeMessenger.register(); - getLogger().info("BungeeCord-Unterstuetzung aktiviert."); + getLogger().info("BungeeCord-Unterstuetzung aktiviert. Server: " + serverName); + } else { + getLogger().warning("BungeeCord deaktiviert (bungee.enabled=false). Cross-Server-Teleport nicht verfuegbar."); } getServer().getPluginManager().registerEvents(new PlayerJoinListener(this), this); diff --git a/src/main/java/de/teleportsuite/bungeemessaging/BungeeMessenger.java b/src/main/java/de/teleportsuite/bungeemessaging/BungeeMessenger.java index 18cca7f..4ea32f0 100644 --- a/src/main/java/de/teleportsuite/bungeemessaging/BungeeMessenger.java +++ b/src/main/java/de/teleportsuite/bungeemessaging/BungeeMessenger.java @@ -183,7 +183,7 @@ public class BungeeMessenger implements PluginMessageListener { case "TP_PLAYERTOPLAYER": { String senderName = in.readUTF(); String targetName = in.readUTF(); - schedulePlayerToPlayerTeleport(senderName, targetName); + schedulePlayerToPlayerTeleportWithBack(senderName, targetName); break; } @@ -198,10 +198,14 @@ public class BungeeMessenger implements PluginMessageListener { plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> { org.bukkit.entity.Player p = plugin.getServer().getPlayerExact(playerName); if (p == null || !p.isOnline()) return; - TeleportLocation loc = new TeleportLocation( + // Save back location BEFORE teleporting (teleport() with saveBack=false + // skips this, so we do it manually here for cross-server teleports) + plugin.getDatabaseManager().saveLastLocation(p.getUniqueId(), + new TeleportLocation(p.getLocation(), plugin.getConfigManager().getServerName())); + TeleportLocation dest = new TeleportLocation( world, x, y, z, yaw, pitch, plugin.getConfigManager().getServerName()); - plugin.getTeleportManager().teleport(p, loc, false); + plugin.getTeleportManager().teleport(p, dest, false); }, 10L); break; } @@ -231,9 +235,9 @@ public class BungeeMessenger implements PluginMessageListener { /** * Wartet bis sender UND target lokal online sind (max. 100 × 10 Ticks = 50 s), - * dann führt player.teleport() aus – identisch zum BTM-Ansatz. + * speichert Back-Location und führt dann player.teleport() aus. */ - private void schedulePlayerToPlayerTeleport(String senderName, String targetName) { + private void schedulePlayerToPlayerTeleportWithBack(String senderName, String targetName) { final int[] attempts = {0}; final int[] taskId = {-1}; @@ -243,6 +247,10 @@ public class BungeeMessenger implements PluginMessageListener { org.bukkit.entity.Player target = plugin.getServer().getPlayerExact(targetName); if (sender != null && sender.isOnline() && target != null && target.isOnline()) { + // Save back location before teleport so /back works cross-server + plugin.getDatabaseManager().saveLastLocation(sender.getUniqueId(), + new TeleportLocation(sender.getLocation(), + plugin.getConfigManager().getServerName())); plugin.getTeleportManager().teleport( sender, new TeleportLocation(target.getLocation(), diff --git a/src/main/java/de/teleportsuite/listeners/PlayerRespawnListener.java b/src/main/java/de/teleportsuite/listeners/PlayerRespawnListener.java index ed28bae..82f4f29 100644 --- a/src/main/java/de/teleportsuite/listeners/PlayerRespawnListener.java +++ b/src/main/java/de/teleportsuite/listeners/PlayerRespawnListener.java @@ -2,7 +2,9 @@ package de.teleportsuite.listeners; import de.teleportsuite.TeleportSuite; import de.teleportsuite.models.TeleportLocation; +import org.bukkit.Location; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerRespawnEvent; @@ -10,12 +12,33 @@ public class PlayerRespawnListener implements Listener { private final TeleportSuite plugin; public PlayerRespawnListener(TeleportSuite plugin) { this.plugin = plugin; } - @EventHandler + @EventHandler(priority = EventPriority.HIGH) public void onRespawn(PlayerRespawnEvent event) { if (!plugin.getConfigManager().deathRespawnToSpawn()) return; + TeleportLocation spawn = plugin.getDatabaseManager().getSpawn("spawn"); - if (spawn == null) return; - var loc = spawn.toBukkitLocation(); - if (loc != null) event.setRespawnLocation(loc); + if (spawn == null) { + plugin.getLogger().warning("death-respawn-to-spawn ist aktiv, aber kein Spawn gesetzt!"); + return; + } + + // Spawn ist auf einem anderen Server → nach dem Respawn teleportieren + String localServer = plugin.getConfigManager().getServerName(); + if (!spawn.isLocalServer(localServer)) { + plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> { + if (event.getPlayer().isOnline()) { + plugin.getTeleportManager().teleport(event.getPlayer(), spawn, false); + } + }, 5L); + return; + } + + // Spawn ist lokal → direkt als Respawn-Location setzen + Location loc = spawn.toBukkitLocation(); + if (loc == null || loc.getWorld() == null) { + plugin.getLogger().warning("Spawn-Welt \"" + spawn.getWorld() + "\" nicht gefunden!"); + return; + } + event.setRespawnLocation(loc); } } diff --git a/src/main/java/de/teleportsuite/managers/TeleportManager.java b/src/main/java/de/teleportsuite/managers/TeleportManager.java index e1d0d00..fcedf81 100644 --- a/src/main/java/de/teleportsuite/managers/TeleportManager.java +++ b/src/main/java/de/teleportsuite/managers/TeleportManager.java @@ -99,7 +99,10 @@ public class TeleportManager { Location loc = dest.toBukkitLocation(); if (loc == null || loc.getWorld() == null) { - player.sendMessage("§cZielwelt nicht gefunden!"); + player.sendMessage("§cFehler: Zielwelt §6" + dest.getWorld() + "§c nicht gefunden!" + + " Ist der Spawn auf diesem Server gesetzt?"); + plugin.getLogger().warning("Teleport fehlgeschlagen: Welt '" + dest.getWorld() + + "' fuer Spieler " + player.getName() + " nicht geladen."); return; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index b5fb908..c82c59a 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -15,9 +15,10 @@ database: file: teleportsuite.db # BungeeCord Einstellungen +# WICHTIG: server-name muss dem Namen dieses Servers in der BungeeCord config.yml entsprechen! bungee: - enabled: false - server-name: "survival" # Name dieses Servers im BungeeCord-Netz + enabled: true + server-name: "survival" # Name dieses Servers im BungeeCord-Netz (z.B. "lobby", "survival", "creative") # Teleport Einstellungen teleport: @@ -70,6 +71,7 @@ messages: death-no-location: "&cKein Todesort gespeichert." no-permission: "&cDazu hast du keine Berechtigung." player-not-found: "&cSpieler &6{player}&c nicht gefunden." + tpa-request-not-found: "&cKeine offene Teleportanfrage gefunden." portal-created: "&aPortal &6{name}&a erstellt!" portal-deleted: "&cPortal &6{name}&c gelöscht." savepoint-set: "&aSavepoint &6{name}&a gesetzt!" diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index ab449cb..3f654c6 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: TeleportSuite -version: 1.0.2 +version: 1.0.3 main: de.teleportsuite.TeleportSuite api-version: 1.20 description: BungeeCord-fähiges Teleport-Komplettpaket