From 42e1adfc3a40b40de22d5a4c3f47b987a8862578 Mon Sep 17 00:00:00 2001 From: Christian Bergschneider Date: Tue, 7 Oct 2025 21:38:26 +0200 Subject: [PATCH 1/6] chore: update minestom dependency --- buildSrc/src/main/kotlin/Versions.kt | 2 +- platforms/minestom/build.gradle.kts | 2 +- platforms/minestom/example/build.gradle.kts | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/kotlin/Versions.kt b/buildSrc/src/main/kotlin/Versions.kt index a15448b01..6ee814bb1 100644 --- a/buildSrc/src/main/kotlin/Versions.kt +++ b/buildSrc/src/main/kotlin/Versions.kt @@ -96,6 +96,6 @@ object Versions { } object Minestom { - const val minestom = "1_21_6-a40d7115d4" + const val minestom = "2025.10.04-1.21.8" } } diff --git a/platforms/minestom/build.gradle.kts b/platforms/minestom/build.gradle.kts index 59b775220..694cedbd5 100644 --- a/platforms/minestom/build.gradle.kts +++ b/platforms/minestom/build.gradle.kts @@ -3,7 +3,7 @@ dependencies { shadedApi("com.github.ben-manes.caffeine", "caffeine", Versions.Libraries.caffeine) shadedImplementation("com.google.guava", "guava", Versions.Libraries.Internal.guava) - compileOnly("net.minestom", "minestom-snapshots", Versions.Minestom.minestom) + compileOnly("net.minestom", "minestom", Versions.Minestom.minestom) } tasks.named("jar") { diff --git a/platforms/minestom/example/build.gradle.kts b/platforms/minestom/example/build.gradle.kts index 31d903136..1cec6c60d 100644 --- a/platforms/minestom/example/build.gradle.kts +++ b/platforms/minestom/example/build.gradle.kts @@ -7,7 +7,7 @@ val javaMainClass = "com.dfsek.terra.minestom.TerraMinestomExample" dependencies { shadedApi(project(":platforms:minestom")) - implementation("net.minestom", "minestom-snapshots", Versions.Minestom.minestom) + implementation("net.minestom", "minestom", Versions.Minestom.minestom) implementation("org.slf4j", "slf4j-simple", Versions.Libraries.slf4j) } From 12d2221d4967e6475c81bd96b1da591c807dd5c9 Mon Sep 17 00:00:00 2001 From: Christian Bergschneider Date: Tue, 7 Oct 2025 21:38:49 +0200 Subject: [PATCH 2/6] fix: ignore and warn on snbt on particles --- .../config/BiomeParticleConfigTemplate.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeParticleConfigTemplate.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeParticleConfigTemplate.java index c095b7893..52a16c5ba 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeParticleConfigTemplate.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeParticleConfigTemplate.java @@ -3,8 +3,18 @@ package com.dfsek.terra.minestom.config; import com.dfsek.tectonic.api.config.template.annotations.Default; import com.dfsek.tectonic.api.config.template.annotations.Value; import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; +import net.kyori.adventure.nbt.BinaryTagIO; +import net.kyori.adventure.nbt.CompoundBinaryTag; +import net.kyori.adventure.nbt.TagStringIO; +import net.minestom.server.MinecraftServer; +import net.minestom.server.command.builder.arguments.Argument; +import net.minestom.server.command.builder.arguments.minecraft.registry.ArgumentParticle; import net.minestom.server.particle.Particle; import net.minestom.server.world.biome.BiomeEffects; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; public class BiomeParticleConfigTemplate implements ObjectTemplate { @@ -22,9 +32,15 @@ public class BiomeParticleConfigTemplate implements ObjectTemplate 1) { + LoggerFactory.getLogger(BiomeParticleConfigTemplate.class).warn("Particle {} has additional data, which will be ignored.", particle); + } + return new BiomeEffects.Particle( probability, - Particle.fromKey(particle) + parsedParticle ); } } From 170065075305ff5f6f5e6cc0288f4c79dbaa6aca Mon Sep 17 00:00:00 2001 From: Christian Bergschneider Date: Tue, 7 Oct 2025 22:54:15 +0200 Subject: [PATCH 3/6] feat: add methods to pack by meta and default meta in TerraMinestomWorldBuilder --- .../api/TerraMinestomWorldBuilder.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java index d70a32bdd..1dc672e71 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java @@ -13,6 +13,10 @@ import com.dfsek.terra.minestom.block.DefaultBlockEntityFactory; import com.dfsek.terra.minestom.entity.DefaultEntityFactory; import com.dfsek.terra.minestom.world.TerraMinestomWorld; +import net.minestom.server.registry.RegistryKey; +import net.minestom.server.world.DimensionType; +import org.jspecify.annotations.NonNull; + public class TerraMinestomWorldBuilder { private final TerraMinestomPlatform platform; @@ -36,10 +40,22 @@ public class TerraMinestomWorldBuilder { public TerraMinestomWorldBuilder packById(String id) { this.pack = platform.getConfigRegistry().getByID(id).orElseThrow(); - return this; } + public TerraMinestomWorldBuilder packByMeta(String metaPack, RegistryKey<@NonNull DimensionType> dimensionType) { + this.pack = platform.getMetaConfigRegistry() + .getByID(metaPack) + .orElseThrow(() -> new RuntimeException("Meta Pack " + metaPack + " could not be found")) + .packs() + .get(dimensionType.key().asString()); + return this; + } + + public TerraMinestomWorldBuilder packByDefaultMeta(RegistryKey<@NonNull DimensionType> dimensionType) { + return packByMeta("default", dimensionType); + } + public TerraMinestomWorldBuilder findPack(Function, ConfigPack> fn) { this.pack = fn.apply(platform.getConfigRegistry()); return this; From 243c523b57b19c62010d37b308315285d3e457c7 Mon Sep 17 00:00:00 2001 From: Christian Bergschneider Date: Tue, 7 Oct 2025 23:06:35 +0200 Subject: [PATCH 4/6] feat: pre-add biomes to registry to prevent future modifications --- .../terra/minestom/TerraMinestomExample.java | 3 +- .../terra/minestom/TerraMinestomPlatform.java | 76 ++++++++++++++++++- .../api/TerraMinestomWorldBuilder.java | 14 ++-- 3 files changed, 79 insertions(+), 14 deletions(-) diff --git a/platforms/minestom/example/src/main/java/com/dfsek/terra/minestom/TerraMinestomExample.java b/platforms/minestom/example/src/main/java/com/dfsek/terra/minestom/TerraMinestomExample.java index ccf7ddd9f..5ee453042 100644 --- a/platforms/minestom/example/src/main/java/com/dfsek/terra/minestom/TerraMinestomExample.java +++ b/platforms/minestom/example/src/main/java/com/dfsek/terra/minestom/TerraMinestomExample.java @@ -9,6 +9,7 @@ import net.minestom.server.event.player.AsyncPlayerConfigurationEvent; import net.minestom.server.event.player.PlayerSpawnEvent; import net.minestom.server.instance.Instance; import net.minestom.server.instance.LightingChunk; +import net.minestom.server.world.DimensionType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -43,7 +44,7 @@ public class TerraMinestomExample { public void attachTerra() { world = platform.worldBuilder(instance) - .defaultPack() + .packByDefaultMeta(DimensionType.OVERWORLD) .attach(); } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java index c1c59076c..867d3fd2b 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java @@ -2,6 +2,10 @@ package com.dfsek.terra.minestom; import com.dfsek.tectonic.api.TypeRegistry; import com.dfsek.tectonic.api.loader.type.TypeLoader; + +import com.dfsek.terra.minestom.api.BiomeFactory; +import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomeFactory; + import net.kyori.adventure.key.Key; import net.kyori.adventure.util.RGBLike; import net.minestom.server.MinecraftServer; @@ -9,6 +13,7 @@ import net.minestom.server.instance.Instance; import net.minestom.server.sound.SoundEvent; import net.minestom.server.world.biome.BiomeEffects; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,19 +50,22 @@ public final class TerraMinestomPlatform extends AbstractPlatform { private final ItemHandle itemHandle; private final TypeLoader biomeTypeLoader; private final ArrayList platformAddons = new ArrayList<>(List.of(new MinestomAddon(this))); + private final BiomeFactory biomeFactory; public TerraMinestomPlatform(WorldHandle worldHandle, ItemHandle itemHandle, TypeLoader biomeTypeLoader, - BaseAddon... extraAddons) { + BiomeFactory biomeFactory, BaseAddon... extraAddons) { this.worldHandle = worldHandle; this.itemHandle = itemHandle; this.biomeTypeLoader = biomeTypeLoader; + this.biomeFactory = biomeFactory; this.platformAddons.addAll(List.of(extraAddons)); load(); getEventManager().callEvent(new PlatformInitializationEvent()); + initializeRegistry(); // Needs to be called before minecraft server bind } public TerraMinestomPlatform() { - this(new MinestomWorldHandle(), new MinestomItemHandle(), new MinestomBiomeLoader()); + this(new MinestomWorldHandle(), new MinestomItemHandle(), new MinestomBiomeLoader(), new MinestomUserDefinedBiomeFactory()); } @Override @@ -94,6 +102,14 @@ public final class TerraMinestomPlatform extends AbstractPlatform { return succeed; } + public void initializeRegistry() { + getRawConfigRegistry() + .forEach(pack -> { + pack.getBiomeProvider().getBiomes().forEach(biome -> { + + }); + }); + } @Override public @NotNull WorldHandle getWorldHandle() { @@ -125,10 +141,62 @@ public final class TerraMinestomPlatform extends AbstractPlatform { } public TerraMinestomWorldBuilder worldBuilder(Instance instance) { - return new TerraMinestomWorldBuilder(this, instance); + return new TerraMinestomWorldBuilder(this, instance, biomeFactory); } public TerraMinestomWorldBuilder worldBuilder() { - return new TerraMinestomWorldBuilder(this, MinecraftServer.getInstanceManager().createInstanceContainer()); + return worldBuilder(MinecraftServer.getInstanceManager().createInstanceContainer()); + } + + public static Builder builder() { + return new Builder(); + } + + public static class Builder { + private @Nullable WorldHandle worldHandle; + private @Nullable ItemHandle itemHandle; + private @Nullable TypeLoader biomeTypeLoader; + private @Nullable BiomeFactory biomeFactory; + private final List platformAddons = new ArrayList<>(); + + public Builder worldHandle(@Nullable WorldHandle worldHandle) { + this.worldHandle = worldHandle; + return this; + } + + public Builder itemHandle(@Nullable ItemHandle itemHandle) { + this.itemHandle = itemHandle; + return this; + } + + public Builder biomeTypeLoader(@Nullable TypeLoader biomeTypeLoader) { + this.biomeTypeLoader = biomeTypeLoader; + return this; + } + + public Builder addPlatformAddon(BaseAddon addon) { + this.platformAddons.add(addon); + return this; + } + + public Builder biomeFactory(BiomeFactory biomeFactory) { + this.biomeFactory = biomeFactory; + return this; + } + + public TerraMinestomPlatform build() { + if(worldHandle == null) worldHandle = new MinestomWorldHandle(); + if(itemHandle == null) itemHandle = new MinestomItemHandle(); + if(biomeTypeLoader == null) biomeTypeLoader = new MinestomBiomeLoader(); + if(biomeFactory == null) biomeFactory = new MinestomUserDefinedBiomeFactory(); + + return new TerraMinestomPlatform( + worldHandle, + itemHandle, + biomeTypeLoader, + biomeFactory, + platformAddons.toArray(new BaseAddon[0]) + ); + } } } \ No newline at end of file diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java index 1dc672e71..84d4c46dc 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java @@ -25,12 +25,13 @@ public class TerraMinestomWorldBuilder { private long seed = new Random().nextLong(); private EntityFactory entityFactory = new DefaultEntityFactory(); private BlockEntityFactory blockEntityFactory; - private BiomeFactory biomeFactory = new MinestomUserDefinedBiomeFactory(); + private BiomeFactory biomeFactory; - public TerraMinestomWorldBuilder(TerraMinestomPlatform platform, Instance instance) { + public TerraMinestomWorldBuilder(TerraMinestomPlatform platform, Instance instance, BiomeFactory biomeFactory) { this.platform = platform; this.instance = instance; this.blockEntityFactory = new DefaultBlockEntityFactory(instance); + this.biomeFactory = biomeFactory; } public TerraMinestomWorldBuilder pack(ConfigPack pack) { @@ -46,14 +47,14 @@ public class TerraMinestomWorldBuilder { public TerraMinestomWorldBuilder packByMeta(String metaPack, RegistryKey<@NonNull DimensionType> dimensionType) { this.pack = platform.getMetaConfigRegistry() .getByID(metaPack) - .orElseThrow(() -> new RuntimeException("Meta Pack " + metaPack + " could not be found")) + .orElseThrow(() -> new RuntimeException("MetaPack " + metaPack + " could not be found")) .packs() .get(dimensionType.key().asString()); return this; } public TerraMinestomWorldBuilder packByDefaultMeta(RegistryKey<@NonNull DimensionType> dimensionType) { - return packByMeta("default", dimensionType); + return packByMeta("DEFAULT", dimensionType); } public TerraMinestomWorldBuilder findPack(Function, ConfigPack> fn) { @@ -80,11 +81,6 @@ public class TerraMinestomWorldBuilder { return this; } - public TerraMinestomWorldBuilder biomeFactory(BiomeFactory factory) { - this.biomeFactory = factory; - return this; - } - public TerraMinestomWorld attach() { return new TerraMinestomWorld(platform, instance, pack, seed, entityFactory, blockEntityFactory, biomeFactory); } From 234ff3e49ccd8d32b19f594ec661b8666c5c4f28 Mon Sep 17 00:00:00 2001 From: Christian Bergschneider Date: Tue, 7 Oct 2025 23:23:54 +0200 Subject: [PATCH 5/6] feat: actually do biome preloading --- .../terra/minestom/TerraMinestomPlatform.java | 14 ++++++-------- .../minestom/api/TerraMinestomWorldBuilder.java | 11 ++++++----- .../biome/MinestomUserDefinedBiomePool.java | 8 +++----- .../world/MinestomChunkGeneratorWrapper.java | 7 +------ .../terra/minestom/world/TerraMinestomWorld.java | 4 ++-- 5 files changed, 18 insertions(+), 26 deletions(-) diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java index 867d3fd2b..49f310671 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/TerraMinestomPlatform.java @@ -6,6 +6,8 @@ import com.dfsek.tectonic.api.loader.type.TypeLoader; import com.dfsek.terra.minestom.api.BiomeFactory; import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomeFactory; +import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomePool; + import net.kyori.adventure.key.Key; import net.kyori.adventure.util.RGBLike; import net.minestom.server.MinecraftServer; @@ -50,14 +52,14 @@ public final class TerraMinestomPlatform extends AbstractPlatform { private final ItemHandle itemHandle; private final TypeLoader biomeTypeLoader; private final ArrayList platformAddons = new ArrayList<>(List.of(new MinestomAddon(this))); - private final BiomeFactory biomeFactory; + private final MinestomUserDefinedBiomePool biomePool; public TerraMinestomPlatform(WorldHandle worldHandle, ItemHandle itemHandle, TypeLoader biomeTypeLoader, BiomeFactory biomeFactory, BaseAddon... extraAddons) { this.worldHandle = worldHandle; this.itemHandle = itemHandle; this.biomeTypeLoader = biomeTypeLoader; - this.biomeFactory = biomeFactory; + this.biomePool = new MinestomUserDefinedBiomePool(biomeFactory); this.platformAddons.addAll(List.of(extraAddons)); load(); getEventManager().callEvent(new PlatformInitializationEvent()); @@ -104,11 +106,7 @@ public final class TerraMinestomPlatform extends AbstractPlatform { public void initializeRegistry() { getRawConfigRegistry() - .forEach(pack -> { - pack.getBiomeProvider().getBiomes().forEach(biome -> { - - }); - }); + .forEach(pack -> biomePool.preloadBiomes(pack, pack.getBiomeProvider().getBiomes())); } @Override @@ -141,7 +139,7 @@ public final class TerraMinestomPlatform extends AbstractPlatform { } public TerraMinestomWorldBuilder worldBuilder(Instance instance) { - return new TerraMinestomWorldBuilder(this, instance, biomeFactory); + return new TerraMinestomWorldBuilder(this, instance, biomePool); } public TerraMinestomWorldBuilder worldBuilder() { diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java index 84d4c46dc..2c73fd8e2 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java @@ -1,5 +1,7 @@ package com.dfsek.terra.minestom.api; +import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomePool; + import net.minestom.server.instance.Instance; import java.util.Random; @@ -8,7 +10,6 @@ import java.util.function.Function; import com.dfsek.terra.api.config.ConfigPack; import com.dfsek.terra.api.registry.CheckedRegistry; import com.dfsek.terra.minestom.TerraMinestomPlatform; -import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomeFactory; import com.dfsek.terra.minestom.block.DefaultBlockEntityFactory; import com.dfsek.terra.minestom.entity.DefaultEntityFactory; import com.dfsek.terra.minestom.world.TerraMinestomWorld; @@ -21,17 +22,17 @@ import org.jspecify.annotations.NonNull; public class TerraMinestomWorldBuilder { private final TerraMinestomPlatform platform; private final Instance instance; + private final MinestomUserDefinedBiomePool biomePool; private ConfigPack pack; private long seed = new Random().nextLong(); private EntityFactory entityFactory = new DefaultEntityFactory(); private BlockEntityFactory blockEntityFactory; - private BiomeFactory biomeFactory; - public TerraMinestomWorldBuilder(TerraMinestomPlatform platform, Instance instance, BiomeFactory biomeFactory) { + public TerraMinestomWorldBuilder(TerraMinestomPlatform platform, Instance instance, MinestomUserDefinedBiomePool biomePool) { this.platform = platform; this.instance = instance; this.blockEntityFactory = new DefaultBlockEntityFactory(instance); - this.biomeFactory = biomeFactory; + this.biomePool = biomePool; } public TerraMinestomWorldBuilder pack(ConfigPack pack) { @@ -82,6 +83,6 @@ public class TerraMinestomWorldBuilder { } public TerraMinestomWorld attach() { - return new TerraMinestomWorld(platform, instance, pack, seed, entityFactory, blockEntityFactory, biomeFactory); + return new TerraMinestomWorld(platform, instance, pack, seed, entityFactory, blockEntityFactory, biomePool); } } diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomePool.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomePool.java index 8e5eb4fbc..42bbacaf5 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomePool.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomePool.java @@ -12,14 +12,12 @@ public class MinestomUserDefinedBiomePool { private final IdentityHashMap biomes = new IdentityHashMap<>(); private final HashSet createdBiomes = new HashSet<>(); private final BiomeFactory factory; - private final ConfigPack configPack; - public MinestomUserDefinedBiomePool(ConfigPack configPack, BiomeFactory factory) { - this.configPack = configPack; + public MinestomUserDefinedBiomePool(BiomeFactory factory) { this.factory = factory; } - public UserDefinedBiome getBiome(Biome source) { + public UserDefinedBiome getBiome(ConfigPack configPack, Biome source) { UserDefinedBiome userDefinedBiome = biomes.get(source); if(userDefinedBiome != null) return userDefinedBiome; userDefinedBiome = factory.create(configPack, source); @@ -28,7 +26,7 @@ public class MinestomUserDefinedBiomePool { return userDefinedBiome; } - public void preloadBiomes(Iterable biomesToLoad) { + public void preloadBiomes(ConfigPack configPack, Iterable biomesToLoad) { biomesToLoad .forEach(biome -> { if(!this.createdBiomes.contains(biome.getID())) { diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomChunkGeneratorWrapper.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomChunkGeneratorWrapper.java index 3e4d421e4..9def4dfd7 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomChunkGeneratorWrapper.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/MinestomChunkGeneratorWrapper.java @@ -40,7 +40,6 @@ public class MinestomChunkGeneratorWrapper implements Generator, GeneratorWrappe this.biomePool = biomePool; this.biomeProvider = pack.getBiomeProvider(); this.cache = new GeneratedChunkCache(world.getDimensionType(), generator, world, biomeProvider); - preloadBiomes(); } public ChunkGenerator getGenerator() { @@ -73,6 +72,7 @@ public class MinestomChunkGeneratorWrapper implements Generator, GeneratorWrappe if(relativeX % 4 == 0 && relativeY % 4 == 0 && relativeZ % 4 == 0) { UserDefinedBiome userDefinedBiome = biomePool.getBiome( + pack, biomeProvider.getBiome(absoluteX, absoluteY, absoluteZ, world.getSeed()) ); @@ -101,11 +101,6 @@ public class MinestomChunkGeneratorWrapper implements Generator, GeneratorWrappe this.pack = pack; this.generator = pack.getGeneratorProvider().newInstance(pack); this.biomePool.invalidate(); - preloadBiomes(); - } - - private void preloadBiomes() { - this.biomePool.preloadBiomes(world.getBiomeProvider().getBiomes()); } public void displayStats() { diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorld.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorld.java index fe272a864..cfb64a24c 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorld.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorld.java @@ -44,7 +44,7 @@ public final class TerraMinestomWorld implements ServerWorld, WorldProperties { long seed, EntityFactory entityFactory, BlockEntityFactory blockEntityFactory, - BiomeFactory factory + MinestomUserDefinedBiomePool biomePool ) { this.instance = instance; this.pack = pack; @@ -57,7 +57,7 @@ public final class TerraMinestomWorld implements ServerWorld, WorldProperties { pack.getGeneratorProvider().newInstance(pack), this, pack, - new MinestomUserDefinedBiomePool(pack, factory) + biomePool ); this.entityFactory = entityFactory; From 1b6ebeb05f3c7a33bb49af238ac29d2806021a4c Mon Sep 17 00:00:00 2001 From: Christian Bergschneider Date: Tue, 7 Oct 2025 23:32:30 +0200 Subject: [PATCH 6/6] fix: improve particle handling and block state retrieval --- .../dfsek/terra/minestom/block/MinestomBlockState.java | 1 + .../java/com/dfsek/terra/minestom/chunk/CachedChunk.java | 8 ++++++-- .../minestom/config/BiomeParticleConfigTemplate.java | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java index f0a97590d..1c7e7a841 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/block/MinestomBlockState.java @@ -13,6 +13,7 @@ import com.dfsek.terra.api.block.state.properties.Property; public class MinestomBlockState implements BlockState { private final Block block; + public static final MinestomBlockState AIR = new MinestomBlockState(Block.AIR); public MinestomBlockState(Block block) { if(block == null) { diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/CachedChunk.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/CachedChunk.java index 5c0f030e4..4c9ebcfd6 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/CachedChunk.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/chunk/CachedChunk.java @@ -32,7 +32,9 @@ public class CachedChunk implements ProtoChunk { public void setBlock(int x, int y, int z, @NotNull BlockState blockState) { Block block = (Block) blockState.getHandle(); if(block == null) return; - blocks[getIndex(x, y, z)] = block; + int index = getIndex(x, y, z); + if (index > blocks.length || index < 0) return; + blocks[index] = block; } private int getIndex(int x, int y, int z) { @@ -42,7 +44,9 @@ public class CachedChunk implements ProtoChunk { @Override public @NotNull BlockState getBlock(int x, int y, int z) { - return new MinestomBlockState(blocks[getIndex(x, y, z)]); + int index = getIndex(x, y, z); + if (index > blocks.length || index < 0) return MinestomBlockState.AIR; + return new MinestomBlockState(blocks[index]); } @Override diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeParticleConfigTemplate.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeParticleConfigTemplate.java index 52a16c5ba..6741d8185 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeParticleConfigTemplate.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/config/BiomeParticleConfigTemplate.java @@ -35,7 +35,8 @@ public class BiomeParticleConfigTemplate implements ObjectTemplate 1) { - LoggerFactory.getLogger(BiomeParticleConfigTemplate.class).warn("Particle {} has additional data, which will be ignored.", particle); + LoggerFactory.getLogger(BiomeParticleConfigTemplate.class).warn("Particle {} has additional data, particle will be ignored.", particle); + return null; } return new BiomeEffects.Particle(