package net.minecraft.server; import java.util.List; public class ChunkProviderGenerate extends ChunkGeneratorAbstract<GeneratorSettingsOverworld> { private static final float[] h = (float[]) SystemUtils.a((new float[25]), (afloat) -> { // CraftBukkit - decompile error for (int i = -2; i <= 2; ++i) { for (int j = -2; j <= 2; ++j) { float f = 10.0F / MathHelper.c((float) (i * i + j * j) + 0.2F); afloat[i + 2 + (j + 2) * 5] = f; } } }); private final NoiseGeneratorOctaves i; private final boolean j; private final MobSpawnerPhantom k = new MobSpawnerPhantom(); private final MobSpawnerPatrol l = new MobSpawnerPatrol(); private final MobSpawnerCat m = new MobSpawnerCat(); private final VillageSiege n = new VillageSiege(); public ChunkProviderGenerate(GeneratorAccess generatoraccess, WorldChunkManager worldchunkmanager, GeneratorSettingsOverworld generatorsettingsoverworld) { super(generatoraccess, worldchunkmanager, 4, 8, 256, generatorsettingsoverworld, true); this.e.a(2620); this.i = new NoiseGeneratorOctaves(this.e, 15, 0); this.j = generatoraccess.getWorldData().getType() == WorldType.AMPLIFIED; } @Override public void addMobs(RegionLimitedWorldAccess regionlimitedworldaccess) { int i = regionlimitedworldaccess.a(); int j = regionlimitedworldaccess.b(); BiomeBase biomebase = regionlimitedworldaccess.getBiome((new ChunkCoordIntPair(i, j)).l()); SeededRandom seededrandom = new SeededRandom(); seededrandom.a(regionlimitedworldaccess.getSeed(), i << 4, j << 4); SpawnerCreature.a(regionlimitedworldaccess, biomebase, i, j, seededrandom); } @Override protected void a(double[] adouble, int i, int j) { double d0 = 684.4119873046875D; double d1 = 684.4119873046875D; double d2 = 8.555149841308594D; double d3 = 4.277574920654297D; boolean flag = true; boolean flag1 = true; this.a(adouble, i, j, 684.4119873046875D, 684.4119873046875D, 8.555149841308594D, 4.277574920654297D, 3, -10); } @Override protected double a(double d0, double d1, int i) { double d2 = 8.5D; double d3 = ((double) i - (8.5D + d0 * 8.5D / 8.0D * 4.0D)) * 12.0D * 128.0D / 256.0D / d1; if (d3 < 0.0D) { d3 *= 4.0D; } return d3; } @Override protected double[] a(int i, int j) { double[] adouble = new double[2]; float f = 0.0F; float f1 = 0.0F; float f2 = 0.0F; boolean flag = true; int k = this.getSeaLevel(); float f3 = this.c.getBiome(i, k, j).i(); for (int l = -2; l <= 2; ++l) { for (int i1 = -2; i1 <= 2; ++i1) { BiomeBase biomebase = this.c.getBiome(i + l, k, j + i1); float f4 = biomebase.i(); float f5 = biomebase.m(); if (this.j && f4 > 0.0F) { f4 = 1.0F + f4 * 2.0F; f5 = 1.0F + f5 * 4.0F; } // CraftBukkit start - fix MC-54738 if (f4 < -1.8F) { f4 = -1.8F; } // CraftBukkit end float f6 = ChunkProviderGenerate.h[l + 2 + (i1 + 2) * 5] / (f4 + 2.0F); if (biomebase.i() > f3) { f6 /= 2.0F; } f += f5 * f6; f1 += f4 * f6; f2 += f6; } } f /= f2; f1 /= f2; f = f * 0.9F + 0.1F; f1 = (f1 * 4.0F - 1.0F) / 8.0F; adouble[0] = (double) f1 + this.c(i, j); adouble[1] = (double) f; return adouble; } private double c(int i, int j) { double d0 = this.i.a((double) (i * 200), 10.0D, (double) (j * 200), 1.0D, 0.0D, true) * 65535.0D / 8000.0D; if (d0 < 0.0D) { d0 = -d0 * 0.3D; } d0 = d0 * 3.0D - 2.0D; if (d0 < 0.0D) { d0 /= 28.0D; } else { if (d0 > 1.0D) { d0 = 1.0D; } d0 /= 40.0D; } return d0; } @Override public List<BiomeBase.BiomeMeta> getMobsFor(EnumCreatureType enumcreaturetype, BlockPosition blockposition) { if (WorldGenerator.SWAMP_HUT.c(this.a, blockposition)) { if (enumcreaturetype == EnumCreatureType.MONSTER) { return WorldGenerator.SWAMP_HUT.e(); } if (enumcreaturetype == EnumCreatureType.CREATURE) { return WorldGenerator.SWAMP_HUT.f(); } } else if (enumcreaturetype == EnumCreatureType.MONSTER) { if (WorldGenerator.PILLAGER_OUTPOST.a(this.a, blockposition)) { return WorldGenerator.PILLAGER_OUTPOST.e(); } if (WorldGenerator.OCEAN_MONUMENT.a(this.a, blockposition)) { return WorldGenerator.OCEAN_MONUMENT.e(); } } return super.getMobsFor(enumcreaturetype, blockposition); } @Override public void doMobSpawning(WorldServer worldserver, boolean flag, boolean flag1) { this.k.a(worldserver, flag, flag1); this.l.a(worldserver, flag, flag1); this.m.a(worldserver, flag, flag1); this.n.a(worldserver, flag, flag1); } @Override public int getSpawnHeight() { return this.a.getSeaLevel() + 1; } @Override public int getSeaLevel() { return 63; } }