180 lines
7.0 KiB
Java
180 lines
7.0 KiB
Java
package net.minecraft.world.level.levelgen;
|
|
|
|
import net.minecraft.Util;
|
|
import net.minecraft.util.Mth;
|
|
import net.minecraft.server.level.ServerLevel;
|
|
import net.minecraft.world.level.levelgen.feature.Feature;
|
|
import java.util.List;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.world.entity.MobCategory;
|
|
import net.minecraft.world.level.biome.Biome;
|
|
import java.util.Random;
|
|
import net.minecraft.world.level.NaturalSpawner;
|
|
import net.minecraft.world.level.ChunkPos;
|
|
import net.minecraft.server.level.WorldGenRegion;
|
|
import net.minecraft.world.level.LevelType;
|
|
import net.minecraft.world.level.biome.BiomeSource;
|
|
import net.minecraft.world.level.LevelAccessor;
|
|
import net.minecraft.world.entity.ai.village.VillageSiege;
|
|
import net.minecraft.world.entity.npc.CatSpawner;
|
|
import net.minecraft.world.level.levelgen.synth.PerlinNoise;
|
|
|
|
public class OverworldLevelSource extends NoiseBasedChunkGenerator<OverworldGeneratorSettings> {
|
|
private static final float[] BIOME_WEIGHTS;
|
|
private final PerlinNoise depthNoise;
|
|
private final boolean isAmplified;
|
|
private final PhantomSpawner phantomSpawner;
|
|
private final PatrolSpawner patrolSpawner;
|
|
private final CatSpawner catSpawner;
|
|
private final VillageSiege villageSiege;
|
|
|
|
public OverworldLevelSource(final LevelAccessor bju, final BiomeSource bkt, final OverworldGeneratorSettings cbw) {
|
|
super(bju, bkt, 4, 8, 256, cbw, true);
|
|
this.phantomSpawner = new PhantomSpawner();
|
|
this.patrolSpawner = new PatrolSpawner();
|
|
this.catSpawner = new CatSpawner();
|
|
this.villageSiege = new VillageSiege();
|
|
this.random.consumeCount(2620);
|
|
this.depthNoise = new PerlinNoise(this.random, 15, 0);
|
|
this.isAmplified = (bju.getLevelData().getGeneratorType() == LevelType.AMPLIFIED);
|
|
}
|
|
|
|
@Override
|
|
public void spawnOriginalMobs(final WorldGenRegion xj) {
|
|
final int integer3 = xj.getCenterX();
|
|
final int integer4 = xj.getCenterZ();
|
|
final Biome bkq5 = xj.getBiome(new ChunkPos(integer3, integer4).getWorldPosition());
|
|
final WorldgenRandom ccc6 = new WorldgenRandom();
|
|
ccc6.setDecorationSeed(xj.getSeed(), integer3 << 4, integer4 << 4);
|
|
NaturalSpawner.spawnMobsForChunkGeneration(xj, bkq5, integer3, integer4, ccc6);
|
|
}
|
|
|
|
@Override
|
|
protected void fillNoiseColumn(final double[] arr, final int integer2, final int integer3) {
|
|
final double double5 = 684.4119873046875;
|
|
final double double6 = 684.4119873046875;
|
|
final double double7 = 8.555149841308594;
|
|
final double double8 = 4.277574920654297;
|
|
final int integer4 = -10;
|
|
final int integer5 = 3;
|
|
this.fillNoiseColumn(arr, integer2, integer3, 684.4119873046875, 684.4119873046875, 8.555149841308594, 4.277574920654297, 3, -10);
|
|
}
|
|
|
|
@Override
|
|
protected double getYOffset(final double double1, final double double2, final int integer) {
|
|
final double double3 = 8.5;
|
|
double double4 = (integer - (8.5 + double1 * 8.5 / 8.0 * 4.0)) * 12.0 * 128.0 / 256.0 / double2;
|
|
if (double4 < 0.0) {
|
|
double4 *= 4.0;
|
|
}
|
|
return double4;
|
|
}
|
|
|
|
@Override
|
|
protected double[] getDepthAndScale(final int integer1, final int integer2) {
|
|
final double[] arr4 = new double[2];
|
|
float float5 = 0.0f;
|
|
float float6 = 0.0f;
|
|
float float7 = 0.0f;
|
|
final int integer3 = 2;
|
|
final int integer4 = this.getSeaLevel();
|
|
final float float8 = this.biomeSource.getNoiseBiome(integer1, integer4, integer2).getDepth();
|
|
for (int integer5 = -2; integer5 <= 2; ++integer5) {
|
|
for (int integer6 = -2; integer6 <= 2; ++integer6) {
|
|
final Biome bkq13 = this.biomeSource.getNoiseBiome(integer1 + integer5, integer4, integer2 + integer6);
|
|
float float9 = bkq13.getDepth();
|
|
float float10 = bkq13.getScale();
|
|
if (this.isAmplified && float9 > 0.0f) {
|
|
float9 = 1.0f + float9 * 2.0f;
|
|
float10 = 1.0f + float10 * 4.0f;
|
|
}
|
|
float float11 = OverworldLevelSource.BIOME_WEIGHTS[integer5 + 2 + (integer6 + 2) * 5] / (float9 + 2.0f);
|
|
if (bkq13.getDepth() > float8) {
|
|
float11 /= 2.0f;
|
|
}
|
|
float5 += float10 * float11;
|
|
float6 += float9 * float11;
|
|
float7 += float11;
|
|
}
|
|
}
|
|
float5 /= float7;
|
|
float6 /= float7;
|
|
float5 = float5 * 0.9f + 0.1f;
|
|
float6 = (float6 * 4.0f - 1.0f) / 8.0f;
|
|
arr4[0] = float6 + this.getRdepth(integer1, integer2);
|
|
arr4[1] = float5;
|
|
return arr4;
|
|
}
|
|
|
|
private double getRdepth(final int integer1, final int integer2) {
|
|
double double4 = this.depthNoise.getValue(integer1 * 200, 10.0, integer2 * 200, 1.0, 0.0, true) * 65535.0 / 8000.0;
|
|
if (double4 < 0.0) {
|
|
double4 = -double4 * 0.3;
|
|
}
|
|
double4 = double4 * 3.0 - 2.0;
|
|
if (double4 < 0.0) {
|
|
double4 /= 28.0;
|
|
}
|
|
else {
|
|
if (double4 > 1.0) {
|
|
double4 = 1.0;
|
|
}
|
|
double4 /= 40.0;
|
|
}
|
|
return double4;
|
|
}
|
|
|
|
@Override
|
|
public List<Biome.SpawnerData> getMobsAt(final MobCategory aky, final BlockPos fk) {
|
|
if (Feature.SWAMP_HUT.isSwamphut(this.level, fk)) {
|
|
if (aky == MobCategory.MONSTER) {
|
|
return Feature.SWAMP_HUT.getSpecialEnemies();
|
|
}
|
|
if (aky == MobCategory.CREATURE) {
|
|
return Feature.SWAMP_HUT.getSpecialAnimals();
|
|
}
|
|
}
|
|
else if (aky == MobCategory.MONSTER) {
|
|
if (Feature.PILLAGER_OUTPOST.isInsideBoundingFeature(this.level, fk)) {
|
|
return Feature.PILLAGER_OUTPOST.getSpecialEnemies();
|
|
}
|
|
if (Feature.OCEAN_MONUMENT.isInsideBoundingFeature(this.level, fk)) {
|
|
return Feature.OCEAN_MONUMENT.getSpecialEnemies();
|
|
}
|
|
}
|
|
return super.getMobsAt(aky, fk);
|
|
}
|
|
|
|
@Override
|
|
public void tickCustomSpawners(final ServerLevel xd, final boolean boolean2, final boolean boolean3) {
|
|
this.phantomSpawner.tick(xd, boolean2, boolean3);
|
|
this.patrolSpawner.tick(xd, boolean2, boolean3);
|
|
this.catSpawner.tick(xd, boolean2, boolean3);
|
|
this.villageSiege.tick(xd, boolean2, boolean3);
|
|
}
|
|
|
|
@Override
|
|
public int getSpawnHeight() {
|
|
return this.level.getSeaLevel() + 1;
|
|
}
|
|
|
|
@Override
|
|
public int getSeaLevel() {
|
|
return 63;
|
|
}
|
|
|
|
static {
|
|
int integer2;
|
|
int integer3;
|
|
float float4;
|
|
BIOME_WEIGHTS = Util.<float[]>make(new float[25], arr -> {
|
|
for (integer2 = -2; integer2 <= 2; ++integer2) {
|
|
for (integer3 = -2; integer3 <= 2; ++integer3) {
|
|
float4 = 10.0f / Mth.sqrt(integer2 * integer2 + integer3 * integer3 + 0.2f);
|
|
arr[integer2 + 2 + (integer3 + 2) * 5] = float4;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
}
|