From c3fb8df14a36907c8475eb449c9abba3b60fe55d Mon Sep 17 00:00:00 2001 From: trans_soup <> Date: Wed, 11 Oct 2023 18:23:09 +0200 Subject: [PATCH] add growing tree nodes. add `log_alive` and `leaves_alive`. make alive logs actually have a top texture (bottom texture and dead logs are still wrong, though). slightly refactor some tree growth code. --- mods/bg_tree/grow.lua | 30 +++++++++----- mods/bg_tree/node.lua | 41 +++++++++++-------- mods/bg_tree/recipes.lua | 2 +- mods/bg_tree/textures/tree_leaves.png | Bin 956 -> 5993 bytes mods/bg_tree/textures/tree_leaves_alive.png | Bin 0 -> 5871 bytes mods/bg_tree/textures/tree_log.png | Bin 305 -> 857 bytes mods/bg_tree/textures/tree_log_alive.png | Bin 0 -> 5841 bytes mods/bg_tree/textures/tree_log_top.png | Bin 657 -> 887 bytes mods/bg_tree/textures/tree_log_top_alive.png | Bin 0 -> 5994 bytes 9 files changed, 46 insertions(+), 27 deletions(-) create mode 100644 mods/bg_tree/textures/tree_leaves_alive.png create mode 100644 mods/bg_tree/textures/tree_log_alive.png create mode 100644 mods/bg_tree/textures/tree_log_top_alive.png diff --git a/mods/bg_tree/grow.lua b/mods/bg_tree/grow.lua index 010376b..43b1cd2 100644 --- a/mods/bg_tree/grow.lua +++ b/mods/bg_tree/grow.lua @@ -2,6 +2,16 @@ local modname = minetest.get_current_modname() local api = blockgame.tree local vec = blockgame.vector +-- NODE NAMES + +local log = modname .. ":log" +local log_alive = modname .. ":log_alive" +local leaves = modname .. ":leaves" +local leaves_alive = modname .. ":leaves_alive" +local root = modname .. ":root" + +-- END OF NODE NAMES + local attempt_place = function (pos, node) if minetest.get_node(pos).name ~= "air" then return false end return minetest.set_node(pos, node) @@ -10,7 +20,7 @@ end local extend_leaves_from = function (pos) local side = vec.random_side() - attempt_place(pos + side, {name = modname .. ":leaves"}) + attempt_place(pos + side, {name = leaves_alive}) end local random_walk = function (pos, steps, check) @@ -27,15 +37,15 @@ end local spread_roots_from = function (source) local root_pos = random_walk(source, 2, function (pos) - if minetest.get_node(pos).name == modname .. ":log" then return true end - if minetest.get_node(pos).name == modname .. ":root" then return true end + if minetest.get_node(pos).name == log_alive then return true end + if minetest.get_node(pos).name == root then return true end return false end) local root_node = minetest.get_node(root_pos) - if minetest.get_node(root_pos + vector.new(0, 1, 0)).name == modname .. ":log" then - minetest.set_node(root_pos, {name = modname .. ":root"}) + if minetest.get_node(root_pos + vector.new(0, 1, 0)).name == log_alive then + minetest.set_node(root_pos, {name = root}) return true end @@ -44,7 +54,7 @@ local spread_roots_from = function (source) if blockgame.chance(2) then target_pos = vec.get_below(root_pos) end if minetest.get_item_group(minetest.get_node(target_pos), "dirty") then - return minetest.set_node(target_pos, {name = modname .. ":root"}) + return minetest.set_node(target_pos, {name = root}) end return false @@ -53,7 +63,7 @@ end minetest.register_abm({ label = "sapling grow", nodenames = {"tree:sapling"}, - neighbors = {"group:dirty", modname .. ":log"}, + neighbors = {"group:dirty", log_alive}, interval = 15, chance = 4, catch_up = true, @@ -78,7 +88,7 @@ minetest.register_abm({ local side = vec.random_side() local target = pos + side - attempt_place(target, {name = modname .. ":log"}) + attempt_place(target, {name = log_alive}) if blockgame.chance(2) then extend_leaves_from(target) @@ -86,9 +96,9 @@ minetest.register_abm({ end if blockgame.chance(4) then - minetest.set_node(pos, {name = modname .. ":log"}) + minetest.set_node(pos, {name = log_alive}) - if minetest.get_node(below).name == modname .. ":log" and blockgame.chance(2) then return end + if minetest.get_node(below).name == log_alive and blockgame.chance(2) then return end attempt_place(pos + vector.new(0, 1, 0), {name = modname .. ":sapling"}) end diff --git a/mods/bg_tree/node.lua b/mods/bg_tree/node.lua index ea4ae3a..65fcade 100644 --- a/mods/bg_tree/node.lua +++ b/mods/bg_tree/node.lua @@ -3,11 +3,24 @@ local modname = minetest.get_current_modname() blockgame.reg_simple_node("log", "Log", { woody = 1, }) +minetest.register_node(modname .. ":log_alive", { + description = "Growing Log", + tiles = { + modname .. "_log_top.png", + modname .. "_log_alive.png", + }, + groups = { + woody = 1, + planty = 1, + }, + drop = modname .. ":log", +}) blockgame.reg_simple_node("sapling", "Sapling", { planty = 1, }) +-- TODO: move this to the woodworking mod. blockgame.reg_simple_node("plank", "Plank", { woody = 1, }) @@ -23,23 +36,19 @@ minetest.register_node(modname .. ":leaves", { groups = { planty = 1, }, - drop = { - max_items = 2, - items = { - { - rarity = 16, - items = {modname .. ":nut 3"} - }, - { - rarity = 8, - items = {modname .. ":nut 2"} - }, - { - rarity = 4, - items = {modname .. ":nut"} - }, - }, +}) +minetest.register_node(modname .. ":leaves_alive", { + description = "Growing Leaves", + drawtype = "glasslike", + tiles = { + modname .. "_leaves_alive.png", }, + paramtype = "light", + sunlight_propagates = true, + groups = { + planty = 1, + }, + drop = modname .. ":leaves", }) blockgame.reg_simple_node("nut", "Nut", { diff --git a/mods/bg_tree/recipes.lua b/mods/bg_tree/recipes.lua index 0f5754e..54da2a4 100644 --- a/mods/bg_tree/recipes.lua +++ b/mods/bg_tree/recipes.lua @@ -5,7 +5,6 @@ local modname = minetest.get_current_modname() blockgame.crafting.register_stack_recipe("core:grass", modname .. ":nut", {name = modname .. ":sapling"}) blockgame.crafting.register_stack_recipe("core:dirt", modname .. ":nut", {name = modname .. ":sapling"}) --- NOTE: is currently useless, as there's no way to obtain leaves. blockgame.crafting.register_pummel_recipe({ label = "pummel leaves into dirt", used_item = modname .. ":leaves", @@ -15,6 +14,7 @@ blockgame.crafting.register_pummel_recipe({ end, }) +-- TODO: move this to the woodworking mod. blockgame.crafting.register_pummel_recipe({ label = "pummel log into plank", used_item = "core:stone", diff --git a/mods/bg_tree/textures/tree_leaves.png b/mods/bg_tree/textures/tree_leaves.png index e28ac8f57e945426ccf9fe00c971231ee6497cf3..4438ea9484b25a7788d67c6440ff3ea7ee0da1c5 100644 GIT binary patch literal 5993 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 delta 899 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 V_97rptAQ#8bGCP}E4SGk^B*t6F8Kfe literal 0 HcmV?d00001 diff --git a/mods/bg_tree/textures/tree_log.png b/mods/bg_tree/textures/tree_log.png index fe89963ca8197fc607816a9ef484fc74ed276f93..4891e5b52d1a430504436da49cb2b81b4e94b1df 100644 GIT binary patch delta 845 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 z z=liH+Pz(r)WMvJ|0f2x6i2wve0xTg=Ya9~807#a200?JTO+zv0WEZ}G3qa*$a{(5J zj^?qZe8>nVFZFV>L*P)Dza?HAK*WR$>=5p3UaaKr1z$E7^br9vHnBvK6$VeRA`r0{ zYaHo2YkyE6ggQ}%iN&Ds(<`#FkfCHCVgXs7LI7X0BvS++AmR&r`FxHYLKYHSW;xZ~ zaNFskxUz+iM!c-!zx2Eh7&HBE`Vru;r2hgV({)R5(Geu%R04`-g znL^n>4K$Sv+YHwGZPX&E$LplOBvHm<&KCZq9R{Cug!zvuyi{^jJS`29uKFS>q;fuBh9uk|hN_RGBcj_TL{uzB^@@8wi)Bku!nXQh4^Rp0bKuI5xz zqYZVA3!4guT)pOBv2heGGLLXP(~AmC6z{zH`ue5rDBIB6`}vo4V_AHog(;(PY3bRt zmL^qN%Z8Uv_KubxNUQ>@o(emu!xc-zuNb2;sb`VCw8bG2={gp!QgsX zYMGgoTI`U~_HZ{G-79QK$qL*&ZAGt$=R{w_5CT0#)pq>u&OTS7duH(`N(6VYz25wn zYgJNCX@w9(O}P)H5neH;5jpZX73r$@PrFZ*?$sO`EWShZJzOfaH`eao