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()) {