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 792dbb195..afa1f0627 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 @@ -16,7 +16,6 @@ import java.time.Duration; import java.util.concurrent.atomic.AtomicInteger; import com.dfsek.terra.minestom.world.TerraMinestomWorld; -import com.dfsek.terra.minestom.world.TerraMinestomWorldBuilder; public class TerraMinestomExample { 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 c699ff353..527eb85be 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 @@ -24,7 +24,7 @@ import com.dfsek.terra.minestom.item.MinestomItemHandle; import com.dfsek.terra.minestom.world.MinestomChunkGeneratorWrapper; import com.dfsek.terra.minestom.world.MinestomWorldHandle; -import com.dfsek.terra.minestom.world.TerraMinestomWorldBuilder; +import com.dfsek.terra.minestom.api.TerraMinestomWorldBuilder; import net.kyori.adventure.key.Key; import net.kyori.adventure.util.RGBLike; @@ -37,6 +37,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; +import java.util.ArrayList; import java.util.List; @@ -45,11 +46,13 @@ public final class TerraMinestomPlatform extends AbstractPlatform { private final WorldHandle worldHandle; private final ItemHandle itemHandle; private final TypeLoader biomeTypeLoader; + private final ArrayList platformAddons = new ArrayList<>(List.of(new MinestomAddon(this))); - public TerraMinestomPlatform(WorldHandle worldHandle, ItemHandle itemHandle, TypeLoader biomeTypeLoader) { + public TerraMinestomPlatform(WorldHandle worldHandle, ItemHandle itemHandle, TypeLoader biomeTypeLoader, BaseAddon... extraAddons) { this.worldHandle = worldHandle; this.itemHandle = itemHandle; this.biomeTypeLoader = biomeTypeLoader; + this.platformAddons.addAll(List.of(extraAddons)); load(); getEventManager().callEvent(new PlatformInitializationEvent()); } @@ -115,6 +118,11 @@ public final class TerraMinestomPlatform extends AbstractPlatform { return file; } + @Override + protected Iterable platformAddon() { + return platformAddons; + } + public TerraMinestomWorldBuilder worldBuilder(Instance instance) { return new TerraMinestomWorldBuilder(this, instance); } @@ -122,9 +130,4 @@ public final class TerraMinestomPlatform extends AbstractPlatform { public TerraMinestomWorldBuilder worldBuilder() { return new TerraMinestomWorldBuilder(this, MinecraftServer.getInstanceManager().createInstanceContainer()); } - - @Override - protected Iterable platformAddon() { - return List.of(new MinestomAddon(this)); - } } \ No newline at end of file diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/BiomeFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/BiomeFactory.java new file mode 100644 index 000000000..ee59f29d5 --- /dev/null +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/BiomeFactory.java @@ -0,0 +1,15 @@ +package com.dfsek.terra.minestom.api; + +import com.dfsek.terra.api.config.ConfigPack; +import com.dfsek.terra.api.world.biome.Biome; +import com.dfsek.terra.minestom.biome.UserDefinedBiome; + + +/** + * BiomeFactory serves as a contract for creating custom user-defined biomes in Terra. + * Implementations of this interface are responsible for defining the logic to convert + * configured biomes and source biome data into instances of UserDefinedBiome. + */ +public interface BiomeFactory { + UserDefinedBiome create(ConfigPack pack, Biome source); +} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorldBuilder.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java similarity index 85% rename from platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorldBuilder.java rename to platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java index 1983bdee9..a3f3354d3 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/world/TerraMinestomWorldBuilder.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/api/TerraMinestomWorldBuilder.java @@ -1,18 +1,15 @@ -package com.dfsek.terra.minestom.world; +package com.dfsek.terra.minestom.api; 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.api.BlockEntityFactory; -import com.dfsek.terra.minestom.api.EntityFactory; -import com.dfsek.terra.minestom.biome.BiomeFactory; -import com.dfsek.terra.minestom.biome.MinestomCustomBiomeFactory; +import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomeFactory; import com.dfsek.terra.minestom.block.DefaultBlockEntityFactory; import com.dfsek.terra.minestom.entity.DefaultEntityFactory; -import net.minestom.server.MinecraftServer; +import com.dfsek.terra.minestom.world.TerraMinestomWorld; import net.minestom.server.instance.Instance; import java.util.Random; @@ -26,7 +23,7 @@ public class TerraMinestomWorldBuilder { private long seed = new Random().nextLong(); private EntityFactory entityFactory = new DefaultEntityFactory(); private BlockEntityFactory blockEntityFactory = new DefaultBlockEntityFactory(); - private BiomeFactory biomeFactory = new MinestomCustomBiomeFactory(); + private BiomeFactory biomeFactory = new MinestomUserDefinedBiomeFactory(); public TerraMinestomWorldBuilder(TerraMinestomPlatform platform, Instance instance) { this.platform = platform; diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/BiomeFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/BiomeFactory.java deleted file mode 100644 index 832305e3a..000000000 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/BiomeFactory.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.dfsek.terra.minestom.biome; - -import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.world.biome.Biome; - - -public interface BiomeFactory { - NativeBiome create(ConfigPack pack, Biome source); -} diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomCustomBiomeFactory.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomeFactory.java similarity index 92% rename from platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomCustomBiomeFactory.java rename to platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomeFactory.java index f33c5c9a2..51d1fc07e 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomCustomBiomeFactory.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomeFactory.java @@ -1,7 +1,7 @@ package com.dfsek.terra.minestom.biome; import com.dfsek.terra.api.config.ConfigPack; -import com.dfsek.terra.api.registry.key.RegistryKey; +import com.dfsek.terra.minestom.api.BiomeFactory; import com.dfsek.terra.minestom.config.VanillaBiomeProperties; import net.kyori.adventure.key.Key; @@ -17,12 +17,12 @@ import java.util.Locale; import java.util.Objects; -public class MinestomCustomBiomeFactory implements BiomeFactory { +public class MinestomUserDefinedBiomeFactory implements BiomeFactory { private final DynamicRegistry biomeRegistry = MinecraftServer.getBiomeRegistry(); private final @NotNull Biome plainsBiome = Objects.requireNonNull(biomeRegistry.get(Key.key("minecraft:plains"))); @Override - public NativeBiome create(ConfigPack pack, com.dfsek.terra.api.world.biome.Biome source) { + public UserDefinedBiome create(ConfigPack pack, com.dfsek.terra.api.world.biome.Biome source) { VanillaBiomeProperties properties = source.getContext().get(VanillaBiomeProperties.class); DynamicRegistry.Key parentKey = ((MinestomBiome) source.getPlatformBiome()).getHandle(); Biome parent = mergeNullable(biomeRegistry.get(parentKey), plainsBiome); @@ -58,7 +58,7 @@ public class MinestomCustomBiomeFactory implements BiomeFactory { .build(); DynamicRegistry.Key registryKey = MinecraftServer.getBiomeRegistry().register(key, target); - return new NativeBiome(key, registryKey, source.getID(), target); + return new UserDefinedBiome(key, registryKey, source.getID(), target); } private static T mergeNullable(T first, T second) { diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomCustomBiomePool.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomePool.java similarity index 51% rename from platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomCustomBiomePool.java rename to platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomePool.java index db0e48be6..9eff185b3 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomCustomBiomePool.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/MinestomUserDefinedBiomePool.java @@ -6,22 +6,22 @@ import com.dfsek.terra.api.world.biome.Biome; import java.util.HashMap; -public class MinestomCustomBiomePool { - private final HashMap biomes = new HashMap<>(); - private final MinestomCustomBiomeFactory factory; +public class MinestomUserDefinedBiomePool { + private final HashMap biomes = new HashMap<>(); + private final MinestomUserDefinedBiomeFactory factory; private final ConfigPack configPack; - public MinestomCustomBiomePool(ConfigPack configPack, MinestomCustomBiomeFactory factory) { + public MinestomUserDefinedBiomePool(ConfigPack configPack, MinestomUserDefinedBiomeFactory factory) { this.configPack = configPack; this.factory = factory; } - public NativeBiome getBiome(Biome source) { - NativeBiome nativeBiome = biomes.get(source.getID()); - if(nativeBiome != null) return nativeBiome; - nativeBiome = factory.create(configPack, source); - biomes.put(source.getID(), nativeBiome); - return nativeBiome; + public UserDefinedBiome getBiome(Biome source) { + UserDefinedBiome userDefinedBiome = biomes.get(source.getID()); + if(userDefinedBiome != null) return userDefinedBiome; + userDefinedBiome = factory.create(configPack, source); + biomes.put(source.getID(), userDefinedBiome); + return userDefinedBiome; } public void preloadBiomes(Iterable biomesToLoad) { diff --git a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/NativeBiome.java b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/UserDefinedBiome.java similarity index 63% rename from platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/NativeBiome.java rename to platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/UserDefinedBiome.java index e01728b7d..059a0cc93 100644 --- a/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/NativeBiome.java +++ b/platforms/minestom/src/main/java/com/dfsek/terra/minestom/biome/UserDefinedBiome.java @@ -5,5 +5,5 @@ import net.minestom.server.registry.DynamicRegistry; import net.minestom.server.world.biome.Biome; -public record NativeBiome(Key key, DynamicRegistry.Key registry, String id, Biome biome) { +public record UserDefinedBiome(Key key, DynamicRegistry.Key registry, String id, Biome biome) { } 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 c3eba7b34..0e2109b99 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 @@ -7,9 +7,8 @@ import com.dfsek.terra.api.world.chunk.generation.ChunkGenerator; import com.dfsek.terra.api.world.chunk.generation.stage.GenerationStage; import com.dfsek.terra.api.world.chunk.generation.util.GeneratorWrapper; -import com.dfsek.terra.minestom.biome.MinestomCustomBiomeFactory; -import com.dfsek.terra.minestom.biome.MinestomCustomBiomePool; -import com.dfsek.terra.minestom.biome.NativeBiome; +import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomePool; +import com.dfsek.terra.minestom.biome.UserDefinedBiome; import com.dfsek.terra.minestom.chunk.CachedChunk; import com.dfsek.terra.minestom.chunk.GeneratedChunkCache; @@ -28,14 +27,14 @@ public class MinestomChunkGeneratorWrapper implements Generator, GeneratorWrappe private final TerraMinestomWorld world; private final BiomeProvider biomeProvider; private ConfigPack pack; - private final MinestomCustomBiomePool biomePool; + private final MinestomUserDefinedBiomePool biomePool; public MinestomChunkGeneratorWrapper( Platform platform, ChunkGenerator generator, TerraMinestomWorld world, ConfigPack pack, - MinestomCustomBiomePool biomePool + MinestomUserDefinedBiomePool biomePool ) { this.generator = generator; this.world = world; @@ -61,8 +60,8 @@ public class MinestomChunkGeneratorWrapper implements Generator, GeneratorWrappe UnitModifier modifier = unit.modifier(); chunk.writeRelative(modifier); - NativeBiome nativeBiome = biomePool.getBiome(biomeProvider.getBiome(blockX, 100, blockZ, world.getSeed())); - modifier.fillBiome(nativeBiome.registry()); + UserDefinedBiome userDefinedBiome = biomePool.getBiome(biomeProvider.getBiome(blockX, 100, blockZ, world.getSeed())); + modifier.fillBiome(userDefinedBiome.registry()); unit.fork(setter -> { MinestomProtoWorld protoWorld = new MinestomProtoWorld(cache, x, z, world, setter); 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 cbc80522a..88691e362 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 @@ -16,9 +16,9 @@ import com.dfsek.terra.api.world.info.WorldProperties; import com.dfsek.terra.minestom.TerraMinestomPlatform; import com.dfsek.terra.minestom.api.BlockEntityFactory; import com.dfsek.terra.minestom.api.EntityFactory; -import com.dfsek.terra.minestom.biome.BiomeFactory; -import com.dfsek.terra.minestom.biome.MinestomCustomBiomeFactory; -import com.dfsek.terra.minestom.biome.MinestomCustomBiomePool; +import com.dfsek.terra.minestom.api.BiomeFactory; +import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomeFactory; +import com.dfsek.terra.minestom.biome.MinestomUserDefinedBiomePool; import com.dfsek.terra.minestom.block.MinestomBlockState; import com.dfsek.terra.minestom.entity.MinestomEntity; @@ -62,7 +62,7 @@ public final class TerraMinestomWorld implements ServerWorld, WorldProperties { pack.getGeneratorProvider().newInstance(pack), this, pack, - new MinestomCustomBiomePool(pack, new MinestomCustomBiomeFactory()) + new MinestomUserDefinedBiomePool(pack, new MinestomUserDefinedBiomeFactory()) ); this.entityFactory = entityFactory;