TreeFeatures.java

net.minecraft.data.worldgen.features.TreeFeatures

信息

  • 全限定名:net.minecraft.data.worldgen.features.TreeFeatures
  • 类型:public class
  • 包:net.minecraft.data.worldgen.features
  • 源码路径:src/main/java/net/minecraft/data/worldgen/features/TreeFeatures.java
  • 起始行号:L71
  • 职责:

    TODO

字段/常量

  • CRIMSON_FUNGUS

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L72
    • 说明:

      TODO

  • CRIMSON_FUNGUS_PLANTED

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L73
    • 说明:

      TODO

  • WARPED_FUNGUS

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L74
    • 说明:

      TODO

  • WARPED_FUNGUS_PLANTED

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L75
    • 说明:

      TODO

  • HUGE_BROWN_MUSHROOM

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L76
    • 说明:

      TODO

  • HUGE_RED_MUSHROOM

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L77
    • 说明:

      TODO

  • OAK

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L78
    • 说明:

      TODO

  • DARK_OAK

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L79
    • 说明:

      TODO

  • PALE_OAK

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L80
    • 说明:

      TODO

  • PALE_OAK_BONEMEAL

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L81
    • 说明:

      TODO

  • PALE_OAK_CREAKING

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L82
    • 说明:

      TODO

  • BIRCH

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L83
    • 说明:

      TODO

  • ACACIA

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L84
    • 说明:

      TODO

  • SPRUCE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L85
    • 说明:

      TODO

  • PINE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L86
    • 说明:

      TODO

  • JUNGLE_TREE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L87
    • 说明:

      TODO

  • FANCY_OAK

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L88
    • 说明:

      TODO

  • JUNGLE_TREE_NO_VINE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L89
    • 说明:

      TODO

  • MEGA_JUNGLE_TREE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L90
    • 说明:

      TODO

  • MEGA_SPRUCE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L91
    • 说明:

      TODO

  • MEGA_PINE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L92
    • 说明:

      TODO

  • SUPER_BIRCH_BEES_0002

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L93
    • 说明:

      TODO

  • SUPER_BIRCH_BEES

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L94
    • 说明:

      TODO

  • SWAMP_OAK

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L95
    • 说明:

      TODO

  • JUNGLE_BUSH

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L96
    • 说明:

      TODO

  • AZALEA_TREE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L97
    • 说明:

      TODO

  • MANGROVE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L98
    • 说明:

      TODO

  • TALL_MANGROVE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L99
    • 说明:

      TODO

  • CHERRY

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L100
    • 说明:

      TODO

  • OAK_BEES_0002_LEAF_LITTER

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L101
    • 说明:

      TODO

  • OAK_BEES_002

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L102
    • 说明:

      TODO

  • OAK_BEES_005

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L103
    • 说明:

      TODO

  • BIRCH_BEES_0002

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L104
    • 说明:

      TODO

  • BIRCH_BEES_0002_LEAF_LITTER

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L105
    • 说明:

      TODO

  • BIRCH_BEES_002

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L106
    • 说明:

      TODO

  • BIRCH_BEES_005

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L107
    • 说明:

      TODO

  • FANCY_OAK_BEES_0002_LEAF_LITTER

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L108
    • 说明:

      TODO

  • FANCY_OAK_BEES_002

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L109
    • 说明:

      TODO

  • FANCY_OAK_BEES_005

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L110
    • 说明:

      TODO

  • FANCY_OAK_BEES

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L111
    • 说明:

      TODO

  • CHERRY_BEES_005

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L112
    • 说明:

      TODO

  • OAK_LEAF_LITTER

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L113
    • 说明:

      TODO

  • DARK_OAK_LEAF_LITTER

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L114
    • 说明:

      TODO

  • BIRCH_LEAF_LITTER

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L115
    • 说明:

      TODO

  • FANCY_OAK_LEAF_LITTER

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L116
    • 说明:

      TODO

  • FALLEN_OAK_TREE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L117
    • 说明:

      TODO

  • FALLEN_JUNGLE_TREE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L118
    • 说明:

      TODO

  • FALLEN_SPRUCE_TREE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L119
    • 说明:

      TODO

  • FALLEN_BIRCH_TREE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L120
    • 说明:

      TODO

  • FALLEN_SUPER_BIRCH_TREE

    • 类型: ResourceKey<ConfiguredFeature<?,?>>
    • 修饰符: public static final
    • 源码定位: L121
    • 说明:

      TODO

内部类/嵌套类型

构造器

方法

下面的方法块按源码顺序生成。

private static TreeConfiguration.TreeConfigurationBuilder createStraightBlobTree(Block oakLog, Block oakLeaves, int baseHeight, int heightRandA, int heightRandB, int blobRadius) @ L123

  • 方法名:createStraightBlobTree
  • 源码定位:L123
  • 返回类型:TreeConfiguration.TreeConfigurationBuilder
  • 修饰符:private static

参数:

  • oakLog: Block
  • oakLeaves: Block
  • baseHeight: int
  • heightRandA: int
  • heightRandB: int
  • blobRadius: int

说明:

TODO

private static TreeConfiguration.TreeConfigurationBuilder createOak() @ L135

  • 方法名:createOak
  • 源码定位:L135
  • 返回类型:TreeConfiguration.TreeConfigurationBuilder
  • 修饰符:private static

参数:

说明:

TODO

private static TreeConfiguration.TreeConfigurationBuilder createDarkOak() @ L139

  • 方法名:createDarkOak
  • 源码定位:L139
  • 返回类型:TreeConfiguration.TreeConfigurationBuilder
  • 修饰符:private static

参数:

说明:

TODO

private static FallenTreeConfiguration.FallenTreeConfigurationBuilder createFallenOak() @ L149

  • 方法名:createFallenOak
  • 源码定位:L149
  • 返回类型:FallenTreeConfiguration.FallenTreeConfigurationBuilder
  • 修饰符:private static

参数:

说明:

TODO

private static FallenTreeConfiguration.FallenTreeConfigurationBuilder createFallenBirch(int maxHeight) @ L153

  • 方法名:createFallenBirch
  • 源码定位:L153
  • 返回类型:FallenTreeConfiguration.FallenTreeConfigurationBuilder
  • 修饰符:private static

参数:

  • maxHeight: int

说明:

TODO

private static FallenTreeConfiguration.FallenTreeConfigurationBuilder createFallenJungle() @ L157

  • 方法名:createFallenJungle
  • 源码定位:L157
  • 返回类型:FallenTreeConfiguration.FallenTreeConfigurationBuilder
  • 修饰符:private static

参数:

说明:

TODO

private static FallenTreeConfiguration.FallenTreeConfigurationBuilder createFallenSpruce() @ L161

  • 方法名:createFallenSpruce
  • 源码定位:L161
  • 返回类型:FallenTreeConfiguration.FallenTreeConfigurationBuilder
  • 修饰符:private static

参数:

说明:

TODO

private static FallenTreeConfiguration.FallenTreeConfigurationBuilder createFallenTrees(Block logBlock, int minLength, int maxLength) @ L165

  • 方法名:createFallenTrees
  • 源码定位:L165
  • 返回类型:FallenTreeConfiguration.FallenTreeConfigurationBuilder
  • 修饰符:private static

参数:

  • logBlock: Block
  • minLength: int
  • maxLength: int

说明:

TODO

private static TreeConfiguration.TreeConfigurationBuilder createBirch() @ L182

  • 方法名:createBirch
  • 源码定位:L182
  • 返回类型:TreeConfiguration.TreeConfigurationBuilder
  • 修饰符:private static

参数:

说明:

TODO

private static TreeConfiguration.TreeConfigurationBuilder createSuperBirch() @ L186

  • 方法名:createSuperBirch
  • 源码定位:L186
  • 返回类型:TreeConfiguration.TreeConfigurationBuilder
  • 修饰符:private static

参数:

说明:

TODO

private static TreeConfiguration.TreeConfigurationBuilder createJungleTree() @ L190

  • 方法名:createJungleTree
  • 源码定位:L190
  • 返回类型:TreeConfiguration.TreeConfigurationBuilder
  • 修饰符:private static

参数:

说明:

TODO

private static TreeConfiguration.TreeConfigurationBuilder createFancyOak() @ L194

  • 方法名:createFancyOak
  • 源码定位:L194
  • 返回类型:TreeConfiguration.TreeConfigurationBuilder
  • 修饰符:private static

参数:

说明:

TODO

private static TreeConfiguration.TreeConfigurationBuilder cherry() @ L205

  • 方法名:cherry
  • 源码定位:L205
  • 返回类型:TreeConfiguration.TreeConfigurationBuilder
  • 修饰符:private static

参数:

说明:

TODO

public static void bootstrap(BootstrapContext<ConfiguredFeature<?,?>> context) @ L226

  • 方法名:bootstrap
  • 源码定位:L226
  • 返回类型:void
  • 修饰符:public static

参数:

  • context: BootstrapContext<ConfiguredFeature>

说明:

TODO

代码

public class TreeFeatures {
    public static final ResourceKey<ConfiguredFeature<?, ?>> CRIMSON_FUNGUS = FeatureUtils.createKey("crimson_fungus");
    public static final ResourceKey<ConfiguredFeature<?, ?>> CRIMSON_FUNGUS_PLANTED = FeatureUtils.createKey("crimson_fungus_planted");
    public static final ResourceKey<ConfiguredFeature<?, ?>> WARPED_FUNGUS = FeatureUtils.createKey("warped_fungus");
    public static final ResourceKey<ConfiguredFeature<?, ?>> WARPED_FUNGUS_PLANTED = FeatureUtils.createKey("warped_fungus_planted");
    public static final ResourceKey<ConfiguredFeature<?, ?>> HUGE_BROWN_MUSHROOM = FeatureUtils.createKey("huge_brown_mushroom");
    public static final ResourceKey<ConfiguredFeature<?, ?>> HUGE_RED_MUSHROOM = FeatureUtils.createKey("huge_red_mushroom");
    public static final ResourceKey<ConfiguredFeature<?, ?>> OAK = FeatureUtils.createKey("oak");
    public static final ResourceKey<ConfiguredFeature<?, ?>> DARK_OAK = FeatureUtils.createKey("dark_oak");
    public static final ResourceKey<ConfiguredFeature<?, ?>> PALE_OAK = FeatureUtils.createKey("pale_oak");
    public static final ResourceKey<ConfiguredFeature<?, ?>> PALE_OAK_BONEMEAL = FeatureUtils.createKey("pale_oak_bonemeal");
    public static final ResourceKey<ConfiguredFeature<?, ?>> PALE_OAK_CREAKING = FeatureUtils.createKey("pale_oak_creaking");
    public static final ResourceKey<ConfiguredFeature<?, ?>> BIRCH = FeatureUtils.createKey("birch");
    public static final ResourceKey<ConfiguredFeature<?, ?>> ACACIA = FeatureUtils.createKey("acacia");
    public static final ResourceKey<ConfiguredFeature<?, ?>> SPRUCE = FeatureUtils.createKey("spruce");
    public static final ResourceKey<ConfiguredFeature<?, ?>> PINE = FeatureUtils.createKey("pine");
    public static final ResourceKey<ConfiguredFeature<?, ?>> JUNGLE_TREE = FeatureUtils.createKey("jungle_tree");
    public static final ResourceKey<ConfiguredFeature<?, ?>> FANCY_OAK = FeatureUtils.createKey("fancy_oak");
    public static final ResourceKey<ConfiguredFeature<?, ?>> JUNGLE_TREE_NO_VINE = FeatureUtils.createKey("jungle_tree_no_vine");
    public static final ResourceKey<ConfiguredFeature<?, ?>> MEGA_JUNGLE_TREE = FeatureUtils.createKey("mega_jungle_tree");
    public static final ResourceKey<ConfiguredFeature<?, ?>> MEGA_SPRUCE = FeatureUtils.createKey("mega_spruce");
    public static final ResourceKey<ConfiguredFeature<?, ?>> MEGA_PINE = FeatureUtils.createKey("mega_pine");
    public static final ResourceKey<ConfiguredFeature<?, ?>> SUPER_BIRCH_BEES_0002 = FeatureUtils.createKey("super_birch_bees_0002");
    public static final ResourceKey<ConfiguredFeature<?, ?>> SUPER_BIRCH_BEES = FeatureUtils.createKey("super_birch_bees");
    public static final ResourceKey<ConfiguredFeature<?, ?>> SWAMP_OAK = FeatureUtils.createKey("swamp_oak");
    public static final ResourceKey<ConfiguredFeature<?, ?>> JUNGLE_BUSH = FeatureUtils.createKey("jungle_bush");
    public static final ResourceKey<ConfiguredFeature<?, ?>> AZALEA_TREE = FeatureUtils.createKey("azalea_tree");
    public static final ResourceKey<ConfiguredFeature<?, ?>> MANGROVE = FeatureUtils.createKey("mangrove");
    public static final ResourceKey<ConfiguredFeature<?, ?>> TALL_MANGROVE = FeatureUtils.createKey("tall_mangrove");
    public static final ResourceKey<ConfiguredFeature<?, ?>> CHERRY = FeatureUtils.createKey("cherry");
    public static final ResourceKey<ConfiguredFeature<?, ?>> OAK_BEES_0002_LEAF_LITTER = FeatureUtils.createKey("oak_bees_0002_leaf_litter");
    public static final ResourceKey<ConfiguredFeature<?, ?>> OAK_BEES_002 = FeatureUtils.createKey("oak_bees_002");
    public static final ResourceKey<ConfiguredFeature<?, ?>> OAK_BEES_005 = FeatureUtils.createKey("oak_bees_005");
    public static final ResourceKey<ConfiguredFeature<?, ?>> BIRCH_BEES_0002 = FeatureUtils.createKey("birch_bees_0002");
    public static final ResourceKey<ConfiguredFeature<?, ?>> BIRCH_BEES_0002_LEAF_LITTER = FeatureUtils.createKey("birch_bees_0002_leaf_litter");
    public static final ResourceKey<ConfiguredFeature<?, ?>> BIRCH_BEES_002 = FeatureUtils.createKey("birch_bees_002");
    public static final ResourceKey<ConfiguredFeature<?, ?>> BIRCH_BEES_005 = FeatureUtils.createKey("birch_bees_005");
    public static final ResourceKey<ConfiguredFeature<?, ?>> FANCY_OAK_BEES_0002_LEAF_LITTER = FeatureUtils.createKey("fancy_oak_bees_0002_leaf_litter");
    public static final ResourceKey<ConfiguredFeature<?, ?>> FANCY_OAK_BEES_002 = FeatureUtils.createKey("fancy_oak_bees_002");
    public static final ResourceKey<ConfiguredFeature<?, ?>> FANCY_OAK_BEES_005 = FeatureUtils.createKey("fancy_oak_bees_005");
    public static final ResourceKey<ConfiguredFeature<?, ?>> FANCY_OAK_BEES = FeatureUtils.createKey("fancy_oak_bees");
    public static final ResourceKey<ConfiguredFeature<?, ?>> CHERRY_BEES_005 = FeatureUtils.createKey("cherry_bees_005");
    public static final ResourceKey<ConfiguredFeature<?, ?>> OAK_LEAF_LITTER = FeatureUtils.createKey("oak_leaf_litter");
    public static final ResourceKey<ConfiguredFeature<?, ?>> DARK_OAK_LEAF_LITTER = FeatureUtils.createKey("dark_oak_leaf_litter");
    public static final ResourceKey<ConfiguredFeature<?, ?>> BIRCH_LEAF_LITTER = FeatureUtils.createKey("birch_leaf_litter");
    public static final ResourceKey<ConfiguredFeature<?, ?>> FANCY_OAK_LEAF_LITTER = FeatureUtils.createKey("fancy_oak_leaf_litter");
    public static final ResourceKey<ConfiguredFeature<?, ?>> FALLEN_OAK_TREE = FeatureUtils.createKey("fallen_oak_tree");
    public static final ResourceKey<ConfiguredFeature<?, ?>> FALLEN_JUNGLE_TREE = FeatureUtils.createKey("fallen_jungle_tree");
    public static final ResourceKey<ConfiguredFeature<?, ?>> FALLEN_SPRUCE_TREE = FeatureUtils.createKey("fallen_spruce_tree");
    public static final ResourceKey<ConfiguredFeature<?, ?>> FALLEN_BIRCH_TREE = FeatureUtils.createKey("fallen_birch_tree");
    public static final ResourceKey<ConfiguredFeature<?, ?>> FALLEN_SUPER_BIRCH_TREE = FeatureUtils.createKey("fallen_super_birch_tree");
 
    private static TreeConfiguration.TreeConfigurationBuilder createStraightBlobTree(
        Block oakLog, Block oakLeaves, int baseHeight, int heightRandA, int heightRandB, int blobRadius
    ) {
        return new TreeConfiguration.TreeConfigurationBuilder(
            BlockStateProvider.simple(oakLog),
            new StraightTrunkPlacer(baseHeight, heightRandA, heightRandB),
            BlockStateProvider.simple(oakLeaves),
            new BlobFoliagePlacer(ConstantInt.of(blobRadius), ConstantInt.of(0), 3),
            new TwoLayersFeatureSize(1, 0, 1)
        );
    }
 
    private static TreeConfiguration.TreeConfigurationBuilder createOak() {
        return createStraightBlobTree(Blocks.OAK_LOG, Blocks.OAK_LEAVES, 4, 2, 0, 2).ignoreVines();
    }
 
    private static TreeConfiguration.TreeConfigurationBuilder createDarkOak() {
        return new TreeConfiguration.TreeConfigurationBuilder(
            BlockStateProvider.simple(Blocks.DARK_OAK_LOG),
            new DarkOakTrunkPlacer(6, 2, 1),
            BlockStateProvider.simple(Blocks.DARK_OAK_LEAVES),
            new DarkOakFoliagePlacer(ConstantInt.of(0), ConstantInt.of(0)),
            new ThreeLayersFeatureSize(1, 1, 0, 1, 2, OptionalInt.empty())
        );
    }
 
    private static FallenTreeConfiguration.FallenTreeConfigurationBuilder createFallenOak() {
        return createFallenTrees(Blocks.OAK_LOG, 4, 7).stumpDecorators(ImmutableList.of(TrunkVineDecorator.INSTANCE));
    }
 
    private static FallenTreeConfiguration.FallenTreeConfigurationBuilder createFallenBirch(int maxHeight) {
        return createFallenTrees(Blocks.BIRCH_LOG, 5, maxHeight);
    }
 
    private static FallenTreeConfiguration.FallenTreeConfigurationBuilder createFallenJungle() {
        return createFallenTrees(Blocks.JUNGLE_LOG, 4, 11).stumpDecorators(ImmutableList.of(TrunkVineDecorator.INSTANCE));
    }
 
    private static FallenTreeConfiguration.FallenTreeConfigurationBuilder createFallenSpruce() {
        return createFallenTrees(Blocks.SPRUCE_LOG, 6, 10);
    }
 
    private static FallenTreeConfiguration.FallenTreeConfigurationBuilder createFallenTrees(Block logBlock, int minLength, int maxLength) {
        return new FallenTreeConfiguration.FallenTreeConfigurationBuilder(BlockStateProvider.simple(logBlock), UniformInt.of(minLength, maxLength))
            .logDecorators(
                ImmutableList.of(
                    new AttachedToLogsDecorator(
                        0.1F,
                        new WeightedStateProvider(
                            WeightedList.<BlockState>builder()
                                .add(Blocks.RED_MUSHROOM.defaultBlockState(), 2)
                                .add(Blocks.BROWN_MUSHROOM.defaultBlockState(), 1)
                        ),
                        List.of(Direction.UP)
                    )
                )
            );
    }
 
    private static TreeConfiguration.TreeConfigurationBuilder createBirch() {
        return createStraightBlobTree(Blocks.BIRCH_LOG, Blocks.BIRCH_LEAVES, 5, 2, 0, 2).ignoreVines();
    }
 
    private static TreeConfiguration.TreeConfigurationBuilder createSuperBirch() {
        return createStraightBlobTree(Blocks.BIRCH_LOG, Blocks.BIRCH_LEAVES, 5, 2, 6, 2).ignoreVines();
    }
 
    private static TreeConfiguration.TreeConfigurationBuilder createJungleTree() {
        return createStraightBlobTree(Blocks.JUNGLE_LOG, Blocks.JUNGLE_LEAVES, 4, 8, 0, 2);
    }
 
    private static TreeConfiguration.TreeConfigurationBuilder createFancyOak() {
        return new TreeConfiguration.TreeConfigurationBuilder(
                BlockStateProvider.simple(Blocks.OAK_LOG),
                new FancyTrunkPlacer(3, 11, 0),
                BlockStateProvider.simple(Blocks.OAK_LEAVES),
                new FancyFoliagePlacer(ConstantInt.of(2), ConstantInt.of(4), 4),
                new TwoLayersFeatureSize(0, 0, 0, OptionalInt.of(4))
            )
            .ignoreVines();
    }
 
    private static TreeConfiguration.TreeConfigurationBuilder cherry() {
        return new TreeConfiguration.TreeConfigurationBuilder(
                BlockStateProvider.simple(Blocks.CHERRY_LOG),
                new CherryTrunkPlacer(
                    7,
                    1,
                    0,
                    new WeightedListInt(
                        WeightedList.<IntProvider>builder().add(ConstantInt.of(1), 1).add(ConstantInt.of(2), 1).add(ConstantInt.of(3), 1).build()
                    ),
                    UniformInt.of(2, 4),
                    UniformInt.of(-4, -3),
                    UniformInt.of(-1, 0)
                ),
                BlockStateProvider.simple(Blocks.CHERRY_LEAVES),
                new CherryFoliagePlacer(ConstantInt.of(4), ConstantInt.of(0), ConstantInt.of(5), 0.25F, 0.5F, 0.16666667F, 0.33333334F),
                new TwoLayersFeatureSize(1, 0, 2)
            )
            .ignoreVines();
    }
 
    public static void bootstrap(BootstrapContext<ConfiguredFeature<?, ?>> context) {
        HolderGetter<Block> blocks = context.lookup(Registries.BLOCK);
        BlockPredicate stemReplaceableBlocks = BlockPredicate.matchesBlocks(
            Blocks.OAK_SAPLING,
            Blocks.SPRUCE_SAPLING,
            Blocks.BIRCH_SAPLING,
            Blocks.JUNGLE_SAPLING,
            Blocks.ACACIA_SAPLING,
            Blocks.CHERRY_SAPLING,
            Blocks.DARK_OAK_SAPLING,
            Blocks.PALE_OAK_SAPLING,
            Blocks.MANGROVE_PROPAGULE,
            Blocks.DANDELION,
            Blocks.TORCHFLOWER,
            Blocks.POPPY,
            Blocks.BLUE_ORCHID,
            Blocks.ALLIUM,
            Blocks.AZURE_BLUET,
            Blocks.RED_TULIP,
            Blocks.ORANGE_TULIP,
            Blocks.WHITE_TULIP,
            Blocks.PINK_TULIP,
            Blocks.OXEYE_DAISY,
            Blocks.CORNFLOWER,
            Blocks.WITHER_ROSE,
            Blocks.LILY_OF_THE_VALLEY,
            Blocks.BROWN_MUSHROOM,
            Blocks.RED_MUSHROOM,
            Blocks.WHEAT,
            Blocks.SUGAR_CANE,
            Blocks.ATTACHED_PUMPKIN_STEM,
            Blocks.ATTACHED_MELON_STEM,
            Blocks.PUMPKIN_STEM,
            Blocks.MELON_STEM,
            Blocks.LILY_PAD,
            Blocks.NETHER_WART,
            Blocks.COCOA,
            Blocks.CARROTS,
            Blocks.POTATOES,
            Blocks.CHORUS_PLANT,
            Blocks.CHORUS_FLOWER,
            Blocks.TORCHFLOWER_CROP,
            Blocks.PITCHER_CROP,
            Blocks.BEETROOTS,
            Blocks.SWEET_BERRY_BUSH,
            Blocks.WARPED_FUNGUS,
            Blocks.CRIMSON_FUNGUS,
            Blocks.WEEPING_VINES,
            Blocks.WEEPING_VINES_PLANT,
            Blocks.TWISTING_VINES,
            Blocks.TWISTING_VINES_PLANT,
            Blocks.CAVE_VINES,
            Blocks.CAVE_VINES_PLANT,
            Blocks.SPORE_BLOSSOM,
            Blocks.AZALEA,
            Blocks.FLOWERING_AZALEA,
            Blocks.MOSS_CARPET,
            Blocks.PINK_PETALS,
            Blocks.WILDFLOWERS,
            Blocks.BIG_DRIPLEAF,
            Blocks.BIG_DRIPLEAF_STEM,
            Blocks.SMALL_DRIPLEAF
        );
        FeatureUtils.register(
            context,
            CRIMSON_FUNGUS,
            Feature.HUGE_FUNGUS,
            new HugeFungusConfiguration(
                Blocks.CRIMSON_NYLIUM.defaultBlockState(),
                Blocks.CRIMSON_STEM.defaultBlockState(),
                Blocks.NETHER_WART_BLOCK.defaultBlockState(),
                Blocks.SHROOMLIGHT.defaultBlockState(),
                stemReplaceableBlocks,
                false
            )
        );
        FeatureUtils.register(
            context,
            CRIMSON_FUNGUS_PLANTED,
            Feature.HUGE_FUNGUS,
            new HugeFungusConfiguration(
                Blocks.CRIMSON_NYLIUM.defaultBlockState(),
                Blocks.CRIMSON_STEM.defaultBlockState(),
                Blocks.NETHER_WART_BLOCK.defaultBlockState(),
                Blocks.SHROOMLIGHT.defaultBlockState(),
                stemReplaceableBlocks,
                true
            )
        );
        FeatureUtils.register(
            context,
            WARPED_FUNGUS,
            Feature.HUGE_FUNGUS,
            new HugeFungusConfiguration(
                Blocks.WARPED_NYLIUM.defaultBlockState(),
                Blocks.WARPED_STEM.defaultBlockState(),
                Blocks.WARPED_WART_BLOCK.defaultBlockState(),
                Blocks.SHROOMLIGHT.defaultBlockState(),
                stemReplaceableBlocks,
                false
            )
        );
        FeatureUtils.register(
            context,
            WARPED_FUNGUS_PLANTED,
            Feature.HUGE_FUNGUS,
            new HugeFungusConfiguration(
                Blocks.WARPED_NYLIUM.defaultBlockState(),
                Blocks.WARPED_STEM.defaultBlockState(),
                Blocks.WARPED_WART_BLOCK.defaultBlockState(),
                Blocks.SHROOMLIGHT.defaultBlockState(),
                stemReplaceableBlocks,
                true
            )
        );
        FeatureUtils.register(
            context,
            HUGE_BROWN_MUSHROOM,
            Feature.HUGE_BROWN_MUSHROOM,
            new HugeMushroomFeatureConfiguration(
                BlockStateProvider.simple(
                    Blocks.BROWN_MUSHROOM_BLOCK.defaultBlockState().setValue(HugeMushroomBlock.UP, true).setValue(HugeMushroomBlock.DOWN, false)
                ),
                BlockStateProvider.simple(
                    Blocks.MUSHROOM_STEM.defaultBlockState().setValue(HugeMushroomBlock.UP, false).setValue(HugeMushroomBlock.DOWN, false)
                ),
                3,
                BlockPredicate.matchesTag(BlockTags.HUGE_BROWN_MUSHROOM_CAN_PLACE_ON)
            )
        );
        FeatureUtils.register(
            context,
            HUGE_RED_MUSHROOM,
            Feature.HUGE_RED_MUSHROOM,
            new HugeMushroomFeatureConfiguration(
                BlockStateProvider.simple(Blocks.RED_MUSHROOM_BLOCK.defaultBlockState().setValue(HugeMushroomBlock.DOWN, false)),
                BlockStateProvider.simple(
                    Blocks.MUSHROOM_STEM.defaultBlockState().setValue(HugeMushroomBlock.UP, false).setValue(HugeMushroomBlock.DOWN, false)
                ),
                2,
                BlockPredicate.matchesTag(BlockTags.HUGE_RED_MUSHROOM_CAN_PLACE_ON)
            )
        );
        BeehiveDecorator beehive0002 = new BeehiveDecorator(0.002F);
        BeehiveDecorator beehive001 = new BeehiveDecorator(0.01F);
        BeehiveDecorator beehive002 = new BeehiveDecorator(0.02F);
        BeehiveDecorator beehive005 = new BeehiveDecorator(0.05F);
        BeehiveDecorator beehive = new BeehiveDecorator(1.0F);
        PlaceOnGroundDecorator sparseLeafLitter = new PlaceOnGroundDecorator(
            96, 4, 2, new WeightedStateProvider(VegetationFeatures.leafLitterPatchBuilder(1, 3))
        );
        PlaceOnGroundDecorator thickLeafLitter = new PlaceOnGroundDecorator(
            150, 2, 2, new WeightedStateProvider(VegetationFeatures.leafLitterPatchBuilder(1, 4))
        );
        FeatureUtils.register(context, OAK, Feature.TREE, createOak().build());
        FeatureUtils.register(context, DARK_OAK, Feature.TREE, createDarkOak().ignoreVines().build());
        FeatureUtils.register(
            context,
            PALE_OAK,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.PALE_OAK_LOG),
                    new DarkOakTrunkPlacer(6, 2, 1),
                    BlockStateProvider.simple(Blocks.PALE_OAK_LEAVES),
                    new DarkOakFoliagePlacer(ConstantInt.of(0), ConstantInt.of(0)),
                    new ThreeLayersFeatureSize(1, 1, 0, 1, 2, OptionalInt.empty())
                )
                .decorators(ImmutableList.of(new PaleMossDecorator(0.15F, 0.4F, 0.8F)))
                .ignoreVines()
                .build()
        );
        FeatureUtils.register(
            context,
            PALE_OAK_BONEMEAL,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.PALE_OAK_LOG),
                    new DarkOakTrunkPlacer(6, 2, 1),
                    BlockStateProvider.simple(Blocks.PALE_OAK_LEAVES),
                    new DarkOakFoliagePlacer(ConstantInt.of(0), ConstantInt.of(0)),
                    new ThreeLayersFeatureSize(1, 1, 0, 1, 2, OptionalInt.empty())
                )
                .ignoreVines()
                .build()
        );
        FeatureUtils.register(
            context,
            PALE_OAK_CREAKING,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.PALE_OAK_LOG),
                    new DarkOakTrunkPlacer(6, 2, 1),
                    BlockStateProvider.simple(Blocks.PALE_OAK_LEAVES),
                    new DarkOakFoliagePlacer(ConstantInt.of(0), ConstantInt.of(0)),
                    new ThreeLayersFeatureSize(1, 1, 0, 1, 2, OptionalInt.empty())
                )
                .decorators(ImmutableList.of(new PaleMossDecorator(0.15F, 0.4F, 0.8F), new CreakingHeartDecorator(1.0F)))
                .ignoreVines()
                .build()
        );
        FeatureUtils.register(context, BIRCH, Feature.TREE, createBirch().build());
        FeatureUtils.register(
            context,
            ACACIA,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.ACACIA_LOG),
                    new ForkingTrunkPlacer(5, 2, 2),
                    BlockStateProvider.simple(Blocks.ACACIA_LEAVES),
                    new AcaciaFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0)),
                    new TwoLayersFeatureSize(1, 0, 2)
                )
                .ignoreVines()
                .build()
        );
        FeatureUtils.register(context, CHERRY, Feature.TREE, cherry().build());
        FeatureUtils.register(context, CHERRY_BEES_005, Feature.TREE, cherry().decorators(List.of(beehive005)).build());
        FeatureUtils.register(
            context,
            SPRUCE,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.SPRUCE_LOG),
                    new StraightTrunkPlacer(5, 2, 1),
                    BlockStateProvider.simple(Blocks.SPRUCE_LEAVES),
                    new SpruceFoliagePlacer(UniformInt.of(2, 3), UniformInt.of(0, 2), UniformInt.of(1, 2)),
                    new TwoLayersFeatureSize(2, 0, 2)
                )
                .ignoreVines()
                .build()
        );
        FeatureUtils.register(
            context,
            PINE,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.SPRUCE_LOG),
                    new StraightTrunkPlacer(6, 4, 0),
                    BlockStateProvider.simple(Blocks.SPRUCE_LEAVES),
                    new PineFoliagePlacer(ConstantInt.of(1), ConstantInt.of(1), UniformInt.of(3, 4)),
                    new TwoLayersFeatureSize(2, 0, 2)
                )
                .ignoreVines()
                .build()
        );
        FeatureUtils.register(
            context,
            JUNGLE_TREE,
            Feature.TREE,
            createJungleTree()
                .decorators(ImmutableList.of(new CocoaDecorator(0.2F), TrunkVineDecorator.INSTANCE, new LeaveVineDecorator(0.25F)))
                .ignoreVines()
                .build()
        );
        FeatureUtils.register(context, FANCY_OAK, Feature.TREE, createFancyOak().build());
        FeatureUtils.register(context, JUNGLE_TREE_NO_VINE, Feature.TREE, createJungleTree().ignoreVines().build());
        FeatureUtils.register(
            context,
            MEGA_JUNGLE_TREE,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.JUNGLE_LOG),
                    new MegaJungleTrunkPlacer(10, 2, 19),
                    BlockStateProvider.simple(Blocks.JUNGLE_LEAVES),
                    new MegaJungleFoliagePlacer(ConstantInt.of(2), ConstantInt.of(0), 2),
                    new TwoLayersFeatureSize(1, 1, 2)
                )
                .decorators(ImmutableList.of(TrunkVineDecorator.INSTANCE, new LeaveVineDecorator(0.25F)))
                .build()
        );
        FeatureUtils.register(
            context,
            MEGA_SPRUCE,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.SPRUCE_LOG),
                    new GiantTrunkPlacer(13, 2, 14),
                    BlockStateProvider.simple(Blocks.SPRUCE_LEAVES),
                    new MegaPineFoliagePlacer(ConstantInt.of(0), ConstantInt.of(0), UniformInt.of(13, 17)),
                    new TwoLayersFeatureSize(1, 1, 2)
                )
                .decorators(
                    ImmutableList.of(
                        new AlterGroundDecorator(
                            RuleBasedStateProvider.ifTrueThenProvide(BlockPredicate.matchesTag(BlockTags.BENEATH_TREE_PODZOL_REPLACEABLE), Blocks.PODZOL)
                        )
                    )
                )
                .build()
        );
        FeatureUtils.register(
            context,
            MEGA_PINE,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.SPRUCE_LOG),
                    new GiantTrunkPlacer(13, 2, 14),
                    BlockStateProvider.simple(Blocks.SPRUCE_LEAVES),
                    new MegaPineFoliagePlacer(ConstantInt.of(0), ConstantInt.of(0), UniformInt.of(3, 7)),
                    new TwoLayersFeatureSize(1, 1, 2)
                )
                .decorators(
                    ImmutableList.of(
                        new AlterGroundDecorator(
                            RuleBasedStateProvider.ifTrueThenProvide(BlockPredicate.matchesTag(BlockTags.BENEATH_TREE_PODZOL_REPLACEABLE), Blocks.PODZOL)
                        )
                    )
                )
                .build()
        );
        FeatureUtils.register(context, SUPER_BIRCH_BEES_0002, Feature.TREE, createSuperBirch().decorators(ImmutableList.of(beehive0002)).build());
        FeatureUtils.register(context, SUPER_BIRCH_BEES, Feature.TREE, createSuperBirch().decorators(ImmutableList.of(beehive)).build());
        FeatureUtils.register(
            context,
            SWAMP_OAK,
            Feature.TREE,
            createStraightBlobTree(Blocks.OAK_LOG, Blocks.OAK_LEAVES, 5, 3, 0, 3).decorators(ImmutableList.of(new LeaveVineDecorator(0.25F))).build()
        );
        FeatureUtils.register(
            context,
            JUNGLE_BUSH,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.JUNGLE_LOG),
                    new StraightTrunkPlacer(1, 0, 0),
                    BlockStateProvider.simple(Blocks.OAK_LEAVES),
                    new BushFoliagePlacer(ConstantInt.of(2), ConstantInt.of(1), 2),
                    new TwoLayersFeatureSize(0, 0, 0)
                )
                .build()
        );
        FeatureUtils.register(
            context,
            AZALEA_TREE,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.OAK_LOG),
                    new BendingTrunkPlacer(4, 2, 0, 3, UniformInt.of(1, 2)),
                    new WeightedStateProvider(
                        WeightedList.<BlockState>builder()
                            .add(Blocks.AZALEA_LEAVES.defaultBlockState(), 3)
                            .add(Blocks.FLOWERING_AZALEA_LEAVES.defaultBlockState(), 1)
                    ),
                    new RandomSpreadFoliagePlacer(ConstantInt.of(3), ConstantInt.of(0), ConstantInt.of(2), 50),
                    new TwoLayersFeatureSize(1, 0, 1)
                )
                .belowTrunkProvider(BlockStateProvider.simple(Blocks.ROOTED_DIRT))
                .build()
        );
        FeatureUtils.register(
            context,
            MANGROVE,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.MANGROVE_LOG),
                    new UpwardsBranchingTrunkPlacer(
                        2, 1, 4, UniformInt.of(1, 4), 0.5F, UniformInt.of(0, 1), blocks.getOrThrow(BlockTags.MANGROVE_LOGS_CAN_GROW_THROUGH)
                    ),
                    BlockStateProvider.simple(Blocks.MANGROVE_LEAVES),
                    new RandomSpreadFoliagePlacer(ConstantInt.of(3), ConstantInt.of(0), ConstantInt.of(2), 70),
                    Optional.of(
                        new MangroveRootPlacer(
                            UniformInt.of(1, 3),
                            BlockStateProvider.simple(Blocks.MANGROVE_ROOTS),
                            Optional.of(new AboveRootPlacement(BlockStateProvider.simple(Blocks.MOSS_CARPET), 0.5F)),
                            new MangroveRootPlacement(
                                blocks.getOrThrow(BlockTags.MANGROVE_ROOTS_CAN_GROW_THROUGH),
                                HolderSet.direct(Block::builtInRegistryHolder, Blocks.MUD, Blocks.MUDDY_MANGROVE_ROOTS),
                                BlockStateProvider.simple(Blocks.MUDDY_MANGROVE_ROOTS),
                                8,
                                15,
                                0.2F
                            )
                        )
                    ),
                    new TwoLayersFeatureSize(2, 0, 2),
                    TreeConfiguration.PLACE_BELOW_OVERWORLD_TRUNKS
                )
                .decorators(
                    List.of(
                        new LeaveVineDecorator(0.125F),
                        new AttachedToLeavesDecorator(
                            0.14F,
                            1,
                            0,
                            new RandomizedIntStateProvider(
                                BlockStateProvider.simple(Blocks.MANGROVE_PROPAGULE.defaultBlockState().setValue(MangrovePropaguleBlock.HANGING, true)),
                                MangrovePropaguleBlock.AGE,
                                UniformInt.of(0, 4)
                            ),
                            2,
                            List.of(Direction.DOWN)
                        ),
                        beehive001
                    )
                )
                .ignoreVines()
                .build()
        );
        FeatureUtils.register(
            context,
            TALL_MANGROVE,
            Feature.TREE,
            new TreeConfiguration.TreeConfigurationBuilder(
                    BlockStateProvider.simple(Blocks.MANGROVE_LOG),
                    new UpwardsBranchingTrunkPlacer(
                        4, 1, 9, UniformInt.of(1, 6), 0.5F, UniformInt.of(0, 1), blocks.getOrThrow(BlockTags.MANGROVE_LOGS_CAN_GROW_THROUGH)
                    ),
                    BlockStateProvider.simple(Blocks.MANGROVE_LEAVES),
                    new RandomSpreadFoliagePlacer(ConstantInt.of(3), ConstantInt.of(0), ConstantInt.of(2), 70),
                    Optional.of(
                        new MangroveRootPlacer(
                            UniformInt.of(3, 7),
                            BlockStateProvider.simple(Blocks.MANGROVE_ROOTS),
                            Optional.of(new AboveRootPlacement(BlockStateProvider.simple(Blocks.MOSS_CARPET), 0.5F)),
                            new MangroveRootPlacement(
                                blocks.getOrThrow(BlockTags.MANGROVE_ROOTS_CAN_GROW_THROUGH),
                                HolderSet.direct(Block::builtInRegistryHolder, Blocks.MUD, Blocks.MUDDY_MANGROVE_ROOTS),
                                BlockStateProvider.simple(Blocks.MUDDY_MANGROVE_ROOTS),
                                8,
                                15,
                                0.2F
                            )
                        )
                    ),
                    new TwoLayersFeatureSize(3, 0, 2),
                    TreeConfiguration.PLACE_BELOW_OVERWORLD_TRUNKS
                )
                .decorators(
                    List.of(
                        new LeaveVineDecorator(0.125F),
                        new AttachedToLeavesDecorator(
                            0.14F,
                            1,
                            0,
                            new RandomizedIntStateProvider(
                                BlockStateProvider.simple(Blocks.MANGROVE_PROPAGULE.defaultBlockState().setValue(MangrovePropaguleBlock.HANGING, true)),
                                MangrovePropaguleBlock.AGE,
                                UniformInt.of(0, 4)
                            ),
                            2,
                            List.of(Direction.DOWN)
                        ),
                        beehive001
                    )
                )
                .ignoreVines()
                .build()
        );
        FeatureUtils.register(
            context, OAK_BEES_0002_LEAF_LITTER, Feature.TREE, createOak().decorators(List.of(beehive0002, sparseLeafLitter, thickLeafLitter)).build()
        );
        FeatureUtils.register(context, OAK_BEES_002, Feature.TREE, createOak().decorators(List.of(beehive002)).build());
        FeatureUtils.register(context, OAK_BEES_005, Feature.TREE, createOak().decorators(List.of(beehive005)).build());
        FeatureUtils.register(context, BIRCH_BEES_0002, Feature.TREE, createBirch().decorators(List.of(beehive0002)).build());
        FeatureUtils.register(
            context, BIRCH_BEES_0002_LEAF_LITTER, Feature.TREE, createBirch().decorators(List.of(beehive0002, sparseLeafLitter, thickLeafLitter)).build()
        );
        FeatureUtils.register(context, BIRCH_BEES_002, Feature.TREE, createBirch().decorators(List.of(beehive002)).build());
        FeatureUtils.register(context, BIRCH_BEES_005, Feature.TREE, createBirch().decorators(List.of(beehive005)).build());
        FeatureUtils.register(
            context,
            FANCY_OAK_BEES_0002_LEAF_LITTER,
            Feature.TREE,
            createFancyOak().decorators(List.of(beehive0002, sparseLeafLitter, thickLeafLitter)).build()
        );
        FeatureUtils.register(context, FANCY_OAK_BEES_002, Feature.TREE, createFancyOak().decorators(List.of(beehive002)).build());
        FeatureUtils.register(context, FANCY_OAK_BEES_005, Feature.TREE, createFancyOak().decorators(List.of(beehive005)).build());
        FeatureUtils.register(context, FANCY_OAK_BEES, Feature.TREE, createFancyOak().decorators(List.of(beehive)).build());
        FeatureUtils.register(context, OAK_LEAF_LITTER, Feature.TREE, createOak().decorators(ImmutableList.of(sparseLeafLitter, thickLeafLitter)).build());
        FeatureUtils.register(
            context, DARK_OAK_LEAF_LITTER, Feature.TREE, createDarkOak().ignoreVines().decorators(ImmutableList.of(sparseLeafLitter, thickLeafLitter)).build()
        );
        FeatureUtils.register(context, BIRCH_LEAF_LITTER, Feature.TREE, createBirch().decorators(ImmutableList.of(sparseLeafLitter, thickLeafLitter)).build());
        FeatureUtils.register(context, FANCY_OAK_LEAF_LITTER, Feature.TREE, createFancyOak().decorators(List.of(sparseLeafLitter, thickLeafLitter)).build());
        FeatureUtils.register(context, FALLEN_OAK_TREE, Feature.FALLEN_TREE, createFallenOak().build());
        FeatureUtils.register(context, FALLEN_BIRCH_TREE, Feature.FALLEN_TREE, createFallenBirch(8).build());
        FeatureUtils.register(context, FALLEN_SUPER_BIRCH_TREE, Feature.FALLEN_TREE, createFallenBirch(15).build());
        FeatureUtils.register(context, FALLEN_JUNGLE_TREE, Feature.FALLEN_TREE, createFallenJungle().build());
        FeatureUtils.register(context, FALLEN_SPRUCE_TREE, Feature.FALLEN_TREE, createFallenSpruce().build());
    }
}

引用的其他类