From dea05bce0d229455fe41dcf6c98557c172bce225 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 3 Dec 2021 14:46:02 +0300 Subject: [PATCH 1/4] Biome carvers modifications --- .../ru/bclib/api/biomes/BCLBiomeBuilder.java | 1 - .../java/ru/bclib/api/biomes/BiomeAPI.java | 76 +++++++------------ .../BiomeGenerationSettingsAccessor.java | 10 +++ .../java/ru/bclib/mixin/common/MainMixin.java | 1 - .../mixin/common/MinecraftServerMixin.java | 1 - .../bclib/mixin/common/ServerLevelMixin.java | 2 - .../common/StructureSettingsAccessor.java | 6 -- .../java/ru/bclib/world/biomes/BCLBiome.java | 3 - .../ru/bclib/world/biomes/BCLBiomeDef.java | 1 - 9 files changed, 39 insertions(+), 62 deletions(-) diff --git a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java index da74bf61..4d6332a5 100644 --- a/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java +++ b/src/main/java/ru/bclib/api/biomes/BCLBiomeBuilder.java @@ -1,7 +1,6 @@ package ru.bclib.api.biomes; import net.fabricmc.fabric.api.biome.v1.BiomeModifications; -import net.minecraft.core.Registry; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.data.BuiltinRegistries; import net.minecraft.data.worldgen.BiomeDefaultFeatures; diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index e2fffc82..663bd6a0 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -16,7 +16,6 @@ import net.minecraft.core.Registry; import net.minecraft.data.BuiltinRegistries; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.random.WeightedRandomList; import net.minecraft.world.entity.EntityType; @@ -28,8 +27,10 @@ import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.biome.Climate; import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; +import net.minecraft.world.level.levelgen.GenerationStep.Carving; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.StructureFeature; @@ -49,9 +50,7 @@ import ru.bclib.world.generator.BiomePicker; import ru.bclib.world.structures.BCLStructureFeature; import java.util.ArrayList; -import java.util.EnumMap; import java.util.HashMap; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Random; @@ -93,10 +92,9 @@ public class BiomeAPI { /** * Initialize registry for current server. - * - * @param server - {@link MinecraftServer} + * @param biomeRegistry - {@link Registry} for {@link Biome}. */ - public static void initRegistry( Registry biomeRegistry) { + public static void initRegistry(Registry biomeRegistry) { BiomeAPI.biomeRegistry = biomeRegistry; CLIENT.clear(); } @@ -503,21 +501,16 @@ public class BiomeAPI { * @param structure {@link ConfiguredStructureFeature} to add. */ public static void addBiomeStructure(ResourceKey biomeKey, ConfiguredStructureFeature structure) { - //BiomeStructureStartsImpl.addStart(registries, structure, getBiomeID(biome)); changeStructureStarts(structureMap -> { Multimap, ResourceKey> configuredMap = structureMap.computeIfAbsent(structure.feature, k -> HashMultimap.create()); configuredMap.put(structure, biomeKey); }); - - } public static void addBiomeStructure(Biome biome, ConfiguredStructureFeature structure) { - //BiomeStructureStartsImpl.addStart(registries, structure, getBiomeID(biome)); changeStructureStarts(structureMap -> { Multimap, ResourceKey> configuredMap = structureMap.computeIfAbsent(structure.feature, k -> HashMultimap.create()); - var key = getBiomeKey(biome); if (key!=null) { configuredMap.put(structure, key); @@ -525,11 +518,8 @@ public class BiomeAPI { BCLib.LOGGER.error("Unable to find Biome " + getBiomeID(biome)); } }); - - } - private static void changeStructureStarts(Consumer, Multimap, ResourceKey>>> modifier) { Registry chunkGenSettingsRegistry = BuiltinRegistries.NOISE_GENERATOR_SETTINGS; @@ -539,11 +529,8 @@ public class BiomeAPI { modifier.accept(structureMap); setMutableStructureConfig(entry.getValue(), structureMap); } - - } - /** * Adds new structure feature to existing biome. * @param biomeKey {@link ResourceKey} for the {@link Biome} to add structure feature in. @@ -552,7 +539,6 @@ public class BiomeAPI { public static void addBiomeStructure(ResourceKey biomeKey, BCLStructureFeature structure) { addBiomeStructure(biomeKey, structure.getFeatureConfigured()); } - /** * Adds new structure features to existing biome. @@ -565,6 +551,21 @@ public class BiomeAPI { } } + /** + * Adds new carver into existing biome. + * @param biome {@link Biome} to add carver in. + * @param carver {@link ConfiguredWorldCarver} to add. + * @param stage {@link Carving} stage. + */ + public static void addBiomeCarver(Biome biome, ConfiguredWorldCarver carver, Carving stage) { + BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings(); + Map>>> carvers = CollectionsUtil.getMutable(accessor.bclib_getCarvers()); + List>> carverList = CollectionsUtil.getMutable(carvers.getOrDefault(stage, new ArrayList<>())); + carvers.put(stage, carverList); + carverList.add(() -> carver); + accessor.bclib_setCarvers(carvers); + } + /** * Adds mob spawning to specified biome. * @param biome {@link Biome} to add mob spawning. @@ -576,8 +577,8 @@ public class BiomeAPI { public static void addBiomeMobSpawn(Biome biome, EntityType entityType, int weight, int minGroupCount, int maxGroupCount) { final MobCategory category = entityType.getCategory(); MobSpawnSettingsAccessor accessor = (MobSpawnSettingsAccessor) biome.getMobSettings(); - Map> spawners = getMutableMap(accessor.bcl_getSpawners()); - List mobs = spawners.containsKey(category) ? getMutableList(spawners.get(category).unwrap()) : Lists.newArrayList(); + Map> spawners = CollectionsUtil.getMutable(accessor.bcl_getSpawners()); + List mobs = spawners.containsKey(category) ? CollectionsUtil.getMutable(spawners.get(category).unwrap()) : Lists.newArrayList(); mobs.add(new SpawnerData(entityType, weight, minGroupCount, maxGroupCount)); spawners.put(category, WeightedRandomList.create(mobs)); accessor.bcl_setSpawners(spawners); @@ -603,24 +604,11 @@ public class BiomeAPI { lists.add(Lists.newArrayList()); } } - List> list = getMutableList(lists.get(index)); + List> list = CollectionsUtil.getMutable(lists.get(index)); lists.set(index, list); return list; } - private static List getMutableList(List input) { - if (input!=null) { - System.out.println("getMutableList: " + input.getClass().getName()); - for (Class cl : input.getClass().getInterfaces()){ - System.out.println(" - " + cl.getName()); - } - } - if (/*input instanceof ImmutableList ||*/ !(input instanceof ArrayList || input instanceof LinkedList)) { - return Lists.newArrayList(input); - } - return input; - } - private static List> getFeaturesList(List>> features, Decoration step) { int index = step.ordinal(); while (features.size() <= index) { @@ -631,13 +619,6 @@ public class BiomeAPI { return mutable; } - private static Map getMutableMap(Map input) { - if (/*input instanceof ImmutableMap*/ !(input instanceof HashMap ||input instanceof EnumMap)) { - return Maps.newHashMap(input); - } - return input; - } - //inspired by net.fabricmc.fabric.impl.biome.modification.BiomeStructureStartsImpl private static Map, Multimap, ResourceKey>> getMutableStructureConfig(NoiseGeneratorSettings settings) { final StructureSettingsAccessor access = (StructureSettingsAccessor)settings.structureSettings(); @@ -653,11 +634,12 @@ public class BiomeAPI { //inspired by net.fabricmc.fabric.impl.biome.modification.BiomeStructureStartsImpl private static void setMutableStructureConfig(NoiseGeneratorSettings settings, Map, Multimap, ResourceKey>> structureStarts) { - final StructureSettingsAccessor access = (StructureSettingsAccessor)settings.structureSettings(); - access.bcl_setStructureConfig(structureStarts.entrySet().stream() - .collect(ImmutableMap.toImmutableMap( - Map.Entry::getKey, - e -> ImmutableMultimap.copyOf(e.getValue()) - ))); + final StructureSettingsAccessor access = (StructureSettingsAccessor) settings.structureSettings(); + access.bcl_setStructureConfig( + structureStarts + .entrySet() + .stream() + .collect(ImmutableMap.toImmutableMap(Map.Entry::getKey, e -> ImmutableMultimap.copyOf(e.getValue()))) + ); } } diff --git a/src/main/java/ru/bclib/mixin/common/BiomeGenerationSettingsAccessor.java b/src/main/java/ru/bclib/mixin/common/BiomeGenerationSettingsAccessor.java index b31f859e..fcb6ec6f 100644 --- a/src/main/java/ru/bclib/mixin/common/BiomeGenerationSettingsAccessor.java +++ b/src/main/java/ru/bclib/mixin/common/BiomeGenerationSettingsAccessor.java @@ -1,12 +1,16 @@ package ru.bclib.mixin.common; import net.minecraft.world.level.biome.BiomeGenerationSettings; +import net.minecraft.world.level.levelgen.GenerationStep; +import net.minecraft.world.level.levelgen.GenerationStep.Carving; +import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; import net.minecraft.world.level.levelgen.placement.PlacedFeature; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.function.Supplier; @@ -24,4 +28,10 @@ public interface BiomeGenerationSettingsAccessor { @Accessor("featureSet") void bclib_setFeatureSet(Set features); + + @Accessor("carvers") + Map>>> bclib_getCarvers(); + + @Accessor("carvers") + void bclib_setCarvers(Map>>> features); } diff --git a/src/main/java/ru/bclib/mixin/common/MainMixin.java b/src/main/java/ru/bclib/mixin/common/MainMixin.java index e672681d..059129e0 100644 --- a/src/main/java/ru/bclib/mixin/common/MainMixin.java +++ b/src/main/java/ru/bclib/mixin/common/MainMixin.java @@ -1,7 +1,6 @@ package ru.bclib.mixin.common; import net.minecraft.server.Main; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.storage.LevelStorageSource; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; diff --git a/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java b/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java index 23bf14d9..e337b2c6 100644 --- a/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java +++ b/src/main/java/ru/bclib/mixin/common/MinecraftServerMixin.java @@ -21,7 +21,6 @@ import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.api.dataexchange.DataExchangeAPI; import ru.bclib.recipes.BCLRecipeManager; diff --git a/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java b/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java index d0910008..d405536a 100644 --- a/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java +++ b/src/main/java/ru/bclib/mixin/common/ServerLevelMixin.java @@ -9,13 +9,11 @@ import net.minecraft.world.level.CustomSpawner; import net.minecraft.world.level.Level; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.level.storage.LevelStorageSource; import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess; import net.minecraft.world.level.storage.ServerLevelData; import net.minecraft.world.level.storage.WritableLevelData; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.At.Shift; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import ru.bclib.api.LifeCycleAPI; diff --git a/src/main/java/ru/bclib/mixin/common/StructureSettingsAccessor.java b/src/main/java/ru/bclib/mixin/common/StructureSettingsAccessor.java index e48342ef..cb323706 100644 --- a/src/main/java/ru/bclib/mixin/common/StructureSettingsAccessor.java +++ b/src/main/java/ru/bclib/mixin/common/StructureSettingsAccessor.java @@ -3,20 +3,14 @@ package ru.bclib.mixin.common; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMultimap; import net.minecraft.resources.ResourceKey; -import net.minecraft.util.random.WeightedRandomList; -import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.levelgen.StructureSettings; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.StructureFeature; -import net.minecraft.world.level.levelgen.feature.configurations.StructureFeatureConfiguration; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Mutable; import org.spongepowered.asm.mixin.gen.Accessor; -import java.util.Map; - @Mixin(StructureSettings.class) public interface StructureSettingsAccessor { @Accessor("configuredStructures") diff --git a/src/main/java/ru/bclib/world/biomes/BCLBiome.java b/src/main/java/ru/bclib/world/biomes/BCLBiome.java index ab00606f..bc0cb223 100644 --- a/src/main/java/ru/bclib/world/biomes/BCLBiome.java +++ b/src/main/java/ru/bclib/world/biomes/BCLBiome.java @@ -8,11 +8,8 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import org.jetbrains.annotations.Nullable; -import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.WeightedList; -import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Random; diff --git a/src/main/java/ru/bclib/world/biomes/BCLBiomeDef.java b/src/main/java/ru/bclib/world/biomes/BCLBiomeDef.java index 9fe6fdd1..f0a59596 100644 --- a/src/main/java/ru/bclib/world/biomes/BCLBiomeDef.java +++ b/src/main/java/ru/bclib/world/biomes/BCLBiomeDef.java @@ -27,7 +27,6 @@ import net.minecraft.world.level.levelgen.carver.CarverConfiguration; 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.api.biomes.BiomeAPI; import ru.bclib.config.IdConfig; import ru.bclib.config.PathConfig; import ru.bclib.util.ColorUtil; From 8e3147f17613406f55dc72ca2c9afc9586b28035 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 3 Dec 2021 15:39:08 +0300 Subject: [PATCH 2/4] Rule source prototype --- .../java/ru/bclib/api/biomes/BiomeAPI.java | 70 ++++++++++++++++++- .../mixin/common/SurfaceRuleDataMixin.java | 27 +++++++ 2 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 src/main/java/ru/bclib/mixin/common/SurfaceRuleDataMixin.java diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index 663bd6a0..0b1d564f 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -14,6 +14,7 @@ import net.fabricmc.fabric.impl.biome.TheEndBiomeData; import net.minecraft.client.Minecraft; import net.minecraft.core.Registry; import net.minecraft.data.BuiltinRegistries; +import net.minecraft.data.worldgen.SurfaceRuleData; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; @@ -27,9 +28,11 @@ import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.biome.Climate; import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; +import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.levelgen.GenerationStep.Carving; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import net.minecraft.world.level.levelgen.SurfaceRules; import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; @@ -58,6 +61,7 @@ import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; import java.util.function.Supplier; +import java.util.stream.Collectors; public class BiomeAPI { /** @@ -75,6 +79,7 @@ public class BiomeAPI { private static Registry biomeRegistry; private static final Map>> MODIFICATIONS = Maps.newHashMap(); + private static final Map SURFACE_RULES = Maps.newHashMap(); private static final Set MODIFIED_BIOMES = Sets.newHashSet(); public static final BCLBiome NETHER_WASTES_BIOME = registerNetherBiome(getFromRegistry(Biomes.NETHER_WASTES)); @@ -90,6 +95,9 @@ public class BiomeAPI { public static final BCLBiome END_BARRENS = registerEndVoidBiome(getFromRegistry(new ResourceLocation("end_barrens"))); public static final BCLBiome SMALL_END_ISLANDS = registerEndVoidBiome(getFromRegistry(new ResourceLocation("small_end_islands"))); + private static SurfaceRules.RuleSource netherRuleSource; + private static SurfaceRules.RuleSource endRuleSource; + /** * Initialize registry for current server. * @param biomeRegistry - {@link Registry} for {@link Biome}. @@ -409,19 +417,56 @@ public class BiomeAPI { registerBiomeModification(Level.END, modification); } + /** + * Returns surface rule source for the Nether. + * @return {@link SurfaceRules.RuleSource}. + */ + public static SurfaceRules.RuleSource getNetherRuleSource() { + return netherRuleSource; + } + + /** + * Returns surface rule source for the End. + * @return {@link SurfaceRules.RuleSource}. + */ + public static SurfaceRules.RuleSource getEndRuleSource() { + return endRuleSource; + } + /** * Will apply biome modifications to world, internal usage only. * @param level */ public static void applyModifications(ServerLevel level) { + BiomeSource source = level.getChunkSource().getGenerator().getBiomeSource(); + Set biomes = source.possibleBiomes(); + + if (level.dimension() == Level.NETHER) { + Set biomeIDs = biomes.stream().map(biome -> getBiomeID(biome)).collect(Collectors.toSet()); + List rules = Lists.newArrayList(); + SURFACE_RULES.forEach((biomeID, rule) -> { + if (biomeIDs.contains(biomeID)) { + rules.add(rule); + } + }); + netherRuleSource = SurfaceRules.sequence(rules.toArray(new SurfaceRules.RuleSource[rules.size()])); + } + else if (level.dimension() == Level.END) { + Set biomeIDs = biomes.stream().map(biome -> getBiomeID(biome)).collect(Collectors.toSet()); + List rules = Lists.newArrayList(); + SURFACE_RULES.forEach((biomeID, rule) -> { + if (biomeIDs.contains(biomeID)) { + rules.add(rule); + } + }); + endRuleSource = SurfaceRules.sequence(rules.toArray(new SurfaceRules.RuleSource[rules.size()])); + } + List> modifications = MODIFICATIONS.get(level.dimension()); if (modifications == null) { return; } - BiomeSource source = level.getChunkSource().getGenerator().getBiomeSource(); - Set biomes = source.possibleBiomes(); - biomes.forEach(biome -> { ResourceLocation biomeID = getBiomeID(biome); boolean modify = isDatapackBiome(biomeID); @@ -566,6 +611,25 @@ public class BiomeAPI { accessor.bclib_setCarvers(carvers); } + /** + * Adds surface rule to specified biome. + * @param biomeID biome {@link ResourceLocation}. + * @param source {@link SurfaceRules.RuleSource}. + */ + public static void addSurfaceRule(ResourceLocation biomeID, SurfaceRules.RuleSource source) { + SURFACE_RULES.put(biomeID, source); + } + + /** + * Get surface rule for the biome using its {@link ResourceLocation} ID as a key. + * @param biomeID {@link ResourceLocation} biome ID. + * @return {@link SurfaceRules.RuleSource}. + */ + @Nullable + public static SurfaceRules.RuleSource getSurfaceRule(ResourceLocation biomeID) { + return SURFACE_RULES.get(biomeID); + } + /** * Adds mob spawning to specified biome. * @param biome {@link Biome} to add mob spawning. diff --git a/src/main/java/ru/bclib/mixin/common/SurfaceRuleDataMixin.java b/src/main/java/ru/bclib/mixin/common/SurfaceRuleDataMixin.java new file mode 100644 index 00000000..3a12b90b --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/SurfaceRuleDataMixin.java @@ -0,0 +1,27 @@ +package ru.bclib.mixin.common; + +import net.minecraft.data.worldgen.SurfaceRuleData; +import net.minecraft.world.level.levelgen.SurfaceRules; +import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; +import ru.bclib.api.biomes.BiomeAPI; + +@Mixin(SurfaceRuleData.class) +public class SurfaceRuleDataMixin { + @Inject(method = "nether", at = @At("RETURN"), cancellable = true) + private static void bclib_addNetherRuleSource(CallbackInfoReturnable info) { + RuleSource source = info.getReturnValue(); + source = SurfaceRules.sequence(source, BiomeAPI.getNetherRuleSource()); + info.setReturnValue(source); + } + + @Inject(method = "end", at = @At("RETURN"), cancellable = true) + private static void bclib_addEndRuleSource(CallbackInfoReturnable info) { + RuleSource source = info.getReturnValue(); + source = SurfaceRules.sequence(source, BiomeAPI.getEndRuleSource()); + info.setReturnValue(source); + } +} From d3273f609a52c96339943e9496fb7c0bce202bb6 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 3 Dec 2021 15:45:19 +0300 Subject: [PATCH 3/4] Crash fix --- .../java/ru/bclib/api/biomes/BiomeAPI.java | 34 ++++++++++--------- .../mixin/common/SurfaceRuleDataMixin.java | 16 +++++---- src/main/resources/bclib.mixins.common.json | 3 +- 3 files changed, 30 insertions(+), 23 deletions(-) diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index 0b1d564f..2e84194e 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -33,6 +33,7 @@ import net.minecraft.world.level.levelgen.GenerationStep.Carving; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.SurfaceRules; +import net.minecraft.world.level.levelgen.SurfaceRules.RuleSource; import net.minecraft.world.level.levelgen.carver.ConfiguredWorldCarver; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; @@ -442,24 +443,14 @@ public class BiomeAPI { Set biomes = source.possibleBiomes(); if (level.dimension() == Level.NETHER) { - Set biomeIDs = biomes.stream().map(biome -> getBiomeID(biome)).collect(Collectors.toSet()); - List rules = Lists.newArrayList(); - SURFACE_RULES.forEach((biomeID, rule) -> { - if (biomeIDs.contains(biomeID)) { - rules.add(rule); - } - }); - netherRuleSource = SurfaceRules.sequence(rules.toArray(new SurfaceRules.RuleSource[rules.size()])); + RuleSource[] rules = getRuleSources(biomes); + netherRuleSource = rules.length > 0 ? SurfaceRules.sequence(rules) : null; + System.out.println("Adding nether sources! " + rules.length); } else if (level.dimension() == Level.END) { - Set biomeIDs = biomes.stream().map(biome -> getBiomeID(biome)).collect(Collectors.toSet()); - List rules = Lists.newArrayList(); - SURFACE_RULES.forEach((biomeID, rule) -> { - if (biomeIDs.contains(biomeID)) { - rules.add(rule); - } - }); - endRuleSource = SurfaceRules.sequence(rules.toArray(new SurfaceRules.RuleSource[rules.size()])); + RuleSource[] rules = getRuleSources(biomes); + endRuleSource = rules.length > 0 ? SurfaceRules.sequence(rules) : null; + System.out.println("Adding end sources! " + rules.length); } List> modifications = MODIFICATIONS.get(level.dimension()); @@ -485,6 +476,17 @@ public class BiomeAPI { }); } + private static SurfaceRules.RuleSource[] getRuleSources(Set biomes) { + Set biomeIDs = biomes.stream().map(biome -> getBiomeID(biome)).collect(Collectors.toSet()); + List rules = Lists.newArrayList(); + SURFACE_RULES.forEach((biomeID, rule) -> { + if (biomeIDs.contains(biomeID)) { + rules.add(rule); + } + }); + return rules.toArray(new SurfaceRules.RuleSource[rules.size()]); + } + /** * Adds new features to existing biome. * @param biome {@link Biome} to add features in. diff --git a/src/main/java/ru/bclib/mixin/common/SurfaceRuleDataMixin.java b/src/main/java/ru/bclib/mixin/common/SurfaceRuleDataMixin.java index 3a12b90b..4e04d7e0 100644 --- a/src/main/java/ru/bclib/mixin/common/SurfaceRuleDataMixin.java +++ b/src/main/java/ru/bclib/mixin/common/SurfaceRuleDataMixin.java @@ -13,15 +13,19 @@ import ru.bclib.api.biomes.BiomeAPI; public class SurfaceRuleDataMixin { @Inject(method = "nether", at = @At("RETURN"), cancellable = true) private static void bclib_addNetherRuleSource(CallbackInfoReturnable info) { - RuleSource source = info.getReturnValue(); - source = SurfaceRules.sequence(source, BiomeAPI.getNetherRuleSource()); - info.setReturnValue(source); + if (BiomeAPI.getNetherRuleSource() != null) { + RuleSource source = info.getReturnValue(); + source = SurfaceRules.sequence(source, BiomeAPI.getNetherRuleSource()); + info.setReturnValue(source); + } } @Inject(method = "end", at = @At("RETURN"), cancellable = true) private static void bclib_addEndRuleSource(CallbackInfoReturnable info) { - RuleSource source = info.getReturnValue(); - source = SurfaceRules.sequence(source, BiomeAPI.getEndRuleSource()); - info.setReturnValue(source); + if (BiomeAPI.getEndRuleSource() != null) { + RuleSource source = info.getReturnValue(); + source = SurfaceRules.sequence(source, BiomeAPI.getEndRuleSource()); + info.setReturnValue(source); + } } } diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index df63f458..da8faabc 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -37,7 +37,8 @@ "MainMixin", "BiomeGenerationSettingsAccessor", "MobSpawnSettingsAccessor", - "StructureSettingsAccessor" + "StructureSettingsAccessor", + "SurfaceRuleDataMixin" ], "injectors": { "defaultRequire": 1 From 113118afbd9aa2d8dea524600c96b2302400a976 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Fri, 3 Dec 2021 15:55:02 +0300 Subject: [PATCH 4/4] Small changes --- .../java/ru/bclib/api/biomes/BiomeAPI.java | 32 +++++++++++++++++-- 1 file changed, 29 insertions(+), 3 deletions(-) diff --git a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java index 2e84194e..2fe2f267 100644 --- a/src/main/java/ru/bclib/api/biomes/BiomeAPI.java +++ b/src/main/java/ru/bclib/api/biomes/BiomeAPI.java @@ -24,6 +24,7 @@ import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.Level; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.biome.Climate; @@ -57,6 +58,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Random; import java.util.Set; import java.util.function.BiConsumer; @@ -443,12 +445,12 @@ public class BiomeAPI { Set biomes = source.possibleBiomes(); if (level.dimension() == Level.NETHER) { - RuleSource[] rules = getRuleSources(biomes); + RuleSource[] rules = getRuleSources(biomes, level.dimension()); netherRuleSource = rules.length > 0 ? SurfaceRules.sequence(rules) : null; System.out.println("Adding nether sources! " + rules.length); } else if (level.dimension() == Level.END) { - RuleSource[] rules = getRuleSources(biomes); + RuleSource[] rules = getRuleSources(biomes, level.dimension()); endRuleSource = rules.length > 0 ? SurfaceRules.sequence(rules) : null; System.out.println("Adding end sources! " + rules.length); } @@ -476,7 +478,7 @@ public class BiomeAPI { }); } - private static SurfaceRules.RuleSource[] getRuleSources(Set biomes) { + private static SurfaceRules.RuleSource[] getRuleSources(Set biomes, ResourceKey dimensionType) { Set biomeIDs = biomes.stream().map(biome -> getBiomeID(biome)).collect(Collectors.toSet()); List rules = Lists.newArrayList(); SURFACE_RULES.forEach((biomeID, rule) -> { @@ -484,6 +486,30 @@ public class BiomeAPI { rules.add(rule); } }); + + // Try handle biomes from other dimension, may work not as expected + // Will not work + /*Optional optional = biomes + .stream() + .filter(biome -> biome.getBiomeCategory() != BiomeCategory.THEEND && biome.getBiomeCategory() != BiomeCategory.NETHER) + .findAny(); + if (optional.isPresent()) { + rules.add(SurfaceRuleData.overworld()); + } + + if (dimensionType == Level.NETHER) { + optional = biomes.stream().filter(biome -> biome.getBiomeCategory() != BiomeCategory.THEEND).findAny(); + if (optional.isPresent()) { + rules.add(SurfaceRuleData.end()); + } + } + else if (dimensionType == Level.END) { + optional = biomes.stream().filter(biome -> biome.getBiomeCategory() != BiomeCategory.NETHER).findAny(); + if (optional.isPresent()) { + rules.add(SurfaceRuleData.end()); + } + }*/ + return rules.toArray(new SurfaceRules.RuleSource[rules.size()]); }