minecraft-source/src/net/minecraft/world/level/levelgen/feature/IceSpikeFeature.java

95 lines
4.8 KiB
Java

package net.minecraft.world.level.levelgen.feature;
import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.LevelWriter;
import net.minecraft.util.Mth;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.core.BlockPos;
import java.util.Random;
import net.minecraft.world.level.levelgen.ChunkGeneratorSettings;
import net.minecraft.world.level.chunk.ChunkGenerator;
import net.minecraft.world.level.LevelAccessor;
import com.mojang.datafixers.Dynamic;
import java.util.function.Function;
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
public class IceSpikeFeature extends Feature<NoneFeatureConfiguration> {
public IceSpikeFeature(final Function<Dynamic<?>, ? extends NoneFeatureConfiguration> function) {
super(function);
}
@Override
public boolean place(final LevelAccessor bju, final ChunkGenerator<? extends ChunkGeneratorSettings> bzx, final Random random, BlockPos fk, final NoneFeatureConfiguration cgs) {
while (bju.isEmptyBlock(fk) && fk.getY() > 2) {
fk = fk.below();
}
if (bju.getBlockState(fk).getBlock() != Blocks.SNOW_BLOCK) {
return false;
}
fk = fk.above(random.nextInt(4));
final int integer7 = random.nextInt(4) + 7;
final int integer8 = integer7 / 4 + random.nextInt(2);
if (integer8 > 1 && random.nextInt(60) == 0) {
fk = fk.above(10 + random.nextInt(30));
}
for (int integer9 = 0; integer9 < integer7; ++integer9) {
final float float10 = (1.0f - integer9 / (float)integer7) * integer8;
for (int integer10 = Mth.ceil(float10), integer11 = -integer10; integer11 <= integer10; ++integer11) {
final float float11 = Mth.abs(integer11) - 0.25f;
for (int integer12 = -integer10; integer12 <= integer10; ++integer12) {
final float float12 = Mth.abs(integer12) - 0.25f;
if ((integer11 == 0 && integer12 == 0) || float11 * float11 + float12 * float12 <= float10 * float10) {
if ((integer11 != -integer10 && integer11 != integer10 && integer12 != -integer10 && integer12 != integer10) || random.nextFloat() <= 0.75f) {
BlockState byg16 = bju.getBlockState(fk.offset(integer11, integer9, integer12));
Block bpe17 = byg16.getBlock();
if (byg16.isAir() || Feature.isDirt(bpe17) || bpe17 == Blocks.SNOW_BLOCK || bpe17 == Blocks.ICE) {
this.setBlock(bju, fk.offset(integer11, integer9, integer12), Blocks.PACKED_ICE.defaultBlockState());
}
if (integer9 != 0 && integer10 > 1) {
byg16 = bju.getBlockState(fk.offset(integer11, -integer9, integer12));
bpe17 = byg16.getBlock();
if (byg16.isAir() || Feature.isDirt(bpe17) || bpe17 == Blocks.SNOW_BLOCK || bpe17 == Blocks.ICE) {
this.setBlock(bju, fk.offset(integer11, -integer9, integer12), Blocks.PACKED_ICE.defaultBlockState());
}
}
}
}
}
}
}
int integer9 = integer8 - 1;
if (integer9 < 0) {
integer9 = 0;
}
else if (integer9 > 1) {
integer9 = 1;
}
for (int integer13 = -integer9; integer13 <= integer9; ++integer13) {
for (int integer10 = -integer9; integer10 <= integer9; ++integer10) {
BlockPos fk2 = fk.offset(integer13, -1, integer10);
int integer14 = 50;
if (Math.abs(integer13) == 1 && Math.abs(integer10) == 1) {
integer14 = random.nextInt(5);
}
while (fk2.getY() > 50) {
final BlockState byg17 = bju.getBlockState(fk2);
final Block bpe18 = byg17.getBlock();
if (!byg17.isAir() && !Feature.isDirt(bpe18) && bpe18 != Blocks.SNOW_BLOCK && bpe18 != Blocks.ICE && bpe18 != Blocks.PACKED_ICE) {
break;
}
this.setBlock(bju, fk2, Blocks.PACKED_ICE.defaultBlockState());
fk2 = fk2.below();
if (--integer14 > 0) {
continue;
}
fk2 = fk2.below(random.nextInt(5) + 1);
integer14 = random.nextInt(5);
}
}
}
return true;
}
}