From 81f6de2ac265bfdd82504f7cbe4eb5b17dfae0bc Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 15 Dec 2021 11:56:09 +0100 Subject: [PATCH 1/5] Changed priority for filler --- src/main/java/ru/bclib/api/surface/SurfaceRuleBuilder.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/bclib/api/surface/SurfaceRuleBuilder.java b/src/main/java/ru/bclib/api/surface/SurfaceRuleBuilder.java index 641b73aa..bd88f2c1 100644 --- a/src/main/java/ru/bclib/api/surface/SurfaceRuleBuilder.java +++ b/src/main/java/ru/bclib/api/surface/SurfaceRuleBuilder.java @@ -83,12 +83,12 @@ public class SurfaceRuleBuilder { } /** - * Set biome filler with specified {@link BlockState}. Example - stone in the Overworld biomes. The rule is added with priority 3. + * Set biome filler with specified {@link BlockState}. Example - stone in the Overworld biomes. The rule is added with priority 10. * @param state {@link BlockState} for filling. * @return same {@link SurfaceRuleBuilder} instance. */ public SurfaceRuleBuilder filler(BlockState state) { - entryInstance = getFromCache("fill_" + state.toString(), () -> new SurfaceRuleEntry(3, SurfaceRules.state(state))); + entryInstance = getFromCache("fill_" + state.toString(), () -> new SurfaceRuleEntry(10, SurfaceRules.state(state))); rules.add(entryInstance); return this; } From abd445114f8a9c1d6e9bfbee625a40f7d817cc47 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 15 Dec 2021 12:01:07 +0100 Subject: [PATCH 2/5] Accept squared distances --- .../java/ru/bclib/world/generator/GeneratorOptions.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/ru/bclib/world/generator/GeneratorOptions.java b/src/main/java/ru/bclib/world/generator/GeneratorOptions.java index 89ea2084..77db2a7e 100644 --- a/src/main/java/ru/bclib/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/bclib/world/generator/GeneratorOptions.java @@ -69,6 +69,14 @@ public class GeneratorOptions { GeneratorOptions.farEndBiomesSqr = (long) distance * (long) distance; } + /** + * Set distance of far End biomes generation, in blocks^2 + * @param distanceSqr the distance squared + */ + public static void setFarEndBiomesSqr(long distanceSqr) { + GeneratorOptions.farEndBiomesSqr = distanceSqr; + } + public static boolean customNetherBiomeSource() { return customNetherBiomeSource; } From 67d835b59ba704750c7b9cf806466c58cea231e7 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 15 Dec 2021 16:02:34 +0100 Subject: [PATCH 3/5] Loader update --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 473c09d2..e6d84f03 100644 --- a/gradle.properties +++ b/gradle.properties @@ -7,7 +7,7 @@ loom_version=0.10-SNAPSHOT # Fabric Properties # check these on https://fabricmc.net/versions.html minecraft_version= 1.18.1 -loader_version= 0.12.11 +loader_version= 0.12.12 fabric_version = 0.44.0+1.18 # Mod Properties From 43f6d72dda28dbc5188f415ca56da8be375a2362 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 15 Dec 2021 20:47:57 +0100 Subject: [PATCH 4/5] Make sure features are applied to the correct biomes --- .../java/ru/bclib/api/biomes/BiomeAPI.java | 52 ++++++++++++------- 1 file changed, 33 insertions(+), 19 deletions(-) diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index 839dbe78..eba16264 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -140,8 +140,34 @@ public class BiomeAPI { * @param biomeRegistry - {@link Registry} for {@link Biome}. */ public static void initRegistry(Registry biomeRegistry) { - BiomeAPI.biomeRegistry = biomeRegistry; - CLIENT.clear(); + if (biomeRegistry != BiomeAPI.biomeRegistry) { + BiomeAPI.biomeRegistry = biomeRegistry; + CLIENT.clear(); + + for (var entry : biomeRegistry.entrySet()){ + onAddedBiome(entry.getValue()); + } + RegistryEntryAddedCallback + .event(biomeRegistry) + .register((rawId, id, biome)->{ + + BCLib.LOGGER.info(" #### " + rawId + ", " + biome + ", " + id); + + onAddedBiome(biome); + }); + } + } + + private static void onAddedBiome(Biome biome) { + for (var dim : MODIFICATIONS.keySet()) { + List> modifications = MODIFICATIONS.get(dim); + if (modifications == null) { + sortBiomeFeatures(biome); + return; + } + + applyModifications(modifications, biome); + } } /** @@ -821,6 +847,10 @@ public class BiomeAPI { DynamicRegistrySetupCallback.EVENT.register(registryManager -> { Optional> oGeneratorRegistry = registryManager.registry(Registry.NOISE_GENERATOR_SETTINGS_REGISTRY); Optional> oBiomeRegistry = registryManager.registry(Registry.BIOME_REGISTRY); + if (oBiomeRegistry.isPresent()){ + + + } if (oGeneratorRegistry.isPresent()) { RegistryEntryAddedCallback @@ -841,23 +871,7 @@ public class BiomeAPI { }); } - if (oBiomeRegistry.isPresent()){ - RegistryEntryAddedCallback - .event(oBiomeRegistry.get()) - .register((rawId, id, biome)->{ - //BCLib.LOGGER.info(" #### " + rawId + ", " + biome + ", " + id); - - for (var dim : MODIFICATIONS.keySet()) { - List> modifications = MODIFICATIONS.get(dim); - if (modifications == null) { - sortBiomeFeatures(biome); - return; - } - - applyModifications(modifications, biome); - } - }); - } + }); } From 3e18eb839fbe28b23aa3688848c0f565256b7c9c Mon Sep 17 00:00:00 2001 From: Frank Date: Thu, 16 Dec 2021 00:01:27 +0100 Subject: [PATCH 5/5] Datapack friendly features --- .../ru/bclib/api/biomes/BCLBiomeBuilder.java | 31 ++++++++- .../java/ru/bclib/api/biomes/BiomeAPI.java | 63 ++++++++++++++----- .../java/ru/bclib/world/biomes/BCLBiome.java | 24 +++++++ 3 files changed, 103 insertions(+), 15 deletions(-) diff --git a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java index 2c189a21..2abcb179 100644 --- a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java +++ b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java @@ -1,9 +1,11 @@ package ru.bclib.api.biomes; import net.fabricmc.fabric.api.biome.v1.BiomeModifications; +import net.minecraft.core.Direction; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.data.BuiltinRegistries; import net.minecraft.data.worldgen.BiomeDefaultFeatures; +import net.minecraft.data.worldgen.placement.OrePlacements; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.Music; import net.minecraft.sounds.SoundEvent; @@ -32,15 +34,22 @@ import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.placement.PlacedFeature; import ru.bclib.api.surface.SurfaceRuleBuilder; import ru.bclib.entity.BCLEntityWrapper; +import ru.bclib.mixin.common.BiomeGenerationSettingsAccessor; import ru.bclib.util.ColorUtil; +import ru.bclib.util.Pair; import ru.bclib.world.biomes.BCLBiome; import ru.bclib.world.features.BCLFeature; import ru.bclib.world.structures.BCLStructureFeature; import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedList; import java.util.List; +import java.util.Map; import java.util.function.BiFunction; import java.util.function.Consumer; +import java.util.function.Supplier; +import java.util.stream.Collectors; public class BCLBiomeBuilder { private static final BCLBiomeBuilder INSTANCE = new BCLBiomeBuilder(); @@ -583,13 +592,33 @@ public class BCLBiomeBuilder { builder.mobSpawnSettings(getSpawns().build()); builder.specialEffects(getEffects().build()); - builder.generationSettings(getGeneration().build()); + + Map>> defferedFeatures = new HashMap<>(); + BiomeGenerationSettingsAccessor acc = (BiomeGenerationSettingsAccessor)getGeneration().build(); + if (acc!=null){ + builder.generationSettings(new BiomeGenerationSettings.Builder().build()); + var decorations = acc.bclib_getFeatures(); + + for (Decoration d : Decoration.values()){ + int i = d.ordinal(); + + if (i>=0 && i(0)); + } + } + } else { + builder.generationSettings(getGeneration().build()); + } final T res = biomeConstructor.apply(biomeID, builder.build()); res.attachStructures(structures); res.setSurface(surfaceRule); res.setFogDensity(fogDensity); res.setGenChance(genChance); + res.setFeatures(defferedFeatures); return res; } diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index eba16264..574c54a5 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -150,15 +150,14 @@ public class BiomeAPI { RegistryEntryAddedCallback .event(biomeRegistry) .register((rawId, id, biome)->{ - - BCLib.LOGGER.info(" #### " + rawId + ", " + biome + ", " + id); - + //BCLib.LOGGER.info(" #### " + rawId + ", " + biome + ", " + id); onAddedBiome(biome); }); } } private static void onAddedBiome(Biome biome) { + //BCLib.LOGGER.info(" ++++ " + getBiomeID(biome) + ", " + getBiomeKey(biome) + ", " + biome); for (var dim : MODIFICATIONS.keySet()) { List> modifications = MODIFICATIONS.get(dim); if (modifications == null) { @@ -541,6 +540,12 @@ public class BiomeAPI { consumer.accept(biomeID, biome); }); } + + final BCLBiome bclBiome = BiomeAPI.getBiome(biome); + if (bclBiome!=null) { + addBiomeFeature(biome, bclBiome.getFeatures()); + } + sortBiomeFeatures(biome); } @@ -605,22 +610,57 @@ public class BiomeAPI { * */ public static void addBiomeFeature(Biome biome, BCLFeature feature) { - addBiomeFeature(biome, feature.getPlacedFeature(), feature.getDecoration()); + addBiomeFeature(biome, feature.getDecoration(), feature.getPlacedFeature()); } /** * Adds new features to existing biome. * @param biome {@link Biome} to add features in. - * @param feature {@link ConfiguredFeature} to add. * @param step a {@link Decoration} step for the feature. + * @param featureList {@link ConfiguredFeature} to add. */ - public static void addBiomeFeature(Biome biome, PlacedFeature feature, Decoration step) { + public static void addBiomeFeature(Biome biome, Decoration step, PlacedFeature... featureList) { + addBiomeFeature(biome, step, List.of(featureList)); + } + + /** + * Adds new features to existing biome. + * @param biome {@link Biome} to add features in. + * @param step a {@link Decoration} step for the feature. + * @param featureList List of {@link ConfiguredFeature} to add. + */ + public static void addBiomeFeature(Biome biome, Decoration step, List featureList) { BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings(); List>> allFeatures = CollectionsUtil.getMutable(accessor.bclib_getFeatures()); Set set = CollectionsUtil.getMutable(accessor.bclib_getFeatureSet()); List> features = getFeaturesList(allFeatures, step); - features.add(() -> feature); - set.add(feature); + for (var feature : featureList) { + features.add(() -> feature); + set.add(feature); + } + accessor.bclib_setFeatures(allFeatures); + accessor.bclib_setFeatureSet(set); + } + + /** + * Adds new features to existing biome. + * @param biome {@link Biome} to add features in. + * @param featureMap Map of {@link ConfiguredFeature} to add. + */ + public static void addBiomeFeature(Biome biome, Map>> featureMap) { + BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings(); + List>> allFeatures = CollectionsUtil.getMutable(accessor.bclib_getFeatures()); + Set set = CollectionsUtil.getMutable(accessor.bclib_getFeatureSet()); + + for (Decoration step: featureMap.keySet()) { + List> features = getFeaturesList(allFeatures, step); + List> featureList = featureMap.get(step); + + for (Supplier feature : featureList) { + features.add(feature); + set.add(feature.get()); + } + } accessor.bclib_setFeatures(allFeatures); accessor.bclib_setFeatureSet(set); } @@ -632,7 +672,7 @@ public class BiomeAPI { * @param step a {@link Decoration} step for the feature. */ private static void addBiomeFeature(ResourceLocation biomeID, PlacedFeature feature, Decoration step) { - addBiomeFeature(BuiltinRegistries.BIOME.get(biomeID), feature, step); + addBiomeFeature(BuiltinRegistries.BIOME.get(biomeID), step, feature); } /** @@ -846,11 +886,6 @@ public class BiomeAPI { public static void registerStructureEvents(){ DynamicRegistrySetupCallback.EVENT.register(registryManager -> { Optional> oGeneratorRegistry = registryManager.registry(Registry.NOISE_GENERATOR_SETTINGS_REGISTRY); - Optional> oBiomeRegistry = registryManager.registry(Registry.BIOME_REGISTRY); - if (oBiomeRegistry.isPresent()){ - - - } if (oGeneratorRegistry.isPresent()) { RegistryEntryAddedCallback diff --git a/src/main/java/ru/bclib/world/biomes/BCLBiome.java b/src/main/java/ru/bclib/world/biomes/BCLBiome.java index 9336ac39..f98de879 100644 --- a/src/main/java/ru/bclib/world/biomes/BCLBiome.java +++ b/src/main/java/ru/bclib/world/biomes/BCLBiome.java @@ -7,18 +7,24 @@ import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; import org.jetbrains.annotations.Nullable; import ru.bclib.BCLib; import ru.bclib.api.biomes.BiomeAPI; +import ru.bclib.util.Pair; import ru.bclib.util.WeightedList; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Random; import java.util.function.Consumer; +import java.util.function.Supplier; public class BCLBiome { private final List structures = Lists.newArrayList(); @@ -355,4 +361,22 @@ public class BCLBiome { BiomeAPI.addSurfaceRule(biomeID, SurfaceRules.ifTrue(SurfaceRules.isBiome(key), surface)); }; } + + private Map>> features = new HashMap<>(0); + + /** + * Sets the biome features. + * @param features the feature list. + */ + public void setFeatures(Map>> features) { + this.features = features; + } + + /** + * Returns the built-in set of Features for this biome (as they were set with {@link #setFeatures(Map)}) + * @return List of all features + */ + public Map>> getFeatures(){ + return features; + } }