Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
99a326ce2e | ||
|
|
3cce4477cb | ||
|
|
9e74ab28fb | ||
|
|
3b7a1556d1 |
2
pom.xml
2
pom.xml
@@ -7,7 +7,7 @@
|
||||
|
||||
<groupId>de.teleportsuite</groupId>
|
||||
<artifactId>TeleportSuite</artifactId>
|
||||
<version>1.0.2</version>
|
||||
<version>1.0.4</version>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<properties>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -131,20 +131,25 @@ public class DatabaseManager {
|
||||
|
||||
// ===== WARPS =====
|
||||
public void saveWarp(String name, TeleportLocation loc, UUID creator, String permission) {
|
||||
String sql = isMySQL
|
||||
? "INSERT INTO ts_warps (name,world,x,y,z,yaw,pitch,server,creator,permission) VALUES(?,?,?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE world=?,x=?,y=?,z=?,yaw=?,pitch=?,server=?"
|
||||
: "INSERT OR REPLACE INTO ts_warps (name,world,x,y,z,yaw,pitch,server,creator,permission) VALUES(?,?,?,?,?,?,?,?,?,?)";
|
||||
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql)) {
|
||||
ps.setString(1, name); ps.setString(2, loc.getWorld());
|
||||
ps.setDouble(3, loc.getX()); ps.setDouble(4, loc.getY()); ps.setDouble(5, loc.getZ());
|
||||
ps.setFloat(6, loc.getYaw()); ps.setFloat(7, loc.getPitch()); ps.setString(8, loc.getServer());
|
||||
ps.setString(9, creator != null ? creator.toString() : null); ps.setString(10, permission);
|
||||
if (isMySQL) {
|
||||
ps.setString(11, loc.getWorld()); ps.setDouble(12, loc.getX()); ps.setDouble(13, loc.getY());
|
||||
ps.setDouble(14, loc.getZ()); ps.setFloat(15, loc.getYaw()); ps.setFloat(16, loc.getPitch());
|
||||
ps.setString(17, loc.getServer());
|
||||
try (Connection c = getConnection()) {
|
||||
boolean exists;
|
||||
try (PreparedStatement check = c.prepareStatement("SELECT 1 FROM ts_warps WHERE name=?")) {
|
||||
check.setString(1, name);
|
||||
exists = check.executeQuery().next();
|
||||
}
|
||||
String sql = exists
|
||||
? "UPDATE ts_warps SET world=?,x=?,y=?,z=?,yaw=?,pitch=?,server=?,creator=?,permission=? WHERE name=?"
|
||||
: "INSERT INTO ts_warps (world,x,y,z,yaw,pitch,server,creator,permission,name) VALUES(?,?,?,?,?,?,?,?,?,?)";
|
||||
try (PreparedStatement ps = c.prepareStatement(sql)) {
|
||||
ps.setString(1, loc.getWorld());
|
||||
ps.setDouble(2, loc.getX()); ps.setDouble(3, loc.getY()); ps.setDouble(4, loc.getZ());
|
||||
ps.setFloat(5, loc.getYaw()); ps.setFloat(6, loc.getPitch());
|
||||
ps.setString(7, loc.getServer());
|
||||
ps.setString(8, creator != null ? creator.toString() : null);
|
||||
ps.setString(9, permission);
|
||||
ps.setString(10, name);
|
||||
ps.executeUpdate();
|
||||
}
|
||||
ps.executeUpdate();
|
||||
} catch (SQLException e) { plugin.getLogger().warning("saveWarp: " + e.getMessage()); }
|
||||
}
|
||||
|
||||
@@ -250,19 +255,23 @@ public class DatabaseManager {
|
||||
|
||||
// ===== PLAYER DATA =====
|
||||
public void saveLastLocation(UUID uuid, TeleportLocation loc) {
|
||||
String sql = isMySQL
|
||||
? "INSERT INTO ts_player_data (uuid,last_world,last_x,last_y,last_z,last_yaw,last_pitch,last_server) VALUES(?,?,?,?,?,?,?,?) ON DUPLICATE KEY UPDATE last_world=?,last_x=?,last_y=?,last_z=?,last_yaw=?,last_pitch=?,last_server=?"
|
||||
: "INSERT OR REPLACE INTO ts_player_data (uuid,last_world,last_x,last_y,last_z,last_yaw,last_pitch,last_server) VALUES(?,?,?,?,?,?,?,?)";
|
||||
try (Connection c = getConnection(); PreparedStatement ps = c.prepareStatement(sql)) {
|
||||
ps.setString(1, uuid.toString()); ps.setString(2, loc.getWorld());
|
||||
ps.setDouble(3, loc.getX()); ps.setDouble(4, loc.getY()); ps.setDouble(5, loc.getZ());
|
||||
ps.setFloat(6, loc.getYaw()); ps.setFloat(7, loc.getPitch()); ps.setString(8, loc.getServer());
|
||||
if (isMySQL) {
|
||||
ps.setString(9, loc.getWorld()); ps.setDouble(10, loc.getX()); ps.setDouble(11, loc.getY());
|
||||
ps.setDouble(12, loc.getZ()); ps.setFloat(13, loc.getYaw()); ps.setFloat(14, loc.getPitch());
|
||||
ps.setString(15, loc.getServer());
|
||||
try (Connection c = getConnection()) {
|
||||
// Check if row exists
|
||||
boolean exists;
|
||||
try (PreparedStatement check = c.prepareStatement("SELECT 1 FROM ts_player_data WHERE uuid=?")) {
|
||||
check.setString(1, uuid.toString());
|
||||
exists = check.executeQuery().next();
|
||||
}
|
||||
String sql = exists
|
||||
? "UPDATE ts_player_data SET last_world=?,last_x=?,last_y=?,last_z=?,last_yaw=?,last_pitch=?,last_server=? WHERE uuid=?"
|
||||
: "INSERT INTO ts_player_data (last_world,last_x,last_y,last_z,last_yaw,last_pitch,last_server,uuid) VALUES(?,?,?,?,?,?,?,?)";
|
||||
try (PreparedStatement ps = c.prepareStatement(sql)) {
|
||||
ps.setString(1, loc.getWorld());
|
||||
ps.setDouble(2, loc.getX()); ps.setDouble(3, loc.getY()); ps.setDouble(4, loc.getZ());
|
||||
ps.setFloat(5, loc.getYaw()); ps.setFloat(6, loc.getPitch());
|
||||
ps.setString(7, loc.getServer()); ps.setString(8, uuid.toString());
|
||||
ps.executeUpdate();
|
||||
}
|
||||
ps.executeUpdate();
|
||||
} catch (SQLException e) { plugin.getLogger().warning("saveLastLocation: " + e.getMessage()); }
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -11,8 +11,14 @@ public class WarpManager {
|
||||
public WarpManager(TeleportSuite plugin) { this.plugin = plugin; }
|
||||
|
||||
public void setWarp(Player player, String name, String permission) {
|
||||
TeleportLocation loc = new TeleportLocation(player.getLocation(), plugin.getConfigManager().getServerName());
|
||||
// Snapshot the location at the exact moment /setwarp is called
|
||||
TeleportLocation loc = new TeleportLocation(
|
||||
player.getLocation().clone(),
|
||||
plugin.getConfigManager().getServerName());
|
||||
plugin.getDatabaseManager().saveWarp(name, loc, player.getUniqueId(), permission);
|
||||
plugin.getLogger().info("Warp '" + name + "' gesetzt: "
|
||||
+ loc.getWorld() + " " + loc.getX() + "/" + loc.getY() + "/" + loc.getZ()
|
||||
+ " von " + player.getName());
|
||||
player.sendMessage(plugin.getConfigManager().getMessage("warp-set", "name", name));
|
||||
}
|
||||
|
||||
@@ -26,7 +32,11 @@ public class WarpManager {
|
||||
player.sendMessage(plugin.getConfigManager().getMessage("no-permission"));
|
||||
return;
|
||||
}
|
||||
plugin.getTeleportManager().teleport(player, warp.getLocation());
|
||||
TeleportLocation dest = warp.getLocation();
|
||||
plugin.getLogger().info("Warp '" + name + "' geladen: "
|
||||
+ dest.getWorld() + " " + dest.getX() + "/" + dest.getY() + "/" + dest.getZ()
|
||||
+ " -> Spieler " + player.getName());
|
||||
plugin.getTeleportManager().teleport(player, dest);
|
||||
}
|
||||
|
||||
public boolean deleteWarp(String name) {
|
||||
|
||||
@@ -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!"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
name: TeleportSuite
|
||||
version: 1.0.2
|
||||
version: 1.0.4
|
||||
main: de.teleportsuite.TeleportSuite
|
||||
api-version: 1.20
|
||||
description: BungeeCord-fähiges Teleport-Komplettpaket
|
||||
|
||||
Reference in New Issue
Block a user