blob: ef76d3082311266b687e3949e59886a5a1d7b7e5 [file] [log] [blame] [raw]
package com.legacy.aether.world;
import java.util.List;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.entity.EnumCreatureType;
import net.minecraft.init.Blocks;
import net.minecraft.util.IProgressUpdate;
import net.minecraft.world.ChunkPosition;
import net.minecraft.world.SpawnerAnimals;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.chunk.Chunk;
import net.minecraft.world.chunk.IChunkProvider;
import net.minecraft.world.gen.NoiseGeneratorOctaves;
import com.legacy.aether.blocks.BlocksAether;
import com.legacy.aether.world.dungeon.BronzeDungeon;
import com.legacy.aether.world.dungeon.util.AetherDungeon;
import com.legacy.aether.world.gen.MapGenGoldenDungeon;
import com.legacy.aether.world.gen.MapGenLargeColdAercloud;
import com.legacy.aether.world.gen.MapGenQuicksoil;
import com.legacy.aether.world.gen.MapGenSilverDungeon;
public class ChunkProviderAether implements IChunkProvider {
private Random rand;
private World worldObj;
private NoiseGeneratorOctaves noiseGen1, perlinNoise1;
private double buffer[];
double pnr[], ar[], br[];
protected AetherDungeon dungeon_bronze = new BronzeDungeon();
private MapGenQuicksoil quicksoilGen = new MapGenQuicksoil();
private MapGenSilverDungeon silverDungeonStructure = new MapGenSilverDungeon();
private MapGenGoldenDungeon goldenDungeonStructure = new MapGenGoldenDungeon();
private MapGenLargeColdAercloud largeColdAercloudStructure = new MapGenLargeColdAercloud();
public ChunkProviderAether(World world, long seed) {
this.worldObj = world;
this.rand = new Random(seed);
this.noiseGen1 = new NoiseGeneratorOctaves(this.rand, 16);
this.perlinNoise1 = new NoiseGeneratorOctaves(this.rand, 8);
}
public void setBlocksInChunk(int x, int z, Block[] blocks) {
this.buffer = this.setupNoiseGenerators(this.buffer, x * 2, z * 2);
for (int i1 = 0; i1 < 2; i1++) {
for (int j1 = 0; j1 < 2; j1++) {
for (int k1 = 0; k1 < 32; k1++) {
double d1 = this.buffer[(i1 * 3 + j1) * 33 + k1];
double d2 = this.buffer[(i1 * 3 + (j1 + 1)) * 33 + k1];
double d3 = this.buffer[((i1 + 1) * 3 + j1) * 33 + k1];
double d4 = this.buffer[((i1 + 1) * 3 + (j1 + 1)) * 33 + k1];
double d5 = (this.buffer[(i1 * 3 + j1) * 33 + (k1 + 1)] - d1) * 0.25D;
double d6 = (this.buffer[(i1 * 3 + (j1 + 1)) * 33 + (k1 + 1)] - d2) * 0.25D;
double d7 = (this.buffer[((i1 + 1) * 3 + j1) * 33 + (k1 + 1)] - d3) * 0.25D;
double d8 = (this.buffer[((i1 + 1) * 3 + (j1 + 1)) * 33 + (k1 + 1)] - d4) * 0.25D;
for (int l1 = 0; l1 < 4; l1++) {
double d10 = d1;
double d11 = d2;
double d12 = (d3 - d1) * 0.125D;
double d13 = (d4 - d2) * 0.125D;
for (int i2 = 0; i2 < 8; i2++) {
int j2 = i2 + i1 * 8 << 11 | 0 + j1 * 8 << 7 | k1 * 4 + l1;
char c = '\200';
double d15 = d10;
double d16 = (d11 - d10) * 0.125D;
for (int k2 = 0; k2 < 8; k2++) {
Block filler = Blocks.air;
if (d15 > 0.0D) {
filler = BlocksAether.holystone;
}
blocks[j2] = filler;
j2 += c;
d15 += d16;
}
d10 += d12;
d11 += d13;
}
d1 += d5;
d2 += d6;
d3 += d7;
d4 += d8;
}
}
}
}
}
public void buildSurfaces(int i, int j, Block[] blocks) {
for (int k = 0; k < 16; k++) {
for (int l = 0; l < 16; l++) {
int j1 = -1;
int i1 = (int) (3.0D + this.rand.nextDouble() * 0.25D);
Block top = BlocksAether.aether_grass;
Block filler = BlocksAether.aether_dirt;
for (int k1 = 127; k1 >= 0; k1--) {
int l1 = (l * 16 + k) * 128 + k1;
Block block = blocks[l1];
if (block == Blocks.air) {
j1 = -1;
} else if (block == BlocksAether.holystone) {
if (j1 == -1) {
if (i1 <= 0) {
top = Blocks.air;
filler = BlocksAether.holystone;
}
j1 = i1;
if (k1 >= 0) {
blocks[l1] = top;
} else {
blocks[l1] = filler;
}
} else if (j1 > 0) {
--j1;
blocks[l1] = filler;
}
}
}
}
}
}
private double[] setupNoiseGenerators(double buffer[], int x, int z) {
if (buffer == null) {
buffer = new double[3366];
}
double d = 1368.824D;
double d1 = 684.41200000000003D;
this.pnr = this.perlinNoise1.generateNoiseOctaves(this.pnr, x, 0, z, 3, 33, 3, d / 80D, d1 / 160D, d / 80D);
this.ar = this.noiseGen1.generateNoiseOctaves(this.ar, x, 0, z, 3, 33, 3, d, d1, d);
this.br = this.noiseGen1.generateNoiseOctaves(this.br, x, 0, z, 3, 33, 3, d, d1, d);
int id = 0;
for (int j2 = 0; j2 < 3; j2++) {
for (int l2 = 0; l2 < 3; l2++) {
for (int j3 = 0; j3 < 33; j3++) {
double d8;
double d10 = this.ar[id] / 512D;
double d11 = this.br[id] / 512D;
double d12 = (this.pnr[id] / 10D + 1.0D) / 2D;
if (d12 < 0.0D) {
d8 = d10;
} else if (d12 > 1.0D) {
d8 = d11;
} else {
d8 = d10 + (d11 - d10) * d12;
}
d8 -= 8D;
if (j3 > 33 - 32) {
double d13 = (float) (j3 - (33 - 32)) / ((float) 32 - 1.0F);
d8 = d8 * (1.0D - d13) + -30D * d13;
}
if (j3 < 8) {
double d14 = (float) (8 - j3) / ((float) 8 - 1.0F);
d8 = d8 * (1.0D - d14) + -30D * d14;
}
buffer[id] = d8;
id++;
}
}
}
return buffer;
}
@Override
public Chunk provideChunk(int x, int z) {
this.rand.setSeed((long) x * 341873128712L + (long) z * 132897987541L);
Block[] ablock = new Block[32768];
this.setBlocksInChunk(x, z, ablock);
this.buildSurfaces(x, z, ablock);
this.quicksoilGen.func_151539_a(this, this.worldObj, x, z, ablock);
this.largeColdAercloudStructure.func_151539_a(this, this.worldObj, x, z, ablock);
this.silverDungeonStructure.func_151539_a(this, this.worldObj, x, z, ablock);
this.goldenDungeonStructure.func_151539_a(this, this.worldObj, x, z, ablock);
Chunk chunk = new Chunk(this.worldObj, ablock, x, z);
chunk.generateSkylightMap();
return chunk;
}
@Override
@SuppressWarnings("rawtypes")
public List getPossibleCreatures(EnumCreatureType creatureType, int x, int y, int z) {
return this.worldObj.getBiomeGenForCoords(x, z).getSpawnableList(creatureType);
}
@Override
public void recreateStructures(int x, int z) {
this.largeColdAercloudStructure.func_151539_a(this, this.worldObj, x, z, (Block[]) null);
this.silverDungeonStructure.func_151539_a(this, this.worldObj, x, z, (Block[]) null);
this.goldenDungeonStructure.func_151539_a(this, this.worldObj, x, z, (Block[]) null);
}
@Override
public ChunkPosition func_147416_a(World worldIn, String structureName, int x, int y, int z) //getNearestStructurePos
{
return null;
}
@Override
public void populate(IChunkProvider provider, int chunkX, int chunkZ) {
int x = chunkX * 16;
int z = chunkZ * 16;
BiomeGenBase biome = this.worldObj.getBiomeGenForCoords(x + 16, z + 16);
this.rand.setSeed(this.worldObj.getSeed());
long k = this.rand.nextLong() / 2L * 2L + 1L;
long l = this.rand.nextLong() / 2L * 2L + 1L;
this.rand.setSeed((long) x * k + (long) z * l ^ this.worldObj.getSeed());
this.largeColdAercloudStructure.generateStructuresInChunk(this.worldObj, this.rand, chunkX, chunkZ);
this.silverDungeonStructure.generateStructuresInChunk(this.worldObj, this.rand, chunkX, chunkZ);
this.goldenDungeonStructure.generateStructuresInChunk(this.worldObj, this.rand, chunkX, chunkZ);
biome.decorate(this.worldObj, this.rand, x, z);
this.dungeon_bronze.generate(this.worldObj, this.rand, x, this.rand.nextInt(48) + 24, z);
SpawnerAnimals.performWorldGenSpawning(this.worldObj, biome, x + 8, z + 8, 16, 16, this.rand);
}
@Override
public Chunk loadChunk(int chunkX, int chunkZ) {
return this.provideChunk(chunkX, chunkZ);
}
@Override
public boolean chunkExists(int chunkX, int chunkZ) {
return true;
}
@Override
public boolean saveChunks(boolean p_73151_1_, IProgressUpdate p_73151_2_) {
return true;
}
@Override
public boolean unloadQueuedChunks() {
return true;
}
@Override
public boolean canSave() {
return true;
}
@Override
public String makeString() {
return "AetherRandomLevelSource";
}
@Override
public int getLoadedChunkCount() {
return 0;
}
@Override
public void saveExtraData() {
}
}