From c4095ff8ee34a62e8a0362b1985f300afb599cd7 Mon Sep 17 00:00:00 2001 From: Martin Date: Mon, 17 Apr 2023 00:14:26 +0200 Subject: [PATCH] chunks load before entering the world --- .../worldmuseum/listener/ChangeWorld.java | 24 +++++++++++++++++++ .../listener/InventoryClickListener.java | 13 ++++------ 2 files changed, 29 insertions(+), 8 deletions(-) create mode 100644 src/main/java/eu/mhsl/craftattack/worldmuseum/listener/ChangeWorld.java diff --git a/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/ChangeWorld.java b/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/ChangeWorld.java new file mode 100644 index 0000000..b1118b1 --- /dev/null +++ b/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/ChangeWorld.java @@ -0,0 +1,24 @@ +package eu.mhsl.craftattack.worldmuseum.listener; + +import eu.mhsl.craftattack.worldmuseum.worlds.World; +import net.minestom.server.MinecraftServer; +import net.minestom.server.entity.Player; +import net.minestom.server.utils.chunk.ChunkUtils; +import java.awt.*; +import java.util.ArrayList; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.Future; + +public class ChangeWorld { + public static void change_world(Player player, World targetWorld) { + ArrayList futures = new ArrayList<>(); + ChunkUtils.forChunksInRange(targetWorld.getSpawn(), MinecraftServer.getChunkViewDistance(),(v1, v2) -> { + futures.add(targetWorld.loadChunk(v1, v2)); + }); + CompletableFuture.allOf(futures.toArray(CompletableFuture[]::new)).thenRun(()-> { + player.setRespawnPoint(targetWorld.getSpawn()); + player.setInstance(targetWorld); + player.teleport(targetWorld.getSpawn()); + }); + } +} diff --git a/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/InventoryClickListener.java b/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/InventoryClickListener.java index a5e65f8..788a372 100644 --- a/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/InventoryClickListener.java +++ b/src/main/java/eu/mhsl/craftattack/worldmuseum/listener/InventoryClickListener.java @@ -4,8 +4,7 @@ import eu.mhsl.craftattack.worldmuseum.worlds.World; import eu.mhsl.craftattack.worldmuseum.worlds.WorldManager; import net.minestom.server.entity.Player; import net.minestom.server.event.inventory.InventoryPreClickEvent; - -import java.util.Iterator; +import java.util.Objects; import java.util.function.Consumer; public class InventoryClickListener implements Consumer { @@ -14,18 +13,16 @@ public class InventoryClickListener implements Consumer Player p = inventoryPreClickEvent.getPlayer(); inventoryPreClickEvent.setCancelled(true); WorldManager worldManager = WorldManager.getInstance(); - Iterator iterator = worldManager.getWorlds().iterator(); - while (iterator.hasNext()) { - World w = (World) iterator.next(); + for (World w : worldManager.getWorlds()) { if (!w.getItem().equals(inventoryPreClickEvent.getClickedItem())) continue; - if (p.getInstance().equals(w)) { + if (Objects.equals(p.getInstance(), w)) { p.closeInventory(); p.teleport(w.getSpawn()); return; } else { p.closeInventory(); - p.setInstance(w); - p.teleport(w.getSpawn()); + ChangeWorld.change_world(p, w); + return; } }