From a632a8abc80155118708108d846f52bbc230f257 Mon Sep 17 00:00:00 2001
From: Jeija <jeija@mesecons.net>
Date: Sun, 19 Jan 2014 13:57:11 +0100
Subject: [PATCH] Fix delayers and disable resuming if not using
 MESECONS_GLOBALSTEP

---
 mesecons/actionqueue.lua |  4 ++--
 mesecons/init.lua        | 26 +++++++++++++++-----------
 mesecons/internal.lua    |  8 ++++++--
 mesecons/settings.lua    |  2 ++
 4 files changed, 25 insertions(+), 15 deletions(-)

diff --git a/mesecons/actionqueue.lua b/mesecons/actionqueue.lua
index 41a587c..cf74d47 100644
--- a/mesecons/actionqueue.lua
+++ b/mesecons/actionqueue.lua
@@ -20,7 +20,7 @@ function mesecon.queue:add_action(pos, func, params, time, overwritecheck, prior
 			priority=priority}
 
 	-- if not using the queue, (MESECONS_GLOBALSTEP off), just execute the function an we're done
-	if not MESECONS_GLOBALSTEP then
+	if not MESECONS_GLOBALSTEP and action.time == 0 then
 		mesecon.queue:execute(action)
 		return
 	end
@@ -64,7 +64,7 @@ end
 local m_time = 0
 minetest.register_globalstep(function (dtime)
 	m_time = m_time + dtime
-	if (m_time < 5) then return end -- don't even try if server has not been running for 2 seconds
+	if (m_time < MESECONS_RESUMETIME) then return end -- don't even try if server has not been running for XY seconds
 	local actions = mesecon:tablecopy(mesecon.queue.actions)
 	local actions_now={}
 
diff --git a/mesecons/init.lua b/mesecons/init.lua
index f528dfd..b5cf68b 100644
--- a/mesecons/init.lua
+++ b/mesecons/init.lua
@@ -80,12 +80,14 @@ mesecon.queue:add_function("receptor_on", function (pos, rules)
 	rules = rules or mesecon.rules.default
 
 	-- if area (any of the rule targets) is not loaded, keep trying and call this again later
-	for _, rule in ipairs(mesecon:flattenrules(rules)) do
-		local np = mesecon:addPosRule(pos, rule)
-		-- if area is not loaded, keep trying
-		if minetest.get_node_or_nil(np) == nil then
-			mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules)
-			return
+	if MESECONS_GLOBALSTEP then -- trying to enable resuming with globalstep disabled would cause an endless loop
+		for _, rule in ipairs(mesecon:flattenrules(rules)) do
+			local np = mesecon:addPosRule(pos, rule)
+			-- if area is not loaded, keep trying
+			if minetest.get_node_or_nil(np) == nil then
+				mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules)
+				return
+			end
 		end
 	end
 
@@ -107,11 +109,13 @@ mesecon.queue:add_function("receptor_off", function (pos, rules)
 	rules = rules or mesecon.rules.default
 
 	-- if area (any of the rule targets) is not loaded, keep trying and call this again later
-	for _, rule in ipairs(mesecon:flattenrules(rules)) do
-		local np = mesecon:addPosRule(pos, rule)
-		if minetest.get_node_or_nil(np) == nil then
-			mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules)
-			return
+	if MESECONS_GLOBALSTEP then
+		for _, rule in ipairs(mesecon:flattenrules(rules)) do
+			local np = mesecon:addPosRule(pos, rule)
+			if minetest.get_node_or_nil(np) == nil then
+				mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules)
+				return
+			end
 		end
 	end
 
diff --git a/mesecons/internal.lua b/mesecons/internal.lua
index 32a28b2..3975b6a 100644
--- a/mesecons/internal.lua
+++ b/mesecons/internal.lua
@@ -412,7 +412,9 @@ function mesecon:turnon(pos, rulename, recdepth)
 end
 
 mesecon.queue:add_function("turnon", function (pos, rulename, recdepth)
-	mesecon:turnon(pos, rulename, recdepth)
+	if (MESECONS_GLOBALSTEP) then -- do not resume if we don't use globalstep - that would cause an endless loop
+		mesecon:turnon(pos, rulename, recdepth)
+	end
 end)
 
 function mesecon:turnoff(pos, rulename, recdepth)
@@ -453,7 +455,9 @@ function mesecon:turnoff(pos, rulename, recdepth)
 end
 
 mesecon.queue:add_function("turnoff", function (pos, rulename, recdepth)
-	mesecon:turnoff(pos, rulename, recdepth)
+	if (MESECONS_GLOBALSTEP) then -- do not resume if we don't use globalstep - that would cause an endless loop
+		mesecon:turnoff(pos, rulename, recdepth)
+	end
 end)
 
 
diff --git a/mesecons/settings.lua b/mesecons/settings.lua
index e35bb1e..593a79b 100644
--- a/mesecons/settings.lua
+++ b/mesecons/settings.lua
@@ -7,3 +7,5 @@ PISTON_MAXIMUM_PUSH = 15
 MOVESTONE_MAXIMUM_PUSH = 100
 MESECONS_GLOBALSTEP = true	-- true = receptors/effectors won't be updated
 				-- until next globalstep, decreases server load
+MESECONS_RESUMETIME = 4		-- time to wait when starting the server before
+				-- processing the ActionQueue, don't set this too low
-- 
GitLab