Remove extra empty strings in craft recipes (#2281)
[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                                 {"", recipeitem, ""},
421                                 {recipeitem, recipeitem, recipeitem},
422                         },
423                 })
424
425                 -- Fuel
426                 local baseburntime = minetest.get_craft_result({
427                         method = "fuel",
428                         width = 1,
429                         items = {recipeitem}
430                 }).time
431                 if baseburntime > 0 then
432                         minetest.register_craft({
433                                 type = "fuel",
434                                 recipe = 'stairs:stair_outer_' .. subname,
435                                 burntime = math.floor(baseburntime * 0.625),
436                         })
437                 end
438         end
439 end
440
441
442 -- Stair/slab registration function.
443 -- Nodes will be called stairs:{stair,slab}_<subname>
444
445 function stairs.register_stair_and_slab(subname, recipeitem, groups, images,
446                 desc_stair, desc_slab, sounds, worldaligntex)
447         stairs.register_stair(subname, recipeitem, groups, images, desc_stair,
448                 sounds, worldaligntex)
449         stairs.register_stair_inner(subname, recipeitem, groups, images, desc_stair,
450                 sounds, worldaligntex)
451         stairs.register_stair_outer(subname, recipeitem, groups, images, desc_stair,
452                 sounds, worldaligntex)
453         stairs.register_slab(subname, recipeitem, groups, images, desc_slab,
454                 sounds, worldaligntex)
455 end
456
457
458 -- Register default stairs and slabs
459
460 stairs.register_stair_and_slab(
461         "wood",
462         "default:wood",
463         {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
464         {"default_wood.png"},
465         "Wooden Stair",
466         "Wooden Slab",
467         default.node_sound_wood_defaults(),
468         false
469 )
470
471 stairs.register_stair_and_slab(
472         "junglewood",
473         "default:junglewood",
474         {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
475         {"default_junglewood.png"},
476         "Jungle Wood Stair",
477         "Jungle Wood Slab",
478         default.node_sound_wood_defaults(),
479         false
480 )
481
482 stairs.register_stair_and_slab(
483         "pine_wood",
484         "default:pine_wood",
485         {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
486         {"default_pine_wood.png"},
487         "Pine Wood Stair",
488         "Pine Wood Slab",
489         default.node_sound_wood_defaults(),
490         false
491 )
492
493 stairs.register_stair_and_slab(
494         "acacia_wood",
495         "default:acacia_wood",
496         {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
497         {"default_acacia_wood.png"},
498         "Acacia Wood Stair",
499         "Acacia Wood Slab",
500         default.node_sound_wood_defaults(),
501         false
502 )
503
504 stairs.register_stair_and_slab(
505         "aspen_wood",
506         "default:aspen_wood",
507         {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
508         {"default_aspen_wood.png"},
509         "Aspen Wood Stair",
510         "Aspen Wood Slab",
511         default.node_sound_wood_defaults(),
512         false
513 )
514
515 stairs.register_stair_and_slab(
516         "stone",
517         "default:stone",
518         {cracky = 3},
519         {"default_stone.png"},
520         "Stone Stair",
521         "Stone Slab",
522         default.node_sound_stone_defaults(),
523         true
524 )
525
526 stairs.register_stair_and_slab(
527         "cobble",
528         "default:cobble",
529         {cracky = 3},
530         {"default_cobble.png"},
531         "Cobblestone Stair",
532         "Cobblestone Slab",
533         default.node_sound_stone_defaults(),
534         true
535 )
536
537 stairs.register_stair_and_slab(
538         "mossycobble",
539         "default:mossycobble",
540         {cracky = 3},
541         {"default_mossycobble.png"},
542         "Mossy Cobblestone Stair",
543         "Mossy Cobblestone Slab",
544         default.node_sound_stone_defaults(),
545         true
546 )
547
548 stairs.register_stair_and_slab(
549         "stonebrick",
550         "default:stonebrick",
551         {cracky = 2},
552         {"default_stone_brick.png"},
553         "Stone Brick Stair",
554         "Stone Brick Slab",
555         default.node_sound_stone_defaults(),
556         false
557 )
558
559 stairs.register_stair_and_slab(
560         "stone_block",
561         "default:stone_block",
562         {cracky = 2},
563         {"default_stone_block.png"},
564         "Stone Block Stair",
565         "Stone Block Slab",
566         default.node_sound_stone_defaults(),
567         true
568 )
569
570 stairs.register_stair_and_slab(
571         "desert_stone",
572         "default:desert_stone",
573         {cracky = 3},
574         {"default_desert_stone.png"},
575         "Desert Stone Stair",
576         "Desert Stone Slab",
577         default.node_sound_stone_defaults(),
578         true
579 )
580
581 stairs.register_stair_and_slab(
582         "desert_cobble",
583         "default:desert_cobble",
584         {cracky = 3},
585         {"default_desert_cobble.png"},
586         "Desert Cobblestone Stair",
587         "Desert Cobblestone Slab",
588         default.node_sound_stone_defaults(),
589         true
590 )
591
592 stairs.register_stair_and_slab(
593         "desert_stonebrick",
594         "default:desert_stonebrick",
595         {cracky = 2},
596         {"default_desert_stone_brick.png"},
597         "Desert Stone Brick Stair",
598         "Desert Stone Brick Slab",
599         default.node_sound_stone_defaults(),
600         false
601 )
602
603 stairs.register_stair_and_slab(
604         "desert_stone_block",
605         "default:desert_stone_block",
606         {cracky = 2},
607         {"default_desert_stone_block.png"},
608         "Desert Stone Block Stair",
609         "Desert Stone Block Slab",
610         default.node_sound_stone_defaults(),
611         true
612 )
613
614 stairs.register_stair_and_slab(
615         "sandstone",
616         "default:sandstone",
617         {crumbly = 1, cracky = 3},
618         {"default_sandstone.png"},
619         "Sandstone Stair",
620         "Sandstone Slab",
621         default.node_sound_stone_defaults(),
622         true
623 )
624
625 stairs.register_stair_and_slab(
626         "sandstonebrick",
627         "default:sandstonebrick",
628         {cracky = 2},
629         {"default_sandstone_brick.png"},
630         "Sandstone Brick Stair",
631         "Sandstone Brick Slab",
632         default.node_sound_stone_defaults(),
633         false
634 )
635
636 stairs.register_stair_and_slab(
637         "sandstone_block",
638         "default:sandstone_block",
639         {cracky = 2},
640         {"default_sandstone_block.png"},
641         "Sandstone Block Stair",
642         "Sandstone Block Slab",
643         default.node_sound_stone_defaults(),
644         true
645 )
646
647 stairs.register_stair_and_slab(
648         "desert_sandstone",
649         "default:desert_sandstone",
650         {crumbly = 1, cracky = 3},
651         {"default_desert_sandstone.png"},
652         "Desert Sandstone Stair",
653         "Desert Sandstone Slab",
654         default.node_sound_stone_defaults(),
655         true
656 )
657
658 stairs.register_stair_and_slab(
659         "desert_sandstone_brick",
660         "default:desert_sandstone_brick",
661         {cracky = 2},
662         {"default_desert_sandstone_brick.png"},
663         "Desert Sandstone Brick Stair",
664         "Desert Sandstone Brick Slab",
665         default.node_sound_stone_defaults(),
666         false
667 )
668
669 stairs.register_stair_and_slab(
670         "desert_sandstone_block",
671         "default:desert_sandstone_block",
672         {cracky = 2},
673         {"default_desert_sandstone_block.png"},
674         "Desert Sandstone Block Stair",
675         "Desert Sandstone Block Slab",
676         default.node_sound_stone_defaults(),
677         true
678 )
679
680 stairs.register_stair_and_slab(
681         "silver_sandstone",
682         "default:silver_sandstone",
683         {crumbly = 1, cracky = 3},
684         {"default_silver_sandstone.png"},
685         "Silver Sandstone Stair",
686         "Silver Sandstone Slab",
687         default.node_sound_stone_defaults(),
688         true
689 )
690
691 stairs.register_stair_and_slab(
692         "silver_sandstone_brick",
693         "default:silver_sandstone_brick",
694         {cracky = 2},
695         {"default_silver_sandstone_brick.png"},
696         "Silver Sandstone Brick Stair",
697         "Silver Sandstone Brick Slab",
698         default.node_sound_stone_defaults(),
699         false
700 )
701
702 stairs.register_stair_and_slab(
703         "silver_sandstone_block",
704         "default:silver_sandstone_block",
705         {cracky = 2},
706         {"default_silver_sandstone_block.png"},
707         "Silver Sandstone Block Stair",
708         "Silver Sandstone Block Slab",
709         default.node_sound_stone_defaults(),
710         true
711 )
712
713 stairs.register_stair_and_slab(
714         "obsidian",
715         "default:obsidian",
716         {cracky = 1, level = 2},
717         {"default_obsidian.png"},
718         "Obsidian Stair",
719         "Obsidian Slab",
720         default.node_sound_stone_defaults(),
721         true
722 )
723
724 stairs.register_stair_and_slab(
725         "obsidianbrick",
726         "default:obsidianbrick",
727         {cracky = 1, level = 2},
728         {"default_obsidian_brick.png"},
729         "Obsidian Brick Stair",
730         "Obsidian Brick Slab",
731         default.node_sound_stone_defaults(),
732         false
733 )
734
735 stairs.register_stair_and_slab(
736         "obsidian_block",
737         "default:obsidian_block",
738         {cracky = 1, level = 2},
739         {"default_obsidian_block.png"},
740         "Obsidian Block Stair",
741         "Obsidian Block Slab",
742         default.node_sound_stone_defaults(),
743         true
744 )
745
746 stairs.register_stair_and_slab(
747         "brick",
748         "default:brick",
749         {cracky = 3},
750         {"default_brick.png"},
751         "Brick Stair",
752         "Brick Slab",
753         default.node_sound_stone_defaults(),
754         false
755 )
756
757 stairs.register_stair_and_slab(
758         "steelblock",
759         "default:steelblock",
760         {cracky = 1, level = 2},
761         {"default_steel_block.png"},
762         "Steel Block Stair",
763         "Steel Block Slab",
764         default.node_sound_metal_defaults(),
765         true
766 )
767
768 stairs.register_stair_and_slab(
769         "tinblock",
770         "default:tinblock",
771         {cracky = 1, level = 2},
772         {"default_tin_block.png"},
773         "Tin Block Stair",
774         "Tin Block Slab",
775         default.node_sound_metal_defaults(),
776         true
777 )
778
779 stairs.register_stair_and_slab(
780         "copperblock",
781         "default:copperblock",
782         {cracky = 1, level = 2},
783         {"default_copper_block.png"},
784         "Copper Block Stair",
785         "Copper Block Slab",
786         default.node_sound_metal_defaults(),
787         true
788 )
789
790 stairs.register_stair_and_slab(
791         "bronzeblock",
792         "default:bronzeblock",
793         {cracky = 1, level = 2},
794         {"default_bronze_block.png"},
795         "Bronze Block Stair",
796         "Bronze Block Slab",
797         default.node_sound_metal_defaults(),
798         true
799 )
800
801 stairs.register_stair_and_slab(
802         "goldblock",
803         "default:goldblock",
804         {cracky = 1},
805         {"default_gold_block.png"},
806         "Gold Block Stair",
807         "Gold Block Slab",
808         default.node_sound_metal_defaults(),
809         true
810 )
811
812 stairs.register_stair_and_slab(
813         "ice",
814         "default:ice",
815         {cracky = 3, cools_lava = 1, slippery = 3},
816         {"default_ice.png"},
817         "Ice Stair",
818         "Ice Slab",
819         default.node_sound_glass_defaults(),
820         true
821 )
822
823 stairs.register_stair_and_slab(
824         "snowblock",
825         "default:snowblock",
826         {crumbly = 3, cools_lava = 1, snowy = 1},
827         {"default_snow.png"},
828         "Snow Block Stair",
829         "Snow Block Slab",
830         default.node_sound_snow_defaults(),
831         true
832 )
833
834 -- Glass stair nodes need to be registered individually to utilize specialized textures.
835
836 stairs.register_stair(
837         "glass",
838         "default:glass",
839         {cracky = 3},
840         {"stairs_glass_split.png", "default_glass.png",
841         "stairs_glass_stairside.png^[transformFX", "stairs_glass_stairside.png",
842         "default_glass.png", "stairs_glass_split.png"},
843         "Glass Stair",
844         default.node_sound_glass_defaults(),
845         false
846 )
847
848 stairs.register_slab(
849         "glass",
850         "default:glass",
851         {cracky = 3},
852         {"default_glass.png", "default_glass.png", "stairs_glass_split.png"},
853         "Glass Slab",
854         default.node_sound_glass_defaults(),
855         false
856 )
857
858 stairs.register_stair_inner(
859         "glass",
860         "default:glass",
861         {cracky = 3},
862         {"stairs_glass_stairside.png^[transformR270", "default_glass.png",
863         "stairs_glass_stairside.png^[transformFX", "default_glass.png",
864         "default_glass.png", "stairs_glass_stairside.png"},
865         "Glass Stair",
866         default.node_sound_glass_defaults(),
867         false
868 )
869
870 stairs.register_stair_outer(
871         "glass",
872         "default:glass",
873         {cracky = 3},
874         {"stairs_glass_stairside.png^[transformR90", "default_glass.png",
875         "stairs_glass_outer_stairside.png", "stairs_glass_stairside.png",
876         "stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"},
877         "Glass Stair",
878         default.node_sound_glass_defaults(),
879         false
880 )
881
882 stairs.register_stair(
883         "obsidian_glass",
884         "default:obsidian_glass",
885         {cracky = 3},
886         {"stairs_obsidian_glass_split.png", "default_obsidian_glass.png",
887         "stairs_obsidian_glass_stairside.png^[transformFX", "stairs_obsidian_glass_stairside.png",
888         "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"},
889         "Obsidian Glass Stair",
890         default.node_sound_glass_defaults(),
891         false
892 )
893
894 stairs.register_slab(
895         "obsidian_glass",
896         "default:obsidian_glass",
897         {cracky = 3},
898         {"default_obsidian_glass.png", "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"},
899         "Obsidian Glass Slab",
900         default.node_sound_glass_defaults(),
901         false
902 )
903
904 stairs.register_stair_inner(
905         "obsidian_glass",
906         "default:obsidian_glass",
907         {cracky = 3},
908         {"stairs_obsidian_glass_stairside.png^[transformR270", "default_obsidian_glass.png",
909         "stairs_obsidian_glass_stairside.png^[transformFX", "default_obsidian_glass.png",
910         "default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png"},
911         "Obsidian Glass Stair",
912         default.node_sound_glass_defaults(),
913         false
914 )
915
916 stairs.register_stair_outer(
917         "obsidian_glass",
918         "default:obsidian_glass",
919         {cracky = 3},
920         {"stairs_obsidian_glass_stairside.png^[transformR90", "default_obsidian_glass.png",
921         "stairs_obsidian_glass_outer_stairside.png", "stairs_obsidian_glass_stairside.png",
922         "stairs_obsidian_glass_stairside.png^[transformR90","stairs_obsidian_glass_outer_stairside.png"},
923         "Obsidian Glass Stair",
924         default.node_sound_glass_defaults(),
925         false
926 )