|
@@ -6,6 +6,7 @@
|
|
|
|
|
|
using namespace Framework;
|
|
using namespace Framework;
|
|
|
|
|
|
|
|
+#define MAX_VIEW_DISTANCE CHUNK_SIZE * 8
|
|
|
|
|
|
Dimension::Dimension( int id )
|
|
Dimension::Dimension( int id )
|
|
: dimensionId( id ),
|
|
: dimensionId( id ),
|
|
@@ -77,11 +78,11 @@ void Dimension::addEntity( Entity* entity )
|
|
entities->add( entity );
|
|
entities->add( entity );
|
|
}
|
|
}
|
|
|
|
|
|
-void Dimension::addChunk( Chunk* chunk )
|
|
|
|
|
|
+void Dimension::setChunk( Chunk* chunk, Punkt center )
|
|
{
|
|
{
|
|
char addr[ 8 ];
|
|
char addr[ 8 ];
|
|
- getAddrOfWorld( chunk->getCenter(), addr );
|
|
|
|
- Chunk *old = chunks->z( addr, 8 );
|
|
|
|
|
|
+ getAddrOfWorld( center, addr );
|
|
|
|
+ Chunk* old = chunks->z( addr, 8 );
|
|
if( old )
|
|
if( old )
|
|
{
|
|
{
|
|
for( int i = 0; i < chunkList.getEintragAnzahl(); i++ )
|
|
for( int i = 0; i < chunkList.getEintragAnzahl(); i++ )
|
|
@@ -94,34 +95,42 @@ void Dimension::addChunk( Chunk* chunk )
|
|
}
|
|
}
|
|
}
|
|
}
|
|
chunks->set( addr, 8, chunk );
|
|
chunks->set( addr, 8, chunk );
|
|
- chunkList.add( chunk );
|
|
|
|
- getAddrOfWorld( chunk->getCenter() + Punkt( CHUNK_SIZE, 0 ), addr );
|
|
|
|
|
|
+ if( chunk )
|
|
|
|
+ {
|
|
|
|
+ chunkList.add( chunk );
|
|
|
|
+ chunk->setAdded();
|
|
|
|
+ }
|
|
|
|
+ getAddrOfWorld( center + Punkt( CHUNK_SIZE, 0 ), addr );
|
|
Chunk* zChunk = chunks->z( addr, 8 );
|
|
Chunk* zChunk = chunks->z( addr, 8 );
|
|
if( zChunk )
|
|
if( zChunk )
|
|
{
|
|
{
|
|
zChunk->setNeighbor( WEST, chunk );
|
|
zChunk->setNeighbor( WEST, chunk );
|
|
- chunk->setNeighbor( EAST, chunk );
|
|
|
|
|
|
+ if( chunk )
|
|
|
|
+ chunk->setNeighbor( EAST, zChunk );
|
|
}
|
|
}
|
|
- getAddrOfWorld( chunk->getCenter() + Punkt( -CHUNK_SIZE, 0 ), addr );
|
|
|
|
|
|
+ getAddrOfWorld( center + Punkt( -CHUNK_SIZE, 0 ), addr );
|
|
zChunk = chunks->z( addr, 8 );
|
|
zChunk = chunks->z( addr, 8 );
|
|
if( zChunk )
|
|
if( zChunk )
|
|
{
|
|
{
|
|
zChunk->setNeighbor( EAST, chunk );
|
|
zChunk->setNeighbor( EAST, chunk );
|
|
- chunk->setNeighbor( WEST, chunk );
|
|
|
|
|
|
+ if( chunk )
|
|
|
|
+ chunk->setNeighbor( WEST, zChunk );
|
|
}
|
|
}
|
|
- getAddrOfWorld( chunk->getCenter() + Punkt( 0, CHUNK_SIZE ), addr );
|
|
|
|
|
|
+ getAddrOfWorld( center + Punkt( 0, CHUNK_SIZE ), addr );
|
|
zChunk = chunks->z( addr, 8 );
|
|
zChunk = chunks->z( addr, 8 );
|
|
if( zChunk )
|
|
if( zChunk )
|
|
{
|
|
{
|
|
zChunk->setNeighbor( NORTH, chunk );
|
|
zChunk->setNeighbor( NORTH, chunk );
|
|
- chunk->setNeighbor( SOUTH, chunk );
|
|
|
|
|
|
+ if( chunk )
|
|
|
|
+ chunk->setNeighbor( SOUTH, zChunk );
|
|
}
|
|
}
|
|
- getAddrOfWorld( chunk->getCenter() + Punkt( 0, -CHUNK_SIZE ), addr );
|
|
|
|
|
|
+ getAddrOfWorld( center + Punkt( 0, -CHUNK_SIZE ), addr );
|
|
zChunk = chunks->z( addr, 8 );
|
|
zChunk = chunks->z( addr, 8 );
|
|
if( zChunk )
|
|
if( zChunk )
|
|
{
|
|
{
|
|
zChunk->setNeighbor( SOUTH, chunk );
|
|
zChunk->setNeighbor( SOUTH, chunk );
|
|
- chunk->setNeighbor( NORTH, chunk );
|
|
|
|
|
|
+ if( chunk )
|
|
|
|
+ chunk->setNeighbor( NORTH, zChunk );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -133,4 +142,22 @@ int Dimension::getDimensionId() const
|
|
bool Dimension::hasChunck( int x, int y ) const
|
|
bool Dimension::hasChunck( int x, int y ) const
|
|
{
|
|
{
|
|
return zChunk( Punkt( x, y ) );
|
|
return zChunk( Punkt( x, y ) );
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Dimension::removeDistantChunks( Punkt wPos )
|
|
|
|
+{
|
|
|
|
+ Array<int> removed;
|
|
|
|
+ int index = 0;
|
|
|
|
+ for( Chunk* chunk : chunkList )
|
|
|
|
+ {
|
|
|
|
+ if( (chunk->getCenter() - wPos).getLength() > MAX_VIEW_DISTANCE )
|
|
|
|
+ removed.add( index, 0 );
|
|
|
|
+ index++;
|
|
|
|
+ }
|
|
|
|
+ for( int i : removed )
|
|
|
|
+ {
|
|
|
|
+ Chunk* chunk = chunkList.get( i );
|
|
|
|
+ chunk->prepareRemove();
|
|
|
|
+ setChunk( 0, chunk->getCenter() );
|
|
|
|
+ }
|
|
}
|
|
}
|