From 986ee7e7ad2fce7efe4492480dfba01c56f51661 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sat, 20 Jun 2015 20:26:36 +0200 Subject: [PATCH] Updated snow mod - New textures, and many new nodes --- mods/snow/depends.txt | 2 +- mods/snow/init.lua | 2 +- .../other_textures/snow_snow_brick_lazyJ.png | Bin 518 -> 0 bytes mods/snow/src/abms.lua | 18 +- mods/snow/src/basic_stairs_slabs.lua | 398 ++++++++-------- mods/snow/src/crafting.lua | 172 +++---- mods/snow/src/mapgen.lua | 50 +- mods/snow/src/mapgen_v6.lua | 445 +++++++++++------- mods/snow/src/nodes.lua | 355 +++++++------- mods/snow/src/sled.lua | 2 +- .../textures/character_snow_man_preview.png | Bin 27318 -> 3805 bytes .../character_snow_man_preview_back.png | Bin 25131 -> 3359 bytes mods/snow/textures/default_ice.png | Bin 206 -> 643 bytes mods/snow/textures/snow_apple.png | Bin 0 -> 249 bytes mods/snow/textures/snow_dandelion_white.png | Bin 0 -> 122 bytes mods/snow/textures/snow_dandelion_yellow.png | Bin 0 -> 118 bytes mods/snow/textures/snow_geranium.png | Bin 0 -> 269 bytes mods/snow/textures/snow_ice_brick.png | Bin 0 -> 665 bytes mods/snow/textures/snow_leaves.png | Bin 0 -> 190 bytes mods/snow/textures/snow_rose.png | Bin 0 -> 120 bytes mods/snow/textures/snow_shrub.png | Bin 0 -> 262 bytes mods/snow/textures/snow_shrub_covering.png | Bin 0 -> 229 bytes mods/snow/textures/snow_star_lit.png | Bin 302 -> 302 bytes mods/snow/textures/snow_tulip.png | Bin 0 -> 124 bytes mods/snow/textures/snow_viola.png | Bin 0 -> 117 bytes 25 files changed, 761 insertions(+), 683 deletions(-) delete mode 100755 mods/snow/other_textures/snow_snow_brick_lazyJ.png create mode 100755 mods/snow/textures/snow_apple.png create mode 100755 mods/snow/textures/snow_dandelion_white.png create mode 100755 mods/snow/textures/snow_dandelion_yellow.png create mode 100755 mods/snow/textures/snow_geranium.png create mode 100755 mods/snow/textures/snow_ice_brick.png create mode 100755 mods/snow/textures/snow_leaves.png create mode 100755 mods/snow/textures/snow_rose.png create mode 100755 mods/snow/textures/snow_shrub.png create mode 100755 mods/snow/textures/snow_shrub_covering.png create mode 100755 mods/snow/textures/snow_tulip.png create mode 100755 mods/snow/textures/snow_viola.png diff --git a/mods/snow/depends.txt b/mods/snow/depends.txt index 3bed44f5..9d0cab16 100755 --- a/mods/snow/depends.txt +++ b/mods/snow/depends.txt @@ -1,3 +1,3 @@ default +flowers? moreblocks? -technic_worldgen? diff --git a/mods/snow/init.lua b/mods/snow/init.lua index 01a5676e..b7d4da8d 100755 --- a/mods/snow/init.lua +++ b/mods/snow/init.lua @@ -50,7 +50,6 @@ http://github.com/Splizard/minetest-mod-snow/ -- Original init.lua File Broken into Smaller Files dofile(minetest.get_modpath("snow").."/src/abms.lua") dofile(minetest.get_modpath("snow").."/src/aliases.lua") -dofile(minetest.get_modpath("snow").."/src/basic_stairs_slabs.lua") dofile(minetest.get_modpath("snow").."/src/crafting.lua") dofile(minetest.get_modpath("snow").."/src/snowball.lua") @@ -63,6 +62,7 @@ dofile(minetest.get_modpath("snow").."/src/util.lua") -- To get Xmas tree saplings, the "christmas_content", true or false, in "util.lua" has to be determined first. -- That means "nodes.lua", where the saplings are controlled, has to come after "util.lua". ~ LazyJ dofile(minetest.get_modpath("snow").."/src/nodes.lua") +dofile(minetest.get_modpath("snow").."/src/basic_stairs_slabs.lua") dofile(minetest.get_modpath("snow").."/src/mapgen.lua") dofile(minetest.get_modpath("snow").."/src/sled.lua") -- dofile(minetest.get_modpath("snow").."/src/falling_snow.lua") diff --git a/mods/snow/other_textures/snow_snow_brick_lazyJ.png b/mods/snow/other_textures/snow_snow_brick_lazyJ.png deleted file mode 100755 index 20d0cf87b8e8aa07e79f7355333f8da2e7be7e3a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 518 zcmV+h0{Q)kP)pz1IJ}%HqDv^uO2t zzuEu5%i_V;|HIe+#M0};*Z#%W|Haw=#?<=E+VjoWuK0002pNklFrm?IbbATKKeN}^_Bf_rzT#zSOPp5+Sj(e+=cUMuNS z-A0bNIGuGDPh2)gA#HBl?Cy!^R0bwcMI -function snow_stairs.register_stair(subname, recipeitem, groups, images, description, sounds) - minetest.register_node("snow:stair_" .. subname, { - description = description, - drawtype = "nodebox", - tiles = images, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = true, - groups = groups, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_snow_footstep", gain=0.25}, - dig = {name="default_dig_crumbly", gain=0.4}, - dug = {name="default_snow_footstep", gain=0.75}, - place = {name="default_place_node", gain=1.0} - }), - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - {-0.5, 0, 0, 0.5, 0.5, 0.5}, - }, - }, - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack - end +local function register_stair(subname, recipeitem, newdef) + local def = table.copy(stairdef) - local p0 = pointed_thing.under - local p1 = pointed_thing.above - local param2 = 0 - local placer_pos = placer:getpos() - if placer_pos then - local dir = { - x = p1.x - placer_pos.x, - y = p1.y - placer_pos.y, - z = p1.z - placer_pos.z - } - param2 = minetest.dir_to_facedir(dir) - end + for n,i in pairs(newdef) do + def[n] = i + end - if p0.y-1 == p1.y then - param2 = param2 + 20 - if param2 == 21 then - param2 = 23 - elseif param2 == 23 then - param2 = 21 - end - end - - return minetest.item_place(itemstack, placer, pointed_thing, param2) - end, - - on_construct = function(pos) - pos.y = pos.y - 1 - if minetest.get_node(pos).name == "default:dirt_with_grass" - -- Thinking in terms of layers, dirt_with_snow could also double as - -- dirt_with_frost which adds subtlety to the winterscape. ~ LazyJ, 2014_04_04 - or minetest.get_node(pos).name == "default:dirt" then - minetest.set_node(pos, {name="default:dirt_with_snow"}) - end - end - }) + local name = "snow:stair_" .. subname + minetest.register_node(name, def) --[[ -- for replace ABM minetest.register_node("snow:stair_" .. subname.."upside_down", { @@ -85,7 +94,7 @@ function snow_stairs.register_stair(subname, recipeitem, groups, images, descrip }) --]] minetest.register_craft({ - output = 'snow:stair_' .. subname .. ' 6', + output = name .. " 6", recipe = { {recipeitem, "", ""}, {recipeitem, recipeitem, ""}, @@ -95,7 +104,7 @@ function snow_stairs.register_stair(subname, recipeitem, groups, images, descrip -- Flipped recipe minetest.register_craft({ - output = 'snow:stair_' .. subname .. ' 6', + output = name .. " 6", recipe = { {"", "", recipeitem}, {"", recipeitem, recipeitem}, @@ -104,59 +113,76 @@ function snow_stairs.register_stair(subname, recipeitem, groups, images, descrip }) end + +local slabdef = table.copy(stairdef) +slabdef.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, +} +slabdef.on_place = nil + -- Node will be called snow:slab_ -function snow_stairs.register_slab(subname, recipeitem, groups, images, description, sounds) - minetest.register_node("snow:slab_" .. subname, { - description = description, - drawtype = "nodebox", - tiles = images, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = true, - groups = groups, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_snow_footstep", gain=0.25}, - dig = {name="default_dig_crumbly", gain=0.4}, - dug = {name="default_snow_footstep", gain=0.75}, - place = {name="default_place_node", gain=1.0} - }), - node_box = { - type = "fixed", - fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, - }, - on_place = function(itemstack, placer, pointed_thing) - if pointed_thing.type ~= "node" then - return itemstack +local function register_slab(subname, recipeitem, newdef) + local def = table.copy(slabdef) + + local name = "snow:slab_" .. subname + def.on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- If it's being placed on an another similar one, replace it with + -- a full block + local slabpos, slabnode + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local n0 = minetest.get_node(p0) + local n1 = minetest.get_node(p1) + + local n0_is_upside_down = (n0.name == name and + n0.param2 >= 20) + + if n0.name == name + and not n0_is_upside_down + and p0.y+1 == p1.y then + slabpos = p0 + slabnode = n0 + elseif n1.name == name then + slabpos = p1 + slabnode = n1 + end + if slabpos then + -- Remove the slab at slabpos + minetest.remove_node(slabpos) + -- Make a fake stack of a single item and try to place it + local fakestack = ItemStack(recipeitem) + fakestack:set_count(itemstack:get_count()) + + pointed_thing.above = slabpos + local success + fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) + -- If the item was taken from the fake stack, decrement original + if success then + itemstack:set_count(fakestack:get_count()) + -- Else put old node back + else + minetest.set_node(slabpos, slabnode) end + return itemstack + end - -- If it's being placed on an another similar one, replace it with - -- a full block - local slabpos = nil - local slabnode = nil - local p0 = pointed_thing.under - local p1 = pointed_thing.above - local n0 = minetest.get_node(p0) - local n1 = minetest.get_node(p1) - local param2 = 0 - - local n0_is_upside_down = (n0.name == "snow:slab_" .. subname and - n0.param2 >= 20) - - if n0.name == "snow:slab_" .. subname and not n0_is_upside_down and p0.y+1 == p1.y then - slabpos = p0 - slabnode = n0 - elseif n1.name == "snow:slab_" .. subname then - slabpos = p1 - slabnode = n1 - end - if slabpos then - -- Remove the slab at slabpos - minetest.remove_node(slabpos) + local param2 + -- Upside down slabs + if p0.y-1 == p1.y then + -- Turn into full block if pointing at a existing slab + if n0_is_upside_down then + -- Remove the slab at the position of the slab + minetest.remove_node(p0) -- Make a fake stack of a single item and try to place it local fakestack = ItemStack(recipeitem) fakestack:set_count(itemstack:get_count()) - pointed_thing.above = slabpos + pointed_thing.above = p0 local success fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) -- If the item was taken from the fake stack, decrement original @@ -164,57 +190,27 @@ function snow_stairs.register_slab(subname, recipeitem, groups, images, descript itemstack:set_count(fakestack:get_count()) -- Else put old node back else - minetest.set_node(slabpos, slabnode) + minetest.set_node(p0, n0) end return itemstack end - -- Upside down slabs - if p0.y-1 == p1.y then - -- Turn into full block if pointing at a existing slab - if n0_is_upside_down then - -- Remove the slab at the position of the slab - minetest.remove_node(p0) - -- Make a fake stack of a single item and try to place it - local fakestack = ItemStack(recipeitem) - fakestack:set_count(itemstack:get_count()) - - pointed_thing.above = p0 - local success - fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) - -- If the item was taken from the fake stack, decrement original - if success then - itemstack:set_count(fakestack:get_count()) - -- Else put old node back - else - minetest.set_node(p0, n0) - end - return itemstack - end - - -- Place upside down slab - param2 = 20 - end - + -- Place upside down slab + param2 = 20 + elseif n0_is_upside_down + and p0.y+1 ~= p1.y then -- If pointing at the side of a upside down slab - if n0_is_upside_down and p0.y+1 ~= p1.y then - param2 = 20 - end + param2 = 20 + end - return minetest.item_place(itemstack, placer, pointed_thing, param2) - end, + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end - on_construct = function(pos) - pos.y = pos.y - 1 - if minetest.get_node(pos).name == "default:dirt_with_grass" - -- Thinking in terms of layers, dirt_with_snow could also double as - -- dirt_with_frost which adds subtlety to the winterscape. ~ LazyJ, 2014_04_04 - or minetest.get_node(pos).name == "default:dirt" then - minetest.set_node(pos, {name="default:dirt_with_snow"}) - end - end + for n,i in pairs(newdef) do + def[n] = i + end - }) + minetest.register_node(name, def) --[[ -- for replace ABM minetest.register_node("snow:slab_" .. subname.."upside_down", { @@ -224,7 +220,7 @@ function snow_stairs.register_slab(subname, recipeitem, groups, images, descript --]] minetest.register_craft({ - output = 'snow:slab_' .. subname .. ' 6', + output = name .. " 6", recipe = { {recipeitem, recipeitem, recipeitem}, }, @@ -259,9 +255,31 @@ minetest.register_abm({ -- features (freezing, melting, and how they change dirt and dirt_with_grass). ~ LazyJ -- Nodes will be called snow:{stair,slab}_ -function snow_stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, freezemelt, liquidtype, paramtype, sunlight_propagates) - snow_stairs.register_stair(subname, recipeitem, groups, images, desc_stair, freezemelt, liquidtype, paramtype, sunlight_propagates) - snow_stairs.register_slab(subname, recipeitem, groups, images, desc_slab, freezemelt, liquidtype, paramtype, sunlight_propagates) +local function register_stair_and_slab(subname, recipeitem, def) + local recipedef = minetest.registered_nodes[recipeitem] + for _,i in pairs(recipe_values) do + if def[i] == nil + and recipedef[i] ~= nil then + def[i] = recipedef[i] + end + end + local groups = table.copy(def.groups) + groups.cooks_into_ice = nil + if groups.melts then + groups.melts = math.min(groups.melts+1, 3) + end + def.groups = groups + + local stair_desc = def.stair_desc + def.stair_desc = nil + local slab_desc = def.slab_desc + def.slab_desc = nil + + def.description = stair_desc + register_stair(subname, recipeitem, def) + + def.description = slab_desc + register_slab(subname, recipeitem, def) end @@ -269,58 +287,16 @@ list_of_snow_stuff = { --{"row[1] = first item in row", -- "row[2] = second item in row", -- "row[3] = third item in row", and so on, and so on...}, ~ LazyJ - {"ice", "default:ice", "default_ice.png", "Ice Stairs", "Ice Slabs"}, - {"snowblock", "default:snowblock", "default_snow.png", "Snowblock Stairs", "Snowblock Slabs"}, - {"snow_cobble", "snow:snow_cobble", "snow_snow_cobble.png", "Snow Cobble Stairs", "Snow Cobble Slabs"}, - {"snow_brick", "snow:snow_brick", "snow_snow_brick.png", "Snow Brick Stair", "Snow Brick Slab"}, + {"ice", "default:ice", "Ice Stairs", "Ice Slabs"}, + {"snowblock", "default:snowblock", "Snowblock Stairs", "Snowblock Slabs"}, + {"snow_cobble", "snow:snow_cobble", "Snow Cobble Stairs", "Snow Cobble Slabs"}, + {"snow_brick", "snow:snow_brick", "Snow Brick Stair", "Snow Brick Slab"}, + {"ice_brick", "snow:ice_brick", "Ice Brick Stair", "Ice Brick Slab"}, } -for _, row in ipairs(list_of_snow_stuff) do - local snow_subname = row[1] - local snow_recipeitem = row[2] - local snow_images = row[3] - local snow_desc_stair = row[4] - local snow_desc_slab = row[5] - - - - - snow_stairs.register_stair_and_slab(snow_subname, snow_recipeitem, - {cracky=2, crumbly=2, choppy=2, oddly_breakable_by_hand=2, melts=1, icemaker=1}, - {snow_images}, - snow_desc_stair, - snow_desc_slab, - "default:water_source", - "none", - "light", - true - ) - -end -- End the "list of snow stuff" part of the above section. ~ LazyJ - - --- Snow stairs and slabs should be easier to break than the more dense and --- manufactured, other snow-type nodes in the list above. ~ lazyJ -minetest.override_item("snow:stair_snowblock", { - groups = {cracky=3, crumbly=3, choppy=3, oddly_breakable_by_hand=3, melts=2, icemaker=1}, -}) - -minetest.override_item("snow:slab_snowblock", { - groups = {cracky=3, crumbly=3, choppy=3, oddly_breakable_by_hand=3, melts=2, icemaker=1}, -}) - - - --- Everything above is made of snow and uses snow sounds, ice, however, should sound more like glass --- and be harder to dig. ~ LazyJ -minetest.override_item("snow:stair_ice", { - groups = {cracky=1, crumbly=1, choppy=1, oddly_breakable_by_hand=1, melts=2, icemaker=1}, - use_texture_alpha = true, - sounds = default.node_sound_glass_defaults(), -}) - -minetest.override_item("snow:slab_ice", { - groups = {cracky=1, crumbly=1, choppy=1, oddly_breakable_by_hand=1, melts=2, icemaker=1}, - use_texture_alpha = true, - sounds = default.node_sound_glass_defaults(), -}) +for _, row in pairs(list_of_snow_stuff) do + register_stair_and_slab(row[1], row[2], { + stair_desc = row[3], + slab_desc = row[4], + }) +end diff --git a/mods/snow/src/crafting.lua b/mods/snow/src/crafting.lua index fcc1706a..d1735151 100755 --- a/mods/snow/src/crafting.lua +++ b/mods/snow/src/crafting.lua @@ -1,51 +1,17 @@ --[[ Crafting Sections (in order, top to bottom): - 1. Fuel - 2. Cooking - 3. Crafting and Recycling + 1. Cooking + 2. Crafting and Recycling The crafting recipe for the sled is in the sled.lua file. ~ LazyJ ---]] - --- 1. Fuel - -minetest.register_craft({ - type = "fuel", - recipe = "snow:needles", - burntime = 1, -}) +]] - -minetest.register_craft({ - type = "fuel", - recipe = "snow:sapling_pine", - burntime = 10, -}) - - - -minetest.register_craft({ - type = "fuel", - recipe = "snow:needles_decorated", - burntime = 1, -}) - - - -minetest.register_craft({ - type = "fuel", - recipe = "snow:xmas_tree", - burntime = 10, -}) - - - --- 2. Cooking +-- 1. Cooking --[[ "Cooks_into_ice" is a custom group I assigned to full-sized, snow-stuff nodes @@ -53,7 +19,7 @@ minetest.register_craft({ recipe for each one. ~ LazyJ ---]] +]] minetest.register_craft({ type = "cooking", @@ -67,17 +33,17 @@ minetest.register_craft({ --- 3. Crafting and Recycling +-- 2. Crafting and Recycling -- Let's make moss craftable so players can more easily create mossycobble and -- gives another useful purpose to pine needles. ~ LazyJ minetest.register_craft({ - output = 'snow:moss', - recipe = { - {'snow:needles', 'snow:needles'}, - {'snow:needles', 'snow:needles'}, - }, + output = "snow:moss", + recipe = { + {"snow:needles", "snow:needles"}, + {"snow:needles", "snow:needles"}, + }, }) @@ -95,91 +61,107 @@ of snowblocks (and then use them to water-grief by melting the snow blocks). minetest.register_craft({ type = "shapeless", - output = 'default:snowblock 2', + output = "default:snowblock 2", recipe = { - 'snow:snow_cobble', - 'snow:snow_cobble' - } + "snow:snow_cobble", + "snow:snow_cobble" + } }) --[[minetest.register_craft({ type = "shapeless", - output = 'default:snowblock 3', + output = "default:snowblock 3", recipe = { - 'default:snowblock', - 'default:snowblock' - } + "default:snowblock", + "default:snowblock" + } })]] minetest.register_craft({ - output = 'snow:snow_brick', - recipe = { - {'default:snowblock', 'default:snowblock'}, - {'default:snowblock', 'default:snowblock'} - } + output = "snow:snow_brick", + recipe = { + {"default:snowblock", "default:snowblock"}, + {"default:snowblock", "default:snowblock"} + } }) +-- Why not recycle snow_bricks back into snowblocks? ~ LazyJ +minetest.register_craft({ + output = "default:snowblock 4", + recipe = { + {"snow:snow_brick"} + } +}) + + +minetest.register_craft({ + output = "snow:ice_brick", + recipe = { + {"default:ice", "default:ice"}, + {"default:ice", "default:ice"} + } +}) + +minetest.register_craft({ + output = "snow:snow_cobble 6", + recipe = { + {"snow:ice_brick"} + } +}) + + --Craft icy snow. minetest.register_craft({ type = "shapeless", - output = 'snow:snow_cobble 6', + output = "snow:snow_cobble 6", recipe = { - 'default:snow', - 'default:snow', - 'default:snow', - 'default:snow', - 'default:snow', - 'default:snow', - 'default:ice', - 'default:ice', - 'default:ice' - } + "default:snow", + "default:snow", + "default:snow", + "default:snow", + "default:snow", + "default:snow", + "default:ice", + "default:ice", + "default:ice" + } }) minetest.register_craft({ type = "shapeless", - output = 'snow:snow_cobble 4', + output = "snow:snow_cobble 4", recipe = { - 'default:snow', - 'default:snow', - 'default:snow', - 'default:snow', - 'default:ice', - 'default:ice' - } + "default:snow", + "default:snow", + "default:snow", + "default:snow", + "default:ice", + "default:ice" + } }) minetest.register_craft({ type = "shapeless", - output = 'snow:snow_cobble 2', + output = "snow:snow_cobble 2", recipe = { - 'default:snow', - 'default:snow', - 'default:ice' - } + "default:snow", + "default:snow", + "default:ice" + } }) minetest.register_craft({ type = "shapeless", - output = 'snow:snow_cobble', + output = "snow:snow_cobble", recipe = { - 'default:snow', - 'default:ice' - } -}) - - --- Why not recycle snow_bricks back into snowblocks? ~ LazyJ -minetest.register_craft({ - output = 'default:snowblock 4', - recipe = { - {'snow:snow_brick'} - } + "default:snow", + "default:ice" + } }) diff --git a/mods/snow/src/mapgen.lua b/mods/snow/src/mapgen.lua index 455c92df..ca21307e 100755 --- a/mods/snow/src/mapgen.lua +++ b/mods/snow/src/mapgen.lua @@ -74,17 +74,6 @@ function snow.make_pine(pos,snow,xmas) minetest.add_node(pos, node) end end - --Clear ground. - for z = -1,1 do - for x = -1,1 do - local p = {x=pos.x+x,y=pos.y,z=pos.z+z} - local nd = minetest.get_node(p).name - if nd == "default:snow" - or nd == "default:snowblock" then - minetest.remove_node(p) - end - end - end if xmas then minetest.remove_node(pos) minetest.spawn_tree(pos, xmas_tree) @@ -126,18 +115,10 @@ function snow.voxelmanip_pine(pos,a,data) for x = -1,1 do local x = pos.x + x - --Clear ground. - local node = a:index(x,pos.y,z) - if data[node] == c_snow then - data[node] = c_air - end - --Make tree. for i = 1,2 do - local node = a:index(x,pos.y+i,z) - data[node] = c_pine_needles - if snow - and x ~= 0 + data[a:index(x,pos.y+i,z)] = c_pine_needles + if x ~= 0 and z ~= 0 and perlin1:get2d({x=x,y=z}) > 0.53 then local abovenode = a:index(x,pos.y+i+1,z) @@ -154,19 +135,17 @@ function snow.voxelmanip_pine(pos,a,data) data[a:index(x-1,y,z)] = c_pine_needles data[a:index(x,y,z+1)] = c_pine_needles data[a:index(x,y,z-1)] = c_pine_needles - if snow then - if perlin1:get2d({x=x+1,y=z}) > 0.53 then - data[a:index(x+1,y+1,z)] = c_snow - end - if perlin1:get2d({x=x+1,y=z}) > 0.53 then - data[a:index(x-1,y+1,z)] = c_snow - end - if perlin1:get2d({x=x,y=z+1}) > 0.53 then - data[a:index(x,y+1,z+1)] = c_snow - end - if perlin1:get2d({x=x,y=z-1}) > 0.53 then - data[a:index(x,y+1,z-1)] = c_snow - end + if perlin1:get2d({x=x+1,y=z}) > 0.53 then + data[a:index(x+1,y+1,z)] = c_snow + end + if perlin1:get2d({x=x+1,y=z}) > 0.53 then + data[a:index(x-1,y+1,z)] = c_snow + end + if perlin1:get2d({x=x,y=z+1}) > 0.53 then + data[a:index(x,y+1,z+1)] = c_snow + end + if perlin1:get2d({x=x,y=z-1}) > 0.53 then + data[a:index(x,y+1,z-1)] = c_snow end end for i=0, 4 do @@ -174,8 +153,7 @@ function snow.voxelmanip_pine(pos,a,data) end data[a:index(pos.x,pos.y+5,pos.z)] = c_pine_needles data[a:index(pos.x,pos.y+6,pos.z)] = c_pine_needles - if snow - and perlin1:get2d({x=pos.x,y=pos.z}) > 0.53 then + if perlin1:get2d({x=pos.x,y=pos.z}) > 0.53 then data[a:index(pos.x,pos.y+7,pos.z)] = c_snow end end diff --git a/mods/snow/src/mapgen_v6.lua b/mods/snow/src/mapgen_v6.lua index 0bb01fe1..8d8606a8 100755 --- a/mods/snow/src/mapgen_v6.lua +++ b/mods/snow/src/mapgen_v6.lua @@ -1,3 +1,14 @@ +-- https://github.com/paramat/meru/blob/master/init.lua#L52 +-- Parameters must match mgv6 biome noise +local np_default = { + offset = 0, + scale = 1, + spread = {x=250, y=250, z=250}, + seed = 9130, + octaves = 3, + persist = 0.5 +} + -- 2D noise for coldness local np_cold = { @@ -31,32 +42,85 @@ local function biome_to_string(num,num2) return biome end + local function do_ws_func(a, x) local n = x/(16000) local y = 0 for k=1,1000 do - y = y + 1000*(math.sin(math.pi * k^a * n)/(math.pi * k^a)) + y = y + 1000*math.sin(math.pi * k^a * n)/(math.pi * k^a) end return y end -local ws_lists = {} -local function get_ws_list(a,x) - ws_lists[a] = ws_lists[a] or {} - local v = ws_lists[a][x] - if v then - return v - end - v = {} - for x=x,x + (80 - 1) do - local y = do_ws_func(a, x) - v[x] = y - end - ws_lists[a][x] = v - return v + +local plantlike_ids = {} +local function is_plantlike(id) + if plantlike_ids[id] ~= nil then + return plantlike_ids[id] + end + local node = minetest.registered_nodes[minetest.get_name_from_content_id(id)] + if not node then + plantlike_ids[id] = false + return false + end + local drawtype = node.drawtype + if not drawtype + or drawtype ~= "plantlike" then + plantlike_ids[id] = false + return false + end + plantlike_ids[id] = true + return true end --- On generated function +local snowable_ids = {} +local function is_snowable(id) + if snowable_ids[id] ~= nil then + return snowable_ids[id] + end + local node = minetest.registered_nodes[minetest.get_name_from_content_id(id)] + if not node then + snowable_ids[id] = false + return false + end + local drawtype = node.drawtype + if drawtype + and drawtype ~= "normal" + and drawtype ~= "allfaces_optional" + and drawtype ~= "glasslike" then + snowable_ids[id] = false + return false + end + snowable_ids[id] = true + return true +end + +local c, replacements +local function define_contents() + c = { + dirt_with_grass = minetest.get_content_id("default:dirt_with_grass"), + dirt = minetest.get_content_id("default:dirt"), + tree = minetest.get_content_id("default:tree"), + apple = minetest.get_content_id("default:apple"), + snow = minetest.get_content_id("default:snow"), + snow_block = minetest.get_content_id("default:snowblock"), + dirt_with_snow = minetest.get_content_id("default:dirt_with_snow"), + air = minetest.get_content_id("air"), + ignore = minetest.get_content_id("ignore"), + stone = minetest.get_content_id("default:stone"), + dry_shrub = minetest.get_content_id("default:dry_shrub"), + snow_shrub = minetest.get_content_id("snow:shrub_covered"), + leaves = minetest.get_content_id("default:leaves"), + jungleleaves = minetest.get_content_id("default:jungleleaves"), + junglegrass = minetest.get_content_id("default:junglegrass"), + ice = minetest.get_content_id("default:ice"), + water = minetest.get_content_id("default:water_source"), + papyrus = minetest.get_content_id("default:papyrus"), + sand = minetest.get_content_id("default:sand"), + desert_sand = minetest.get_content_id("default:desert_sand"), + } + replacements = snow.known_plants or {} +end minetest.register_on_generated(function(minp, maxp, seed) local t1 = os.clock() @@ -66,45 +130,30 @@ minetest.register_on_generated(function(minp, maxp, seed) local x1 = maxp.x local z1 = maxp.z - local spawn_pine = snow.voxelmanip_pine local smooth = snow.smooth_biomes - local c_dirt_with_grass = minetest.get_content_id("default:dirt_with_grass") - local c_dirt = minetest.get_content_id("default:dirt") - local c_tree = minetest.get_content_id("default:tree") - local c_apple = minetest.get_content_id("default:apple") - local c_snow = minetest.get_content_id("default:snow") - local c_snow_block = minetest.get_content_id("default:snowblock") - local c_dirt_with_snow = minetest.get_content_id("default:dirt_with_snow") - local c_air = minetest.get_content_id("air") - local c_ignore = minetest.get_content_id("ignore") - local c_stone = minetest.get_content_id("default:stone") - local c_dry_shrub = minetest.get_content_id("default:dry_shrub") - local c_leaves = minetest.get_content_id("default:leaves") - local c_jungleleaves = minetest.get_content_id("default:jungleleaves") - local c_junglegrass = minetest.get_content_id("default:junglegrass") - local c_ice = minetest.get_content_id("default:ice") - local c_water = minetest.get_content_id("default:water_source") - local c_papyrus = minetest.get_content_id("default:papyrus") - local c_sand = minetest.get_content_id("default:sand") + if not c then + define_contents() + end - local vm = minetest.get_voxel_manip() - local emin, emax = vm:read_from_map(minp, maxp) + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") local area = VoxelArea:new({MinEdge=emin, MaxEdge=emax}) local data = vm:get_data() + local param2s = vm:get_param2_data() local snow_tab,num = {},1 + local pines_tab,pnum = {},1 local sidelen = x1 - x0 + 1 local chulens = {x=sidelen, y=sidelen, z=sidelen} - local nvals_cold = minetest.get_perlin_map(np_cold, chulens):get2dMap_flat({x=x0, y=z0}) - local nvals_ice = minetest.get_perlin_map(np_ice, chulens):get2dMap_flat({x=x0, y=z0}) + local nvals_default = minetest.get_perlin_map(np_default, chulens):get2dMap_flat({x=x0+150, y=z0+50}) + local nvals_cold, nvals_ice -- Choose biomes local pr = PseudoRandom(seed+57) -- Land biomes local biome = pr:next(1, 5) - local snowy = biome == 1 -- spawns alot of snow + local snowy = biome == 1 -- spawns snow local alpine = biome == 3 -- rocky terrain -- Misc biome settings local icy = pr:next(1, 2) == 2 -- if enabled spawns ice in sand instead of snow blocks @@ -119,21 +168,32 @@ minetest.register_on_generated(function(minp, maxp, seed) for z = z0, z1 do for x = x0, x1 do local in_biome = false - local test = nvals_cold[ni] - if smooth and (not snowy) - and (test > 0.73 or (test > 0.43 and pr:next(0,29) > (0.73 - test) * 100 )) then - in_biome = true - elseif (not smooth or snowy) and test > 0.53 then - in_biome = true - end + local test + if nvals_default[ni] < 0.35 then + if not nvals_cold then + nvals_cold = minetest.get_perlin_map(np_cold, chulens):get2dMap_flat({x=x0, y=z0}) + end + test = math.min(nvals_cold[ni], 1) + if smooth + and not snowy then + if (test > 0.73 or (test > 0.43 and pr:next(0,29) > (0.73 - test) * 100 )) then + in_biome = true + end + elseif test > 0.53 then + in_biome = true + end + end if not in_biome then - if alpine and test > 0.43 then + if alpine + and test + and test > 0.43 then + -- remove trees near alpine local ground_y = nil for y = maxp.y, minp.y, -1 do local nodid = data[area:index(x, y, z)] - if nodid ~= c_air - and nodid ~= c_ignore then + if nodid ~= c.air + and nodid ~= c.ignore then ground_y = y break end @@ -141,16 +201,17 @@ minetest.register_on_generated(function(minp, maxp, seed) if ground_y then local vi = area:index(x, ground_y, z) - if data[vi] == c_leaves or data[vi] == c_jungleleaves then + if data[vi] == c.leaves + or data[vi] == c.jungleleaves then for y = ground_y, -16, -1 do local vi = area:index(x, y, z) local id = data[vi] - if id ~= c_air then - if id == c_leaves - or id == c_jungleleaves - or id == c_tree - or id == c_apple then - data[vi] = c_air + if id ~= c.air then + if id == c.leaves + or id == c.jungleleaves + or id == c.tree + or id == c.apple then + data[vi] = c.air else break end @@ -159,8 +220,11 @@ minetest.register_on_generated(function(minp, maxp, seed) end end end - elseif in_biome then + else write_to_map = true + if not nvals_ice then + nvals_ice = minetest.get_perlin_map(np_ice, chulens):get2dMap_flat({x=x0, y=z0}) + end local icetype = nvals_ice[ni] local cool = icetype > 0 -- only spawns ice on edge of water local icebergs = icetype > -0.2 and icetype <= 0 @@ -168,10 +232,10 @@ minetest.register_on_generated(function(minp, maxp, seed) local icesheet = icetype > -0.6 and icetype <= -0.4 local icecave = icetype <= -0.6 - local ground_y = nil + local ground_y for y = maxp.y, minp.y, -1 do local nodid = data[area:index(x, y, z)] - if nodid ~= c_air and nodid ~= c_ignore then + if nodid ~= c.air and nodid ~= c.ignore then ground_y = y break end @@ -179,98 +243,68 @@ minetest.register_on_generated(function(minp, maxp, seed) if ground_y then local node = area:index(x, ground_y, z) - local abovenode = area:index(x, ground_y+1, z) - local belownode = area:index(x, ground_y-1, z) + local c_ground = data[node] - if ground_y and data[node] == c_dirt_with_grass then - if alpine and test > 0.53 then - snow_tab[num] = {abovenode, z, x, test} + if c_ground == c.dirt_with_grass then + if alpine + and test > 0.53 then + snow_tab[num] = {ground_y, z, x, test} num = num+1 - for y = ground_y, -6, -1 do + -- generate stone ground + for y = ground_y, math.max(-6, minp.y-6), -1 do local vi = area:index(x, y, z) - if data[vi] == c_stone then + if data[vi] == c.stone then break - else - data[vi] = c_stone end + data[vi] = c.stone end - elseif (shrubs and pr:next(1,28) == 1) then - data[node] = c_dirt_with_snow - data[abovenode] = c_dry_shrub - elseif pines and pr:next(1,36) == 1 then - data[node] = c_dirt_with_snow - spawn_pine({x=x, y=ground_y+1, z=z}, area, data) - elseif snowy and test > 0.63 then - data[abovenode] = c_snow_block + elseif pines + and pr:next(1,36) == 1 then + pines_tab[pnum] = {x=x, y=ground_y+1, z=z} + pnum = pnum+1 + elseif shrubs + and pr:next(1,928) == 1 then + data[node] = c.dirt_with_snow + data[area:index(x, ground_y+1, z)] = c.dry_shrub else - data[node] = c_dirt_with_snow - snow_tab[num] = {abovenode, z, x, test} - num = num+1 - end - elseif ground_y and data[node] == c_sand then - if not icy then - snow_tab[num] = {abovenode, z, x, test} - num = num+1 - else - data[node] = c_ice - end - elseif ground_y and data[node] == c_leaves - or data[node] == c_jungleleaves or data[node] == c_apple then - if alpine then - snow_tab[num] = {abovenode, z, x, test} - num = num+1 - for y = ground_y, -6, -1 do - local stone = area:index(x, y, z) - if data[stone] == c_stone then - break - else - data[stone] = c_stone - end + if snowy + or test > 0.8 then + -- more, deeper snow + data[node] = c.snow_block + else + data[node] = c.dirt_with_snow end - else - snow_tab[num] = {abovenode, z, x, test} + snow_tab[num] = {ground_y, z, x, test} num = num+1 end - elseif ground_y - and data[node] == c_junglegrass then - data[node] = c_dry_shrub - elseif ground_y - and data[node] == c_papyrus then - for y = ground_y, ground_y-4, -1 do - local vi = area:index(x, y, z) - if data[vi] == c_papyrus then - snow_tab[num] = {area:index(x, ground_y, z), z, x, test} - num = num+1 - data[vi] = c_snow_block - end - end - elseif ground_y - and data[node] == c_water then + elseif c_ground == c.water then if not icesheet and not icecave and not icehole then - local x1 = data[area:index(x+1, ground_y, z)] - local z1 = data[area:index(x, ground_y, z+1)] - local xz1 = data[area:index(x+1, ground_y, z+1)] - local xz2 = data[area:index(x-1, ground_y, z-1)] - local x2 = data[area:index(x-1, ground_y, z)] - local z2 = data[area:index(x, ground_y, z-1)] - local rand = (pr:next(1,4) == 1) and (cool or icebergs) + local nds = { + data[area:index(x+1, ground_y, z)], + data[area:index(x, ground_y, z+1)], + data[area:index(x+1, ground_y, z+1)], + data[area:index(x-1, ground_y, z-1)], + data[area:index(x-1, ground_y, z)], + data[area:index(x, ground_y, z-1)], + } local ice - if rand then - for _,i in ipairs({x1,z1,xz1,xz2,x2,z2}) do - if i == c_ice then + if pr:next(1,4) == 1 + and (cool or icebergs) then + for _,i in ipairs(nds) do + if i == c.ice then ice = true break end end end if not ice then - for _,i in ipairs({x1,z1,xz1,xz2,x2,z2}) do - if i ~= c_water - and i ~= c_ice - and i ~= c_air - and i ~= c_ignore then + for _,i in ipairs(nds) do + if i ~= c.water + and i ~= c.ice + and i ~= c.air + and i ~= c.ignore then ice = true break end @@ -278,26 +312,94 @@ minetest.register_on_generated(function(minp, maxp, seed) end local y = data[area:index(x, ground_y-1, z)] if ice - or (y ~= c_water and y ~= c_ice) -- and y ~= "air") …I don't think y can be a string here ~HybridDog + or (y ~= c.water and y ~= c.ice) -- and y ~= "air") …I don't think y can be a string here ~HybridDog or (icebergs and pr:next(1,6) == 1) then - data[node] = c_ice + data[node] = c.ice end else - if (icehole and pr:next(1,10) > 1) + if icesheet or icecave - or icesheet then - data[node] = c_ice + or (icehole and pr:next(1,10) > 1) then + data[node] = c.ice end if icecave then for y = ground_y-1, -33, -1 do local vi = area:index(x, y, z) - if data[vi] ~= c_water then + if data[vi] ~= c.water then break - else - data[vi] = c_air end + data[vi] = c.air end end + if icesheet then + -- put snow onto icesheets + snow_tab[num] = {ground_y, z, x, test} + num = num+1 + end + end + elseif c_ground == c.sand then + if icy then + data[node] = c.ice + end + snow_tab[num] = {ground_y, z, x, test} + num = num+1 + elseif c_ground == c.papyrus then + snow_tab[num] = {ground_y, z, x, test} + num = num+1 + -- replace papyrus plants with snowblocks + local y = ground_y + for _ = 1,7 do + local vi = area:index(x, y, z) + if data[vi] == c.papyrus then + data[vi] = c.snow_block + y = y-1 + else + break + end + end + elseif alpine then + -- make stone pillars out of trees and other stuff + for y = ground_y, math.max(-6, minp.y-6), -1 do + local stone = area:index(x, y, z) + if data[stone] == c.stone then + break + end + data[stone] = c.stone + end + -- put snow onto it + snow_tab[num] = {ground_y, z, x, test} + num = num+1 + elseif c_ground ~= c.desert_sand then + if is_snowable(c_ground) then + -- put snow onto it + snow_tab[num] = {ground_y, z, x, test} + num = num+1 + end + for y = 0, 12 do + y = ground_y-y + local vi = area:index(x, y, z) + local nd = data[vi] + local plantlike = is_plantlike(nd) + if replacements[nd] then + data[vi] = replacements[nd] + if plantlike then + param2s[vi] = pr:next(0,179) + end + elseif nd == c.dirt_with_grass then + data[vi] = c.dirt_with_snow + break + elseif plantlike then + local under = area:index(x, y-1, z) + if data[under] == c.dirt_with_grass then + -- replace other plants with shrubs + data[vi] = c.snow_shrub + param2s[vi] = pr:next(0,179) + data[under] = c.dirt_with_snow + break + end + elseif nd == c.stone then + break + end end end end @@ -306,37 +408,64 @@ minetest.register_on_generated(function(minp, maxp, seed) end end - local param2s if num ~= 1 then + for _,i in pairs(snow_tab) do + -- set snow + data[area:index(i[3], i[1]+1, i[2])] = c.snow + end local wsz, wsx for _,i in pairs(snow_tab) do - local p,z,x,test = unpack(i) - data[p] = c_snow - test = test-0.73 + local y,z,x,test = unpack(i) + test = (test-0.53)/0.47 -- /(1-0.53) if test > 0 then - local minh = math.floor(test*4*9)%9+1 - if minh ~= 1 then - if not wsz then - wsz = get_ws_list(5, z0) - wsx = get_ws_list(2, x0) - param2s = vm:get_param2_data() - end - local h = math.min(minh, math.floor(wsx[x]+wsz[z]*5)%9+1) + local maxh = math.floor(test*10)%10+1 + if maxh ~= 1 then + local h = math.floor( do_ws_func(2, x) + do_ws_func(5, z)*5)%10+1 if h ~= 1 then - if h == 9 then - h = 4 + -- search for nearby snow + y = y+1 + for i = -1,1,2 do + for _,cord in pairs({{x+i,z}, {x,z+i}}) do + local nd = data[area:index(cord[1], y, cord[2])] + if nd == c.air + or is_plantlike(nd) then + h = h/2 + end + end + end + h = math.floor(h+0.5) + if h > 1 then + -- make snowdrifts walkable + if h == 10 then + h = 5 + end + h = math.min(maxh, h) + local vi = area:index(x, y, z) + if h == 9 then + -- replace the snow with a snowblock because its a full node + data[vi] = c.snow_block + else + -- set a specific snow height + param2s[vi] = h*7 + end end - param2s[p] = h*7 end end end end end - vm:set_data(data) - if param2s then - vm:set_param2_data(param2s) + -- spawn pines + if pines + and pnum ~= 1 then + local spawn_pine = snow.voxelmanip_pine + for _,pos in pairs(pines_tab) do + spawn_pine(pos, area, data) + end end + + vm:set_data(data) + vm:set_param2_data(param2s) vm:set_lighting({day=0, night=0}) vm:calc_lighting() vm:write_to_map() diff --git a/mods/snow/src/nodes.lua b/mods/snow/src/nodes.lua index c2582bd6..94bf1fbd 100755 --- a/mods/snow/src/nodes.lua +++ b/mods/snow/src/nodes.lua @@ -1,7 +1,7 @@ -- NODES -- Pine Needles -minetest.register_node("snow:needles",{ +local nodedef = { description = "Pine Needles", drawtype = "allfaces_optional", visual_scale = 1.3, @@ -9,6 +9,7 @@ minetest.register_node("snow:needles",{ waving = 1, paramtype = "light", groups = {snappy=3, leafdecay=5}, + furnace_burntime = 1, drop = { max_items = 1, items = { @@ -18,14 +19,12 @@ minetest.register_node("snow:needles",{ rarity = 20, }, { - -- player will get leaves only if he get no saplings, - -- this is because max_items is 1 items = {'snow:needles'}, } } }, sounds = default.node_sound_leaves_defaults(), -}) +} --[[ If christmas_content is enabled, then this next part will override the pine needles' drop code @@ -33,36 +32,20 @@ If christmas_content is enabled, then this next part will override the pine need The Xmas tree needles are registred and defined a farther down in this nodes.lua file. ~ LazyJ - ---]] - +]] if snow.christmas_content then - --Christmas trees - - minetest.override_item("snow:needles", { - drop = { - max_items = 1, - items = { - { - -- player will get xmas tree with 1/120 chance - items = {'snow:xmas_tree'}, - rarity = 120, - }, - { - -- player will get sapling with 1/20 chance - items = {'snow:sapling_pine'}, - rarity = 20, - }, - { - -- player will get leaves only if he get no saplings, - -- this is because max_items is 1 - items = {'snow:needles'}, - } - } - } + table.insert(nodedef.drop.items, 1, { + -- player will get xmas tree with 1/120 chance + items = {'snow:xmas_tree'}, + rarity = 120, }) end +minetest.register_node("snow:needles", table.copy(nodedef)) + + + + --Christmas easter egg minetest.register_on_mapgen_init( function() @@ -73,102 +56,28 @@ end ) - ---[[ -Original, static Xmas lights. Keep so people can "turn off" the -animation if it is too much for them. ~ LazyJ - ---Decorated Pine leaves -minetest.register_node("snow:needles_decorated", { - description = "Decorated Pine Needles", - drawtype = "allfaces_optional", - tiles = {"snow_needles_decorated.png"}, - paramtype = "light", - groups = {snappy=3, leafdecay=3}, - drop = { - max_items = 1, - items = { - { - -- player will get xmas tree with 1/20 chance - items = {'snow:xmas_tree'}, - rarity = 50, - }, - { - -- player will get sapling with 1/20 chance - items = {'snow:sapling_pine'}, - rarity = 20, - }, - { - -- player will get leaves only if he get no saplings, - -- this is because max_items is 1 - items = {'snow:needles_decorated'}, - } - } - }, - sounds = default.node_sound_leaves_defaults(), -}) ---]] - - - --- Animated, "blinking lights" version. ~ LazyJ - -- Decorated Pine Leaves -minetest.register_node("snow:needles_decorated", { - description = "Decorated Pine Needles", - drawtype = "allfaces_optional", - light_source = 5, - inventory_image = minetest.inventorycube("snow_needles_decorated.png"), - --tiles = {"snow_needles_decorated.png"}, - tiles = { + +nodedef.description ="Decorated "..nodedef.description +nodedef.light_source = 5 +nodedef.waving = nil +if snow.disable_deco_needle_ani then + nodedef.tiles = {"snow_needles_decorated.png"} +else + -- Animated, "blinking lights" version. ~ LazyJ + nodedef.inventory_image = minetest.inventorycube("snow_needles_decorated.png") + nodedef.tiles = { {name="snow_needles_decorated_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=20.0}} - }, - paramtype = "light", - groups = {snappy=3, leafdecay=5}, - drop = { - max_items = 1, - items = { - { - -- player will get xmas tree with 1/120 chance - items = {'snow:xmas_tree'}, - rarity = 120, - }, - { - -- player will get sapling with 1/20 chance - items = {'snow:sapling_pine'}, - rarity = 20, - }, - { - -- player will get leaves only if he get no saplings, - -- this is because max_items is 1 - items = {'snow:needles_decorated'}, - } - } - }, - sounds = default.node_sound_leaves_defaults(), -}) + } +end +nodedef.drop.items[#nodedef.drop.items] = {items = {'snow:needles_decorated'}} + +minetest.register_node("snow:needles_decorated", nodedef) +-- Saplings - --- Xmas Tree Sapling -minetest.register_node("snow:xmas_tree", { - description = "Christmas Tree", - drawtype = "plantlike", - visual_scale = 1.0, - tiles = {"snow_xmas_tree.png"}, - inventory_image = "snow_xmas_tree.png", - wield_image = "snow_xmas_tree.png", - paramtype = "light", - walkable = false, - groups = {snappy=2,dig_immediate=3}, - sounds = default.node_sound_defaults(), -}) - - - --- Pine Sapling -minetest.register_node("snow:sapling_pine", { +nodedef = { description = "Pine Sapling", drawtype = "plantlike", visual_scale = 1.0, @@ -178,55 +87,62 @@ minetest.register_node("snow:sapling_pine", { paramtype = "light", walkable = false, groups = {snappy=2,dig_immediate=3}, + furnace_burntime = 10, sounds = default.node_sound_defaults(), +} -}) +-- Pine Sapling +minetest.register_node("snow:sapling_pine", table.copy(nodedef)) + +-- Xmas Tree Sapling +nodedef.description = "Christmas Tree" +nodedef.tiles = {"snow_xmas_tree.png"} +nodedef.inventory_image = "snow_xmas_tree.png" +nodedef.wield_image = "snow_xmas_tree.png" + +minetest.register_node("snow:xmas_tree", nodedef) - --- Star on Xmas Trees -minetest.register_node("snow:star", { +nodedef = { description = "Star", - --drawtype = "torchlike", - drawtype = "plantlike", -- Stars disappeared when viewed at the right angle. "Plantlike" solved the visual problem. ~ LazyJ + drawtype = "plantlike", tiles = {"snow_star.png"}, inventory_image = "snow_star.png", wield_image = "snow_star.png", paramtype = "light", walkable = false, - --groups = {snappy=2,dig_immediate=3}, - groups = {cracky=1, crumbly=1, choppy=1, oddly_breakable_by_hand=1}, -- Don't want the ornament breaking too easily because you have to punch it to turn it on and off. ~ LazyJ - sounds = default.node_sound_glass_defaults({dig = {name="default_glass_footstep", gain=0.2}}), -- Breaking "glass" sound makes it sound like a real, broken, Xmas tree ornament (Sorry, Mom!). ;)- ~ LazyJ + -- Don't want the ornament breaking too easily because you have to punch it to turn it on and off. ~ LazyJ + groups = {cracky=1, crumbly=1, choppy=1, oddly_breakable_by_hand=1}, + -- Breaking "glass" sound makes it sound like a real, broken, Xmas tree ornament (Sorry, Mom!). ;)- ~ LazyJ + sounds = default.node_sound_glass_defaults({dig = {name="default_glass_footstep", gain=0.2}}), on_punch = function(pos, node) -- Added a "lit" star that can be punched on or off depending on your preference. ~ LazyJ node.name = "snow:star_lit" minetest.set_node(pos, node) nodeupdate(pos) end, -}) - +} +-- Star on Xmas Trees +minetest.register_node("snow:star", table.copy(nodedef)) -- Star (Lit Version) on Xmas Trees -minetest.register_node("snow:star_lit", { - description = "Star Lighted", - drawtype = "plantlike", - light_source = LIGHT_MAX, - tiles = {"snow_star_lit.png"}, - wield_image = "snow_star.png", - paramtype = "light", - walkable = false, - drop = "snow:star", - groups = {cracky=1, crumbly=1, choppy=1, oddly_breakable_by_hand=1, not_in_creative_inventory=1}, - sounds = default.node_sound_glass_defaults({dig = {name="default_glass_footstep", gain=0.2}}), - on_punch = function(pos, node) - node.name = "snow:star" - minetest.set_node(pos, node) - nodeupdate(pos) - end, -}) +nodedef.description = nodedef.description.." Lighted" +nodedef.light_source = LIGHT_MAX +nodedef.tiles = {"snow_star_lit.png"} +nodedef.drop = "snow:star" +nodedef.groups.not_in_creative_inventory = 1 +nodedef.on_punch = function(pos, node) + node.name = "snow:star" + minetest.set_node(pos, node) + nodeupdate(pos) +end + +minetest.register_node("snow:star_lit", nodedef) +-- Plants + -- Moss minetest.register_node("snow:moss", { description = "Moss", @@ -241,8 +157,101 @@ minetest.register_node("snow:moss", { }, is_ground_content = true, groups = {crumbly=3, attached_node=1}, + furnace_burntime = 3, }) +-- Shrub(s) +nodedef = { + description = "Snow Shrub", + tiles = {"snow_shrub.png"}, + inventory_image = "snow_shrub.png", + wield_image = "snow_shrub.png", + drawtype = "plantlike", + paramtype = "light", + waving = 1, + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + buildable_to = true, + groups = {snappy=3,flammable=3,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, -5/16, 0.3}, + }, + furnace_burntime = 5, +} +minetest.register_node("snow:shrub", table.copy(nodedef)) + +nodedef.tiles = {"snow_shrub.png^snow_shrub_covering.png"} +nodedef.inventory_image = "snow_shrub.png^snow_shrub_covering.png" +nodedef.wield_image = "snow_shrub.png^snow_shrub_covering.png" +nodedef.drop = "snow:shrub" +nodedef.furnace_burntime = 3 +minetest.register_node("snow:shrub_covered", nodedef) + +-- Flowers +if rawget(_G, "flowers") then + -- broken flowers + snow.known_plants = {} + for _,name in pairs({"dandelion_yellow", "geranium", "rose", "tulip", "dandelion_white", "viola"}) do + local flowername = "flowers:"..name + local newname = "snow:flower_"..name + local flower = minetest.registered_nodes[flowername] + minetest.register_node(newname, { + drawtype = "plantlike", + tiles = { "snow_" .. name .. ".png" }, + sunlight_propagates = true, + paramtype = "light", + walkable = false, + drop = "", + groups = {snappy=3, attached_node = 1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = flower.selection_box + }) + snow.known_plants[minetest.get_content_id(flowername)] = minetest.get_content_id(newname) + end +end + +-- Leaves +local leaves = minetest.registered_nodes["default:leaves"] +nodedef = { + description = "Snow Leaves", + tiles = {"snow_leaves.png"}, + waving = 1, + visual_scale = leaves.visual_scale, + drawtype = leaves.drawtype, + paramtype = leaves.paramtype, + groups = leaves.groups, + drop = leaves.drop, + sounds = leaves.sounds, +} +nodedef.groups.flammable = 1 + +minetest.register_node("snow:leaves", nodedef) +snow.known_plants[minetest.get_content_id("default:leaves")] = minetest.get_content_id("snow:leaves") + +local apple = minetest.registered_nodes["default:apple"] +nodedef = { + description = "Snow Apple", + drawtype = "plantlike", + tiles = {"snow_apple.png"}, + paramtype = "light", + walkable = false, + sunlight_propagates = apple.sunlight_propagates, + selection_box = apple.selection_box, + groups = apple.groups, + sounds = apple.sounds, + drop = apple.drop, +} +nodedef.groups.flammable = 1 + +minetest.register_node("snow:apple", nodedef) +snow.known_plants[minetest.get_content_id("default:apple")] = minetest.get_content_id("snow:apple") + +-- TODO +snow.known_plants[minetest.get_content_id("default:jungleleaves")] = minetest.get_content_id("default:jungleleaves") + local function snow_onto_dirt(pos) @@ -257,12 +266,13 @@ end --- Snow Brick -minetest.register_node("snow:snow_brick", { +-- Bricks + +nodedef = { description = "Snow Brick", tiles = {"snow_snow_brick.png"}, is_ground_content = true, - freezemelt = "default:water_source", + --freezemelt = "default:water_source", -- deprecated liquidtype = "none", paramtype = "light", sunlight_propagates = true, @@ -281,33 +291,32 @@ minetest.register_node("snow:snow_brick", { -- The "on_construct" part below, thinking in terms of layers, dirt_with_snow could also -- double as dirt_with_frost which adds subtlety to the winterscape. ~ LazyJ on_construct = snow_onto_dirt +} + +-- Snow Brick +minetest.register_node("snow:snow_brick", table.copy(nodedef)) + + +-- hard Ice Brick, original texture from LazyJ +local ibdef = table.copy(nodedef) +ibdef.description = "Ice Brick" +ibdef.tiles = {"snow_ice_brick.png"} +ibdef.use_texture_alpha = true +ibdef.drawtype = "glasslike" +ibdef.groups = {cracky=1, crumbly=1, choppy=1, melts=1} +ibdef.sounds = default.node_sound_glass_defaults({ + dug = {name="default_hard_footstep", gain=1} }) +minetest.register_node("snow:ice_brick", ibdef) -- Snow Cobble ~ LazyJ -- Described as Icy Snow -minetest.register_node("snow:snow_cobble", { - description = "Icy Snow", - tiles = {"snow_snow_cobble.png"}, - is_ground_content = true, - liquidtype = "none", - paramtype = "light", - sunlight_propagates = true, - paramtype2 = "facedir", - -- I made this a little harder to dig than snow blocks because - -- I imagine snow brick as being much more dense and solid than fluffy snow. ~ LazyJ - groups = {cracky=2, crumbly=2, choppy=2, oddly_breakable_by_hand=2, melts=1, icemaker=1, cooks_into_ice=1}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_snow_footstep", gain=0.25}, - dig = {name="default_dig_crumbly", gain=0.4}, - dug = {name="default_snow_footstep", gain=0.75}, - place = {name="default_place_node", gain=1.0} - }), - -- The "on_construct" part below, thinking in terms of layers, dirt_with_snow could also - -- double as dirt_with_frost which adds subtlety to the winterscape. ~ LazyJ - on_construct = snow_onto_dirt -}) +nodedef.description = "Icy Snow" +nodedef.tiles = {"snow_snow_cobble.png"} + +minetest.register_node("snow:snow_cobble", nodedef) diff --git a/mods/snow/src/sled.lua b/mods/snow/src/sled.lua index 9e16b899..58f0cdfb 100755 --- a/mods/snow/src/sled.lua +++ b/mods/snow/src/sled.lua @@ -98,7 +98,7 @@ local function leave_sled(self, player) local name = player:get_player_name() players_sled[name] = false self.driver = nil - player:set_detach() + self.object:set_detach() default.player_attached[name] = false default.player_set_animation(player, "stand" , 30) diff --git a/mods/snow/textures/character_snow_man_preview.png b/mods/snow/textures/character_snow_man_preview.png index 2316d26f790a2b1b8c6184aa89c8d3b1fb9eac45..8f249e9d6adb77446679cf5ffaa9da661d0b3d9c 100755 GIT binary patch literal 3805 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 T`8h7<00000NkvXXu0mjfi(iZN literal 27318 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

@zGx@CykZio(LrIz>pF5GvlRCu!jOI!{Y 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 literal 25131 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 literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_dandelion_white.png b/mods/snow/textures/snow_dandelion_white.png new file mode 100755 index 0000000000000000000000000000000000000000..336e893992f492ecec5821aadb42996fca811a3a GIT binary patch literal 122 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`j-D=#Ar*|t3k)S#r>~#ip2%gQ zY*5Me=GN|BCFT{+c{eqBN^z$eJ~Z#{HDZ3|bLyx6Mn(mnZO3+S?EZhnfMt0a1N)(X V(%9oC`hkWqc)I$ztaD0e0s!Z1CtCmj literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_dandelion_yellow.png b/mods/snow/textures/snow_dandelion_yellow.png new file mode 100755 index 0000000000000000000000000000000000000000..3ebb9e62bb4681d4a82fc319523f053bbcfb9672 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`ww^AIAr*|t3k)S#^Vc6RV4Wp6 z!-u&~XTb@ESC!2*36qXFMf#k{JNw`M1KW?YNy`4p9LIlIH}EdFArOzopr0A3X(DF6Tf literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_geranium.png b/mods/snow/textures/snow_geranium.png new file mode 100755 index 0000000000000000000000000000000000000000..33b809d1900d51174a5e3d1f86d6add40645b248 GIT binary patch literal 269 zcmV+o0rLKdP)Ned^i*&c>M>v z#`_S1fzv6{V`BZCXa5(UzWjgT=}Z5~j?VtNH1af8XNUZU836J>*@nOjpqUo{Pz6`W TC|=kC00000NkvXXu0mjf4WDm1 literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_ice_brick.png b/mods/snow/textures/snow_ice_brick.png new file mode 100755 index 0000000000000000000000000000000000000000..a28fcce40c1f47983ec5f941a58ef894ce21c9d4 GIT binary patch literal 665 zcmV;K0%rY*P)zi zRoi#RVW4;e2MU~0TOF5f&?$m*oF2^2Oz}Cql#fqOBON^DWjo?)z(PrZD%4rEaQs?E zFc86-k73sjVrNj-@b2RmL;EtO2U|KbfiClv7Y{+G8|6jCe(9M4Dgv#*>*cuvj}8_T zTf#z$AQL)jc1by|ecdZ&JAgft2)tY%BbZWPp5*%}zBz0lrN{_4Jk_bRSkM)W{!> z1q0R#Z2%z{@wbP;P{dcacUZQqIaSAk2I$#C;qo_TXv-(CNHAXN5w{s z6ktI@5C5 z75gjIpZm30dFgtwHXcbC9Y{wZBqSy>GYp)&IiJ@MCzr~(kWs(yJ(pJ}%(VoAUVrJaR20z=O-eS4q-p^KpMTv1AEONI`nWVeH{oRa&zRFF_&Cg#tI!rKg lkh5UjDz#{KNT$NvdX73SCacx9_kk8Mc)I$ztaD0e0swxOMHT=6 literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_rose.png b/mods/snow/textures/snow_rose.png new file mode 100755 index 0000000000000000000000000000000000000000..7e32736663c914747fb67cc7105c92a7c75c4947 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`_MR?|Ar*|t5^oYj<}^N1eUcT| z)N|6TK_~oxN$@M)md~0DYMDAuGT*HG{7?STV%B3RxA`vnOk`BxDdBw^!^jZ6U#?wu S9&0$zCb=QOPvr0rfX+H7vu_`IE=K!%lJLn;Hq*EI*^-`Oy~FVdQ&MBb@ E0D;3s5&!@I literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_shrub_covering.png b/mods/snow/textures/snow_shrub_covering.png new file mode 100755 index 0000000000000000000000000000000000000000..8d7d05bdf5d911ba627a0fd2ce1771ed10fa2562 GIT binary patch literal 229 zcmV^P) zgjiROl0w*YDjX(4B1eqkDrIgt587ak=*Gj&RFO#sr|kC%Q90EhQC zQvhH%HBSI2b!)8rNfm(v)3aK4_fyDw+`~lwC1~wob S_Qe1I002ovP6b4+LSTZ9=6yl{ delta 268 zcmV+n0rUQ@0Vcy-##4ONufOo~Iu3!G^7zNIzFrDK4u*vw?YDos; Xf07?>TV?(M8pq)2>gTe~DWM4fn*}ND literal 0 HcmV?d00001 diff --git a/mods/snow/textures/snow_viola.png b/mods/snow/textures/snow_viola.png new file mode 100755 index 0000000000000000000000000000000000000000..95d2871a98c023f38e017fa40680a859f6500256 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Hl8kyAr*|t3T!=1fdNthzT4bN zeC8?UzO4O!@+!}<+soen;y;v9z0|_zrM+w8j@9RX+PltjoS_shaEXWE)Eni+i>{}| Q1I=OZboFyt=akR{0KEh#X8-^I literal 0 HcmV?d00001