diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 0be6711..789d8ce 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -343,9 +343,11 @@ end -- Leafdecay -- for trunks -local function leafdecay_after_destruct(pos, oldnode, def) - for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, def.radius), - vector.add(pos, def.radius), def.leaves)) do +local function leafdecay_after_destruct(pos, oldnode, trunk) + local radius = default._leafdecay.radii[trunk] + local leaves = default._leafdecay.by_trunk[trunk] + for _, v in pairs(minetest.find_nodes_in_area(vector.subtract(pos, radius), + vector.add(pos, radius), leaves)) do local node = minetest.get_node(v) local timer = minetest.get_node_timer(v) if node.param2 == 0 and not timer:is_started() then @@ -355,8 +357,10 @@ local function leafdecay_after_destruct(pos, oldnode, def) end -- for leaves -local function leafdecay_on_timer(pos, def) - if minetest.find_node_near(pos, def.radius, def.trunks) then +local function leafdecay_on_timer(pos, leaf) + local radius = default._leafdecay.radii[leaf] + local trunks = default._leafdecay.by_leaf[leaf] + if minetest.find_node_near(pos, radius, trunks) then return false end @@ -364,10 +368,8 @@ local function leafdecay_on_timer(pos, def) local drops = minetest.get_node_drops(node.name) for _, item in ipairs(drops) do local is_leaf - for _, v in pairs(def.leaves) do - if v == item then - is_leaf = true - end + if default._leafdecay.by_leaf[item] then + is_leaf = true end if minetest.get_item_group(item, "leafdecay_drop") ~= 0 or not is_leaf then @@ -383,23 +385,54 @@ local function leafdecay_on_timer(pos, def) minetest.check_for_falling(pos) end +default._leafdecay = { + by_trunk = {}, + by_leaf = {}, + radii = {}, +} + +function concat(t1,t2) + for i=1, #t2 do + t1[#t1+1] = t2[i] + end + + return t1 +end + function default.register_leafdecay(def) assert(def.leaves) assert(def.trunks) assert(def.radius) for _, v in pairs(def.trunks) do - minetest.override_item(v, { - after_destruct = function(pos, oldnode) - leafdecay_after_destruct(pos, oldnode, def) - end, - }) + -- only override the trunk once + if default._leafdecay.by_trunk[v] == nil then + minetest.override_item(v, { + after_destruct = function(pos, oldnode) + leafdecay_after_destruct(pos, oldnode, v) + end, + }) + + default._leafdecay.radii[v] = def.radius + default._leafdecay.by_trunk[v] = {} + end + + concat(default._leafdecay.by_trunk[v], def.leaves) end + for _, v in pairs(def.leaves) do - minetest.override_item(v, { - on_timer = function(pos) - leafdecay_on_timer(pos, def) - end, - }) + -- only override each leaf once + if default._leafdecay.by_leaf[v] == nil then + minetest.override_item(v, { + on_timer = function(pos) + leafdecay_on_timer(pos, v) + end, + }) + + default._leafdecay.radii[v] = def.radius + default._leafdecay.by_leaf[v] = {} + end + + concat(default._leafdecay.by_leaf[v], def.trunks) end end diff --git a/mods/seasons/init.lua b/mods/seasons/init.lua index 106c428..18c7bb0 100644 --- a/mods/seasons/init.lua +++ b/mods/seasons/init.lua @@ -139,8 +139,26 @@ reg_generic("default", "bush_leaves", { nil) reg_generic("default", "jungleleaves", nil, nil) - +default.register_leafdecay({ + trunks = {"default:live_jungletree"}, + leaves = { + "seasons:winter_default_jungleleaves", + "seasons:fall_default_jungleleaves", + "seasons:spring_default_jungleleaves", + }, + radius = 2, +}) + reg_generic("default", "acacia_leaves", nil, nil) +default.register_leafdecay({ + trunks = {"default:acacia_tree"}, + leaves = { + "seasons:winter_default_acacia_leaves", + "seasons:fall_default_acacia_leaves", + "seasons:spring_default_acacia_leaves", + }, + radius = 2, +}) --[[ saplings @@ -193,6 +211,12 @@ function reg_leaves(ssn) after_place_node = default.after_place_leaves, }) + + default.register_leafdecay({ + trunks = {"default:live_tree", "default:tree"}, + leaves = {"seasons:"..ssn.."_default_leaves"}, + radius = 2, + }) end reg_leaves("spring") reg_leaves("fall") @@ -223,6 +247,12 @@ function reg_aspen_leaves(ssn) after_place_node = default.after_place_leaves, }) + + default.register_leafdecay({ + trunks = {"default:aspen_tree"}, + leaves = {"seasons:"..ssn.."_default_aspen_leaves"}, + radius = 3, + }) end reg_aspen_leaves("spring") diff --git a/todo b/todo index 08f415b..9f6185f 100644 --- a/todo +++ b/todo @@ -57,7 +57,7 @@ have to breed maize wood processing machine - +farming checks season and cold to grow nodes: @@ -65,3 +65,4 @@ nodes: copper pot copper kettle corn +mousetrap