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

105 lines
4.5 KiB
Java
Raw 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.util.Mth;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.WorldGenLevel;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
public class IceSpikeFeature extends Feature<NoneFeatureConfiguration> {
public IceSpikeFeature(Codec<NoneFeatureConfiguration> p_66003_) {
super(p_66003_);
}
@Override
public boolean place(FeaturePlaceContext<NoneFeatureConfiguration> p_159882_) {
BlockPos blockpos = p_159882_.origin();
RandomSource randomsource = p_159882_.random();
WorldGenLevel worldgenlevel = p_159882_.level();
while (worldgenlevel.isEmptyBlock(blockpos) && blockpos.getY() > worldgenlevel.getMinY() + 2) {
blockpos = blockpos.below();
}
if (!worldgenlevel.getBlockState(blockpos).is(Blocks.SNOW_BLOCK)) {
return false;
} else {
blockpos = blockpos.above(randomsource.nextInt(4));
int i = randomsource.nextInt(4) + 7;
int j = i / 4 + randomsource.nextInt(2);
if (j > 1 && randomsource.nextInt(60) == 0) {
blockpos = blockpos.above(10 + randomsource.nextInt(30));
}
for (int k = 0; k < i; k++) {
float f = (1.0F - (float)k / i) * j;
int l = Mth.ceil(f);
for (int i1 = -l; i1 <= l; i1++) {
float f1 = Mth.abs(i1) - 0.25F;
for (int j1 = -l; j1 <= l; j1++) {
float f2 = Mth.abs(j1) - 0.25F;
if ((i1 == 0 && j1 == 0 || !(f1 * f1 + f2 * f2 > f * f))
&& (i1 != -l && i1 != l && j1 != -l && j1 != l || !(randomsource.nextFloat() > 0.75F))) {
BlockState blockstate = worldgenlevel.getBlockState(blockpos.offset(i1, k, j1));
if (blockstate.isAir() || isDirt(blockstate) || blockstate.is(Blocks.SNOW_BLOCK) || blockstate.is(Blocks.ICE)) {
this.setBlock(worldgenlevel, blockpos.offset(i1, k, j1), Blocks.PACKED_ICE.defaultBlockState());
}
if (k != 0 && l > 1) {
blockstate = worldgenlevel.getBlockState(blockpos.offset(i1, -k, j1));
if (blockstate.isAir()
|| isDirt(blockstate)
|| blockstate.is(Blocks.SNOW_BLOCK)
|| blockstate.is(Blocks.ICE)) {
this.setBlock(worldgenlevel, blockpos.offset(i1, -k, j1), Blocks.PACKED_ICE.defaultBlockState());
}
}
}
}
}
}
int k1 = j - 1;
if (k1 < 0) {
k1 = 0;
} else if (k1 > 1) {
k1 = 1;
}
for (int l1 = -k1; l1 <= k1; l1++) {
for (int i2 = -k1; i2 <= k1; i2++) {
BlockPos blockpos1 = blockpos.offset(l1, -1, i2);
int j2 = 50;
if (Math.abs(l1) == 1 && Math.abs(i2) == 1) {
j2 = randomsource.nextInt(5);
}
while (blockpos1.getY() > 50) {
BlockState blockstate1 = worldgenlevel.getBlockState(blockpos1);
if (!blockstate1.isAir()
&& !isDirt(blockstate1)
&& !blockstate1.is(Blocks.SNOW_BLOCK)
&& !blockstate1.is(Blocks.ICE)
&& !blockstate1.is(Blocks.PACKED_ICE)) {
break;
}
this.setBlock(worldgenlevel, blockpos1, Blocks.PACKED_ICE.defaultBlockState());
blockpos1 = blockpos1.below();
if (--j2 <= 0) {
blockpos1 = blockpos1.below(randomsource.nextInt(5) + 1);
j2 = randomsource.nextInt(5);
}
}
}
}
return true;
}
}
}