Listeners.java 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. package de.linus122.playerworlds;
  2. import java.io.File;
  3. import java.io.IOException;
  4. import java.util.function.Consumer;
  5. import net.minecraft.core.Position;
  6. import org.apache.commons.io.FileUtils;
  7. import org.bukkit.Bukkit;
  8. import org.bukkit.Location;
  9. import org.bukkit.Material;
  10. import org.bukkit.World;
  11. import org.bukkit.WorldCreator;
  12. import org.bukkit.World.Environment;
  13. import org.bukkit.craftbukkit.v1_19_R1.CraftWorld;
  14. import org.bukkit.craftbukkit.v1_19_R1.entity.CraftEntity;
  15. import org.bukkit.craftbukkit.v1_19_R1.entity.CraftPlayer;
  16. import org.bukkit.event.Cancellable;
  17. import org.bukkit.event.EventHandler;
  18. import org.bukkit.event.Listener;
  19. import org.bukkit.event.entity.EntityPortalEvent;
  20. import org.bukkit.event.player.PlayerRespawnEvent;
  21. import org.bukkit.event.player.PlayerTeleportEvent;
  22. import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause;
  23. public class Listeners implements Listener {
  24. private final Main main;
  25. private final String SUFFIX_NETHER = "_nether";
  26. private final String SUFFIX_END = "_the_end";
  27. public Listeners(Main main) {
  28. this.main = main;
  29. }
  30. @EventHandler
  31. public void onEntityTeleport(EntityPortalEvent event) {
  32. this.main.debug("EntityPortalEvent %s %s -> %s".formatted(event.getEntityType(), event.getFrom().getWorld().getName(), event.getTo().getWorld().getName()));
  33. if (!event.getFrom().getWorld().equals(event.getTo().getWorld())) {
  34. if (event.getFrom().getWorld().getEnvironment().equals(Environment.NETHER) ^ event.getTo().getWorld().getEnvironment().equals(Environment.NETHER)) {
  35. this.onTeleport(event.getFrom(), event.getTo(), TeleportCause.NETHER_PORTAL, world -> {
  36. CraftEntity craftEntity = (CraftEntity)event.getEntity();
  37. craftEntity.getHandle().teleportTo(((CraftWorld) world).getHandle(), (Position) null);
  38. this.main.debug("Entity teleported %s %s -> %s".formatted(event.getEntityType(), event.getFrom().getWorld().getName(), world.getName()));
  39. }, event);
  40. }
  41. if (event.getFrom().getWorld().getEnvironment().equals(Environment.THE_END) ^ event.getTo().getWorld().getEnvironment().equals(Environment.THE_END)) {
  42. this.onTeleport(event.getFrom(), event.getTo(), TeleportCause.END_PORTAL, world -> {
  43. CraftEntity craftEntity = (CraftEntity)event.getEntity();
  44. craftEntity.getHandle().teleportTo(((CraftWorld) world).getHandle(), (Position) null);
  45. this.main.debug("Entity teleported %s %s -> %s".formatted(event.getEntityType(), event.getFrom().getWorld().getName(), world.getName()));
  46. }, event);
  47. }
  48. }
  49. }
  50. @EventHandler
  51. public void onRespawn(PlayerRespawnEvent event) {
  52. if (event.getPlayer().getLocation().getBlock().getType().equals(Material.END_PORTAL) && event.getPlayer().getLocation().getWorld().getEnvironment() == Environment.THE_END) {
  53. String newName = event.getPlayer().getWorld().getName().replaceFirst("_the_end", "");
  54. World world = Bukkit.getWorld(newName);
  55. Location respawnLocation = world.getSpawnLocation();
  56. if (event.getPlayer().getBedSpawnLocation() != null) {
  57. respawnLocation = event.getPlayer().getBedSpawnLocation();
  58. }
  59. event.setRespawnLocation(respawnLocation);
  60. this.main.debug("Respawn from end %s %s -> %s".formatted(event.getPlayer().getName(), event.getPlayer().getLocation().getWorld().getName(), respawnLocation));
  61. }
  62. }
  63. @EventHandler
  64. public void onTeleport(PlayerTeleportEvent event) {
  65. this.main.debug("PlayerTeleportEvent %s %s -> %s".formatted(event.getPlayer().getName(), event.getFrom().getWorld().getName(), event.getTo().getWorld().getName()));
  66. this.onTeleport(event.getFrom(), event.getTo(), event.getCause(), world -> {
  67. CraftPlayer craftPlayer = (CraftPlayer) event.getPlayer();
  68. craftPlayer.getHandle().changeDimension(((CraftWorld)world).getHandle(), event.getCause());
  69. this.main.debug("Player teleported %s -> %s".formatted(event.getFrom().getWorld().getName(), world.getName()));
  70. }, event);
  71. }
  72. private void onTeleport(Location from, Location to, TeleportCause cause, Consumer<World> action, Cancellable event) {
  73. Environment fromEnv = from.getWorld().getEnvironment();
  74. Environment toEnv = to.getWorld().getEnvironment();
  75. if (to.getWorld().getName().startsWith("world")) {
  76. if (cause.equals(TeleportCause.NETHER_PORTAL) || cause.equals(TeleportCause.END_PORTAL) || cause.equals(TeleportCause.END_GATEWAY)) {
  77. String newWorldname = null;
  78. if (fromEnv.equals(Environment.NORMAL) && toEnv.equals(Environment.NETHER)) {
  79. newWorldname = from.getWorld().getName() + SUFFIX_NETHER;
  80. } else if (fromEnv.equals(Environment.NETHER) && toEnv.equals(Environment.NORMAL)) {
  81. newWorldname = from.getWorld().getName().replaceFirst(SUFFIX_NETHER, "");
  82. } else if (fromEnv.equals(Environment.NORMAL) && toEnv.equals(Environment.THE_END)) {
  83. newWorldname = from.getWorld().getName() + SUFFIX_END;
  84. } else if (fromEnv.equals(Environment.THE_END) && toEnv.equals(Environment.NORMAL)) {
  85. newWorldname = from.getWorld().getName().replaceFirst(SUFFIX_END, "");
  86. }
  87. World toNew = Bukkit.getWorld(newWorldname);
  88. if (toNew == null && !toEnv.equals(Environment.NORMAL)) {
  89. try {
  90. this.copyNewWorld(newWorldname, toEnv);
  91. } catch (IOException exception) {
  92. exception.printStackTrace();
  93. }
  94. WorldCreator wc = new WorldCreator(newWorldname);
  95. wc.environment(toEnv);
  96. wc.createWorld();
  97. toNew = Bukkit.getWorld(newWorldname);
  98. }
  99. event.setCancelled(true);
  100. action.accept(toNew);
  101. }
  102. }
  103. }
  104. private void copyNewWorld(String worldName, Environment env) throws IOException {
  105. File newWorldFolder = new File(worldName);
  106. if (!newWorldFolder.exists()) {
  107. String originalWorldFolderName = this.main.getConfig().getString(env.toString().toLowerCase());
  108. this.main.getLogger().info(originalWorldFolderName);
  109. File sourceWorldFolder = new File(this.main.getDataFolder(), originalWorldFolderName);
  110. FileUtils.copyDirectory(sourceWorldFolder, newWorldFolder);
  111. }
  112. }
  113. }