fCraft.MapGeneratorOld.AddSingleCave C# (CSharp) Method

AddSingleCave() private static method

private static AddSingleCave ( Random rand, Map map, byte bedrockType, byte fillingType, int length, double maxDiameter ) : void
rand System.Random
map Map
bedrockType byte
fillingType byte
length int
maxDiameter double
return void
        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;
                            }
                        }
                    }
                }
            }
        }