145 lines
4.9 KiB
Java
145 lines
4.9 KiB
Java
package net.minecraft.world.level.levelgen;
|
|
|
|
import com.mojang.serialization.MapCodec;
|
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
|
import java.util.List;
|
|
import java.util.concurrent.CompletableFuture;
|
|
import java.util.stream.Stream;
|
|
import net.minecraft.Util;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.core.Holder;
|
|
import net.minecraft.core.HolderLookup;
|
|
import net.minecraft.core.HolderSet;
|
|
import net.minecraft.server.level.WorldGenRegion;
|
|
import net.minecraft.world.level.LevelHeightAccessor;
|
|
import net.minecraft.world.level.NoiseColumn;
|
|
import net.minecraft.world.level.StructureManager;
|
|
import net.minecraft.world.level.biome.BiomeManager;
|
|
import net.minecraft.world.level.biome.FixedBiomeSource;
|
|
import net.minecraft.world.level.block.Blocks;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.level.chunk.ChunkAccess;
|
|
import net.minecraft.world.level.chunk.ChunkGenerator;
|
|
import net.minecraft.world.level.chunk.ChunkGeneratorStructureState;
|
|
import net.minecraft.world.level.levelgen.blending.Blender;
|
|
import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings;
|
|
import net.minecraft.world.level.levelgen.structure.StructureSet;
|
|
|
|
public class FlatLevelSource extends ChunkGenerator {
|
|
public static final MapCodec<FlatLevelSource> CODEC = RecordCodecBuilder.mapCodec(
|
|
instance -> instance.group(FlatLevelGeneratorSettings.CODEC.fieldOf("settings").forGetter(FlatLevelSource::settings))
|
|
.apply(instance, instance.stable(FlatLevelSource::new))
|
|
);
|
|
private final FlatLevelGeneratorSettings settings;
|
|
|
|
public FlatLevelSource(FlatLevelGeneratorSettings settings) {
|
|
super(new FixedBiomeSource(settings.getBiome()), Util.memoize(settings::adjustGenerationSettings));
|
|
this.settings = settings;
|
|
}
|
|
|
|
@Override
|
|
public ChunkGeneratorStructureState createState(HolderLookup<StructureSet> structureSetLookup, RandomState randomState, long seed) {
|
|
Stream<Holder<StructureSet>> stream = (Stream<Holder<StructureSet>>)this.settings
|
|
.structureOverrides()
|
|
.map(HolderSet::stream)
|
|
.orElseGet(() -> structureSetLookup.listElements().map(reference -> reference));
|
|
return ChunkGeneratorStructureState.createForFlat(randomState, seed, this.biomeSource, stream);
|
|
}
|
|
|
|
@Override
|
|
protected MapCodec<? extends ChunkGenerator> codec() {
|
|
return CODEC;
|
|
}
|
|
|
|
public FlatLevelGeneratorSettings settings() {
|
|
return this.settings;
|
|
}
|
|
|
|
@Override
|
|
public void buildSurface(WorldGenRegion level, StructureManager structureManager, RandomState random, ChunkAccess chunk) {
|
|
}
|
|
|
|
@Override
|
|
public int getSpawnHeight(LevelHeightAccessor level) {
|
|
return level.getMinY() + Math.min(level.getHeight(), this.settings.getLayers().size());
|
|
}
|
|
|
|
@Override
|
|
public CompletableFuture<ChunkAccess> fillFromNoise(Blender blender, RandomState randomState, StructureManager structureManager, ChunkAccess chunk) {
|
|
List<BlockState> list = this.settings.getLayers();
|
|
BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
|
|
Heightmap heightmap = chunk.getOrCreateHeightmapUnprimed(Heightmap.Types.OCEAN_FLOOR_WG);
|
|
Heightmap heightmap2 = chunk.getOrCreateHeightmapUnprimed(Heightmap.Types.WORLD_SURFACE_WG);
|
|
|
|
for (int i = 0; i < Math.min(chunk.getHeight(), list.size()); i++) {
|
|
BlockState blockState = (BlockState)list.get(i);
|
|
if (blockState != null) {
|
|
int j = chunk.getMinY() + i;
|
|
|
|
for (int k = 0; k < 16; k++) {
|
|
for (int l = 0; l < 16; l++) {
|
|
chunk.setBlockState(mutableBlockPos.set(k, j, l), blockState);
|
|
heightmap.update(k, j, l, blockState);
|
|
heightmap2.update(k, j, l, blockState);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return CompletableFuture.completedFuture(chunk);
|
|
}
|
|
|
|
@Override
|
|
public int getBaseHeight(int x, int z, Heightmap.Types type, LevelHeightAccessor level, RandomState random) {
|
|
List<BlockState> list = this.settings.getLayers();
|
|
|
|
for (int i = Math.min(list.size() - 1, level.getMaxY()); i >= 0; i--) {
|
|
BlockState blockState = (BlockState)list.get(i);
|
|
if (blockState != null && type.isOpaque().test(blockState)) {
|
|
return level.getMinY() + i + 1;
|
|
}
|
|
}
|
|
|
|
return level.getMinY();
|
|
}
|
|
|
|
@Override
|
|
public NoiseColumn getBaseColumn(int x, int z, LevelHeightAccessor height, RandomState random) {
|
|
return new NoiseColumn(
|
|
height.getMinY(),
|
|
(BlockState[])this.settings
|
|
.getLayers()
|
|
.stream()
|
|
.limit(height.getHeight())
|
|
.map(blockState -> blockState == null ? Blocks.AIR.defaultBlockState() : blockState)
|
|
.toArray(BlockState[]::new)
|
|
);
|
|
}
|
|
|
|
@Override
|
|
public void addDebugScreenInfo(List<String> info, RandomState random, BlockPos pos) {
|
|
}
|
|
|
|
@Override
|
|
public void applyCarvers(WorldGenRegion level, long seed, RandomState random, BiomeManager biomeManager, StructureManager structureManager, ChunkAccess chunk) {
|
|
}
|
|
|
|
@Override
|
|
public void spawnOriginalMobs(WorldGenRegion level) {
|
|
}
|
|
|
|
@Override
|
|
public int getMinY() {
|
|
return 0;
|
|
}
|
|
|
|
@Override
|
|
public int getGenDepth() {
|
|
return 384;
|
|
}
|
|
|
|
@Override
|
|
public int getSeaLevel() {
|
|
return -63;
|
|
}
|
|
}
|