1
0
cuberite-2a/source/cChunkMap.h
faketruth 2892a844d4 Chunks are generated in a separate thread allowing players to keep on playing and chatting while chunks are generated. This means, however, that cWorld::GetChunk() does not always return a chunk and is something you need to be aware of. I am not entirely sure if all this is completely stable, but I think so :O
Chunks are now generated before the player is able to see them. This is done because after a chunks is done generating, some blocks might still need to be set (parts of trees from neighboring chunk), causing more bandwidth to be used (each changed block needs to be sent to clients again) and (fps) lagging the clients when changing a lot of blocks. Calculating ahead fixes these issues.

Separated the placing of foliage (trees and stuff) when generated chunks into a new function GenerateFoliage()
Cleaned up the VS2010 project, now using some VS2010 specific functions like dependencies on projects (no need for setting library dependencies manually). VS2010 project now compiles way faster in Release by using multi threading.

git-svn-id: http://mc-server.googlecode.com/svn/trunk@103 0a769ca7-a7f5-676a-18bf-c427514a06d6
2011-12-24 23:34:30 +00:00

96 lines
2.1 KiB
C++

#pragma once
class cWorld;
class cEntity;
class cChunk;
class cChunkMap
{
public:
cChunkMap( int a_Width, int a_Height, cWorld* a_World );
~cChunkMap();
void AddChunk( cChunk* a_Chunk );
unsigned int MakeHash( int a_X, int a_Z );
cChunk* GetChunk( int a_X, int a_Y, int a_Z );
void RemoveChunk( cChunk* a_Chunk );
void Tick( float a_Dt );
void UnloadUnusedChunks();
bool RemoveEntityFromChunk( cEntity & a_Entity, cChunk* a_CalledFrom = 0 );
void SaveAllChunks();
cWorld* GetWorld() { return m_World; }
private:
class cChunkData
{
public:
cChunkData()
: m_Compressed( 0 )
, m_LiveChunk( 0 )
, m_CompressedSize( 0 )
, m_UncompressedSize( 0 )
{}
char* m_Compressed;
unsigned int m_CompressedSize;
unsigned int m_UncompressedSize;
cChunk* m_LiveChunk;
};
class cChunkLayer
{
public:
cChunkLayer()
: m_Chunks( 0 )
, m_X( 0 )
, m_Z( 0 )
, m_NumChunksLoaded( 0 )
{}
cChunkLayer( int a_NumChunks )
: m_Chunks( new cChunkData[a_NumChunks] )
, m_X( 0 )
, m_Z( 0 )
, m_NumChunksLoaded( 0 )
{}
cChunkData* GetChunk( int a_X, int a_Z );
cChunkData* m_Chunks;
int m_X, m_Z;
int m_NumChunksLoaded;
};
void SaveLayer( cChunkLayer* a_Layer );
cChunkLayer* LoadLayer( int a_LayerX, int a_LayerZ );
cChunkLayer* GetLayerForChunk( int a_ChunkX, int a_ChunkZ );
cChunkLayer* GetLayer( int a_LayerX, int a_LayerZ );
cChunkLayer* AddLayer( const cChunkLayer & a_Layer );
bool RemoveLayer( cChunkLayer* a_Layer );
void CompressChunk( cChunkData* a_ChunkData );
int m_NumLayers;
cChunkLayer* m_Layers;
class cChunkNode
{
public:
cChunkNode();
~cChunkNode();
void push_back( cChunk* a_Chunk );
unsigned int size() { return m_Size; }
unsigned int allocated() { return m_Allocated; }
void resize( unsigned int a_NewSize );
void erase( cChunk* a_Chunk );
cChunk** GetChunks() { return m_Chunks; }
private:
unsigned int m_Size;
unsigned int m_Allocated;
cChunk** m_Chunks;
};
cChunkNode* m_Nodes;
int m_Width, m_Height;
cWorld* m_World;
};