diff --git a/pom.xml b/pom.xml index 5e5cd9d..f212187 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 de.butzlabben.world WorldSystem - 2.4.4.2 + 2.4.5 UTF-8 - diff --git a/src/main/java/de/butzlabben/world/WorldSystem.java b/src/main/java/de/butzlabben/world/WorldSystem.java index 2d06be8..9051e4e 100644 --- a/src/main/java/de/butzlabben/world/WorldSystem.java +++ b/src/main/java/de/butzlabben/world/WorldSystem.java @@ -5,6 +5,7 @@ import de.butzlabben.world.command.*; import de.butzlabben.world.config.*; import de.butzlabben.world.listener.*; import de.butzlabben.world.util.PapiExtension; +import de.butzlabben.world.util.database.DatabaseRepository; import de.butzlabben.world.wrapper.AsyncCreatorAdapter; import de.butzlabben.world.wrapper.CreatorAdapter; import de.butzlabben.world.wrapper.SystemWorld; @@ -83,6 +84,9 @@ public class WorldSystem extends JavaPlugin { framework.registerCommands(new WorldAdministrateCommand()); + // Establish database connection + DatabaseRepository.getInstance().getUtil().connect(); + System.setProperty("bstats.relocatecheck", "false"); Metrics m = new Metrics(this); m.addCustomChart(new Metrics.SingleLineChart("worlds", DependenceConfig::getHighestID)); @@ -126,6 +130,9 @@ public class WorldSystem extends JavaPlugin { } } + // Close database connection + DatabaseRepository.getInstance().getUtil().close(); + Bukkit.getConsoleSender() .sendMessage(PluginConfig.getPrefix() + "Succesfully disabled WorldSystem v" + version); } diff --git a/src/main/java/de/butzlabben/world/config/PluginConfig.java b/src/main/java/de/butzlabben/world/config/PluginConfig.java index 1786bf7..7c7f352 100644 --- a/src/main/java/de/butzlabben/world/config/PluginConfig.java +++ b/src/main/java/de/butzlabben/world/config/PluginConfig.java @@ -64,7 +64,7 @@ public class PluginConfig { && (cfg.isDouble("spawn.spawnpoint.yaw") || cfg.isInt("spawn.spawnpoint.yaw")) && (cfg.isDouble("spawn.spawnpoint.pitch") || cfg.isInt("spawn.spawnpoint.pitch")) && - cfg.isBoolean("worldspawn.use") + cfg.isBoolean("worldspawn.use") && cfg.isBoolean("worldspawn.use_last_location") && (cfg.isDouble("worldspawn.spawnpoint.x") || cfg.isInt("worldspawn.spawnpoint.x")) && (cfg.isDouble("worldspawn.spawnpoint.y") || cfg.isInt("worldspawn.spawnpoint.y")) && (cfg.isDouble("worldspawn.spawnpoint.z") || cfg.isInt("worldspawn.spawnpoint.z")) @@ -249,7 +249,11 @@ public class PluginConfig { return creator; } - public static String getTablename() { + public static boolean useLastLocation() { + return getConfig().getBoolean("worldspawn.use_last_location"); + } + + public static String getTableName() { return getConfig().getString("database.table_name"); } diff --git a/src/main/java/de/butzlabben/world/listener/CommandListener.java b/src/main/java/de/butzlabben/world/listener/CommandListener.java index 174b58a..48b4b28 100644 --- a/src/main/java/de/butzlabben/world/listener/CommandListener.java +++ b/src/main/java/de/butzlabben/world/listener/CommandListener.java @@ -3,6 +3,7 @@ package de.butzlabben.world.listener; import de.butzlabben.world.config.MessageConfig; import de.butzlabben.world.config.PluginConfig; import de.butzlabben.world.config.WorldConfig; +import de.butzlabben.world.util.PlayerPositions; import de.butzlabben.world.wrapper.SystemWorld; import de.butzlabben.world.wrapper.WorldPlayer; import org.bukkit.Bukkit; @@ -60,6 +61,11 @@ public class CommandListener implements Listener { // Fix for #18 if (from != to || WorldConfig.exists(from.getName())) { + // Save location for #23 + if(WorldConfig.exists(from.getName())) { + WorldConfig config = WorldConfig.getWorldConfig(from.getName()); + PlayerPositions.getInstance().savePlayerLocation(p, config); + } GameMode gameMode = PluginConfig.getSpawnGamemode(); if (WorldConfig.exists(to.getName())) { if (PluginConfig.isSurvival()) { diff --git a/src/main/java/de/butzlabben/world/listener/PlayerListener.java b/src/main/java/de/butzlabben/world/listener/PlayerListener.java index 65bba21..2ee55a4 100644 --- a/src/main/java/de/butzlabben/world/listener/PlayerListener.java +++ b/src/main/java/de/butzlabben/world/listener/PlayerListener.java @@ -1,5 +1,8 @@ package de.butzlabben.world.listener; +import de.butzlabben.world.config.WorldConfig; +import de.butzlabben.world.util.PlayerPositions; +import de.butzlabben.world.wrapper.WorldPlayer; import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; @@ -33,6 +36,12 @@ public class PlayerListener implements Listener { public void onLeave(PlayerQuitEvent e) { Player p = e.getPlayer(); World w = p.getWorld(); + WorldPlayer player = new WorldPlayer(p); + // Save last location for #23 + if (player.isOnSystemWorld()) { + WorldConfig config = WorldConfig.getWorldConfig(player.getWorldname()); + PlayerPositions.getInstance().savePlayerLocation(p, config); + } SystemWorld.tryUnloadLater(w); } } \ No newline at end of file diff --git a/src/main/java/de/butzlabben/world/util/PlayerPositions.java b/src/main/java/de/butzlabben/world/util/PlayerPositions.java new file mode 100644 index 0000000..137ee8f --- /dev/null +++ b/src/main/java/de/butzlabben/world/util/PlayerPositions.java @@ -0,0 +1,107 @@ +package de.butzlabben.world.util; + +import com.google.common.base.Preconditions; +import de.butzlabben.world.config.PluginConfig; +import de.butzlabben.world.config.WorldConfig; +import de.butzlabben.world.util.database.DatabaseRepository; +import de.butzlabben.world.util.database.DatabaseUtil; +import lombok.Getter; +import org.bukkit.Location; +import org.bukkit.entity.Player; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.UUID; + +/* +Class for implementing #23 + */ +@Getter +public class PlayerPositions { + + @Getter + private static PlayerPositions instance = new PlayerPositions(); + + private DatabaseUtil util = DatabaseRepository.getInstance().getUtil(); + + public Location injectLocation(Player player, WorldConfig config, Location location) { + if (!PluginConfig.useLastLocation()) + return location; + + Preconditions.checkNotNull(player); + Preconditions.checkNotNull(config); + Preconditions.checkNotNull(location); + UUID uuid = player.getUniqueId(); + int id = config.getId(); + UUID owner = config.getOwner(); + String tableName = PluginConfig.getTableName(); + + try { + PreparedStatement ps = util.prepareStatement("SELECT * FROM " + tableName + " WHERE player=? AND id=? AND owner=?"); + + ps.setString(1, uuid.toString()); + ps.setInt(2, id); + ps.setString(3, owner.toString()); + ResultSet rs = util.executeQuery(ps); + if (!rs.next()) + return location; + + double x = rs.getDouble("x"); + double y = rs.getDouble("y"); + double z = rs.getDouble("z"); + + location.setX(x); + location.setY(y); + location.setZ(z); + } catch (SQLException e) { + e.printStackTrace(); + } + return location; + } + + public void savePlayerLocation(Player player, WorldConfig config) { + if (!PluginConfig.useLastLocation()) + return; + + Preconditions.checkNotNull(player); + Preconditions.checkNotNull(config); + UUID uuid = player.getUniqueId(); + int id = config.getId(); + UUID owner = config.getOwner(); + Location location = player.getLocation(); + String tableName = PluginConfig.getTableName(); + try { + PreparedStatement ps = util.prepareStatement("REPLACE INTO " + tableName + + " (player, id, owner, x, y, z) VALUES (?, ?, ?, ?, ?, ?)"); + + ps.setString(1, uuid.toString()); + ps.setInt(2, id); + ps.setString(3, owner.toString()); + ps.setDouble(4, location.getX()); + ps.setDouble(5, location.getY()); + ps.setDouble(6, location.getZ()); + + util.executeUpdate(ps); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public void checkTables() { + String tableName = PluginConfig.getTableName(); + try { + PreparedStatement ps = util.prepareStatement("CREATE TABLE IF NOT EXISTS " + tableName + + " ( `player` VARCHAR(36) NOT NULL , `id` INT NOT NULL , `owner` VARCHAR(36) NOT NULL , " + + "`x` DOUBLE NOT NULL , `y` DOUBLE NOT NULL , `z` DOUBLE NOT NULL , PRIMARY KEY (`player`, `id`, `owner`))"); + + util.executeUpdate(ps); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + private PlayerPositions() { + checkTables(); + } +} diff --git a/src/main/java/de/butzlabben/world/util/DatabaseConnection.java b/src/main/java/de/butzlabben/world/util/database/DatabaseConnection.java similarity index 95% rename from src/main/java/de/butzlabben/world/util/DatabaseConnection.java rename to src/main/java/de/butzlabben/world/util/database/DatabaseConnection.java index 787ab78..9fe42e0 100644 --- a/src/main/java/de/butzlabben/world/util/DatabaseConnection.java +++ b/src/main/java/de/butzlabben/world/util/database/DatabaseConnection.java @@ -1,6 +1,4 @@ -package de.butzlabben.world.util; - -import de.butzlabben.world.config.PluginConfig; +package de.butzlabben.world.util.database; import java.sql.*; diff --git a/src/main/java/de/butzlabben/world/util/DatabaseRepository.java b/src/main/java/de/butzlabben/world/util/database/DatabaseRepository.java similarity index 93% rename from src/main/java/de/butzlabben/world/util/DatabaseRepository.java rename to src/main/java/de/butzlabben/world/util/database/DatabaseRepository.java index 30e9f4e..5ca8f3b 100644 --- a/src/main/java/de/butzlabben/world/util/DatabaseRepository.java +++ b/src/main/java/de/butzlabben/world/util/database/DatabaseRepository.java @@ -1,4 +1,4 @@ -package de.butzlabben.world.util; +package de.butzlabben.world.util.database; import de.butzlabben.world.config.PluginConfig; import lombok.Getter; diff --git a/src/main/java/de/butzlabben/world/util/DatabaseUtil.java b/src/main/java/de/butzlabben/world/util/database/DatabaseUtil.java similarity index 91% rename from src/main/java/de/butzlabben/world/util/DatabaseUtil.java rename to src/main/java/de/butzlabben/world/util/database/DatabaseUtil.java index 49a50a6..24314ef 100644 --- a/src/main/java/de/butzlabben/world/util/DatabaseUtil.java +++ b/src/main/java/de/butzlabben/world/util/database/DatabaseUtil.java @@ -1,4 +1,4 @@ -package de.butzlabben.world.util; +package de.butzlabben.world.util.database; import java.sql.Connection; import java.sql.PreparedStatement; diff --git a/src/main/java/de/butzlabben/world/util/MysqlConnection.java b/src/main/java/de/butzlabben/world/util/database/MysqlConnection.java similarity index 96% rename from src/main/java/de/butzlabben/world/util/MysqlConnection.java rename to src/main/java/de/butzlabben/world/util/database/MysqlConnection.java index 933b4dc..84bf5b0 100644 --- a/src/main/java/de/butzlabben/world/util/MysqlConnection.java +++ b/src/main/java/de/butzlabben/world/util/database/MysqlConnection.java @@ -1,4 +1,4 @@ -package de.butzlabben.world.util; +package de.butzlabben.world.util.database; import de.butzlabben.world.config.PluginConfig; diff --git a/src/main/java/de/butzlabben/world/util/SqliteConnection.java b/src/main/java/de/butzlabben/world/util/database/SqliteConnection.java similarity index 95% rename from src/main/java/de/butzlabben/world/util/SqliteConnection.java rename to src/main/java/de/butzlabben/world/util/database/SqliteConnection.java index 8bbd076..87290cb 100644 --- a/src/main/java/de/butzlabben/world/util/SqliteConnection.java +++ b/src/main/java/de/butzlabben/world/util/database/SqliteConnection.java @@ -1,4 +1,4 @@ -package de.butzlabben.world.util; +package de.butzlabben.world.util.database; import de.butzlabben.world.config.PluginConfig; diff --git a/src/main/java/de/butzlabben/world/wrapper/SystemWorld.java b/src/main/java/de/butzlabben/world/wrapper/SystemWorld.java index ad0b562..c979b58 100644 --- a/src/main/java/de/butzlabben/world/wrapper/SystemWorld.java +++ b/src/main/java/de/butzlabben/world/wrapper/SystemWorld.java @@ -6,6 +6,7 @@ import de.butzlabben.world.config.*; import de.butzlabben.world.event.WorldCreateEvent; import de.butzlabben.world.event.WorldLoadEvent; import de.butzlabben.world.event.WorldUnloadEvent; +import de.butzlabben.world.util.PlayerPositions; import org.apache.commons.io.FileUtils; import org.bukkit.*; import org.bukkit.entity.Player; @@ -370,6 +371,7 @@ public class SystemWorld { public void teleportToWorldSpawn(Player p) { Preconditions.checkNotNull(p, "player must not be null"); Preconditions.checkArgument(p.isOnline(), "player must be online"); + PlayerPositions positions = PlayerPositions.getInstance(); if (creating) { p.sendMessage(MessageConfig.getWorldStillCreating()); @@ -383,12 +385,12 @@ public class SystemWorld { WorldConfig config = WorldConfig.getWorldConfig(worldname); if (config.getHome() != null) { - p.teleport(config.getHome()); + p.teleport(positions.injectLocation(p, config, config.getHome())); } else { if (PluginConfig.useWorldSpawn()) { - p.teleport(PluginConfig.getWorldSpawn(w)); + p.teleport(positions.injectLocation(p, config, PluginConfig.getWorldSpawn(w))); } else { - p.teleport(w.getSpawnLocation()); + p.teleport(positions.injectLocation(p, config, w.getSpawnLocation())); } } if (PluginConfig.isSurvival()) { diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index d655c7d..de70944 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -122,6 +122,7 @@ spawn: # Location where you spawn when you join a world worldspawn: + use_last_location: true use: false spawnpoint: x: 0