X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=mods%2Fdefault%2Ffunctions.lua;h=fd759275d9e340c7c60e1fa48f94dc09a9005484;hb=835ca02be5f0c37b4aedea13a7480beb5e9bb69e;hp=b0db8b222227c9db3011fbba38d98c87501f8175;hpb=179f4c3f91f95ef988dfa9103432783ddd1d245e;p=oweals%2Fminetest_game.git diff --git a/mods/default/functions.lua b/mods/default/functions.lua index b0db8b22..fd759275 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -7,20 +7,20 @@ function default.node_sound_defaults(table) table = table or {} table.footstep = table.footstep or - {name="", gain=1.0} + {name = "", gain = 1.0} table.dug = table.dug or - {name="default_dug_node", gain=0.25} + {name = "default_dug_node", gain = 0.25} table.place = table.place or - {name="default_place_node_hard", gain=1.0} + {name = "default_place_node_hard", gain = 1.0} return table end function default.node_sound_stone_defaults(table) table = table or {} table.footstep = table.footstep or - {name="default_hard_footstep", gain=0.5} + {name = "default_hard_footstep", gain = 0.5} table.dug = table.dug or - {name="default_hard_footstep", gain=1.0} + {name = "default_hard_footstep", gain = 1.0} default.node_sound_defaults(table) return table end @@ -28,11 +28,11 @@ end function default.node_sound_dirt_defaults(table) table = table or {} table.footstep = table.footstep or - {name="default_dirt_footstep", gain=1.0} + {name = "default_dirt_footstep", gain = 1.0} table.dug = table.dug or - {name="default_dirt_footstep", gain=1.5} + {name = "default_dirt_footstep", gain = 1.5} table.place = table.place or - {name="default_place_node", gain=1.0} + {name = "default_place_node", gain = 1.0} default.node_sound_defaults(table) return table end @@ -40,11 +40,11 @@ end function default.node_sound_sand_defaults(table) table = table or {} table.footstep = table.footstep or - {name="default_sand_footstep", gain=0.5} + {name = "default_sand_footstep", gain = 0.2} table.dug = table.dug or - {name="default_sand_footstep", gain=1.0} + {name = "default_sand_footstep", gain = 0.4} table.place = table.place or - {name="default_place_node", gain=1.0} + {name = "default_place_node", gain = 1.0} default.node_sound_defaults(table) return table end @@ -52,9 +52,9 @@ end function default.node_sound_wood_defaults(table) table = table or {} table.footstep = table.footstep or - {name="default_wood_footstep", gain=0.5} + {name = "default_wood_footstep", gain = 0.5} table.dug = table.dug or - {name="default_wood_footstep", gain=1.0} + {name = "default_wood_footstep", gain = 1.0} default.node_sound_defaults(table) return table end @@ -62,13 +62,13 @@ end function default.node_sound_leaves_defaults(table) table = table or {} table.footstep = table.footstep or - {name="default_grass_footstep", gain=0.35} + {name = "default_grass_footstep", gain = 0.35} table.dug = table.dug or - {name="default_grass_footstep", gain=0.85} + {name = "default_grass_footstep", gain = 0.7} table.dig = table.dig or - {name="default_dig_crumbly", gain=0.4} + {name = "default_dig_crumbly", gain = 0.4} table.place = table.place or - {name="default_place_node", gain=1.0} + {name = "default_place_node", gain = 1.0} default.node_sound_defaults(table) return table end @@ -76,75 +76,37 @@ end function default.node_sound_glass_defaults(table) table = table or {} table.footstep = table.footstep or - {name="default_glass_footstep", gain=0.5} + {name = "default_glass_footstep", gain = 0.5} table.dug = table.dug or - {name="default_break_glass", gain=1.0} + {name = "default_break_glass", gain = 1.0} default.node_sound_defaults(table) return table end --- --- Legacy --- - -function default.spawn_falling_node(p, nodename) - spawn_falling_node(p, nodename) -end - --- Horrible crap to support old code --- Don't use this and never do what this does, it's completely wrong! --- (More specifically, the client and the C++ code doesn't get the group) -function default.register_falling_node(nodename, texture) - minetest.log("error", debug.traceback()) - minetest.log('error', "WARNING: default.register_falling_node is deprecated") - if minetest.registered_nodes[nodename] then - minetest.registered_nodes[nodename].groups.falling_node = 1 - end -end - --- --- Global callbacks --- - --- Global environment step function -function on_step(dtime) - -- print("on_step") -end -minetest.register_globalstep(on_step) - -function on_placenode(p, node) - --print("on_placenode") -end -minetest.register_on_placenode(on_placenode) - -function on_dignode(p, node) - --print("on_dignode") -end -minetest.register_on_dignode(on_dignode) - -function on_punchnode(p, node) -end -minetest.register_on_punchnode(on_punchnode) -- -- Lavacooling -- default.cool_lava_source = function(pos) - minetest.set_node(pos, {name="default:obsidian"}) + minetest.set_node(pos, {name = "default:obsidian"}) + minetest.sound_play("default_cool_lava", + {pos = pos, max_hear_distance = 16, gain = 0.25}) end default.cool_lava_flowing = function(pos) - minetest.set_node(pos, {name="default:stone"}) + minetest.set_node(pos, {name = "default:stone"}) + minetest.sound_play("default_cool_lava", + {pos = pos, max_hear_distance = 16, gain = 0.25}) end minetest.register_abm({ nodenames = {"default:lava_flowing"}, neighbors = {"group:water"}, interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - default.cool_lava_flowing(pos, node, active_object_count, active_object_count_wider) + chance = 2, + action = function(...) + default.cool_lava_flowing(...) end, }) @@ -152,38 +114,72 @@ minetest.register_abm({ nodenames = {"default:lava_source"}, neighbors = {"group:water"}, interval = 1, - chance = 1, - action = function(pos, node, active_object_count, active_object_count_wider) - default.cool_lava_source(pos, node, active_object_count, active_object_count_wider) + chance = 2, + action = function(...) + default.cool_lava_source(...) end, }) + -- -- Papyrus and cactus growing -- +-- wrapping the functions in abm action is necessary to make overriding them possible + +function default.grow_cactus(pos, node) + if node.param2 >= 4 then + return + end + pos.y = pos.y - 1 + if minetest.get_item_group(minetest.get_node(pos).name, "sand") == 0 then + return + end + pos.y = pos.y + 1 + local height = 0 + while node.name == "default:cactus" and height < 4 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 4 or node.name ~= "air" then + return + end + minetest.set_node(pos, {name = "default:cactus"}) + return true +end + +function default.grow_papyrus(pos, node) + pos.y = pos.y - 1 + local name = minetest.get_node(pos).name + if name ~= "default:dirt_with_grass" and name ~= "default:dirt" then + return + end + if not minetest.find_node_near(pos, 3, {"group:water"}) then + return + end + pos.y = pos.y + 1 + local height = 0 + while node.name == "default:papyrus" and height < 4 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 4 or node.name ~= "air" then + return + end + minetest.set_node(pos, {name = "default:papyrus"}) + return true +end + minetest.register_abm({ nodenames = {"default:cactus"}, neighbors = {"group:sand"}, interval = 50, chance = 20, - action = function(pos, node) - pos.y = pos.y-1 - local name = minetest.get_node(pos).name - if minetest.get_item_group(name, "sand") ~= 0 then - pos.y = pos.y+1 - local height = 0 - while minetest.get_node(pos).name == "default:cactus" and height < 4 do - height = height+1 - pos.y = pos.y+1 - end - if height < 4 then - if minetest.get_node(pos).name == "air" then - minetest.set_node(pos, {name="default:cactus"}) - end - end - end - end, + action = function(...) + default.grow_cactus(...) + end }) minetest.register_abm({ @@ -191,42 +187,29 @@ minetest.register_abm({ neighbors = {"default:dirt", "default:dirt_with_grass"}, interval = 50, chance = 20, - action = function(pos, node) - pos.y = pos.y-1 - local name = minetest.get_node(pos).name - if name == "default:dirt" or name == "default:dirt_with_grass" then - if minetest.find_node_near(pos, 3, {"group:water"}) == nil then - return - end - pos.y = pos.y+1 - local height = 0 - while minetest.get_node(pos).name == "default:papyrus" and height < 4 do - height = height+1 - pos.y = pos.y+1 - end - if height < 4 then - if minetest.get_node(pos).name == "air" then - minetest.set_node(pos, {name="default:papyrus"}) - end - end - end - end, + action = function(...) + default.grow_papyrus(...) + end }) + -- --- Leafdecay +-- dig upwards -- --- 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. +function default.dig_up(pos, node, digger) + if digger == nil then return end + local np = {x = pos.x, y = pos.y + 1, z = pos.z} + local nn = minetest.get_node(np) + if nn.name == node.name then + minetest.node_dig(np, nn, digger) + end +end + + -- --- 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. +-- Leafdecay -- --- If the node is in the leafdecay_drop group then the it will always be dropped --- as an item default.leafdecay_trunk_cache = {} default.leafdecay_enable_cache = true @@ -239,6 +222,12 @@ minetest.register_globalstep(function(dtime) math.floor(dtime * finds_per_second) end) +default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + node.param2 = 1 + minetest.set_node(pos, node) +end + minetest.register_abm({ nodenames = {"group:leafdecay"}, neighbors = {"air", "group:liquid"}, @@ -266,8 +255,10 @@ minetest.register_abm({ if trunkp then local n = minetest.get_node(trunkp) local reg = minetest.registered_nodes[n.name] - -- Assume ignore is a trunk, to make the thing work at the border of the active area - if n.name == "ignore" or (reg and reg.groups.tree and reg.groups.tree ~= 0) then + -- Assume ignore is a trunk, to make the thing + -- work at the border of the active area + if n.name == "ignore" or (reg and reg.groups.tree and + reg.groups.tree ~= 0) then --print("cached trunk still exists") return end @@ -281,7 +272,8 @@ minetest.register_abm({ end default.leafdecay_trunk_find_allow_accumulator = default.leafdecay_trunk_find_allow_accumulator - 1 - -- Assume ignore is a trunk, to make the thing work at the border of the active area + -- Assume ignore is a trunk, to make the thing + -- work at the border of the active area local p1 = minetest.find_node_near(p0, d, {"ignore", "group:tree"}) if p1 then do_preserve = true @@ -293,7 +285,7 @@ minetest.register_abm({ end if not do_preserve then -- Drop stuff other than the node itself - itemstacks = minetest.get_node_drops(n0.name) + local itemstacks = minetest.get_node_drops(n0.name) for _, itemname in ipairs(itemstacks) do if minetest.get_item_group(n0.name, "leafdecay_drop") ~= 0 or itemname ~= n0.name then @@ -311,3 +303,45 @@ minetest.register_abm({ end end }) + + +-- +-- Grass growing +-- + +minetest.register_abm({ + nodenames = {"default:dirt"}, + interval = 2, + chance = 200, + action = function(pos, node) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(above).name + local nodedef = minetest.registered_nodes[name] + if nodedef and (nodedef.sunlight_propagates or nodedef.paramtype == "light") and + nodedef.liquidtype == "none" and + (minetest.get_node_light(above) or 0) >= 13 then + if name == "default:snow" or name == "default:snowblock" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + else + minetest.set_node(pos, {name = "default:dirt_with_grass"}) + end + end + end +}) + +minetest.register_abm({ + nodenames = {"default:dirt_with_grass", "default:dirt_with_dry_grass"}, + interval = 2, + chance = 20, + action = function(pos, node) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(above).name + local nodedef = minetest.registered_nodes[name] + if name ~= "ignore" and nodedef and not ((nodedef.sunlight_propagates or + nodedef.paramtype == "light") and + nodedef.liquidtype == "none") then + minetest.set_node(pos, {name = "default:dirt"}) + end + end +}) +