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