diff --git a/init.lua b/init.lua index 7be56dc..a7fb6bd 100644 --- a/init.lua +++ b/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/src/abms.lua b/src/abms.lua index 04ae8d9..eb76120 100644 --- a/src/abms.lua +++ b/src/abms.lua @@ -4,7 +4,7 @@ minetest.register_abm({ interval = 1, chance = 1, action = function(pos, node) - minetest.add_node(pos,{name="default:snow"}) + minetest.add_node(pos, {name="default:snow"}) minetest.set_node_level(pos, 7*(tonumber(node.name:sub(-1)))) end, }) @@ -42,15 +42,17 @@ minetest.register_abm({ minetest.register_abm({ nodenames = {"group:melts"}, - neighbors = {"group:igniter","default:torch","default:furnace_active","group:hot"}, - interval = 2, + neighbors = {"group:igniter", "default:torch", "default:furnace_active", "group:hot"}, + interval = 10, chance = 2, action = function(pos, node) local intensity = minetest.get_item_group(node.name,"melts") if intensity == 1 then - minetest.add_node(pos,{name="default:water_source"}) + minetest.set_node(pos, {name="default:water_source"}) elseif intensity == 2 then - minetest.add_node(pos,{name="default:water_flowing", param2=7}) + minetest.set_node(pos, {name="default:water_flowing", param2=7}) + elseif intensity == 3 then + minetest.set_node(pos, {name="default:water_flowing", param2=3}) --[[ LazyJ, you need to add param2, which defines the amount of the flowing water ~ HybridDog 2015_03_06 This was causing "melts=2" nodes to just disappear so I changed it to replace the node with a water_source for a couple seconds and then replace the water_source with @@ -76,7 +78,9 @@ minetest.register_abm({ end end) --]] - end + else + return + end nodeupdate(pos) end, }) @@ -184,7 +188,7 @@ minetest.register_abm({ nodenames = {"snow:xmas_tree"}, interval = 10, chance = 50, - action = function(pos, node, active_object_count, active_object_count_wider) + action = function(pos, node) -- 'If' there is air in each of the 8 nodes dirctly above the sapling,... ~LazyJ for i = 1,8 do diff --git a/src/basic_stairs_slabs.lua b/src/basic_stairs_slabs.lua index a65872d..6cb67d1 100644 --- a/src/basic_stairs_slabs.lua +++ b/src/basic_stairs_slabs.lua @@ -6,77 +6,86 @@ -- ADD CHECK FOR MOREBLOCKS/SKIP IF NOT FOUND CODE STUFF HERE +-- what of the recipeitem can be copied +local recipe_values = { + "description", "tiles", "groups", "sounds", "use_texture_alpha", "sunlight_propagates", + "freezemelt", "liquidtype", "sunlight_propagates", + "stair_desc", "slab_desc" +} +local stairdef = { + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = true, + 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 p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 -snow_stairs = {} -- This is a little trick. Without it Minetest will complain - -- "attempt to index global 'snow' (a nil value)" and - -- refuse to load. So a value without definition "={}"is assigned to snow. + 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 + + 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 + local node = minetest.get_node(pos) + if node.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 node.name == "default:dirt" then + node.name = "default:dirt_with_snow" + minetest.set_node(pos, node) + end + end +} -- Node will be called snow:stair_ -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