private static void AddSingleCave( Random rand, Map map, byte bedrockType, byte fillingType, int length, double maxDiameter )
{
int startX = rand.Next( 0, map.Width );
int startY = rand.Next( 0, map.Length );
int startZ = rand.Next( 0, map.Height );
int k1;
for ( k1 = 0; map.Blocks[startX + map.Width * map.Length * ( map.Height - 1 - startZ ) + map.Width * startY] != bedrockType && k1 < 10000; k1++ ) {
startX = rand.Next( 0, map.Width );
startY = rand.Next( 0, map.Length );
startZ = rand.Next( 0, map.Height );
}
if ( k1 >= 10000 )
return;
int x = startX;
int y = startY;
int z = startZ;
for ( int k2 = 0; k2 < length; k2++ ) {
int diameter = ( int )( maxDiameter * rand.NextDouble() * map.Width );
if ( diameter < 1 )
diameter = 2;
int radius = diameter / 2;
if ( radius == 0 )
radius = 1;
x += ( int )( 0.7 * ( rand.NextDouble() - 0.5D ) * diameter );
y += ( int )( 0.7 * ( rand.NextDouble() - 0.5D ) * diameter );
z += ( int )( 0.7 * ( rand.NextDouble() - 0.5D ) * diameter );
for ( int j3 = 0; j3 < diameter; j3++ ) {
for ( int k3 = 0; k3 < diameter; k3++ ) {
for ( int l3 = 0; l3 < diameter; l3++ ) {
if ( ( j3 - radius ) * ( j3 - radius ) + ( k3 - radius ) * ( k3 - radius ) + ( l3 - radius ) * ( l3 - radius ) >= radius * radius ||
x + j3 >= map.Width || z + k3 >= map.Height || y + l3 >= map.Length ||
x + j3 < 0 || z + k3 < 0 || y + l3 < 0 ) {
continue;
}
int index = x + j3 + map.Width * map.Length * ( map.Height - 1 - ( z + k3 ) ) + map.Width * ( y + l3 );
if ( map.Blocks[index] == bedrockType ) {
map.Blocks[index] = fillingType;
}
if ( ( fillingType == 10 || fillingType == 11 || fillingType == 8 || fillingType == 9 ) &&
z + k3 < startZ ) {
map.Blocks[index] = 0;
}
}
}
}
}
}