From f981527200e1bb9cdf09fdec60b911b41d184e12 Mon Sep 17 00:00:00 2001 From: paulevsGitch Date: Wed, 21 Jul 2021 17:31:24 +0300 Subject: [PATCH] Feature randomization (fix MC bug) --- .../ru/bclib/mixin/common/BiomeMixin.java | 28 +++++++++++ .../ru/bclib/world/features/BCLFeature.java | 50 ++++++++++--------- src/main/resources/bclib.mixins.common.json | 3 +- 3 files changed, 56 insertions(+), 25 deletions(-) create mode 100644 src/main/java/ru/bclib/mixin/common/BiomeMixin.java diff --git a/src/main/java/ru/bclib/mixin/common/BiomeMixin.java b/src/main/java/ru/bclib/mixin/common/BiomeMixin.java new file mode 100644 index 00000000..cd8bebf8 --- /dev/null +++ b/src/main/java/ru/bclib/mixin/common/BiomeMixin.java @@ -0,0 +1,28 @@ +package ru.bclib.mixin.common; + +import net.minecraft.core.BlockPos; +import net.minecraft.server.level.WorldGenRegion; +import net.minecraft.world.level.StructureFeatureManager; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.WorldgenRandom; +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.ModifyArg; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Biome.class) +public class BiomeMixin { + private int bclib_featureIteratorSeed; + + @ModifyArg(method = "generate", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/level/levelgen/WorldgenRandom;setFeatureSeed(JII)J")) + private long bclib_updateFeatureSeed(long seed) { + return Long.rotateRight(seed, bclib_featureIteratorSeed); + } + + @Inject(method = "generate", at = @At("HEAD")) + private void bclib_obBiomeGenerate(StructureFeatureManager structureFeatureManager, ChunkGenerator chunkGenerator, WorldGenRegion worldGenRegion, long l, WorldgenRandom worldgenRandom, BlockPos blockPos, CallbackInfo info) { + bclib_featureIteratorSeed = 0; + } +} diff --git a/src/main/java/ru/bclib/world/features/BCLFeature.java b/src/main/java/ru/bclib/world/features/BCLFeature.java index 2cc3f41d..b7b898d0 100644 --- a/src/main/java/ru/bclib/world/features/BCLFeature.java +++ b/src/main/java/ru/bclib/world/features/BCLFeature.java @@ -39,23 +39,25 @@ public class BCLFeature { } public static BCLFeature makeVegetationFeature(ResourceLocation id, Feature feature, int density) { - ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE) - .decorated(BCLDecorators.HEIGHTMAP_SQUARE) - .countRandom(density); + ConfiguredFeature configured = feature + .configured(FeatureConfiguration.NONE) + .decorated(BCLDecorators.HEIGHTMAP_SQUARE) + .countRandom(density); return new BCLFeature(id, feature, GenerationStep.Decoration.VEGETAL_DECORATION, configured); } public static BCLFeature makeRawGenFeature(ResourceLocation id, Feature feature, int chance) { - ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE) - .decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration( - chance))); + ConfiguredFeature configured = feature + .configured(FeatureConfiguration.NONE) + .decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration(chance))); return new BCLFeature(id, feature, GenerationStep.Decoration.RAW_GENERATION, configured); } + @Deprecated public static BCLFeature makeLakeFeature(ResourceLocation id, Feature feature, int chance) { - ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE) - .decorated(FeatureDecorator.LAVA_LAKE.configured(new ChanceDecoratorConfiguration( - chance))); + ConfiguredFeature configured = feature + .configured(FeatureConfiguration.NONE) + .decorated(FeatureDecorator.LAVA_LAKE.configured(new ChanceDecoratorConfiguration(chance))); return new BCLFeature(id, feature, GenerationStep.Decoration.LAKES, configured); } @@ -66,13 +68,14 @@ public class BCLFeature { veinSize ); OreConfiguration config = new OreConfiguration(ANY_TERRAIN, blockOre.defaultBlockState(), 33); - ConfiguredFeature oreFeature = Feature.ORE.configured(featureConfig) - .rangeUniform( - VerticalAnchor.absolute(minY), - VerticalAnchor.absolute(maxY) - ) - .squared() - .count(veins); + ConfiguredFeature oreFeature = Feature.ORE + .configured(featureConfig) + .rangeUniform( + VerticalAnchor.absolute(minY), + VerticalAnchor.absolute(maxY) + ) + .squared() + .count(veins); return new BCLFeature( Feature.ORE, Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, oreFeature), @@ -81,23 +84,22 @@ public class BCLFeature { } public static BCLFeature makeChunkFeature(ResourceLocation id, Feature feature) { - ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE) - .decorated(FeatureDecorator.COUNT.configured(new CountConfiguration( - 1))); + ConfiguredFeature configured = feature + .configured(FeatureConfiguration.NONE) + .decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(1))); return new BCLFeature(id, feature, GenerationStep.Decoration.LOCAL_MODIFICATIONS, configured); } public static BCLFeature makeChansedFeature(ResourceLocation id, Feature feature, int chance) { - ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE) - .decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration( - chance))); + ConfiguredFeature configured = feature + .configured(FeatureConfiguration.NONE) + .decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration(chance))); return new BCLFeature(id, feature, GenerationStep.Decoration.SURFACE_STRUCTURES, configured); } public static BCLFeature makeCountRawFeature(ResourceLocation id, Feature feature, int chance) { ConfiguredFeature configured = feature.configured(FeatureConfiguration.NONE) - .decorated(FeatureDecorator.COUNT.configured(new CountConfiguration( - chance))); + .decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(chance))); return new BCLFeature(id, feature, GenerationStep.Decoration.RAW_GENERATION, configured); } diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index 01d3e36b..5ea05c8b 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -14,7 +14,8 @@ "ServerLevelMixin", "AnvilBlockMixin", "AnvilMenuMixin", - "TagLoaderMixin" + "TagLoaderMixin", + "BiomeMixin" ], "injectors": { "defaultRequire": 1