package zmaster587.advancedRocketry.world.gen;
import java.util.Random;
import zmaster587.advancedRocketry.api.AdvancedRocketryBlocks;
import zmaster587.advancedRocketry.block.BlockCrystal;
import net.minecraft.block.Block;
import net.minecraft.world.World;
import net.minecraft.world.gen.feature.WorldGenerator;
public class WorldGenLargeCrystal extends WorldGenerator {
Block block;
int validMetas;
public WorldGenLargeCrystal() {
this.block = AdvancedRocketryBlocks.blockCrystal;
validMetas = BlockCrystal.numMetas;
}
@Override
public boolean generate(World world, Random rand,
int x, int y, int z) {
Block fillerBlock = world.getBiomeGenForCoords(x, z).fillerBlock;
int height = rand.nextInt(40) + 10;
int edgeRadius = rand.nextInt(4) + 2;
int numDiag = edgeRadius + 1;
int xShear = 1 - (rand.nextInt(6) + 3) / 4; //1/6 lean right, 1/6 lean left, 4/6 no lean
int zShear = 1 - (rand.nextInt(6) + 3) / 4; //1/6 lean right, 1/6 lean left, 4/6 no lean
int meta = rand.nextInt(validMetas);
int currentEdgeRadius;
final float SHAPE = 0.01f + rand.nextFloat()*0.2f;
y-=2;
currentEdgeRadius = (int)((SHAPE*(edgeRadius * height )) + ((1f-SHAPE)*edgeRadius));
//Make the base of the crystal
//Generate the top trapezoid
for(int zOff = -numDiag - currentEdgeRadius/2; zOff <= -currentEdgeRadius/2; zOff++) {
for(int xOff = -numDiag -currentEdgeRadius/2; xOff <= numDiag + currentEdgeRadius/2; xOff++) {
for(int yOff = world.getHeightValue(x + xOff, z + zOff); yOff < y; yOff++) //Fills the gaps under the crystal
world.setBlock(x + xOff, yOff, z + zOff, fillerBlock);
world.setBlock(x + xOff, y, z + zOff, fillerBlock);
}
currentEdgeRadius++;
}
//Generate square segment
for(int zOff = -currentEdgeRadius/2; zOff <= currentEdgeRadius/2; zOff++) {
for(int xOff = -numDiag -currentEdgeRadius/2; xOff <= numDiag + currentEdgeRadius/2; xOff++) {
for(int yOff = world.getHeightValue(x + xOff, z + zOff); yOff < y; yOff++) //Fills the gaps under the crystal
world.setBlock(x + xOff, yOff, z + zOff, fillerBlock);
world.setBlock(x + xOff, y, z + zOff, fillerBlock);
}
}
//Generate the bottom trapezoid
for(int zOff = currentEdgeRadius/2; zOff <= numDiag + currentEdgeRadius/2; zOff++) {
currentEdgeRadius--;
for(int xOff = -numDiag -currentEdgeRadius/2; xOff <= numDiag + currentEdgeRadius/2; xOff++) {
for(int yOff = world.getHeightValue(x + xOff, z + zOff); yOff < y; yOff++) //Fills the gaps under the crystal
world.setBlock(x + xOff, yOff, z + zOff, fillerBlock);
world.setBlock(x + xOff, y, z + zOff, fillerBlock);
}
}
y++;
for(int yOff = 0; yOff < height; yOff++) {
currentEdgeRadius = (int)((SHAPE*(edgeRadius * (height - yOff))) + ((1f-SHAPE)*edgeRadius));
//Generate the top trapezoid
for(int zOff = -numDiag - currentEdgeRadius/2; zOff <= -currentEdgeRadius/2; zOff++) {
for(int xOff = -numDiag -currentEdgeRadius/2; xOff <= numDiag + currentEdgeRadius/2; xOff++) {
world.setBlock(x + xOff + xShear*yOff, y + yOff, z + zOff + zShear*yOff, block, meta, 3);
}
currentEdgeRadius++;
}
//Generate square segment
for(int zOff = -currentEdgeRadius/2; zOff <= currentEdgeRadius/2; zOff++) {
for(int xOff = -numDiag -currentEdgeRadius/2; xOff <= numDiag + currentEdgeRadius/2; xOff++) {
world.setBlock(x + xOff + xShear*yOff, y + yOff, z + zOff + zShear*yOff, block, meta, 3);
}
}
//Generate the bottom trapezoid
for(int zOff = currentEdgeRadius/2; zOff <= numDiag + currentEdgeRadius/2; zOff++) {
currentEdgeRadius--;
for(int xOff = -numDiag -currentEdgeRadius/2; xOff <= numDiag + currentEdgeRadius/2; xOff++) {
world.setBlock(x + xOff + xShear*yOff, y + yOff, z + zOff + zShear*yOff, block, meta, 3);
}
}
}
currentEdgeRadius = (int)((SHAPE*(edgeRadius * height )) + ((1f-SHAPE)*edgeRadius));
//Make some rand noise in the base
//Generate the top trapezoid
for(int zOff = -numDiag - currentEdgeRadius/2; zOff <= -currentEdgeRadius/2; zOff++) {
for(int xOff = -currentEdgeRadius/2; xOff <= currentEdgeRadius/2; xOff++) {
if(rand.nextInt(3) < 1)
world.setBlock(x + xOff, y, z + zOff, fillerBlock);
}
currentEdgeRadius++;
}
//Generate square segment
for(int zOff = -currentEdgeRadius/2; zOff <= currentEdgeRadius/2; zOff++) {
for(int xOff = -currentEdgeRadius/2; xOff <= currentEdgeRadius/2; xOff++) {
if(rand.nextInt(3) < 1)
world.setBlock(x + xOff, y, z + zOff, fillerBlock);
}
}
//Generate the bottom trapezoid
for(int zOff = currentEdgeRadius/2; zOff <= numDiag + currentEdgeRadius/2; zOff++) {
currentEdgeRadius--;
for(int xOff = -currentEdgeRadius/2; xOff <= currentEdgeRadius/2; xOff++) {
if(rand.nextInt(3) < 1)
world.setBlock(x + xOff, y, z + zOff, fillerBlock);
}
}
return true;
}
}