diff --git a/src/main/java/net/minestom/server/entity/Player.java b/src/main/java/net/minestom/server/entity/Player.java index 5c450d813..f0d0e335f 100644 --- a/src/main/java/net/minestom/server/entity/Player.java +++ b/src/main/java/net/minestom/server/entity/Player.java @@ -616,6 +616,16 @@ public class Player extends LivingEntity implements CommandSender { return result; } + /** + * Changes the player instance and load surrounding chunks if needed. + *

+ * Be aware that because chunk operations are expensive, + * it is possible for this method to be non-blocking when retrieving chunks is required. + *

+ * When this method is called for the first time (during player login), the player will be teleport at {@link #getRespawnPoint()}. + * + * @param instance the new instance of the player + */ @Override public void setInstance(@NotNull Instance instance) { Check.notNull(instance, "instance cannot be null!"); @@ -683,6 +693,11 @@ public class Player extends LivingEntity implements CommandSender { private void spawnPlayer(Instance instance, boolean firstSpawn) { this.viewableEntities.forEach(entity -> entity.removeViewer(this)); super.setInstance(instance); + + if (firstSpawn) { + teleport(getRespawnPoint()); + } + PlayerSpawnEvent spawnEvent = new PlayerSpawnEvent(this, instance, firstSpawn); callEvent(PlayerSpawnEvent.class, spawnEvent); } diff --git a/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java b/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java index c4faa5e63..e6d8599fd 100644 --- a/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java +++ b/src/main/java/net/minestom/server/event/player/PlayerLoginEvent.java @@ -35,7 +35,7 @@ public class PlayerLoginEvent extends Event { *

* WARNING: this must NOT be null, otherwise the player cannot spawn. * - * @return the spawning instance + * @return the spawning instance, null if not already defined */ @Nullable public Instance getSpawningInstance() { diff --git a/src/main/java/net/minestom/server/extras/optifine/OptifineSupport.java b/src/main/java/net/minestom/server/extras/optifine/OptifineSupport.java index 108702440..c7c4f0951 100644 --- a/src/main/java/net/minestom/server/extras/optifine/OptifineSupport.java +++ b/src/main/java/net/minestom/server/extras/optifine/OptifineSupport.java @@ -18,6 +18,8 @@ public final class OptifineSupport { /** * Enables optifine support by registering the required biomes. + * + * @throws IllegalStateException if optifine support is already enabled */ public static void enable() { Check.stateCondition(enabled, "Optifine support is already enabled!"); diff --git a/src/main/java/net/minestom/server/world/biomes/Biome.java b/src/main/java/net/minestom/server/world/biomes/Biome.java index a5d9bf628..586dacec9 100644 --- a/src/main/java/net/minestom/server/world/biomes/Biome.java +++ b/src/main/java/net/minestom/server/world/biomes/Biome.java @@ -17,7 +17,7 @@ import java.util.concurrent.atomic.AtomicInteger; @EqualsAndHashCode public class Biome { - public static final AtomicInteger idCounter = new AtomicInteger(0); + public static final AtomicInteger ID_COUNTER = new AtomicInteger(0); private static final BiomeEffects DEFAULT_EFFECTS = BiomeEffects.builder() .fog_color(0xC0D8FF) @@ -37,7 +37,7 @@ public class Biome { .effects(DEFAULT_EFFECTS) .build(); - private final int id = idCounter.getAndIncrement(); + private final int id = ID_COUNTER.getAndIncrement(); private final NamespaceID name; @Builder.Default diff --git a/src/main/java/net/minestom/server/world/biomes/BiomeManager.java b/src/main/java/net/minestom/server/world/biomes/BiomeManager.java index 55904c7a5..df8bfd92e 100644 --- a/src/main/java/net/minestom/server/world/biomes/BiomeManager.java +++ b/src/main/java/net/minestom/server/world/biomes/BiomeManager.java @@ -15,7 +15,7 @@ import java.util.Collections; *

* Contains {@link Biome#PLAINS} by default but can be removed. */ -public class BiomeManager { +public final class BiomeManager { private final Int2ObjectMap biomes = new Int2ObjectOpenHashMap<>(); diff --git a/src/test/java/demo/MainDemo.java b/src/test/java/demo/MainDemo.java index c449eaed0..6c0fcd6d6 100644 --- a/src/test/java/demo/MainDemo.java +++ b/src/test/java/demo/MainDemo.java @@ -1,9 +1,7 @@ package demo; import net.minestom.server.MinecraftServer; -import net.minestom.server.entity.GameMode; import net.minestom.server.event.player.PlayerLoginEvent; -import net.minestom.server.event.player.PlayerSpawnEvent; import net.minestom.server.instance.*; import net.minestom.server.instance.batch.ChunkBatch; import net.minestom.server.instance.block.Block; @@ -34,13 +32,7 @@ public class MainDemo { // Set the spawning instance player.addEventCallback(PlayerLoginEvent.class, event -> { event.setSpawningInstance(instanceContainer); - player.setRespawnPoint(new Position(0,45,0)); - }); - - // Teleport the player at spawn - player.addEventCallback(PlayerSpawnEvent.class, event -> { - player.teleport(new Position(0, 45, 0)); - player.setGameMode(GameMode.CREATIVE); + player.setRespawnPoint(new Position(0, 45, 0)); }); });