-- default:snow got higher in recent versions of mtg: it is now 4/16 high moresnow.snow_ground_height = 4/16; -- leaves are usually not that thick moresnow.leaves_ground_height = 1/32; -- neither is wool moresnow.wool_ground_height = 2/16; -- make it a bit shorter... local height_snow = moresnow.snow_ground_height local height_leaves = moresnow.leaves_ground_height local height_wool = moresnow.wool_ground_height -- the general node definition for all these snow tops (only name and nodebox vary) moresnow.register_snow_top = function( node_name, fixed_nodebox, wool_nodebox, leaves_nodebox ) minetest.register_node( 'moresnow:snow_'..node_name, { description = "Snow", tiles = {"default_snow.png"}, inventory_image = "default_snowball.png", wield_image = "default_snowball.png", is_ground_content = true, paramtype = "light", paramtype2 = "facedir", buildable_to = true, drawtype = "nodebox", freezemelt = "default:water_flowing", node_box = { -- leveled would not work well in this situation type = "fixed", fixed = fixed_nodebox, }, drop = "default:snow", groups = {crumbly=3,falling_node=1, float=1, melt=1, not_in_creative_inventory=1}, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_snow_footstep", gain=0.25}, dug = {name="default_snow_footstep", gain=0.75}, }), on_construct = function( pos ) return moresnow.on_construct_snow( pos, 'moresnow:snow_'..node_name ); end, }) if( moresnow.enable_autumnleaves ) then minetest.register_node( 'moresnow:autumnleaves_'..node_name, { description = "fallen leaves", tiles = {"moresnow_autumnleaves.png"}, inventory_image = "moresnow_autumnleaves.png", wield_image = "moresnow_autumnleaves.png", is_ground_content = true, paramtype = "light", paramtype2 = "facedir", buildable_to = true, drawtype = "nodebox", use_texture_alpha = true, node_box = { -- leveled would not work well in this situation type = "fixed", fixed = leaves_nodebox or wool_nodebox or fixed_nodebox, }, drop = "moresnow:autumnleaves", groups = {falling_node=1, float=1, not_in_creative_inventory=1, snappy=3, flammable=2, leaves=1}, sounds = default.node_sound_leaves_defaults(), on_construct = function( pos ) return moresnow.on_construct_leaves( pos, 'moresnow:autumnleaves_'..node_name ); end, }) end if( wool_nodebox and moresnow.wool_dyes and minetest.get_modpath( 'wool' )) then for _,v in ipairs( moresnow.wool_dyes ) do local ptype2 = "facedir" local palette = nil if(v == "multicolor") then ptype2 = "color4dir" -- palette = "unifieddyes_palette_extended.png" palette = "moresnow_palette.png" end minetest.register_node( "moresnow:wool_"..v.."_"..node_name, { description = "layers of wool ("..v..")", tiles = {"wool_"..v..".png"}, -- inventory_image = "moresnow_autumnleaves.png", -- wield_image = "moresnow_autumnleaves.png", is_ground_content = true, paramtype = "light", paramtype2 = ptype2, palette = palette, drawtype = "nodebox", node_box = { type = "fixed", fixed = wool_nodebox, }, drop = "moresnow:wool_"..v, groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3,flammable=3,wool=1, float=1, not_in_creative_inventory=1}, sounds = default.node_sound_defaults(), on_construct = function( pos ) return moresnow.on_construct_wool( pos, "moresnow:wool_"..v.."_"..node_name, v ); end, }); end end end -- define the leaves if( moresnow.enable_autumnleaves ) then minetest.register_node( "moresnow:autumnleaves", { description = "fallen leaves", tiles = {"moresnow_autumnleaves.png"}, inventory_image = "moresnow_autumnleaves.png", wield_image = "moresnow_autumnleaves.png", is_ground_content = true, paramtype = "light", -- drawtype = "allfaces_optional", -- waving = 0, -- waving looks too strange here! use_texture_alpha = true, buildable_to = true, leveled = 7, -- can pile up as well drawtype = "nodebox", node_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, -0.5+height_leaves, 0.5}, }, }, groups = {falling_node=1, float=1, snappy=3, flammable=2, leaves=1}, sounds = default.node_sound_leaves_defaults(), on_construct = function( pos ) return moresnow.on_construct_leaves( pos, 'moresnow:autumnleaves' ); end, }) -- full leaves blocks for decorative autumn trees minetest.register_craft({ type = "shapeless", output = 'moresnow:autumnleaves_tree', recipe = {'default:leaves','default:torch'}, replacements = {{'default:torch','default:torch'}} }); -- 9 layers of autumn leaves minetest.register_craft({ output = 'moresnow:autumnleaves 9', recipe = { {'moresnow:autumnleaves_tree'} }}); -- reverse craft minetest.register_craft({ output = 'moresnow:autumnleaves_tree', recipe = { {'moresnow:autumnleaves','moresnow:autumnleaves','moresnow:autumnleaves'}, {'moresnow:autumnleaves','moresnow:autumnleaves','moresnow:autumnleaves'}, {'moresnow:autumnleaves','moresnow:autumnleaves','moresnow:autumnleaves'} }}); -- white/grey leaves for trees in winter minetest.register_craft({ type = "shapeless", output = 'moresnow:winterleaves_tree', recipe = {'moresnow:autumnleaves_tree','default:snow'}, replacements = {{'default:snow','default:snow'}} }); end if( moresnow.wool_dyes and minetest.get_modpath( 'wool' )) then for _,v in ipairs( moresnow.wool_dyes ) do local ptype2 = "facedir" local palette = nil local on_punch = nil local on_rightclick = nil if(v == "multicolor") then ptype2 = "color4dir" -- palette = "unifieddyes_palette_extended.png" palette = "moresnow_palette.png" on_punch = function(pos, node, puncher, pointed_thing) local node = minetest.get_node(pos) node.param2 = (node.param2 + 4) % 256 minetest.swap_node(pos, node) end on_rightclick = function(pos, node, puncher, pointed_thing) local node = minetest.get_node(pos) node.param2 = (node.param2 - 4) % 256 minetest.swap_node(pos, node) end end table.insert( moresnow.nodetypes, 'wool_'..v ); minetest.register_node( "moresnow:wool_"..v, { description = "layers of wool ("..v..")", tiles = {"wool_"..v..".png"}, is_ground_content = true, paramtype = "light", paramtype2 = ptype2, palette = palette, leveled = 7, -- can pile up as well drawtype = "nodebox", node_box = { type = "leveled", fixed = { {-0.5, -0.5, -0.5, 0.5, -0.5+height_wool, 0.5}, }, }, groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3,flammable=3,wool=1, float=1}, sounds = default.node_sound_defaults(), on_construct = function( pos ) return moresnow.on_construct_wool( pos, 'moresnow:wool_'..v, v ); end, on_punch = on_punch, on_rightclick = on_rightclick, }); -- craft one wool block into 9 layers minetest.register_craft({ output = 'moresnow:wool_'..v..' 9', recipe = { {'wool:'..v} }}); -- craft the wool layers back to a full wool block minetest.register_craft({ output = 'wool:'..v, recipe = { { 'moresnow:wool_'..v, 'moresnow:wool_'..v, 'moresnow:wool_'..v }, { 'moresnow:wool_'..v, 'moresnow:wool_'..v, 'moresnow:wool_'..v }, { 'moresnow:wool_'..v, 'moresnow:wool_'..v, 'moresnow:wool_'..v }, }}); end end -- now that on_construct has been defined, we can start creating the actual nodes minetest.registered_nodes[ 'default:snow' ].on_construct = function( pos ) return moresnow.on_construct_snow( pos, 'default:snow' ); end -- the nodebox for this snow node lies one node DEEPER than the node the snow is in; -- thus, nodebox-like nodes covered by snow may look less strange moresnow.register_snow_top( "top", {{-0.5, -1.5, -0.5, 0.5, -1.5+height_snow, 0.5}}, {{-0.5, -1.5, -0.5, 0.5, -1.5+height_wool, 0.5}}, -- same for wool {{-0.5, -1.5, -0.5, 0.5, -1.5+height_leaves, 0.5}} ); moresnow.register_snow_top( "fence_top", {{-0.5, -1.5, -0.5, 0.5, -1.5+height_snow, 0.5}, {-0.12, -0.5, -0.12, 0.12, -0.5+2/16, 0.12}}, -- on top of the fence post {{-0.5, -1.5, -0.5, 0.5, -1.5+height_wool, 0.5}}, -- same for wool {{-0.5, -1.5, -0.5, 0.5, -1.5+height_leaves, 0.5}, {-0.12, -0.5, -0.12, 0.12, -0.5+height_leaves, 0.12}}) -- on top of the fence post moresnow.register_snow_top( "stair_top", { {-0.5, -1.0, -0.5, 0.5, -1.0+height_snow, 0}, {-0.5, -0.5, 0, 0.5, -0.5+height_snow, 0.5}, {-0.5, -1.0+height_snow, 0-1/32, 0.5, -0.5, 0 }, {-0.5, -1.5, -0.5-1/32, 0.5, -1.0, -0.5}, },{ -- the wool version does not have the wool covering the legs {-0.5, -1.0, -0.5, 0.5, -1.0+height_wool, 0}, {-0.5, -0.5, 0, 0.5, -0.5+height_wool, 0.5}, {-0.5, -1.0+height_wool, 0-1/32, 0.5, -0.5, 0 }, },{ -- the leaves version covers the legs {-0.5, -1.0, -0.5, 0.5, -1.0+height_leaves, 0}, {-0.5, -0.5, 0, 0.5, -0.5+height_leaves, 0.5}, {-0.5, -1.0+height_leaves, 0-1/32, 0.5, -0.5, 0 }, {-0.5, -1.5, -0.5-1/32, 0.5, -1.0, -0.5}, }) moresnow.register_snow_top( "slab_top", { {-0.5, -1.0, -0.5, 0.5, -1.0+height_snow, 0.5}}, { {-0.5, -1.0, -0.5, 0.5, -1.0+height_wool, 0.5}}, -- same for wool { {-0.5, -1.0, -0.5, 0.5, -1.0+height_leaves, 0.5}}) -- same for wool -- these shapes exist in moreblocks only if( minetest.get_modpath( 'moreblocks' )) then moresnow.register_snow_top( "panel_top", { {-0.5, -1.5, -0.5, 0.5, -1.5+height_snow, 0}, {-0.5, -1.0, 0, 0.5, -1.0+height_snow, 0.5}, {-0.5, -1.5+height_snow, 0-1/32, 0.5, -1.0, 0 }, },{ -- the wool version does not have the wool covering the legs {-0.5, -1.0, 0, 0.5, -1.0+height_wool, 0.5}, },{ -- the leaves version covers the legs {-0.5, -1.5, -0.5, 0.5, -1.5+height_leaves, 0}, {-0.5, -1.0, 0, 0.5, -1.0+height_leaves, 0.5}, {-0.5, -1.5+height_leaves, 0-1/32, 0.5, -1.0, 0 }, }) moresnow.register_snow_top( "micro_top", { {-0.5, -1.5, -0.5, 0, -1.5+height_snow, 0 }, {-0.5, -1.0, 0, 0, -1.0+height_snow, 0.5}, { 0, -1.5, -0.5, 0.5, -1.5+height_snow, 0.5}, {-0.5, -1.5+height_snow, 0-1/32, 0, -1.0, 0 }, {0, -1.5+height_snow, 0, 0+1/32, -1.0, 0.5}, },{ -- the wool version does not have the wool covering the legs {-0.5, -1.0, 0, 0, -1.0+height_wool, 0.5}, },{ -- leaves again with legs {-0.5, -1.5, -0.5, 0, -1.5+height_leaves, 0 }, {-0.5, -1.0, 0, 0, -1.0+height_leaves, 0.5}, { 0, -1.5, -0.5, 0.5, -1.5+height_leaves, 0.5}, {-0.5, -1.5+height_leaves, 0-1/32, 0, -1.0, 0 }, {0, -1.5+height_leaves, 0, 0+1/32, -1.0, 0.5}, }) end if( minetest.get_modpath( 'moreblocks' ) or minetest.registered_nodes["stairs:stair_outer_wood"]) then moresnow.register_snow_top( "outer_stair_top", { {-0.5, -1.0, -0.5, 0, -1.0+height_snow, 0 }, {-0.5, -0.5, 0, 0, -0.5+height_snow, 0.5}, { 0, -1.0, -0.5, 0.5, -1.0+height_snow, 0.5}, {-0.5, -1.0+height_snow, 0-1/32, 0, -0.5, 0 }, {-0.5, -1.5, -0.5-1/32, 0.5, -1.0, -0.5}, {0, -1.0+height_snow, 0, 0+1/32, -0.5, 0.5}, {0.5, -1.5, -0.5, 0.5+1/32, -1.0, 0.5}, }, { -- the wool version does not cover the lower legs {-0.5, -1.0, -0.5, 0, -1.0+height_wool, 0 }, {-0.5, -0.5, 0, 0, -0.5+height_wool, 0.5}, { 0, -1.0, -0.5, 0.5, -1.0+height_wool, 0.5}, {-0.5, -1.0+height_wool, 0-1/32, 0, -0.5, 0 }, {0, -1.0+height_wool, 0, 0+1/32, -0.5, 0.5}, }, { -- leaves version {-0.5, -1.0, -0.5, 0, -1.0+height_leaves, 0 }, {-0.5, -0.5, 0, 0, -0.5+height_leaves, 0.5}, { 0, -1.0, -0.5, 0.5, -1.0+height_leaves, 0.5}, {-0.5, -1.0+height_leaves, 0-1/32, 0, -0.5, 0 }, {-0.5, -1.5, -0.5-1/32, 0.5, -1.0, -0.5}, {0, -1.0+height_leaves, 0, 0+1/32, -0.5, 0.5}, {0.5, -1.5, -0.5, 0.5+1/32, -1.0, 0.5}, }) end if( minetest.get_modpath( 'moreblocks' ) or minetest.registered_nodes["stairs:stair_inner_wood"]) then moresnow.register_snow_top( "inner_stair_top", { { 0, -1.0, -0.5, 0.5, -1.0+height_snow, 0 }, { 0, -0.5, 0, 0.5, -0.5+height_snow, 0.5}, {-0.5, -0.5, -0.5, 0, -0.5+height_snow, 0.5}, { 0, -1.0+height_snow, 0-1/32, 0.5, -0.5, 0 }, { 0, -1.0+height_snow, -0.5, 0+1/32, -0.5, 0}, }, { -- the wool version does not cover the lower legs { 0, -1.0, -0.5, 0.5, -1.0+height_wool, 0 }, { 0, -0.5, 0, 0.5, -0.5+height_wool, 0.5}, {-0.5, -0.5, -0.5, 0, -0.5+height_wool, 0.5}, { 0, -1.0+height_wool, 0-1/32, 0.5, -0.5, 0 }, { 0, -1.0+height_wool, -0.5, 0+1/32, -0.5, 0}, }, { -- leaves { 0, -1.0, -0.5, 0.5, -1.0+height_leaves, 0 }, { 0, -0.5, 0, 0.5, -0.5+height_leaves, 0.5}, {-0.5, -0.5, -0.5, 0, -0.5+height_leaves, 0.5}, { 0, -1.0+height_leaves, 0-1/32, 0.5, -0.5, 0 }, { 0, -1.0+height_leaves, -0.5, 0+1/32, -0.5, 0}, }) end moresnow.register_shape = function( shape, new_name ) local d = 5 -- detail level (how many steps/boxes to simulate the slope?) local slopeboxedge = {}; for i = 0, d-1 do if( shape==1 ) then -- slope; normal roof shingles slopeboxedge[i+1]={ -0.5, (i/d)-1.5+(1.25/d), (i/d)-0.5, 0.5, (i/d)-1.5+(1.25/d)+(1/d), (i/d)-0.5+(1/d)} elseif( shape==2 ) then -- outer corner slopeboxedge[i+1]={ -0.5, (i/d)-1.5+(1.25/d), (i/d)-0.5, 0.5-(i/d), (i/d)-1.5+(1.25/d)+(1/d), (i/d)-0.5+(1/d)} slopeboxedge[i+d*1]={0.5-(i/d), (i/d)-1.5+(1.25/d)-(1/d), 0.5, 0.5-(i/d)+(1/d), (i/d)-1.5+(1.25/d), -0.5+(i/d)} elseif( shape==3 ) then -- inner corner local v = d-i; slopeboxedge[i+1]={ (i/d)-0.5, (v/d)-1.5+(1.25/d)-(1/d), -0.5+(1/d-(1/d)), (i/d)-0.5+(1/d), (v/d)-1.5+(1.25/d), 0.5-(i/d)} slopeboxedge[i+d*1]={ 0.5, (v/d)-1.5+(1.25/d), 0.5-(i/d), -0.5+(i/d), (v/d)-1.5+(1.25/d)+(1/d), 0.5-(i/d)+(1/d) } elseif( shape==4 ) then -- slope half slopeboxedge[i+1]={-0.5, (i/d*0.5)-1.0+(1.25/d*0.5), (i/d)-0.5, 0.5, (i/d*0.5)-1.0+(1.25/d*0.5)+(1/d), (i/d)-0.5+(1/d)} elseif( shape==5 ) then -- slope half raised slopeboxedge[i+1]={-0.5, (i/d*0.5)-1.5+(1.25/d*0.5), (i/d)-0.5, 0.5, (i/d*0.5)-1.5+(1.25/d*0.5)+(1/d), (i/d)-0.5+(1/d)} elseif( shape==6 ) then -- outer corner of half slope raised slopeboxedge[i+1]={ -0.5, (i/d*0.5)-1.5+(1.25/d*0.5), (i/d)-0.5, 0.5-(i/d), (i/d*0.5)-1.5+(1.25/d*0.5)+(1/d), (i/d)-0.5+(1/d)} slopeboxedge[i+d*1]={0.5-(i/d), (i/d*0.5)-1.5+(1.25/d*0.5)-(1/d), 0.5, 0.5-(i/d)+(1/d), (i/d*0.5)-1.5+(1.25/d*0.5), -0.5+(i/d)} elseif( shape==7 ) then -- outer corner of half slope slopeboxedge[i+1]={ -0.5, (i/d*0.5)-1.0+(1.25/d*0.5), (i/d)-0.5, 0.5-(i/d), (i/d*0.5)-1.0+(1.25/d*0.5)+(1/d), (i/d)-0.5+(1/d)} slopeboxedge[i+d*1]={0.5-(i/d), (i/d*0.5)-1.0+(1.25/d*0.5)-(1/d), 0.5, 0.5-(i/d)+(1/d), (i/d*0.5)-1.0+(1.25/d*0.5), -0.5+(i/d)} elseif( shape==8 ) then -- inner corner of half slope raised local v = d-i; slopeboxedge[i+1]={ (i/d)-0.5, (v/d*0.5)-1.5+(1.25/d*0.5)-(1/d), -0.5+(1/d-(1/d)), (i/d)-0.5+(1/d), (v/d*0.5)-1.5+(1.25/d*0.5), 0.5-(i/d)} slopeboxedge[i+d*1]={ 0.5, (v/d*0.5)-1.5+(1.25/d*0.5), 0.5-(i/d), -0.5+(i/d), (v/d*0.5)-1.5+(1.25/d*0.5)+(1/d), 0.5-(i/d)+(1/d) } elseif( shape==9 ) then -- inner corner of half slope local v = d-i; slopeboxedge[i+1]={ (i/d)-0.5, (v/d*0.5)-1.0+(1.25/d*0.5)-(1/d), -0.5+(1/d-(1/d)), (i/d)-0.5+(1/d), (v/d*0.5)-1.0+(1.25/d*0.5), 0.5-(i/d)} slopeboxedge[i+d*1]={ 0.5, (v/d*0.5)-1.0+(1.25/d*0.5), 0.5-(i/d), -0.5+(i/d), (v/d*0.5)-1.0+(1.25/d*0.5)+(1/d), 0.5-(i/d)+(1/d) } end end moresnow.register_snow_top( new_name, slopeboxedge, nil ); -- no wool version for these end -- only add these if either technic (with its cnc machine) or homedecor (with shingles) are installed if( minetest.get_modpath( 'homedecor_roofing' ) or minetest.get_modpath( 'moreblocks') or minetest.get_modpath( 'technic' )) then moresnow.register_shape( 1, 'ramp_top' ); moresnow.register_shape( 2, 'ramp_outer_top'); moresnow.register_shape( 3, 'ramp_inner_top'); moresnow.register_shape( 4, 'ramp_half_raised_top') moresnow.register_shape( 5, 'ramp_half_top') moresnow.register_shape( 6, 'ramp_outer_half_top') moresnow.register_shape( 7, 'ramp_outer_half_raised_top') moresnow.register_shape( 8, 'ramp_inner_half_top') moresnow.register_shape( 9, 'ramp_inner_half_raised_top') end minetest.register_node( 'moresnow:autumnleaves_tree', { description = "autumn leaves", tiles = {"moresnow_autumnleaves.png"}, drawtype = "allfaces_optional", waving = 1, visual_scale = 1.3, paramtype = "light", is_ground_content = false, groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, sounds = default.node_sound_leaves_defaults(), }) minetest.register_node( 'moresnow:winterleaves_tree', { description = "winter leaves", tiles = {"moresnow_winterleaves.png"}, drawtype = "allfaces_optional", waving = 1, visual_scale = 1.3, paramtype = "light", is_ground_content = false, groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, sounds = default.node_sound_leaves_defaults(), }) minetest.register_node("moresnow:snow_soil", { description = "Snow on soil", tiles = {"default_snow.png^farming_soil_wet.png"}, is_ground_content = true, paramtype = "light", buildable_to = true, drawtype = "nodebox", node_box = { type = "fixed", fixed = { {-0.5, -0.5, -0.5, 0.5, -0.5+height_snow, 0.5}, }, }, groups = {crumbly=3,falling_node=1}, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_snow_footstep", gain=0.25}, dug = {name="default_snow_footstep", gain=0.75}, }), on_construct = function(pos) pos.y = pos.y - 1 if minetest.get_node(pos).name == "default:dirt_with_grass" then minetest.set_node(pos, {name="default:dirt_with_snow"}) end end, })