From 4b291aabafcc564f0553af042f442ae5cacf7eb1 Mon Sep 17 00:00:00 2001 From: sys4 Date: Tue, 22 Apr 2025 12:56:02 +0200 Subject: [PATCH] Waterlily and seagrass are now waving on top of water source --- pl_seaweed/init.lua | 62 +++++++++++++++++++++++++++++++++++------ pl_waterlilies/init.lua | 59 +++++++++++++++++++++++++++++++-------- 2 files changed, 101 insertions(+), 20 deletions(-) diff --git a/pl_seaweed/init.lua b/pl_seaweed/init.lua index b99f19a..7de37d8 100644 --- a/pl_seaweed/init.lua +++ b/pl_seaweed/init.lua @@ -1,5 +1,6 @@ -- support for i18n local S = minetest.get_translator("pl_seaweed") +local random = math.random local seaweed_rarity = minetest.settings:get("pl_seaweed.seaweed_rarity") or 0.06 @@ -8,7 +9,15 @@ local function get_ndef(name) end local algae_list = { {nil}, {2}, {3}, {4} } +local seaweednames_list = {} +for i in ipairs(algae_list) do + local num = "" + if algae_list[i][1] ~= nil then + num = "_"..algae_list[i][1] + end + table.insert(seaweednames_list, "flowers:seaweed"..num) +end for i in ipairs(algae_list) do local num = "" local algae_groups = {snappy = 3,flammable=2,flower=1} @@ -18,7 +27,7 @@ for i in ipairs(algae_list) do algae_groups = { snappy = 3,flammable=2,flower=1, not_in_creative_inventory=1 } end - minetest.register_node(":flowers:seaweed"..num, { + local seaweed_def = { description = S("Seaweed"), drawtype = "nodebox", tiles = { @@ -45,7 +54,6 @@ for i in ipairs(algae_list) do buildable_to = true, liquids_pointable = true, - drop = "flowers:seaweed", on_place = function(itemstack, placer, pointed_thing) if not itemstack or not placer or not pointed_thing then return @@ -57,6 +65,7 @@ for i in ipairs(algae_list) do local place_pos = nil local top_pos = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} local under_node = minetest.get_node(pt.under) + local def = minetest.registered_nodes[under_node.name] local above_node = minetest.get_node(pt.above) local top_node = minetest.get_node(top_pos) if get_ndef(under_node.name)["buildable_to"] then @@ -78,8 +87,7 @@ for i in ipairs(algae_list) do local nodename = "default:cobble" -- :D if not keys["sneak"] then - --local node = minetest.get_node(pt.under) - local seaweed = math.random(1,4) + local seaweed = random(1,4) if seaweed == 1 then nodename = "flowers:seaweed" elseif seaweed == 2 then @@ -89,10 +97,18 @@ for i in ipairs(algae_list) do elseif seaweed == 4 then nodename = "flowers:seaweed_4" end - minetest.swap_node(place_pos, {name = nodename, param2 = math.random(0,3) }) + minetest.swap_node( + place_pos, { + name = nodename..(def.waving == 3 and "_waving" or ""), + param2 = random(0,3) + }) else local fdir = minetest.dir_to_facedir(placer:get_look_dir()) - minetest.swap_node(place_pos, {name = "flowers:seaweed", param2 = fdir}) + minetest.swap_node( + place_pos, { + name = "flowers:seaweed"..(def.waving == 3 and "_waving" or ""), + param2 = fdir + }) end if not minetest.is_creative_enabled(pname) then @@ -100,12 +116,20 @@ for i in ipairs(algae_list) do end return itemstack end - end, - }) + end + } + + local seaweed_waving_def = table.copy(seaweed_def) + seaweed_waving_def.waving = 3 + seaweed_waving_def.drop = "flowers:seaweed" + seaweed_waving_def.groups.not_in_creative_inventory = 1 + + minetest.register_node(":flowers:seaweed"..num, seaweed_def) + minetest.register_node(":flowers:seaweed"..num.."_waving", seaweed_waving_def) minetest.register_decoration({ name = "flowers:seaweed"..num, - decoration = {"flowers:seaweed"..num}, + decoration = {"flowers:seaweed"..num.."_waving"}, place_on = {"default:water_source"}, deco_type = "simple", flags = "liquid_surface", @@ -132,6 +156,26 @@ for i in ipairs(algae_list) do }) end +-- LBM to replace old seaweed definition to add waving +core.register_lbm({ + label = "Seaweed waving version", + name = "pl_seaweed:seaweed_waving_version", + nodenames = seaweednames_list, + run_at_every_load = false, + action = function(pos, node) + local node_under = core.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + local def_node_under = core.registered_nodes[node_under.name] + local is_node_under_waving = def_node_under.waving and def_node_under.waving == 3 + + local def_node = core.registered_nodes[node.name] + local is_node_waving = def_node.waving and def_node.waving == 3 + + if not is_node_waving and is_node_under_waving then + core.swap_node(pos, {name = node.name.."_waving"}) + end + end, +}) + minetest.register_alias("flowers:flower_seaweed", "flowers:seaweed") minetest.register_alias("along_shore:pondscum_1", "flowers:seaweed") minetest.register_alias("along_shore:seaweed_1", "flowers:seaweed") diff --git a/pl_waterlilies/init.lua b/pl_waterlilies/init.lua index 430dcc5..2f2c08a 100644 --- a/pl_waterlilies/init.lua +++ b/pl_waterlilies/init.lua @@ -1,5 +1,6 @@ -- support for i18n local S = minetest.get_translator("pl_waterlilies") +local random = math.random local fill_ratio = minetest.settings:get("pl_waterlilies.waterlily_rarity") or 0.03 @@ -38,7 +39,7 @@ for i in ipairs(lilies_list) do lily_groups = { snappy = 3,flammable=2,flower=1, not_in_creative_inventory=1 } end - minetest.register_node(":flowers:waterlily"..deg1, { + local waterlily_def = { description = S("Waterlily"), drawtype = "nodebox", tiles = { @@ -66,7 +67,6 @@ for i in ipairs(lilies_list) do node_placement_prediction = "", liquids_pointable = true, - drop = "flowers:waterlily", on_place = function(itemstack, placer, pointed_thing) if not itemstack or not placer or not pointed_thing then return @@ -78,6 +78,7 @@ for i in ipairs(lilies_list) do local place_pos = nil local top_pos = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} local under_node = minetest.get_node(pt.under) + local def = minetest.registered_nodes[under_node.name] local above_node = minetest.get_node(pt.above) local top_node = minetest.get_node(top_pos) @@ -96,10 +97,10 @@ for i in ipairs(lilies_list) do local pname = placer:get_player_name() if place_pos and not minetest.is_protected(place_pos, pname) then - local nodename = "default:cobble" -- if this block appears, something went....wrong :-) + local nodename = "default:cobble" -- if this block appears, something went....wrong :-) if not keys["sneak"] then - local waterlily = math.random(1,8) + local waterlily = random(1,8) if waterlily == 1 then nodename = "flowers:waterlily" elseif waterlily == 2 then @@ -117,10 +118,18 @@ for i in ipairs(lilies_list) do elseif waterlily == 8 then nodename = "flowers:waterlily_s4" end - minetest.swap_node(place_pos, {name = nodename, param2 = math.random(0,3) }) + minetest.swap_node( + place_pos, { + name = nodename..(def.waving == 3 and "_waving" or ""), + param2 = random(0,3) + }) else local fdir = minetest.dir_to_facedir(placer:get_look_dir()) - minetest.swap_node(place_pos, {name = "flowers:waterlily", param2 = fdir}) + minetest.swap_node( + place_pos, { + name = "flowers:waterlily"..(def.waving == 3 and "_waving" or ""), + param2 = fdir + }) end if not minetest.is_creative_enabled(pname) then @@ -128,12 +137,20 @@ for i in ipairs(lilies_list) do end return itemstack end - end, - }) + end + } + + local waterlily_waving_def = table.copy(waterlily_def) + waterlily_waving_def.waving = 3 + waterlily_waving_def.drop = "flowers:waterlily" + waterlily_waving_def.groups.not_in_creative_inventory = 1 + + minetest.register_node(":flowers:waterlily"..deg1, waterlily_def) + minetest.register_node(":flowers:waterlily"..deg1.."_waving", waterlily_waving_def) minetest.register_decoration({ name = "flowers:waterlily"..deg1, - decoration = {"flowers:waterlily"..deg1}, + decoration = {"flowers:waterlily"..deg1.."_waving"}, place_on = {"default:water_source"}, deco_type = "simple", flags = "liquid_surface", @@ -147,7 +164,7 @@ for i in ipairs(lilies_list) do minetest.register_decoration({ name = "flowers:waterlily"..deg1 .."_relative", - decoration = {"flowers:waterlily"..deg1}, + decoration = {"flowers:waterlily"..deg1.."_waving"}, place_on = {"default:water_source"}, deco_type = "simple", flags = "liquid_surface", @@ -161,7 +178,7 @@ for i in ipairs(lilies_list) do minetest.register_decoration({ name = "flowers:waterlily"..deg1 .."_relative", - decoration = {"flowers:waterlily"..deg1}, + decoration = {"flowers:waterlily"..deg1.."_waving"}, place_on = {"default:water_source"}, deco_type = "simple", flags = "liquid_surface", @@ -174,6 +191,26 @@ for i in ipairs(lilies_list) do }) end +-- LBM to replace old waterlily definition to add waving +core.register_lbm({ + label = "Waterlily waving version", + name = "pl_waterlilies:waterlily_waving_version", + nodenames = lilynames_list, + run_at_every_load = false, + action = function(pos, node, s_dtime) + local node_under = core.get_node({x=pos.x, y=pos.y-1, z=pos.z}) + local def_node_under = core.registered_nodes[node_under.name] + local is_node_under_waving = def_node_under.waving and def_node_under.waving == 3 + + local def_node = core.registered_nodes[node.name] + local is_node_waving = def_node.waving and def_node.waving == 3 + + if not is_node_waving and is_node_under_waving then + core.swap_node(pos, {name = node.name.."_waving"}) + end + end, +}) + minetest.register_alias( "flowers:flower_waterlily", "flowers:waterlily") minetest.register_alias( "flowers:flower_waterlily_225", "flowers:waterlily_225") minetest.register_alias( "flowers:flower_waterlily_45", "flowers:waterlily_45")