From a587972010d8ecf83f10010ada91d43db06f976c Mon Sep 17 00:00:00 2001 From: paramat Date: Mon, 15 Jan 2018 05:33:27 +0000 Subject: [PATCH] Flower spread ABM: Optimise Match maximum spread density to maximum mapgen density for flowers. Place 3 flora nodes at once instead of 1. Change ABM chance value to 300 to match previous spread rate. ABM becomes 3 times less intensive. --- mods/flowers/init.lua | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua index 51b0d87f..011160ed 100644 --- a/mods/flowers/init.lua +++ b/mods/flowers/init.lua @@ -139,24 +139,29 @@ function flowers.flower_spread(pos, node) local pos0 = vector.subtract(pos, 4) local pos1 = vector.add(pos, 4) - if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 3 then + -- Maximum flower density created by mapgen is 13 per 9x9 area. + -- The limit of 7 below was tuned by in-game testing to result in a maximum + -- flower density by ABM spread of 13 per 9x9 area. + -- Warning: Setting this limit theoretically without in-game testing + -- results in a maximum flower density by ABM spread that is far too high. + if #minetest.find_nodes_in_area(pos0, pos1, "group:flora") > 7 then return end local soils = minetest.find_nodes_in_area_under_air( pos0, pos1, "group:soil") - if #soils > 0 then - local seedling = soils[math.random(#soils)] - local seedling_above = - {x = seedling.x, y = seedling.y + 1, z = seedling.z} - light = minetest.get_node_light(seedling_above) - if not light or light < 13 or - -- Desert sand is in the soil group - minetest.get_node(seedling).name == "default:desert_sand" then - return + local num_soils = #soils + if num_soils >= 1 then + for si = 1, math.min(3, num_soils) do + local soil = soils[math.random(num_soils)] + local soil_above = {x = soil.x, y = soil.y + 1, z = soil.z} + light = minetest.get_node_light(soil_above) + if light and light >= 13 and + -- Desert sand is in the soil group + minetest.get_node(soil).name ~= "default:desert_sand" then + minetest.set_node(soil_above, {name = node.name}) + end end - - minetest.set_node(seedling_above, {name = node.name}) end end @@ -164,7 +169,7 @@ minetest.register_abm({ label = "Flower spread", nodenames = {"group:flora"}, interval = 13, - chance = 96, + chance = 300, action = function(...) flowers.flower_spread(...) end,