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 ToTickBlocks; - std::swap(m_ToTickBlocks, ToTickBlocks); - cChunkInterface ChunkInterface(m_World->GetChunkMap()); cBlockInServerPluginInterface PluginInterface(*m_World); - for (std::vector::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 m_ToTickBlocks; + std::queue 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