From 4f17362aeb80e5339c58a5d3b0fbaeb88d9e701c Mon Sep 17 00:00:00 2001 From: "madmaxoft@gmail.com" Date: Mon, 13 Feb 2012 21:47:03 +0000 Subject: Rewritten most of the code for multithreading; still not 100%, but getting there. If this commit proves to be too problematic, we can always undo it. git-svn-id: http://mc-server.googlecode.com/svn/trunk@251 0a769ca7-a7f5-676a-18bf-c427514a06d6 --- source/cChunkMap.h | 89 +++++++++++++++++++++++++----------------------------- 1 file changed, 41 insertions(+), 48 deletions(-) (limited to 'source/cChunkMap.h') diff --git a/source/cChunkMap.h b/source/cChunkMap.h index dfccf8213..e43c095d0 100644 --- a/source/cChunkMap.h +++ b/source/cChunkMap.h @@ -1,91 +1,84 @@ +// cChunkMap.h + +// Interfaces to the cChunkMap class representing the chunk storage for a single world + #pragma once +#include "cChunk.h" + class cWorld; class cEntity; -class cChunk; class MTRand; - class cChunkMap { public: + + static const int LAYER_SIZE = 32; + cChunkMap(cWorld* a_World ); ~cChunkMap(); - void AddChunk( cChunk* a_Chunk ); - - cChunk* GetChunk( int a_X, int a_Y, int a_Z ); - void RemoveChunk( cChunk* a_Chunk ); + 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 void Tick( float a_Dt, MTRand & a_TickRand ); void UnloadUnusedChunks(); - bool RemoveEntityFromChunk( cEntity & a_Entity, cChunk* a_CalledFrom = 0 ); void SaveAllChunks(); cWorld* GetWorld() { return m_World; } - int GetNumChunks(); + int GetNumChunks(void); 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 ); + 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; } - cChunkData * m_Chunks; - int m_X, m_Z; + 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; int m_NumChunksLoaded; }; + + typedef std::list 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[] - 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 ); + 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 ); - int m_NumLayers; - cChunkLayer* m_Layers; + cCriticalSection m_CSLayers; + cChunkLayerList m_Layers; - cWorld* m_World; + cWorld * m_World; }; -- cgit v1.2.3