From b9c5b1af5ea88e51dda914e5eaca0bdd42db8ed1 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sat, 20 Jun 2015 21:24:55 +0200 Subject: [PATCH] Updated plantlife --- mods/plantlife_modpack/along_shore/init.lua | 2 +- .../nature_classic/blossom.lua | 26 +++++--- .../nature_classic/global_function.lua | 63 ++++++++++++------- .../plantlife_modpack/nature_classic/init.lua | 10 +-- mods/plantlife_modpack/trunks/init.lua | 2 +- mods/plantlife_modpack/woodsoils/init.lua | 2 +- mods/soundset/README.md | 0 mods/soundset/init.lua | 0 8 files changed, 67 insertions(+), 38 deletions(-) mode change 100644 => 100755 mods/soundset/README.md mode change 100644 => 100755 mods/soundset/init.lua diff --git a/mods/plantlife_modpack/along_shore/init.lua b/mods/plantlife_modpack/along_shore/init.lua index a83d0f9b..8b957dd1 100755 --- a/mods/plantlife_modpack/along_shore/init.lua +++ b/mods/plantlife_modpack/along_shore/init.lua @@ -6,4 +6,4 @@ local mname = "along_shore" ----------------------------------------------------------------------------------------------- minetest.log("action", "[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...") ------------------------------------------------------------------------------------------------ +----------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/mods/plantlife_modpack/nature_classic/blossom.lua b/mods/plantlife_modpack/nature_classic/blossom.lua index 5c7571af..7e419105 100755 --- a/mods/plantlife_modpack/nature_classic/blossom.lua +++ b/mods/plantlife_modpack/nature_classic/blossom.lua @@ -30,35 +30,45 @@ minetest.register_craft({ -- these ABMs can get heavy, so just enqueue the nodes -- Adding Blossoms +-- Limit mass changes after block has not been loaded for some time: +-- Run ABM with higher frequency, but don't enqueue all blocks minetest.register_abm({ nodenames = { nature.blossom_leaves }, - interval = nature.blossom_delay, - chance = nature.blossom_chance, + interval = nature.blossom_delay / nature.leaves_blossom_chance, + chance = nature.leaves_blossom_chance, action = function(pos, node, active_object_count, active_object_count_wider) - nature.enqueue_node(pos, node, true) + if math.random(nature.leaves_blossom_chance) == 1 then + nature.enqueue_node(pos, node, nature.blossom_node) + end end }) -- Removing blossoms +-- Limit mass changes after block has not been loaded for some time: +-- Run ABM with higher frequency, but don't enqueue all blocks minetest.register_abm({ nodenames = { nature.blossom_node }, - interval = nature.blossom_delay, - chance = nature.blossom_chance, + interval = nature.blossom_delay / nature.blossom_leaves_chance, + chance = nature.blossom_leaves_chance, action = function(pos, node, active_object_count, active_object_count_wider) - nature.enqueue_node(pos, node, false) + if math.random(nature.blossom_leaves_chance) == 1 then + nature.enqueue_node(pos, node, nature.blossom_leaves) + end end }) -- Spawning apples +-- Limit mass changes after block has not been loaded for some time: +-- spawn apples with 10% chance, but with 10 times higher frequency minetest.register_abm({ nodenames = { nature.blossom_node }, - interval = nature.blossom_delay, + interval = nature.blossom_delay / 10, chance = nature.apple_chance, action = function(pos, node, active_object_count, active_object_count_wider) - if nature.dtime < 0.2 and not minetest.find_node_near(pos, nature.apple_spread, { "default:apple" }) then + if math.random(10) == 0 and nature.dtime < 0.2 and not minetest.find_node_near(pos, nature.apple_spread, { "default:apple" }) then spawn_apple_under(pos) end end diff --git a/mods/plantlife_modpack/nature_classic/global_function.lua b/mods/plantlife_modpack/nature_classic/global_function.lua index 191a20ad..c6b158a3 100755 --- a/mods/plantlife_modpack/nature_classic/global_function.lua +++ b/mods/plantlife_modpack/nature_classic/global_function.lua @@ -1,44 +1,64 @@ -- helper functions +local function process_blossom_queue_item() + local pos = nature.blossomqueue[1][1] + local node = nature.blossomqueue[1][2] + local replace = nature.blossomqueue[1][3] + if (nature.blossomqueue[1][3] == nature.blossom_node and not nature:is_near_water(pos)) then + table.remove(nature.blossomqueue, 1) -- don't grow if it's not near water, pop from queue. + return + end + nature:grow_node(pos, replace) -- now actually grow it. + table.remove(nature.blossomqueue, 1) +end + minetest.register_globalstep(function(dtime) nature.dtime = dtime if #nature.blossomqueue > 0 and dtime < 0.2 then - local pos = nature.blossomqueue[1][1] - local node = nature.blossomqueue[1][2] - if (nature.blossomqueue[1][3] and not nature:is_near_water(pos)) then - table.remove(nature.blossomqueue, 1) -- don't grow if it's not near water, pop from queue. - return + local i = 1 + if dtime < 0.1 then + i = i + 4 + end + if dtime < 0.05 then + i = i + 10 + end + while #nature.blossomqueue > 0 and i > 0 do + process_blossom_queue_item() + i = i - 1 end - nature:grow_node(pos, nature.blossom_node) -- now actually grow it. - table.remove(nature.blossomqueue, 1) end end) -function nature.enqueue_node(pos, node, fcn) +function nature.enqueue_node(pos, node, replace) local idx = #nature.blossomqueue - nature.blossomqueue[idx+1] = {} - nature.blossomqueue[idx+1][1] = pos - nature.blossomqueue[idx+1][2] = node - nature.blossomqueue[idx+1][3] = fcn + if idx < nature.blossomqueue_max then + local enqueue_prob = 0 + if idx < nature.blossomqueue_max * 0.8 then + enqueue_prob = 1 + else + -- Reduce queue growth as it gets closer to its max. + enqueue_prob = 1 - (idx - nature.blossomqueue_max * 0.8) / (nature.blossomqueue_max * 0.2) + end + if enqueue_prob == 1 or math.random(100) <= 100 * enqueue_prob then + nature.blossomqueue[idx+1] = {} + nature.blossomqueue[idx+1][1] = pos + nature.blossomqueue[idx+1][2] = node + nature.blossomqueue[idx+1][3] = replace + end + end end local function set_young_node(pos) local meta = minetest.get_meta(pos) - meta:set_string(nature.node_young, nature.setting_true) - minetest.after(nature.youth_delay, - function(pos) - local meta = minetest.get_meta(pos) - meta:set_string(nature.node_young, nature.setting_false) - end, - pos) + meta:set_int(nature.meta_blossom_time, minetest.get_gametime()) end local function is_not_young(pos) local meta = minetest.get_meta(pos) - local young = meta:get_string(nature.node_young) - return young ~= nature.setting_true + local blossom_time = meta:get_int(nature.meta_blossom_time) + return not (blossom_time and minetest.get_gametime() - blossom_time < nature.blossom_duration) end function nature:grow_node(pos, nodename) @@ -47,7 +67,6 @@ function nature:grow_node(pos, nodename) >= nature.minimum_growth_light if is_not_young(pos) and light_enough then - minetest.remove_node(pos) minetest.set_node(pos, { name = nodename }) set_young_node(pos) diff --git a/mods/plantlife_modpack/nature_classic/init.lua b/mods/plantlife_modpack/nature_classic/init.lua index bf63e127..f88ec6ec 100755 --- a/mods/plantlife_modpack/nature_classic/init.lua +++ b/mods/plantlife_modpack/nature_classic/init.lua @@ -7,6 +7,7 @@ local current_mod_name = minetest.get_current_modname() nature = {} nature.blossomqueue = {} +nature.blossomqueue_max = 1000 nature.blossom_node = "nature:blossom" nature.blossom_leaves = "default:leaves" @@ -19,15 +20,14 @@ if minetest.get_modpath("moretrees") then minetest.register_alias("nature:blossom", "default:leaves") end -nature.blossom_chance = 15 +nature.leaves_blossom_chance = 15 +nature.blossom_leaves_chance = 5 nature.blossom_delay = 3600 nature.apple_chance = 10 nature.apple_spread = 2 -nature.node_young = "young" -nature.setting_true = "true" -nature.setting_false = "false" -nature.youth_delay = 5 +nature.meta_blossom_time = "blossom_time" +nature.blossom_duration = nature.blossom_delay function dumppos(pos) return "("..pos.x..","..pos.y..","..pos.z..")" diff --git a/mods/plantlife_modpack/trunks/init.lua b/mods/plantlife_modpack/trunks/init.lua index fcbb86f2..f4dda2ee 100755 --- a/mods/plantlife_modpack/trunks/init.lua +++ b/mods/plantlife_modpack/trunks/init.lua @@ -14,4 +14,4 @@ dofile(minetest.get_modpath("trunks").."/crafting.lua") ----------------------------------------------------------------------------------------------- minetest.log("action", "[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...") ------------------------------------------------------------------------------------------------ +----------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/mods/plantlife_modpack/woodsoils/init.lua b/mods/plantlife_modpack/woodsoils/init.lua index dd97e945..b954e2b4 100755 --- a/mods/plantlife_modpack/woodsoils/init.lua +++ b/mods/plantlife_modpack/woodsoils/init.lua @@ -26,4 +26,4 @@ print(" \\/ \\/")]] ----------------------------------------------------------------------------------------------- minetest.log("action", "[Mod] "..title.." ["..version.."] ["..mname.."] Loaded...") ------------------------------------------------------------------------------------------------ +----------------------------------------------------------------------------------------------- \ No newline at end of file diff --git a/mods/soundset/README.md b/mods/soundset/README.md old mode 100644 new mode 100755 diff --git a/mods/soundset/init.lua b/mods/soundset/init.lua old mode 100644 new mode 100755