minecraft-src/net/minecraft/world/level/levelgen/feature/DeltaFeature.java
2025-07-04 01:41:11 +03:00

80 lines
2.9 KiB
Java

package net.minecraft.world.level.levelgen.feature;
import com.google.common.collect.ImmutableList;
import com.mojang.serialization.Codec;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.configurations.DeltaFeatureConfiguration;
public class DeltaFeature extends Feature<DeltaFeatureConfiguration> {
private static final ImmutableList<Block> CANNOT_REPLACE = ImmutableList.of(
Blocks.BEDROCK, Blocks.NETHER_BRICKS, Blocks.NETHER_BRICK_FENCE, Blocks.NETHER_BRICK_STAIRS, Blocks.NETHER_WART, Blocks.CHEST, Blocks.SPAWNER
);
private static final Direction[] DIRECTIONS = Direction.values();
private static final double RIM_SPAWN_CHANCE = 0.9;
public DeltaFeature(Codec<DeltaFeatureConfiguration> codec) {
super(codec);
}
@Override
public boolean place(FeaturePlaceContext<DeltaFeatureConfiguration> context) {
boolean bl = false;
RandomSource randomSource = context.random();
WorldGenLevel worldGenLevel = context.level();
DeltaFeatureConfiguration deltaFeatureConfiguration = context.config();
BlockPos blockPos = context.origin();
boolean bl2 = randomSource.nextDouble() < 0.9;
int i = bl2 ? deltaFeatureConfiguration.rimSize().sample(randomSource) : 0;
int j = bl2 ? deltaFeatureConfiguration.rimSize().sample(randomSource) : 0;
boolean bl3 = bl2 && i != 0 && j != 0;
int k = deltaFeatureConfiguration.size().sample(randomSource);
int l = deltaFeatureConfiguration.size().sample(randomSource);
int m = Math.max(k, l);
for (BlockPos blockPos2 : BlockPos.withinManhattan(blockPos, k, 0, l)) {
if (blockPos2.distManhattan(blockPos) > m) {
break;
}
if (isClear(worldGenLevel, blockPos2, deltaFeatureConfiguration)) {
if (bl3) {
bl = true;
this.setBlock(worldGenLevel, blockPos2, deltaFeatureConfiguration.rim());
}
BlockPos blockPos3 = blockPos2.offset(i, 0, j);
if (isClear(worldGenLevel, blockPos3, deltaFeatureConfiguration)) {
bl = true;
this.setBlock(worldGenLevel, blockPos3, deltaFeatureConfiguration.contents());
}
}
}
return bl;
}
private static boolean isClear(LevelAccessor level, BlockPos pos, DeltaFeatureConfiguration config) {
BlockState blockState = level.getBlockState(pos);
if (blockState.is(config.contents().getBlock())) {
return false;
} else if (CANNOT_REPLACE.contains(blockState.getBlock())) {
return false;
} else {
for (Direction direction : DIRECTIONS) {
boolean bl = level.getBlockState(pos.relative(direction)).isAir();
if (bl && direction != Direction.UP || !bl && direction == Direction.UP) {
return false;
}
}
return true;
}
}
}