Files
cuberite-2a/source/cChunkMap.h
T

87 lines
2.0 KiB
C++
Raw Normal View History

// cChunkMap.h
// Interfaces to the cChunkMap class representing the chunk storage for a single world
2011-10-03 18:41:19 +00:00
#pragma once
#include "cChunk.h"
class cWorld;
2011-10-03 18:41:19 +00:00
class cEntity;
class MTRand;
2011-10-03 18:41:19 +00:00
class cChunkMap
{
public:
static const int LAYER_SIZE = 32;
2012-01-29 21:40:21 +00:00
cChunkMap(cWorld* a_World );
2011-10-03 18:41:19 +00:00
~cChunkMap();
cChunkPtr GetChunk ( int a_X, int a_Y, int a_Z ); // Also queues the chunk for loading / generating if not valid
cChunkPtr GetChunkNoGen( int a_X, int a_Y, int a_Z ); // Also queues the chunk for loading if not valid; doesn't generate
2011-10-03 18:41:19 +00:00
void Tick( float a_Dt, MTRand & a_TickRand );
2011-10-03 18:41:19 +00:00
void UnloadUnusedChunks();
void SaveAllChunks();
cWorld* GetWorld() { return m_World; }
2012-01-01 16:20:52 +00:00
int GetNumChunks(void);
2011-10-03 18:41:19 +00:00
private:
2011-10-03 18:41:19 +00:00
class cChunkLayer
{
public:
cChunkLayer(int a_LayerX, int a_LayerZ, cChunkMap * a_Parent);
/// Always returns an assigned chunkptr, but the chunk needn't be valid (loaded / generated) - callers must check
cChunkPtr GetChunk( int a_ChunkX, int a_ChunkZ );
int GetX(void) const {return m_LayerX; }
int GetZ(void) const {return m_LayerZ; }
int GetNumChunksLoaded(void) const {return m_NumChunksLoaded; }
void Save(void);
void UnloadUnusedChunks(void);
void Tick( float a_Dt, MTRand & a_TickRand );
protected:
cChunkPtr m_Chunks[LAYER_SIZE * LAYER_SIZE];
int m_LayerX;
int m_LayerZ;
cChunkMap * m_Parent;
2011-10-03 18:41:19 +00:00
int m_NumChunksLoaded;
};
typedef std::list<cChunkLayer *> cChunkLayerList;
// TODO: Use smart pointers for cChunkLayerList as well, so that ticking and saving needn't lock the entire layerlist
// This however means that cChunkLayer needs to interlock its m_Chunks[]
2011-10-03 18:41:19 +00:00
cChunkLayer * GetLayerForChunk( int a_ChunkX, int a_ChunkZ ); // Creates the layer if it doesn't already exist
cChunkLayer * GetLayer( int a_LayerX, int a_LayerZ ); // Creates the layer if it doesn't already exist
void RemoveLayer( cChunkLayer* a_Layer );
2011-10-03 18:41:19 +00:00
cCriticalSection m_CSLayers;
cChunkLayerList m_Layers;
2011-10-03 18:41:19 +00:00
cWorld * m_World;
};