fix stairs and slabs

This commit is contained in:
HybridDog 2015-06-13 10:36:08 +02:00
parent acb5141cbe
commit de80a0910e
3 changed files with 199 additions and 219 deletions

View File

@ -50,7 +50,6 @@ http://github.com/Splizard/minetest-mod-snow/
-- Original init.lua File Broken into Smaller Files -- Original init.lua File Broken into Smaller Files
dofile(minetest.get_modpath("snow").."/src/abms.lua") dofile(minetest.get_modpath("snow").."/src/abms.lua")
dofile(minetest.get_modpath("snow").."/src/aliases.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/crafting.lua")
dofile(minetest.get_modpath("snow").."/src/snowball.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. -- 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 -- 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/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/mapgen.lua")
dofile(minetest.get_modpath("snow").."/src/sled.lua") dofile(minetest.get_modpath("snow").."/src/sled.lua")
dofile(minetest.get_modpath("snow").."/src/falling_snow.lua") dofile(minetest.get_modpath("snow").."/src/falling_snow.lua")

View File

@ -4,7 +4,7 @@ minetest.register_abm({
interval = 1, interval = 1,
chance = 1, chance = 1,
action = function(pos, node) 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)))) minetest.set_node_level(pos, 7*(tonumber(node.name:sub(-1))))
end, end,
}) })
@ -42,15 +42,17 @@ minetest.register_abm({
minetest.register_abm({ minetest.register_abm({
nodenames = {"group:melts"}, nodenames = {"group:melts"},
neighbors = {"group:igniter","default:torch","default:furnace_active","group:hot"}, neighbors = {"group:igniter", "default:torch", "default:furnace_active", "group:hot"},
interval = 2, interval = 10,
chance = 2, chance = 2,
action = function(pos, node) action = function(pos, node)
local intensity = minetest.get_item_group(node.name,"melts") local intensity = minetest.get_item_group(node.name,"melts")
if intensity == 1 then if intensity == 1 then
minetest.add_node(pos,{name="default:water_source"}) minetest.set_node(pos, {name="default:water_source"})
elseif intensity == 2 then 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 --[[ 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 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 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) end)
--]] --]]
end else
return
end
nodeupdate(pos) nodeupdate(pos)
end, end,
}) })
@ -184,7 +188,7 @@ minetest.register_abm({
nodenames = {"snow:xmas_tree"}, nodenames = {"snow:xmas_tree"},
interval = 10, interval = 10,
chance = 50, 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 -- 'If' there is air in each of the 8 nodes dirctly above the sapling,... ~LazyJ
for i = 1,8 do for i = 1,8 do

View File

@ -6,77 +6,86 @@
-- ADD CHECK FOR MOREBLOCKS/SKIP IF NOT FOUND CODE STUFF HERE -- 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 local placer_pos = placer:getpos()
-- "attempt to index global 'snow' (a nil value)" and if placer_pos then
-- refuse to load. So a value without definition "={}"is assigned to snow. 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_<subname> -- Node will be called snow:stair_<subname>
function snow_stairs.register_stair(subname, recipeitem, groups, images, description, sounds) local function register_stair(subname, recipeitem, newdef)
minetest.register_node("snow:stair_" .. subname, { local def = table.copy(stairdef)
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 p0 = pointed_thing.under
local p1 = pointed_thing.above
local param2 = 0
local placer_pos = placer:getpos() for n,i in pairs(newdef) do
if placer_pos then def[n] = i
local dir = { end
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 local name = "snow:stair_" .. subname
param2 = param2 + 20 minetest.register_node(name, def)
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
})
--[[ --[[
-- for replace ABM -- for replace ABM
minetest.register_node("snow:stair_" .. subname.."upside_down", { 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({ minetest.register_craft({
output = 'snow:stair_' .. subname .. ' 6', output = name .. " 6",
recipe = { recipe = {
{recipeitem, "", ""}, {recipeitem, "", ""},
{recipeitem, recipeitem, ""}, {recipeitem, recipeitem, ""},
@ -95,7 +104,7 @@ function snow_stairs.register_stair(subname, recipeitem, groups, images, descrip
-- Flipped recipe -- Flipped recipe
minetest.register_craft({ minetest.register_craft({
output = 'snow:stair_' .. subname .. ' 6', output = name .. " 6",
recipe = { recipe = {
{"", "", recipeitem}, {"", "", recipeitem},
{"", recipeitem, recipeitem}, {"", recipeitem, recipeitem},
@ -104,59 +113,76 @@ function snow_stairs.register_stair(subname, recipeitem, groups, images, descrip
}) })
end 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_<subname> -- Node will be called snow:slab_<subname>
function snow_stairs.register_slab(subname, recipeitem, groups, images, description, sounds) local function register_slab(subname, recipeitem, newdef)
minetest.register_node("snow:slab_" .. subname, { local def = table.copy(slabdef)
description = description,
drawtype = "nodebox", local name = "snow:slab_" .. subname
tiles = images, def.on_place = function(itemstack, placer, pointed_thing)
paramtype = "light", if pointed_thing.type ~= "node" then
paramtype2 = "facedir", return itemstack
is_ground_content = true, end
groups = groups,
sounds = default.node_sound_dirt_defaults({ -- If it's being placed on an another similar one, replace it with
footstep = {name="default_snow_footstep", gain=0.25}, -- a full block
dig = {name="default_dig_crumbly", gain=0.4}, local slabpos, slabnode
dug = {name="default_snow_footstep", gain=0.75}, local p0 = pointed_thing.under
place = {name="default_place_node", gain=1.0} local p1 = pointed_thing.above
}), local n0 = minetest.get_node(p0)
node_box = { local n1 = minetest.get_node(p1)
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, local n0_is_upside_down = (n0.name == name and
}, n0.param2 >= 20)
on_place = function(itemstack, placer, pointed_thing)
if pointed_thing.type ~= "node" then if n0.name == name
return itemstack 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 end
return itemstack
end
-- If it's being placed on an another similar one, replace it with local param2
-- a full block -- Upside down slabs
local slabpos = nil if p0.y-1 == p1.y then
local slabnode = nil -- Turn into full block if pointing at a existing slab
local p0 = pointed_thing.under if n0_is_upside_down then
local p1 = pointed_thing.above -- Remove the slab at the position of the slab
local n0 = minetest.get_node(p0) minetest.remove_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)
-- Make a fake stack of a single item and try to place it -- Make a fake stack of a single item and try to place it
local fakestack = ItemStack(recipeitem) local fakestack = ItemStack(recipeitem)
fakestack:set_count(itemstack:get_count()) fakestack:set_count(itemstack:get_count())
pointed_thing.above = slabpos pointed_thing.above = p0
local success local success
fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) fakestack, success = minetest.item_place(fakestack, placer, pointed_thing)
-- If the item was taken from the fake stack, decrement original -- 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()) itemstack:set_count(fakestack:get_count())
-- Else put old node back -- Else put old node back
else else
minetest.set_node(slabpos, slabnode) minetest.set_node(p0, n0)
end end
return itemstack return itemstack
end end
-- Upside down slabs -- Place upside down slab
if p0.y-1 == p1.y then param2 = 20
-- Turn into full block if pointing at a existing slab elseif n0_is_upside_down
if n0_is_upside_down then and p0.y+1 ~= p1.y 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
-- If pointing at the side of a upside down slab -- If pointing at the side of a upside down slab
if n0_is_upside_down and p0.y+1 ~= p1.y then param2 = 20
param2 = 20 end
end
return minetest.item_place(itemstack, placer, pointed_thing, param2) return minetest.item_place(itemstack, placer, pointed_thing, param2)
end, end
on_construct = function(pos) for n,i in pairs(newdef) do
pos.y = pos.y - 1 def[n] = i
if minetest.get_node(pos).name == "default:dirt_with_grass" end
-- 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
}) minetest.register_node(name, def)
--[[ --[[
-- for replace ABM -- for replace ABM
minetest.register_node("snow:slab_" .. subname.."upside_down", { 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({ minetest.register_craft({
output = 'snow:slab_' .. subname .. ' 6', output = name .. " 6",
recipe = { recipe = {
{recipeitem, recipeitem, recipeitem}, {recipeitem, recipeitem, recipeitem},
}, },
@ -259,9 +255,31 @@ minetest.register_abm({
-- features (freezing, melting, and how they change dirt and dirt_with_grass). ~ LazyJ -- features (freezing, melting, and how they change dirt and dirt_with_grass). ~ LazyJ
-- Nodes will be called snow:{stair,slab}_<subname> -- Nodes will be called snow:{stair,slab}_<subname>
function snow_stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, freezemelt, liquidtype, paramtype, sunlight_propagates) local function register_stair_and_slab(subname, recipeitem, def)
snow_stairs.register_stair(subname, recipeitem, groups, images, desc_stair, freezemelt, liquidtype, paramtype, sunlight_propagates) local recipedef = minetest.registered_nodes[recipeitem]
snow_stairs.register_slab(subname, recipeitem, groups, images, desc_slab, freezemelt, liquidtype, paramtype, sunlight_propagates) 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 end
@ -269,58 +287,16 @@ list_of_snow_stuff = {
--{"row[1] = first item in row", --{"row[1] = first item in row",
-- "row[2] = second item in row", -- "row[2] = second item in row",
-- "row[3] = third item in row", and so on, and so on...}, ~ LazyJ -- "row[3] = third item in row", and so on, and so on...}, ~ LazyJ
{"ice", "default:ice", "default_ice.png", "Ice Stairs", "Ice Slabs"}, {"ice", "default:ice", "Ice Stairs", "Ice Slabs"},
{"snowblock", "default:snowblock", "default_snow.png", "Snowblock Stairs", "Snowblock Slabs"}, {"snowblock", "default:snowblock", "Snowblock Stairs", "Snowblock Slabs"},
{"snow_cobble", "snow:snow_cobble", "snow_snow_cobble.png", "Snow Cobble Stairs", "Snow Cobble Slabs"}, {"snow_cobble", "snow:snow_cobble", "Snow Cobble Stairs", "Snow Cobble Slabs"},
{"snow_brick", "snow:snow_brick", "snow_snow_brick.png", "Snow Brick Stair", "Snow Brick Slab"}, {"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 for _, row in pairs(list_of_snow_stuff) do
local snow_subname = row[1] register_stair_and_slab(row[1], row[2], {
local snow_recipeitem = row[2] stair_desc = row[3],
local snow_images = row[3] slab_desc = row[4],
local snow_desc_stair = row[4] })
local snow_desc_slab = row[5] end
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(),
})