Code/net/minecraft/world/level/levelgen/feature/WeepingVinesFeature.java

122 lines
5.1 KiB
Java
Raw Permalink Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.world.level.levelgen.feature;
import com.mojang.serialization.Codec;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.Mth;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.GrowingPlantHeadBlock;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
public class WeepingVinesFeature extends Feature<NoneFeatureConfiguration> {
private static final Direction[] DIRECTIONS = Direction.values();
public WeepingVinesFeature(Codec<NoneFeatureConfiguration> p_67375_) {
super(p_67375_);
}
@Override
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> p_160661_) {
WorldGenLevel worldgenlevel = p_160661_.level();
BlockPos blockpos = p_160661_.origin();
RandomSource randomsource = p_160661_.random();
if (!worldgenlevel.isEmptyBlock(blockpos)) {
return false;
} else {
BlockState blockstate = worldgenlevel.getBlockState(blockpos.above());
if (!blockstate.is(Blocks.NETHERRACK) && !blockstate.is(Blocks.NETHER_WART_BLOCK)) {
return false;
} else {
this.placeRoofNetherWart(worldgenlevel, randomsource, blockpos);
this.placeRoofWeepingVines(worldgenlevel, randomsource, blockpos);
return true;
}
}
}
private void placeRoofNetherWart(LevelAccessor p_225360_, RandomSource p_225361_, BlockPos p_225362_) {
p_225360_.setBlock(p_225362_, Blocks.NETHER_WART_BLOCK.defaultBlockState(), 2);
BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos();
BlockPos.MutableBlockPos blockpos$mutableblockpos1 = new BlockPos.MutableBlockPos();
for (int i = 0; i < 200; i++) {
blockpos$mutableblockpos.setWithOffset(
p_225362_,
p_225361_.nextInt(6) - p_225361_.nextInt(6),
p_225361_.nextInt(2) - p_225361_.nextInt(5),
p_225361_.nextInt(6) - p_225361_.nextInt(6)
);
if (p_225360_.isEmptyBlock(blockpos$mutableblockpos)) {
int j = 0;
for (Direction direction : DIRECTIONS) {
BlockState blockstate = p_225360_.getBlockState(blockpos$mutableblockpos1.setWithOffset(blockpos$mutableblockpos, direction));
if (blockstate.is(Blocks.NETHERRACK) || blockstate.is(Blocks.NETHER_WART_BLOCK)) {
j++;
}
if (j > 1) {
break;
}
}
if (j == 1) {
p_225360_.setBlock(blockpos$mutableblockpos, Blocks.NETHER_WART_BLOCK.defaultBlockState(), 2);
}
}
}
}
private void placeRoofWeepingVines(LevelAccessor p_225364_, RandomSource p_225365_, BlockPos p_225366_) {
BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos();
for (int i = 0; i < 100; i++) {
blockpos$mutableblockpos.setWithOffset(
p_225366_,
p_225365_.nextInt(8) - p_225365_.nextInt(8),
p_225365_.nextInt(2) - p_225365_.nextInt(7),
p_225365_.nextInt(8) - p_225365_.nextInt(8)
);
if (p_225364_.isEmptyBlock(blockpos$mutableblockpos)) {
BlockState blockstate = p_225364_.getBlockState(blockpos$mutableblockpos.above());
if (blockstate.is(Blocks.NETHERRACK) || blockstate.is(Blocks.NETHER_WART_BLOCK)) {
int j = Mth.nextInt(p_225365_, 1, 8);
if (p_225365_.nextInt(6) == 0) {
j *= 2;
}
if (p_225365_.nextInt(5) == 0) {
j = 1;
}
int k = 17;
int l = 25;
placeWeepingVinesColumn(p_225364_, p_225365_, blockpos$mutableblockpos, j, 17, 25);
}
}
}
}
public static void placeWeepingVinesColumn(
LevelAccessor p_225353_, RandomSource p_225354_, BlockPos.MutableBlockPos p_225355_, int p_225356_, int p_225357_, int p_225358_
) {
for (int i = 0; i <= p_225356_; i++) {
if (p_225353_.isEmptyBlock(p_225355_)) {
if (i == p_225356_ || !p_225353_.isEmptyBlock(p_225355_.below())) {
p_225353_.setBlock(
p_225355_, Blocks.WEEPING_VINES.defaultBlockState().setValue(GrowingPlantHeadBlock.AGE, Mth.nextInt(p_225354_, p_225357_, p_225358_)), 2
);
break;
}
p_225353_.setBlock(p_225355_, Blocks.WEEPING_VINES_PLANT.defaultBlockState(), 2);
}
p_225355_.move(Direction.DOWN);
}
}
}