package zmaster587.advancedRocketry.world.decoration; import net.minecraft.block.Block; import net.minecraft.world.World; import net.minecraft.world.gen.MapGenBase; public class MapGenCrater extends MapGenBase { int chancePerChunk; public MapGenCrater(int chancePerChunk) { this.chancePerChunk = chancePerChunk; } @Override protected void func_151538_a(World world, int rangeX, int rangeZ, int chunkX, int chunkZ, Block[] chunkArray) { if(rand.nextInt(chancePerChunk) == Math.abs(rangeX) % chancePerChunk && rand.nextInt(chancePerChunk) == Math.abs(rangeZ) % chancePerChunk) { int radius = rand.nextInt(56) + 8; //64; 8 -> 64 //TODO: make hemisphere from surface and line the side with ore of some kind int depth = radius*radius; int xCoord = -rangeX + chunkX; int zCoord = -rangeZ + chunkZ; for(int x = 15; x >= 0; x--) { for(int z = 15; z >= 0; z--) { for(int y = 254; y >= 0; y--) { int index = (x * 16 + z) * 256 + y; if(chunkArray[index] != null && chunkArray[index].isOpaqueCube()) { int count = ( depth - ( ((xCoord*16)+x)*((xCoord*16)+x) + ((zCoord*16)+z)*((zCoord*16)+z) ) )/(radius*2); for(int dist = 0; dist < count; dist++) { if(y-dist > 2) { index = (x * 16 + z) * 256 + y-dist; chunkArray[index] = null; } } int ridgeSize = 12; if(count <= 0 && count > -2*ridgeSize) { for(int dist = 0; dist < ((ridgeSize*ridgeSize) - (count+ridgeSize)*(count+ridgeSize))/(ridgeSize*2); dist++) { if(y + dist < 255) { index = (x * 16 + z) * 256 + y + dist; chunkArray[index] = world.getBiomeGenForCoords(rangeX, rangeZ).topBlock; } } } if(count > 1 && (y-count > 2)) chunkArray[(x * 16 + z) * 256 + y-count] = world.getBiomeGenForCoords(rangeX, rangeZ).topBlock; break; } } } } } } }