diff options
-rw-r--r-- | source/WorldStorage.cpp | 26 | ||||
-rw-r--r-- | source/WorldStorage.h | 3 | ||||
-rw-r--r-- | source/cServer.cpp | 2 | ||||
-rw-r--r-- | source/cWorld.cpp | 4 |
4 files changed, 32 insertions, 3 deletions
diff --git a/source/WorldStorage.cpp b/source/WorldStorage.cpp index ce1c11322..b75520448 100644 --- a/source/WorldStorage.cpp +++ b/source/WorldStorage.cpp @@ -19,6 +19,13 @@ +/// If a chunk with this Y coord is de-queued, it is a signal to emit the saved-all message (cWorldStorage::QueueSavedMessage()) +#define CHUNK_Y_MESSAGE 2 + + + + + /// Example storage schema - forgets all chunks ;) class cWSSForgetful : public cWSSchema @@ -175,6 +182,20 @@ void cWorldStorage::QueueSaveChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ) +void cWorldStorage::QueueSavedMessage(void) +{ + // Pushes a special coord pair into the queue, signalizing a message instead: + { + cCSLock Lock(m_CSQueues); + m_SaveQueue.push_back(cChunkCoords(0, CHUNK_Y_MESSAGE, 0)); + } + m_Event.Set(); +} + + + + + void cWorldStorage::UnqueueLoad(int a_ChunkX, int a_ChunkY, int a_ChunkZ) { cCSLock Lock(m_CSQueues); @@ -323,6 +344,11 @@ bool cWorldStorage::SaveOneChunk(void) } HasMore = !m_SaveQueue.empty(); } + if (Save.m_ChunkY == CHUNK_Y_MESSAGE) + { + LOGINFO("Saved all chunks in world %s", m_World->GetName().c_str()); + return HasMore; + } if (ShouldSave && m_World->IsChunkValid(Save.m_ChunkX, Save.m_ChunkY, Save.m_ChunkZ)) { m_World->MarkChunkSaving(Save.m_ChunkX, Save.m_ChunkY, Save.m_ChunkZ); diff --git a/source/WorldStorage.h b/source/WorldStorage.h index b2daba059..48036ed11 100644 --- a/source/WorldStorage.h +++ b/source/WorldStorage.h @@ -65,6 +65,9 @@ public: void QueueLoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ, bool a_Generate); // Queues the chunk for loading; if not loaded, the chunk will be generated if a_Generate is true void QueueSaveChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ); + /// Signals that a message should be output to the console when all the chunks have been saved + void QueueSavedMessage(void); + /// Loads the chunk specified; returns true on success, false on failure bool LoadChunk(int a_ChunkX, int a_ChunkY, int a_ChunkZ); diff --git a/source/cServer.cpp b/source/cServer.cpp index 15f19eeed..78bfc8953 100644 --- a/source/cServer.cpp +++ b/source/cServer.cpp @@ -498,7 +498,7 @@ void cServer::ServerCommand( const char * a_Cmd ) } if( split[0].compare( "save-all" ) == 0 ) { - cRoot::Get()->SaveAllChunks(); // TODO - Force ALL worlds to save their chunks + cRoot::Get()->SaveAllChunks(); return; } if (split[0].compare("unload") == 0) diff --git a/source/cWorld.cpp b/source/cWorld.cpp index 54931d104..5bb1e8094 100644 --- a/source/cWorld.cpp +++ b/source/cWorld.cpp @@ -1769,10 +1769,10 @@ bool cWorld::ForEachChunkInRect(int a_MinChunkX, int a_MaxChunkX, int a_MinChunk void cWorld::SaveAllChunks(void) { - LOG("Saving all chunks..."); + LOGINFO("Saving all chunks..."); m_LastSave = m_Time; m_ChunkMap->SaveAllChunks(); - LOG("All chunks saved."); + m_Storage.QueueSavedMessage(); } |