Waterlily and seagrass are now waving on top of water source

This commit is contained in:
bri cassa 2025-04-22 12:56:02 +02:00
parent 7aa9cef785
commit 4b291aabaf
2 changed files with 101 additions and 20 deletions

View File

@ -1,5 +1,6 @@
-- support for i18n -- support for i18n
local S = minetest.get_translator("pl_seaweed") local S = minetest.get_translator("pl_seaweed")
local random = math.random
local seaweed_rarity = minetest.settings:get("pl_seaweed.seaweed_rarity") or 0.06 local seaweed_rarity = minetest.settings:get("pl_seaweed.seaweed_rarity") or 0.06
@ -8,7 +9,15 @@ local function get_ndef(name)
end end
local algae_list = { {nil}, {2}, {3}, {4} } 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 for i in ipairs(algae_list) do
local num = "" local num = ""
local algae_groups = {snappy = 3,flammable=2,flower=1} 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 } algae_groups = { snappy = 3,flammable=2,flower=1, not_in_creative_inventory=1 }
end end
minetest.register_node(":flowers:seaweed"..num, { local seaweed_def = {
description = S("Seaweed"), description = S("Seaweed"),
drawtype = "nodebox", drawtype = "nodebox",
tiles = { tiles = {
@ -45,7 +54,6 @@ for i in ipairs(algae_list) do
buildable_to = true, buildable_to = true,
liquids_pointable = true, liquids_pointable = true,
drop = "flowers:seaweed",
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
if not itemstack or not placer or not pointed_thing then if not itemstack or not placer or not pointed_thing then
return return
@ -57,6 +65,7 @@ for i in ipairs(algae_list) do
local place_pos = nil local place_pos = nil
local top_pos = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} 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 under_node = minetest.get_node(pt.under)
local def = minetest.registered_nodes[under_node.name]
local above_node = minetest.get_node(pt.above) local above_node = minetest.get_node(pt.above)
local top_node = minetest.get_node(top_pos) local top_node = minetest.get_node(top_pos)
if get_ndef(under_node.name)["buildable_to"] then 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 local nodename = "default:cobble" -- :D
if not keys["sneak"] then if not keys["sneak"] then
--local node = minetest.get_node(pt.under) local seaweed = random(1,4)
local seaweed = math.random(1,4)
if seaweed == 1 then if seaweed == 1 then
nodename = "flowers:seaweed" nodename = "flowers:seaweed"
elseif seaweed == 2 then elseif seaweed == 2 then
@ -89,10 +97,18 @@ for i in ipairs(algae_list) do
elseif seaweed == 4 then elseif seaweed == 4 then
nodename = "flowers:seaweed_4" nodename = "flowers:seaweed_4"
end 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 else
local fdir = minetest.dir_to_facedir(placer:get_look_dir()) 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 end
if not minetest.is_creative_enabled(pname) then if not minetest.is_creative_enabled(pname) then
@ -100,12 +116,20 @@ for i in ipairs(algae_list) do
end end
return itemstack return itemstack
end 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({ minetest.register_decoration({
name = "flowers:seaweed"..num, name = "flowers:seaweed"..num,
decoration = {"flowers:seaweed"..num}, decoration = {"flowers:seaweed"..num.."_waving"},
place_on = {"default:water_source"}, place_on = {"default:water_source"},
deco_type = "simple", deco_type = "simple",
flags = "liquid_surface", flags = "liquid_surface",
@ -132,6 +156,26 @@ for i in ipairs(algae_list) do
}) })
end 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("flowers:flower_seaweed", "flowers:seaweed")
minetest.register_alias("along_shore:pondscum_1", "flowers:seaweed") minetest.register_alias("along_shore:pondscum_1", "flowers:seaweed")
minetest.register_alias("along_shore:seaweed_1", "flowers:seaweed") minetest.register_alias("along_shore:seaweed_1", "flowers:seaweed")

View File

@ -1,5 +1,6 @@
-- support for i18n -- support for i18n
local S = minetest.get_translator("pl_waterlilies") local S = minetest.get_translator("pl_waterlilies")
local random = math.random
local fill_ratio = minetest.settings:get("pl_waterlilies.waterlily_rarity") or 0.03 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 } lily_groups = { snappy = 3,flammable=2,flower=1, not_in_creative_inventory=1 }
end end
minetest.register_node(":flowers:waterlily"..deg1, { local waterlily_def = {
description = S("Waterlily"), description = S("Waterlily"),
drawtype = "nodebox", drawtype = "nodebox",
tiles = { tiles = {
@ -66,7 +67,6 @@ for i in ipairs(lilies_list) do
node_placement_prediction = "", node_placement_prediction = "",
liquids_pointable = true, liquids_pointable = true,
drop = "flowers:waterlily",
on_place = function(itemstack, placer, pointed_thing) on_place = function(itemstack, placer, pointed_thing)
if not itemstack or not placer or not pointed_thing then if not itemstack or not placer or not pointed_thing then
return return
@ -78,6 +78,7 @@ for i in ipairs(lilies_list) do
local place_pos = nil local place_pos = nil
local top_pos = {x=pt.under.x, y=pt.under.y+1, z=pt.under.z} 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 under_node = minetest.get_node(pt.under)
local def = minetest.registered_nodes[under_node.name]
local above_node = minetest.get_node(pt.above) local above_node = minetest.get_node(pt.above)
local top_node = minetest.get_node(top_pos) 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() local pname = placer:get_player_name()
if place_pos and not minetest.is_protected(place_pos, pname) then 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 if not keys["sneak"] then
local waterlily = math.random(1,8) local waterlily = random(1,8)
if waterlily == 1 then if waterlily == 1 then
nodename = "flowers:waterlily" nodename = "flowers:waterlily"
elseif waterlily == 2 then elseif waterlily == 2 then
@ -117,10 +118,18 @@ for i in ipairs(lilies_list) do
elseif waterlily == 8 then elseif waterlily == 8 then
nodename = "flowers:waterlily_s4" nodename = "flowers:waterlily_s4"
end 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 else
local fdir = minetest.dir_to_facedir(placer:get_look_dir()) 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 end
if not minetest.is_creative_enabled(pname) then if not minetest.is_creative_enabled(pname) then
@ -128,12 +137,20 @@ for i in ipairs(lilies_list) do
end end
return itemstack return itemstack
end 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({ minetest.register_decoration({
name = "flowers:waterlily"..deg1, name = "flowers:waterlily"..deg1,
decoration = {"flowers:waterlily"..deg1}, decoration = {"flowers:waterlily"..deg1.."_waving"},
place_on = {"default:water_source"}, place_on = {"default:water_source"},
deco_type = "simple", deco_type = "simple",
flags = "liquid_surface", flags = "liquid_surface",
@ -147,7 +164,7 @@ for i in ipairs(lilies_list) do
minetest.register_decoration({ minetest.register_decoration({
name = "flowers:waterlily"..deg1 .."_relative", name = "flowers:waterlily"..deg1 .."_relative",
decoration = {"flowers:waterlily"..deg1}, decoration = {"flowers:waterlily"..deg1.."_waving"},
place_on = {"default:water_source"}, place_on = {"default:water_source"},
deco_type = "simple", deco_type = "simple",
flags = "liquid_surface", flags = "liquid_surface",
@ -161,7 +178,7 @@ for i in ipairs(lilies_list) do
minetest.register_decoration({ minetest.register_decoration({
name = "flowers:waterlily"..deg1 .."_relative", name = "flowers:waterlily"..deg1 .."_relative",
decoration = {"flowers:waterlily"..deg1}, decoration = {"flowers:waterlily"..deg1.."_waving"},
place_on = {"default:water_source"}, place_on = {"default:water_source"},
deco_type = "simple", deco_type = "simple",
flags = "liquid_surface", flags = "liquid_surface",
@ -174,6 +191,26 @@ for i in ipairs(lilies_list) do
}) })
end 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", "flowers:waterlily")
minetest.register_alias( "flowers:flower_waterlily_225", "flowers:waterlily_225") minetest.register_alias( "flowers:flower_waterlily_225", "flowers:waterlily_225")
minetest.register_alias( "flowers:flower_waterlily_45", "flowers:waterlily_45") minetest.register_alias( "flowers:flower_waterlily_45", "flowers:waterlily_45")