diff --git a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java index 7c181a07..aaf042ec 100644 --- a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java +++ b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java @@ -30,6 +30,7 @@ import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import ru.bclib.entity.BCLEntityWrapper; import ru.bclib.util.ColorUtil; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.features.BCLFeature; @@ -131,6 +132,22 @@ public class BCLBiomeBuilder { return this; } + /** + * Adds mob spawning to biome. + * @param wrapper {@link BCLEntityWrapper} mob type. + * @param weight spawn weight. + * @param minGroupCount minimum mobs in group. + * @param maxGroupCount maximum mobs in group. + * @return same {@link BCLBiomeBuilder} instance. + */ + public BCLBiomeBuilder spawn(BCLEntityWrapper wrapper, int weight, int minGroupCount, int maxGroupCount) { + if (wrapper.canSpawn()) { + return spawn(wrapper.type(), weight, minGroupCount, maxGroupCount); + } + + return this; + } + /** * Adds ambient particles to thr biome. * @param particle {@link ParticleOptions} particles (or {@link net.minecraft.core.particles.ParticleType}). diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index 937036f4..ac7d563a 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -61,6 +61,7 @@ import net.minecraft.world.level.levelgen.placement.PlacedFeature; import org.apache.commons.lang3.mutable.MutableInt; import ru.bclib.BCLib; import ru.bclib.config.Configs; +import ru.bclib.entity.BCLEntityWrapper; import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.bclib.interfaces.SurfaceProvider; import ru.bclib.interfaces.SurfaceRuleProvider; @@ -626,6 +627,10 @@ public class BiomeAPI { * @param structure {@link ConfiguredStructureFeature} to add. */ public static void addBiomeStructure(ResourceKey biomeKey, ConfiguredStructureFeature structure) { + if (biomeKey==null){ + BCLib.LOGGER.error("null is not a valid biomeKey for " + structure); + return; + } changeStructureStarts(structureMap -> { Multimap, ResourceKey> configuredMap = structureMap.computeIfAbsent(structure.feature, k -> HashMultimap.create()); @@ -699,6 +704,20 @@ public class BiomeAPI { return SURFACE_RULES.get(biomeID); } + /** + * Adds mob spawning to specified biome. + * @param biome {@link Biome} to add mob spawning. + * @param entityType {@link BCLEntityWrapper} mob type. + * @param weight spawn weight. + * @param minGroupCount minimum mobs in group. + * @param maxGroupCount maximum mobs in group. + */ + public static void addBiomeMobSpawn(Biome biome, BCLEntityWrapper entityType, int weight, int minGroupCount, int maxGroupCount) { + if (entityType.canSpawn()){ + addBiomeMobSpawn(biome, entityType.type(), weight, minGroupCount, maxGroupCount); + } + } + /** * Adds mob spawning to specified biome. * @param biome {@link Biome} to add mob spawning. diff --git a/src/main/java/ru/bclib/api/spawning/SpawnRuleBuilder.java b/src/main/java/ru/bclib/api/spawning/SpawnRuleBuilder.java index 02ca1ccd..6d18d31b 100644 --- a/src/main/java/ru/bclib/api/spawning/SpawnRuleBuilder.java +++ b/src/main/java/ru/bclib/api/spawning/SpawnRuleBuilder.java @@ -13,6 +13,7 @@ import net.minecraft.world.entity.SpawnPlacements.Type; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.phys.AABB; +import ru.bclib.entity.BCLEntityWrapper; import ru.bclib.interfaces.SpawnRule; import java.util.Arrays; @@ -33,6 +34,7 @@ public class SpawnRuleBuilder { /** * Starts new rule building process. + * @param entityType The entity you want to build a rule for * @return prepared {@link SpawnRuleBuilder} instance. */ public static SpawnRuleBuilder start(EntityType entityType) { @@ -41,6 +43,15 @@ public class SpawnRuleBuilder { return INSTANCE; } + /** + * Starts new rule building process. + * @param entityType The entity you want to build a rule for + * @return prepared {@link SpawnRuleBuilder} instance. + */ + public static SpawnRuleBuilder start(BCLEntityWrapper entityType) { + return start(entityType.type()); + } + /** * Stop entity spawn on peaceful {@link Difficulty} * @return same {@link SpawnRuleBuilder} instance. diff --git a/src/main/java/ru/bclib/entity/BCLEntityWrapper.java b/src/main/java/ru/bclib/entity/BCLEntityWrapper.java new file mode 100644 index 00000000..dc4b4f9e --- /dev/null +++ b/src/main/java/ru/bclib/entity/BCLEntityWrapper.java @@ -0,0 +1,7 @@ +package ru.bclib.entity; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.entity.EntityType; + +public record BCLEntityWrapper(EntityType type, boolean canSpawn) { +} diff --git a/src/main/java/ru/bclib/world/biomes/BCLBiome.java b/src/main/java/ru/bclib/world/biomes/BCLBiome.java index 8e823b63..8b62ee66 100644 --- a/src/main/java/ru/bclib/world/biomes/BCLBiome.java +++ b/src/main/java/ru/bclib/world/biomes/BCLBiome.java @@ -11,6 +11,7 @@ import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import org.jetbrains.annotations.Nullable; +import ru.bclib.BCLib; import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.WeightedList; @@ -226,6 +227,9 @@ public class BCLBiome { edge.updateActualBiomes(biomeRegistry); } this.actualBiome = biomeRegistry.get(biomeID); + if (actualBiome==null) { + BCLib.LOGGER.error("Unable to find actual Biome for " + biomeID); + } if (!this.structures.isEmpty()) { structures.forEach(s -> BiomeAPI.addBiomeStructure(BiomeAPI.getBiomeKey(actualBiome), s));