nodes.lua 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597
  1. --[[
  2. Nether mod for minetest
  3. Copyright (C) 2013 PilzAdam
  4. Permission to use, copy, modify, and/or distribute this software for
  5. any purpose with or without fee is hereby granted, provided that the
  6. above copyright notice and this permission notice appear in all copies.
  7. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  8. WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  9. WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR
  10. BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES
  11. OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  12. WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
  13. ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
  14. SOFTWARE.
  15. ]]--
  16. local S = nether.get_translator
  17. -- Portal/wormhole nodes
  18. nether.register_wormhole_node("nether:portal", {
  19. description = S("Nether Portal"),
  20. post_effect_color = {
  21. -- post_effect_color can't be changed dynamically in Minetest like the portal colour is.
  22. -- If you need a different post_effect_color then use register_wormhole_node to create
  23. -- another wormhole node and set it as the wormhole_node_name in your portaldef.
  24. -- Hopefully this colour is close enough to magenta to work with the traditional magenta
  25. -- portals, close enough to red to work for a red portal, and also close enough to red to
  26. -- work with blue & cyan portals - since blue portals are sometimes portrayed as being red
  27. -- from the opposite side / from the inside.
  28. a = 160, r = 128, g = 0, b = 80
  29. }
  30. })
  31. local portal_animation2 = {
  32. name = "nether_portal_alt.png",
  33. animation = {
  34. type = "vertical_frames",
  35. aspect_w = 16,
  36. aspect_h = 16,
  37. length = 0.5,
  38. },
  39. }
  40. nether.register_wormhole_node("nether:portal_alt", {
  41. description = S("Portal"),
  42. tiles = {
  43. "nether_transparent.png",
  44. "nether_transparent.png",
  45. "nether_transparent.png",
  46. "nether_transparent.png",
  47. portal_animation2,
  48. portal_animation2
  49. },
  50. post_effect_color = {
  51. -- hopefully blue enough to work with blue portals, and green enough to
  52. -- work with cyan portals.
  53. a = 120, r = 0, g = 128, b = 188
  54. }
  55. })
  56. -- Nether nodes
  57. minetest.register_node("nether:rack", {
  58. description = S("Netherrack"),
  59. tiles = {"nether_rack.png"},
  60. is_ground_content = true,
  61. groups = {cracky = 3, level = 2},
  62. sounds = default.node_sound_stone_defaults(),
  63. })
  64. minetest.register_node("nether:sand", {
  65. description = S("Nethersand"),
  66. tiles = {"nether_sand.png"},
  67. is_ground_content = true,
  68. groups = {crumbly = 3, level = 2, falling_node = 1},
  69. sounds = default.node_sound_gravel_defaults({
  70. footstep = {name = "default_gravel_footstep", gain = 0.45},
  71. }),
  72. })
  73. minetest.register_node("nether:glowstone", {
  74. description = S("Glowstone"),
  75. tiles = {"nether_glowstone.png"},
  76. is_ground_content = true,
  77. light_source = 14,
  78. paramtype = "light",
  79. groups = {cracky = 3, oddly_breakable_by_hand = 3},
  80. sounds = default.node_sound_glass_defaults(),
  81. })
  82. minetest.register_node("nether:brick", {
  83. description = S("Nether Brick"),
  84. tiles = {"nether_brick.png"},
  85. is_ground_content = false,
  86. groups = {cracky = 2, level = 2},
  87. sounds = default.node_sound_stone_defaults(),
  88. })
  89. -- A decorative node which can only be obtained from dungeons or structures
  90. minetest.register_node("nether:brick_cracked", {
  91. description = S("Cracked Nether Brick"),
  92. tiles = {"nether_brick_cracked.png"},
  93. is_ground_content = false,
  94. groups = {cracky = 2, level = 2},
  95. sounds = default.node_sound_stone_defaults(),
  96. })
  97. -- Basalt is intended as another portalstone - an alternative to obsidian that's available
  98. -- for other mods to use. It cannot be found in the regions of the nether where portals
  99. -- link to, so requires a journey to obtain.
  100. minetest.register_node("nether:basalt", {
  101. description = S("Basalt"),
  102. tiles = {
  103. "nether_basalt.png",
  104. "nether_basalt.png",
  105. "nether_basalt_side.png",
  106. "nether_basalt_side.png",
  107. "nether_basalt_side.png",
  108. "nether_basalt_side.png"
  109. },
  110. is_ground_content = true,
  111. groups = {cracky = 2, level = 3, stone = 1},
  112. sounds = default.node_sound_stone_defaults(),
  113. })
  114. minetest.register_node('nether:basalt_brick', {
  115. description = 'Basalt Brick',
  116. tiles = {{name='nether_basalt_brick.png', align_style='world', scale=4}},
  117. inventory_image = '[inventorycube{nether_basalt_brick.png&[sheet:4x4:1,1{nether_basalt_brick.png&[sheet:4x4:1,1{nether_basalt_brick.png&[sheet:4x4:1,1',
  118. groups = {cracky = 2, level = 3},
  119. sounds = default.node_sound_stone_defaults(),
  120. })
  121. -- creates a splash and leaves lava in place of the "nether:lava_crust"
  122. local function smash_lava_crust(pos)
  123. local lava_particlespawn_def = {
  124. amount = 6,
  125. time = 0.1,
  126. minpos = {x=pos.x - 0.5, y=pos.y + 0.3, z=pos.z - 0.5},
  127. maxpos = {x=pos.x + 0.5, y=pos.y + 0.5, z=pos.z + 0.5},
  128. minvel = {x = -1.5, y = 1.5, z = -1.5},
  129. maxvel = {x = 1.5, y = 5, z = 1.5},
  130. minacc = {x = 0, y = -10, z = 0},
  131. maxacc = {x = 0, y = -10, z = 0},
  132. minexptime = 1,
  133. maxexptime = 1,
  134. minsize = .2,
  135. maxsize = .8,
  136. texture = "^[colorize:#A00:255",
  137. glow = 8
  138. }
  139. minetest.add_particlespawner(lava_particlespawn_def)
  140. lava_particlespawn_def.texture = "^[colorize:#FB0:255"
  141. lava_particlespawn_def.maxvel.y = 3
  142. lava_particlespawn_def.glow = 12
  143. minetest.add_particlespawner(lava_particlespawn_def)
  144. minetest.set_node(pos, {name = "default:lava_source"})
  145. end
  146. minetest.register_node("nether:lava_crust", {
  147. description = "Lava crust",
  148. tiles = {
  149. {
  150. name="nether_lava_crust_animated.png",
  151. backface_culling=true,
  152. tileable_vertical=true,
  153. tileable_horizontal=true,
  154. align_style="world",
  155. scale=2,
  156. animation = {
  157. type = "vertical_frames",
  158. aspect_w = 32,
  159. aspect_h = 32,
  160. length = 2,
  161. },
  162. }
  163. },
  164. after_destruct = smash_lava_crust,
  165. on_blast = function(pos, intensity)
  166. smash_lava_crust(pos)
  167. end,
  168. paramtype = "light",
  169. light_source = default.LIGHT_MAX - 3,
  170. buildable_to = false,
  171. walkable_to = true,
  172. is_ground_content = true,
  173. drop = "",
  174. liquid_viscosity = 7,
  175. damage_per_second = 4 * 2,
  176. groups = {oddly_breakable_by_hand = 3, igniter = 1, stone = 1},
  177. })
  178. local fence_texture =
  179. "default_fence_overlay.png^nether_brick.png^default_fence_overlay.png^[makealpha:255,126,126"
  180. minetest.register_node("nether:fence_nether_brick", {
  181. description = S("Nether Brick Fence"),
  182. drawtype = "fencelike",
  183. tiles = {"nether_brick.png"},
  184. inventory_image = fence_texture,
  185. wield_image = fence_texture,
  186. paramtype = "light",
  187. sunlight_propagates = true,
  188. is_ground_content = false,
  189. selection_box = {
  190. type = "fixed",
  191. fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
  192. },
  193. groups = {cracky = 2, level = 2},
  194. sounds = default.node_sound_stone_defaults(),
  195. })
  196. -- Register stair and slab
  197. stairs.register_stair_and_slab(
  198. "nether_brick",
  199. "nether:brick",
  200. {cracky = 2, level = 2},
  201. {"nether_brick.png"},
  202. S("Nether Stair"),
  203. S("Nether Slab"),
  204. default.node_sound_stone_defaults()
  205. )
  206. stairs.register_stair_and_slab(
  207. "nether_basalt_brick",
  208. "nether:basalt_brick",
  209. {cracky = 2, level = 2},
  210. {{name='nether_basalt_brick.png', align_style='world', scale=4}},
  211. S("Nether Basalt Stair"),
  212. S("Nether Basalt Slab"),
  213. default.node_sound_stone_defaults()
  214. )
  215. stairs.register_stair(
  216. "netherrack",
  217. "nether:rack",
  218. {cracky = 2, level = 2},
  219. {"nether_rack.png"},
  220. S("Netherrack stair"),
  221. default.node_sound_stone_defaults()
  222. )
  223. -- StairsPlus
  224. if minetest.get_modpath("moreblocks") then
  225. stairsplus:register_all(
  226. "nether", "brick", "nether:brick", {
  227. description = S("Nether Brick"),
  228. groups = {cracky = 2, level = 2},
  229. tiles = {"nether_brick.png"},
  230. sounds = default.node_sound_stone_defaults(),
  231. })
  232. end
  233. -- Lava-sea source
  234. -- This is a lava source using a different animated texture so that each node
  235. -- is out of phase in its animation from its neighbour. This prevents the lava
  236. -- sea from visually clumping together into a patchwork of 16x16 squares.
  237. local lavasea_source = {}
  238. local lava_source = minetest.registered_nodes["default:lava_source"]
  239. for key, value in pairs(lava_source) do lavasea_source[key] = value end
  240. lavasea_source.name = nil
  241. lavasea_source.tiles = {
  242. {
  243. name = "nether_lava_source_animated.png",
  244. backface_culling = false,
  245. align_style = "world",
  246. scale = 2,
  247. animation = {
  248. type = "vertical_frames",
  249. aspect_w = 32,
  250. aspect_h = 32,
  251. length = 3.0,
  252. },
  253. },
  254. {
  255. name = "nether_lava_source_animated.png",
  256. backface_culling = true,
  257. align_style = "world",
  258. scale = 2,
  259. animation = {
  260. type = "vertical_frames",
  261. aspect_w = 32,
  262. aspect_h = 32,
  263. length = 3.0,
  264. },
  265. },
  266. }
  267. minetest.register_node("nether:lava_source", lavasea_source)
  268. minetest.register_on_mods_loaded(function()
  269. -- register a bucket of Lava-sea source - but make it just the same bucket as default lava.
  270. -- (by doing this in register_on_mods_loaded we don't need to declare a soft dependency)
  271. if minetest.get_modpath("bucket") and minetest.global_exists("bucket") then
  272. local lava_bucket = bucket.liquids["default:lava_source"]
  273. if lava_bucket ~= nil then
  274. local lavasea_bucket = {}
  275. for key, value in pairs(lava_bucket) do lavasea_bucket[key] = value end
  276. lavasea_bucket.source = "nether:lava_source"
  277. bucket.liquids[lavasea_bucket.source] = lavasea_bucket
  278. end
  279. end
  280. -- include "nether:lava_source" in any "default:lava_source" ABMs
  281. local function include_nether_lava(set_of_nodes)
  282. if (type(set_of_nodes) == "table") then
  283. for _, nodename in pairs(set_of_nodes) do
  284. if nodename == "default:lava_source" then
  285. -- I'm amazed this works, but it does
  286. table.insert(set_of_nodes, "nether:lava_source")
  287. break;
  288. end
  289. end
  290. end
  291. end
  292. for _, abm in pairs(minetest.registered_abms) do
  293. include_nether_lava(abm.nodenames)
  294. include_nether_lava(abm.neighbors)
  295. end
  296. for _, lbm in pairs(minetest.registered_lbms) do
  297. include_nether_lava(lbm.nodenames)
  298. end
  299. --minetest.log("minetest.registered_abms" .. dump(minetest.registered_abms))
  300. --minetest.log("minetest.registered_lbms" .. dump(minetest.registered_lbms))
  301. end)
  302. -- Fumaroles (Chimney's)
  303. local function fumarole_startTimer(pos, timeout_factor)
  304. if timeout_factor == nil then timeout_factor = 1 end
  305. local next_timeout = (math.random(50, 900) / 10) * timeout_factor
  306. minetest.get_meta(pos):set_float("expected_timeout", next_timeout)
  307. minetest.get_node_timer(pos):start(next_timeout)
  308. end
  309. -- Create an LBM to start fumarole node timers
  310. minetest.register_lbm({
  311. label = "Start fumarole smoke",
  312. name = "nether:start_fumarole",
  313. nodenames = {"nether:fumarole"},
  314. run_at_every_load = true,
  315. action = function(pos, node)
  316. local node_above = minetest.get_node({x = pos.x, y = pos.y + 1, z = pos.z})
  317. if node_above.name == "air" then --and node.param2 % 4 == 0 then
  318. fumarole_startTimer(pos)
  319. end
  320. end
  321. })
  322. local function set_fire(pos, extinguish)
  323. local posBelow = {x = pos.x, y = pos.y - 1, z = pos.z}
  324. if extinguish then
  325. if minetest.get_node(pos).name == "fire:permanent_flame" then minetest.set_node(pos, {name="air"}) end
  326. if minetest.get_node(posBelow).name == "fire:permanent_flame" then minetest.set_node(posBelow, {name="air"}) end
  327. elseif minetest.get_node(posBelow).name == "air" then
  328. minetest.set_node(posBelow, {name="fire:permanent_flame"})
  329. elseif minetest.get_node(pos).name == "air" then
  330. minetest.set_node(pos, {name="fire:permanent_flame"})
  331. end
  332. end
  333. local function fumarole_onTimer(pos, elapsed)
  334. local expected_timeout = minetest.get_meta(pos):get_float("expected_timeout")
  335. if elapsed > expected_timeout + 10 then
  336. -- The timer didn't fire when it was supposed to, so the chunk was probably inactive and has
  337. -- just been approached again, meaning *every* fumarole's on_timer is about to go off.
  338. -- Skip this event and restart the clock for a future random interval.
  339. fumarole_startTimer(pos, 1)
  340. return false
  341. end
  342. -- Fumaroles in the Nether can catch fire.
  343. -- (if taken to the surface and used as cottage chimneys, they don't catch fire)
  344. local inNether = pos.y <= nether.DEPTH and pos.y >= nether.DEPTH_FLOOR
  345. local canCatchFire = inNether and minetest.registered_nodes["fire:permanent_flame"] ~= nil
  346. local smoke_offset = 0
  347. local timeout_factor = 1
  348. local smoke_time_adj = 1
  349. local posAbove = {x = pos.x, y = pos.y + 1, z = pos.z}
  350. local extinguish = minetest.get_node(posAbove).name ~= "air"
  351. if extinguish or (canCatchFire and math.floor(elapsed) % 7 == 0) then
  352. if not extinguish then
  353. -- fumarole gasses are igniting
  354. smoke_offset = 1
  355. timeout_factor = 0.22 -- reduce burning time
  356. end
  357. set_fire(posAbove, extinguish)
  358. set_fire({x = pos.x + 1, y = pos.y + 1, z = pos.z}, extinguish)
  359. set_fire({x = pos.x - 1, y = pos.y + 1, z = pos.z}, extinguish)
  360. set_fire({x = pos.x, y = pos.y + 1, z = pos.z + 1}, extinguish)
  361. set_fire({x = pos.x, y = pos.y + 1, z = pos.z - 1}, extinguish)
  362. elseif inNether then
  363. if math.floor(elapsed) % 3 == 1 then
  364. -- throw up some embers / lava splash
  365. local embers_particlespawn_def = {
  366. amount = 6,
  367. time = 0.1,
  368. minpos = {x=pos.x - 0.1, y=pos.y + 0.0, z=pos.z - 0.1},
  369. maxpos = {x=pos.x + 0.1, y=pos.y + 0.2, z=pos.z + 0.1},
  370. minvel = {x = -.5, y = 4.5, z = -.5},
  371. maxvel = {x = .5, y = 7, z = .5},
  372. minacc = {x = 0, y = -10, z = 0},
  373. maxacc = {x = 0, y = -10, z = 0},
  374. minexptime = 1.4,
  375. maxexptime = 1.4,
  376. minsize = .2,
  377. maxsize = .8,
  378. texture = "^[colorize:#A00:255",
  379. glow = 8
  380. }
  381. minetest.add_particlespawner(embers_particlespawn_def)
  382. embers_particlespawn_def.texture = "^[colorize:#A50:255"
  383. embers_particlespawn_def.maxvel.y = 3
  384. embers_particlespawn_def.glow = 12
  385. minetest.add_particlespawner(embers_particlespawn_def)
  386. else
  387. -- gas noises
  388. minetest.sound_play("nether_fumarole", {
  389. pos = pos,
  390. max_hear_distance = 60,
  391. gain = 0.24,
  392. pitch = math.random(35, 95) / 100
  393. })
  394. end
  395. else
  396. -- we're not in the Nether, so can afford to be a bit more smokey
  397. timeout_factor = 0.4
  398. smoke_time_adj = 1.3
  399. end
  400. -- let out some smoke
  401. minetest.add_particlespawner({
  402. amount = 12 * smoke_time_adj,
  403. time = math.random(40, 60) / 10 * smoke_time_adj,
  404. minpos = {x=pos.x - 0.2, y=pos.y + smoke_offset, z=pos.z - 0.2},
  405. maxpos = {x=pos.x + 0.2, y=pos.y + smoke_offset, z=pos.z + 0.2},
  406. minvel = {x=0, y=0.7, z=-0},
  407. maxvel = {x=0, y=0.8, z=-0},
  408. minacc = {x=0.0,y=0.0,z=-0},
  409. maxacc = {x=0.0,y=0.1,z=-0},
  410. minexptime = 5,
  411. maxexptime = 5.5,
  412. minsize = 1.5,
  413. maxsize = 7,
  414. texture = "nether_smoke_puff.png",
  415. })
  416. fumarole_startTimer(pos, timeout_factor)
  417. return false
  418. end
  419. minetest.register_node("nether:fumarole", {
  420. description="Fumarolic Chimney",
  421. tiles = {"nether_rack.png"},
  422. on_timer = fumarole_onTimer,
  423. after_place_node = function(pos, placer, itemstack, pointed_thing)
  424. fumarole_onTimer(pos, 1)
  425. return false
  426. end,
  427. is_ground_content = true,
  428. groups = {cracky = 3, level = 2, fumarole=1},
  429. paramtype = "light",
  430. drawtype = "nodebox",
  431. node_box = {
  432. type = "fixed",
  433. fixed = {
  434. {-0.5000, -0.5000, -0.5000, -0.2500, 0.5000, 0.5000},
  435. {-0.5000, -0.5000, -0.5000, 0.5000, 0.5000, -0.2500},
  436. {-0.5000, -0.5000, 0.2500, 0.5000, 0.5000, 0.5000},
  437. {0.2500, -0.5000, -0.5000, 0.5000, 0.5000, 0.5000}
  438. }
  439. },
  440. selection_box = {type = 'fixed', fixed = {-.5, -.5, -.5, .5, .5, .5}}
  441. })
  442. minetest.register_node("nether:fumarole_slab", {
  443. description="Fumarolic Chimney Slab",
  444. tiles = {"nether_rack.png"},
  445. is_ground_content = true,
  446. on_timer = fumarole_onTimer,
  447. after_place_node = function(pos, placer, itemstack, pointed_thing)
  448. fumarole_onTimer(pos, 1)
  449. return false
  450. end,
  451. groups = {cracky = 3, level = 2, fumarole=1},
  452. paramtype = "light",
  453. drawtype = "nodebox",
  454. node_box = {
  455. type = "fixed",
  456. fixed = {
  457. {-0.5000, -0.5000, -0.5000, -0.2500, 0.000, 0.5000},
  458. {-0.5000, -0.5000, -0.5000, 0.5000, 0.000, -0.2500},
  459. {-0.5000, -0.5000, 0.2500, 0.5000, 0.000, 0.5000},
  460. {0.2500, -0.5000, -0.5000, 0.5000, 0.000, 0.5000}
  461. }
  462. },
  463. selection_box = {type = 'fixed', fixed = {-.5, -.5, -.5, .5, 0, .5}},
  464. collision_box = {type = 'fixed', fixed = {-.5, -.5, -.5, .5, 0, .5}}
  465. })
  466. minetest.register_node("nether:fumarole_corner", {
  467. description="Fumarolic Chimney Corner",
  468. tiles = {"nether_rack.png"},
  469. is_ground_content = true,
  470. groups = {cracky = 3, level = 2, fumarole=1},
  471. paramtype = "light",
  472. paramtype2 = "facedir",
  473. drawtype = "nodebox",
  474. node_box = {
  475. type = "fixed",
  476. fixed = {
  477. {-0.2500, -0.5000, 0.5000, 0.000, 0.5000, 0.000},
  478. {-0.5000, -0.5000, 0.2500, 0.000, 0.5000, 0.000},
  479. {-0.5000, -0.5000, 0.2500, 0.000, 0.000, -0.5000},
  480. {0.000, -0.5000, -0.5000, 0.5000, 0.000, 0.5000}
  481. }
  482. },
  483. selection_box = {
  484. type = 'fixed',
  485. fixed = {
  486. {-.5, -.5, -.5, .5, 0, .5},
  487. {0, 0, .5, -.5, .5, 0},
  488. }
  489. }
  490. })
  491. -- nether:airlike_darkness is an air node through which light does not propagate.
  492. -- Use of it should be avoided when possible as it has the appearance of a lighting bug.
  493. -- Fumarole decorations use it to stop the propagation of light from the lava below,
  494. -- since engine limitations mean any mesh or nodebox node will light up if it has lava
  495. -- below it.
  496. local airlike_darkness = {}
  497. for k,v in pairs(minetest.registered_nodes["air"]) do airlike_darkness[k] = v end
  498. airlike_darkness.paramtype = "none"
  499. minetest.register_node("nether:airlike_darkness", airlike_darkness)
  500. -- Crafting
  501. minetest.register_craft({
  502. output = "nether:brick 4",
  503. recipe = {
  504. {"nether:rack", "nether:rack"},
  505. {"nether:rack", "nether:rack"},
  506. }
  507. })
  508. minetest.register_craft({
  509. output = "nether:basalt_brick 4",
  510. recipe = {
  511. {"nether:basalt", "nether:basalt"},
  512. {"nether:basalt", "nether:basalt"},
  513. }
  514. })
  515. minetest.register_craft({
  516. output = "nether:fence_nether_brick 6",
  517. recipe = {
  518. {"nether:brick", "nether:brick", "nether:brick"},
  519. {"nether:brick", "nether:brick", "nether:brick"},
  520. },
  521. })