summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/Chunk.cpp18
-rw-r--r--src/Chunk.h2
2 files changed, 9 insertions, 11 deletions
diff --git a/src/Chunk.cpp b/src/Chunk.cpp
index e4a4dd661..2140bf7f1 100644
--- a/src/Chunk.cpp
+++ b/src/Chunk.cpp
@@ -812,23 +812,21 @@ void cChunk::BroadcastPendingBlockChanges(void)
void cChunk::CheckBlocks()
{
- if (m_ToTickBlocks.empty())
- {
- return;
- }
- std::vector<Vector3i> ToTickBlocks;
- std::swap(m_ToTickBlocks, ToTickBlocks);
-
cChunkInterface ChunkInterface(m_World->GetChunkMap());
cBlockInServerPluginInterface PluginInterface(*m_World);
- for (std::vector<Vector3i>::const_iterator itr = ToTickBlocks.begin(), end = ToTickBlocks.end(); itr != end; ++itr)
+ // Process a limited number of blocks since cBlockHandler::Check may queue more to tick
+ auto Count = m_ToTickBlocks.size();
+
+ while (Count != 0)
{
- Vector3i Pos = (*itr);
+ Vector3i Pos = m_ToTickBlocks.front();
+ m_ToTickBlocks.pop();
+ Count--;
cBlockHandler * Handler = BlockHandler(GetBlock(Pos));
Handler->Check(ChunkInterface, PluginInterface, Pos, *this);
- } // for itr - ToTickBlocks[]
+ }
}
diff --git a/src/Chunk.h b/src/Chunk.h
index 0965f1997..7e09ce8b6 100644
--- a/src/Chunk.h
+++ b/src/Chunk.h
@@ -594,7 +594,7 @@ private:
bool m_IsSaving; // True if the chunk is being saved
bool m_HasLoadFailed; // True if chunk failed to load and hasn't been generated yet since then
- std::vector<Vector3i> m_ToTickBlocks;
+ std::queue<Vector3i> m_ToTickBlocks;
sSetBlockVector m_PendingSendBlocks; ///< Blocks that have changed and need to be sent to all clients
// A critical section is not needed, because all chunk access is protected by its parent ChunkMap's csLayers