140 lines
4.6 KiB
Lua
140 lines
4.6 KiB
Lua
--note that this does not support hardware coloring as well as some other stuff
|
|
fl_stairs = {}
|
|
|
|
fl_stairs.details = {
|
|
version = 5,
|
|
name = "fl_stairs",
|
|
author = "wsor",
|
|
license = "MIT",
|
|
}
|
|
|
|
local stairtable = {
|
|
{
|
|
"slab",
|
|
{-0.5, -0.5, -0.5, 0.5, 0, 0.5},
|
|
},
|
|
{
|
|
"stair",
|
|
{
|
|
{-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
|
|
{-0.5, 0.0, 0.0, 0.5, 0.5, 0.5},
|
|
},
|
|
},
|
|
{
|
|
"inner_stair",
|
|
{
|
|
{-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
|
|
{-0.5, 0.0, 0.0, 0.5, 0.5, 0.5},
|
|
{-0.5, 0.0, -0.5, 0.0, 0.5, 0.0},
|
|
},
|
|
},
|
|
{
|
|
"outer_stair",
|
|
{
|
|
{-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
|
|
{-0.5, 0.0, 0.0, 0.0, 0.5, 0.5},
|
|
},
|
|
},
|
|
}
|
|
|
|
local function slab_onplace(itemstack, placer, pointed_thing)
|
|
if pointed_thing.type ~= "node" then return itemstack end
|
|
|
|
if minetest.get_node(pointed_thing.under).name == itemstack:get_name() and not placer:get_player_control().sneak then
|
|
minetest.set_node(pointed_thing.under, {name=string.sub(itemstack:get_name(), 1, -6)})
|
|
if minetest.is_creative_enabled(placer:get_player_name()) == false then
|
|
itemstack:take_item()
|
|
end
|
|
return itemstack
|
|
end
|
|
minetest.rotate_and_place(itemstack, placer, pointed_thing, true, {force_facedir = true}, true)
|
|
end
|
|
|
|
local function sstiles(nodedef, dtype)
|
|
local t = nodedef.tiles[dtype] or nodedef.tiles
|
|
if string.sub(nodedef.drawtype, 1, 5) == "glass" and t[2] then
|
|
local j = {{name = t[1] .. "^" .. t[2]}}
|
|
j[1].align_style = nodedef._disable_worldaligned and "node" or "world"
|
|
return j
|
|
end
|
|
for i = 1, #t do
|
|
if type(t[i]) == "string" then
|
|
t[i] = {name = t[i]}
|
|
end
|
|
t[i].align_style = nodedef._disable_worldaligned and "node" or "world"
|
|
end
|
|
return t
|
|
end
|
|
|
|
function fl_stairs.register_stairslab(itemstring)
|
|
local nodedef = minetest.registered_nodes[itemstring]
|
|
|
|
local paramtype2 = "facedir"
|
|
if nodedef.palette then paramtype2 = "colorfacedir" end
|
|
|
|
for _, stairinfo in pairs(stairtable) do
|
|
|
|
local regnode = itemstring .. "_" .. stairinfo[1]
|
|
local groups = table.copy(nodedef.groups)
|
|
groups[stairinfo[1]] = 1
|
|
groups.stairable, groups.wallable, groups.not_in_creative_inventory = nil, nil, 1
|
|
|
|
minetest.register_node(":" .. regnode, {
|
|
description = nodedef.description .. " " .. stairinfo[1],
|
|
tiles = sstiles(nodedef, "_" .. stairinfo[1]),
|
|
paramtype = "light",
|
|
paramtype2 = paramtype2,
|
|
palette = nodedef.palette,
|
|
use_texture_alpha = nodedef.use_texture_alpha,
|
|
drawtype = "nodebox",
|
|
node_box = {
|
|
type = "fixed",
|
|
fixed = stairinfo[2],
|
|
},
|
|
on_place = function(itemstack, placer, pointed_thing)
|
|
if stairinfo[1] == "slab" then
|
|
slab_onplace(itemstack, placer, pointed_thing)
|
|
else
|
|
minetest.rotate_node(itemstack, placer, pointed_thing)
|
|
end
|
|
end,
|
|
drop = nodedef.drop and nodedef.drop.stairs and nodedef.drop.stairs[stairinfo[1]],
|
|
groups = groups,
|
|
})
|
|
end
|
|
end
|
|
|
|
function fl_stairs.register_wall(itemstring)
|
|
local nodedef = minetest.registered_nodes[itemstring]
|
|
local groups = table.copy(nodedef.groups)
|
|
groups. stairable, groups.wallable, groups.wall, groups.not_in_creative_inventory = nil, nil, 1, 1
|
|
|
|
minetest.register_node(":" .. itemstring .. "_wall", {
|
|
description = nodedef.description .. " wall",
|
|
tiles = nodedef.tiles,
|
|
paramtype = "light",
|
|
drawtype = "nodebox",
|
|
node_box = {
|
|
type = "connected",
|
|
fixed = {-1/4, -1/2, -1/4, 1/4, 1/2, 1/4},
|
|
connect_front = {-3/16, -1/2, -1/2, 3/16, 3/8, -1/4},
|
|
connect_left = {-1/2, -1/2, -3/16, -1/4, 3/8, 3/16},
|
|
connect_back = {-3/16, -1/2, 1/4, 3/16, 3/8, 1/2},
|
|
connect_right = { 1/4, -1/2, -3/16, 1/2, 3/8, 3/16},
|
|
},
|
|
connects_to = {"group:wall", "group:wood_related", "group:stonelike"},
|
|
drop = nodedef.drop and nodedef.drop.walls,
|
|
groups = groups,
|
|
})
|
|
end
|
|
|
|
minetest.register_on_mods_loaded(function()
|
|
for _, node in pairs(minetest.registered_nodes) do
|
|
if node.groups.stairable == 1 then
|
|
fl_stairs.register_stairslab(node.name)
|
|
end
|
|
if node.groups.wallable == 1 then
|
|
fl_stairs.register_wall(node.name)
|
|
end
|
|
end
|
|
end) |