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

74 lines
2.9 KiB
Java

package net.minecraft.world.level.levelgen.feature;
import com.mojang.serialization.Codec;
import net.minecraft.core.BlockPos;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.levelgen.feature.configurations.BlockColumnConfiguration;
public class BlockColumnFeature extends Feature<BlockColumnConfiguration> {
public BlockColumnFeature(Codec<BlockColumnConfiguration> p_190789_) {
super(p_190789_);
}
@Override
public boolean place(FeaturePlaceContext<BlockColumnConfiguration> p_190791_) {
WorldGenLevel worldgenlevel = p_190791_.level();
BlockColumnConfiguration blockcolumnconfiguration = p_190791_.config();
RandomSource randomsource = p_190791_.random();
int i = blockcolumnconfiguration.layers().size();
int[] aint = new int[i];
int j = 0;
for (int k = 0; k < i; k++) {
aint[k] = blockcolumnconfiguration.layers().get(k).height().sample(randomsource);
j += aint[k];
}
if (j == 0) {
return false;
} else {
BlockPos.MutableBlockPos blockpos$mutableblockpos1 = p_190791_.origin().mutable();
BlockPos.MutableBlockPos blockpos$mutableblockpos = blockpos$mutableblockpos1.mutable().move(blockcolumnconfiguration.direction());
for (int l = 0; l < j; l++) {
if (!blockcolumnconfiguration.allowedPlacement().test(worldgenlevel, blockpos$mutableblockpos)) {
truncate(aint, j, l, blockcolumnconfiguration.prioritizeTip());
break;
}
blockpos$mutableblockpos.move(blockcolumnconfiguration.direction());
}
for (int k1 = 0; k1 < i; k1++) {
int i1 = aint[k1];
if (i1 != 0) {
BlockColumnConfiguration.Layer blockcolumnconfiguration$layer = blockcolumnconfiguration.layers().get(k1);
for (int j1 = 0; j1 < i1; j1++) {
worldgenlevel.setBlock(
blockpos$mutableblockpos1, blockcolumnconfiguration$layer.state().getState(randomsource, blockpos$mutableblockpos1), 2
);
blockpos$mutableblockpos1.move(blockcolumnconfiguration.direction());
}
}
}
return true;
}
}
private static void truncate(int[] p_190793_, int p_190794_, int p_190795_, boolean p_190796_) {
int i = p_190794_ - p_190795_;
int j = p_190796_ ? 1 : -1;
int k = p_190796_ ? 0 : p_190793_.length - 1;
int l = p_190796_ ? p_190793_.length : -1;
for (int i1 = k; i1 != l && i > 0; i1 += j) {
int j1 = p_190793_[i1];
int k1 = Math.min(j1, i);
i -= k1;
p_190793_[i1] -= k1;
}
}
}