void GrowTree( Random treeRand, int startX, int startY, int startZ ) {
int treeHeight = treeRand.Next( 3 ) + 4;
Block blockUnder = map.GetBlock( startX, startY, startZ - 1 );
if( (blockUnder != Block.Grass) || (startZ >= map.Height - treeHeight - 1) )
return;
for( int z = startZ; z <= startZ + 1 + treeHeight; z++ ) {
int extent = 1;
if( z == startZ ) extent = 0;
if( z >= startZ + 1 + treeHeight - 2 ) extent = 2;
for( int x = startX - extent; (x <= startX + extent); x++ ) {
for( int y = startY - extent; (y <= startY + extent); y++ ) {
if( (x >= 0) && (z >= 0) && (y >= 0) && (x < map.Width) && (z < map.Height) && (y < map.Length) ) {
if( map.GetBlock( x, y, z ) != Block.Air )
return;
} else {
return;
}
}
}
}
map.SetBlock( startX, startY, startZ - 1, Block.Dirt );
for( int z = startZ - 3 + treeHeight; z <= startZ + treeHeight; z++ ) {
int n = z - (startZ + treeHeight);
int foliageExtent = 1 - n/2;
for( int x = startX - foliageExtent; x <= startX + foliageExtent; x++ ) {
int j = x - startX;
for( int y = startY - foliageExtent; y <= startY + foliageExtent; y++ ) {
int i3 = y - startY;
if( (Math.Abs( j ) == foliageExtent) && (Math.Abs( i3 ) == foliageExtent) &&
((treeRand.Next( 2 ) == 0) || (n == 0)) )
continue;
map.SetBlock( x, y, z, Block.Leaves );
}
}
}
for( int z = 0; z < treeHeight; z++ ) {
map.SetBlock( startX, startY, startZ + z, Block.Log );
}
}