Remove now-unused 'puts out fire' group
[oweals/minetest_game.git] / mods / stairs / init.lua
1 -- Minetest 0.4 mod: stairs
2 -- See README.txt for licensing and other information.
3
4
5 -- Global namespace for functions
6
7 stairs = {}
8
9
10 -- Register aliases for new pine node names
11
12 minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood")
13 minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood")
14
15
16 -- Get setting for replace ABM
17
18 local replace = minetest.settings:get_bool("enable_stairs_replace_abm")
19
20 local function rotate_and_place(itemstack, placer, pointed_thing)
21         local p0 = pointed_thing.under
22         local p1 = pointed_thing.above
23         local param2 = 0
24
25         if placer then
26                 local placer_pos = placer:get_pos()
27                 if placer_pos then
28                         param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos))
29                 end
30
31                 local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
32                 local fpos = finepos.y % 1
33
34                 if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
35                                 or (fpos < -0.5 and fpos > -0.999999999) then
36                         param2 = param2 + 20
37                         if param2 == 21 then
38                                 param2 = 23
39                         elseif param2 == 23 then
40                                 param2 = 21
41                         end
42                 end
43         end
44         return minetest.item_place(itemstack, placer, pointed_thing, param2)
45 end
46
47
48 -- Register stair
49 -- Node will be called stairs:stair_<subname>
50
51 function stairs.register_stair(subname, recipeitem, groups, images, description,
52                 sounds, worldaligntex)
53         -- Set backface culling and world-aligned textures
54         local stair_images = {}
55         for i, image in ipairs(images) do
56                 if type(image) == "string" then
57                         stair_images[i] = {
58                                 name = image,
59                                 backface_culling = true,
60                         }
61                         if worldaligntex then
62                                 stair_images[i].align_style = "world"
63                         end
64                 else
65                         stair_images[i] = table.copy(image)
66                         if stair_images[i].backface_culling == nil then
67                                 stair_images[i].backface_culling = true
68                         end
69                         if worldaligntex and stair_images[i].align_style == nil then
70                                 stair_images[i].align_style = "world"
71                         end
72                 end
73         end
74         local new_groups = table.copy(groups)
75         new_groups.stair = 1
76         minetest.register_node(":stairs:stair_" .. subname, {
77                 description = description,
78                 drawtype = "nodebox",
79                 tiles = stair_images,
80                 paramtype = "light",
81                 paramtype2 = "facedir",
82                 is_ground_content = false,
83                 groups = new_groups,
84                 sounds = sounds,
85                 node_box = {
86                         type = "fixed",
87                         fixed = {
88                                 {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
89                                 {-0.5, 0.0, 0.0, 0.5, 0.5, 0.5},
90                         },
91                 },
92                 on_place = function(itemstack, placer, pointed_thing)
93                         if pointed_thing.type ~= "node" then
94                                 return itemstack
95                         end
96
97                         return rotate_and_place(itemstack, placer, pointed_thing)
98                 end,
99         })
100
101         -- for replace ABM
102         if replace then
103                 minetest.register_node(":stairs:stair_" .. subname .. "upside_down", {
104                         replace_name = "stairs:stair_" .. subname,
105                         groups = {slabs_replace = 1},
106                 })
107         end
108
109         if recipeitem then
110                 -- Recipe matches appearence in inventory
111                 minetest.register_craft({
112                         output = 'stairs:stair_' .. subname .. ' 8',
113                         recipe = {
114                                 {"", "", recipeitem},
115                                 {"", recipeitem, recipeitem},
116                                 {recipeitem, recipeitem, recipeitem},
117                         },
118                 })
119
120                 -- Use stairs to craft full blocks again (1:1)
121                 minetest.register_craft({
122                         output = recipeitem .. ' 3',
123                         recipe = {
124                                 {'stairs:stair_' .. subname, 'stairs:stair_' .. subname},
125                                 {'stairs:stair_' .. subname, 'stairs:stair_' .. subname},
126                         },
127                 })
128
129                 -- Fuel
130                 local baseburntime = minetest.get_craft_result({
131                         method = "fuel",
132                         width = 1,
133                         items = {recipeitem}
134                 }).time
135                 if baseburntime > 0 then
136                         minetest.register_craft({
137                                 type = "fuel",
138                                 recipe = 'stairs:stair_' .. subname,
139                                 burntime = math.floor(baseburntime * 0.75),
140                         })
141                 end
142         end
143 end
144
145
146 -- Register slab
147 -- Node will be called stairs:slab_<subname>
148
149 function stairs.register_slab(subname, recipeitem, groups, images, description,
150                 sounds, worldaligntex)
151         -- Set world-aligned textures
152         local slab_images = {}
153         for i, image in ipairs(images) do
154                 if type(image) == "string" then
155                         slab_images[i] = {
156                                 name = image,
157                         }
158                         if worldaligntex then
159                                 slab_images[i].align_style = "world"
160                         end
161                 else
162                         slab_images[i] = table.copy(image)
163                         if worldaligntex and image.align_style == nil then
164                                 slab_images[i].align_style = "world"
165                         end
166                 end
167         end
168         local new_groups = table.copy(groups)
169         new_groups.slab = 1
170         minetest.register_node(":stairs:slab_" .. subname, {
171                 description = description,
172                 drawtype = "nodebox",
173                 tiles = slab_images,
174                 paramtype = "light",
175                 paramtype2 = "facedir",
176                 is_ground_content = false,
177                 groups = new_groups,
178                 sounds = sounds,
179                 node_box = {
180                         type = "fixed",
181                         fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
182                 },
183                 on_place = function(itemstack, placer, pointed_thing)
184                         local under = minetest.get_node(pointed_thing.under)
185                         local wield_item = itemstack:get_name()
186                         local player_name = placer and placer:get_player_name() or ""
187                         local creative_enabled = (creative and creative.is_enabled_for
188                                         and creative.is_enabled_for(player_name))
189
190                         if under and under.name:find("^stairs:slab_") then
191                                 -- place slab using under node orientation
192                                 local dir = minetest.dir_to_facedir(vector.subtract(
193                                         pointed_thing.above, pointed_thing.under), true)
194
195                                 local p2 = under.param2
196
197                                 -- Placing a slab on an upside down slab should make it right-side up.
198                                 if p2 >= 20 and dir == 8 then
199                                         p2 = p2 - 20
200                                 -- same for the opposite case: slab below normal slab
201                                 elseif p2 <= 3 and dir == 4 then
202                                         p2 = p2 + 20
203                                 end
204
205                                 -- else attempt to place node with proper param2
206                                 minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2)
207                                 if not creative_enabled then
208                                         itemstack:take_item()
209                                 end
210                                 return itemstack
211                         else
212                                 return rotate_and_place(itemstack, placer, pointed_thing)
213                         end
214                 end,
215         })
216
217         -- for replace ABM
218         if replace then
219                 minetest.register_node(":stairs:slab_" .. subname .. "upside_down", {
220                         replace_name = "stairs:slab_".. subname,
221                         groups = {slabs_replace = 1},
222                 })
223         end
224
225         if recipeitem then
226                 minetest.register_craft({
227                         output = 'stairs:slab_' .. subname .. ' 6',
228                         recipe = {
229                                 {recipeitem, recipeitem, recipeitem},
230                         },
231                 })
232
233                 -- Use 2 slabs to craft a full block again (1:1)
234                 minetest.register_craft({
235                         output = recipeitem,
236                         recipe = {
237                                 {'stairs:slab_' .. subname},
238                                 {'stairs:slab_' .. subname},
239                         },
240                 })
241
242                 -- Fuel
243                 local baseburntime = minetest.get_craft_result({
244                         method = "fuel",
245                         width = 1,
246                         items = {recipeitem}
247                 }).time
248                 if baseburntime > 0 then
249                         minetest.register_craft({
250                                 type = "fuel",
251                                 recipe = 'stairs:slab_' .. subname,
252                                 burntime = math.floor(baseburntime * 0.5),
253                         })
254                 end
255         end
256 end
257
258
259 -- Optionally replace old "upside_down" nodes with new param2 versions.
260 -- Disabled by default.
261
262 if replace then
263         minetest.register_abm({
264                 label = "Slab replace",
265                 nodenames = {"group:slabs_replace"},
266                 interval = 16,
267                 chance = 1,
268                 action = function(pos, node)
269                         node.name = minetest.registered_nodes[node.name].replace_name
270                         node.param2 = node.param2 + 20
271                         if node.param2 == 21 then
272                                 node.param2 = 23
273                         elseif node.param2 == 23 then
274                                 node.param2 = 21
275                         end
276                         minetest.set_node(pos, node)
277                 end,
278         })
279 end
280
281
282 -- Register inner stair
283 -- Node will be called stairs:stair_inner_<subname>
284
285 function stairs.register_stair_inner(subname, recipeitem, groups, images,
286                 description, sounds, worldaligntex)
287         -- Set backface culling and world-aligned textures
288         local stair_images = {}
289         for i, image in ipairs(images) do
290                 if type(image) == "string" then
291                         stair_images[i] = {
292                                 name = image,
293                                 backface_culling = true,
294                         }
295                         if worldaligntex then
296                                 stair_images[i].align_style = "world"
297                         end
298                 else
299                         stair_images[i] = table.copy(image)
300                         if stair_images[i].backface_culling == nil then
301                                 stair_images[i].backface_culling = true
302                         end
303                         if worldaligntex and stair_images[i].align_style == nil then
304                                 stair_images[i].align_style = "world"
305                         end
306                 end
307         end
308         local new_groups = table.copy(groups)
309         new_groups.stair = 1
310         minetest.register_node(":stairs:stair_inner_" .. subname, {
311                 description = "Inner " .. description,
312                 drawtype = "nodebox",
313                 tiles = stair_images,
314                 paramtype = "light",
315                 paramtype2 = "facedir",
316                 is_ground_content = false,
317                 groups = new_groups,
318                 sounds = sounds,
319                 node_box = {
320                         type = "fixed",
321                         fixed = {
322                                 {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
323                                 {-0.5, 0.0, 0.0, 0.5, 0.5, 0.5},
324                                 {-0.5, 0.0, -0.5, 0.0, 0.5, 0.0},
325                         },
326                 },
327                 on_place = function(itemstack, placer, pointed_thing)
328                         if pointed_thing.type ~= "node" then
329                                 return itemstack
330                         end
331
332                         return rotate_and_place(itemstack, placer, pointed_thing)
333                 end,
334         })
335
336         if recipeitem then
337                 minetest.register_craft({
338                         output = 'stairs:stair_inner_' .. subname .. ' 7',
339                         recipe = {
340                                 { "", recipeitem, ""},
341                                 { recipeitem, "", recipeitem},
342                                 {recipeitem, recipeitem, recipeitem},
343                         },
344                 })
345
346                 -- Fuel
347                 local baseburntime = minetest.get_craft_result({
348                         method = "fuel",
349                         width = 1,
350                         items = {recipeitem}
351                 }).time
352                 if baseburntime > 0 then
353                         minetest.register_craft({
354                                 type = "fuel",
355                                 recipe = 'stairs:stair_inner_' .. subname,
356                                 burntime = math.floor(baseburntime * 0.875),
357                         })
358                 end
359         end
360 end
361
362
363 -- Register outer stair
364 -- Node will be called stairs:stair_outer_<subname>
365
366 function stairs.register_stair_outer(subname, recipeitem, groups, images,
367                 description, sounds, worldaligntex)
368         -- Set backface culling and world-aligned textures
369         local stair_images = {}
370         for i, image in ipairs(images) do
371                 if type(image) == "string" then
372                         stair_images[i] = {
373                                 name = image,
374                                 backface_culling = true,
375                         }
376                         if worldaligntex then
377                                 stair_images[i].align_style = "world"
378                         end
379                 else
380                         stair_images[i] = table.copy(image)
381                         if stair_images[i].backface_culling == nil then
382                                 stair_images[i].backface_culling = true
383                         end
384                         if worldaligntex and stair_images[i].align_style == nil then
385                                 stair_images[i].align_style = "world"
386                         end
387                 end
388         end
389         local new_groups = table.copy(groups)
390         new_groups.stair = 1
391         minetest.register_node(":stairs:stair_outer_" .. subname, {
392                 description = "Outer " .. description,
393                 drawtype = "nodebox",
394                 tiles = stair_images,
395                 paramtype = "light",
396                 paramtype2 = "facedir",
397                 is_ground_content = false,
398                 groups = new_groups,
399                 sounds = sounds,
400                 node_box = {
401                         type = "fixed",
402                         fixed = {
403                                 {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
404                                 {-0.5, 0.0, 0.0, 0.0, 0.5, 0.5},
405                         },
406                 },
407                 on_place = function(itemstack, placer, pointed_thing)
408                         if pointed_thing.type ~= "node" then
409                                 return itemstack
410                         end
411
412                         return rotate_and_place(itemstack, placer, pointed_thing)
413                 end,
414         })
415
416         if recipeitem then
417                 minetest.register_craft({
418                         output = 'stairs:stair_outer_' .. subname .. ' 6',
419                         recipe = {
420                                 { "", "", ""},
421                                 { "", recipeitem, ""},
422                                 {recipeitem, recipeitem, recipeitem},
423                         },
424                 })
425
426                 -- Fuel
427                 local baseburntime = minetest.get_craft_result({
428                         method = "fuel",
429                         width = 1,
430                         items = {recipeitem}
431                 }).time
432                 if baseburntime > 0 then
433                         minetest.register_craft({
434                                 type = "fuel",
435                                 recipe = 'stairs:stair_outer_' .. subname,
436                                 burntime = math.floor(baseburntime * 0.625),
437                         })
438                 end
439         end
440 end
441
442
443 -- Stair/slab registration function.
444 -- Nodes will be called stairs:{stair,slab}_<subname>
445
446 function stairs.register_stair_and_slab(subname, recipeitem, groups, images,
447                 desc_stair, desc_slab, sounds, worldaligntex)
448         stairs.register_stair(subname, recipeitem, groups, images, desc_stair,
449                 sounds, worldaligntex)
450         stairs.register_stair_inner(subname, recipeitem, groups, images, desc_stair,
451                 sounds, worldaligntex)
452         stairs.register_stair_outer(subname, recipeitem, groups, images, desc_stair,
453                 sounds, worldaligntex)
454         stairs.register_slab(subname, recipeitem, groups, images, desc_slab,
455                 sounds, worldaligntex)
456 end
457
458
459 -- Register default stairs and slabs
460
461 stairs.register_stair_and_slab(
462         "wood",
463         "default:wood",
464         {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
465         {"default_wood.png"},
466         "Wooden Stair",
467         "Wooden Slab",
468         default.node_sound_wood_defaults(),
469         false
470 )
471
472 stairs.register_stair_and_slab(
473         "junglewood",
474         "default:junglewood",
475         {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
476         {"default_junglewood.png"},
477         "Jungle Wood Stair",
478         "Jungle Wood Slab",
479         default.node_sound_wood_defaults(),
480         false
481 )
482
483 stairs.register_stair_and_slab(
484         "pine_wood",
485         "default:pine_wood",
486         {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
487         {"default_pine_wood.png"},
488         "Pine Wood Stair",
489         "Pine Wood Slab",
490         default.node_sound_wood_defaults(),
491         false
492 )
493
494 stairs.register_stair_and_slab(
495         "acacia_wood",
496         "default:acacia_wood",
497         {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
498         {"default_acacia_wood.png"},
499         "Acacia Wood Stair",
500         "Acacia Wood Slab",
501         default.node_sound_wood_defaults(),
502         false
503 )
504
505 stairs.register_stair_and_slab(
506         "aspen_wood",
507         "default:aspen_wood",
508         {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
509         {"default_aspen_wood.png"},
510         "Aspen Wood Stair",
511         "Aspen Wood Slab",
512         default.node_sound_wood_defaults(),
513         false
514 )
515
516 stairs.register_stair_and_slab(
517         "stone",
518         "default:stone",
519         {cracky = 3},
520         {"default_stone.png"},
521         "Stone Stair",
522         "Stone Slab",
523         default.node_sound_stone_defaults(),
524         true
525 )
526
527 stairs.register_stair_and_slab(
528         "cobble",
529         "default:cobble",
530         {cracky = 3},
531         {"default_cobble.png"},
532         "Cobblestone Stair",
533         "Cobblestone Slab",
534         default.node_sound_stone_defaults(),
535         true
536 )
537
538 stairs.register_stair_and_slab(
539         "mossycobble",
540         "default:mossycobble",
541         {cracky = 3},
542         {"default_mossycobble.png"},
543         "Mossy Cobblestone Stair",
544         "Mossy Cobblestone Slab",
545         default.node_sound_stone_defaults(),
546         true
547 )
548
549 stairs.register_stair_and_slab(
550         "stonebrick",
551         "default:stonebrick",
552         {cracky = 2},
553         {"default_stone_brick.png"},
554         "Stone Brick Stair",
555         "Stone Brick Slab",
556         default.node_sound_stone_defaults(),
557         false
558 )
559
560 stairs.register_stair_and_slab(
561         "stone_block",
562         "default:stone_block",
563         {cracky = 2},
564         {"default_stone_block.png"},
565         "Stone Block Stair",
566         "Stone Block Slab",
567         default.node_sound_stone_defaults(),
568         true
569 )
570
571 stairs.register_stair_and_slab(
572         "desert_stone",
573         "default:desert_stone",
574         {cracky = 3},
575         {"default_desert_stone.png"},
576         "Desert Stone Stair",
577         "Desert Stone Slab",
578         default.node_sound_stone_defaults(),
579         true
580 )
581
582 stairs.register_stair_and_slab(
583         "desert_cobble",
584         "default:desert_cobble",
585         {cracky = 3},
586         {"default_desert_cobble.png"},
587         "Desert Cobblestone Stair",
588         "Desert Cobblestone Slab",
589         default.node_sound_stone_defaults(),
590         true
591 )
592
593 stairs.register_stair_and_slab(
594         "desert_stonebrick",
595         "default:desert_stonebrick",
596         {cracky = 2},
597         {"default_desert_stone_brick.png"},
598         "Desert Stone Brick Stair",
599         "Desert Stone Brick Slab",
600         default.node_sound_stone_defaults(),
601         false
602 )
603
604 stairs.register_stair_and_slab(
605         "desert_stone_block",
606         "default:desert_stone_block",
607         {cracky = 2},
608         {"default_desert_stone_block.png"},
609         "Desert Stone Block Stair",
610         "Desert Stone Block Slab",
611         default.node_sound_stone_defaults(),
612         true
613 )
614
615 stairs.register_stair_and_slab(
616         "sandstone",
617         "default:sandstone",
618         {crumbly = 1, cracky = 3},
619         {"default_sandstone.png"},
620         "Sandstone Stair",
621         "Sandstone Slab",
622         default.node_sound_stone_defaults(),
623         true
624 )
625
626 stairs.register_stair_and_slab(
627         "sandstonebrick",
628         "default:sandstonebrick",
629         {cracky = 2},
630         {"default_sandstone_brick.png"},
631         "Sandstone Brick Stair",
632         "Sandstone Brick Slab",
633         default.node_sound_stone_defaults(),
634         false
635 )
636
637 stairs.register_stair_and_slab(
638         "sandstone_block",
639         "default:sandstone_block",
640         {cracky = 2},
641         {"default_sandstone_block.png"},
642         "Sandstone Block Stair",
643         "Sandstone Block Slab",
644         default.node_sound_stone_defaults(),
645         true
646 )
647
648 stairs.register_stair_and_slab(
649         "desert_sandstone",
650         "default:desert_sandstone",
651         {crumbly = 1, cracky = 3},
652         {"default_desert_sandstone.png"},
653         "Desert Sandstone Stair",
654         "Desert Sandstone Slab",
655         default.node_sound_stone_defaults(),
656         true
657 )
658
659 stairs.register_stair_and_slab(
660         "desert_sandstone_brick",
661         "default:desert_sandstone_brick",
662         {cracky = 2},
663         {"default_desert_sandstone_brick.png"},
664         "Desert Sandstone Brick Stair",
665         "Desert Sandstone Brick Slab",
666         default.node_sound_stone_defaults(),
667         false
668 )
669
670 stairs.register_stair_and_slab(
671         "desert_sandstone_block",
672         "default:desert_sandstone_block",
673         {cracky = 2},
674         {"default_desert_sandstone_block.png"},
675         "Desert Sandstone Block Stair",
676         "Desert Sandstone Block Slab",
677         default.node_sound_stone_defaults(),
678         true
679 )
680
681 stairs.register_stair_and_slab(
682         "silver_sandstone",
683         "default:silver_sandstone",
684         {crumbly = 1, cracky = 3},
685         {"default_silver_sandstone.png"},
686         "Silver Sandstone Stair",
687         "Silver Sandstone Slab",
688         default.node_sound_stone_defaults(),
689         true
690 )
691
692 stairs.register_stair_and_slab(
693         "silver_sandstone_brick",
694         "default:silver_sandstone_brick",
695         {cracky = 2},
696         {"default_silver_sandstone_brick.png"},
697         "Silver Sandstone Brick Stair",
698         "Silver Sandstone Brick Slab",
699         default.node_sound_stone_defaults(),
700         false
701 )
702
703 stairs.register_stair_and_slab(
704         "silver_sandstone_block",
705         "default:silver_sandstone_block",
706         {cracky = 2},
707         {"default_silver_sandstone_block.png"},
708         "Silver Sandstone Block Stair",
709         "Silver Sandstone Block Slab",
710         default.node_sound_stone_defaults(),
711         true
712 )
713
714 stairs.register_stair_and_slab(
715         "obsidian",
716         "default:obsidian",
717         {cracky = 1, level = 2},
718         {"default_obsidian.png"},
719         "Obsidian Stair",
720         "Obsidian Slab",
721         default.node_sound_stone_defaults(),
722         true
723 )
724
725 stairs.register_stair_and_slab(
726         "obsidianbrick",
727         "default:obsidianbrick",
728         {cracky = 1, level = 2},
729         {"default_obsidian_brick.png"},
730         "Obsidian Brick Stair",
731         "Obsidian Brick Slab",
732         default.node_sound_stone_defaults(),
733         false
734 )
735
736 stairs.register_stair_and_slab(
737         "obsidian_block",
738         "default:obsidian_block",
739         {cracky = 1, level = 2},
740         {"default_obsidian_block.png"},
741         "Obsidian Block Stair",
742         "Obsidian Block Slab",
743         default.node_sound_stone_defaults(),
744         true
745 )
746
747 stairs.register_stair_and_slab(
748         "brick",
749         "default:brick",
750         {cracky = 3},
751         {"default_brick.png"},
752         "Brick Stair",
753         "Brick Slab",
754         default.node_sound_stone_defaults(),
755         false
756 )
757
758 stairs.register_stair_and_slab(
759         "steelblock",
760         "default:steelblock",
761         {cracky = 1, level = 2},
762         {"default_steel_block.png"},
763         "Steel Block Stair",
764         "Steel Block Slab",
765         default.node_sound_metal_defaults(),
766         true
767 )
768
769 stairs.register_stair_and_slab(
770         "tinblock",
771         "default:tinblock",
772         {cracky = 1, level = 2},
773         {"default_tin_block.png"},
774         "Tin Block Stair",
775         "Tin Block Slab",
776         default.node_sound_metal_defaults(),
777         true
778 )
779
780 stairs.register_stair_and_slab(
781         "copperblock",
782         "default:copperblock",
783         {cracky = 1, level = 2},
784         {"default_copper_block.png"},
785         "Copper Block Stair",
786         "Copper Block Slab",
787         default.node_sound_metal_defaults(),
788         true
789 )
790
791 stairs.register_stair_and_slab(
792         "bronzeblock",
793         "default:bronzeblock",
794         {cracky = 1, level = 2},
795         {"default_bronze_block.png"},
796         "Bronze Block Stair",
797         "Bronze Block Slab",
798         default.node_sound_metal_defaults(),
799         true
800 )
801
802 stairs.register_stair_and_slab(
803         "goldblock",
804         "default:goldblock",
805         {cracky = 1},
806         {"default_gold_block.png"},
807         "Gold Block Stair",
808         "Gold Block Slab",
809         default.node_sound_metal_defaults(),
810         true
811 )
812
813 stairs.register_stair_and_slab(
814         "ice",
815         "default:ice",
816         {cracky = 3, cools_lava = 1, slippery = 3},
817         {"default_ice.png"},
818         "Ice Stair",
819         "Ice Slab",
820         default.node_sound_glass_defaults(),
821         true
822 )
823
824 stairs.register_stair_and_slab(
825         "snowblock",
826         "default:snowblock",
827         {crumbly = 3, cools_lava = 1, snowy = 1},
828         {"default_snow.png"},
829         "Snow Block Stair",
830         "Snow Block Slab",
831         default.node_sound_snow_defaults(),
832         true
833 )
834
835 -- Glass stair nodes need to be registered individually to utilize specialized textures.
836
837 stairs.register_stair(
838         "glass",
839         "default:glass",
840         {cracky = 3},
841         {"stairs_glass_split.png", "default_glass.png",
842         "stairs_glass_stairside.png^[transformFX", "stairs_glass_stairside.png",
843         "default_glass.png", "stairs_glass_split.png"},
844         "Glass Stair",
845         default.node_sound_glass_defaults(),
846         false
847 )
848
849 stairs.register_slab(
850         "glass",
851         "default:glass",
852         {cracky = 3},
853         {"default_glass.png", "default_glass.png", "stairs_glass_split.png"},
854         "Glass Slab",
855         default.node_sound_glass_defaults(),
856         false
857 )
858
859 stairs.register_stair_inner(
860         "glass",
861         "default:glass",
862         {cracky = 3},
863         {"stairs_glass_stairside.png^[transformR270", "default_glass.png",
864         "stairs_glass_stairside.png^[transformFX", "default_glass.png",
865         "default_glass.png", "stairs_glass_stairside.png"},
866         "Glass Stair",
867         default.node_sound_glass_defaults(),
868         false
869 )
870
871 stairs.register_stair_outer(
872         "glass",
873         "default:glass",
874         {cracky = 3},
875         {"stairs_glass_stairside.png^[transformR90", "default_glass.png",
876         "stairs_glass_outer_stairside.png", "stairs_glass_stairside.png",
877         "stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"},
878         "Glass Stair",
879         default.node_sound_glass_defaults(),
880         false
881 )
882
883 stairs.register_stair(
884         "obsidian_glass",
885         "default:obsidian_glass",
886         {cracky = 3},
887         {"stairs_obsidian_glass_split.png", "default_obsidian_glass.png",
888         "stairs_obsidian_glass_stairside.png^[transformFX", "stairs_obsidian_glass_stairside.png",
889         "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"},
890         "Obsidian Glass Stair",
891         default.node_sound_glass_defaults(),
892         false
893 )
894
895 stairs.register_slab(
896         "obsidian_glass",
897         "default:obsidian_glass",
898         {cracky = 3},
899         {"default_obsidian_glass.png", "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"},
900         "Obsidian Glass Slab",
901         default.node_sound_glass_defaults(),
902         false
903 )
904
905 stairs.register_stair_inner(
906         "obsidian_glass",
907         "default:obsidian_glass",
908         {cracky = 3},
909         {"stairs_obsidian_glass_stairside.png^[transformR270", "default_obsidian_glass.png",
910         "stairs_obsidian_glass_stairside.png^[transformFX", "default_obsidian_glass.png",
911         "default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png"},
912         "Obsidian Glass Stair",
913         default.node_sound_glass_defaults(),
914         false
915 )
916
917 stairs.register_stair_outer(
918         "obsidian_glass",
919         "default:obsidian_glass",
920         {cracky = 3},
921         {"stairs_obsidian_glass_stairside.png^[transformR90", "default_obsidian_glass.png",
922         "stairs_obsidian_glass_outer_stairside.png", "stairs_obsidian_glass_stairside.png",
923         "stairs_obsidian_glass_stairside.png^[transformR90","stairs_obsidian_glass_outer_stairside.png"},
924         "Obsidian Glass Stair",
925         default.node_sound_glass_defaults(),
926         false
927 )