Code/net/minecraft/world/level/levelgen/structure/structures/NetherFossilStructure.java

69 lines
3.2 KiB
Java
Raw Normal View History

2025-07-01 06:20:03 +00:00
package net.minecraft.world.level.levelgen.structure.structures;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import com.mojang.serialization.codecs.RecordCodecBuilder.Instance;
import java.util.Optional;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.level.EmptyBlockGetter;
import net.minecraft.world.level.NoiseColumn;
import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.WorldGenerationContext;
import net.minecraft.world.level.levelgen.WorldgenRandom;
import net.minecraft.world.level.levelgen.heightproviders.HeightProvider;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.StructureType;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder;
public class NetherFossilStructure extends Structure {
public static final MapCodec<NetherFossilStructure> CODEC = RecordCodecBuilder.mapCodec(
p_228585_ -> p_228585_.group(settingsCodec(p_228585_), HeightProvider.CODEC.fieldOf("height").forGetter(p_228583_ -> p_228583_.height))
.apply(p_228585_, NetherFossilStructure::new)
);
public final HeightProvider height;
public NetherFossilStructure(Structure.StructureSettings p_228573_, HeightProvider p_228574_) {
super(p_228573_);
this.height = p_228574_;
}
@Override
public Optional<Structure.GenerationStub> findGenerationPoint(Structure.GenerationContext p_228576_) {
WorldgenRandom worldgenrandom = p_228576_.random();
int i = p_228576_.chunkPos().getMinBlockX() + worldgenrandom.nextInt(16);
int j = p_228576_.chunkPos().getMinBlockZ() + worldgenrandom.nextInt(16);
int k = p_228576_.chunkGenerator().getSeaLevel();
WorldGenerationContext worldgenerationcontext = new WorldGenerationContext(p_228576_.chunkGenerator(), p_228576_.heightAccessor());
int l = this.height.sample(worldgenrandom, worldgenerationcontext);
NoiseColumn noisecolumn = p_228576_.chunkGenerator().getBaseColumn(i, j, p_228576_.heightAccessor(), p_228576_.randomState());
BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos(i, l, j);
while (l > k) {
BlockState blockstate = noisecolumn.getBlock(l);
BlockState blockstate1 = noisecolumn.getBlock(--l);
if (blockstate.isAir()
&& (
blockstate1.is(Blocks.SOUL_SAND)
|| blockstate1.isFaceSturdy(EmptyBlockGetter.INSTANCE, blockpos$mutableblockpos.setY(l), Direction.UP)
)) {
break;
}
}
if (l <= k) {
return Optional.empty();
} else {
BlockPos blockpos = new BlockPos(i, l, j);
return Optional.of(
new Structure.GenerationStub(blockpos, p_228581_ -> NetherFossilPieces.addPieces(p_228576_.structureTemplateManager(), p_228581_, worldgenrandom, blockpos))
);
}
}
@Override
public StructureType<?> type() {
return StructureType.NETHER_FOSSIL;
}
}