diff --git a/.idea/modules.xml b/.idea/modules.xml
index 028f469..0f2d9f8 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -2,7 +2,7 @@
-
+
\ No newline at end of file
diff --git a/.idea/modules/untitled.main.iml b/.idea/modules/PoketDimensions.main.iml
similarity index 100%
rename from .idea/modules/untitled.main.iml
rename to .idea/modules/PoketDimensions.main.iml
diff --git a/src/main/java/dev/siskel/poketDimensions/PoketDimensions.java b/src/main/java/dev/siskel/poketDimensions/PoketDimensions.java
index 990f115..a2c9395 100644
--- a/src/main/java/dev/siskel/poketDimensions/PoketDimensions.java
+++ b/src/main/java/dev/siskel/poketDimensions/PoketDimensions.java
@@ -1,8 +1,10 @@
package dev.siskel.poketDimensions;
import java.io.File;
+import java.io.FileInputStream;
import java.io.IOException;
import java.util.Objects;
+import java.util.UUID;
import java.util.logging.Logger;
import dev.siskel.poketDimensions.commands.givepd;
@@ -10,11 +12,16 @@ import dev.siskel.poketDimensions.commands.pdgamerule;
import dev.siskel.poketDimensions.commands.pdtp;
import dev.siskel.poketDimensions.commands.player.pd;
import dev.siskel.poketDimensions.events.PlayerInteract;
+import dev.siskel.poketDimensions.loader.PoketDimensionsWorldLoader;
import dev.siskel.poketDimensions.managers.InviteManager;
+import dev.siskel.poketDimensions.managers.PlayerLocationManager;
import dev.siskel.poketDimensions.managers.PoketDimensionManager;
-import org.bukkit.Bukkit;
+import org.bukkit.*;
import org.bukkit.command.PluginCommand;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.player.PlayerPreLoginEvent;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
@@ -51,6 +58,15 @@ public final class PoketDimensions extends JavaPlugin {
((PluginCommand)Objects.requireNonNull(this.getCommand("pdtp"))).setExecutor(new pdtp());
((PluginCommand)Objects.requireNonNull(this.getCommand("pd"))).setExecutor(new pd(inviteManager, pocketDimensionManager));
((PluginCommand)Objects.requireNonNull(this.getCommand("pdgamerule"))).setExecutor(new pdgamerule());
+
+ PoketDimensionsWorldLoader pwl = new PoketDimensionsWorldLoader();
+
+ Bukkit.getScheduler().runTask(this, () -> {
+ pwl.loadAllWorldsInFolder("poketdimensions");
+ });
+
+
+
this.logger.info("Plugin Activated!");
}
diff --git a/src/main/java/dev/siskel/poketDimensions/classes/PlayerLocation.java b/src/main/java/dev/siskel/poketDimensions/classes/PlayerLocation.java
new file mode 100644
index 0000000..22783b6
--- /dev/null
+++ b/src/main/java/dev/siskel/poketDimensions/classes/PlayerLocation.java
@@ -0,0 +1,52 @@
+package dev.siskel.poketDimensions.classes;
+
+import org.bukkit.Location;
+
+public class PlayerLocation {
+ private String world;
+ private double x, y, z;
+ private float yaw, pitch;
+
+ public PlayerLocation(String world, double x, double y, double z, float yaw, float pitch) {
+ this.world = world;
+ this.x = x;
+ this.y = y;
+ this.z = z;
+ this.yaw = yaw;
+ this.pitch = pitch;
+ }
+
+ public PlayerLocation(Location loc) {
+ this(loc.getWorld().getName(), loc.getX(), loc.getY(), loc.getZ(), loc.getYaw(), loc.getPitch());
+ }
+
+ public String getWorld() {
+ return world;
+ }
+
+ public double getX() {
+ return x;
+ }
+
+ public double getY() {
+ return y;
+ }
+
+ public double getZ() {
+ return z;
+ }
+
+ public float getYaw() {
+ return yaw;
+ }
+
+ public float getPitch() {
+ return pitch;
+ }
+
+ // Convert back to Bukkit Location (requires a reference to the server/world)
+ public Location toLocation(org.bukkit.Server server) {
+ if (server.getWorld(world) == null) return null;
+ return new Location(server.getWorld(world), x, y, z, yaw, pitch);
+ }
+}
diff --git a/src/main/java/dev/siskel/poketDimensions/commands/pdgamerule.java b/src/main/java/dev/siskel/poketDimensions/commands/pdgamerule.java
index 8399f08..9c53ebe 100644
--- a/src/main/java/dev/siskel/poketDimensions/commands/pdgamerule.java
+++ b/src/main/java/dev/siskel/poketDimensions/commands/pdgamerule.java
@@ -30,7 +30,7 @@ public class pdgamerule implements CommandExecutor, TabCompleter {
return true;
} else {
OfflinePlayer targetPlayer = Bukkit.getOfflinePlayer(args[0]);
- String worldName = "pocketdimension-" + targetPlayer.getUniqueId().toString();
+ String worldName = "poketdimensions/pocketdimension-" + targetPlayer.getUniqueId().toString();
File worldFolder = new File(Bukkit.getWorldContainer(), worldName);
if (worldFolder.exists() && worldFolder.isDirectory()) {
World targetWorld = Bukkit.getWorld(worldName);
@@ -97,7 +97,7 @@ public class pdgamerule implements CommandExecutor, TabCompleter {
List suggestions = new ArrayList();
if (args.length == 2) {
OfflinePlayer targetPlayer = Bukkit.getOfflinePlayer(args[0]);
- String worldName = "pocketdimension-" + targetPlayer.getUniqueId().toString();
+ String worldName = "poketdimensions/pocketdimension-" + targetPlayer.getUniqueId().toString();
World targetWorld = Bukkit.getWorld(worldName);
if (targetWorld != null) {
for(String gameRule : targetWorld.getGameRules()) {
diff --git a/src/main/java/dev/siskel/poketDimensions/commands/pdtp.java b/src/main/java/dev/siskel/poketDimensions/commands/pdtp.java
index 51f7581..0fd69f3 100644
--- a/src/main/java/dev/siskel/poketDimensions/commands/pdtp.java
+++ b/src/main/java/dev/siskel/poketDimensions/commands/pdtp.java
@@ -26,7 +26,7 @@ public class pdtp implements CommandExecutor {
return true;
} else {
OfflinePlayer targetPlayer = Bukkit.getOfflinePlayer(args[0]);
- String worldName = "pocketdimension-" + targetPlayer.getUniqueId().toString();
+ String worldName = "poketdimensions/pocketdimension-" + targetPlayer.getUniqueId().toString();
File worldFolder = new File(Bukkit.getWorldContainer(), worldName);
if (worldFolder.exists() && worldFolder.isDirectory()) {
World targetWorld = Bukkit.getWorld(worldName);
diff --git a/src/main/java/dev/siskel/poketDimensions/events/PlayerInteract.java b/src/main/java/dev/siskel/poketDimensions/events/PlayerInteract.java
index 04cef81..31c619f 100644
--- a/src/main/java/dev/siskel/poketDimensions/events/PlayerInteract.java
+++ b/src/main/java/dev/siskel/poketDimensions/events/PlayerInteract.java
@@ -14,6 +14,7 @@ import dev.siskel.poketDimensions.managers.LocationManager;
import org.bukkit.*;
import org.bukkit.World.Environment;
+import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
@@ -70,9 +71,9 @@ public class PlayerInteract implements Listener {
ItemMeta meta = item.getItemMeta();
if (meta != null && meta.getPersistentDataContainer().has(pdKey, PersistentDataType.STRING)) {
String pdValue = (String) meta.getPersistentDataContainer().get(pdKey, PersistentDataType.STRING);
- World playerpdd = Bukkit.getWorld("pocketdimension-" + p.getUniqueId().toString());
+ World playerpdd = Bukkit.getWorld("poketdimensions/pocketdimension-" + p.getUniqueId().toString());
if ((a == Action.RIGHT_CLICK_BLOCK || a == Action.RIGHT_CLICK_AIR) && pdValue != null && pdValue.equals(p.getUniqueId().toString()) && playerpdd == null) {
- WorldCreator pocketdimensioncreator = (new WorldCreator("pocketdimension-" + p.getUniqueId().toString())).type(WorldType.FLAT).generateStructures(false).seed(1L).environment(Environment.NORMAL).generator(new VoidWorldGenerator.VoidWorld());
+ WorldCreator pocketdimensioncreator = (new WorldCreator("poketdimensions/pocketdimension-" + p.getUniqueId().toString())).type(WorldType.FLAT).generateStructures(false).seed(1L).environment(Environment.NORMAL).generator(new VoidWorldGenerator.VoidWorld());
p.sendMessage(ChatColor.GREEN + "Loading your pocket dimension!");
playerpdd = Bukkit.createWorld(pocketdimensioncreator);
if (playerpdd == null) {
@@ -86,8 +87,8 @@ public class PlayerInteract implements Listener {
createBasePlatform(playerpdd);
}
- if (p.getWorld() != Bukkit.getWorld("pocketdimension-" + p.getUniqueId().toString())) {
- final World playerpd = Bukkit.getWorld("pocketdimension-" + p.getUniqueId().toString());
+ if (p.getWorld() != Bukkit.getWorld("poketdimensions/pocketdimension-" + p.getUniqueId().toString())) {
+ final World playerpd = Bukkit.getWorld("poketdimensions/pocketdimension-" + p.getUniqueId().toString());
if (playerpd != null) {
WorldBorder worldBorder = playerpd.getWorldBorder();
worldBorder.setCenter((double) 0.0F, (double) 0.0F);
@@ -183,7 +184,7 @@ public class PlayerInteract implements Listener {
p.sendMessage(ChatColor.RED + "Failed to load the pocket dimension.");
this.logger.severe("Failed to load the pocket dimension.");
}
- } else if (p.getWorld() == Bukkit.getWorld("pocketdimension-" + p.getUniqueId().toString()) && Bukkit.getWorld("pocketdimension-" + p.getUniqueId().toString()) != null) {
+ } else if (p.getWorld() == Bukkit.getWorld("poketdimensions/pocketdimension-" + p.getUniqueId().toString()) && Bukkit.getWorld("poketdimensions/pocketdimension-" + p.getUniqueId().toString()) != null) {
p.sendMessage("Sending you back to the main world.");
locman.saveLastLocation(p, true);
Location lastLocation = locman.getLastLocation(p, false);
diff --git a/src/main/java/dev/siskel/poketDimensions/loader/PoketDimensionsWorldLoader.java b/src/main/java/dev/siskel/poketDimensions/loader/PoketDimensionsWorldLoader.java
new file mode 100644
index 0000000..1295f7f
--- /dev/null
+++ b/src/main/java/dev/siskel/poketDimensions/loader/PoketDimensionsWorldLoader.java
@@ -0,0 +1,51 @@
+package dev.siskel.poketDimensions.loader;
+
+import org.bukkit.Bukkit;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+
+import java.io.File;
+
+public class PoketDimensionsWorldLoader {
+ public World createWorldInFolder(String folderName, String worldName) {
+ // Build the path relative to server root, e.g. "worlds/myworld"
+ String worldPath = folderName + "/" + worldName;
+
+ WorldCreator creator = new WorldCreator(worldPath);
+ World world = Bukkit.createWorld(creator);
+
+ return world;
+ }
+
+ public void loadAllWorldsInFolder(String folderName) {
+ File folder = new File(Bukkit.getServer().getWorldContainer(), folderName);
+ if (!folder.exists() || !folder.isDirectory()) {
+ Bukkit.getLogger().warning("Folder '" + folderName + "' does not exist or is not a directory.");
+ return;
+ }
+
+ File[] files = folder.listFiles(File::isDirectory);
+ if (files == null) {
+ Bukkit.getLogger().warning("Failed to list subdirectories in '" + folderName + "'.");
+ return;
+ }
+
+ for (File worldDir : files) {
+ String worldPath = folderName + "/" + worldDir.getName();
+
+ // Check if world is already loaded to avoid duplication
+ if (Bukkit.getWorld(worldDir.getName()) == null) {
+ WorldCreator creator = new WorldCreator(worldPath);
+ World world = Bukkit.createWorld(creator);
+
+ if (world != null) {
+ Bukkit.getLogger().info("Loaded world: " + world.getName());
+ } else {
+ Bukkit.getLogger().warning("Failed to load world: " + worldDir.getName());
+ }
+ } else {
+ Bukkit.getLogger().info("World already loaded: " + worldDir.getName());
+ }
+ }
+ }
+}
diff --git a/src/main/java/dev/siskel/poketDimensions/managers/InviteManager.java b/src/main/java/dev/siskel/poketDimensions/managers/InviteManager.java
index 8293de5..7d931ef 100644
--- a/src/main/java/dev/siskel/poketDimensions/managers/InviteManager.java
+++ b/src/main/java/dev/siskel/poketDimensions/managers/InviteManager.java
@@ -24,10 +24,10 @@ public class InviteManager {
}
public void sendInvite(final Player playerFrom, final Player playerTo) {
- if (Bukkit.getWorld("pocketdimension-" + playerFrom.getUniqueId().toString()) == null) {
+ if (Bukkit.getWorld("poketdimensions/pocketdimension-" + playerFrom.getUniqueId().toString()) == null) {
playerFrom.sendMessage("You don't have a pocket dimension!");
} else {
- World pocketDimensionWorld = Bukkit.getWorld("pocketdimension-" + playerFrom.getUniqueId().toString());
+ World pocketDimensionWorld = Bukkit.getWorld("poketdimensions/pocketdimension-" + playerFrom.getUniqueId().toString());
if (playerFrom.getWorld() != pocketDimensionWorld) {
playerFrom.sendMessage("You're not in your pocket dimension!");
} else {
@@ -60,7 +60,7 @@ public class InviteManager {
if (invite == null) {
playerTo.sendMessage(ChatColor.RED + "No invites.");
} else {
- String worldName = "pocketdimension-" + invite.getFrom().getUniqueId().toString();
+ String worldName = "poketdimensions/pocketdimension-" + invite.getFrom().getUniqueId().toString();
World pocketDimensionWorld = Bukkit.getWorld(worldName);
if (pocketDimensionWorld == null) {
playerTo.sendMessage("Hmm, we can't find that pocket dimension. Ask for another invite?");
diff --git a/src/main/java/dev/siskel/poketDimensions/managers/PlayerLocationManager.java b/src/main/java/dev/siskel/poketDimensions/managers/PlayerLocationManager.java
new file mode 100644
index 0000000..015424e
--- /dev/null
+++ b/src/main/java/dev/siskel/poketDimensions/managers/PlayerLocationManager.java
@@ -0,0 +1,101 @@
+package dev.siskel.poketDimensions.managers;
+
+import dev.siskel.poketDimensions.classes.PlayerLocation;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.plugin.java.JavaPlugin;
+
+import java.io.File;
+import java.io.IOException;
+
+public class PlayerLocationManager extends JavaPlugin implements Listener {
+
+ private File dataFile;
+ private FileConfiguration dataConfig;
+
+ @Override
+ public void onEnable() {
+ dataFile = new File(getDataFolder(), "player-locations.yml");
+ if (!dataFile.exists()) {
+ dataFile.getParentFile().mkdirs();
+ saveResource("player-locations.yml", false);
+ }
+ dataConfig = YamlConfiguration.loadConfiguration(dataFile);
+
+ Bukkit.getPluginManager().registerEvents(this, this);
+ }
+
+ @EventHandler
+ public void onPlayerQuit(PlayerQuitEvent event) {
+ Player player = event.getPlayer();
+ savePlayerLocation(player);
+ }
+
+ @EventHandler
+ public void onPlayerJoin(PlayerJoinEvent event) {
+ Player player = event.getPlayer();
+ PlayerLocation savedLoc = loadPlayerLocation(player);
+
+ if (savedLoc != null) {
+ World world = Bukkit.getWorld(savedLoc.getWorld());
+ if (world == null) {
+ // World is not loaded, so load it
+ world = Bukkit.createWorld(new WorldCreator(savedLoc.getWorld()));
+ }
+
+ // Now teleport the player to their last location
+ Location loc = savedLoc.toLocation(Bukkit.getServer());
+ if (loc != null) {
+ // Delay teleport by 1 tick to ensure player is fully loaded in the world
+ Bukkit.getScheduler().runTaskLater(this, () -> player.teleport(loc), 1L);
+ }
+ }
+ }
+
+ // Save player location to file
+ public void savePlayerLocation(Player player) {
+ Location loc = player.getLocation();
+ String path = "players." + player.getUniqueId();
+
+ dataConfig.set(path + ".world", loc.getWorld().getName());
+ dataConfig.set(path + ".x", loc.getX());
+ dataConfig.set(path + ".y", loc.getY());
+ dataConfig.set(path + ".z", loc.getZ());
+ dataConfig.set(path + ".yaw", loc.getYaw());
+ dataConfig.set(path + ".pitch", loc.getPitch());
+
+ try {
+ dataConfig.save(dataFile);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // Load player location from file as PlayerLocation object
+ public PlayerLocation loadPlayerLocation(Player player) {
+ String path = "players." + player.getUniqueId();
+
+ if (!dataConfig.contains(path)) {
+ return null; // No saved location
+ }
+
+ String world = dataConfig.getString(path + ".world");
+ double x = dataConfig.getDouble(path + ".x");
+ double y = dataConfig.getDouble(path + ".y");
+ double z = dataConfig.getDouble(path + ".z");
+ float yaw = (float) dataConfig.getDouble(path + ".yaw");
+ float pitch = (float) dataConfig.getDouble(path + ".pitch");
+
+ return new PlayerLocation(world, x, y, z, yaw, pitch);
+ }
+
+}
diff --git a/src/main/java/dev/siskel/poketDimensions/managers/PoketDimensionManager.java b/src/main/java/dev/siskel/poketDimensions/managers/PoketDimensionManager.java
index 15a627c..14b3241 100644
--- a/src/main/java/dev/siskel/poketDimensions/managers/PoketDimensionManager.java
+++ b/src/main/java/dev/siskel/poketDimensions/managers/PoketDimensionManager.java
@@ -25,10 +25,10 @@ public class PoketDimensionManager {
}
public void kick(Player playerFrom, Player playerTo) {
- if (Bukkit.getWorld("pocketdimension-" + playerFrom.getUniqueId().toString()) == null) {
+ if (Bukkit.getWorld("poketdimensions/pocketdimension-" + playerFrom.getUniqueId().toString()) == null) {
playerFrom.sendMessage("ChatColor.RED + You don't have a pocket dimension!");
} else {
- World pocketDimensionWorld = Bukkit.getWorld("pocketdimension-" + playerFrom.getUniqueId().toString());
+ World pocketDimensionWorld = Bukkit.getWorld("poketdimensions/pocketdimension-" + playerFrom.getUniqueId().toString());
if (playerFrom.getWorld() != playerTo.getWorld()) {
playerFrom.sendMessage(ChatColor.RED + "Player is not in your pocket dimension.");
} else if (!playerTo.hasPermission("pocketdimensions.commands.player.pd.kick.bypass") && !playerTo.isOp()) {