minecraft-source/src/net/minecraft/world/level/levelgen/FlatLevelSource.java

171 lines
8.8 KiB
Java

package net.minecraft.world.level.levelgen;
import net.minecraft.world.level.levelgen.surfacebuilders.ConfiguredSurfaceBuilder;
import java.util.Locale;
import net.minecraft.world.level.Level;
import javax.annotation.Nullable;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.biome.BiomeManager;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.server.level.WorldGenRegion;
import net.minecraft.world.level.block.state.BlockState;
import java.util.List;
import java.util.Iterator;
import java.util.Map;
import net.minecraft.world.level.levelgen.placement.ConfiguredDecorator;
import net.minecraft.world.level.levelgen.feature.configurations.DecoratorConfiguration;
import net.minecraft.world.level.levelgen.placement.FeatureDecorator;
import net.minecraft.world.level.levelgen.feature.configurations.LayerConfiguration;
import net.minecraft.world.level.levelgen.feature.Feature;
import com.google.common.collect.Lists;
import net.minecraft.world.level.biome.Biomes;
import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
import net.minecraft.world.level.levelgen.feature.StructureFeature;
import net.minecraft.world.level.levelgen.feature.configurations.DecoratedFeatureConfiguration;
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
import net.minecraft.world.level.biome.BiomeSource;
import net.minecraft.world.level.LevelAccessor;
import net.minecraft.world.entity.npc.CatSpawner;
import net.minecraft.world.level.biome.Biome;
import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings;
import net.minecraft.world.level.chunk.ChunkGenerator;
public class FlatLevelSource extends ChunkGenerator<FlatLevelGeneratorSettings> {
private final Biome biomeWrapper;
private final PhantomSpawner phantomSpawner;
private final CatSpawner catSpawner;
public FlatLevelSource(final LevelAccessor bju, final BiomeSource bkt, final FlatLevelGeneratorSettings civ) {
super(bju, bkt, civ);
this.phantomSpawner = new PhantomSpawner();
this.catSpawner = new CatSpawner();
this.biomeWrapper = this.getBiomeFromSettings();
}
private Biome getBiomeFromSettings() {
final Biome bkq2 = ((FlatLevelGeneratorSettings)this.settings).getBiome();
final FlatLevelBiomeWrapper a3 = new FlatLevelBiomeWrapper(bkq2.getSurfaceBuilder(), bkq2.getPrecipitation(), bkq2.getBiomeCategory(), bkq2.getDepth(), bkq2.getScale(), bkq2.getTemperature(), bkq2.getDownfall(), bkq2.getWaterColor(), bkq2.getWaterFogColor(), bkq2.getParent());
final Map<String, Map<String, String>> map4 = ((FlatLevelGeneratorSettings)this.settings).getStructuresOptions();
for (final String string6 : map4.keySet()) {
final ConfiguredFeature<?, ?>[] arr7 = FlatLevelGeneratorSettings.STRUCTURE_FEATURES.get(string6);
if (arr7 == null) {
continue;
}
for (final ConfiguredFeature<?, ?> ccz11 : arr7) {
a3.addFeature(FlatLevelGeneratorSettings.STRUCTURE_FEATURES_STEP.get(ccz11), ccz11);
final ConfiguredFeature<?, ?> ccz12 = ((DecoratedFeatureConfiguration)ccz11.config).feature;
if (ccz12.feature instanceof StructureFeature) {
final StructureFeature<FeatureConfiguration> cfi13 = (StructureFeature<FeatureConfiguration>)ccz12.feature;
final FeatureConfiguration cgk14 = bkq2.<FeatureConfiguration>getStructureConfiguration(cfi13);
final FeatureConfiguration cgk15 = (cgk14 != null) ? cgk14 : FlatLevelGeneratorSettings.STRUCTURE_FEATURES_DEFAULT.get(ccz11);
a3.<FeatureConfiguration>addStructureStart(cfi13.configured(cgk15));
}
}
}
final boolean boolean5 = (!((FlatLevelGeneratorSettings)this.settings).isVoidGen() || bkq2 == Biomes.THE_VOID) && map4.containsKey("decoration");
if (boolean5) {
final List<GenerationStep.Decoration> list6 = Lists.newArrayList();
list6.add(GenerationStep.Decoration.UNDERGROUND_STRUCTURES);
list6.add(GenerationStep.Decoration.SURFACE_STRUCTURES);
for (final GenerationStep.Decoration b10 : GenerationStep.Decoration.values()) {
if (!list6.contains(b10)) {
for (final ConfiguredFeature<?, ?> ccz12 : bkq2.getFeaturesForStep(b10)) {
a3.addFeature(b10, ccz12);
}
}
}
}
final BlockState[] arr8 = ((FlatLevelGeneratorSettings)this.settings).getLayers();
for (int integer7 = 0; integer7 < arr8.length; ++integer7) {
final BlockState byg8 = arr8[integer7];
if (byg8 != null && !Heightmap.Types.MOTION_BLOCKING.isOpaque().test(byg8)) {
((FlatLevelGeneratorSettings)this.settings).deleteLayer(integer7);
a3.addFeature(GenerationStep.Decoration.TOP_LAYER_MODIFICATION, Feature.FILL_LAYER.configured(new LayerConfiguration(integer7, byg8)).decorated(FeatureDecorator.NOPE.configured(DecoratorConfiguration.NONE)));
}
}
return a3;
}
@Override
public void buildSurfaceAndBedrock(final WorldGenRegion xj, final ChunkAccess bzv) {
}
@Override
public int getSpawnHeight() {
final ChunkAccess bzv2 = this.level.getChunk(0, 0);
return bzv2.getHeight(Heightmap.Types.MOTION_BLOCKING, 8, 8);
}
@Override
protected Biome getCarvingOrDecorationBiome(final BiomeManager bks, final BlockPos fk) {
return this.biomeWrapper;
}
@Override
public void fillFromNoise(final LevelAccessor bju, final ChunkAccess bzv) {
final BlockState[] arr4 = ((FlatLevelGeneratorSettings)this.settings).getLayers();
final BlockPos.MutableBlockPos a5 = new BlockPos.MutableBlockPos();
final Heightmap cbs6 = bzv.getOrCreateHeightmapUnprimed(Heightmap.Types.OCEAN_FLOOR_WG);
final Heightmap cbs7 = bzv.getOrCreateHeightmapUnprimed(Heightmap.Types.WORLD_SURFACE_WG);
for (int integer8 = 0; integer8 < arr4.length; ++integer8) {
final BlockState byg9 = arr4[integer8];
if (byg9 != null) {
for (int integer9 = 0; integer9 < 16; ++integer9) {
for (int integer10 = 0; integer10 < 16; ++integer10) {
bzv.setBlockState(a5.set(integer9, integer8, integer10), byg9, false);
cbs6.update(integer9, integer8, integer10, byg9);
cbs7.update(integer9, integer8, integer10, byg9);
}
}
}
}
}
@Override
public int getBaseHeight(final int integer1, final int integer2, final Heightmap.Types a) {
final BlockState[] arr5 = ((FlatLevelGeneratorSettings)this.settings).getLayers();
for (int integer3 = arr5.length - 1; integer3 >= 0; --integer3) {
final BlockState byg7 = arr5[integer3];
if (byg7 != null) {
if (a.isOpaque().test(byg7)) {
return integer3 + 1;
}
}
}
return 0;
}
@Override
public void tickCustomSpawners(final ServerLevel xd, final boolean boolean2, final boolean boolean3) {
this.phantomSpawner.tick(xd, boolean2, boolean3);
this.catSpawner.tick(xd, boolean2, boolean3);
}
@Override
public boolean isBiomeValidStartForStructure(final Biome bkq, final StructureFeature<? extends FeatureConfiguration> cfi) {
return this.biomeWrapper.isValidStart(cfi);
}
@Nullable
@Override
public <C extends FeatureConfiguration> C getStructureConfiguration(final Biome bkq, final StructureFeature<C> cfi) {
return this.biomeWrapper.<C>getStructureConfiguration(cfi);
}
@Nullable
@Override
public BlockPos findNearestMapFeature(final Level bjt, final String string, final BlockPos fk, final int integer, final boolean boolean5) {
if (!((FlatLevelGeneratorSettings)this.settings).getStructuresOptions().keySet().contains(string.toLowerCase(Locale.ROOT))) {
return null;
}
return super.findNearestMapFeature(bjt, string, fk, integer, boolean5);
}
class FlatLevelBiomeWrapper extends Biome {
protected FlatLevelBiomeWrapper(final ConfiguredSurfaceBuilder<?> cmt, final Precipitation d, final BiomeCategory b, final float float5, final float float6, final float float7, final float float8, final int integer9, final int integer10, @Nullable final String string) {
super(new BiomeBuilder().surfaceBuilder(cmt).precipitation(d).biomeCategory(b).depth(float5).scale(float6).temperature(float7).downfall(float8).waterColor(integer9).waterFogColor(integer10).parent(string));
}
}
}