trying fixing flower generation error, but failed

This commit is contained in:
yyc12345 2021-05-06 21:32:30 +08:00
parent b68cb9114b
commit d6c306c78a
3 changed files with 88 additions and 8 deletions

View File

@ -17,6 +17,8 @@ import net.fabricmc.fabric.api.biome.v1.BiomeSelectors;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.block.SweetBerryBushBlock;
import net.minecraft.state.property.Property;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.world.biome.BiomeKeys; import net.minecraft.world.biome.BiomeKeys;
import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.GenerationStep;
@ -31,6 +33,7 @@ import net.minecraft.world.gen.placer.SimpleBlockPlacer;
import net.minecraft.world.gen.stateprovider.BlockStateProvider; import net.minecraft.world.gen.stateprovider.BlockStateProvider;
import net.minecraft.world.gen.stateprovider.SimpleBlockStateProvider; import net.minecraft.world.gen.stateprovider.SimpleBlockStateProvider;
import net.minecraft.world.gen.stateprovider.WeightedBlockStateProvider; import net.minecraft.world.gen.stateprovider.WeightedBlockStateProvider;
import net.yyc12345.teyvatcraft.blocks.TeyvatSweetBerryBushLikePlantBlock;
import net.yyc12345.teyvatcraft.mixin.FlowerForestAccess; import net.yyc12345.teyvatcraft.mixin.FlowerForestAccess;
public class TerrainsManager { public class TerrainsManager {
@ -98,16 +101,16 @@ public class TerrainsManager {
.configure((new RandomPatchFeatureConfig.Builder( .configure((new RandomPatchFeatureConfig.Builder(
(BlockStateProvider)provider, (BlockStateProvider)provider,
(BlockPlacer)SimpleBlockPlacer.INSTANCE)) (BlockPlacer)SimpleBlockPlacer.INSTANCE))
.tries(64) .tries(32)
.build()) .build())
.decorate(Decorators.SPREAD_32_ABOVE) .decorate(Decorators.SPREAD_32_ABOVE)
.decorate(Decorators.SQUARE_HEIGHTMAP) .decorate(Decorators.SQUARE_HEIGHTMAP)
.repeat(2); .repeat(16);
} }
private static ConfiguredFeature<?, ?> generateSweetBerryBushLikePlantFreature(Block[] plantBlks) { private static ConfiguredFeature<?, ?> generateSweetBerryBushLikePlantFreature(Block[] plantBlks) {
WeightedBlockStateProvider provider = new WeightedBlockStateProvider(); WeightedBlockStateProvider provider = new WeightedBlockStateProvider();
for(Block item : plantBlks) { for(Block item : plantBlks) {
provider.addState(item.getDefaultState(), 1); provider.addState(item.getDefaultState().with(SweetBerryBushBlock.AGE, Integer.valueOf(3)), 1);
} }
return Feature.RANDOM_PATCH return Feature.RANDOM_PATCH
@ -115,15 +118,27 @@ public class TerrainsManager {
(BlockStateProvider)provider, (BlockStateProvider)provider,
(BlockPlacer)SimpleBlockPlacer.INSTANCE)) (BlockPlacer)SimpleBlockPlacer.INSTANCE))
.tries(64) .tries(64)
.whitelist((Set<Block>)ImmutableSet.of(Blocks.GRASS_BLOCK)) .whitelist((Set<Block>)ImmutableSet.of(Blocks.GRASS_BLOCK.getDefaultState().getBlock()))
.cannotProject() .cannotProject()
.build()); .build())
.decorate(Decorators.SQUARE_HEIGHTMAP_SPREAD_DOUBLE)
.applyChance(24);
} }
// ================ biome register // ================ biome register
private static Predicate<BiomeSelectionContext> getAllBiomeSelector() { private static Predicate<BiomeSelectionContext> getAllBiomeSelector() {
return BiomeSelectors.foundInOverworld(); return BiomeSelectors.foundInOverworld();
} }
private static Predicate<BiomeSelectionContext> getPlainBiomeSelector() {
return BiomeSelectors.includeByKey(
BiomeKeys.PLAINS,
BiomeKeys.FOREST,
BiomeKeys.BIRCH_FOREST,
BiomeKeys.TALL_BIRCH_FOREST,
BiomeKeys.BIRCH_FOREST_HILLS,
BiomeKeys.TALL_BIRCH_HILLS
);
}
private static Predicate<BiomeSelectionContext> getMountainsBiomeSelector() { private static Predicate<BiomeSelectionContext> getMountainsBiomeSelector() {
return BiomeSelectors.includeByKey( return BiomeSelectors.includeByKey(
BiomeKeys.MOUNTAINS, BiomeKeys.MOUNTAINS,
@ -184,11 +199,11 @@ public class TerrainsManager {
registerOreGeneration("oregen_cor_lapis_ore", OREGEN_COR_LAPIS_ORE, getBadlandsBiomeSelector()); registerOreGeneration("oregen_cor_lapis_ore", OREGEN_COR_LAPIS_ORE, getBadlandsBiomeSelector());
// flower gen // flower gen
registerPlantGeneration("flowergen_normal", FLOWERGEN_NORMAL, getAllBiomeSelector()); registerPlantGeneration("flowergen_normal", FLOWERGEN_NORMAL, getPlainBiomeSelector());
registerPlantGeneration("flowergen_swamp", FLOWERGEN_SWAMP, getSwampBiomeSelector()); registerPlantGeneration("flowergen_swamp", FLOWERGEN_SWAMP, getSwampBiomeSelector());
registerPlantGeneration("flowergen_mountains", FLOWERGEN_MOUNTAINS, getMountainsBiomeSelector()); registerPlantGeneration("flowergen_mountains", FLOWERGEN_MOUNTAINS, getMountainsBiomeSelector());
registerPlantGeneration("sbbgen_normal", SBBGEN_NORMAL, getAllBiomeSelector()); registerPlantGeneration("sbbgen_normal", SBBGEN_NORMAL, getPlainBiomeSelector());
// patch flower forest // patch flower forest
BlockState[] flowerForestArray = FlowerForestAccess.getFlowers(); BlockState[] flowerForestArray = FlowerForestAccess.getFlowers();

View File

@ -0,0 +1,64 @@
package net.yyc12345.teyvatcraft.mixin;
import java.util.List;
import java.util.Random;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import org.spongepowered.asm.mixin.injection.At;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.Blocks;
import net.minecraft.block.GrassBlock;
import net.minecraft.server.world.ServerWorld;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.BlockView;
import net.minecraft.world.WorldView;
import net.minecraft.world.gen.feature.ConfiguredFeature;
import net.minecraft.world.gen.feature.FlowerFeature;
// due to minecraft shit design, the bone meal only can grow grass block's first flowerFeature
// this mixin class is designed to fix this shitty design.
@Mixin(GrassBlock.class)
public class GrassBlockFixer {
@Inject(method = "grow", at = @At("HEAD"))
public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state, CallbackInfo ci) {
BlockPos blockPos = pos.up();
BlockState blockState = Blocks.GRASS.getDefaultState();
int i;
label32: for (i = 0; i < 128; i++) {
BlockState blockState4;
BlockPos blockPos2 = blockPos;
// random walk
for (int j = 0; j < i / 16; ) {
blockPos2 = blockPos2.add(random.nextInt(3) - 1, (random.nextInt(3) - 1) * random.nextInt(3) / 2, random.nextInt(3) - 1);
if (world.getBlockState(blockPos2.down()).isOf(world.getBlockState(pos).getBlock()/* this */)) {
if (world.getBlockState(blockPos2).isFullCube((BlockView)world, blockPos2))
continue label32;
j++;
}
continue label32;
}
// try place flower
if (random.nextInt(8) == 0) {
List<ConfiguredFeature<?, ?>> list = world.getBiome(blockPos2).getGenerationSettings().getFlowerFeatures();
if (list.isEmpty())
continue;
ConfiguredFeature<?, ?> configuredFeature = list.get(random.nextInt(list.size() - 1) + 1);
FlowerFeature flowerFeature = (FlowerFeature)configuredFeature.feature;
blockState4 = flowerFeature.getFlowerState(random, blockPos2, configuredFeature.getConfig());
} else {
blockState4 = blockState;
}
// place flower
if (blockState4.canPlaceAt((WorldView)world, blockPos2))
world.setBlockState(blockPos2, blockState4, 3);
continue;
}
}
}

View File

@ -8,7 +8,8 @@
"client": [ "client": [
"TeyvatCraftMixin", "TeyvatCraftMixin",
"VillagerAccess", "VillagerAccess",
"FlowerForestAccess" "FlowerForestAccess",
"GrassBlockFixer"
], ],
"injectors": { "injectors": {
"defaultRequire": 1 "defaultRequire": 1