X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=mods%2Fdefault%2Ffunctions.lua;h=dc46726afd28d22c430836d8e007d80a7f1ad3ac;hb=4d7dbfc826510e017f1ff167de0fbc78bb7f8ed3;hp=3525c1a8abdce3484d135a02bff3424d9bb36bde;hpb=016fa0da40d152d32d50a52b80b71b0e4e2f9d27;p=oweals%2Fminetest_game.git diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 3525c1a8..dc46726a 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.2} + {name = "default_sand_footstep", gain = 0.12} table.dug = table.dug or - {name="default_sand_footstep", gain=0.4} + {name = "default_sand_footstep", gain = 0.24} 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.7} + {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,9 +76,9 @@ 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 @@ -88,33 +88,24 @@ end -- Lavacooling -- -default.cool_lava_source = function(pos) - minetest.set_node(pos, {name="default:obsidian"}) - minetest.sound_play("default_cool_lava", {pos = pos, gain = 0.25}) -end - -default.cool_lava_flowing = function(pos) - minetest.set_node(pos, {name="default:stone"}) - minetest.sound_play("default_cool_lava", {pos = pos, gain = 0.25}) +default.cool_lava = function(pos, node) + if node.name == "default:lava_source" then + minetest.set_node(pos, {name = "default:obsidian"}) + else -- Lava flowing + minetest.set_node(pos, {name = "default:stone"}) + end + 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(...) - default.cool_lava_flowing(...) - end, -}) - -minetest.register_abm({ - nodenames = {"default:lava_source"}, + nodenames = {"default:lava_source", "default:lava_flowing"}, neighbors = {"group:water"}, interval = 1, chance = 1, + catch_up = false, action = function(...) - default.cool_lava_source(...) + default.cool_lava(...) end, }) @@ -123,60 +114,58 @@ minetest.register_abm({ -- 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 + 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 + pos.y = pos.y + 1 local height = 0 - while node.name == "default:cactus" and height < 4 and node.param2 == 0 do - height = height+1 - pos.y = pos.y+1 + 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 + if height == 4 or node.name ~= "air" then return end - minetest.set_node(pos, {name="default:cactus"}) + minetest.set_node(pos, {name = "default:cactus"}) return true end function default.grow_papyrus(pos, node) - pos.y = pos.y-1 + pos.y = pos.y - 1 local name = minetest.get_node(pos).name - if name ~= "default:dirt_with_grass" - and name ~= "default:dirt" then + 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 + 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 + height = height + 1 + pos.y = pos.y + 1 node = minetest.get_node(pos) end - if height == 4 - or node.name ~= "air" then + if height == 4 or node.name ~= "air" then return end - minetest.set_node(pos, {name="default:papyrus"}) + minetest.set_node(pos, {name = "default:papyrus"}) return true end --- wrapping the functions in abm action is necessary to make overriding them possible minetest.register_abm({ nodenames = {"default:cactus"}, neighbors = {"group:sand"}, - interval = 50, - chance = 20, + interval = 12, + chance = 83, action = function(...) default.grow_cactus(...) end @@ -185,8 +174,8 @@ minetest.register_abm({ minetest.register_abm({ nodenames = {"default:papyrus"}, neighbors = {"default:dirt", "default:dirt_with_grass"}, - interval = 50, - chance = 20, + interval = 14, + chance = 71, action = function(...) default.grow_papyrus(...) end @@ -207,6 +196,62 @@ function default.dig_up(pos, node, digger) end +-- +-- Fence registration helper +-- +function default.register_fence(name, def) + minetest.register_craft({ + output = name .. " 4", + recipe = { + { def.material, 'group:stick', def.material }, + { def.material, 'group:stick', def.material }, + } + }) + + local fence_texture = "default_fence_overlay.png^" .. def.texture .. + "^default_fence_overlay.png^[makealpha:255,126,126" + -- Allow almost everything to be overridden + local default_fields = { + paramtype = "light", + drawtype = "nodebox", + node_box = { + type = "connected", + fixed = {{-1/8, -1/2, -1/8, 1/8, 1/2, 1/8}}, + -- connect_top = + -- connect_bottom = + connect_front = {{-1/16,3/16,-1/2,1/16,5/16,-1/8}, + {-1/16,-5/16,-1/2,1/16,-3/16,-1/8}}, + connect_left = {{-1/2,3/16,-1/16,-1/8,5/16,1/16}, + {-1/2,-5/16,-1/16,-1/8,-3/16,1/16}}, + connect_back = {{-1/16,3/16,1/8,1/16,5/16,1/2}, + {-1/16,-5/16,1/8,1/16,-3/16,1/2}}, + connect_right = {{1/8,3/16,-1/16,1/2,5/16,1/16}, + {1/8,-5/16,-1/16,1/2,-3/16,1/16}}, + }, + connects_to = {"group:fence", "group:wood", "group:tree"}, + inventory_image = fence_texture, + wield_image = fence_texture, + tiles = {def.texture}, + sunlight_propagates = true, + is_ground_content = false, + groups = {}, + } + for k, v in pairs(default_fields) do + if not def[k] then + def[k] = v + end + end + + -- Always add to the fence group, even if no group provided + def.groups.fence = 1 + + def.texture = nil + def.material = nil + + minetest.register_node(name, def) +end + + -- -- Leafdecay -- @@ -223,9 +268,11 @@ minetest.register_globalstep(function(dtime) 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) + if placer and not placer:get_player_control().sneak then + local node = minetest.get_node(pos) + node.param2 = 1 + minetest.set_node(pos, node) + end end minetest.register_abm({ @@ -255,8 +302,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 @@ -270,7 +319,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 @@ -301,21 +351,24 @@ minetest.register_abm({ end }) + -- --- Grass growing +-- Grass growing on well-lit dirt -- minetest.register_abm({ nodenames = {"default:dirt"}, - interval = 2, - chance = 200, + neighbors = {"air"}, + interval = 6, + chance = 67, + catch_up = false, action = function(pos, node) - local above = {x=pos.x, y=pos.y+1, z=pos.z} + 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 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 @@ -325,18 +378,40 @@ minetest.register_abm({ end }) + +-- +-- Grass and dry grass removed in darkness +-- + minetest.register_abm({ - nodenames = {"default:dirt_with_grass"}, - interval = 2, - chance = 20, + nodenames = {"default:dirt_with_grass", "default:dirt_with_dry_grass"}, + interval = 8, + chance = 50, + catch_up = false, action = function(pos, node) - local above = {x=pos.x, y=pos.y+1, z=pos.z} + 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 + 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 }) + + +-- +-- Moss growth on cobble near water +-- + +minetest.register_abm({ + nodenames = {"default:cobble"}, + neighbors = {"group:water"}, + interval = 16, + chance = 200, + catch_up = false, + action = function(pos, node) + minetest.set_node(pos, {name = "default:mossycobble"}) + end +})