6 Commits

Author SHA1 Message Date
SiskelDev d0d7b31a73 Last Updates 2025-11-24 03:07:57 +01:00
SiskelDev 2f0999bf0b Update v1.1
PoketDimension now Loads Worlds on Load automatically and does not need a world managing plugin to function after a server restart. Additionally some Names were renamed.
2025-10-17 23:22:45 +02:00
SiskelDev 41baf27709 Renamed Project for Gradle 2025-09-19 21:45:12 +02:00
SiskelDev 1758b2c61f Create PoketDimensions.iml 2025-09-19 21:39:26 +02:00
SiskelDev 21416d2d1b Merge branch 'master' of https://github.com/SiskelDev/PoketDimensions 2025-09-19 21:35:58 +02:00
SiskelDev c930b18078 Create vcs.xml 2025-09-19 21:35:42 +02:00
16 changed files with 321 additions and 24 deletions
+9
View File
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>
+1 -1
View File
@@ -2,7 +2,7 @@
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/modules/untitled.main.iml" filepath="$PROJECT_DIR$/.idea/modules/untitled.main.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/PoketDimensions.main.iml" filepath="$PROJECT_DIR$/.idea/modules/PoketDimensions.main.iml" />
</modules>
</component>
</project>
Generated
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>
+1 -1
View File
@@ -3,7 +3,7 @@ plugins {
}
group = 'dev.siskel'
version = '1.0-SNAPSHOT'
version = '1.0'
repositories {
mavenCentral()
+1 -1
View File
@@ -1 +1 @@
rootProject.name = 'untitled'
rootProject.name = 'PoketDimensions'
@@ -10,12 +10,13 @@ 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.events.PlayerMove;
import dev.siskel.poketDimensions.loader.PoketDimensionsWorldLoader;
import dev.siskel.poketDimensions.managers.InviteManager;
import dev.siskel.poketDimensions.managers.PoketDimensionManager;
import org.bukkit.Bukkit;
import org.bukkit.*;
import org.bukkit.command.PluginCommand;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
public final class PoketDimensions extends JavaPlugin {
@@ -26,12 +27,6 @@ public final class PoketDimensions extends JavaPlugin {
@Override
public void onEnable() {
/*PluginManager var10002 = Bukkit.getPluginManager();
File f = new File(var10002.getPlugin("PocketDimensions").getDataFolder() + "/");
if (!f.exists()) {
f.mkdir();
}*/
getDataFolder().mkdirs();
File lastLocsFile = new File(getDataFolder(), "lastlocs.json");
@@ -47,10 +42,18 @@ public final class PoketDimensions extends JavaPlugin {
InviteManager inviteManager = new InviteManager();
PoketDimensionManager pocketDimensionManager = new PoketDimensionManager();
this.getServer().getPluginManager().registerEvents(new PlayerInteract(), this);
this.getServer().getPluginManager().registerEvents(new PlayerMove(), this);
((PluginCommand)Objects.requireNonNull(this.getCommand("givepd"))).setExecutor(new givepd());
((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!");
}
@@ -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);
}
}
@@ -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<String> 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()) {
@@ -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);
@@ -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);
@@ -0,0 +1,74 @@
package dev.siskel.poketDimensions.events;
import dev.siskel.poketDimensions.PoketDimensions;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.World;
import org.bukkit.block.Block;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.plugin.java.JavaPlugin;
public class PlayerMove implements Listener {
public PlayerMove() {
}
private static final int TARGET_Y = 200; // The Y coordinate to listen for
private static final int MIN_Y = -64; // Minimum world height to check from
private static final int MAX_Y_OFFSET = 384; // Max height offset to search upwards
@EventHandler
public void onPlayerMove(PlayerMoveEvent event) {
Player player = event.getPlayer();
Location loc = player.getLocation();
World world = loc.getWorld();
if (world != null && world.getName().contains("poketdimension")) {
// Check if player reached the target Y coordinate (block level)
if (loc.getBlockY() == -80 || loc.getBlockY() < -80) {
int x = loc.getBlockX();
int z = loc.getBlockZ();
int startY = Math.max(TARGET_Y, MIN_Y);
int maxY = Math.min(world.getMaxHeight() - 2, startY + MAX_Y_OFFSET);
Location teleportLocation = null;
boolean foundSpot = false;
// Search upwards from TARGET_Y for two consecutive air blocks with solid block underneath
for (int y = startY; y <= maxY; y++) {
Block below = world.getBlockAt(x, y - 1, z);
Block block1 = world.getBlockAt(x, y, z);
Block block2 = world.getBlockAt(x, y + 1, z);
if (block1.getType() == Material.AIR && block2.getType() == Material.AIR && below.getType().isSolid()) {
teleportLocation = new Location(world, x + 0.5, y, z + 0.5, loc.getYaw(), loc.getPitch());
foundSpot = true;
break;
}
}
// If no spot found, create stone block at (0, -50, 0) and teleport player above it
if (!foundSpot) {
int safeX = 0;
int safeY = TARGET_Y;
int safeZ = 0;
Block stoneBlock = world.getBlockAt(safeX, safeY, safeZ);
stoneBlock.setType(Material.STONE);
teleportLocation = new Location(world, safeX + 0.5, safeY + 1, safeZ + 0.5, loc.getYaw(), loc.getPitch());
player.sendMessage("No safe spot found at your location. Teleporting you to (0, 320, 0) on a stone block! You can Jump down without getting Damage.");
} else {
player.sendMessage("You fell out of your PoketDimension, teleporting you to a safe spot!");
}
player.teleport(teleportLocation);
}
}
}
}
@@ -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("[Poketdimension] Folder '" + folderName + "' does not exist or is not a directory.");
return;
}
File[] files = folder.listFiles(File::isDirectory);
if (files == null) {
Bukkit.getLogger().warning("[Poketdimension] 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("[Poketdimension] Loaded world: " + world.getName());
} else {
Bukkit.getLogger().warning("[Poketdimension] Failed to load world: " + worldDir.getName());
}
} else {
Bukkit.getLogger().info("[Poketdimension] World already loaded: " + worldDir.getName());
}
}
}
}
@@ -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?");
@@ -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);
}
}
@@ -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()) {