Code/net/minecraft/world/level/levelgen/feature/trunkplacers/DarkOakTrunkPlacer.java

92 lines
3.8 KiB
Java

package net.minecraft.world.level.levelgen.feature.trunkplacers;
import com.google.common.collect.Lists;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.mojang.serialization.codecs.RecordCodecBuilder.Instance;
import java.util.List;
import java.util.function.BiConsumer;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.LevelSimulatedReader;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.TreeFeature;
import net.minecraft.world.level.levelgen.feature.configurations.TreeConfiguration;
import net.minecraft.world.level.levelgen.feature.foliageplacers.FoliagePlacer;
public class DarkOakTrunkPlacer extends TrunkPlacer {
public static final MapCodec<DarkOakTrunkPlacer> CODEC = RecordCodecBuilder.mapCodec(
p_70090_ -> trunkPlacerParts(p_70090_).apply(p_70090_, DarkOakTrunkPlacer::new)
);
public DarkOakTrunkPlacer(int p_70077_, int p_70078_, int p_70079_) {
super(p_70077_, p_70078_, p_70079_);
}
@Override
protected TrunkPlacerType<?> type() {
return TrunkPlacerType.DARK_OAK_TRUNK_PLACER;
}
@Override
public List<FoliagePlacer.FoliageAttachment> placeTrunk(
LevelSimulatedReader p_226086_,
BiConsumer<BlockPos, BlockState> p_226087_,
RandomSource p_226088_,
int p_226089_,
BlockPos p_226090_,
TreeConfiguration p_226091_
) {
List<FoliagePlacer.FoliageAttachment> list = Lists.newArrayList();
BlockPos blockpos = p_226090_.below();
setDirtAt(p_226086_, p_226087_, p_226088_, blockpos, p_226091_);
setDirtAt(p_226086_, p_226087_, p_226088_, blockpos.east(), p_226091_);
setDirtAt(p_226086_, p_226087_, p_226088_, blockpos.south(), p_226091_);
setDirtAt(p_226086_, p_226087_, p_226088_, blockpos.south().east(), p_226091_);
Direction direction = Direction.Plane.HORIZONTAL.getRandomDirection(p_226088_);
int i = p_226089_ - p_226088_.nextInt(4);
int j = 2 - p_226088_.nextInt(3);
int k = p_226090_.getX();
int l = p_226090_.getY();
int i1 = p_226090_.getZ();
int j1 = k;
int k1 = i1;
int l1 = l + p_226089_ - 1;
for (int i2 = 0; i2 < p_226089_; i2++) {
if (i2 >= i && j > 0) {
j1 += direction.getStepX();
k1 += direction.getStepZ();
j--;
}
int j2 = l + i2;
BlockPos blockpos1 = new BlockPos(j1, j2, k1);
if (TreeFeature.isAirOrLeaves(p_226086_, blockpos1)) {
this.placeLog(p_226086_, p_226087_, p_226088_, blockpos1, p_226091_);
this.placeLog(p_226086_, p_226087_, p_226088_, blockpos1.east(), p_226091_);
this.placeLog(p_226086_, p_226087_, p_226088_, blockpos1.south(), p_226091_);
this.placeLog(p_226086_, p_226087_, p_226088_, blockpos1.east().south(), p_226091_);
}
}
list.add(new FoliagePlacer.FoliageAttachment(new BlockPos(j1, l1, k1), 0, true));
for (int l2 = -1; l2 <= 2; l2++) {
for (int i3 = -1; i3 <= 2; i3++) {
if ((l2 < 0 || l2 > 1 || i3 < 0 || i3 > 1) && p_226088_.nextInt(3) <= 0) {
int j3 = p_226088_.nextInt(3) + 2;
for (int k2 = 0; k2 < j3; k2++) {
this.placeLog(p_226086_, p_226087_, p_226088_, new BlockPos(k + l2, l1 - k2 - 1, i1 + i3), p_226091_);
}
list.add(new FoliagePlacer.FoliageAttachment(new BlockPos(k + l2, l1, i1 + i3), 0, false));
}
}
}
return list;
}
}