chunks load before entering the world

This commit is contained in:
Martin Olischläger 2023-04-17 00:14:26 +02:00
parent 447ecf2a93
commit c4095ff8ee
2 changed files with 29 additions and 8 deletions

View File

@ -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<Future> 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());
});
}
}

View File

@ -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<InventoryPreClickEvent> {
@ -14,18 +13,16 @@ public class InventoryClickListener implements Consumer<InventoryPreClickEvent>
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;
}
}