3 -- Minetest 0.4 mod: stairs
4 -- See README.txt for licensing and other information.
7 -- Global namespace for functions
11 -- Load support for MT game translation.
12 local S = minetest.get_translator("stairs")
15 -- Register aliases for new pine node names
17 minetest.register_alias("stairs:stair_pinewood", "stairs:stair_pine_wood")
18 minetest.register_alias("stairs:slab_pinewood", "stairs:slab_pine_wood")
21 -- Get setting for replace ABM
23 local replace = minetest.settings:get_bool("enable_stairs_replace_abm")
25 local function rotate_and_place(itemstack, placer, pointed_thing)
26 local p0 = pointed_thing.under
27 local p1 = pointed_thing.above
31 local placer_pos = placer:get_pos()
33 param2 = minetest.dir_to_facedir(vector.subtract(p1, placer_pos))
36 local finepos = minetest.pointed_thing_to_face_pos(placer, pointed_thing)
37 local fpos = finepos.y % 1
39 if p0.y - 1 == p1.y or (fpos > 0 and fpos < 0.5)
40 or (fpos < -0.5 and fpos > -0.999999999) then
44 elseif param2 == 23 then
49 return minetest.item_place(itemstack, placer, pointed_thing, param2)
52 local function warn_if_exists(nodename)
53 if minetest.registered_nodes[nodename] then
54 minetest.log("warning", "Overwriting stairs node: " .. nodename)
60 -- Node will be called stairs:stair_<subname>
62 function stairs.register_stair(subname, recipeitem, groups, images, description,
63 sounds, worldaligntex)
64 -- Set backface culling and world-aligned textures
65 local stair_images = {}
66 for i, image in ipairs(images) do
67 if type(image) == "string" then
70 backface_culling = true,
73 stair_images[i].align_style = "world"
76 stair_images[i] = table.copy(image)
77 if stair_images[i].backface_culling == nil then
78 stair_images[i].backface_culling = true
80 if worldaligntex and stair_images[i].align_style == nil then
81 stair_images[i].align_style = "world"
85 local new_groups = table.copy(groups)
87 warn_if_exists("stairs:stair_" .. subname)
88 minetest.register_node(":stairs:stair_" .. subname, {
89 description = description,
93 paramtype2 = "facedir",
94 is_ground_content = false,
100 {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
101 {-0.5, 0.0, 0.0, 0.5, 0.5, 0.5},
104 on_place = function(itemstack, placer, pointed_thing)
105 if pointed_thing.type ~= "node" then
109 return rotate_and_place(itemstack, placer, pointed_thing)
115 minetest.register_node(":stairs:stair_" .. subname .. "upside_down", {
116 replace_name = "stairs:stair_" .. subname,
117 groups = {slabs_replace = 1},
122 -- Recipe matches appearence in inventory
123 minetest.register_craft({
124 output = "stairs:stair_" .. subname .. " 8",
126 {"", "", recipeitem},
127 {"", recipeitem, recipeitem},
128 {recipeitem, recipeitem, recipeitem},
132 -- Use stairs to craft full blocks again (1:1)
133 minetest.register_craft({
134 output = recipeitem .. " 3",
136 {"stairs:stair_" .. subname, "stairs:stair_" .. subname},
137 {"stairs:stair_" .. subname, "stairs:stair_" .. subname},
142 local baseburntime = minetest.get_craft_result({
147 if baseburntime > 0 then
148 minetest.register_craft({
150 recipe = "stairs:stair_" .. subname,
151 burntime = math.floor(baseburntime * 0.75),
159 -- Node will be called stairs:slab_<subname>
161 function stairs.register_slab(subname, recipeitem, groups, images, description,
162 sounds, worldaligntex)
163 -- Set world-aligned textures
164 local slab_images = {}
165 for i, image in ipairs(images) do
166 if type(image) == "string" then
170 if worldaligntex then
171 slab_images[i].align_style = "world"
174 slab_images[i] = table.copy(image)
175 if worldaligntex and image.align_style == nil then
176 slab_images[i].align_style = "world"
180 local new_groups = table.copy(groups)
182 warn_if_exists("stairs:slab_" .. subname)
183 minetest.register_node(":stairs:slab_" .. subname, {
184 description = description,
185 drawtype = "nodebox",
188 paramtype2 = "facedir",
189 is_ground_content = false,
194 fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
196 on_place = function(itemstack, placer, pointed_thing)
197 local under = minetest.get_node(pointed_thing.under)
198 local wield_item = itemstack:get_name()
199 local player_name = placer and placer:get_player_name() or ""
200 local creative_enabled = (creative and creative.is_enabled_for
201 and creative.is_enabled_for(player_name))
203 if under and under.name:find("^stairs:slab_") then
204 -- place slab using under node orientation
205 local dir = minetest.dir_to_facedir(vector.subtract(
206 pointed_thing.above, pointed_thing.under), true)
208 local p2 = under.param2
210 -- Placing a slab on an upside down slab should make it right-side up.
211 if p2 >= 20 and dir == 8 then
213 -- same for the opposite case: slab below normal slab
214 elseif p2 <= 3 and dir == 4 then
218 -- else attempt to place node with proper param2
219 minetest.item_place_node(ItemStack(wield_item), placer, pointed_thing, p2)
220 if not creative_enabled then
221 itemstack:take_item()
225 return rotate_and_place(itemstack, placer, pointed_thing)
232 minetest.register_node(":stairs:slab_" .. subname .. "upside_down", {
233 replace_name = "stairs:slab_".. subname,
234 groups = {slabs_replace = 1},
239 minetest.register_craft({
240 output = "stairs:slab_" .. subname .. " 6",
242 {recipeitem, recipeitem, recipeitem},
246 -- Use 2 slabs to craft a full block again (1:1)
247 minetest.register_craft({
250 {"stairs:slab_" .. subname},
251 {"stairs:slab_" .. subname},
256 local baseburntime = minetest.get_craft_result({
261 if baseburntime > 0 then
262 minetest.register_craft({
264 recipe = "stairs:slab_" .. subname,
265 burntime = math.floor(baseburntime * 0.5),
272 -- Optionally replace old "upside_down" nodes with new param2 versions.
273 -- Disabled by default.
276 minetest.register_abm({
277 label = "Slab replace",
278 nodenames = {"group:slabs_replace"},
281 action = function(pos, node)
282 node.name = minetest.registered_nodes[node.name].replace_name
283 node.param2 = node.param2 + 20
284 if node.param2 == 21 then
286 elseif node.param2 == 23 then
289 minetest.set_node(pos, node)
295 -- Register inner stair
296 -- Node will be called stairs:stair_inner_<subname>
298 function stairs.register_stair_inner(subname, recipeitem, groups, images,
299 description, sounds, worldaligntex, full_description)
300 -- Set backface culling and world-aligned textures
301 local stair_images = {}
302 for i, image in ipairs(images) do
303 if type(image) == "string" then
306 backface_culling = true,
308 if worldaligntex then
309 stair_images[i].align_style = "world"
312 stair_images[i] = table.copy(image)
313 if stair_images[i].backface_culling == nil then
314 stair_images[i].backface_culling = true
316 if worldaligntex and stair_images[i].align_style == nil then
317 stair_images[i].align_style = "world"
321 local new_groups = table.copy(groups)
323 if full_description then
324 description = full_description
326 description = "Inner " .. description
328 warn_if_exists("stairs:stair_inner_" .. subname)
329 minetest.register_node(":stairs:stair_inner_" .. subname, {
330 description = description,
331 drawtype = "nodebox",
332 tiles = stair_images,
334 paramtype2 = "facedir",
335 is_ground_content = false,
341 {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
342 {-0.5, 0.0, 0.0, 0.5, 0.5, 0.5},
343 {-0.5, 0.0, -0.5, 0.0, 0.5, 0.0},
346 on_place = function(itemstack, placer, pointed_thing)
347 if pointed_thing.type ~= "node" then
351 return rotate_and_place(itemstack, placer, pointed_thing)
356 minetest.register_craft({
357 output = "stairs:stair_inner_" .. subname .. " 7",
359 {"", recipeitem, ""},
360 {recipeitem, "", recipeitem},
361 {recipeitem, recipeitem, recipeitem},
366 local baseburntime = minetest.get_craft_result({
371 if baseburntime > 0 then
372 minetest.register_craft({
374 recipe = "stairs:stair_inner_" .. subname,
375 burntime = math.floor(baseburntime * 0.875),
382 -- Register outer stair
383 -- Node will be called stairs:stair_outer_<subname>
385 function stairs.register_stair_outer(subname, recipeitem, groups, images,
386 description, sounds, worldaligntex, full_description)
387 -- Set backface culling and world-aligned textures
388 local stair_images = {}
389 for i, image in ipairs(images) do
390 if type(image) == "string" then
393 backface_culling = true,
395 if worldaligntex then
396 stair_images[i].align_style = "world"
399 stair_images[i] = table.copy(image)
400 if stair_images[i].backface_culling == nil then
401 stair_images[i].backface_culling = true
403 if worldaligntex and stair_images[i].align_style == nil then
404 stair_images[i].align_style = "world"
408 local new_groups = table.copy(groups)
410 if full_description then
411 description = full_description
413 description = "Outer " .. description
415 warn_if_exists("stairs:stair_outer_" .. subname)
416 minetest.register_node(":stairs:stair_outer_" .. subname, {
417 description = description,
418 drawtype = "nodebox",
419 tiles = stair_images,
421 paramtype2 = "facedir",
422 is_ground_content = false,
428 {-0.5, -0.5, -0.5, 0.5, 0.0, 0.5},
429 {-0.5, 0.0, 0.0, 0.0, 0.5, 0.5},
432 on_place = function(itemstack, placer, pointed_thing)
433 if pointed_thing.type ~= "node" then
437 return rotate_and_place(itemstack, placer, pointed_thing)
442 minetest.register_craft({
443 output = "stairs:stair_outer_" .. subname .. " 6",
445 {"", recipeitem, ""},
446 {recipeitem, recipeitem, recipeitem},
451 local baseburntime = minetest.get_craft_result({
456 if baseburntime > 0 then
457 minetest.register_craft({
459 recipe = "stairs:stair_outer_" .. subname,
460 burntime = math.floor(baseburntime * 0.625),
467 -- Stair/slab registration function.
468 -- Nodes will be called stairs:{stair,slab}_<subname>
470 function stairs.register_stair_and_slab(subname, recipeitem, groups, images,
471 desc_stair, desc_slab, sounds, worldaligntex)
472 stairs.register_stair(subname, recipeitem, groups, images, desc_stair,
473 sounds, worldaligntex)
474 stairs.register_stair_inner(subname, recipeitem, groups, images, desc_stair,
475 sounds, worldaligntex)
476 stairs.register_stair_outer(subname, recipeitem, groups, images, desc_stair,
477 sounds, worldaligntex)
478 stairs.register_slab(subname, recipeitem, groups, images, desc_slab,
479 sounds, worldaligntex)
482 -- Local function so we can apply translations
483 local function my_register_stair_and_slab(subname, recipeitem, groups, images,
484 desc_stair, desc_slab, sounds, worldaligntex)
485 stairs.register_stair(subname, recipeitem, groups, images, S(desc_stair),
486 sounds, worldaligntex)
487 stairs.register_stair_inner(subname, recipeitem, groups, images, "",
488 sounds, worldaligntex, S("Inner " .. desc_stair))
489 stairs.register_stair_outer(subname, recipeitem, groups, images, "",
490 sounds, worldaligntex, S("Outer " .. desc_stair))
491 stairs.register_slab(subname, recipeitem, groups, images, S(desc_slab),
492 sounds, worldaligntex)
496 -- Register default stairs and slabs
498 my_register_stair_and_slab(
501 {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
502 {"default_wood.png"},
505 default.node_sound_wood_defaults(),
509 my_register_stair_and_slab(
511 "default:junglewood",
512 {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
513 {"default_junglewood.png"},
516 default.node_sound_wood_defaults(),
520 my_register_stair_and_slab(
523 {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
524 {"default_pine_wood.png"},
527 default.node_sound_wood_defaults(),
531 my_register_stair_and_slab(
533 "default:acacia_wood",
534 {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
535 {"default_acacia_wood.png"},
538 default.node_sound_wood_defaults(),
542 my_register_stair_and_slab(
544 "default:aspen_wood",
545 {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
546 {"default_aspen_wood.png"},
549 default.node_sound_wood_defaults(),
553 my_register_stair_and_slab(
557 {"default_stone.png"},
560 default.node_sound_stone_defaults(),
564 my_register_stair_and_slab(
568 {"default_cobble.png"},
571 default.node_sound_stone_defaults(),
575 my_register_stair_and_slab(
577 "default:mossycobble",
579 {"default_mossycobble.png"},
580 "Mossy Cobblestone Stair",
581 "Mossy Cobblestone Slab",
582 default.node_sound_stone_defaults(),
586 my_register_stair_and_slab(
588 "default:stonebrick",
590 {"default_stone_brick.png"},
593 default.node_sound_stone_defaults(),
597 my_register_stair_and_slab(
599 "default:stone_block",
601 {"default_stone_block.png"},
604 default.node_sound_stone_defaults(),
608 my_register_stair_and_slab(
610 "default:desert_stone",
612 {"default_desert_stone.png"},
613 "Desert Stone Stair",
615 default.node_sound_stone_defaults(),
619 my_register_stair_and_slab(
621 "default:desert_cobble",
623 {"default_desert_cobble.png"},
624 "Desert Cobblestone Stair",
625 "Desert Cobblestone Slab",
626 default.node_sound_stone_defaults(),
630 my_register_stair_and_slab(
632 "default:desert_stonebrick",
634 {"default_desert_stone_brick.png"},
635 "Desert Stone Brick Stair",
636 "Desert Stone Brick Slab",
637 default.node_sound_stone_defaults(),
641 my_register_stair_and_slab(
642 "desert_stone_block",
643 "default:desert_stone_block",
645 {"default_desert_stone_block.png"},
646 "Desert Stone Block Stair",
647 "Desert Stone Block Slab",
648 default.node_sound_stone_defaults(),
652 my_register_stair_and_slab(
655 {crumbly = 1, cracky = 3},
656 {"default_sandstone.png"},
659 default.node_sound_stone_defaults(),
663 my_register_stair_and_slab(
665 "default:sandstonebrick",
667 {"default_sandstone_brick.png"},
668 "Sandstone Brick Stair",
669 "Sandstone Brick Slab",
670 default.node_sound_stone_defaults(),
674 my_register_stair_and_slab(
676 "default:sandstone_block",
678 {"default_sandstone_block.png"},
679 "Sandstone Block Stair",
680 "Sandstone Block Slab",
681 default.node_sound_stone_defaults(),
685 my_register_stair_and_slab(
687 "default:desert_sandstone",
688 {crumbly = 1, cracky = 3},
689 {"default_desert_sandstone.png"},
690 "Desert Sandstone Stair",
691 "Desert Sandstone Slab",
692 default.node_sound_stone_defaults(),
696 my_register_stair_and_slab(
697 "desert_sandstone_brick",
698 "default:desert_sandstone_brick",
700 {"default_desert_sandstone_brick.png"},
701 "Desert Sandstone Brick Stair",
702 "Desert Sandstone Brick Slab",
703 default.node_sound_stone_defaults(),
707 my_register_stair_and_slab(
708 "desert_sandstone_block",
709 "default:desert_sandstone_block",
711 {"default_desert_sandstone_block.png"},
712 "Desert Sandstone Block Stair",
713 "Desert Sandstone Block Slab",
714 default.node_sound_stone_defaults(),
718 my_register_stair_and_slab(
720 "default:silver_sandstone",
721 {crumbly = 1, cracky = 3},
722 {"default_silver_sandstone.png"},
723 "Silver Sandstone Stair",
724 "Silver Sandstone Slab",
725 default.node_sound_stone_defaults(),
729 my_register_stair_and_slab(
730 "silver_sandstone_brick",
731 "default:silver_sandstone_brick",
733 {"default_silver_sandstone_brick.png"},
734 "Silver Sandstone Brick Stair",
735 "Silver Sandstone Brick Slab",
736 default.node_sound_stone_defaults(),
740 my_register_stair_and_slab(
741 "silver_sandstone_block",
742 "default:silver_sandstone_block",
744 {"default_silver_sandstone_block.png"},
745 "Silver Sandstone Block Stair",
746 "Silver Sandstone Block Slab",
747 default.node_sound_stone_defaults(),
751 my_register_stair_and_slab(
754 {cracky = 1, level = 2},
755 {"default_obsidian.png"},
758 default.node_sound_stone_defaults(),
762 my_register_stair_and_slab(
764 "default:obsidianbrick",
765 {cracky = 1, level = 2},
766 {"default_obsidian_brick.png"},
767 "Obsidian Brick Stair",
768 "Obsidian Brick Slab",
769 default.node_sound_stone_defaults(),
773 my_register_stair_and_slab(
775 "default:obsidian_block",
776 {cracky = 1, level = 2},
777 {"default_obsidian_block.png"},
778 "Obsidian Block Stair",
779 "Obsidian Block Slab",
780 default.node_sound_stone_defaults(),
784 my_register_stair_and_slab(
788 {"default_brick.png"},
791 default.node_sound_stone_defaults(),
795 my_register_stair_and_slab(
797 "default:steelblock",
798 {cracky = 1, level = 2},
799 {"default_steel_block.png"},
802 default.node_sound_metal_defaults(),
806 my_register_stair_and_slab(
809 {cracky = 1, level = 2},
810 {"default_tin_block.png"},
813 default.node_sound_metal_defaults(),
817 my_register_stair_and_slab(
819 "default:copperblock",
820 {cracky = 1, level = 2},
821 {"default_copper_block.png"},
822 "Copper Block Stair",
824 default.node_sound_metal_defaults(),
828 my_register_stair_and_slab(
830 "default:bronzeblock",
831 {cracky = 1, level = 2},
832 {"default_bronze_block.png"},
833 "Bronze Block Stair",
835 default.node_sound_metal_defaults(),
839 my_register_stair_and_slab(
843 {"default_gold_block.png"},
846 default.node_sound_metal_defaults(),
850 my_register_stair_and_slab(
853 {cracky = 3, cools_lava = 1, slippery = 3},
857 default.node_sound_glass_defaults(),
861 my_register_stair_and_slab(
864 {crumbly = 3, cools_lava = 1, snowy = 1},
865 {"default_snow.png"},
868 default.node_sound_snow_defaults(),
872 -- Glass stair nodes need to be registered individually to utilize specialized textures.
874 stairs.register_stair(
877 {cracky = 3, oddly_breakable_by_hand = 3},
878 {"stairs_glass_split.png", "default_glass.png",
879 "stairs_glass_stairside.png^[transformFX", "stairs_glass_stairside.png",
880 "default_glass.png", "stairs_glass_split.png"},
882 default.node_sound_glass_defaults(),
886 stairs.register_slab(
889 {cracky = 3, oddly_breakable_by_hand = 3},
890 {"default_glass.png", "default_glass.png", "stairs_glass_split.png"},
892 default.node_sound_glass_defaults(),
896 stairs.register_stair_inner(
899 {cracky = 3, oddly_breakable_by_hand = 3},
900 {"stairs_glass_stairside.png^[transformR270", "default_glass.png",
901 "stairs_glass_stairside.png^[transformFX", "default_glass.png",
902 "default_glass.png", "stairs_glass_stairside.png"},
904 default.node_sound_glass_defaults(),
906 S("Inner Glass Stair")
909 stairs.register_stair_outer(
912 {cracky = 3, oddly_breakable_by_hand = 3},
913 {"stairs_glass_stairside.png^[transformR90", "default_glass.png",
914 "stairs_glass_outer_stairside.png", "stairs_glass_stairside.png",
915 "stairs_glass_stairside.png^[transformR90","stairs_glass_outer_stairside.png"},
917 default.node_sound_glass_defaults(),
919 S("Outer Glass Stair")
922 stairs.register_stair(
924 "default:obsidian_glass",
926 {"stairs_obsidian_glass_split.png", "default_obsidian_glass.png",
927 "stairs_obsidian_glass_stairside.png^[transformFX", "stairs_obsidian_glass_stairside.png",
928 "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"},
929 S("Obsidian Glass Stair"),
930 default.node_sound_glass_defaults(),
934 stairs.register_slab(
936 "default:obsidian_glass",
938 {"default_obsidian_glass.png", "default_obsidian_glass.png", "stairs_obsidian_glass_split.png"},
939 S("Obsidian Glass Slab"),
940 default.node_sound_glass_defaults(),
944 stairs.register_stair_inner(
946 "default:obsidian_glass",
948 {"stairs_obsidian_glass_stairside.png^[transformR270", "default_obsidian_glass.png",
949 "stairs_obsidian_glass_stairside.png^[transformFX", "default_obsidian_glass.png",
950 "default_obsidian_glass.png", "stairs_obsidian_glass_stairside.png"},
952 default.node_sound_glass_defaults(),
954 S("Inner Obsidian Glass Stair")
957 stairs.register_stair_outer(
959 "default:obsidian_glass",
961 {"stairs_obsidian_glass_stairside.png^[transformR90", "default_obsidian_glass.png",
962 "stairs_obsidian_glass_outer_stairside.png", "stairs_obsidian_glass_stairside.png",
963 "stairs_obsidian_glass_stairside.png^[transformR90","stairs_obsidian_glass_outer_stairside.png"},
965 default.node_sound_glass_defaults(),
967 S("Outer Obsidian Glass Stair")
970 -- Dummy calls to S() to allow translation scripts to detect the strings.
971 -- To update this add this code to my_register_stair_and_slab:
972 -- for _,x in ipairs({"","Inner ","Outer "}) do print(("S(%q)"):format(x..desc_stair)) end
973 -- print(("S(%q)"):format(desc_slab))
977 S("Inner Wooden Stair")
978 S("Outer Wooden Stair")
980 S("Jungle Wood Stair")
981 S("Inner Jungle Wood Stair")
982 S("Outer Jungle Wood Stair")
983 S("Jungle Wood Slab")
985 S("Inner Pine Wood Stair")
986 S("Outer Pine Wood Stair")
988 S("Acacia Wood Stair")
989 S("Inner Acacia Wood Stair")
990 S("Outer Acacia Wood Stair")
991 S("Acacia Wood Slab")
992 S("Aspen Wood Stair")
993 S("Inner Aspen Wood Stair")
994 S("Outer Aspen Wood Stair")
997 S("Inner Stone Stair")
998 S("Outer Stone Stair")
1000 S("Cobblestone Stair")
1001 S("Inner Cobblestone Stair")
1002 S("Outer Cobblestone Stair")
1003 S("Cobblestone Slab")
1004 S("Mossy Cobblestone Stair")
1005 S("Inner Mossy Cobblestone Stair")
1006 S("Outer Mossy Cobblestone Stair")
1007 S("Mossy Cobblestone Slab")
1008 S("Stone Brick Stair")
1009 S("Inner Stone Brick Stair")
1010 S("Outer Stone Brick Stair")
1011 S("Stone Brick Slab")
1012 S("Stone Block Stair")
1013 S("Inner Stone Block Stair")
1014 S("Outer Stone Block Stair")
1015 S("Stone Block Slab")
1016 S("Desert Stone Stair")
1017 S("Inner Desert Stone Stair")
1018 S("Outer Desert Stone Stair")
1019 S("Desert Stone Slab")
1020 S("Desert Cobblestone Stair")
1021 S("Inner Desert Cobblestone Stair")
1022 S("Outer Desert Cobblestone Stair")
1023 S("Desert Cobblestone Slab")
1024 S("Desert Stone Brick Stair")
1025 S("Inner Desert Stone Brick Stair")
1026 S("Outer Desert Stone Brick Stair")
1027 S("Desert Stone Brick Slab")
1028 S("Desert Stone Block Stair")
1029 S("Inner Desert Stone Block Stair")
1030 S("Outer Desert Stone Block Stair")
1031 S("Desert Stone Block Slab")
1032 S("Sandstone Stair")
1033 S("Inner Sandstone Stair")
1034 S("Outer Sandstone Stair")
1036 S("Sandstone Brick Stair")
1037 S("Inner Sandstone Brick Stair")
1038 S("Outer Sandstone Brick Stair")
1039 S("Sandstone Brick Slab")
1040 S("Sandstone Block Stair")
1041 S("Inner Sandstone Block Stair")
1042 S("Outer Sandstone Block Stair")
1043 S("Sandstone Block Slab")
1044 S("Desert Sandstone Stair")
1045 S("Inner Desert Sandstone Stair")
1046 S("Outer Desert Sandstone Stair")
1047 S("Desert Sandstone Slab")
1048 S("Desert Sandstone Brick Stair")
1049 S("Inner Desert Sandstone Brick Stair")
1050 S("Outer Desert Sandstone Brick Stair")
1051 S("Desert Sandstone Brick Slab")
1052 S("Desert Sandstone Block Stair")
1053 S("Inner Desert Sandstone Block Stair")
1054 S("Outer Desert Sandstone Block Stair")
1055 S("Desert Sandstone Block Slab")
1056 S("Silver Sandstone Stair")
1057 S("Inner Silver Sandstone Stair")
1058 S("Outer Silver Sandstone Stair")
1059 S("Silver Sandstone Slab")
1060 S("Silver Sandstone Brick Stair")
1061 S("Inner Silver Sandstone Brick Stair")
1062 S("Outer Silver Sandstone Brick Stair")
1063 S("Silver Sandstone Brick Slab")
1064 S("Silver Sandstone Block Stair")
1065 S("Inner Silver Sandstone Block Stair")
1066 S("Outer Silver Sandstone Block Stair")
1067 S("Silver Sandstone Block Slab")
1069 S("Inner Obsidian Stair")
1070 S("Outer Obsidian Stair")
1072 S("Obsidian Brick Stair")
1073 S("Inner Obsidian Brick Stair")
1074 S("Outer Obsidian Brick Stair")
1075 S("Obsidian Brick Slab")
1076 S("Obsidian Block Stair")
1077 S("Inner Obsidian Block Stair")
1078 S("Outer Obsidian Block Stair")
1079 S("Obsidian Block Slab")
1081 S("Inner Brick Stair")
1082 S("Outer Brick Stair")
1084 S("Steel Block Stair")
1085 S("Inner Steel Block Stair")
1086 S("Outer Steel Block Stair")
1087 S("Steel Block Slab")
1088 S("Tin Block Stair")
1089 S("Inner Tin Block Stair")
1090 S("Outer Tin Block Stair")
1092 S("Copper Block Stair")
1093 S("Inner Copper Block Stair")
1094 S("Outer Copper Block Stair")
1095 S("Copper Block Slab")
1096 S("Bronze Block Stair")
1097 S("Inner Bronze Block Stair")
1098 S("Outer Bronze Block Stair")
1099 S("Bronze Block Slab")
1100 S("Gold Block Stair")
1101 S("Inner Gold Block Stair")
1102 S("Outer Gold Block Stair")
1103 S("Gold Block Slab")
1105 S("Inner Ice Stair")
1106 S("Outer Ice Stair")
1108 S("Snow Block Stair")
1109 S("Inner Snow Block Stair")
1110 S("Outer Snow Block Stair")
1111 S("Snow Block Slab")