package net.minecraft.world.level.levelgen.feature.foliageplacers; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.util.RandomSource; import net.minecraft.util.valueproviders.IntProvider; import net.minecraft.world.level.LevelSimulatedReader; import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration; public class BushFoliagePlacer extends BlobFoliagePlacer { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> blobParts(instance).apply(instance, BushFoliagePlacer::new)); public BushFoliagePlacer(IntProvider intProvider, IntProvider intProvider2, int i) { super(intProvider, intProvider2, i); } @Override protected FoliagePlacerType type() { return FoliagePlacerType.BUSH_FOLIAGE_PLACER; } @Override protected void createFoliage( LevelSimulatedReader level, FoliagePlacer.FoliageSetter blockSetter, RandomSource random, TreeConfiguration config, int maxFreeTreeHeight, FoliagePlacer.FoliageAttachment attachment, int foliageHeight, int foliageRadius, int offset ) { for (int i = offset; i >= offset - foliageHeight; i--) { int j = foliageRadius + attachment.radiusOffset() - 1 - i; this.placeLeavesRow(level, blockSetter, random, config, attachment.pos(), j, i, attachment.doubleTrunk()); } } @Override protected boolean shouldSkipLocation(RandomSource random, int localX, int localY, int localZ, int range, boolean large) { return localX == range && localZ == range && random.nextInt(2) == 0; } }