feat: implemented PreloadedWorldModule
This commit is contained in:
parent
32b51e8523
commit
516129e898
@ -0,0 +1,63 @@
|
||||
package ru.dragonestia.msb3.api.module;
|
||||
|
||||
import net.minestom.server.MinecraftServer;
|
||||
import net.minestom.server.coordinate.Pos;
|
||||
import net.minestom.server.entity.GameMode;
|
||||
import net.minestom.server.event.player.AsyncPlayerConfigurationEvent;
|
||||
import net.minestom.server.event.player.PlayerDisconnectEvent;
|
||||
import net.minestom.server.event.player.PlayerMoveEvent;
|
||||
import net.minestom.server.event.player.PlayerSpawnEvent;
|
||||
import ru.dragonestia.msb3.api.world.World;
|
||||
import ru.dragonestia.msb3.api.world.WorldFactory;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
public class PreloadedWorldModule {
|
||||
|
||||
private static boolean used = false;
|
||||
|
||||
private PreloadedWorldModule() {}
|
||||
|
||||
public static void init(File worldDir, GameMode gameMode, Pos spawnPos) {
|
||||
init(worldDir, gameMode, () -> spawnPos);
|
||||
}
|
||||
|
||||
public static synchronized void init(File worldDir, GameMode gameMode, Supplier<Pos> spawnPosSupplier) {
|
||||
if (used) return;
|
||||
used = true;
|
||||
|
||||
var loadingWorld = MinecraftServer.getInstanceManager().createInstanceContainer();
|
||||
loadingWorld.eventNode().addListener(PlayerMoveEvent.class, event -> event.setCancelled(true));
|
||||
|
||||
var factory = WorldFactory.anvil(worldDir);
|
||||
var worlds = new ConcurrentHashMap<UUID, World>();
|
||||
|
||||
MinecraftServer.getGlobalEventHandler().addListener(AsyncPlayerConfigurationEvent.class, event -> {
|
||||
var player = event.getPlayer();
|
||||
|
||||
player.setRespawnPoint(new Pos(0, 60, 0));
|
||||
player.setGameMode(gameMode);
|
||||
|
||||
event.setSpawningInstance(loadingWorld);
|
||||
}).addListener(PlayerSpawnEvent.class, event -> {
|
||||
if (!event.isFirstSpawn()) return;
|
||||
|
||||
var player = event.getPlayer();
|
||||
factory.createWorld().thenAccept(world -> {
|
||||
worlds.put(player.getUuid(), world);
|
||||
player.setInstance(world.getInstance(), spawnPosSupplier.get());
|
||||
});
|
||||
}).addListener(PlayerDisconnectEvent.class, event -> {
|
||||
var player = event.getPlayer();
|
||||
var world = worlds.remove(player.getUuid());
|
||||
|
||||
if (world == null) return;
|
||||
if (world.getInstance().getEntityTracker().entities().stream().filter(entity -> entity != player).count() == 0) {
|
||||
world.unload();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user