From 78d6b41ec94530e39dede2a85051683c1a69df2c Mon Sep 17 00:00:00 2001 From: iam4722202468 Date: Sat, 10 Feb 2024 02:04:59 -0500 Subject: [PATCH] rework --- .../java/net/minestom/codegen/Generators.java | 1 + .../src/main/java/net/minestom/demo/Main.java | 2 +- .../minestom/server/instance/AnvilLoader.java | 2 +- .../server/instance/DynamicChunk.java | 2 - .../minestom/server/registry/Registry.java | 80 +++++++ .../minestom/server/world/biomes/Biome.java | 195 ++++++------------ .../server/world/biomes/BiomeImpl.java | 137 ++++++++++++ .../server/world/biomes/BiomeManager.java | 51 +---- .../GeneratorForkIntegrationTest.java | 13 +- .../server/instance/GeneratorTest.java | 30 ++- 10 files changed, 323 insertions(+), 190 deletions(-) create mode 100644 src/main/java/net/minestom/server/world/biomes/BiomeImpl.java diff --git a/code-generators/src/main/java/net/minestom/codegen/Generators.java b/code-generators/src/main/java/net/minestom/codegen/Generators.java index 911e2b59e3f..6cb6ded578e 100644 --- a/code-generators/src/main/java/net/minestom/codegen/Generators.java +++ b/code-generators/src/main/java/net/minestom/codegen/Generators.java @@ -27,6 +27,7 @@ public static void main(String[] args) { generator.generate(resource("blocks.json"), "net.minestom.server.instance.block", "Block", "BlockImpl", "Blocks"); generator.generate(resource("items.json"), "net.minestom.server.item", "Material", "MaterialImpl", "Materials"); generator.generate(resource("entities.json"), "net.minestom.server.entity", "EntityType", "EntityTypeImpl", "EntityTypes"); + generator.generate(resource("biomes.json"), "net.minestom.server.world.biomes", "Biome", "BiomeImpl", "Biomes"); generator.generate(resource("enchantments.json"), "net.minestom.server.item", "Enchantment", "EnchantmentImpl", "Enchantments"); generator.generate(resource("potion_effects.json"), "net.minestom.server.potion", "PotionEffect", "PotionEffectImpl", "PotionEffects"); generator.generate(resource("potions.json"), "net.minestom.server.potion", "PotionType", "PotionTypeImpl", "PotionTypes"); diff --git a/demo/src/main/java/net/minestom/demo/Main.java b/demo/src/main/java/net/minestom/demo/Main.java index abf7dfbbe2d..f20bd416e70 100644 --- a/demo/src/main/java/net/minestom/demo/Main.java +++ b/demo/src/main/java/net/minestom/demo/Main.java @@ -32,11 +32,11 @@ public class Main { public static void main(String[] args) { System.setProperty("minestom.experiment.pose-updates", "true"); - System.setProperty("minestom.load-vanilla-biomes", "true"); MinecraftServer.setCompressionThreshold(0); MinecraftServer minecraftServer = MinecraftServer.init(); + MinecraftServer.getBiomeManager().loadVanillaBiomes(); BlockManager blockManager = MinecraftServer.getBlockManager(); blockManager.registerBlockPlacementRule(new DripstonePlacementRule()); diff --git a/src/main/java/net/minestom/server/instance/AnvilLoader.java b/src/main/java/net/minestom/server/instance/AnvilLoader.java index 19482c0e2c5..0d89a2a7601 100644 --- a/src/main/java/net/minestom/server/instance/AnvilLoader.java +++ b/src/main/java/net/minestom/server/instance/AnvilLoader.java @@ -34,7 +34,7 @@ public class AnvilLoader implements IChunkLoader { private final static Logger LOGGER = LoggerFactory.getLogger(AnvilLoader.class); - private static final Biome BIOME = Biome.PLAINS; + private final static Biome BIOME = MinecraftServer.getBiomeManager().getByName(NamespaceID.from("minecraft:plains")); private final Map alreadyLoaded = new ConcurrentHashMap<>(); private final Path path; diff --git a/src/main/java/net/minestom/server/instance/DynamicChunk.java b/src/main/java/net/minestom/server/instance/DynamicChunk.java index baf3f03c304..4d3a2651de9 100644 --- a/src/main/java/net/minestom/server/instance/DynamicChunk.java +++ b/src/main/java/net/minestom/server/instance/DynamicChunk.java @@ -6,7 +6,6 @@ import net.minestom.server.coordinate.Point; import net.minestom.server.coordinate.Vec; import net.minestom.server.entity.Entity; -import net.minestom.server.entity.Player; import net.minestom.server.entity.pathfinding.PFBlock; import net.minestom.server.instance.block.Block; import net.minestom.server.instance.block.BlockHandler; @@ -24,7 +23,6 @@ import net.minestom.server.utils.MathUtils; import net.minestom.server.utils.ObjectPool; import net.minestom.server.utils.chunk.ChunkUtils; -import net.minestom.server.utils.validate.Check; import net.minestom.server.world.biomes.Biome; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/src/main/java/net/minestom/server/registry/Registry.java b/src/main/java/net/minestom/server/registry/Registry.java index 7f338351781..65e15fe98fa 100644 --- a/src/main/java/net/minestom/server/registry/Registry.java +++ b/src/main/java/net/minestom/server/registry/Registry.java @@ -37,6 +37,11 @@ public static BlockEntry block(String namespace, @NotNull Properties main) { return new BlockEntry(namespace, main, null); } + @ApiStatus.Internal + public static BiomeEntry biome(String namespace, Properties properties) { + return new BiomeEntry(namespace, properties, null); + } + @ApiStatus.Internal public static MaterialEntry material(String namespace, @NotNull Properties main) { return new MaterialEntry(namespace, main, null); @@ -324,6 +329,81 @@ public Properties custom() { } } + public static final class BiomeEntry implements Entry { + private final Properties custom; + private final NamespaceID namespace; + private final Integer foliageColor; + private final Integer grassColor; + private final Integer skyColor; + private final Integer waterColor; + private final Integer waterFogColor; + private final Integer fogColor; + private final float temperature; + private final float downfall; + private final boolean hasPrecipitation; + + private BiomeEntry(String namespace, Properties main, Properties custom) { + this.custom = custom; + this.namespace = NamespaceID.from(namespace); + + this.foliageColor = main.containsKey("foliageColor") ? main.getInt("foliageColor") : null; + this.grassColor = main.containsKey("grassColor") ? main.getInt("grassColor") : null; + this.skyColor = main.containsKey("skyColor") ? main.getInt("skyColor") : null; + this.waterColor = main.containsKey("waterColor") ? main.getInt("waterColor") : null; + this.waterFogColor = main.containsKey("waterFogColor") ? main.getInt("waterFogColor") : null; + this.fogColor = main.containsKey("fogColor") ? main.getInt("fogColor") : null; + + this.temperature = (float) main.getDouble("temperature", 0.5F); + this.downfall = (float) main.getDouble("downfall", 0.5F); + this.hasPrecipitation = main.getBoolean("has_precipitation", true); + } + + @Override + public Properties custom() { + return custom; + } + + public @NotNull NamespaceID namespace() { + return namespace; + } + + public @Nullable Integer foliageColor() { + return foliageColor; + } + + public @Nullable Integer grassColor() { + return grassColor; + } + + public @Nullable Integer skyColor() { + return skyColor; + } + + public @Nullable Integer waterColor() { + return waterColor; + } + + public @Nullable Integer waterFogColor() { + return waterFogColor; + } + + public @Nullable Integer fogColor() { + return fogColor; + } + + public float temperature() { + return temperature; + } + + public float downfall() { + return downfall; + } + + public boolean hasPrecipitation() { + return hasPrecipitation; + } + } + public static final class MaterialEntry implements Entry { private final NamespaceID namespace; private final int id; 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 26209bbf994..5e6ff08ad27 100644 --- a/src/main/java/net/minestom/server/world/biomes/Biome.java +++ b/src/main/java/net/minestom/server/world/biomes/Biome.java @@ -2,156 +2,104 @@ import net.minestom.server.coordinate.Point; import net.minestom.server.registry.ProtocolObject; +import net.minestom.server.registry.Registry; import net.minestom.server.utils.NamespaceID; import net.minestom.server.utils.validate.Check; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.jglrxavpok.hephaistos.nbt.NBT; import org.jglrxavpok.hephaistos.nbt.NBTCompound; import java.util.Locale; -import java.util.concurrent.atomic.AtomicInteger; -public final class Biome implements ProtocolObject { - public static final AtomicInteger ID_COUNTER = new AtomicInteger(0); - private static final BiomeEffects DEFAULT_EFFECTS = BiomeEffects.builder() +sealed public interface Biome extends ProtocolObject permits BiomeImpl { + /** + * Returns the entity registry. + * + * @return the entity registry + */ + @Contract(pure = true) + @Nullable Registry.BiomeEntry registry(); + + @Override + @NotNull NamespaceID namespace(); + int id(); + float depth(); + float temperature(); + float scale(); + float downfall(); + BiomeEffects effects(); + Precipitation precipitation(); + TemperatureModifier temperatureModifier(); + + BiomeEffects DEFAULT_EFFECTS = BiomeEffects.builder() .fogColor(0xC0D8FF) .skyColor(0x78A7FF) .waterColor(0x3F76E4) .waterFogColor(0x50533) .build(); - //A plains biome has to be registered or else minecraft will crash - public static final Biome PLAINS = Biome.builder() - .category(Category.NONE) - .name(NamespaceID.from("minecraft:plains")) - .temperature(0.8F) - .downfall(0.4F) - .depth(0.125F) - .scale(0.05F) - .effects(DEFAULT_EFFECTS) - .build(); - - private final int id = ID_COUNTER.getAndIncrement(); - - private final NamespaceID name; - private final float depth; - private final float temperature; - private final float scale; - private final float downfall; - private final Category category; - private final BiomeEffects effects; - private final Precipitation precipitation; - private final TemperatureModifier temperatureModifier; - - Biome(NamespaceID name, float depth, float temperature, float scale, float downfall, Category category, BiomeEffects effects, Precipitation precipitation, TemperatureModifier temperatureModifier) { - this.name = name; - this.depth = depth; - this.temperature = temperature; - this.scale = scale; - this.downfall = downfall; - this.category = category; - this.effects = effects; - this.precipitation = precipitation; - this.temperatureModifier = temperatureModifier; - } - - public static Builder builder() { - return new Builder(); - } - - public @NotNull NBTCompound toNbt() { - Check.notNull(name, "The biome namespace cannot be null"); - Check.notNull(effects, "The biome effects cannot be null"); - - return NBT.Compound(nbt -> { - nbt.setString("name", name.toString()); - nbt.setInt("id", id()); - - nbt.set("element", NBT.Compound(element -> { - element.setFloat("depth", depth); - element.setFloat("temperature", temperature); - element.setFloat("scale", scale); - element.setFloat("downfall", downfall); - element.setString("category", category.name().toLowerCase(Locale.ROOT)); - element.setByte("has_precipitation", (byte) (precipitation == Precipitation.NONE ? 0 : 1)); - element.setString("precipitation", precipitation.name().toLowerCase(Locale.ROOT)); - if (temperatureModifier != TemperatureModifier.NONE) - element.setString("temperature_modifier", temperatureModifier.name().toLowerCase(Locale.ROOT)); - element.set("effects", effects.toNbt()); - })); - }); - } - - public int id() { - return this.id; - } - - @Override - public @NotNull NamespaceID namespace() { - return this.name; - } - - public float depth() { - return this.depth; - } - - public float temperature() { - return this.temperature; + enum Precipitation { + NONE, RAIN, SNOW; } - public float scale() { - return this.scale; + enum TemperatureModifier { + NONE, FROZEN; } - public float downfall() { - return this.downfall; - } + interface Setter { + void setBiome(int x, int y, int z, @NotNull Biome biome); - public Category category() { - return this.category; + default void setBiome(@NotNull Point blockPosition, @NotNull Biome biome) { + setBiome(blockPosition.blockX(), blockPosition.blockY(), blockPosition.blockZ(), biome); + } } - public BiomeEffects effects() { - return this.effects; - } + interface Getter { + @NotNull Biome getBiome(int x, int y, int z); - public Precipitation precipitation() { - return this.precipitation; + default @NotNull Biome getBiome(@NotNull Point point) { + return getBiome(point.blockX(), point.blockY(), point.blockZ()); + } } - public TemperatureModifier temperatureModifier() { - return this.temperatureModifier; - } + default @NotNull NBTCompound toNbt() { + Check.notNull(name(), "The biome namespace cannot be null"); + Check.notNull(effects(), "The biome effects cannot be null"); - public enum Precipitation { - NONE, RAIN, SNOW; - } + return NBT.Compound(nbt -> { + nbt.setString("name", name()); + nbt.setInt("id", id()); - public enum Category { - NONE, TAIGA, EXTREME_HILLS, JUNGLE, MESA, PLAINS, - SAVANNA, ICY, THE_END, BEACH, FOREST, OCEAN, - DESERT, RIVER, SWAMP, MUSHROOM, NETHER, UNDERGROUND, - MOUNTAIN; + nbt.set("element", NBT.Compound(element -> { + element.setFloat("depth", depth()); + element.setFloat("temperature", temperature()); + element.setFloat("scale", scale()); + element.setFloat("downfall", downfall()); + element.setByte("has_precipitation", (byte) (precipitation() == Precipitation.NONE ? 0 : 1)); + element.setString("precipitation", precipitation().name().toLowerCase(Locale.ROOT)); + if (temperatureModifier() != TemperatureModifier.NONE) + element.setString("temperature_modifier", temperatureModifier().name().toLowerCase(Locale.ROOT)); + element.set("effects", effects().toNbt()); + })); + }); } - public enum TemperatureModifier { - NONE, FROZEN; + static Builder builder() { + return new Builder(); } - public static final class Builder { + final class Builder { private NamespaceID name; private float depth = 0.2f; private float temperature = 0.25f; private float scale = 0.2f; private float downfall = 0.8f; - private Category category = Category.NONE; private BiomeEffects effects = DEFAULT_EFFECTS; private Precipitation precipitation = Precipitation.RAIN; private TemperatureModifier temperatureModifier = TemperatureModifier.NONE; - Builder() { - } - public Builder name(NamespaceID name) { this.name = name; return this; @@ -177,17 +125,12 @@ public Builder downfall(float downfall) { return this; } - public Builder category(Category category) { - this.category = category; - return this; - } - public Builder effects(BiomeEffects effects) { this.effects = effects; return this; } - public Builder precipitation(Precipitation precipitation) { + public Builder precipitation(Biome.Precipitation precipitation) { this.precipitation = precipitation; return this; } @@ -198,23 +141,7 @@ public Builder temperatureModifier(TemperatureModifier temperatureModifier) { } public Biome build() { - return new Biome(name, depth, temperature, scale, downfall, category, effects, precipitation, temperatureModifier); - } - } - - public interface Setter { - void setBiome(int x, int y, int z, @NotNull Biome biome); - - default void setBiome(@NotNull Point blockPosition, @NotNull Biome biome) { - setBiome(blockPosition.blockX(), blockPosition.blockY(), blockPosition.blockZ(), biome); - } - } - - public interface Getter { - @NotNull Biome getBiome(int x, int y, int z); - - default @NotNull Biome getBiome(@NotNull Point point) { - return getBiome(point.blockX(), point.blockY(), point.blockZ()); + return new BiomeImpl(name, depth, temperature, scale, downfall, effects, precipitation, temperatureModifier); } } } diff --git a/src/main/java/net/minestom/server/world/biomes/BiomeImpl.java b/src/main/java/net/minestom/server/world/biomes/BiomeImpl.java new file mode 100644 index 00000000000..ffa83df9078 --- /dev/null +++ b/src/main/java/net/minestom/server/world/biomes/BiomeImpl.java @@ -0,0 +1,137 @@ +package net.minestom.server.world.biomes; + +import net.minestom.server.registry.ProtocolObject; +import net.minestom.server.registry.Registry; +import net.minestom.server.utils.NamespaceID; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.concurrent.atomic.AtomicInteger; + +final class BiomeImpl implements ProtocolObject, Biome { + // https://minecraft.wiki/w/Rain + private final static Double SNOW_TEMPERATURE = 0.15; + public static final AtomicInteger ID_COUNTER = new AtomicInteger(1); + + private static final Registry.Container CONTAINER = Registry.createContainer(Registry.Resource.BIOMES, + (namespace, properties) -> new BiomeImpl(Registry.biome(namespace, properties))); + + static Collection values() { + return CONTAINER.values(); + } + + static BiomeImpl get(@NotNull String namespace) { + return CONTAINER.get(namespace); + } + + static BiomeImpl getSafe(@NotNull String namespace) { + return CONTAINER.getSafe(namespace); + } + + static BiomeImpl getId(int id) { + return CONTAINER.getId(id); + } + + private final int id; + + private final NamespaceID name; + private final float depth; + private final float temperature; + private final float scale; + private final float downfall; + private final BiomeEffects effects; + private final Precipitation precipitation; + private final TemperatureModifier temperatureModifier; + + BiomeImpl(NamespaceID name, float depth, float temperature, float scale, float downfall, BiomeEffects effects, Precipitation precipitation, TemperatureModifier temperatureModifier) { + this.name = name; + this.depth = depth; + this.temperature = temperature; + this.scale = scale; + this.downfall = downfall; + this.effects = effects; + this.precipitation = precipitation; + this.temperatureModifier = temperatureModifier; + + if (name.equals(NamespaceID.from("minecraft:plains"))) this.id = 0; + else this.id = ID_COUNTER.getAndIncrement(); + } + + BiomeImpl(Registry.BiomeEntry entry) { + this.name = entry.namespace(); + this.depth = 0.2f; + this.scale = 0.2f; + this.temperature = entry.temperature(); + + BiomeEffects.Builder effectsBuilder = getBuilder(entry); + this.effects = effectsBuilder.build(); + + this.precipitation = entry.hasPrecipitation() + ? temperature < SNOW_TEMPERATURE + ? Biome.Precipitation.SNOW + : Biome.Precipitation.RAIN + : Biome.Precipitation.NONE; + + this.downfall = entry.downfall(); + this.temperatureModifier = entry.temperature() < SNOW_TEMPERATURE ? TemperatureModifier.FROZEN : TemperatureModifier.NONE; + + if (name.equals(NamespaceID.from("minecraft:plains"))) this.id = 0; + else this.id = ID_COUNTER.getAndIncrement(); + } + + @NotNull + private static BiomeEffects.Builder getBuilder(Registry.BiomeEntry entry) { + BiomeEffects.Builder effectsBuilder = BiomeEffects.builder(); + if (entry.foliageColor() != null) effectsBuilder.foliageColor(entry.foliageColor()); + if (entry.grassColor() != null) effectsBuilder.grassColor(entry.grassColor()); + if (entry.skyColor() != null) effectsBuilder.skyColor(entry.skyColor()); + if (entry.waterColor() != null) effectsBuilder.waterColor(entry.waterColor()); + if (entry.waterFogColor() != null) effectsBuilder.waterFogColor(entry.waterFogColor()); + if (entry.fogColor() != null) effectsBuilder.fogColor(entry.fogColor()); + return effectsBuilder; + } + + public int id() { + return this.id; + } + + @Nullable + @Override + public Registry.BiomeEntry registry() { + return null; + } + + @Override + public @NotNull NamespaceID namespace() { + return this.name; + } + + public float depth() { + return this.depth; + } + + public float temperature() { + return this.temperature; + } + + public float scale() { + return this.scale; + } + + public float downfall() { + return this.downfall; + } + + public BiomeEffects effects() { + return this.effects; + } + + public Precipitation precipitation() { + return this.precipitation; + } + + public TemperatureModifier temperatureModifier() { + return this.temperatureModifier; + } +} 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 6e42c2a68c3..47263caffe9 100644 --- a/src/main/java/net/minestom/server/world/biomes/BiomeManager.java +++ b/src/main/java/net/minestom/server/world/biomes/BiomeManager.java @@ -1,7 +1,8 @@ package net.minestom.server.world.biomes; -import net.minestom.server.registry.Registry; +import net.minestom.server.MinecraftServer; import net.minestom.server.utils.NamespaceID; +import net.minestom.server.utils.validate.Check; import org.jglrxavpok.hephaistos.nbt.NBT; import org.jglrxavpok.hephaistos.nbt.NBTCompound; import org.jglrxavpok.hephaistos.nbt.NBTType; @@ -15,52 +16,19 @@ /** * Allows servers to register custom dimensions. Also used during player joining to send the list of all existing dimensions. *

- * Contains {@link Biome#PLAINS} by default but can be removed. */ public final class BiomeManager { private final Map biomes = new ConcurrentHashMap<>(); - // https://minecraft.fandom.com/wiki/Rain - private final static Double SNOW_TEMPERATURE = 0.15; - private static final boolean loadBiomes = Boolean.getBoolean("minestom.load-vanilla-biomes"); - public BiomeManager() { - addBiome(Biome.PLAINS); - - if (loadBiomes) { - Registry.createContainer(Registry.Resource.BIOMES, - (namespace, properties) -> { - NamespaceID namespaceID = NamespaceID.from(namespace); - var builder = Biome.builder().name(namespaceID); - - BiomeEffects.Builder effectsBuilder = BiomeEffects.builder(); - if (properties.containsKey("foliageColor")) effectsBuilder.foliageColor(properties.getInt("foliageColor")); - if (properties.containsKey("grassColor")) effectsBuilder.grassColor(properties.getInt("grassColor")); - if (properties.containsKey("skyColor")) effectsBuilder.skyColor(properties.getInt("skyColor")); - if (properties.containsKey("waterColor")) effectsBuilder.waterColor(properties.getInt("waterColor")); - if (properties.containsKey("waterFogColor")) effectsBuilder.waterFogColor(properties.getInt("waterFogColor")); - if (properties.containsKey("fogColor")) effectsBuilder.fogColor(properties.getInt("fogColor")); - builder.effects(effectsBuilder.build()); - - double temperature = properties.getDouble("temperature", 0.5F); - double downfall = properties.getDouble("downfall", 0.5F); - boolean hasPrecipitation = properties.getBoolean("has_precipitation", true); - - builder.temperature((float) temperature) - .downfall((float) downfall); - - Biome.Precipitation precipitationType = hasPrecipitation - ? temperature < SNOW_TEMPERATURE - ? Biome.Precipitation.SNOW - : Biome.Precipitation.RAIN - : Biome.Precipitation.NONE; - builder.precipitation(precipitationType); + // Need to register plains for the client to work properly + // Plains is always ID 0 + addBiome(BiomeImpl.get("minecraft:plains")); + } - return builder.build(); - }).values().forEach((biome -> { - if (biome.name().equals("minecraft:plains")) return; - addBiome(biome); - })); + public void loadVanillaBiomes() { + for (BiomeImpl biome : BiomeImpl.values()) { + if (biome.id() != 0) addBiome(biome); } } @@ -70,6 +38,7 @@ public BiomeManager() { * @param biome the biome to add */ public void addBiome(Biome biome) { + Check.stateCondition(getByName(biome.namespace()) != null, "The biome " + biome.namespace() + " has already been registered"); this.biomes.put(biome.id(), biome); } diff --git a/src/test/java/net/minestom/server/instance/GeneratorForkIntegrationTest.java b/src/test/java/net/minestom/server/instance/GeneratorForkIntegrationTest.java index ec9b91cebac..ed3097b4615 100644 --- a/src/test/java/net/minestom/server/instance/GeneratorForkIntegrationTest.java +++ b/src/test/java/net/minestom/server/instance/GeneratorForkIntegrationTest.java @@ -1,11 +1,12 @@ package net.minestom.server.instance; -import net.minestom.testing.Env; -import net.minestom.testing.EnvTest; +import net.minestom.server.MinecraftServer; import net.minestom.server.coordinate.Point; import net.minestom.server.instance.block.Block; import net.minestom.server.instance.generator.GenerationUnit; -import net.minestom.server.world.biomes.Biome; +import net.minestom.server.utils.NamespaceID; +import net.minestom.testing.Env; +import net.minestom.testing.EnvTest; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -97,11 +98,13 @@ public void fillHeight(Env env) { @Test public void biome(Env env) { var manager = env.process().instance(); + + var plains = MinecraftServer.getBiomeManager().getByName(NamespaceID.from("minecraft:plains")); var instance = manager.createInstanceContainer(); instance.setGenerator(unit -> { var u = unit.fork(unit.absoluteStart(), unit.absoluteEnd().add(16, 0, 16)); - assertThrows(IllegalStateException.class, () -> u.modifier().setBiome(16, 0, 0, Biome.PLAINS)); - assertThrows(IllegalStateException.class, () -> u.modifier().fillBiome(Biome.PLAINS)); + assertThrows(IllegalStateException.class, () -> u.modifier().setBiome(16, 0, 0, plains)); + assertThrows(IllegalStateException.class, () -> u.modifier().fillBiome(plains)); }); instance.loadChunk(0, 0).join(); } diff --git a/src/test/java/net/minestom/server/instance/GeneratorTest.java b/src/test/java/net/minestom/server/instance/GeneratorTest.java index 4a53ede725c..9cf8f029f86 100644 --- a/src/test/java/net/minestom/server/instance/GeneratorTest.java +++ b/src/test/java/net/minestom/server/instance/GeneratorTest.java @@ -6,8 +6,10 @@ import net.minestom.server.instance.generator.GenerationUnit; import net.minestom.server.instance.generator.Generator; import net.minestom.server.utils.MathUtils; +import net.minestom.server.utils.NamespaceID; import net.minestom.server.utils.chunk.ChunkUtils; import net.minestom.server.world.biomes.Biome; +import net.minestom.server.world.biomes.BiomeEffects; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -26,6 +28,22 @@ import static org.junit.jupiter.api.Assertions.*; public class GeneratorTest { + private static final BiomeEffects DEFAULT_EFFECTS = BiomeEffects.builder() + .fogColor(0xC0D8FF) + .skyColor(0x78A7FF) + .waterColor(0x3F76E4) + .waterFogColor(0x50533) + .build(); + + //A plains biome has to be registered or else minecraft will crash + public static final Biome PLAINS = Biome.builder() + .name(NamespaceID.from("minecraft:plains")) + .temperature(0.8F) + .downfall(0.4F) + .depth(0.125F) + .scale(0.05F) + .effects(DEFAULT_EFFECTS) + .build(); @Test public void unitSize() { @@ -253,13 +271,13 @@ public void chunkBiomeSet() { var chunkUnits = GeneratorImpl.chunk(minSection, maxSection, List.of(sections), chunkX, chunkZ); Generator generator = chunk -> { var modifier = chunk.modifier(); - modifier.setBiome(48, 0, -32, Biome.PLAINS); - modifier.setBiome(48 + 8, 0, -32, Biome.PLAINS); + modifier.setBiome(48, 0, -32, PLAINS); + modifier.setBiome(48 + 8, 0, -32, PLAINS); }; generator.generate(chunkUnits); - assertEquals(Biome.PLAINS.id(), sections[0].biomePalette().get(0, 0, 0)); + assertEquals(PLAINS.id(), sections[0].biomePalette().get(0, 0, 0)); assertEquals(0, sections[0].biomePalette().get(1, 0, 0)); - assertEquals(Biome.PLAINS.id(), sections[0].biomePalette().get(2, 0, 0)); + assertEquals(PLAINS.id(), sections[0].biomePalette().get(2, 0, 0)); } @Test @@ -274,12 +292,12 @@ public void chunkBiomeFill() { var chunkUnits = GeneratorImpl.chunk(minSection, maxSection, List.of(sections), chunkX, chunkZ); Generator generator = chunk -> { var modifier = chunk.modifier(); - modifier.fillBiome(Biome.PLAINS); + modifier.fillBiome(PLAINS); }; generator.generate(chunkUnits); for (var section : sections) { section.biomePalette().getAll((x, y, z, value) -> - assertEquals(Biome.PLAINS.id(), value)); + assertEquals(PLAINS.id(), value)); } }