From d1620a6f39110064b50c5e15571f97b1671cfcd7 Mon Sep 17 00:00:00 2001 From: FaceDeer Date: Fri, 15 Jul 2022 16:58:54 -0600 Subject: [PATCH] replace bloodthorn ABM with node timers, much more efficient. --- df_trees/blood_thorn.lua | 49 ++++++++++++++++++++++++++++++++------- df_trees/config.lua | 4 +--- df_trees/settingtypes.txt | 3 +-- 3 files changed, 42 insertions(+), 14 deletions(-) diff --git a/df_trees/blood_thorn.lua b/df_trees/blood_thorn.lua index bb8d02b..038eb74 100644 --- a/df_trees/blood_thorn.lua +++ b/df_trees/blood_thorn.lua @@ -26,6 +26,9 @@ local blood_thorn_after_dig = function(pos, oldnode, oldmetadata, digger) end end +local blood_thorn_min_delay = df_trees.config.blood_thorn_delay_multiplier*df_trees.config.tree_min_growth_delay +local blood_thorn_max_delay = df_trees.config.blood_thorn_delay_multiplier*df_trees.config.tree_max_growth_delay + minetest.register_node("df_trees:blood_thorn", { description = S("Blood Thorn Stem"), _doc_items_longdesc = df_trees.doc.blood_thorn_desc, @@ -40,6 +43,35 @@ minetest.register_node("df_trees:blood_thorn", { is_ground_content = false, on_place = minetest.rotate_node, after_dig_node = blood_thorn_after_dig, + + on_construct = function(pos) + minetest.get_node_timer(pos):start(math.random(blood_thorn_min_delay, blood_thorn_max_delay)) + end, + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + local below = {x=pos.x, y=pos.y-1, z=pos.z} + local below_node = minetest.get_node(below) + while below_node.name == "df_trees:blood_thorn" do + -- if you chop down a bloodthorn it can start growing again + minetest.get_node_timer(below):start(math.random(blood_thorn_min_delay, blood_thorn_max_delay)) + below.y = below.y-1 + below_node = minetest.get_node(below) + end + end, + + on_timer = function(pos, elapsed) + while elapsed > blood_thorn_max_delay do + -- catch up if the block was unloaded for a long time + elapsed = elapsed - blood_thorn_max_delay + if not df_trees.grow_blood_thorn(vector.new(pos), minetest.get_node(pos)) then + return + end + end + if df_trees.grow_blood_thorn(vector.new(pos), minetest.get_node(pos)) then + minetest.get_node_timer(pos):start(math.random(blood_thorn_min_delay, blood_thorn_max_delay)) + end + end, + }) minetest.register_node("df_trees:blood_thorn_dead", { @@ -222,15 +254,14 @@ function df_trees.grow_blood_thorn(pos, node) return true end -minetest.register_abm({ - label = "Grow Blood Thorn", - nodenames = {"df_trees:blood_thorn"}, - catch_up = true, - interval = df_trees.config.blood_thorn_growth_interval, - chance = df_trees.config.blood_thorn_growth_chance, - action = function(pos, node) - df_trees.grow_blood_thorn(pos, node) - end +minetest.register_lbm({ + label = "Start timers for bloodthorn nodes that used to depend on the ABM", + name = "df_trees:start_bloodthorn_timers", + nodenames = {"df_trees:blood_thorn"}, + run_at_every_load = false, + action = function(pos, node) + minetest.get_node_timer(pos):start(math.random(blood_thorn_min_delay, blood_thorn_max_delay)) + end, }) function df_trees.spawn_blood_thorn(pos) diff --git a/df_trees/config.lua b/df_trees/config.lua index 60f4d0f..c45f015 100644 --- a/df_trees/config.lua +++ b/df_trees/config.lua @@ -31,6 +31,7 @@ local trees = { {name="nether_cap", delay_multiplier = 1}, {name="goblin_cap", delay_multiplier = 1}, {name="tower_cap", delay_multiplier = 1}, + {name="blood_thorn", delay_multiplier = 1}, } --Trees @@ -42,9 +43,6 @@ for _, tree in pairs(trees) do setting("float", tree.name.."_delay_multiplier", tree.delay_multiplier, tree.name.." growth delay multiplier") end -setting("int", "blood_thorn_growth_interval", 12, "blood_thorn growth ABM interval") -setting("int", "blood_thorn_growth_chance", 83, "blood_thorn growth ABM chance") - if minetest.get_modpath("tnt") then df_trees.config.enable_tnt = minetest.settings:get_bool("enable_tnt") if df_trees.config.enable_tnt == nil then diff --git a/df_trees/settingtypes.txt b/df_trees/settingtypes.txt index 78ea24d..0a18f4d 100644 --- a/df_trees/settingtypes.txt +++ b/df_trees/settingtypes.txt @@ -7,5 +7,4 @@ dfcaverns_black_cap_delay_multiplier (black_cap growth delay multiplier) float 1 dfcaverns_nether_cap_delay_multiplier (nether_cap growth delay multiplier) float 1 dfcaverns_goblin_cap_delay_multiplier (goblin_cap growth delay multiplier) float 1 dfcaverns_tower_cap_delay_multiplier (tower_cap growth delay multiplier) float 1 -dfcaverns_blood_thorn_growth_interval (blood_thorn growth ABM interval) int 12 -dfcaverns_blood_thorn_growth_chance (blood_thorn growth ABM chance) int 83 +dfcaverns_blood_thorn_delay_multiplier (tower_cap growth delay multiplier) float 1 \ No newline at end of file