MasterCake 1 year ago
commit
c78ec875a6

+ 58 - 0
pom.xml

@@ -0,0 +1,58 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  <groupId>de.linus122</groupId>
+  <artifactId>playerworlds</artifactId>
+  <version>0.0.3-SNAPSHOT</version>
+  <name>PlayerWorlds</name>
+  
+  <repositories>
+	  	<!-- Repo for Spigot -->
+	    <repository>
+	      <id>spigot-repo</id>
+	      <url>https://hub.spigotmc.org/nexus/content/groups/public/</url>
+	    </repository>
+  </repositories>
+  <dependencies>
+      <dependency>
+      <groupId>org.spigotmc</groupId>
+      <artifactId>spigot</artifactId>
+      <version>1.19.2-R0.1-SNAPSHOT</version>
+      <scope>provided</scope>
+    </dependency>
+  </dependencies>
+   <build>
+    <sourceDirectory>${basedir}/src</sourceDirectory>
+    <!-- Uses the properties in this file for plugin.yml and config.yml -->
+    <resources>
+      <resource>
+        <directory>${basedir}/src/resources</directory>
+        <filtering>true</filtering>
+        <includes>
+          <include>plugin.yml</include>
+          <include>config.yml</include>
+          <include>LICENSE</include>
+        </includes>
+      </resource>
+    </resources>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <version>2.4</version>
+        <configuration>
+          <outputDirectory>${dir}</outputDirectory>
+          <finalName>${project.name}-${project.version}</finalName>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-compiler-plugin</artifactId>
+        <version>3.1</version>
+        <configuration>
+          <source>11</source>
+          <target>11</target>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+</project>

+ 134 - 0
src/main/java/de/linus122/playerworlds/Listeners.java

@@ -0,0 +1,134 @@
+package de.linus122.playerworlds;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.function.Consumer;
+import net.minecraft.core.Position;
+import org.apache.commons.io.FileUtils;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.World;
+import org.bukkit.WorldCreator;
+import org.bukkit.World.Environment;
+import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;
+import org.bukkit.craftbukkit.v1_19_R1.entity.CraftEntity;
+import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
+import org.bukkit.event.Cancellable;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityPortalEvent;
+import org.bukkit.event.player.PlayerRespawnEvent;
+import org.bukkit.event.player.PlayerTeleportEvent;
+import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
+
+public class Listeners implements Listener {
+   private final Main main;
+   
+   private final String SUFFIX_NETHER = "_nether";
+   private final String SUFFIX_END = "_the_end";
+
+   public Listeners(Main main) {
+      this.main = main;
+   }
+
+   @EventHandler
+   public void onEntityTeleport(EntityPortalEvent event) {
+      this.main.debug("EntityPortalEvent %s %s -> %s".formatted(event.getEntityType(), event.getFrom().getWorld().getName(), event.getTo().getWorld().getName()));
+      
+      if (!event.getFrom().getWorld().equals(event.getTo().getWorld())) {
+         if (event.getFrom().getWorld().getEnvironment().equals(Environment.NETHER) ^ event.getTo().getWorld().getEnvironment().equals(Environment.NETHER)) {
+            this.onTeleport(event.getFrom(), event.getTo(), TeleportCause.NETHER_PORTAL, world -> {
+                CraftEntity craftEntity = (CraftEntity)event.getEntity();
+                craftEntity.getHandle().teleportTo(((CraftWorld) world).getHandle(), (Position) null);
+                this.main.debug("Entity teleported %s %s -> %s".formatted(event.getEntityType(), event.getFrom().getWorld().getName(), world.getName()));
+            }, event);
+         }
+
+         if (event.getFrom().getWorld().getEnvironment().equals(Environment.THE_END) ^ event.getTo().getWorld().getEnvironment().equals(Environment.THE_END)) {
+             this.onTeleport(event.getFrom(), event.getTo(), TeleportCause.END_PORTAL, world -> {
+                 CraftEntity craftEntity = (CraftEntity)event.getEntity();
+                 craftEntity.getHandle().teleportTo(((CraftWorld) world).getHandle(), (Position) null);
+                 this.main.debug("Entity teleported %s %s -> %s".formatted(event.getEntityType(), event.getFrom().getWorld().getName(), world.getName()));
+             }, event);
+         }
+      }
+
+   }
+
+   @EventHandler
+   public void onRespawn(PlayerRespawnEvent event) {
+      if (event.getPlayer().getLocation().getBlock().getType().equals(Material.END_PORTAL) && event.getPlayer().getLocation().getWorld().getEnvironment() == Environment.THE_END) {
+         String newName = event.getPlayer().getWorld().getName().replaceFirst("_the_end", "");
+         World world = Bukkit.getWorld(newName);
+         Location respawnLocation = world.getSpawnLocation();
+         if (event.getPlayer().getBedSpawnLocation() != null) {
+            respawnLocation = event.getPlayer().getBedSpawnLocation();
+         }
+
+         event.setRespawnLocation(respawnLocation);
+         this.main.debug("Respawn from end %s %s -> %s".formatted(event.getPlayer().getName(), event.getPlayer().getLocation().getWorld().getName(), respawnLocation));
+      }
+
+   }
+
+   @EventHandler
+   public void onTeleport(PlayerTeleportEvent event) {
+      this.main.debug("PlayerTeleportEvent %s %s -> %s".formatted(event.getPlayer().getName(), event.getFrom().getWorld().getName(), event.getTo().getWorld().getName()));
+      
+      this.onTeleport(event.getFrom(), event.getTo(), event.getCause(), world -> {
+          CraftPlayer craftPlayer = (CraftPlayer) event.getPlayer();
+          craftPlayer.getHandle().changeDimension(((CraftWorld)world).getHandle(), event.getCause());
+          this.main.debug("Player teleported %s -> %s".formatted(event.getFrom().getWorld().getName(), world.getName()));
+      }, event);
+   }
+
+   private void onTeleport(Location from, Location to, TeleportCause cause, Consumer<World> action, Cancellable event) {
+      Environment fromEnv = from.getWorld().getEnvironment();
+      Environment toEnv = to.getWorld().getEnvironment();
+      if (to.getWorld().getName().startsWith("world")) {
+         if (cause.equals(TeleportCause.NETHER_PORTAL) || cause.equals(TeleportCause.END_PORTAL) || cause.equals(TeleportCause.END_GATEWAY)) {
+            String newWorldname = null;
+            if (fromEnv.equals(Environment.NORMAL) && toEnv.equals(Environment.NETHER)) {
+               newWorldname = from.getWorld().getName() + SUFFIX_NETHER;
+            } else if (fromEnv.equals(Environment.NETHER) && toEnv.equals(Environment.NORMAL)) {
+               newWorldname = from.getWorld().getName().replaceFirst(SUFFIX_NETHER, "");
+            } else if (fromEnv.equals(Environment.NORMAL) && toEnv.equals(Environment.THE_END)) {
+               newWorldname = from.getWorld().getName() + SUFFIX_END;
+            } else if (fromEnv.equals(Environment.THE_END) && toEnv.equals(Environment.NORMAL)) {
+               newWorldname = from.getWorld().getName().replaceFirst(SUFFIX_END, "");
+            }
+
+            World toNew = Bukkit.getWorld(newWorldname);
+            if (toNew == null && !toEnv.equals(Environment.NORMAL)) {
+               try {
+                  this.copyNewWorld(newWorldname, toEnv);
+               } catch (IOException exception) {
+            	   exception.printStackTrace();
+               }
+
+               WorldCreator wc = new WorldCreator(newWorldname);
+               wc.environment(toEnv);
+               wc.createWorld();
+               toNew = Bukkit.getWorld(newWorldname);
+            }
+
+            event.setCancelled(true);
+            action.accept(toNew);
+         }
+
+      }
+   }
+
+   private void copyNewWorld(String worldName, Environment env) throws IOException {
+      File newWorldFolder = new File(worldName);
+      if (!newWorldFolder.exists()) {
+         String originalWorldFolderName = this.main.getConfig().getString(env.toString().toLowerCase());
+         this.main.getLogger().info(originalWorldFolderName);
+         
+         File sourceWorldFolder = new File(this.main.getDataFolder(), originalWorldFolderName);
+         FileUtils.copyDirectory(sourceWorldFolder, newWorldFolder);
+      }
+
+   }
+}

+ 18 - 0
src/main/java/de/linus122/playerworlds/Main.java

@@ -0,0 +1,18 @@
+package de.linus122.playerworlds;
+
+import org.bukkit.Bukkit;
+import org.bukkit.plugin.java.JavaPlugin;
+
+public class Main extends JavaPlugin {
+   public void onEnable() {
+      this.saveDefaultConfig();
+      Bukkit.getPluginManager().registerEvents(new Listeners(this), this);
+   }
+
+   public void debug(String message) {
+      if (this.getConfig().getBoolean("debug")) {
+         this.getLogger().info(message);
+      }
+
+   }
+}

+ 5 - 0
src/resources/config.yml

@@ -0,0 +1,5 @@
+world_folders:
+    nether: world_nether
+    the_end: world_the_end
+    
+debug: true

+ 5 - 0
src/resources/plugin.yml

@@ -0,0 +1,5 @@
+name: PlayerWorlds
+version: ${project.version}
+main: de.linus122.playerworlds.Main
+author: Linus122
+api-version: 1.19