From ab84afd071cad49b318735d0207b3db632e32fbf Mon Sep 17 00:00:00 2001 From: Perttu Ahola Date: Sat, 31 Mar 2012 13:12:12 +0300 Subject: [PATCH] Leaf decay, based on the groups 'leafdecay' and 'tree' --- mods/default/init.lua | 9 +++-- mods/default/leafdecay.lua | 76 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+), 4 deletions(-) create mode 100644 mods/default/leafdecay.lua diff --git a/mods/default/init.lua b/mods/default/init.lua index bd17d686..fda4ee1c 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -11,8 +11,9 @@ LIGHT_MAX = 14 -- Definitions made by this mod that other mods can use too default = {} --- Register and define map generator stuff +-- Load other files dofile(minetest.get_modpath("default").."/mapgen.lua") +dofile(minetest.get_modpath("default").."/leafdecay.lua") -- -- Tool definition @@ -808,7 +809,7 @@ minetest.register_node("default:tree", { description = "Tree", tile_images = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, is_ground_content = true, - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=1}, + groups = {tree=1,snappy=2,choppy=2,oddly_breakable_by_hand=1}, sounds = default.node_sound_wood_defaults(), }) @@ -816,7 +817,7 @@ minetest.register_node("default:jungletree", { description = "Jungle Tree", tile_images = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, is_ground_content = true, - groups = {snappy=2,choppy=2,oddly_breakable_by_hand=1}, + groups = {tree=1,snappy=2,choppy=2,oddly_breakable_by_hand=1}, sounds = default.node_sound_wood_defaults(), }) @@ -839,7 +840,7 @@ minetest.register_node("default:leaves", { visual_scale = 1.3, tile_images = {"default_leaves.png"}, paramtype = "light", - groups = {snappy=3}, + groups = {snappy=3, leafdecay=3}, drop = { max_items = 1, items = { diff --git a/mods/default/leafdecay.lua b/mods/default/leafdecay.lua new file mode 100644 index 00000000..0fa894a1 --- /dev/null +++ b/mods/default/leafdecay.lua @@ -0,0 +1,76 @@ +-- minetest/default/leafdecay.lua + +-- To enable leaf decay for a node, add it to the "leafdecay" group. +-- +-- The rating of the group determines how far from a node in the group "tree" +-- the node can be without decaying. +-- +-- If param2 of the node is ~= 0, the node will always be preserved. Thus, if +-- the player places a node of that kind, you will want to set param2=1 or so. + +default.leafdecay_trunk_cache = {} +default.leafdecay_enable_cache = true + +minetest.register_abm({ + nodenames = {"group:leafdecay"}, + neighbors = {"air", "group:liquid"}, + -- A low interval and a high inverse chance spreads the load + interval = 2, + chance = 5, + + action = function(p0, node, _, _) + --print("leafdecay ABM at "..p0.x..", "..p0.y..", "..p0.z..")") + local do_preserve = false + local d = minetest.registered_nodes[node.name].groups.leafdecay + if not d or d == 0 then + --print("not groups.leafdecay") + return + end + local n0 = minetest.env:get_node(p0) + if n0.param2 ~= 0 then + --print("param2 ~= 0") + return + end + local p0_hash = nil + if default.leafdecay_enable_cache then + p0_hash = minetest.hash_node_position(p0) + local trunkp = default.leafdecay_trunk_cache[p0_hash] + if trunkp then + local n = minetest.env:get_node(trunkp) + local reg = minetest.registered_nodes[n.name] + if reg.groups.tree and reg.groups.tree ~= 0 then + --print("cached trunk still exists") + return + end + --print("cached trunk is invalid") + -- Cache is invalid + table.remove(default.leafdecay_trunk_cache, p0_hash) + end + end + for dx = -d, d do if do_preserve then break end + for dy = -d, d do if do_preserve then break end + for dz = -d, d do if do_preserve then break end + local p = { + x = p0.x + dx, + y = p0.y + dy, + z = p0.z + dz, + } + local n = minetest.env:get_node(p) + local reg = minetest.registered_nodes[n.name] + if reg.groups.tree and reg.groups.tree ~= 0 then + do_preserve = true + if default.leafdecay_enable_cache then + --print("caching trunk") + -- Cache the trunk + default.leafdecay_trunk_cache[p0_hash] = p + end + end + end + end + end + if not do_preserve then + minetest.env:remove_node(p0) + end + end +}) +