diff --git a/src/main/java/de/teleportsuite/database/DatabaseManager.java b/src/main/java/de/teleportsuite/database/DatabaseManager.java index 88030ff..2ff32d1 100644 --- a/src/main/java/de/teleportsuite/database/DatabaseManager.java +++ b/src/main/java/de/teleportsuite/database/DatabaseManager.java @@ -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()); } } diff --git a/src/main/java/de/teleportsuite/managers/WarpManager.java b/src/main/java/de/teleportsuite/managers/WarpManager.java index 543ec77..6bf33fc 100644 --- a/src/main/java/de/teleportsuite/managers/WarpManager.java +++ b/src/main/java/de/teleportsuite/managers/WarpManager.java @@ -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) { diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 3f654c6..a55b948 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,5 @@ name: TeleportSuite -version: 1.0.3 +version: 1.0.4 main: de.teleportsuite.TeleportSuite api-version: 1.20 description: BungeeCord-fähiges Teleport-Komplettpaket