init.lua 27 KB

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