package net.minecraft.data.worldgen.placement; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList.Builder; import java.util.List; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.core.HolderGetter; import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BootstrapContext; import net.minecraft.data.worldgen.features.TreeFeatures; import net.minecraft.data.worldgen.features.VegetationFeatures; import net.minecraft.resources.ResourceKey; import net.minecraft.util.valueproviders.ClampedInt; import net.minecraft.util.valueproviders.UniformInt; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.levelgen.VerticalAnchor; import net.minecraft.world.level.levelgen.blockpredicates.BlockPredicate; import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.placement.BiomeFilter; import net.minecraft.world.level.levelgen.placement.BlockPredicateFilter; import net.minecraft.world.level.levelgen.placement.CountPlacement; import net.minecraft.world.level.levelgen.placement.HeightRangePlacement; import net.minecraft.world.level.levelgen.placement.InSquarePlacement; import net.minecraft.world.level.levelgen.placement.NoiseBasedCountPlacement; import net.minecraft.world.level.levelgen.placement.NoiseThresholdCountPlacement; import net.minecraft.world.level.levelgen.placement.PlacedFeature; import net.minecraft.world.level.levelgen.placement.PlacementModifier; import net.minecraft.world.level.levelgen.placement.RarityFilter; import net.minecraft.world.level.levelgen.placement.SurfaceWaterDepthFilter; import org.jetbrains.annotations.Nullable; public class VegetationPlacements { public static final ResourceKey BAMBOO_LIGHT = PlacementUtils.createKey("bamboo_light"); public static final ResourceKey BAMBOO = PlacementUtils.createKey("bamboo"); public static final ResourceKey VINES = PlacementUtils.createKey("vines"); public static final ResourceKey PATCH_SUNFLOWER = PlacementUtils.createKey("patch_sunflower"); public static final ResourceKey PATCH_PUMPKIN = PlacementUtils.createKey("patch_pumpkin"); public static final ResourceKey PATCH_GRASS_PLAIN = PlacementUtils.createKey("patch_grass_plain"); public static final ResourceKey PATCH_GRASS_FOREST = PlacementUtils.createKey("patch_grass_forest"); public static final ResourceKey PATCH_GRASS_BADLANDS = PlacementUtils.createKey("patch_grass_badlands"); public static final ResourceKey PATCH_GRASS_SAVANNA = PlacementUtils.createKey("patch_grass_savanna"); public static final ResourceKey PATCH_GRASS_NORMAL = PlacementUtils.createKey("patch_grass_normal"); public static final ResourceKey PATCH_GRASS_TAIGA_2 = PlacementUtils.createKey("patch_grass_taiga_2"); public static final ResourceKey PATCH_GRASS_TAIGA = PlacementUtils.createKey("patch_grass_taiga"); public static final ResourceKey PATCH_GRASS_JUNGLE = PlacementUtils.createKey("patch_grass_jungle"); public static final ResourceKey GRASS_BONEMEAL = PlacementUtils.createKey("grass_bonemeal"); public static final ResourceKey PATCH_DEAD_BUSH_2 = PlacementUtils.createKey("patch_dead_bush_2"); public static final ResourceKey PATCH_DEAD_BUSH = PlacementUtils.createKey("patch_dead_bush"); public static final ResourceKey PATCH_DEAD_BUSH_BADLANDS = PlacementUtils.createKey("patch_dead_bush_badlands"); public static final ResourceKey PATCH_MELON = PlacementUtils.createKey("patch_melon"); public static final ResourceKey PATCH_MELON_SPARSE = PlacementUtils.createKey("patch_melon_sparse"); public static final ResourceKey PATCH_BERRY_COMMON = PlacementUtils.createKey("patch_berry_common"); public static final ResourceKey PATCH_BERRY_RARE = PlacementUtils.createKey("patch_berry_rare"); public static final ResourceKey PATCH_WATERLILY = PlacementUtils.createKey("patch_waterlily"); public static final ResourceKey PATCH_TALL_GRASS_2 = PlacementUtils.createKey("patch_tall_grass_2"); public static final ResourceKey PATCH_TALL_GRASS = PlacementUtils.createKey("patch_tall_grass"); public static final ResourceKey PATCH_LARGE_FERN = PlacementUtils.createKey("patch_large_fern"); public static final ResourceKey PATCH_CACTUS_DESERT = PlacementUtils.createKey("patch_cactus_desert"); public static final ResourceKey PATCH_CACTUS_DECORATED = PlacementUtils.createKey("patch_cactus_decorated"); public static final ResourceKey PATCH_SUGAR_CANE_SWAMP = PlacementUtils.createKey("patch_sugar_cane_swamp"); public static final ResourceKey PATCH_SUGAR_CANE_DESERT = PlacementUtils.createKey("patch_sugar_cane_desert"); public static final ResourceKey PATCH_SUGAR_CANE_BADLANDS = PlacementUtils.createKey("patch_sugar_cane_badlands"); public static final ResourceKey PATCH_SUGAR_CANE = PlacementUtils.createKey("patch_sugar_cane"); public static final ResourceKey BROWN_MUSHROOM_NETHER = PlacementUtils.createKey("brown_mushroom_nether"); public static final ResourceKey RED_MUSHROOM_NETHER = PlacementUtils.createKey("red_mushroom_nether"); public static final ResourceKey BROWN_MUSHROOM_NORMAL = PlacementUtils.createKey("brown_mushroom_normal"); public static final ResourceKey RED_MUSHROOM_NORMAL = PlacementUtils.createKey("red_mushroom_normal"); public static final ResourceKey BROWN_MUSHROOM_TAIGA = PlacementUtils.createKey("brown_mushroom_taiga"); public static final ResourceKey RED_MUSHROOM_TAIGA = PlacementUtils.createKey("red_mushroom_taiga"); public static final ResourceKey BROWN_MUSHROOM_OLD_GROWTH = PlacementUtils.createKey("brown_mushroom_old_growth"); public static final ResourceKey RED_MUSHROOM_OLD_GROWTH = PlacementUtils.createKey("red_mushroom_old_growth"); public static final ResourceKey BROWN_MUSHROOM_SWAMP = PlacementUtils.createKey("brown_mushroom_swamp"); public static final ResourceKey RED_MUSHROOM_SWAMP = PlacementUtils.createKey("red_mushroom_swamp"); public static final ResourceKey FLOWER_WARM = PlacementUtils.createKey("flower_warm"); public static final ResourceKey FLOWER_DEFAULT = PlacementUtils.createKey("flower_default"); public static final ResourceKey FLOWER_FLOWER_FOREST = PlacementUtils.createKey("flower_flower_forest"); public static final ResourceKey FLOWER_SWAMP = PlacementUtils.createKey("flower_swamp"); public static final ResourceKey FLOWER_PLAINS = PlacementUtils.createKey("flower_plains"); public static final ResourceKey FLOWER_MEADOW = PlacementUtils.createKey("flower_meadow"); public static final ResourceKey FLOWER_CHERRY = PlacementUtils.createKey("flower_cherry"); public static final ResourceKey TREES_PLAINS = PlacementUtils.createKey("trees_plains"); public static final ResourceKey DARK_FOREST_VEGETATION = PlacementUtils.createKey("dark_forest_vegetation"); public static final ResourceKey PALE_GARDEN_VEGETATION = PlacementUtils.createKey("pale_garden_vegetation"); public static final ResourceKey FLOWER_FOREST_FLOWERS = PlacementUtils.createKey("flower_forest_flowers"); public static final ResourceKey FOREST_FLOWERS = PlacementUtils.createKey("forest_flowers"); public static final ResourceKey TREES_FLOWER_FOREST = PlacementUtils.createKey("trees_flower_forest"); public static final ResourceKey TREES_MEADOW = PlacementUtils.createKey("trees_meadow"); public static final ResourceKey TREES_CHERRY = PlacementUtils.createKey("trees_cherry"); public static final ResourceKey TREES_TAIGA = PlacementUtils.createKey("trees_taiga"); public static final ResourceKey TREES_GROVE = PlacementUtils.createKey("trees_grove"); public static final ResourceKey TREES_BADLANDS = PlacementUtils.createKey("trees_badlands"); public static final ResourceKey TREES_SNOWY = PlacementUtils.createKey("trees_snowy"); public static final ResourceKey TREES_SWAMP = PlacementUtils.createKey("trees_swamp"); public static final ResourceKey TREES_WINDSWEPT_SAVANNA = PlacementUtils.createKey("trees_windswept_savanna"); public static final ResourceKey TREES_SAVANNA = PlacementUtils.createKey("trees_savanna"); public static final ResourceKey BIRCH_TALL = PlacementUtils.createKey("birch_tall"); public static final ResourceKey TREES_BIRCH = PlacementUtils.createKey("trees_birch"); public static final ResourceKey TREES_WINDSWEPT_FOREST = PlacementUtils.createKey("trees_windswept_forest"); public static final ResourceKey TREES_WINDSWEPT_HILLS = PlacementUtils.createKey("trees_windswept_hills"); public static final ResourceKey TREES_WATER = PlacementUtils.createKey("trees_water"); public static final ResourceKey TREES_BIRCH_AND_OAK = PlacementUtils.createKey("trees_birch_and_oak"); public static final ResourceKey TREES_SPARSE_JUNGLE = PlacementUtils.createKey("trees_sparse_jungle"); public static final ResourceKey TREES_OLD_GROWTH_SPRUCE_TAIGA = PlacementUtils.createKey("trees_old_growth_spruce_taiga"); public static final ResourceKey TREES_OLD_GROWTH_PINE_TAIGA = PlacementUtils.createKey("trees_old_growth_pine_taiga"); public static final ResourceKey TREES_JUNGLE = PlacementUtils.createKey("trees_jungle"); public static final ResourceKey BAMBOO_VEGETATION = PlacementUtils.createKey("bamboo_vegetation"); public static final ResourceKey MUSHROOM_ISLAND_VEGETATION = PlacementUtils.createKey("mushroom_island_vegetation"); public static final ResourceKey TREES_MANGROVE = PlacementUtils.createKey("trees_mangrove"); private static final PlacementModifier TREE_THRESHOLD = SurfaceWaterDepthFilter.forMaxDepth(0); public static List worldSurfaceSquaredWithCount(int count) { return List.of(CountPlacement.of(count), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()); } private static List getMushroomPlacement(int rarity, @Nullable PlacementModifier placement) { Builder builder = ImmutableList.builder(); if (placement != null) { builder.add(placement); } if (rarity != 0) { builder.add(RarityFilter.onAverageOnceEvery(rarity)); } builder.add(InSquarePlacement.spread()); builder.add(PlacementUtils.HEIGHTMAP); builder.add(BiomeFilter.biome()); return builder.build(); } private static Builder treePlacementBase(PlacementModifier placement) { return ImmutableList.builder() .add(placement) .add(InSquarePlacement.spread()) .add(TREE_THRESHOLD) .add(PlacementUtils.HEIGHTMAP_OCEAN_FLOOR) .add(BiomeFilter.biome()); } public static List treePlacement(PlacementModifier placement) { return treePlacementBase(placement).build(); } public static List treePlacement(PlacementModifier placement, Block saplingBlock) { return treePlacementBase(placement) .add(BlockPredicateFilter.forPredicate(BlockPredicate.wouldSurvive(saplingBlock.defaultBlockState(), BlockPos.ZERO))) .build(); } public static void bootstrap(BootstrapContext context) { HolderGetter> holderGetter = context.lookup(Registries.CONFIGURED_FEATURE); Holder> holder = holderGetter.getOrThrow(VegetationFeatures.BAMBOO_NO_PODZOL); Holder> holder2 = holderGetter.getOrThrow(VegetationFeatures.BAMBOO_SOME_PODZOL); Holder> holder3 = holderGetter.getOrThrow(VegetationFeatures.VINES); Holder> holder4 = holderGetter.getOrThrow(VegetationFeatures.PATCH_SUNFLOWER); Holder> holder5 = holderGetter.getOrThrow(VegetationFeatures.PATCH_PUMPKIN); Holder> holder6 = holderGetter.getOrThrow(VegetationFeatures.PATCH_GRASS); Holder> holder7 = holderGetter.getOrThrow(VegetationFeatures.PATCH_TAIGA_GRASS); Holder> holder8 = holderGetter.getOrThrow(VegetationFeatures.PATCH_GRASS_JUNGLE); Holder> holder9 = holderGetter.getOrThrow(VegetationFeatures.SINGLE_PIECE_OF_GRASS); Holder> holder10 = holderGetter.getOrThrow(VegetationFeatures.PATCH_DEAD_BUSH); Holder> holder11 = holderGetter.getOrThrow(VegetationFeatures.PATCH_MELON); Holder> holder12 = holderGetter.getOrThrow(VegetationFeatures.PATCH_BERRY_BUSH); Holder> holder13 = holderGetter.getOrThrow(VegetationFeatures.PATCH_WATERLILY); Holder> holder14 = holderGetter.getOrThrow(VegetationFeatures.PATCH_TALL_GRASS); Holder> holder15 = holderGetter.getOrThrow(VegetationFeatures.PATCH_LARGE_FERN); Holder> holder16 = holderGetter.getOrThrow(VegetationFeatures.PATCH_CACTUS); Holder> holder17 = holderGetter.getOrThrow(VegetationFeatures.PATCH_SUGAR_CANE); Holder> holder18 = holderGetter.getOrThrow(VegetationFeatures.PATCH_BROWN_MUSHROOM); Holder> holder19 = holderGetter.getOrThrow(VegetationFeatures.PATCH_RED_MUSHROOM); Holder> holder20 = holderGetter.getOrThrow(VegetationFeatures.FLOWER_DEFAULT); Holder> holder21 = holderGetter.getOrThrow(VegetationFeatures.FLOWER_FLOWER_FOREST); Holder> holder22 = holderGetter.getOrThrow(VegetationFeatures.FLOWER_SWAMP); Holder> holder23 = holderGetter.getOrThrow(VegetationFeatures.FLOWER_PLAIN); Holder> holder24 = holderGetter.getOrThrow(VegetationFeatures.FLOWER_MEADOW); Holder> holder25 = holderGetter.getOrThrow(VegetationFeatures.FLOWER_CHERRY); Holder> holder26 = holderGetter.getOrThrow(VegetationFeatures.TREES_PLAINS); Holder> holder27 = holderGetter.getOrThrow(VegetationFeatures.DARK_FOREST_VEGETATION); Holder> holder28 = holderGetter.getOrThrow(VegetationFeatures.PALE_GARDEN_VEGETATION); Holder> holder29 = holderGetter.getOrThrow(VegetationFeatures.FOREST_FLOWERS); Holder> holder30 = holderGetter.getOrThrow(VegetationFeatures.TREES_FLOWER_FOREST); Holder> holder31 = holderGetter.getOrThrow(VegetationFeatures.MEADOW_TREES); Holder> holder32 = holderGetter.getOrThrow(VegetationFeatures.TREES_TAIGA); Holder> holder33 = holderGetter.getOrThrow(VegetationFeatures.TREES_GROVE); Holder> holder34 = holderGetter.getOrThrow(TreeFeatures.OAK); Holder> holder35 = holderGetter.getOrThrow(TreeFeatures.SPRUCE); Holder> holder36 = holderGetter.getOrThrow(TreeFeatures.CHERRY_BEES_005); Holder> holder37 = holderGetter.getOrThrow(TreeFeatures.SWAMP_OAK); Holder> holder38 = holderGetter.getOrThrow(VegetationFeatures.TREES_SAVANNA); Holder> holder39 = holderGetter.getOrThrow(VegetationFeatures.BIRCH_TALL); Holder> holder40 = holderGetter.getOrThrow(TreeFeatures.BIRCH_BEES_0002); Holder> holder41 = holderGetter.getOrThrow(VegetationFeatures.TREES_WINDSWEPT_HILLS); Holder> holder42 = holderGetter.getOrThrow(VegetationFeatures.TREES_WATER); Holder> holder43 = holderGetter.getOrThrow(VegetationFeatures.TREES_BIRCH_AND_OAK); Holder> holder44 = holderGetter.getOrThrow(VegetationFeatures.TREES_SPARSE_JUNGLE); Holder> holder45 = holderGetter.getOrThrow(VegetationFeatures.TREES_OLD_GROWTH_SPRUCE_TAIGA); Holder> holder46 = holderGetter.getOrThrow(VegetationFeatures.TREES_OLD_GROWTH_PINE_TAIGA); Holder> holder47 = holderGetter.getOrThrow(VegetationFeatures.TREES_JUNGLE); Holder> holder48 = holderGetter.getOrThrow(VegetationFeatures.BAMBOO_VEGETATION); Holder> holder49 = holderGetter.getOrThrow(VegetationFeatures.MUSHROOM_ISLAND_VEGETATION); Holder> holder50 = holderGetter.getOrThrow(VegetationFeatures.MANGROVE_VEGETATION); PlacementUtils.register( context, BAMBOO_LIGHT, holder, RarityFilter.onAverageOnceEvery(4), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, BAMBOO, holder2, NoiseBasedCountPlacement.of(160, 80.0, 0.3), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome() ); PlacementUtils.register( context, VINES, holder3, CountPlacement.of(127), InSquarePlacement.spread(), HeightRangePlacement.uniform(VerticalAnchor.absolute(64), VerticalAnchor.absolute(100)), BiomeFilter.biome() ); PlacementUtils.register( context, PATCH_SUNFLOWER, holder4, RarityFilter.onAverageOnceEvery(3), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, PATCH_PUMPKIN, holder5, RarityFilter.onAverageOnceEvery(300), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, PATCH_GRASS_PLAIN, holder6, NoiseThresholdCountPlacement.of(-0.8, 5, 10), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome() ); PlacementUtils.register(context, PATCH_GRASS_FOREST, holder6, worldSurfaceSquaredWithCount(2)); PlacementUtils.register(context, PATCH_GRASS_BADLANDS, holder6, InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()); PlacementUtils.register(context, PATCH_GRASS_SAVANNA, holder6, worldSurfaceSquaredWithCount(20)); PlacementUtils.register(context, PATCH_GRASS_NORMAL, holder6, worldSurfaceSquaredWithCount(5)); PlacementUtils.register(context, PATCH_GRASS_TAIGA_2, holder7, InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()); PlacementUtils.register(context, PATCH_GRASS_TAIGA, holder7, worldSurfaceSquaredWithCount(7)); PlacementUtils.register(context, PATCH_GRASS_JUNGLE, holder8, worldSurfaceSquaredWithCount(25)); PlacementUtils.register(context, GRASS_BONEMEAL, holder9, PlacementUtils.isEmpty()); PlacementUtils.register(context, PATCH_DEAD_BUSH_2, holder10, worldSurfaceSquaredWithCount(2)); PlacementUtils.register(context, PATCH_DEAD_BUSH, holder10, InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome()); PlacementUtils.register(context, PATCH_DEAD_BUSH_BADLANDS, holder10, worldSurfaceSquaredWithCount(20)); PlacementUtils.register( context, PATCH_MELON, holder11, RarityFilter.onAverageOnceEvery(6), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, PATCH_MELON_SPARSE, holder11, RarityFilter.onAverageOnceEvery(64), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, PATCH_BERRY_COMMON, holder12, RarityFilter.onAverageOnceEvery(32), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome() ); PlacementUtils.register( context, PATCH_BERRY_RARE, holder12, RarityFilter.onAverageOnceEvery(384), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP_WORLD_SURFACE, BiomeFilter.biome() ); PlacementUtils.register(context, PATCH_WATERLILY, holder13, worldSurfaceSquaredWithCount(4)); PlacementUtils.register( context, PATCH_TALL_GRASS_2, holder14, NoiseThresholdCountPlacement.of(-0.8, 0, 7), RarityFilter.onAverageOnceEvery(32), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, PATCH_TALL_GRASS, holder14, RarityFilter.onAverageOnceEvery(5), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, PATCH_LARGE_FERN, holder15, RarityFilter.onAverageOnceEvery(5), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, PATCH_CACTUS_DESERT, holder16, RarityFilter.onAverageOnceEvery(6), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, PATCH_CACTUS_DECORATED, holder16, RarityFilter.onAverageOnceEvery(13), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, PATCH_SUGAR_CANE_SWAMP, holder17, RarityFilter.onAverageOnceEvery(3), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register(context, PATCH_SUGAR_CANE_DESERT, holder17, InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome()); PlacementUtils.register( context, PATCH_SUGAR_CANE_BADLANDS, holder17, RarityFilter.onAverageOnceEvery(5), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, PATCH_SUGAR_CANE, holder17, RarityFilter.onAverageOnceEvery(6), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, BROWN_MUSHROOM_NETHER, holder18, RarityFilter.onAverageOnceEvery(2), InSquarePlacement.spread(), PlacementUtils.FULL_RANGE, BiomeFilter.biome() ); PlacementUtils.register( context, RED_MUSHROOM_NETHER, holder19, RarityFilter.onAverageOnceEvery(2), InSquarePlacement.spread(), PlacementUtils.FULL_RANGE, BiomeFilter.biome() ); PlacementUtils.register(context, BROWN_MUSHROOM_NORMAL, holder18, getMushroomPlacement(256, null)); PlacementUtils.register(context, RED_MUSHROOM_NORMAL, holder19, getMushroomPlacement(512, null)); PlacementUtils.register(context, BROWN_MUSHROOM_TAIGA, holder18, getMushroomPlacement(4, null)); PlacementUtils.register(context, RED_MUSHROOM_TAIGA, holder19, getMushroomPlacement(256, null)); PlacementUtils.register(context, BROWN_MUSHROOM_OLD_GROWTH, holder18, getMushroomPlacement(4, CountPlacement.of(3))); PlacementUtils.register(context, RED_MUSHROOM_OLD_GROWTH, holder19, getMushroomPlacement(171, null)); PlacementUtils.register(context, BROWN_MUSHROOM_SWAMP, holder18, getMushroomPlacement(0, CountPlacement.of(2))); PlacementUtils.register(context, RED_MUSHROOM_SWAMP, holder19, getMushroomPlacement(64, null)); PlacementUtils.register( context, FLOWER_WARM, holder20, RarityFilter.onAverageOnceEvery(16), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, FLOWER_DEFAULT, holder20, RarityFilter.onAverageOnceEvery(32), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, FLOWER_FLOWER_FOREST, holder21, CountPlacement.of(3), RarityFilter.onAverageOnceEvery(2), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, FLOWER_SWAMP, holder22, RarityFilter.onAverageOnceEvery(32), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, FLOWER_PLAINS, holder23, NoiseThresholdCountPlacement.of(-0.8, 15, 4), RarityFilter.onAverageOnceEvery(32), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register( context, FLOWER_CHERRY, holder25, NoiseThresholdCountPlacement.of(-0.8, 5, 10), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome() ); PlacementUtils.register(context, FLOWER_MEADOW, holder24, InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome()); PlacementModifier placementModifier = SurfaceWaterDepthFilter.forMaxDepth(0); PlacementUtils.register( context, TREES_PLAINS, holder26, PlacementUtils.countExtra(0, 0.05F, 1), InSquarePlacement.spread(), placementModifier, PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, BlockPredicateFilter.forPredicate(BlockPredicate.wouldSurvive(Blocks.OAK_SAPLING.defaultBlockState(), BlockPos.ZERO)), BiomeFilter.biome() ); PlacementUtils.register( context, DARK_FOREST_VEGETATION, holder27, CountPlacement.of(16), InSquarePlacement.spread(), placementModifier, PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, BiomeFilter.biome() ); PlacementUtils.register( context, PALE_GARDEN_VEGETATION, holder28, CountPlacement.of(16), InSquarePlacement.spread(), placementModifier, PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, BiomeFilter.biome() ); PlacementUtils.register( context, FLOWER_FOREST_FLOWERS, holder29, RarityFilter.onAverageOnceEvery(7), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, CountPlacement.of(ClampedInt.of(UniformInt.of(-1, 3), 0, 3)), BiomeFilter.biome() ); PlacementUtils.register( context, FOREST_FLOWERS, holder29, RarityFilter.onAverageOnceEvery(7), InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, CountPlacement.of(ClampedInt.of(UniformInt.of(-3, 1), 0, 1)), BiomeFilter.biome() ); PlacementUtils.register(context, TREES_FLOWER_FOREST, holder30, treePlacement(PlacementUtils.countExtra(6, 0.1F, 1))); PlacementUtils.register(context, TREES_MEADOW, holder31, treePlacement(RarityFilter.onAverageOnceEvery(100))); PlacementUtils.register(context, TREES_CHERRY, holder36, treePlacement(PlacementUtils.countExtra(10, 0.1F, 1), Blocks.CHERRY_SAPLING)); PlacementUtils.register(context, TREES_TAIGA, holder32, treePlacement(PlacementUtils.countExtra(10, 0.1F, 1))); PlacementUtils.register(context, TREES_GROVE, holder33, treePlacement(PlacementUtils.countExtra(10, 0.1F, 1))); PlacementUtils.register(context, TREES_BADLANDS, holder34, treePlacement(PlacementUtils.countExtra(5, 0.1F, 1), Blocks.OAK_SAPLING)); PlacementUtils.register(context, TREES_SNOWY, holder35, treePlacement(PlacementUtils.countExtra(0, 0.1F, 1), Blocks.SPRUCE_SAPLING)); PlacementUtils.register( context, TREES_SWAMP, holder37, PlacementUtils.countExtra(2, 0.1F, 1), InSquarePlacement.spread(), SurfaceWaterDepthFilter.forMaxDepth(2), PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, BiomeFilter.biome(), BlockPredicateFilter.forPredicate(BlockPredicate.wouldSurvive(Blocks.OAK_SAPLING.defaultBlockState(), BlockPos.ZERO)) ); PlacementUtils.register(context, TREES_WINDSWEPT_SAVANNA, holder38, treePlacement(PlacementUtils.countExtra(2, 0.1F, 1))); PlacementUtils.register(context, TREES_SAVANNA, holder38, treePlacement(PlacementUtils.countExtra(1, 0.1F, 1))); PlacementUtils.register(context, BIRCH_TALL, holder39, treePlacement(PlacementUtils.countExtra(10, 0.1F, 1))); PlacementUtils.register(context, TREES_BIRCH, holder40, treePlacement(PlacementUtils.countExtra(10, 0.1F, 1), Blocks.BIRCH_SAPLING)); PlacementUtils.register(context, TREES_WINDSWEPT_FOREST, holder41, treePlacement(PlacementUtils.countExtra(3, 0.1F, 1))); PlacementUtils.register(context, TREES_WINDSWEPT_HILLS, holder41, treePlacement(PlacementUtils.countExtra(0, 0.1F, 1))); PlacementUtils.register(context, TREES_WATER, holder42, treePlacement(PlacementUtils.countExtra(0, 0.1F, 1))); PlacementUtils.register(context, TREES_BIRCH_AND_OAK, holder43, treePlacement(PlacementUtils.countExtra(10, 0.1F, 1))); PlacementUtils.register(context, TREES_SPARSE_JUNGLE, holder44, treePlacement(PlacementUtils.countExtra(2, 0.1F, 1))); PlacementUtils.register(context, TREES_OLD_GROWTH_SPRUCE_TAIGA, holder45, treePlacement(PlacementUtils.countExtra(10, 0.1F, 1))); PlacementUtils.register(context, TREES_OLD_GROWTH_PINE_TAIGA, holder46, treePlacement(PlacementUtils.countExtra(10, 0.1F, 1))); PlacementUtils.register(context, TREES_JUNGLE, holder47, treePlacement(PlacementUtils.countExtra(50, 0.1F, 1))); PlacementUtils.register(context, BAMBOO_VEGETATION, holder48, treePlacement(PlacementUtils.countExtra(30, 0.1F, 1))); PlacementUtils.register(context, MUSHROOM_ISLAND_VEGETATION, holder49, InSquarePlacement.spread(), PlacementUtils.HEIGHTMAP, BiomeFilter.biome()); PlacementUtils.register( context, TREES_MANGROVE, holder50, CountPlacement.of(25), InSquarePlacement.spread(), SurfaceWaterDepthFilter.forMaxDepth(5), PlacementUtils.HEIGHTMAP_OCEAN_FLOOR, BiomeFilter.biome(), BlockPredicateFilter.forPredicate(BlockPredicate.wouldSurvive(Blocks.MANGROVE_PROPAGULE.defaultBlockState(), BlockPos.ZERO)) ); } }