feat: pre-add biomes to registry to prevent future modifications

This commit is contained in:
Christian Bergschneider
2025-10-07 23:06:35 +02:00
parent 1700650753
commit 243c523b57
3 changed files with 79 additions and 14 deletions

View File

@@ -9,6 +9,7 @@ import net.minestom.server.event.player.AsyncPlayerConfigurationEvent;
import net.minestom.server.event.player.PlayerSpawnEvent; import net.minestom.server.event.player.PlayerSpawnEvent;
import net.minestom.server.instance.Instance; import net.minestom.server.instance.Instance;
import net.minestom.server.instance.LightingChunk; import net.minestom.server.instance.LightingChunk;
import net.minestom.server.world.DimensionType;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -43,7 +44,7 @@ public class TerraMinestomExample {
public void attachTerra() { public void attachTerra() {
world = platform.worldBuilder(instance) world = platform.worldBuilder(instance)
.defaultPack() .packByDefaultMeta(DimensionType.OVERWORLD)
.attach(); .attach();
} }

View File

@@ -2,6 +2,10 @@ package com.dfsek.terra.minestom;
import com.dfsek.tectonic.api.TypeRegistry; import com.dfsek.tectonic.api.TypeRegistry;
import com.dfsek.tectonic.api.loader.type.TypeLoader; 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.key.Key;
import net.kyori.adventure.util.RGBLike; import net.kyori.adventure.util.RGBLike;
import net.minestom.server.MinecraftServer; 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.sound.SoundEvent;
import net.minestom.server.world.biome.BiomeEffects; import net.minestom.server.world.biome.BiomeEffects;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@@ -45,19 +50,22 @@ public final class TerraMinestomPlatform extends AbstractPlatform {
private final ItemHandle itemHandle; private final ItemHandle itemHandle;
private final TypeLoader<PlatformBiome> biomeTypeLoader; private final TypeLoader<PlatformBiome> biomeTypeLoader;
private final ArrayList<BaseAddon> platformAddons = new ArrayList<>(List.of(new MinestomAddon(this))); private final ArrayList<BaseAddon> platformAddons = new ArrayList<>(List.of(new MinestomAddon(this)));
private final BiomeFactory biomeFactory;
public TerraMinestomPlatform(WorldHandle worldHandle, ItemHandle itemHandle, TypeLoader<PlatformBiome> biomeTypeLoader, public TerraMinestomPlatform(WorldHandle worldHandle, ItemHandle itemHandle, TypeLoader<PlatformBiome> biomeTypeLoader,
BaseAddon... extraAddons) { BiomeFactory biomeFactory, BaseAddon... extraAddons) {
this.worldHandle = worldHandle; this.worldHandle = worldHandle;
this.itemHandle = itemHandle; this.itemHandle = itemHandle;
this.biomeTypeLoader = biomeTypeLoader; this.biomeTypeLoader = biomeTypeLoader;
this.biomeFactory = biomeFactory;
this.platformAddons.addAll(List.of(extraAddons)); this.platformAddons.addAll(List.of(extraAddons));
load(); load();
getEventManager().callEvent(new PlatformInitializationEvent()); getEventManager().callEvent(new PlatformInitializationEvent());
initializeRegistry(); // Needs to be called before minecraft server bind
} }
public TerraMinestomPlatform() { public TerraMinestomPlatform() {
this(new MinestomWorldHandle(), new MinestomItemHandle(), new MinestomBiomeLoader()); this(new MinestomWorldHandle(), new MinestomItemHandle(), new MinestomBiomeLoader(), new MinestomUserDefinedBiomeFactory());
} }
@Override @Override
@@ -94,6 +102,14 @@ public final class TerraMinestomPlatform extends AbstractPlatform {
return succeed; return succeed;
} }
public void initializeRegistry() {
getRawConfigRegistry()
.forEach(pack -> {
pack.getBiomeProvider().getBiomes().forEach(biome -> {
});
});
}
@Override @Override
public @NotNull WorldHandle getWorldHandle() { public @NotNull WorldHandle getWorldHandle() {
@@ -125,10 +141,62 @@ public final class TerraMinestomPlatform extends AbstractPlatform {
} }
public TerraMinestomWorldBuilder worldBuilder(Instance instance) { public TerraMinestomWorldBuilder worldBuilder(Instance instance) {
return new TerraMinestomWorldBuilder(this, instance); return new TerraMinestomWorldBuilder(this, instance, biomeFactory);
} }
public TerraMinestomWorldBuilder worldBuilder() { 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<PlatformBiome> biomeTypeLoader;
private @Nullable BiomeFactory biomeFactory;
private final List<BaseAddon> 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<PlatformBiome> 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])
);
}
} }
} }

View File

@@ -25,12 +25,13 @@ public class TerraMinestomWorldBuilder {
private long seed = new Random().nextLong(); private long seed = new Random().nextLong();
private EntityFactory entityFactory = new DefaultEntityFactory(); private EntityFactory entityFactory = new DefaultEntityFactory();
private BlockEntityFactory blockEntityFactory; 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.platform = platform;
this.instance = instance; this.instance = instance;
this.blockEntityFactory = new DefaultBlockEntityFactory(instance); this.blockEntityFactory = new DefaultBlockEntityFactory(instance);
this.biomeFactory = biomeFactory;
} }
public TerraMinestomWorldBuilder pack(ConfigPack pack) { public TerraMinestomWorldBuilder pack(ConfigPack pack) {
@@ -46,14 +47,14 @@ public class TerraMinestomWorldBuilder {
public TerraMinestomWorldBuilder packByMeta(String metaPack, RegistryKey<@NonNull DimensionType> dimensionType) { public TerraMinestomWorldBuilder packByMeta(String metaPack, RegistryKey<@NonNull DimensionType> dimensionType) {
this.pack = platform.getMetaConfigRegistry() this.pack = platform.getMetaConfigRegistry()
.getByID(metaPack) .getByID(metaPack)
.orElseThrow(() -> new RuntimeException("Meta Pack " + metaPack + " could not be found")) .orElseThrow(() -> new RuntimeException("MetaPack " + metaPack + " could not be found"))
.packs() .packs()
.get(dimensionType.key().asString()); .get(dimensionType.key().asString());
return this; return this;
} }
public TerraMinestomWorldBuilder packByDefaultMeta(RegistryKey<@NonNull DimensionType> dimensionType) { public TerraMinestomWorldBuilder packByDefaultMeta(RegistryKey<@NonNull DimensionType> dimensionType) {
return packByMeta("default", dimensionType); return packByMeta("DEFAULT", dimensionType);
} }
public TerraMinestomWorldBuilder findPack(Function<CheckedRegistry<ConfigPack>, ConfigPack> fn) { public TerraMinestomWorldBuilder findPack(Function<CheckedRegistry<ConfigPack>, ConfigPack> fn) {
@@ -80,11 +81,6 @@ public class TerraMinestomWorldBuilder {
return this; return this;
} }
public TerraMinestomWorldBuilder biomeFactory(BiomeFactory factory) {
this.biomeFactory = factory;
return this;
}
public TerraMinestomWorld attach() { public TerraMinestomWorld attach() {
return new TerraMinestomWorld(platform, instance, pack, seed, entityFactory, blockEntityFactory, biomeFactory); return new TerraMinestomWorld(platform, instance, pack, seed, entityFactory, blockEntityFactory, biomeFactory);
} }