|
@@ -250,20 +250,42 @@ void Chunk::save( Framework::StreamWriter* zWriter )
|
|
|
|
|
|
void Chunk::removeUnusedBlocks()
|
|
|
{
|
|
|
- bool removed = true;
|
|
|
- while( removed )
|
|
|
+ for( int i = 0; i < CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT; i++ )
|
|
|
{
|
|
|
- removed = false;
|
|
|
- for( int i = 0; i < CHUNK_SIZE * CHUNK_SIZE * WORLD_HEIGHT; i++ )
|
|
|
+ if( blocks[ i ] )
|
|
|
{
|
|
|
- if( blocks[ i ] && !blocks[ i ]->isVisible() )
|
|
|
+ if( !blocks[ i ]->isVisible() )
|
|
|
{
|
|
|
int x = (i / WORLD_HEIGHT) / CHUNK_SIZE;
|
|
|
int y = (i / WORLD_HEIGHT) % CHUNK_SIZE;
|
|
|
int z = i % WORLD_HEIGHT;
|
|
|
putBlockAt( { x,y,z }, 0 );
|
|
|
putBlockTypeAt( { x, y, z }, NoBlockBlockType::ID );
|
|
|
- removed = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if( blockIds[ i ] )
|
|
|
+ {
|
|
|
+ int x = (i / WORLD_HEIGHT) / CHUNK_SIZE;
|
|
|
+ int y = (i / WORLD_HEIGHT) % CHUNK_SIZE;
|
|
|
+ int z = i % WORLD_HEIGHT;
|
|
|
+ bool visible = 0;
|
|
|
+ if( CONST_BLOCK( 0, blockIds[ i ] )->isTransparent() || CONST_BLOCK( 0, blockIds[ i ] )->isPassable() )
|
|
|
+ visible = 1;
|
|
|
+ else
|
|
|
+ {
|
|
|
+ for( int d = 0; d < 6 && !visible; d++ )
|
|
|
+ {
|
|
|
+ auto n = zBlockNeighbor( getDirection( (Directions)getFromIndex( d ) ) + Framework::Vec3<int>( x, y, z ) );
|
|
|
+ if( n.isA() && (((Block*)n)->isPassable() || ((Block*)n)->isTransparent()) )
|
|
|
+ visible = 1;
|
|
|
+ if( n.isB() && n != NoBlockBlockType::ID && CONST_BLOCK( 0, n )->isTransparent() )
|
|
|
+ visible = 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if( !visible )
|
|
|
+ {
|
|
|
+ putBlockAt( { x,y,z }, 0 );
|
|
|
+ putBlockTypeAt( { x, y, z }, NoBlockBlockType::ID );
|
|
|
}
|
|
|
}
|
|
|
}
|