void MakeOreVeins( Block oreTile, int density ) {
if( density < 1 || density > 500 )
throw new ArgumentOutOfRangeException( "density", "Ore density must be between 1 and 500" );
Random oreVeinRand = new Random( random.Next() );
int maxVeins = genParams.MapWidth*genParams.MapLength*genParams.MapHeight/256/64*density/100;
for( int vein = 0; vein < maxVeins; vein++ ) {
double startX = oreVeinRand.NextDouble()*genParams.MapWidth;
double startY = oreVeinRand.NextDouble()*genParams.MapLength;
double startZ = oreVeinRand.NextDouble()*genParams.MapHeight;
double f4 = oreVeinRand.NextDouble()*Math.PI*2;
double f5 = 0;
double f6 = oreVeinRand.NextDouble()*Math.PI*2;
double f7 = 0;
int m = (int)((oreVeinRand.NextDouble() + oreVeinRand.NextDouble()) * 75 * density / 100);
for( int n = 0; n < m; n++ ) {
startX += Math.Sin( f4 )*Math.Cos( f6 );
startY += Math.Cos( f4 )*Math.Sin( f6 );
startZ += Math.Sin( f6 );
f4 += f5*0.2;
f5 = (f5*0.9) + (oreVeinRand.NextDouble() - oreVeinRand.NextDouble());
f6 = (f6 + f7*0.5)*0.5;
f7 = (f7*0.9) + (oreVeinRand.NextDouble() - oreVeinRand.NextDouble());
double f8 = Math.Sin( n*Math.PI/m )*density/100 + 1;
for( int x = (int)(startX - f8); x <= (int)(startX + f8); x++ ) {
for( int z = (int)(startZ - f8); z <= (int)(startZ + f8); z++ ) {
for( int y = (int)(startY - f8); y <= (int)(startY + f8); y++ ) {
double f9 = x - startX;
double f10 = z - startZ;
double f11 = y - startY;
f9 = f9*f9 + f10*f10*2 + f11*f11;
if( (f9 >= f8*f8) || (x < 1) || (z < 1) || (y < 1) ||
(x >= genParams.MapWidth - 1) || (z >= genParams.MapHeight - 1) ||
(y >= genParams.MapLength - 1) )
continue;
int index = Index( x, y, z );
if( (Block)blocks[index] == Block.Stone ) {
blocks[index] = (byte)oreTile;
}
}
}
}
}
}
}