1 -- Minetest 0.4 mod: stairs
2 -- See README.txt for licensing and other information.
5 -- Global namespace for functions
10 -- Register aliases for new pine node names
12 minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood")
13 minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood")
16 -- Get setting for replace ABM
18 local replace = minetest.setting_getbool("enable_stairs_replace_abm")
22 -- Node will be called stairs:stair_<subname>
24 function stairs.register_stair(subname, recipeitem, groups, images, description, sounds)
26 minetest.register_node(":stairs:stair_" .. subname, {
27 description = description,
29 mesh = "stairs_stair.obj",
32 paramtype2 = "facedir",
33 is_ground_content = false,
39 {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
40 {-0.5, 0, 0, 0.5, 0.5, 0.5},
46 {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
47 {-0.5, 0, 0, 0.5, 0.5, 0.5},
50 on_place = function(itemstack, placer, pointed_thing)
51 if pointed_thing.type ~= "node" then
55 local p0 = pointed_thing.under
56 local p1 = pointed_thing.above
59 local placer_pos = placer:getpos()
62 x = p1.x - placer_pos.x,
63 y = p1.y - placer_pos.y,
64 z = p1.z - placer_pos.z
66 param2 = minetest.dir_to_facedir(dir)
69 if p0.y - 1 == p1.y then
73 elseif param2 == 23 then
78 return minetest.item_place(itemstack, placer, pointed_thing, param2)
84 minetest.register_node(":stairs:stair_" .. subname .. "upside_down", {
85 replace_name = "stairs:stair_" .. subname,
86 groups = {slabs_replace = 1},
91 minetest.register_craft({
92 output = 'stairs:stair_' .. subname .. ' 8',
95 {recipeitem, recipeitem, ""},
96 {recipeitem, recipeitem, recipeitem},
100 -- Flipped recipe for the silly minecrafters
101 minetest.register_craft({
102 output = 'stairs:stair_' .. subname .. ' 8',
104 {"", "", recipeitem},
105 {"", recipeitem, recipeitem},
106 {recipeitem, recipeitem, recipeitem},
113 -- Slab facedir to placement 6d matching table
114 local slab_trans_dir = {[0] = 8, 0, 2, 1, 3, 4}
115 -- Slab facedir when placing initial slab against other surface
116 local slab_trans_dir_place = {[0] = 0, 20, 12, 16, 4, 8}
119 -- Node will be called stairs:slab_<subname>
121 function stairs.register_slab(subname, recipeitem, groups, images, description, sounds)
123 minetest.register_node(":stairs:slab_" .. subname, {
124 description = description,
125 drawtype = "nodebox",
128 paramtype2 = "facedir",
129 is_ground_content = false,
134 fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
136 on_place = function(itemstack, placer, pointed_thing)
137 local under = minetest.get_node(pointed_thing.under)
138 local wield_item = itemstack:get_name()
140 if under and wield_item == under.name then
141 -- place slab using under node orientation
142 local dir = minetest.dir_to_facedir(vector.subtract(
143 pointed_thing.above, pointed_thing.under), true)
145 local p2 = under.param2
147 -- combine two slabs if possible
148 if slab_trans_dir[math.floor(p2 / 4)] == dir then
149 if not recipeitem then
152 local player_name = placer:get_player_name()
153 if minetest.is_protected(pointed_thing.under, player_name) and not
154 minetest.check_player_privs(placer, "protection_bypass") then
155 minetest.record_protection_violation(pointed_thing.under,
159 minetest.set_node(pointed_thing.under, {name = recipeitem, param2 = p2})
160 if not minetest.setting_getbool("creative_mode") then
161 itemstack:take_item()
166 -- Placing a slab on an upside down slab should make it right-side up.
167 if p2 >= 20 and dir == 8 then
169 -- same for the opposite case: slab below normal slab
170 elseif p2 <= 3 and dir == 4 then
174 -- else attempt to place node with proper param2
175 minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2)
176 if not minetest.setting_getbool("creative_mode") then
177 itemstack:take_item()
181 -- place slab using look direction of player
182 local dir = minetest.dir_to_wallmounted(vector.subtract(
183 pointed_thing.above, pointed_thing.under), true)
185 local rot = slab_trans_dir_place[dir]
186 if rot == 0 or rot == 20 then
187 rot = rot + minetest.dir_to_facedir(placer:get_look_dir())
190 return minetest.item_place(itemstack, placer, pointed_thing, rot)
197 minetest.register_node(":stairs:slab_" .. subname .. "upside_down", {
198 replace_name = "stairs:slab_".. subname,
199 groups = {slabs_replace = 1},
204 minetest.register_craft({
205 output = 'stairs:slab_' .. subname .. ' 6',
207 {recipeitem, recipeitem, recipeitem},
214 -- Optionally replace old "upside_down" nodes with new param2 versions.
215 -- Disabled by default.
218 minetest.register_abm({
219 label = "Slab replace",
220 nodenames = {"group:slabs_replace"},
223 action = function(pos, node)
224 node.name = minetest.registered_nodes[node.name].replace_name
225 node.param2 = node.param2 + 20
226 if node.param2 == 21 then
228 elseif node.param2 == 23 then
231 minetest.set_node(pos, node)
237 -- Stair/slab registration function.
238 -- Nodes will be called stairs:{stair,slab}_<subname>
240 function stairs.register_stair_and_slab(subname, recipeitem,
241 groups, images, desc_stair, desc_slab, sounds)
242 stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds)
243 stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds)
247 -- Register default stairs and slabs
249 stairs.register_stair_and_slab(
252 {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
253 {"default_wood.png"},
256 default.node_sound_wood_defaults()
259 stairs.register_stair_and_slab(
261 "default:junglewood",
262 {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
263 {"default_junglewood.png"},
266 default.node_sound_wood_defaults()
269 stairs.register_stair_and_slab(
272 {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
273 {"default_pine_wood.png"},
276 default.node_sound_wood_defaults()
279 stairs.register_stair_and_slab(
281 "default:acacia_wood",
282 {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
283 {"default_acacia_wood.png"},
286 default.node_sound_wood_defaults()
289 stairs.register_stair_and_slab(
291 "default:aspen_wood",
292 {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
293 {"default_aspen_wood.png"},
296 default.node_sound_wood_defaults()
299 stairs.register_stair_and_slab(
303 {"default_stone.png"},
306 default.node_sound_stone_defaults()
309 stairs.register_stair_and_slab(
313 {"default_cobble.png"},
316 default.node_sound_stone_defaults()
319 stairs.register_stair_and_slab(
323 {"default_mossycobble.png"},
324 "Mossy Cobblestone Stair",
325 "Mossy Cobblestone Slab",
326 default.node_sound_stone_defaults()
329 stairs.register_stair_and_slab(
331 "default:stonebrick",
333 {"default_stone_brick.png"},
336 default.node_sound_stone_defaults()
339 stairs.register_stair_and_slab(
341 "default:stone_block",
343 {"default_stone_block.png"},
346 default.node_sound_stone_defaults()
349 stairs.register_stair_and_slab(
351 "default:desert_stone",
353 {"default_desert_stone.png"},
354 "Desert Stone Stair",
356 default.node_sound_stone_defaults()
359 stairs.register_stair_and_slab(
361 "default:desert_cobble",
363 {"default_desert_cobble.png"},
364 "Desert Cobblestone Stair",
365 "Desert Cobblestone Slab",
366 default.node_sound_stone_defaults()
369 stairs.register_stair_and_slab(
371 "default:desert_stonebrick",
373 {"default_desert_stone_brick.png"},
374 "Desert Stone Brick Stair",
375 "Desert Stone Brick Slab",
376 default.node_sound_stone_defaults()
379 stairs.register_stair_and_slab(
380 "desert_stone_block",
381 "default:desert_stone_block",
383 {"default_desert_stone_block.png"},
384 "Desert Stone Block Stair",
385 "Desert Stone Block Slab",
386 default.node_sound_stone_defaults()
389 stairs.register_stair_and_slab(
392 {crumbly = 1, cracky = 3},
393 {"default_sandstone.png"},
396 default.node_sound_stone_defaults()
399 stairs.register_stair_and_slab(
401 "default:sandstonebrick",
403 {"default_sandstone_brick.png"},
404 "Sandstone Brick Stair",
405 "Sandstone Brick Slab",
406 default.node_sound_stone_defaults()
409 stairs.register_stair_and_slab(
411 "default:sandstone_block",
413 {"default_sandstone_block.png"},
414 "Sandstone Block Stair",
415 "Sandstone Block Slab",
416 default.node_sound_stone_defaults()
419 stairs.register_stair_and_slab(
422 {cracky = 1, level = 2},
423 {"default_obsidian.png"},
426 default.node_sound_stone_defaults()
429 stairs.register_stair_and_slab(
431 "default:obsidianbrick",
432 {cracky = 1, level = 2},
433 {"default_obsidian_brick.png"},
434 "Obsidian Brick Stair",
435 "Obsidian Brick Slab",
436 default.node_sound_stone_defaults()
439 stairs.register_stair_and_slab(
441 "default:obsidian_block",
442 {cracky = 1, level = 2},
443 {"default_obsidian_block.png"},
444 "Obsidian Block Stair",
445 "Obsidian Block Slab",
446 default.node_sound_stone_defaults()
449 stairs.register_stair_and_slab(
453 {"default_brick.png"},
456 default.node_sound_stone_defaults()
459 stairs.register_stair_and_slab(
462 {snappy = 3, flammable = 4},
463 {"farming_straw.png"},
466 default.node_sound_leaves_defaults()
469 stairs.register_stair_and_slab(
471 "default:steelblock",
472 {cracky = 1, level = 2},
473 {"default_steel_block.png"},
476 default.node_sound_stone_defaults()
479 stairs.register_stair_and_slab(
481 "default:copperblock",
482 {cracky = 1, level = 2},
483 {"default_copper_block.png"},
484 "Copper Block Stair",
486 default.node_sound_stone_defaults()
489 stairs.register_stair_and_slab(
491 "default:bronzeblock",
492 {cracky = 1, level = 2},
493 {"default_bronze_block.png"},
494 "Bronze Block Stair",
496 default.node_sound_stone_defaults()
499 stairs.register_stair_and_slab(
503 {"default_gold_block.png"},
506 default.node_sound_stone_defaults()