From 1d44a98f2f6013c0f7ce82215c1faa11ad4a0579 Mon Sep 17 00:00:00 2001
From: Perttu Ahola <celeron55@gmail.com>
Date: Fri, 27 Jul 2012 13:45:49 +0300
Subject: [PATCH] ABM and liquid overload skip

---
 src/environment.cpp | 11 +++++++++--
 src/environment.h   |  1 +
 src/map.cpp         |  2 +-
 3 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/src/environment.cpp b/src/environment.cpp
index 571980498..e3e621065 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -326,6 +326,7 @@ ServerEnvironment::ServerEnvironment(ServerMap *map, lua_State *L,
 	m_emerger(emerger),
 	m_random_spawn_timer(3),
 	m_send_recommended_timer(0),
+	m_active_block_interval_overload_skip(0),
 	m_game_time(0),
 	m_game_time_fraction_counter(0)
 {
@@ -1095,7 +1096,12 @@ void ServerEnvironment::step(float dtime)
 	
 	const float abm_interval = 1.0;
 	if(m_active_block_modifier_interval.step(dtime, abm_interval))
-	{
+	do{ // breakable
+		if(m_active_block_interval_overload_skip > 0){
+			ScopeProfiler sp(g_profiler, "SEnv: ABM overload skips");
+			m_active_block_interval_overload_skip--;
+			break;
+		}
 		ScopeProfiler sp(g_profiler, "SEnv: modify in blocks avg /1s", SPT_AVG);
 		TimeTaker timer("modify in active blocks");
 		
@@ -1128,8 +1134,9 @@ void ServerEnvironment::step(float dtime)
 			infostream<<"WARNING: active block modifiers took "
 					<<time_ms<<"ms (longer than "
 					<<max_time_ms<<"ms)"<<std::endl;
+			m_active_block_interval_overload_skip = (time_ms / max_time_ms) + 1;
 		}
-	}
+	}while(0);
 	
 	/*
 		Step script environment (run global on_step())
diff --git a/src/environment.h b/src/environment.h
index 6c52b003d..bb1da2461 100644
--- a/src/environment.h
+++ b/src/environment.h
@@ -360,6 +360,7 @@ private:
 	IntervalLimiter m_active_blocks_management_interval;
 	IntervalLimiter m_active_block_modifier_interval;
 	IntervalLimiter m_active_blocks_nodemetadata_interval;
+	int m_active_block_interval_overload_skip;
 	// Time from the beginning of the game in seconds.
 	// Incremented in step().
 	u32 m_game_time;
diff --git a/src/map.cpp b/src/map.cpp
index 8aa73efbe..f8f0d017f 100644
--- a/src/map.cpp
+++ b/src/map.cpp
@@ -1636,7 +1636,7 @@ void Map::transformLiquids(core::map<v3s16, MapBlock*> & modified_blocks)
 	while(m_transforming_liquid.size() != 0)
 	{
 		// This should be done here so that it is done when continue is used
-		if(loopcount >= initial_size * 3)
+		if(loopcount >= initial_size || loopcount >= 1000)
 			break;
 		loopcount++;
 
-- 
2.25.1