171 lines
8.8 KiB
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));
|
|
}
|
|
}
|
|
}
|