]> git.lizzy.rs Git - minetest.git/commitdiff
Abort active ABM iteration when content changes (#12998)
authorJude Melton-Houghton <jwmhjwmh@gmail.com>
Sun, 27 Nov 2022 20:55:10 +0000 (15:55 -0500)
committerGitHub <noreply@github.com>
Sun, 27 Nov 2022 20:55:10 +0000 (15:55 -0500)
src/serverenvironment.cpp

index 9a58074b112b93baf51c45b169dc1f05dcadc809..045f0599419d15384d3cf3327348e4552f3b4d92 100644 (file)
@@ -888,7 +888,7 @@ class ABMHandler
                for(p0.Y=0; p0.Y<MAP_BLOCKSIZE; p0.Y++)
                for(p0.Z=0; p0.Z<MAP_BLOCKSIZE; p0.Z++)
                {
-                       const MapNode &n = block->getNodeNoCheck(p0);
+                       MapNode n = block->getNodeNoCheck(p0);
                        content_t c = n.getContent();
                        // Cache content types as we go
                        if (!block->contents_cached && !block->do_not_cache_contents) {
@@ -950,6 +950,11 @@ class ABMHandler
                                        active_object_count = countObjects(block, map, active_object_count_wider);
                                        m_env->m_added_objects = 0;
                                }
+
+                               // Update and check node after possible modification
+                               n = block->getNodeNoCheck(p0);
+                               if (n.getContent() != c)
+                                       break;
                        }
                }
                block->contents_cached = !block->do_not_cache_contents;
@@ -1436,6 +1441,9 @@ void ServerEnvironment::step(float dtime)
                ScopeProfiler sp(g_profiler, "SEnv: modify in blocks avg per interval", SPT_AVG);
                TimeTaker timer("modify in active blocks per interval");
 
+               // Shuffle to prevent persistent artifacts of ordering
+               std::shuffle(m_abms.begin(), m_abms.end(), m_rgen);
+
                // Initialize handling of ActiveBlockModifiers
                ABMHandler abmhandler(m_abms, m_cache_abm_interval, this, true);