VoxeLibre/mods/ITEMS/stairs/init.lua

497 lines
16 KiB
Lua
Raw Normal View History

2015-06-29 19:55:56 +02:00
-- Minetest 0.4 mod: stairs
-- See README.txt for licensing and other information.
2017-01-16 12:46:51 +01:00
-- Global namespace for functions
2015-06-29 19:55:56 +02:00
stairs = {}
2017-06-05 16:10:21 +02:00
local function place_slab_normal(itemstack, placer, pointed_thing)
2017-06-05 15:41:42 +02:00
local p0 = pointed_thing.under
local p1 = pointed_thing.above
local placer_pos = placer:getpos()
local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
local fpos = finepos.y % 1
local place = ItemStack(itemstack)
local origname = itemstack:get_name()
if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
or (fpos < -0.5 and fpos > -0.999999999) then
place:set_name(origname .. "_top")
end
local ret = minetest.item_place(place, placer, pointed_thing, 0)
ret:set_name(origname)
return ret
end
local function place_stair(itemstack, placer, pointed_thing)
local p0 = pointed_thing.under
local p1 = pointed_thing.above
local param2 = 0
local placer_pos = placer:getpos()
if placer_pos then
param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos))
end
local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
local fpos = finepos.y % 1
if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
or (fpos < -0.5 and fpos > -0.999999999) 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
2017-01-16 12:46:51 +01:00
-- Register stairs.
2015-06-29 19:55:56 +02:00
-- Node will be called stairs:stair_<subname>
2017-01-16 12:46:51 +01:00
function stairs.register_stair(subname, recipeitem, groups, images, description, sounds, hardness)
2017-01-16 12:46:51 +01:00
groups.stair = 1
groups.building_block = 1
2015-06-29 19:55:56 +02:00
minetest.register_node(":stairs:stair_" .. subname, {
description = description,
2017-03-11 01:51:06 +01:00
_doc_items_longdesc = "Stairs are useful to reach higher places by walking over them; jumping is not required. Placing stairs in a corner pattern will create corner stairs. Stairs placed on the ceiling will be placed upside down.",
2017-01-16 12:46:51 +01:00
drawtype = "mesh",
mesh = "stairs_stair.obj",
2015-06-29 19:55:56 +02:00
tiles = images,
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = false,
is_ground_content = false,
2015-06-29 19:55:56 +02:00
groups = groups,
sounds = sounds,
2017-01-16 12:46:51 +01:00
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 = {
2015-06-29 19:55:56 +02:00
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
2017-01-16 12:46:51 +01:00
2017-06-05 15:41:42 +02:00
return place_stair(itemstack, placer, pointed_thing)
2015-06-29 19:55:56 +02:00
end,
_mcl_hardness = hardness,
2015-06-29 19:55:56 +02:00
})
2017-01-16 12:46:51 +01:00
if recipeitem then
minetest.register_craft({
2017-01-16 15:16:57 +01:00
output = 'stairs:stair_' .. subname .. ' 4',
2017-01-16 12:46:51 +01:00
recipe = {
{recipeitem, "", ""},
{recipeitem, recipeitem, ""},
{recipeitem, recipeitem, recipeitem},
2015-07-04 04:56:02 +02:00
},
2017-01-16 12:46:51 +01:00
})
2015-07-04 04:56:02 +02:00
2017-01-16 15:16:57 +01:00
-- Flipped recipe
2017-01-16 12:46:51 +01:00
minetest.register_craft({
2017-01-16 15:16:57 +01:00
output = 'stairs:stair_' .. subname .. ' 4',
2017-01-16 12:46:51 +01:00
recipe = {
{"", "", recipeitem},
{"", recipeitem, recipeitem},
{recipeitem, recipeitem, recipeitem},
},
})
end
2015-06-29 19:55:56 +02:00
end
2017-01-16 12:46:51 +01:00
-- Slab facedir to placement 6d matching table
local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4}
-- Register slabs.
2015-06-29 19:55:56 +02:00
-- Node will be called stairs:slab_<subname>
2017-01-16 12:46:51 +01:00
-- double_description, full_node: NEW arguments, not supported in Minetest Game
-- double_description: If set, add a separate “double slab” node. The description is the name of this new node
-- full_node: If set, this node is used when two nodes are placed on top of each other. Use this if recipeitem is a group
function stairs.register_slab(subname, recipeitem, groups, images, description, sounds, hardness, double_description, full_node)
2017-06-05 15:45:47 +02:00
local lower_slab = "stairs:slab_"..subname
local upper_slab = lower_slab.."_top"
local double_slab = lower_slab.."_double"
2017-01-16 12:46:51 +01:00
groups.slab = 1
groups.building_block = 1
2017-03-20 18:36:27 +01:00
local longdesc = "Slabs are half as high as their full block counterparts. Slabs can be easily stepped on without needing to jump. They are useful to create long staircases and many other structures. Slabs placed on the ceiling of another block will be upside-down."
2017-03-11 01:51:06 +01:00
if double_description then
longdesc = longdesc .. " When a slab of this particular type is placed on another slab of the same type, a double slab is created."
else
longdesc = longdesc .. " When a slab of this particular type is placed on another slab of the same type, a new full block is created."
end
2017-06-05 15:41:42 +02:00
local slabdef = {
2015-06-29 19:55:56 +02:00
description = description,
2017-03-11 01:51:06 +01:00
_doc_items_longdesc = longdesc,
2015-06-29 19:55:56 +02:00
drawtype = "nodebox",
tiles = images,
paramtype = "light",
2017-06-05 15:41:42 +02:00
-- Facedir intentionally left out (see below)
sunlight_propagates = false,
is_ground_content = false,
2015-06-29 19:55:56 +02:00
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)
2017-01-16 12:46:51 +01:00
local under = minetest.get_node(pointed_thing.under)
local wield_item = itemstack:get_name()
local creative_enabled = minetest.setting_getbool("creative_mode")
2015-06-29 19:55:56 +02:00
2017-06-05 16:10:21 +02:00
-- place slab using under node orientation
local dir = vector.subtract(pointed_thing.above, pointed_thing.under)
local p2 = under.param2
-- combine two slabs if possible
-- Requirements: Same slab material, must be placed on top of lower slab, or on bottom of upper slab
if (wield_item == under.name or wield_item == minetest.registered_nodes[under.name]._mcl_other_slab_half) and
not ((dir.y >= 0 and minetest.get_item_group(under.name, "slab_top") == 1) or
(dir.y <= 0 and minetest.get_item_group(under.name, "slab_top") == 0)) then
if not recipeitem then
2015-06-29 19:55:56 +02:00
return itemstack
end
2017-06-05 16:10:21 +02:00
local player_name = placer:get_player_name()
if minetest.is_protected(pointed_thing.under, player_name) and not
minetest.check_player_privs(placer, "protection_bypass") then
minetest.record_protection_violation(pointed_thing.under,
player_name)
return
2015-06-29 19:55:56 +02:00
end
2017-06-05 16:10:21 +02:00
local newnode
if full_node then
newnode = full_node
elseif double_description then
newnode = double_slab
else
newnode = recipeitem
end
minetest.set_node(pointed_thing.under, {name = newnode, param2 = p2})
if not creative_enabled then
2015-06-29 19:55:56 +02:00
itemstack:take_item()
end
2017-01-16 12:46:51 +01:00
return itemstack
2017-06-05 16:10:21 +02:00
-- No combination possible: Place slab normally
2017-01-16 12:46:51 +01:00
else
2017-06-05 16:10:21 +02:00
return place_slab_normal(itemstack, placer, pointed_thing)
2015-06-29 19:55:56 +02:00
end
end,
_mcl_hardness = hardness,
2017-06-05 16:10:21 +02:00
_mcl_other_slab_half = upper_slab,
2017-06-05 15:41:42 +02:00
}
2017-06-05 15:45:47 +02:00
minetest.register_node(":"..lower_slab, slabdef)
2017-06-05 15:41:42 +02:00
-- Register the upper slab.
-- Using facedir is not an option, as this would rotate the textures as well and would make
-- e.g. upper sandstone slabs look completely wrong.
local topdef = table.copy(slabdef)
topdef.groups.slab = 1
topdef.groups.slab_top = 1
topdef.groups.not_in_creative_inventory = 1
2017-06-05 15:54:10 +02:00
topdef.groups.not_in_craft_guide = 1
2017-06-05 15:41:42 +02:00
topdef.description = string.format("Upper %s", description)
topdef._doc_items_create_entry = false
topdef._doc_items_longdesc = nil
topdef._doc_items_usagehelp = nil
2017-06-05 15:45:47 +02:00
topdef.drop = lower_slab
2017-06-05 16:10:21 +02:00
topdef._mcl_other_slab_half = lower_slab
2017-06-05 15:41:42 +02:00
topdef.node_box = {
type = "fixed",
fixed = {-0.5, 0, -0.5, 0.5, 0.5, 0.5},
}
topdef.selection_box = {
type = "fixed",
fixed = {-0.5, 0, -0.5, 0.5, 0.5, 0.5},
}
2017-06-05 15:45:47 +02:00
minetest.register_node(":"..upper_slab, topdef)
2017-06-05 15:41:42 +02:00
2015-06-29 19:55:56 +02:00
-- Double slab node
local dgroups = table.copy(groups)
dgroups.not_in_creative_inventory = 1
if double_description then
2017-06-05 15:45:47 +02:00
minetest.register_node(":"..double_slab, {
description = double_description,
2017-03-11 01:51:06 +01:00
_doc_items_longdesc = "Double slabs are full blocks which are created by placing two slabs of the same kind on each other.",
paramtype2 = "facedir",
tiles = images,
is_ground_content = false,
groups = dgroups,
sounds = sounds,
2017-06-05 15:45:47 +02:00
drop = lower_slab .. " 2",
_mcl_hardness = hardness,
})
end
2017-01-16 12:46:51 +01:00
if recipeitem then
minetest.register_craft({
2017-06-05 15:45:47 +02:00
output = lower_slab .. " 6",
2017-01-16 12:46:51 +01:00
recipe = {
{recipeitem, recipeitem, recipeitem},
},
})
end
2017-06-05 15:41:42 +02:00
-- Help alias for the upper slab
if minetest.get_modpath("doc") then
2017-06-05 15:45:47 +02:00
doc.add_entry_alias("nodes", lower_slab, "nodes", upper_slab)
2017-06-05 15:41:42 +02:00
end
2017-01-16 12:46:51 +01:00
end
-- Stair/slab registration function.
2015-06-29 19:55:56 +02:00
-- Nodes will be called stairs:{stair,slab}_<subname>
2017-01-16 12:46:51 +01:00
function stairs.register_stair_and_slab(subname, recipeitem,
groups, images, desc_stair, desc_slab, sounds, hardness,
double_description, full_node)
stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds, hardness)
stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds, hardness, double_description, full_node)
2015-06-29 19:55:56 +02:00
end
-- Very simple registration function
-- Makes stair and slab out of a source node
function stairs.register_stair_and_slab_simple(subname, sourcenode, desc_stair, desc_slab)
local def = minetest.registered_nodes[sourcenode]
local groups = {}
-- Only allow a strict set of groups to be added to stairs and slabs for more predictable results
local allowed_groups = { "dig_immediate", "handy", "pickaxey", "axey", "shovely", "shearsy", "shearsy_wool", "swordy", "swordy_wool" }
for a=1, #allowed_groups do
if def.groups[allowed_groups[a]] then
groups[allowed_groups[a]] = def.groups[allowed_groups[a]]
end
end
stairs.register_stair_and_slab(subname, sourcenode, groups, def.tiles, desc_stair, desc_slab, def.sounds, def._mcl_hardness)
end
-- Register all Minecraft stairs and slabs
-- Note about hardness: For some reason, the hardness of slabs and stairs don't always match nicely, so that some
-- slabs actually take slightly longer to be dug than their stair counterparts.
-- Note sure if it is a good idea to preserve this oddity.
2017-01-16 12:46:51 +01:00
2017-01-31 23:32:56 +01:00
stairs.register_stair("wood", "mcl_core:wood",
{handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1},
2015-06-29 19:55:56 +02:00
{"default_wood.png"},
2017-01-07 04:13:58 +01:00
"Oak Wood Stairs",
mcl_sounds.node_sound_wood_defaults(),
2)
2017-01-31 23:32:56 +01:00
stairs.register_slab("wood", "mcl_core:wood",
{handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1},
{"default_wood.png"},
2017-01-04 06:56:37 +01:00
"Oak Wood Slab",
mcl_sounds.node_sound_wood_defaults(),
2)
2017-01-31 23:32:56 +01:00
stairs.register_stair("junglewood", "mcl_core:junglewood",
{handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1},
2015-06-29 19:55:56 +02:00
{"default_junglewood.png"},
2017-01-07 04:13:58 +01:00
"Jungle Wood Stairs",
mcl_sounds.node_sound_wood_defaults(),
2)
2017-01-31 23:32:56 +01:00
stairs.register_slab("junglewood", "mcl_core:junglewood",
{handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1},
{"default_junglewood.png"},
2017-01-04 06:56:37 +01:00
"Jungle Wood Slab",
mcl_sounds.node_sound_wood_defaults(),
2)
2017-01-31 23:32:56 +01:00
stairs.register_stair("acaciawood", "mcl_core:acaciawood",
{handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1},
{"default_acacia_wood.png"},
2017-01-07 04:13:58 +01:00
"Acacia Wood Stairs",
mcl_sounds.node_sound_wood_defaults(),
2)
2017-01-31 23:32:56 +01:00
stairs.register_slab("acaciawood", "mcl_core:acaciawood",
{handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1},
{"default_acacia_wood.png"},
2017-01-04 06:56:37 +01:00
"Acacia Wood Slab",
mcl_sounds.node_sound_wood_defaults(),
2)
2017-06-05 15:41:42 +02:00
2017-01-31 23:32:56 +01:00
stairs.register_stair("sprucewood", "mcl_core:sprucewood",
{handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1},
{"mcl_core_planks_spruce.png"},
2017-01-07 04:13:58 +01:00
"Spruce Wood Stairs",
mcl_sounds.node_sound_wood_defaults(),
2)
2017-01-31 23:32:56 +01:00
stairs.register_slab("sprucewood", "mcl_core:sprucewood",
{handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1},
{"mcl_core_planks_spruce.png"},
2017-01-04 06:56:37 +01:00
"Spruce Wood Slab",
mcl_sounds.node_sound_wood_defaults(),
2)
2015-06-29 19:55:56 +02:00
2017-01-31 23:32:56 +01:00
stairs.register_stair("birchwood", "mcl_core:birchwood",
{handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1},
{"mcl_core_planks_birch.png"},
"Birch Wood Stairs",
mcl_sounds.node_sound_wood_defaults(),
2)
2017-01-31 23:32:56 +01:00
stairs.register_slab("birchwood", "mcl_core:birchwood",
{handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1},
{"mcl_core_planks_birch.png"},
"Birch Wood Slab",
mcl_sounds.node_sound_wood_defaults(),
2)
2017-01-31 23:32:56 +01:00
stairs.register_stair("darkwood", "mcl_core:darkwood",
{handy=1,axey=1, flammable=3,wood_stairs=1, material_wood=1},
{"mcl_core_planks_big_oak.png"},
"Dark Oak Wood Stairs",
mcl_sounds.node_sound_wood_defaults(),
2)
stairs.register_slab("darkwood", "mcl_core:darkwood",
{handy=1,axey=1, flammable=3,wood_slab=1, material_wood=1},
{"mcl_core_planks_big_oak.png"},
"Dark Oak Wood Slab",
mcl_sounds.node_sound_wood_defaults(),
2)
2017-02-07 19:55:49 +01:00
stairs.register_slab("stone", "mcl_core:stone",
{pickaxey=1, material_stone=1},
{"stairs_stone_slab_top.png", "stairs_stone_slab_top.png", "stairs_stone_slab_side.png"},
2015-06-29 19:55:56 +02:00
"Stone Slab",
mcl_sounds.node_sound_stone_defaults(), 2, "Double Stone Slab")
2015-06-29 19:55:56 +02:00
stairs.register_stair_and_slab_simple("cobble", "mcl_core:cobble", "Cobblestone Stairs", "Cobblestone Slab")
stairs.register_stair_and_slab_simple("brick_block", "mcl_core:brick_block", "Brick Stairs", "Brick Slab")
stairs.register_stair("sandstone", "group:sandstone",
{pickaxey=1, material_stone=1},
{"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"},
2017-01-07 04:13:58 +01:00
"Sandstone Stairs",
mcl_sounds.node_sound_stone_defaults(), 0.8, nil, "mcl_core:sandstone")
stairs.register_slab("sandstone", "group:sandstone",
{pickaxey=1, material_stone=1},
{"mcl_core_sandstone_top.png", "mcl_core_sandstone_bottom.png", "mcl_core_sandstone_normal.png"},
2015-06-29 19:55:56 +02:00
"Sandstone Slab",
mcl_sounds.node_sound_stone_defaults(), 2, nil, "mcl_core:sandstone")
2015-06-29 19:55:56 +02:00
stairs.register_stair("redsandstone", "group:redsandstone",
{pickaxey=1, material_stone=1},
{"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"},
2017-01-07 04:13:58 +01:00
"Red Sandstone Stairs",
mcl_sounds.node_sound_stone_defaults(), 0.8, nil, "mcl_core:redsandstone")
stairs.register_slab("redsandstone", "group:redsandstone",
{pickaxey=1, material_stone=1},
{"mcl_core_red_sandstone_top.png", "mcl_core_red_sandstone_bottom.png", "mcl_core_red_sandstone_normal.png"},
2017-01-04 06:56:37 +01:00
"Red Sandstone Slab",
mcl_sounds.node_sound_stone_defaults(), 2, nil, "mcl_core:redsandstone")
2017-01-04 06:56:37 +01:00
stairs.register_stair("stonebrick", "group:stonebrick",
{pickaxey=1, material_stone=1},
2015-06-29 19:55:56 +02:00
{"default_stone_brick.png"},
2017-01-07 04:13:58 +01:00
"Stone Bricks Stairs",
mcl_sounds.node_sound_stone_defaults(), 1.5, nil, "mcl_core:stonebrick")
stairs.register_slab("stonebrick", "group:stonebrick",
{pickaxey=1, material_stone=1},
{"default_stone_brick.png"},
2017-01-04 06:56:37 +01:00
"Stone Bricks Slab",
mcl_sounds.node_sound_stone_defaults(), 2, nil, "mcl_core:stonebrick")
stairs.register_stair("quartzblock", "group:quartz_block",
{pickaxey=1, material_stone=1},
{"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"},
"Quartz Stairs",
mcl_sounds.node_sound_stone_defaults(), 0.8, nil, "mcl_nether:quartz_block")
stairs.register_slab("quartzblock", "group:quartz_block",
{pickaxey=1, material_stone=1},
{"mcl_nether_quartz_block_top.png", "mcl_nether_quartz_block_bottom.png", "mcl_nether_quartz_block_side.png"},
"Quartz Slab",
mcl_sounds.node_sound_stone_defaults(), 2, nil, "mcl_nether:quartz_block")
2015-06-29 19:55:56 +02:00
2017-02-08 19:52:04 +01:00
stairs.register_stair_and_slab("nether_brick", "mcl_nether:nether_brick",
{pickaxey=1, material_stone=1},
{"mcl_nether_nether_brick.png"},
"Nether Brick Stairs",
"Nether Brick Slab",
mcl_sounds.node_sound_stone_defaults(),
2)
stairs.register_stair("purpur_block", "mcl_end:purpur_block",
{pickaxey=1, material_stone=1},
2017-01-07 04:09:18 +01:00
{"mcl_end_purpur_block.png"},
"Purpur Stairs",
mcl_sounds.node_sound_stone_defaults(),
1.5)
stairs.register_slab("purpur_block", "mcl_end:purpur_block",
{pickaxey=1, material_stone=1},
{"mcl_end_purpur_block.png"},
2017-01-07 04:09:18 +01:00
"Purpur Slab",
mcl_sounds.node_sound_stone_defaults(),
2)
2017-01-07 04:09:18 +01:00
2017-01-05 03:09:19 +01:00
minetest.register_craft({
2017-01-31 23:32:56 +01:00
output = 'mcl_core:sandstonecarved',
2017-01-05 03:09:19 +01:00
recipe = {
{'stairs:slab_sandstone'},
{'stairs:slab_sandstone'}
}
})
minetest.register_craft({
2017-01-31 23:32:56 +01:00
output = 'mcl_core:redsandstonecarved',
2017-01-05 03:09:19 +01:00
recipe = {
{'stairs:slab_redsandstone'},
{'stairs:slab_redsandstone'}
}
})
2017-01-07 03:35:24 +01:00
minetest.register_craft({
2017-01-31 23:32:56 +01:00
output = 'mcl_core:stonebrickcarved',
2017-01-07 03:35:24 +01:00
recipe = {
{'stairs:slab_stonebrick'},
{'stairs:slab_stonebrick'}
}
})
2017-01-07 04:09:18 +01:00
minetest.register_craft({
output = 'mcl_end:purpur_pillar',
recipe = {
{'stairs:slab_purpur_block'},
{'stairs:slab_purpur_block'}
}
})
2017-01-10 06:43:07 +01:00
-- Fuel
minetest.register_craft({
type = "fuel",
recipe = "group:wood_stairs",
burntime = 15,
})
minetest.register_craft({
type = "fuel",
recipe = "group:wood_slab",
-- Original burn time: 7.5 (PC edition)
burntime = 8,
2017-01-10 06:43:07 +01:00
})
2017-06-05 15:41:42 +02:00