From 3b9f99e0d61957c571ba857301d58ad29fb44527 Mon Sep 17 00:00:00 2001 From: paramat Date: Tue, 13 Oct 2015 05:17:33 +0100 Subject: [PATCH] ABMs: Make catch-up behaviour optional Default is true for backwards compatibility Update lua_api.txt --- doc/lua_api.txt | 12 ++++++++---- src/environment.cpp | 16 ++++++++++------ src/environment.h | 2 ++ src/script/cpp_api/s_env.cpp | 7 +++++-- src/script/lua_api/l_env.h | 10 ++++++++-- 5 files changed, 33 insertions(+), 14 deletions(-) diff --git a/doc/lua_api.txt b/doc/lua_api.txt index f0f70d073..489154fb3 100644 --- a/doc/lua_api.txt +++ b/doc/lua_api.txt @@ -3063,10 +3063,14 @@ Definition tables { -- In the following two fields, also group:groupname will work. nodenames = {"default:lava_source"}, - neighbors = {"default:water_source", "default:water_flowing"}, -- (any of these) - -- ^ If left out or empty, any neighbor will do - interval = 1.0, -- (operation interval) - chance = 1, -- (chance of trigger is 1.0/this) + neighbors = {"default:water_source", "default:water_flowing"}, -- Any of these --[[ + ^ If left out or empty, any neighbor will do ]] + interval = 1.0, -- Operation interval in seconds + chance = 1, -- Chance of trigger per-node per-interval is 1.0 / this + catch_up = true, -- If true, catch-up behaviour is enabled --[[ + ^ The chance value is temporarily reduced when returning to + an area to simulate time lost by the area being unattended. + ^ Note chance value can often be reduced to 1 ]] action = func(pos, node, active_object_count, active_object_count_wider), } diff --git a/src/environment.cpp b/src/environment.cpp index 88f25536f..0b37212e5 100644 --- a/src/environment.cpp +++ b/src/environment.cpp @@ -577,17 +577,21 @@ public: i->timer -= trigger_interval; actual_interval = trigger_interval; } - float intervals = actual_interval / trigger_interval; - if(intervals == 0) - continue; float chance = abm->getTriggerChance(); if(chance == 0) chance = 1; ActiveABM aabm; aabm.abm = abm; - aabm.chance = chance / intervals; - if(aabm.chance == 0) - aabm.chance = 1; + if(abm->getSimpleCatchUp()) { + float intervals = actual_interval / trigger_interval; + if(intervals == 0) + continue; + aabm.chance = chance / intervals; + if(aabm.chance == 0) + aabm.chance = 1; + } else { + aabm.chance = chance; + } // Trigger neighbors std::set required_neighbors_s = abm->getRequiredNeighbors(); diff --git a/src/environment.h b/src/environment.h index 17d7ff19d..42faf5f6d 100644 --- a/src/environment.h +++ b/src/environment.h @@ -155,6 +155,8 @@ public: virtual float getTriggerInterval() = 0; // Random chance of (1 / return value), 0 is disallowed virtual u32 getTriggerChance() = 0; + // Whether to modify chance to simulate time lost by an unnattended block + virtual bool getSimpleCatchUp() = 0; // This is called usually at interval for 1/chance of the nodes virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n){}; virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, diff --git a/src/script/cpp_api/s_env.cpp b/src/script/cpp_api/s_env.cpp index 9c733773a..b8717597a 100644 --- a/src/script/cpp_api/s_env.cpp +++ b/src/script/cpp_api/s_env.cpp @@ -143,8 +143,11 @@ void ScriptApiEnv::initializeEnvironment(ServerEnvironment *env) int trigger_chance = 50; getintfield(L, current_abm, "chance", trigger_chance); - LuaABM *abm = new LuaABM(L, id, trigger_contents, - required_neighbors, trigger_interval, trigger_chance); + bool simple_catch_up = true; + getboolfield(L, current_abm, "catch_up", simple_catch_up); + + LuaABM *abm = new LuaABM(L, id, trigger_contents, required_neighbors, + trigger_interval, trigger_chance, simple_catch_up); env->addActiveBlockModifier(abm); diff --git a/src/script/lua_api/l_env.h b/src/script/lua_api/l_env.h index 2e9fab777..4f204da81 100644 --- a/src/script/lua_api/l_env.h +++ b/src/script/lua_api/l_env.h @@ -184,16 +184,18 @@ private: std::set m_required_neighbors; float m_trigger_interval; u32 m_trigger_chance; + bool m_simple_catch_up; public: LuaABM(lua_State *L, int id, const std::set &trigger_contents, const std::set &required_neighbors, - float trigger_interval, u32 trigger_chance): + float trigger_interval, u32 trigger_chance, bool simple_catch_up): m_id(id), m_trigger_contents(trigger_contents), m_required_neighbors(required_neighbors), m_trigger_interval(trigger_interval), - m_trigger_chance(trigger_chance) + m_trigger_chance(trigger_chance), + m_simple_catch_up(simple_catch_up) { } virtual std::set getTriggerContents() @@ -212,6 +214,10 @@ public: { return m_trigger_chance; } + virtual bool getSimpleCatchUp() + { + return m_simple_catch_up; + } virtual void trigger(ServerEnvironment *env, v3s16 p, MapNode n, u32 active_object_count, u32 active_object_count_wider); };