87 lines
3 KiB
Java
87 lines
3 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 java.util.List;
|
|
import java.util.function.BiConsumer;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.core.Direction;
|
|
import net.minecraft.core.Direction.Plane;
|
|
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.FoliageAttachment;
|
|
|
|
public class DarkOakTrunkPlacer extends TrunkPlacer {
|
|
public static final MapCodec<DarkOakTrunkPlacer> CODEC = RecordCodecBuilder.mapCodec(
|
|
instance -> trunkPlacerParts(instance).apply(instance, DarkOakTrunkPlacer::new)
|
|
);
|
|
|
|
public DarkOakTrunkPlacer(int i, int j, int k) {
|
|
super(i, j, k);
|
|
}
|
|
|
|
@Override
|
|
protected TrunkPlacerType<?> type() {
|
|
return TrunkPlacerType.DARK_OAK_TRUNK_PLACER;
|
|
}
|
|
|
|
@Override
|
|
public List<FoliageAttachment> placeTrunk(
|
|
LevelSimulatedReader level, BiConsumer<BlockPos, BlockState> blockSetter, RandomSource random, int freeTreeHeight, BlockPos pos, TreeConfiguration config
|
|
) {
|
|
List<FoliageAttachment> list = Lists.<FoliageAttachment>newArrayList();
|
|
BlockPos blockPos = pos.below();
|
|
setDirtAt(level, blockSetter, random, blockPos, config);
|
|
setDirtAt(level, blockSetter, random, blockPos.east(), config);
|
|
setDirtAt(level, blockSetter, random, blockPos.south(), config);
|
|
setDirtAt(level, blockSetter, random, blockPos.south().east(), config);
|
|
Direction direction = Plane.HORIZONTAL.getRandomDirection(random);
|
|
int i = freeTreeHeight - random.nextInt(4);
|
|
int j = 2 - random.nextInt(3);
|
|
int k = pos.getX();
|
|
int l = pos.getY();
|
|
int m = pos.getZ();
|
|
int n = k;
|
|
int o = m;
|
|
int p = l + freeTreeHeight - 1;
|
|
|
|
for (int q = 0; q < freeTreeHeight; q++) {
|
|
if (q >= i && j > 0) {
|
|
n += direction.getStepX();
|
|
o += direction.getStepZ();
|
|
j--;
|
|
}
|
|
|
|
int r = l + q;
|
|
BlockPos blockPos2 = new BlockPos(n, r, o);
|
|
if (TreeFeature.isAirOrLeaves(level, blockPos2)) {
|
|
this.placeLog(level, blockSetter, random, blockPos2, config);
|
|
this.placeLog(level, blockSetter, random, blockPos2.east(), config);
|
|
this.placeLog(level, blockSetter, random, blockPos2.south(), config);
|
|
this.placeLog(level, blockSetter, random, blockPos2.east().south(), config);
|
|
}
|
|
}
|
|
|
|
list.add(new FoliageAttachment(new BlockPos(n, p, o), 0, true));
|
|
|
|
for (int q = -1; q <= 2; q++) {
|
|
for (int r = -1; r <= 2; r++) {
|
|
if ((q < 0 || q > 1 || r < 0 || r > 1) && random.nextInt(3) <= 0) {
|
|
int s = random.nextInt(3) + 2;
|
|
|
|
for (int t = 0; t < s; t++) {
|
|
this.placeLog(level, blockSetter, random, new BlockPos(k + q, p - t - 1, m + r), config);
|
|
}
|
|
|
|
list.add(new FoliageAttachment(new BlockPos(k + q, p, m + r), 0, false));
|
|
}
|
|
}
|
|
}
|
|
|
|
return list;
|
|
}
|
|
}
|