This commit is contained in:
HybridDog 2016-02-18 15:21:12 +00:00
commit 0199e6590f
2 changed files with 324 additions and 215 deletions

View file

@ -195,29 +195,20 @@ Stairs API
The stairs API lets you register stairs and slabs and ensures that they are registered the same way as those
delivered with Minetest Game, to keep them compatible with other mods.
stairs.register_stair(subname, recipeitem, groups, images, description, sounds)
stairs.register_stair({origin = string[, fixed_name = string, recipe = string, add_crafting = bool}, extradef])
-> Registers a stair.
-> subname: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname"
-> recipeitem: Item used in the craft recipe, e.g. "default:cobble"
-> groups: see [Known damage and digging time defining groups]
-> images: see [Tile definition]
-> description: used for the description field in the stair's definition
-> sounds: see [#Default sounds]
-> origin is the node the stair consists of, selected parts of the node definition of origin are copied and used for the stair, TODO: find out why it copies weird stuff although dumping the def of the original node (superpick mod) doesn't show them and try to avoid it
-> fixed_name can be used to avoid giving the stair a name automatically, do not use it for register_stair_and_slab
-> recipe is the craft recipe, if omitted origin is used
-> add_crafting can be set to false to disable adding a craft recipe for the stair
-> extradef is a custom node definition table, it can be used e.g. to give the slab a specific drop
stairs.register_slab(subname, recipeitem, groups, images, description, sounds)
-> Registers a slabs
-> subname: Basically the material name (e.g. cobble) used for the stair name. Nodename pattern: "stairs:stair_subname"
-> recipeitem: Item used in the craft recipe, e.g. "default:cobble"
-> groups: see [Known damage and digging time defining groups]
-> images: see [Tile definition]
-> description: used for the description field in the stair's definition
-> sounds: see [#Default sounds]
stairs.register_slab is like register_stair but adds a slab
stairs.register_stair_and_slab calls register_stair and register_slab
stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds)
-> A wrapper for stairs.register_stair and stairs.register_slab
-> Uses almost the same arguments as stairs.register_stair
-> desc_stair: Description for stair node
-> desc_slab: Description for slab node
For example, following code adds a stone slab and stair:
stairs.register_stair_and_slab({origin = "default:stone"})
The stair is named "default:stair_stone" and contains groups, sounds, etc. from "default:stone".
Xpanes API
----------

View file

@ -7,47 +7,14 @@
stairs = {}
-- Register aliases for new pine node names
minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood")
minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood")
-- Get setting for replace ABM
local replace = minetest.setting_getbool("enable_stairs_replace_abm")
-- Register stairs.
-- Node will be called stairs:stair_<subname>
-- link functions instead of redefining them every time
function stairs.register_stair(subname, recipeitem, groups, images, description, sounds)
groups.stair = 1
minetest.register_node(":stairs:stair_" .. subname, {
description = description,
drawtype = "mesh",
mesh = "stairs_stair.obj",
tiles = images,
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = groups,
sounds = sounds,
selection_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},
},
},
collision_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)
local function on_place_stair(itemstack, placer, pointed_thing)
if pointed_thing.type ~= "node" then
return itemstack
end
@ -76,57 +43,9 @@ function stairs.register_stair(subname, recipeitem, groups, images, description,
end
return minetest.item_place(itemstack, placer, pointed_thing, param2)
end,
})
-- for replace ABM
if replace then
minetest.register_node(":stairs:stair_" .. subname .. "upside_down", {
replace_name = "stairs:stair_" .. subname,
groups = {slabs_replace = 1},
})
end
minetest.register_craft({
output = 'stairs:stair_' .. subname .. ' 6',
recipe = {
{recipeitem, "", ""},
{recipeitem, recipeitem, ""},
{recipeitem, recipeitem, recipeitem},
},
})
-- Flipped recipe for the silly minecrafters
minetest.register_craft({
output = 'stairs:stair_' .. subname .. ' 6',
recipe = {
{"", "", recipeitem},
{"", recipeitem, recipeitem},
{recipeitem, recipeitem, recipeitem},
},
})
end
-- Register slabs.
-- Node will be called stairs:slab_<subname>
function stairs.register_slab(subname, recipeitem, groups, images, description, sounds)
groups.slab = 1
minetest.register_node(":stairs:slab_" .. subname, {
description = description,
drawtype = "nodebox",
tiles = images,
paramtype = "light",
paramtype2 = "facedir",
is_ground_content = false,
groups = groups,
sounds = sounds,
node_box = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
},
on_place = function(itemstack, placer, pointed_thing)
local function on_place_slab(itemstack, placer, pointed_thing, slabname, recipeitem)
if pointed_thing.type ~= "node" then
return itemstack
end
@ -141,14 +60,14 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
local n1 = minetest.get_node(p1)
local param2 = 0
local n0_is_upside_down = (n0.name == "stairs:slab_" .. subname and
local n0_is_upside_down = (n0.name == slabname and
n0.param2 >= 20)
if n0.name == "stairs:slab_" .. subname and not n0_is_upside_down and
if n0.name == slabname and not n0_is_upside_down and
p0.y + 1 == p1.y then
slabpos = p0
slabnode = n0
elseif n1.name == "stairs:slab_" .. subname then
elseif n1.name == slabname then
slabpos = p1
slabnode = n1
end
@ -207,59 +126,226 @@ function stairs.register_slab(subname, recipeitem, groups, images, description,
end
return minetest.item_place(itemstack, placer, pointed_thing, param2)
end,
})
end
-- boxes for stairs and slabs
local stairbox = {
type = "fixed",
fixed = {
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
{-0.5, 0, 0, 0.5, 0.5, 0.5},
},
}
local slabbox = {
type = "fixed",
fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
}
-- contents of the node definition which gets copied
local to_copy = {"tiles", "use_texture_alpha", "post_effect_color",
"is_ground_content", "walkable", "pointable", "diggable", "climbable",
"buildable_to", "light_source", "damage_per_second", "sounds", "groups",
"sunlight_propagates"}
-- Node will be called like origin, just with "stair_" after the ":"
function stairs.register_stair(data, extradef, groups, images, description, sounds)
if groups then
-- support the previous function using a tail call
local ldata = {
fixed_name = "stairs:stair_" .. data,
origin = extradef,
}
if replace then
ldata.upside_down = ldata.fixed_name .. "upside_down"
end
return stairs.register_stair(
ldata,
{
description = description,
tiles = images,
groups = groups,
sounds = sounds,
}
)
end
local origname = data.origin
local origdef = minetest.registered_nodes[origname]
if not origdef then
origdef = {}
minetest.log("error", "[stairs] "..origname.." should exist before adding a stair for it.")
end
local def = {}
for _,i in pairs(to_copy) do
def[i] = rawget(origdef, i)
end
if origdef.description then
def.description = origdef.description.." Stair"
end
def.drawtype = "mesh"
def.mesh = "stairs_stair.obj"
def.paramtype = "light"
def.paramtype2 = "facedir"
def.selection_box = stairbox
def.collision_box = stairbox
def.on_place = on_place_stair
if extradef then
for i,v in pairs(extradef) do
def[i] = v
end
end
def.groups = def.groups or {}
def.groups.stair = 1
local name = data.fixed_name
if not name then
local modname, nodename = unpack(string.split(origname, ":"))
name = modname..":stair_"..nodename
end
minetest.register_node(":"..name, def)
-- for replace ABM
if replace then
minetest.register_node(":stairs:slab_" .. subname .. "upside_down", {
replace_name = "stairs:slab_".. subname,
if data.upside_down then
minetest.register_node(":"..data.upside_down, {
replace_name = name,
groups = {slabs_replace = 1},
})
end
if data.add_crafting == false then
return
end
local input = data.recipe or origname
minetest.register_craft({
output = 'stairs:slab_' .. subname .. ' 6',
output = name .. " 6",
recipe = {
{recipeitem, recipeitem, recipeitem},
{input, "", ""},
{input, input, ""},
{input, input, input},
},
})
-- Flipped recipe for the silly minecrafters
minetest.register_craft({
output = name .. " 6",
recipe = {
{"", "", input},
{"", input, input},
{input, input, input},
},
})
end
-- Node will be called like origin, just with "slab_" after the ":"
function stairs.register_slab(data, extradef, groups, images, description, sounds)
if groups then
-- support the previous function using a tail call
local ldata = {
fixed_name = "stairs:slab_" .. data,
origin = extradef,
}
if replace then
ldata.upside_down = ldata.fixed_name .. "upside_down"
end
return stairs.register_slab(
ldata,
{
description = description,
tiles = images,
groups = groups,
sounds = sounds,
}
)
end
local origname = data.origin
local origdef = minetest.registered_nodes[origname]
if not origdef then
origdef = {}
minetest.log("error", "[stairs] "..origname.." should exist before adding a slab for it.")
end
local def = {}
for _,i in pairs(to_copy) do
def[i] = rawget(origdef, i)
end
if origdef.description then
def.description = origdef.description.." Slab"
end
def.drawtype = "nodebox"
def.paramtype = "light"
def.paramtype2 = "facedir"
def.node_box = slabbox
local name = data.fixed_name
if not name then
local modname, nodename = unpack(string.split(origname, ":"))
name = modname..":slab_"..nodename
end
def.on_place = function(itemstack, placer, pointed_thing)
return on_place_slab(itemstack, placer, pointed_thing, name, origname)
end
if extradef then
for i,v in pairs(extradef) do
def[i] = v
end
end
def.groups = def.groups or {}
def.groups.slab = 1
minetest.register_node(":"..name, def)
-- for replace ABM
if data.upside_down then
minetest.register_node(":"..data.upside_down, {
replace_name = name,
groups = {slabs_replace = 1},
})
end
if data.add_crafting == false then
return
end
local input = data.recipe or origname
minetest.register_craft({
output = name .. " 6",
recipe = {
{input, input, input},
},
})
end
-- Optionally replace old "upside_down" nodes with new param2 versions.
-- Disabled by default.
if replace then
minetest.register_abm({
nodenames = {"group:slabs_replace"},
interval = 16,
chance = 1,
action = function(pos, node)
node.name = minetest.registered_nodes[node.name].replace_name
node.param2 = node.param2 + 20
if node.param2 == 21 then
node.param2 = 23
elseif node.param2 == 23 then
node.param2 = 21
end
minetest.set_node(pos, node)
end,
})
end
-- Stair/slab registration function.
-- Nodes will be called stairs:{stair,slab}_<subname>
-- If groups etc. given (deprecated), nodes will be called stairs:{stair,slab}_<subname>
function stairs.register_stair_and_slab(subname, recipeitem, groups, images,
desc_stair, desc_slab, sounds)
function stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds)
stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds)
stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds)
end
-- Register default stairs and slabs
-- TODO: put this into default and use the new way of adding stairs and slabs
stairs.register_stair_and_slab("wood", "default:wood",
{snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3},
@ -407,3 +493,35 @@ stairs.register_stair_and_slab("goldblock", "default:goldblock",
"Gold Block Stair",
"Gold Block Slab",
default.node_sound_stone_defaults())
-- legacy
-- Register aliases for new pine node names
minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood")
minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood")
-- Optionally replace old "upside_down" nodes with new param2 versions.
-- Disabled by default.
if replace then
minetest.register_abm({
nodenames = {"group:slabs_replace"},
interval = 16,
chance = 1,
action = function(pos, node)
node.name = minetest.registered_nodes[node.name].replace_name
node.param2 = node.param2 + 20
if node.param2 == 21 then
node.param2 = 23
elseif node.param2 == 23 then
node.param2 = 21
end
minetest.set_node(pos, node)
end,
})
end