package mcjty.rftools.dimension.world.mapgen;
import mcjty.lib.varia.BlockMeta;
import mcjty.rftools.dimension.world.GenericChunkProvider;
import net.minecraft.block.Block;
import net.minecraft.block.material.Material;
import net.minecraft.world.World;
import java.util.Random;
public class MapGenPyramids {
private final GenericChunkProvider provider;
public MapGenPyramids(GenericChunkProvider provider) {
this.provider = provider;
}
public void generate(World world, int chunkX, int chunkZ, Block[] ablock, byte[] ameta) {
BlockMeta[] blocks = provider.dimensionInformation.getPyramidBlocks();
Random random = new Random((world.getSeed() + (chunkX)) * 1133 + (chunkZ) * 37 + 77);
random.nextFloat();
if (random.nextFloat() < .05f) {
int x = 8;
int z = 8;
int y = getBestY(ablock, 8, 8);
if (y < 10 || y > 230) {
return;
}
BlockMeta block = BlockMeta.STONE;
if (blocks.length > 1) {
block = blocks[random.nextInt(blocks.length)];
} else if (blocks.length == 1) {
block = blocks[0];
}
for (int i = 7 ; i >= 0 ; i--) {
for (int dx = -i ; dx <= i-1 ; dx++) {
for (int dz = -i ; dz <= i-1 ; dz++) {
int index = ((x+dx) * 16 + (z+dz)) * 256;
ablock[index+y] = block.getBlock();
ameta[index+y] = block.getMeta();
}
}
y++;
}
}
}
private int getBestY(Block[] ablock, int x, int z) {
int y = findTopSolid(ablock, x, z);
int y1 = findTopSolid(ablock, x - 7, z - 7);
if (y1 < y) {
y = y1;
}
y1 = findTopSolid(ablock, x + 7, z - 7);
if (y1 < y) {
y = y1;
}
y1 = findTopSolid(ablock, x - 7, z + 7);
if (y1 < y) {
y = y1;
}
y1 = findTopSolid(ablock, x + 7, z + 7);
if (y1 < y) {
y = y1;
}
return y;
}
private int findTopSolid(Block[] ablock, int x, int z) {
int index = (x * 16 + z) * 256;
int y = 255;
while (y >= 5 && (ablock[index+y] == null || ablock[index+y].getMaterial() == Material.air)) {
y--;
}
return y;
}
}