Feature randomization (fix MC bug)

This commit is contained in:
paulevsGitch 2021-07-21 17:31:24 +03:00
parent a48c350aa2
commit f981527200
3 changed files with 56 additions and 25 deletions

View file

@ -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;
}
}

View file

@ -39,23 +39,25 @@ public class BCLFeature {
} }
public static BCLFeature makeVegetationFeature(ResourceLocation id, Feature<NoneFeatureConfiguration> feature, int density) { public static BCLFeature makeVegetationFeature(ResourceLocation id, Feature<NoneFeatureConfiguration> feature, int density) {
ConfiguredFeature<?, ?> configured = feature.configured(FeatureConfiguration.NONE) ConfiguredFeature<?, ?> configured = feature
.decorated(BCLDecorators.HEIGHTMAP_SQUARE) .configured(FeatureConfiguration.NONE)
.countRandom(density); .decorated(BCLDecorators.HEIGHTMAP_SQUARE)
.countRandom(density);
return new BCLFeature(id, feature, GenerationStep.Decoration.VEGETAL_DECORATION, configured); return new BCLFeature(id, feature, GenerationStep.Decoration.VEGETAL_DECORATION, configured);
} }
public static BCLFeature makeRawGenFeature(ResourceLocation id, Feature<NoneFeatureConfiguration> feature, int chance) { public static BCLFeature makeRawGenFeature(ResourceLocation id, Feature<NoneFeatureConfiguration> feature, int chance) {
ConfiguredFeature<?, ?> configured = feature.configured(FeatureConfiguration.NONE) ConfiguredFeature<?, ?> configured = feature
.decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration( .configured(FeatureConfiguration.NONE)
chance))); .decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration(chance)));
return new BCLFeature(id, feature, GenerationStep.Decoration.RAW_GENERATION, configured); return new BCLFeature(id, feature, GenerationStep.Decoration.RAW_GENERATION, configured);
} }
@Deprecated
public static BCLFeature makeLakeFeature(ResourceLocation id, Feature<NoneFeatureConfiguration> feature, int chance) { public static BCLFeature makeLakeFeature(ResourceLocation id, Feature<NoneFeatureConfiguration> feature, int chance) {
ConfiguredFeature<?, ?> configured = feature.configured(FeatureConfiguration.NONE) ConfiguredFeature<?, ?> configured = feature
.decorated(FeatureDecorator.LAVA_LAKE.configured(new ChanceDecoratorConfiguration( .configured(FeatureConfiguration.NONE)
chance))); .decorated(FeatureDecorator.LAVA_LAKE.configured(new ChanceDecoratorConfiguration(chance)));
return new BCLFeature(id, feature, GenerationStep.Decoration.LAKES, configured); return new BCLFeature(id, feature, GenerationStep.Decoration.LAKES, configured);
} }
@ -66,13 +68,14 @@ public class BCLFeature {
veinSize veinSize
); );
OreConfiguration config = new OreConfiguration(ANY_TERRAIN, blockOre.defaultBlockState(), 33); OreConfiguration config = new OreConfiguration(ANY_TERRAIN, blockOre.defaultBlockState(), 33);
ConfiguredFeature<?, ?> oreFeature = Feature.ORE.configured(featureConfig) ConfiguredFeature<?, ?> oreFeature = Feature.ORE
.rangeUniform( .configured(featureConfig)
VerticalAnchor.absolute(minY), .rangeUniform(
VerticalAnchor.absolute(maxY) VerticalAnchor.absolute(minY),
) VerticalAnchor.absolute(maxY)
.squared() )
.count(veins); .squared()
.count(veins);
return new BCLFeature( return new BCLFeature(
Feature.ORE, Feature.ORE,
Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, oreFeature), Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, id, oreFeature),
@ -81,23 +84,22 @@ public class BCLFeature {
} }
public static BCLFeature makeChunkFeature(ResourceLocation id, Feature<NoneFeatureConfiguration> feature) { public static BCLFeature makeChunkFeature(ResourceLocation id, Feature<NoneFeatureConfiguration> feature) {
ConfiguredFeature<?, ?> configured = feature.configured(FeatureConfiguration.NONE) ConfiguredFeature<?, ?> configured = feature
.decorated(FeatureDecorator.COUNT.configured(new CountConfiguration( .configured(FeatureConfiguration.NONE)
1))); .decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(1)));
return new BCLFeature(id, feature, GenerationStep.Decoration.LOCAL_MODIFICATIONS, configured); return new BCLFeature(id, feature, GenerationStep.Decoration.LOCAL_MODIFICATIONS, configured);
} }
public static BCLFeature makeChansedFeature(ResourceLocation id, Feature<NoneFeatureConfiguration> feature, int chance) { public static BCLFeature makeChansedFeature(ResourceLocation id, Feature<NoneFeatureConfiguration> feature, int chance) {
ConfiguredFeature<?, ?> configured = feature.configured(FeatureConfiguration.NONE) ConfiguredFeature<?, ?> configured = feature
.decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration( .configured(FeatureConfiguration.NONE)
chance))); .decorated(FeatureDecorator.CHANCE.configured(new ChanceDecoratorConfiguration(chance)));
return new BCLFeature(id, feature, GenerationStep.Decoration.SURFACE_STRUCTURES, configured); return new BCLFeature(id, feature, GenerationStep.Decoration.SURFACE_STRUCTURES, configured);
} }
public static BCLFeature makeCountRawFeature(ResourceLocation id, Feature<NoneFeatureConfiguration> feature, int chance) { public static BCLFeature makeCountRawFeature(ResourceLocation id, Feature<NoneFeatureConfiguration> feature, int chance) {
ConfiguredFeature<?, ?> configured = feature.configured(FeatureConfiguration.NONE) ConfiguredFeature<?, ?> configured = feature.configured(FeatureConfiguration.NONE)
.decorated(FeatureDecorator.COUNT.configured(new CountConfiguration( .decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(chance)));
chance)));
return new BCLFeature(id, feature, GenerationStep.Decoration.RAW_GENERATION, configured); return new BCLFeature(id, feature, GenerationStep.Decoration.RAW_GENERATION, configured);
} }

View file

@ -14,7 +14,8 @@
"ServerLevelMixin", "ServerLevelMixin",
"AnvilBlockMixin", "AnvilBlockMixin",
"AnvilMenuMixin", "AnvilMenuMixin",
"TagLoaderMixin" "TagLoaderMixin",
"BiomeMixin"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1