nodes.lua 81 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929
  1. -- mods/default/nodes.lua
  2. --[[ Node name convention:
  3. Although many node names are in combined-word form, the required form for new
  4. node names is words separated by underscores. If both forms are used in written
  5. language (for example pinewood and pine wood) the underscore form should be used.
  6. --]]
  7. --[[ Index:
  8. Stone
  9. -----
  10. (1. Material 2. Cobble variant 3. Brick variant 4. Modified forms)
  11. default:stone
  12. default:cobble
  13. default:stonebrick
  14. default:stone_block
  15. default:mossycobble
  16. default:desert_stone
  17. default:desert_cobble
  18. default:desert_stonebrick
  19. default:desert_stone_block
  20. default:sandstone
  21. default:sandstonebrick
  22. default:sandstone_block
  23. default:desert_sandstone
  24. default:desert_sandstone_brick
  25. default:desert_sandstone_block
  26. default:silver_sandstone
  27. default:silver_sandstone_brick
  28. default:silver_sandstone_block
  29. default:obsidian
  30. default:obsidianbrick
  31. default:obsidian_block
  32. Soft / Non-Stone
  33. ----------------
  34. (1. Material 2. Modified forms)
  35. default:dirt
  36. default:dirt_with_grass
  37. default:dirt_with_grass_footsteps
  38. default:dirt_with_dry_grass
  39. default:dirt_with_snow
  40. default:dirt_with_rainforest_litter
  41. default:dirt_with_coniferous_litter
  42. default:dry_dirt
  43. default:dry_dirt_with_dry_grass
  44. default:permafrost
  45. default:permafrost_with_stones
  46. default:permafrost_with_moss
  47. default:sand
  48. default:desert_sand
  49. default:silver_sand
  50. default:gravel
  51. default:clay
  52. default:snow
  53. default:snowblock
  54. default:ice
  55. default:cave_ice
  56. Trees
  57. -----
  58. (1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling 5. Fruits)
  59. default:tree
  60. default:wood
  61. default:leaves
  62. default:sapling
  63. default:apple
  64. default:jungletree
  65. default:junglewood
  66. default:jungleleaves
  67. default:junglesapling
  68. default:emergent_jungle_sapling
  69. default:pine_tree
  70. default:pine_wood
  71. default:pine_needles
  72. default:pine_sapling
  73. default:acacia_tree
  74. default:acacia_wood
  75. default:acacia_leaves
  76. default:acacia_sapling
  77. default:aspen_tree
  78. default:aspen_wood
  79. default:aspen_leaves
  80. default:aspen_sapling
  81. Ores
  82. ----
  83. (1. In stone 2. Blocks)
  84. default:stone_with_coal
  85. default:coalblock
  86. default:stone_with_iron
  87. default:steelblock
  88. default:stone_with_copper
  89. default:copperblock
  90. default:stone_with_tin
  91. default:tinblock
  92. default:bronzeblock
  93. default:stone_with_gold
  94. default:goldblock
  95. default:stone_with_mese
  96. default:mese
  97. default:stone_with_diamond
  98. default:diamondblock
  99. Plantlife
  100. ---------
  101. default:cactus
  102. default:large_cactus_seedling
  103. default:papyrus
  104. default:dry_shrub
  105. default:junglegrass
  106. default:grass_1
  107. default:grass_2
  108. default:grass_3
  109. default:grass_4
  110. default:grass_5
  111. default:dry_grass_1
  112. default:dry_grass_2
  113. default:dry_grass_3
  114. default:dry_grass_4
  115. default:dry_grass_5
  116. default:fern_1
  117. default:fern_2
  118. default:fern_3
  119. default:marram_grass_1
  120. default:marram_grass_2
  121. default:marram_grass_3
  122. default:bush_stem
  123. default:bush_leaves
  124. default:bush_sapling
  125. default:acacia_bush_stem
  126. default:acacia_bush_leaves
  127. default:acacia_bush_sapling
  128. default:pine_bush_stem
  129. default:pine_bush_needles
  130. default:pine_bush_sapling
  131. default:blueberry_bush_leaves_with_berries
  132. default:blueberry_bush_leaves
  133. default:blueberry_bush_sapling
  134. default:sand_with_kelp
  135. Corals
  136. ------
  137. default:coral_brown
  138. default:coral_orange
  139. default:coral_skeleton
  140. Liquids
  141. -------
  142. (1. Source 2. Flowing)
  143. default:water_source
  144. default:water_flowing
  145. default:river_water_source
  146. default:river_water_flowing
  147. default:lava_source
  148. default:lava_flowing
  149. Tools / "Advanced" crafting / Non-"natural"
  150. -------------------------------------------
  151. default:bookshelf
  152. default:sign_wall_wood
  153. default:sign_wall_steel
  154. default:ladder_wood
  155. default:ladder_steel
  156. default:fence_wood
  157. default:fence_acacia_wood
  158. default:fence_junglewood
  159. default:fence_pine_wood
  160. default:fence_aspen_wood
  161. default:glass
  162. default:obsidian_glass
  163. default:brick
  164. default:meselamp
  165. default:mese_post_light
  166. Misc
  167. ----
  168. default:cloud
  169. --]]
  170. -- Required wrapper to allow customization of default.after_place_leaves
  171. local function after_place_leaves(...)
  172. return default.after_place_leaves(...)
  173. end
  174. -- Required wrapper to allow customization of default.grow_sapling
  175. local function grow_sapling(...)
  176. return default.grow_sapling(...)
  177. end
  178. --
  179. -- Stone
  180. --
  181. minetest.register_node("default:stone", {
  182. description = "Stone",
  183. tiles = {"default_stone.png"},
  184. groups = {cracky = 3, stone = 1},
  185. drop = "default:cobble",
  186. legacy_mineral = true,
  187. sounds = default.node_sound_stone_defaults(),
  188. })
  189. minetest.register_node("default:cobble", {
  190. description = "Cobblestone",
  191. tiles = {"default_cobble.png"},
  192. is_ground_content = false,
  193. groups = {cracky = 3, stone = 2},
  194. sounds = default.node_sound_stone_defaults(),
  195. })
  196. minetest.register_node("default:stonebrick", {
  197. description = "Stone Brick",
  198. paramtype2 = "facedir",
  199. place_param2 = 0,
  200. tiles = {"default_stone_brick.png"},
  201. is_ground_content = false,
  202. groups = {cracky = 2, stone = 1},
  203. sounds = default.node_sound_stone_defaults(),
  204. })
  205. minetest.register_node("default:stone_block", {
  206. description = "Stone Block",
  207. tiles = {"default_stone_block.png"},
  208. is_ground_content = false,
  209. groups = {cracky = 2, stone = 1},
  210. sounds = default.node_sound_stone_defaults(),
  211. })
  212. minetest.register_node("default:mossycobble", {
  213. description = "Mossy Cobblestone",
  214. tiles = {"default_mossycobble.png"},
  215. is_ground_content = false,
  216. groups = {cracky = 3, stone = 1},
  217. sounds = default.node_sound_stone_defaults(),
  218. })
  219. minetest.register_node("default:desert_stone", {
  220. description = "Desert Stone",
  221. tiles = {"default_desert_stone.png"},
  222. groups = {cracky = 3, stone = 1},
  223. drop = "default:desert_cobble",
  224. legacy_mineral = true,
  225. sounds = default.node_sound_stone_defaults(),
  226. })
  227. minetest.register_node("default:desert_cobble", {
  228. description = "Desert Cobblestone",
  229. tiles = {"default_desert_cobble.png"},
  230. is_ground_content = false,
  231. groups = {cracky = 3, stone = 2},
  232. sounds = default.node_sound_stone_defaults(),
  233. })
  234. minetest.register_node("default:desert_stonebrick", {
  235. description = "Desert Stone Brick",
  236. paramtype2 = "facedir",
  237. place_param2 = 0,
  238. tiles = {"default_desert_stone_brick.png"},
  239. is_ground_content = false,
  240. groups = {cracky = 2, stone = 1},
  241. sounds = default.node_sound_stone_defaults(),
  242. })
  243. minetest.register_node("default:desert_stone_block", {
  244. description = "Desert Stone Block",
  245. tiles = {"default_desert_stone_block.png"},
  246. is_ground_content = false,
  247. groups = {cracky = 2, stone = 1},
  248. sounds = default.node_sound_stone_defaults(),
  249. })
  250. minetest.register_node("default:sandstone", {
  251. description = "Sandstone",
  252. tiles = {"default_sandstone.png"},
  253. groups = {crumbly = 1, cracky = 3},
  254. sounds = default.node_sound_stone_defaults(),
  255. })
  256. minetest.register_node("default:sandstonebrick", {
  257. description = "Sandstone Brick",
  258. paramtype2 = "facedir",
  259. place_param2 = 0,
  260. tiles = {"default_sandstone_brick.png"},
  261. is_ground_content = false,
  262. groups = {cracky = 2},
  263. sounds = default.node_sound_stone_defaults(),
  264. })
  265. minetest.register_node("default:sandstone_block", {
  266. description = "Sandstone Block",
  267. tiles = {"default_sandstone_block.png"},
  268. is_ground_content = false,
  269. groups = {cracky = 2},
  270. sounds = default.node_sound_stone_defaults(),
  271. })
  272. minetest.register_node("default:desert_sandstone", {
  273. description = "Desert Sandstone",
  274. tiles = {"default_desert_sandstone.png"},
  275. groups = {crumbly = 1, cracky = 3},
  276. sounds = default.node_sound_stone_defaults(),
  277. })
  278. minetest.register_node("default:desert_sandstone_brick", {
  279. description = "Desert Sandstone Brick",
  280. paramtype2 = "facedir",
  281. place_param2 = 0,
  282. tiles = {"default_desert_sandstone_brick.png"},
  283. is_ground_content = false,
  284. groups = {cracky = 2},
  285. sounds = default.node_sound_stone_defaults(),
  286. })
  287. minetest.register_node("default:desert_sandstone_block", {
  288. description = "Desert Sandstone Block",
  289. tiles = {"default_desert_sandstone_block.png"},
  290. is_ground_content = false,
  291. groups = {cracky = 2},
  292. sounds = default.node_sound_stone_defaults(),
  293. })
  294. minetest.register_node("default:silver_sandstone", {
  295. description = "Silver Sandstone",
  296. tiles = {"default_silver_sandstone.png"},
  297. groups = {crumbly = 1, cracky = 3},
  298. sounds = default.node_sound_stone_defaults(),
  299. })
  300. minetest.register_node("default:silver_sandstone_brick", {
  301. description = "Silver Sandstone Brick",
  302. paramtype2 = "facedir",
  303. place_param2 = 0,
  304. tiles = {"default_silver_sandstone_brick.png"},
  305. is_ground_content = false,
  306. groups = {cracky = 2},
  307. sounds = default.node_sound_stone_defaults(),
  308. })
  309. minetest.register_node("default:silver_sandstone_block", {
  310. description = "Silver Sandstone Block",
  311. tiles = {"default_silver_sandstone_block.png"},
  312. is_ground_content = false,
  313. groups = {cracky = 2},
  314. sounds = default.node_sound_stone_defaults(),
  315. })
  316. minetest.register_node("default:obsidian", {
  317. description = "Obsidian",
  318. tiles = {"default_obsidian.png"},
  319. sounds = default.node_sound_stone_defaults(),
  320. groups = {cracky = 1, level = 2},
  321. })
  322. minetest.register_node("default:obsidianbrick", {
  323. description = "Obsidian Brick",
  324. paramtype2 = "facedir",
  325. place_param2 = 0,
  326. tiles = {"default_obsidian_brick.png"},
  327. is_ground_content = false,
  328. sounds = default.node_sound_stone_defaults(),
  329. groups = {cracky = 1, level = 2},
  330. })
  331. minetest.register_node("default:obsidian_block", {
  332. description = "Obsidian Block",
  333. tiles = {"default_obsidian_block.png"},
  334. is_ground_content = false,
  335. sounds = default.node_sound_stone_defaults(),
  336. groups = {cracky = 1, level = 2},
  337. })
  338. --
  339. -- Soft / Non-Stone
  340. --
  341. minetest.register_node("default:dirt", {
  342. description = "Dirt",
  343. tiles = {"default_dirt.png"},
  344. groups = {crumbly = 3, soil = 1},
  345. sounds = default.node_sound_dirt_defaults(),
  346. })
  347. minetest.register_node("default:dirt_with_grass", {
  348. description = "Dirt with Grass",
  349. tiles = {"default_grass.png", "default_dirt.png",
  350. {name = "default_dirt.png^default_grass_side.png",
  351. tileable_vertical = false}},
  352. groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1},
  353. drop = "default:dirt",
  354. sounds = default.node_sound_dirt_defaults({
  355. footstep = {name = "default_grass_footstep", gain = 0.25},
  356. }),
  357. })
  358. minetest.register_node("default:dirt_with_grass_footsteps", {
  359. description = "Dirt with Grass and Footsteps",
  360. tiles = {"default_grass.png^default_footprint.png", "default_dirt.png",
  361. {name = "default_dirt.png^default_grass_side.png",
  362. tileable_vertical = false}},
  363. groups = {crumbly = 3, soil = 1, not_in_creative_inventory = 1},
  364. drop = "default:dirt",
  365. sounds = default.node_sound_dirt_defaults({
  366. footstep = {name = "default_grass_footstep", gain = 0.25},
  367. }),
  368. })
  369. minetest.register_node("default:dirt_with_dry_grass", {
  370. description = "Dirt with Dry Grass",
  371. tiles = {"default_dry_grass.png",
  372. "default_dirt.png",
  373. {name = "default_dirt.png^default_dry_grass_side.png",
  374. tileable_vertical = false}},
  375. groups = {crumbly = 3, soil = 1},
  376. drop = "default:dirt",
  377. sounds = default.node_sound_dirt_defaults({
  378. footstep = {name = "default_grass_footstep", gain = 0.4},
  379. }),
  380. })
  381. minetest.register_node("default:dirt_with_snow", {
  382. description = "Dirt with Snow",
  383. tiles = {"default_snow.png", "default_dirt.png",
  384. {name = "default_dirt.png^default_snow_side.png",
  385. tileable_vertical = false}},
  386. groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1, snowy = 1},
  387. drop = "default:dirt",
  388. sounds = default.node_sound_dirt_defaults({
  389. footstep = {name = "default_snow_footstep", gain = 0.2},
  390. }),
  391. })
  392. minetest.register_node("default:dirt_with_rainforest_litter", {
  393. description = "Dirt with Rainforest Litter",
  394. tiles = {
  395. "default_rainforest_litter.png",
  396. "default_dirt.png",
  397. {name = "default_dirt.png^default_rainforest_litter_side.png",
  398. tileable_vertical = false}
  399. },
  400. groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1},
  401. drop = "default:dirt",
  402. sounds = default.node_sound_dirt_defaults({
  403. footstep = {name = "default_grass_footstep", gain = 0.4},
  404. }),
  405. })
  406. minetest.register_node("default:dirt_with_coniferous_litter", {
  407. description = "Dirt with Coniferous Litter",
  408. tiles = {
  409. "default_coniferous_litter.png",
  410. "default_dirt.png",
  411. {name = "default_dirt.png^default_coniferous_litter_side.png",
  412. tileable_vertical = false}
  413. },
  414. groups = {crumbly = 3, soil = 1, spreading_dirt_type = 1},
  415. drop = "default:dirt",
  416. sounds = default.node_sound_dirt_defaults({
  417. footstep = {name = "default_grass_footstep", gain = 0.4},
  418. }),
  419. })
  420. minetest.register_node("default:dry_dirt", {
  421. description = "Dry Dirt",
  422. tiles = {"default_dry_dirt.png"},
  423. groups = {crumbly = 3, soil = 1},
  424. sounds = default.node_sound_dirt_defaults(),
  425. })
  426. minetest.register_node("default:dry_dirt_with_dry_grass", {
  427. description = "Dry Dirt with Dry Grass",
  428. tiles = {"default_dry_grass.png", "default_dry_dirt.png",
  429. {name = "default_dry_dirt.png^default_dry_grass_side.png",
  430. tileable_vertical = false}},
  431. groups = {crumbly = 3, soil = 1},
  432. drop = "default:dry_dirt",
  433. sounds = default.node_sound_dirt_defaults({
  434. footstep = {name = "default_grass_footstep", gain = 0.4},
  435. }),
  436. })
  437. minetest.register_node("default:permafrost", {
  438. description = "Permafrost",
  439. tiles = {"default_permafrost.png"},
  440. groups = {cracky = 3},
  441. sounds = default.node_sound_dirt_defaults(),
  442. })
  443. minetest.register_node("default:permafrost_with_stones", {
  444. description = "Permafrost with Stones",
  445. tiles = {"default_permafrost.png^default_stones.png",
  446. "default_permafrost.png",
  447. "default_permafrost.png^default_stones_side.png"},
  448. groups = {cracky = 3},
  449. sounds = default.node_sound_gravel_defaults(),
  450. })
  451. minetest.register_node("default:permafrost_with_moss", {
  452. description = "Permafrost with Moss",
  453. tiles = {"default_moss.png", "default_permafrost.png",
  454. {name = "default_permafrost.png^default_moss_side.png",
  455. tileable_vertical = false}},
  456. groups = {cracky = 3},
  457. sounds = default.node_sound_dirt_defaults({
  458. footstep = {name = "default_grass_footstep", gain = 0.25},
  459. }),
  460. })
  461. minetest.register_node("default:sand", {
  462. description = "Sand",
  463. tiles = {"default_sand.png"},
  464. groups = {crumbly = 3, falling_node = 1, sand = 1},
  465. sounds = default.node_sound_sand_defaults(),
  466. })
  467. minetest.register_node("default:desert_sand", {
  468. description = "Desert Sand",
  469. tiles = {"default_desert_sand.png"},
  470. groups = {crumbly = 3, falling_node = 1, sand = 1},
  471. sounds = default.node_sound_sand_defaults(),
  472. })
  473. minetest.register_node("default:silver_sand", {
  474. description = "Silver Sand",
  475. tiles = {"default_silver_sand.png"},
  476. groups = {crumbly = 3, falling_node = 1, sand = 1},
  477. sounds = default.node_sound_sand_defaults(),
  478. })
  479. minetest.register_node("default:gravel", {
  480. description = "Gravel",
  481. tiles = {"default_gravel.png"},
  482. groups = {crumbly = 2, falling_node = 1},
  483. sounds = default.node_sound_gravel_defaults(),
  484. drop = {
  485. max_items = 1,
  486. items = {
  487. {items = {"default:flint"}, rarity = 16},
  488. {items = {"default:gravel"}}
  489. }
  490. }
  491. })
  492. minetest.register_node("default:clay", {
  493. description = "Clay",
  494. tiles = {"default_clay.png"},
  495. groups = {crumbly = 3},
  496. drop = "default:clay_lump 4",
  497. sounds = default.node_sound_dirt_defaults(),
  498. })
  499. minetest.register_node("default:snow", {
  500. description = "Snow",
  501. tiles = {"default_snow.png"},
  502. inventory_image = "default_snowball.png",
  503. wield_image = "default_snowball.png",
  504. paramtype = "light",
  505. buildable_to = true,
  506. floodable = true,
  507. drawtype = "nodebox",
  508. node_box = {
  509. type = "fixed",
  510. fixed = {
  511. {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5},
  512. },
  513. },
  514. collision_box = {
  515. type = "fixed",
  516. fixed = {
  517. {-0.5, -0.5, -0.5, 0.5, -7 / 16, 0.5},
  518. },
  519. },
  520. groups = {crumbly = 3, falling_node = 1, snowy = 1},
  521. sounds = default.node_sound_snow_defaults(),
  522. on_construct = function(pos)
  523. pos.y = pos.y - 1
  524. if minetest.get_node(pos).name == "default:dirt_with_grass" then
  525. minetest.set_node(pos, {name = "default:dirt_with_snow"})
  526. end
  527. end,
  528. })
  529. minetest.register_node("default:snowblock", {
  530. description = "Snow Block",
  531. tiles = {"default_snow.png"},
  532. groups = {crumbly = 3, cools_lava = 1, snowy = 1},
  533. sounds = default.node_sound_snow_defaults(),
  534. on_construct = function(pos)
  535. pos.y = pos.y - 1
  536. if minetest.get_node(pos).name == "default:dirt_with_grass" then
  537. minetest.set_node(pos, {name = "default:dirt_with_snow"})
  538. end
  539. end,
  540. })
  541. -- 'is ground content = false' to avoid tunnels in sea ice or ice rivers
  542. minetest.register_node("default:ice", {
  543. description = "Ice",
  544. tiles = {"default_ice.png"},
  545. is_ground_content = false,
  546. paramtype = "light",
  547. groups = {cracky = 3, cools_lava = 1, slippery = 3},
  548. sounds = default.node_sound_glass_defaults(),
  549. })
  550. -- Mapgen-placed ice with 'is ground content = true' to contain tunnels
  551. minetest.register_node("default:cave_ice", {
  552. description = "Cave Ice",
  553. tiles = {"default_ice.png"},
  554. paramtype = "light",
  555. groups = {cracky = 3, cools_lava = 1, slippery = 3,
  556. not_in_creative_inventory = 1},
  557. drop = "default:ice",
  558. sounds = default.node_sound_glass_defaults(),
  559. })
  560. --
  561. -- Trees
  562. --
  563. minetest.register_node("default:tree", {
  564. description = "Apple Tree",
  565. tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
  566. paramtype2 = "facedir",
  567. is_ground_content = false,
  568. groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
  569. sounds = default.node_sound_wood_defaults(),
  570. on_place = minetest.rotate_node
  571. })
  572. minetest.register_node("default:wood", {
  573. description = "Apple Wood Planks",
  574. paramtype2 = "facedir",
  575. place_param2 = 0,
  576. tiles = {"default_wood.png"},
  577. is_ground_content = false,
  578. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
  579. sounds = default.node_sound_wood_defaults(),
  580. })
  581. minetest.register_node("default:sapling", {
  582. description = "Apple Tree Sapling",
  583. drawtype = "plantlike",
  584. tiles = {"default_sapling.png"},
  585. inventory_image = "default_sapling.png",
  586. wield_image = "default_sapling.png",
  587. paramtype = "light",
  588. sunlight_propagates = true,
  589. walkable = false,
  590. on_timer = grow_sapling,
  591. selection_box = {
  592. type = "fixed",
  593. fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
  594. },
  595. groups = {snappy = 2, dig_immediate = 3, flammable = 2,
  596. attached_node = 1, sapling = 1},
  597. sounds = default.node_sound_leaves_defaults(),
  598. on_construct = function(pos)
  599. minetest.get_node_timer(pos):start(math.random(300, 1500))
  600. end,
  601. on_place = function(itemstack, placer, pointed_thing)
  602. itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
  603. "default:sapling",
  604. -- minp, maxp to be checked, relative to sapling pos
  605. -- minp_relative.y = 1 because sapling pos has been checked
  606. {x = -3, y = 1, z = -3},
  607. {x = 3, y = 6, z = 3},
  608. -- maximum interval of interior volume check
  609. 4)
  610. return itemstack
  611. end,
  612. })
  613. minetest.register_node("default:leaves", {
  614. description = "Apple Tree Leaves",
  615. drawtype = "allfaces_optional",
  616. waving = 1,
  617. tiles = {"default_leaves.png"},
  618. special_tiles = {"default_leaves_simple.png"},
  619. paramtype = "light",
  620. is_ground_content = false,
  621. groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
  622. drop = {
  623. max_items = 1,
  624. items = {
  625. {
  626. -- player will get sapling with 1/20 chance
  627. items = {"default:sapling"},
  628. rarity = 20,
  629. },
  630. {
  631. -- player will get leaves only if he get no saplings,
  632. -- this is because max_items is 1
  633. items = {"default:leaves"},
  634. }
  635. }
  636. },
  637. sounds = default.node_sound_leaves_defaults(),
  638. after_place_node = after_place_leaves,
  639. })
  640. minetest.register_node("default:apple", {
  641. description = "Apple",
  642. drawtype = "plantlike",
  643. tiles = {"default_apple.png"},
  644. inventory_image = "default_apple.png",
  645. paramtype = "light",
  646. sunlight_propagates = true,
  647. walkable = false,
  648. is_ground_content = false,
  649. selection_box = {
  650. type = "fixed",
  651. fixed = {-3 / 16, -7 / 16, -3 / 16, 3 / 16, 4 / 16, 3 / 16}
  652. },
  653. groups = {fleshy = 3, dig_immediate = 3, flammable = 2,
  654. leafdecay = 3, leafdecay_drop = 1, food_apple = 1},
  655. on_use = minetest.item_eat(2),
  656. sounds = default.node_sound_leaves_defaults(),
  657. after_place_node = function(pos, placer, itemstack)
  658. minetest.set_node(pos, {name = "default:apple", param2 = 1})
  659. end,
  660. after_dig_node = function(pos, oldnode, oldmetadata, digger)
  661. if oldnode.param2 == 0 then
  662. minetest.set_node(pos, {name = "default:apple_mark"})
  663. minetest.get_node_timer(pos):start(math.random(300, 1500))
  664. end
  665. end,
  666. })
  667. minetest.register_node("default:apple_mark", {
  668. description = "Apple Marker",
  669. drawtype = "airlike",
  670. paramtype = "light",
  671. sunlight_propagates = true,
  672. walkable = false,
  673. pointable = false,
  674. diggable = false,
  675. buildable_to = true,
  676. drop = "",
  677. groups = {not_in_creative_inventory = 1},
  678. on_timer = function(pos, elapsed)
  679. if not minetest.find_node_near(pos, 1, "default:leaves") then
  680. minetest.remove_node(pos)
  681. elseif minetest.get_node_light(pos) < 11 then
  682. minetest.get_node_timer(pos):start(200)
  683. else
  684. minetest.set_node(pos, {name = "default:apple"})
  685. end
  686. end
  687. })
  688. minetest.register_node("default:jungletree", {
  689. description = "Jungle Tree",
  690. tiles = {"default_jungletree_top.png", "default_jungletree_top.png",
  691. "default_jungletree.png"},
  692. paramtype2 = "facedir",
  693. is_ground_content = false,
  694. groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
  695. sounds = default.node_sound_wood_defaults(),
  696. on_place = minetest.rotate_node
  697. })
  698. minetest.register_node("default:junglewood", {
  699. description = "Jungle Wood Planks",
  700. paramtype2 = "facedir",
  701. place_param2 = 0,
  702. tiles = {"default_junglewood.png"},
  703. is_ground_content = false,
  704. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
  705. sounds = default.node_sound_wood_defaults(),
  706. })
  707. minetest.register_node("default:jungleleaves", {
  708. description = "Jungle Tree Leaves",
  709. drawtype = "allfaces_optional",
  710. waving = 1,
  711. tiles = {"default_jungleleaves.png"},
  712. special_tiles = {"default_jungleleaves_simple.png"},
  713. paramtype = "light",
  714. is_ground_content = false,
  715. groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
  716. drop = {
  717. max_items = 1,
  718. items = {
  719. {items = {"default:junglesapling"}, rarity = 20},
  720. {items = {"default:jungleleaves"}}
  721. }
  722. },
  723. sounds = default.node_sound_leaves_defaults(),
  724. after_place_node = after_place_leaves,
  725. })
  726. minetest.register_node("default:junglesapling", {
  727. description = "Jungle Tree Sapling",
  728. drawtype = "plantlike",
  729. tiles = {"default_junglesapling.png"},
  730. inventory_image = "default_junglesapling.png",
  731. wield_image = "default_junglesapling.png",
  732. paramtype = "light",
  733. sunlight_propagates = true,
  734. walkable = false,
  735. on_timer = grow_sapling,
  736. selection_box = {
  737. type = "fixed",
  738. fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
  739. },
  740. groups = {snappy = 2, dig_immediate = 3, flammable = 2,
  741. attached_node = 1, sapling = 1},
  742. sounds = default.node_sound_leaves_defaults(),
  743. on_construct = function(pos)
  744. minetest.get_node_timer(pos):start(math.random(300, 1500))
  745. end,
  746. on_place = function(itemstack, placer, pointed_thing)
  747. itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
  748. "default:junglesapling",
  749. -- minp, maxp to be checked, relative to sapling pos
  750. -- minp_relative.y = 1 because sapling pos has been checked
  751. {x = -2, y = 1, z = -2},
  752. {x = 2, y = 15, z = 2},
  753. -- maximum interval of interior volume check
  754. 4)
  755. return itemstack
  756. end,
  757. })
  758. minetest.register_node("default:emergent_jungle_sapling", {
  759. description = "Emergent Jungle Tree Sapling",
  760. drawtype = "plantlike",
  761. tiles = {"default_emergent_jungle_sapling.png"},
  762. inventory_image = "default_emergent_jungle_sapling.png",
  763. wield_image = "default_emergent_jungle_sapling.png",
  764. paramtype = "light",
  765. sunlight_propagates = true,
  766. walkable = false,
  767. on_timer = grow_sapling,
  768. selection_box = {
  769. type = "fixed",
  770. fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
  771. },
  772. groups = {snappy = 2, dig_immediate = 3, flammable = 2,
  773. attached_node = 1, sapling = 1},
  774. sounds = default.node_sound_leaves_defaults(),
  775. on_construct = function(pos)
  776. minetest.get_node_timer(pos):start(math.random(300, 1500))
  777. end,
  778. on_place = function(itemstack, placer, pointed_thing)
  779. itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
  780. "default:emergent_jungle_sapling",
  781. -- minp, maxp to be checked, relative to sapling pos
  782. {x = -3, y = -5, z = -3},
  783. {x = 3, y = 31, z = 3},
  784. -- maximum interval of interior volume check
  785. 4)
  786. return itemstack
  787. end,
  788. })
  789. minetest.register_node("default:pine_tree", {
  790. description = "Pine Tree",
  791. tiles = {"default_pine_tree_top.png", "default_pine_tree_top.png",
  792. "default_pine_tree.png"},
  793. paramtype2 = "facedir",
  794. is_ground_content = false,
  795. groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3},
  796. sounds = default.node_sound_wood_defaults(),
  797. on_place = minetest.rotate_node
  798. })
  799. minetest.register_node("default:pine_wood", {
  800. description = "Pine Wood Planks",
  801. paramtype2 = "facedir",
  802. place_param2 = 0,
  803. tiles = {"default_pine_wood.png"},
  804. is_ground_content = false,
  805. groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
  806. sounds = default.node_sound_wood_defaults(),
  807. })
  808. minetest.register_node("default:pine_needles",{
  809. description = "Pine Needles",
  810. drawtype = "allfaces_optional",
  811. tiles = {"default_pine_needles.png"},
  812. waving = 1,
  813. paramtype = "light",
  814. is_ground_content = false,
  815. groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
  816. drop = {
  817. max_items = 1,
  818. items = {
  819. {items = {"default:pine_sapling"}, rarity = 20},
  820. {items = {"default:pine_needles"}}
  821. }
  822. },
  823. sounds = default.node_sound_leaves_defaults(),
  824. after_place_node = after_place_leaves,
  825. })
  826. minetest.register_node("default:pine_sapling", {
  827. description = "Pine Tree Sapling",
  828. drawtype = "plantlike",
  829. tiles = {"default_pine_sapling.png"},
  830. inventory_image = "default_pine_sapling.png",
  831. wield_image = "default_pine_sapling.png",
  832. paramtype = "light",
  833. sunlight_propagates = true,
  834. walkable = false,
  835. on_timer = grow_sapling,
  836. selection_box = {
  837. type = "fixed",
  838. fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
  839. },
  840. groups = {snappy = 2, dig_immediate = 3, flammable = 3,
  841. attached_node = 1, sapling = 1},
  842. sounds = default.node_sound_leaves_defaults(),
  843. on_construct = function(pos)
  844. minetest.get_node_timer(pos):start(math.random(300, 1500))
  845. end,
  846. on_place = function(itemstack, placer, pointed_thing)
  847. itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
  848. "default:pine_sapling",
  849. -- minp, maxp to be checked, relative to sapling pos
  850. -- minp_relative.y = 1 because sapling pos has been checked
  851. {x = -2, y = 1, z = -2},
  852. {x = 2, y = 14, z = 2},
  853. -- maximum interval of interior volume check
  854. 4)
  855. return itemstack
  856. end,
  857. })
  858. minetest.register_node("default:acacia_tree", {
  859. description = "Acacia Tree",
  860. tiles = {"default_acacia_tree_top.png", "default_acacia_tree_top.png",
  861. "default_acacia_tree.png"},
  862. paramtype2 = "facedir",
  863. is_ground_content = false,
  864. groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
  865. sounds = default.node_sound_wood_defaults(),
  866. on_place = minetest.rotate_node
  867. })
  868. minetest.register_node("default:acacia_wood", {
  869. description = "Acacia Wood Planks",
  870. paramtype2 = "facedir",
  871. place_param2 = 0,
  872. tiles = {"default_acacia_wood.png"},
  873. is_ground_content = false,
  874. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, wood = 1},
  875. sounds = default.node_sound_wood_defaults(),
  876. })
  877. minetest.register_node("default:acacia_leaves", {
  878. description = "Acacia Tree Leaves",
  879. drawtype = "allfaces_optional",
  880. tiles = {"default_acacia_leaves.png"},
  881. special_tiles = {"default_acacia_leaves_simple.png"},
  882. waving = 1,
  883. paramtype = "light",
  884. is_ground_content = false,
  885. groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
  886. drop = {
  887. max_items = 1,
  888. items = {
  889. {items = {"default:acacia_sapling"}, rarity = 20},
  890. {items = {"default:acacia_leaves"}}
  891. }
  892. },
  893. sounds = default.node_sound_leaves_defaults(),
  894. after_place_node = after_place_leaves,
  895. })
  896. minetest.register_node("default:acacia_sapling", {
  897. description = "Acacia Tree Sapling",
  898. drawtype = "plantlike",
  899. tiles = {"default_acacia_sapling.png"},
  900. inventory_image = "default_acacia_sapling.png",
  901. wield_image = "default_acacia_sapling.png",
  902. paramtype = "light",
  903. sunlight_propagates = true,
  904. walkable = false,
  905. on_timer = grow_sapling,
  906. selection_box = {
  907. type = "fixed",
  908. fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 7 / 16, 4 / 16}
  909. },
  910. groups = {snappy = 2, dig_immediate = 3, flammable = 2,
  911. attached_node = 1, sapling = 1},
  912. sounds = default.node_sound_leaves_defaults(),
  913. on_construct = function(pos)
  914. minetest.get_node_timer(pos):start(math.random(300, 1500))
  915. end,
  916. on_place = function(itemstack, placer, pointed_thing)
  917. itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
  918. "default:acacia_sapling",
  919. -- minp, maxp to be checked, relative to sapling pos
  920. -- minp_relative.y = 1 because sapling pos has been checked
  921. {x = -4, y = 1, z = -4},
  922. {x = 4, y = 7, z = 4},
  923. -- maximum interval of interior volume check
  924. 4)
  925. return itemstack
  926. end,
  927. })
  928. minetest.register_node("default:aspen_tree", {
  929. description = "Aspen Tree",
  930. tiles = {"default_aspen_tree_top.png", "default_aspen_tree_top.png",
  931. "default_aspen_tree.png"},
  932. paramtype2 = "facedir",
  933. is_ground_content = false,
  934. groups = {tree = 1, choppy = 3, oddly_breakable_by_hand = 1, flammable = 3},
  935. sounds = default.node_sound_wood_defaults(),
  936. on_place = minetest.rotate_node
  937. })
  938. minetest.register_node("default:aspen_wood", {
  939. description = "Aspen Wood Planks",
  940. paramtype2 = "facedir",
  941. place_param2 = 0,
  942. tiles = {"default_aspen_wood.png"},
  943. is_ground_content = false,
  944. groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3, wood = 1},
  945. sounds = default.node_sound_wood_defaults(),
  946. })
  947. minetest.register_node("default:aspen_leaves", {
  948. description = "Aspen Tree Leaves",
  949. drawtype = "allfaces_optional",
  950. tiles = {"default_aspen_leaves.png"},
  951. waving = 1,
  952. paramtype = "light",
  953. is_ground_content = false,
  954. groups = {snappy = 3, leafdecay = 3, flammable = 2, leaves = 1},
  955. drop = {
  956. max_items = 1,
  957. items = {
  958. {items = {"default:aspen_sapling"}, rarity = 20},
  959. {items = {"default:aspen_leaves"}}
  960. }
  961. },
  962. sounds = default.node_sound_leaves_defaults(),
  963. after_place_node = after_place_leaves,
  964. })
  965. minetest.register_node("default:aspen_sapling", {
  966. description = "Aspen Tree Sapling",
  967. drawtype = "plantlike",
  968. tiles = {"default_aspen_sapling.png"},
  969. inventory_image = "default_aspen_sapling.png",
  970. wield_image = "default_aspen_sapling.png",
  971. paramtype = "light",
  972. sunlight_propagates = true,
  973. walkable = false,
  974. on_timer = grow_sapling,
  975. selection_box = {
  976. type = "fixed",
  977. fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 0.5, 3 / 16}
  978. },
  979. groups = {snappy = 2, dig_immediate = 3, flammable = 3,
  980. attached_node = 1, sapling = 1},
  981. sounds = default.node_sound_leaves_defaults(),
  982. on_construct = function(pos)
  983. minetest.get_node_timer(pos):start(math.random(300, 1500))
  984. end,
  985. on_place = function(itemstack, placer, pointed_thing)
  986. itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
  987. "default:aspen_sapling",
  988. -- minp, maxp to be checked, relative to sapling pos
  989. -- minp_relative.y = 1 because sapling pos has been checked
  990. {x = -2, y = 1, z = -2},
  991. {x = 2, y = 12, z = 2},
  992. -- maximum interval of interior volume check
  993. 4)
  994. return itemstack
  995. end,
  996. })
  997. --
  998. -- Ores
  999. --
  1000. minetest.register_node("default:stone_with_coal", {
  1001. description = "Coal Ore",
  1002. tiles = {"default_stone.png^default_mineral_coal.png"},
  1003. groups = {cracky = 3},
  1004. drop = "default:coal_lump",
  1005. sounds = default.node_sound_stone_defaults(),
  1006. })
  1007. minetest.register_node("default:coalblock", {
  1008. description = "Coal Block",
  1009. tiles = {"default_coal_block.png"},
  1010. is_ground_content = false,
  1011. groups = {cracky = 3},
  1012. sounds = default.node_sound_stone_defaults(),
  1013. })
  1014. minetest.register_node("default:stone_with_iron", {
  1015. description = "Iron Ore",
  1016. tiles = {"default_stone.png^default_mineral_iron.png"},
  1017. groups = {cracky = 2},
  1018. drop = "default:iron_lump",
  1019. sounds = default.node_sound_stone_defaults(),
  1020. })
  1021. minetest.register_node("default:steelblock", {
  1022. description = "Steel Block",
  1023. tiles = {"default_steel_block.png"},
  1024. is_ground_content = false,
  1025. groups = {cracky = 1, level = 2},
  1026. sounds = default.node_sound_metal_defaults(),
  1027. })
  1028. minetest.register_node("default:stone_with_copper", {
  1029. description = "Copper Ore",
  1030. tiles = {"default_stone.png^default_mineral_copper.png"},
  1031. groups = {cracky = 2},
  1032. drop = "default:copper_lump",
  1033. sounds = default.node_sound_stone_defaults(),
  1034. })
  1035. minetest.register_node("default:copperblock", {
  1036. description = "Copper Block",
  1037. tiles = {"default_copper_block.png"},
  1038. is_ground_content = false,
  1039. groups = {cracky = 1, level = 2},
  1040. sounds = default.node_sound_metal_defaults(),
  1041. })
  1042. minetest.register_node("default:stone_with_tin", {
  1043. description = "Tin Ore",
  1044. tiles = {"default_stone.png^default_mineral_tin.png"},
  1045. groups = {cracky = 2},
  1046. drop = "default:tin_lump",
  1047. sounds = default.node_sound_stone_defaults(),
  1048. })
  1049. minetest.register_node("default:tinblock", {
  1050. description = "Tin Block",
  1051. tiles = {"default_tin_block.png"},
  1052. is_ground_content = false,
  1053. groups = {cracky = 1, level = 2},
  1054. sounds = default.node_sound_metal_defaults(),
  1055. })
  1056. minetest.register_node("default:bronzeblock", {
  1057. description = "Bronze Block",
  1058. tiles = {"default_bronze_block.png"},
  1059. is_ground_content = false,
  1060. groups = {cracky = 1, level = 2},
  1061. sounds = default.node_sound_metal_defaults(),
  1062. })
  1063. minetest.register_node("default:stone_with_mese", {
  1064. description = "Mese Ore",
  1065. tiles = {"default_stone.png^default_mineral_mese.png"},
  1066. groups = {cracky = 1},
  1067. drop = "default:mese_crystal",
  1068. sounds = default.node_sound_stone_defaults(),
  1069. })
  1070. minetest.register_node("default:mese", {
  1071. description = "Mese Block",
  1072. tiles = {"default_mese_block.png"},
  1073. paramtype = "light",
  1074. groups = {cracky = 1, level = 2},
  1075. sounds = default.node_sound_stone_defaults(),
  1076. light_source = 3,
  1077. })
  1078. minetest.register_node("default:stone_with_gold", {
  1079. description = "Gold Ore",
  1080. tiles = {"default_stone.png^default_mineral_gold.png"},
  1081. groups = {cracky = 2},
  1082. drop = "default:gold_lump",
  1083. sounds = default.node_sound_stone_defaults(),
  1084. })
  1085. minetest.register_node("default:goldblock", {
  1086. description = "Gold Block",
  1087. tiles = {"default_gold_block.png"},
  1088. is_ground_content = false,
  1089. groups = {cracky = 1},
  1090. sounds = default.node_sound_metal_defaults(),
  1091. })
  1092. minetest.register_node("default:stone_with_diamond", {
  1093. description = "Diamond Ore",
  1094. tiles = {"default_stone.png^default_mineral_diamond.png"},
  1095. groups = {cracky = 1},
  1096. drop = "default:diamond",
  1097. sounds = default.node_sound_stone_defaults(),
  1098. })
  1099. minetest.register_node("default:diamondblock", {
  1100. description = "Diamond Block",
  1101. tiles = {"default_diamond_block.png"},
  1102. is_ground_content = false,
  1103. groups = {cracky = 1, level = 3},
  1104. sounds = default.node_sound_stone_defaults(),
  1105. })
  1106. --
  1107. -- Plantlife (non-cubic)
  1108. --
  1109. minetest.register_node("default:cactus", {
  1110. description = "Cactus",
  1111. tiles = {"default_cactus_top.png", "default_cactus_top.png",
  1112. "default_cactus_side.png"},
  1113. paramtype2 = "facedir",
  1114. groups = {choppy = 3},
  1115. sounds = default.node_sound_wood_defaults(),
  1116. on_place = minetest.rotate_node,
  1117. })
  1118. minetest.register_node("default:large_cactus_seedling", {
  1119. description = "Large Cactus Seedling",
  1120. drawtype = "plantlike",
  1121. tiles = {"default_large_cactus_seedling.png"},
  1122. inventory_image = "default_large_cactus_seedling.png",
  1123. wield_image = "default_large_cactus_seedling.png",
  1124. paramtype = "light",
  1125. sunlight_propagates = true,
  1126. walkable = false,
  1127. selection_box = {
  1128. type = "fixed",
  1129. fixed = {
  1130. -5 / 16, -0.5, -5 / 16,
  1131. 5 / 16, 0.5, 5 / 16
  1132. }
  1133. },
  1134. groups = {choppy = 3, dig_immediate = 3, attached_node = 1},
  1135. sounds = default.node_sound_wood_defaults(),
  1136. on_place = function(itemstack, placer, pointed_thing)
  1137. itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
  1138. "default:large_cactus_seedling",
  1139. {x = -2, y = -1, z = -2},
  1140. {x = 2, y = 5, z = 2},
  1141. 4)
  1142. return itemstack
  1143. end,
  1144. on_construct = function(pos)
  1145. -- Normal cactus farming adds 1 cactus node by ABM,
  1146. -- interval 12s, chance 83.
  1147. -- Consider starting with 5 cactus nodes. We make sure that growing a
  1148. -- large cactus is not a faster way to produce new cactus nodes.
  1149. -- Confirmed by experiment, when farming 5 cacti, on average 1 new
  1150. -- cactus node is added on average every
  1151. -- 83 / 5 = 16.6 intervals = 16.6 * 12 = 199.2s.
  1152. -- Large cactus contains on average 14 cactus nodes.
  1153. -- 14 * 199.2 = 2788.8s.
  1154. -- Set random range to average to 2789s.
  1155. minetest.get_node_timer(pos):start(math.random(1859, 3719))
  1156. end,
  1157. on_timer = function(pos)
  1158. local node_under = minetest.get_node_or_nil(
  1159. {x = pos.x, y = pos.y - 1, z = pos.z})
  1160. if not node_under then
  1161. -- Node under not yet loaded, try later
  1162. minetest.get_node_timer(pos):start(300)
  1163. return
  1164. end
  1165. if minetest.get_item_group(node_under.name, "sand") == 0 then
  1166. -- Seedling dies
  1167. minetest.remove_node(pos)
  1168. return
  1169. end
  1170. local light_level = minetest.get_node_light(pos)
  1171. if not light_level or light_level < 13 then
  1172. -- Too dark for growth, try later in case it's night
  1173. minetest.get_node_timer(pos):start(300)
  1174. return
  1175. end
  1176. minetest.log("action", "A large cactus seedling grows into a large" ..
  1177. "cactus at ".. minetest.pos_to_string(pos))
  1178. default.grow_large_cactus(pos)
  1179. end,
  1180. })
  1181. minetest.register_node("default:papyrus", {
  1182. description = "Papyrus",
  1183. drawtype = "plantlike",
  1184. tiles = {"default_papyrus.png"},
  1185. inventory_image = "default_papyrus.png",
  1186. wield_image = "default_papyrus.png",
  1187. paramtype = "light",
  1188. sunlight_propagates = true,
  1189. walkable = false,
  1190. selection_box = {
  1191. type = "fixed",
  1192. fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16},
  1193. },
  1194. groups = {snappy = 3, flammable = 2},
  1195. sounds = default.node_sound_leaves_defaults(),
  1196. after_dig_node = function(pos, node, metadata, digger)
  1197. default.dig_up(pos, node, digger)
  1198. end,
  1199. })
  1200. minetest.register_node("default:dry_shrub", {
  1201. description = "Dry Shrub",
  1202. drawtype = "plantlike",
  1203. waving = 1,
  1204. tiles = {"default_dry_shrub.png"},
  1205. inventory_image = "default_dry_shrub.png",
  1206. wield_image = "default_dry_shrub.png",
  1207. paramtype = "light",
  1208. paramtype2 = "meshoptions",
  1209. place_param2 = 4,
  1210. sunlight_propagates = true,
  1211. walkable = false,
  1212. buildable_to = true,
  1213. groups = {snappy = 3, flammable = 3, attached_node = 1},
  1214. sounds = default.node_sound_leaves_defaults(),
  1215. selection_box = {
  1216. type = "fixed",
  1217. fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 4 / 16, 6 / 16},
  1218. },
  1219. })
  1220. minetest.register_node("default:junglegrass", {
  1221. description = "Jungle Grass",
  1222. drawtype = "plantlike",
  1223. waving = 1,
  1224. visual_scale = 1.69,
  1225. tiles = {"default_junglegrass.png"},
  1226. inventory_image = "default_junglegrass.png",
  1227. wield_image = "default_junglegrass.png",
  1228. paramtype = "light",
  1229. sunlight_propagates = true,
  1230. walkable = false,
  1231. buildable_to = true,
  1232. groups = {snappy = 3, flora = 1, attached_node = 1, flammable = 1},
  1233. sounds = default.node_sound_leaves_defaults(),
  1234. selection_box = {
  1235. type = "fixed",
  1236. fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, 0.5, 6 / 16},
  1237. },
  1238. })
  1239. minetest.register_node("default:grass_1", {
  1240. description = "Grass",
  1241. drawtype = "plantlike",
  1242. waving = 1,
  1243. tiles = {"default_grass_1.png"},
  1244. -- Use texture of a taller grass stage in inventory
  1245. inventory_image = "default_grass_3.png",
  1246. wield_image = "default_grass_3.png",
  1247. paramtype = "light",
  1248. sunlight_propagates = true,
  1249. walkable = false,
  1250. buildable_to = true,
  1251. groups = {snappy = 3, flora = 1, attached_node = 1, grass = 1, flammable = 1},
  1252. sounds = default.node_sound_leaves_defaults(),
  1253. selection_box = {
  1254. type = "fixed",
  1255. fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -5 / 16, 6 / 16},
  1256. },
  1257. on_place = function(itemstack, placer, pointed_thing)
  1258. -- place a random grass node
  1259. local stack = ItemStack("default:grass_" .. math.random(1,5))
  1260. local ret = minetest.item_place(stack, placer, pointed_thing)
  1261. return ItemStack("default:grass_1 " ..
  1262. itemstack:get_count() - (1 - ret:get_count()))
  1263. end,
  1264. })
  1265. for i = 2, 5 do
  1266. minetest.register_node("default:grass_" .. i, {
  1267. description = "Grass",
  1268. drawtype = "plantlike",
  1269. waving = 1,
  1270. tiles = {"default_grass_" .. i .. ".png"},
  1271. inventory_image = "default_grass_" .. i .. ".png",
  1272. wield_image = "default_grass_" .. i .. ".png",
  1273. paramtype = "light",
  1274. sunlight_propagates = true,
  1275. walkable = false,
  1276. buildable_to = true,
  1277. drop = "default:grass_1",
  1278. groups = {snappy = 3, flora = 1, attached_node = 1,
  1279. not_in_creative_inventory = 1, grass = 1, flammable = 1},
  1280. sounds = default.node_sound_leaves_defaults(),
  1281. selection_box = {
  1282. type = "fixed",
  1283. fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16},
  1284. },
  1285. })
  1286. end
  1287. minetest.register_node("default:dry_grass_1", {
  1288. description = "Dry Grass",
  1289. drawtype = "plantlike",
  1290. waving = 1,
  1291. tiles = {"default_dry_grass_1.png"},
  1292. inventory_image = "default_dry_grass_3.png",
  1293. wield_image = "default_dry_grass_3.png",
  1294. paramtype = "light",
  1295. sunlight_propagates = true,
  1296. walkable = false,
  1297. buildable_to = true,
  1298. groups = {snappy = 3, flammable = 3, flora = 1,
  1299. attached_node = 1, dry_grass = 1},
  1300. sounds = default.node_sound_leaves_defaults(),
  1301. selection_box = {
  1302. type = "fixed",
  1303. fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -3 / 16, 6 / 16},
  1304. },
  1305. on_place = function(itemstack, placer, pointed_thing)
  1306. -- place a random dry grass node
  1307. local stack = ItemStack("default:dry_grass_" .. math.random(1, 5))
  1308. local ret = minetest.item_place(stack, placer, pointed_thing)
  1309. return ItemStack("default:dry_grass_1 " ..
  1310. itemstack:get_count() - (1 - ret:get_count()))
  1311. end,
  1312. })
  1313. for i = 2, 5 do
  1314. minetest.register_node("default:dry_grass_" .. i, {
  1315. description = "Dry Grass",
  1316. drawtype = "plantlike",
  1317. waving = 1,
  1318. tiles = {"default_dry_grass_" .. i .. ".png"},
  1319. inventory_image = "default_dry_grass_" .. i .. ".png",
  1320. wield_image = "default_dry_grass_" .. i .. ".png",
  1321. paramtype = "light",
  1322. sunlight_propagates = true,
  1323. walkable = false,
  1324. buildable_to = true,
  1325. groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1,
  1326. not_in_creative_inventory=1, dry_grass = 1},
  1327. drop = "default:dry_grass_1",
  1328. sounds = default.node_sound_leaves_defaults(),
  1329. selection_box = {
  1330. type = "fixed",
  1331. fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -1 / 16, 6 / 16},
  1332. },
  1333. })
  1334. end
  1335. minetest.register_node("default:fern_1", {
  1336. description = "Fern",
  1337. drawtype = "plantlike",
  1338. waving = 1,
  1339. tiles = {"default_fern_1.png"},
  1340. inventory_image = "default_fern_1.png",
  1341. wield_image = "default_fern_1.png",
  1342. paramtype = "light",
  1343. sunlight_propagates = true,
  1344. walkable = false,
  1345. buildable_to = true,
  1346. groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1},
  1347. sounds = default.node_sound_leaves_defaults(),
  1348. selection_box = {
  1349. type = "fixed",
  1350. fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
  1351. },
  1352. on_place = function(itemstack, placer, pointed_thing)
  1353. -- place a random fern node
  1354. local stack = ItemStack("default:fern_" .. math.random(1, 3))
  1355. local ret = minetest.item_place(stack, placer, pointed_thing)
  1356. return ItemStack("default:fern_1 " ..
  1357. itemstack:get_count() - (1 - ret:get_count()))
  1358. end,
  1359. })
  1360. for i = 2, 3 do
  1361. minetest.register_node("default:fern_" .. i, {
  1362. description = "Fern",
  1363. drawtype = "plantlike",
  1364. waving = 1,
  1365. visual_scale = 2,
  1366. tiles = {"default_fern_" .. i .. ".png"},
  1367. inventory_image = "default_fern_" .. i .. ".png",
  1368. wield_image = "default_fern_" .. i .. ".png",
  1369. paramtype = "light",
  1370. sunlight_propagates = true,
  1371. walkable = false,
  1372. buildable_to = true,
  1373. groups = {snappy = 3, flammable = 3, flora = 1, attached_node = 1,
  1374. not_in_creative_inventory=1},
  1375. drop = "default:fern_1",
  1376. sounds = default.node_sound_leaves_defaults(),
  1377. selection_box = {
  1378. type = "fixed",
  1379. fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
  1380. },
  1381. })
  1382. end
  1383. minetest.register_node("default:marram_grass_1", {
  1384. description = "Marram Grass",
  1385. drawtype = "plantlike",
  1386. waving = 1,
  1387. tiles = {"default_marram_grass_1.png"},
  1388. inventory_image = "default_marram_grass_1.png",
  1389. wield_image = "default_marram_grass_1.png",
  1390. paramtype = "light",
  1391. sunlight_propagates = true,
  1392. walkable = false,
  1393. buildable_to = true,
  1394. groups = {snappy = 3, flammable = 3, attached_node = 1},
  1395. sounds = default.node_sound_leaves_defaults(),
  1396. selection_box = {
  1397. type = "fixed",
  1398. fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
  1399. },
  1400. on_place = function(itemstack, placer, pointed_thing)
  1401. -- place a random marram grass node
  1402. local stack = ItemStack("default:marram_grass_" .. math.random(1, 3))
  1403. local ret = minetest.item_place(stack, placer, pointed_thing)
  1404. return ItemStack("default:marram_grass_1 " ..
  1405. itemstack:get_count() - (1 - ret:get_count()))
  1406. end,
  1407. })
  1408. for i = 2, 3 do
  1409. minetest.register_node("default:marram_grass_" .. i, {
  1410. description = "Marram Grass",
  1411. drawtype = "plantlike",
  1412. waving = 1,
  1413. tiles = {"default_marram_grass_" .. i .. ".png"},
  1414. inventory_image = "default_marram_grass_" .. i .. ".png",
  1415. wield_image = "default_marram_grass_" .. i .. ".png",
  1416. paramtype = "light",
  1417. sunlight_propagates = true,
  1418. walkable = false,
  1419. buildable_to = true,
  1420. groups = {snappy = 3, flammable = 3, attached_node = 1,
  1421. not_in_creative_inventory=1},
  1422. drop = "default:marram_grass_1",
  1423. sounds = default.node_sound_leaves_defaults(),
  1424. selection_box = {
  1425. type = "fixed",
  1426. fixed = {-6 / 16, -0.5, -6 / 16, 6 / 16, -0.25, 6 / 16},
  1427. },
  1428. })
  1429. end
  1430. minetest.register_node("default:bush_stem", {
  1431. description = "Bush Stem",
  1432. drawtype = "plantlike",
  1433. visual_scale = 1.41,
  1434. tiles = {"default_bush_stem.png"},
  1435. inventory_image = "default_bush_stem.png",
  1436. wield_image = "default_bush_stem.png",
  1437. paramtype = "light",
  1438. sunlight_propagates = true,
  1439. groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
  1440. sounds = default.node_sound_wood_defaults(),
  1441. selection_box = {
  1442. type = "fixed",
  1443. fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16},
  1444. },
  1445. })
  1446. minetest.register_node("default:bush_leaves", {
  1447. description = "Bush Leaves",
  1448. drawtype = "allfaces_optional",
  1449. waving = 1,
  1450. tiles = {"default_leaves_simple.png"},
  1451. paramtype = "light",
  1452. groups = {snappy = 3, flammable = 2, leaves = 1},
  1453. drop = {
  1454. max_items = 1,
  1455. items = {
  1456. {items = {"default:bush_sapling"}, rarity = 5},
  1457. {items = {"default:bush_leaves"}}
  1458. }
  1459. },
  1460. sounds = default.node_sound_leaves_defaults(),
  1461. after_place_node = after_place_leaves,
  1462. })
  1463. minetest.register_node("default:bush_sapling", {
  1464. description = "Bush Sapling",
  1465. drawtype = "plantlike",
  1466. tiles = {"default_bush_sapling.png"},
  1467. inventory_image = "default_bush_sapling.png",
  1468. wield_image = "default_bush_sapling.png",
  1469. paramtype = "light",
  1470. sunlight_propagates = true,
  1471. walkable = false,
  1472. on_timer = grow_sapling,
  1473. selection_box = {
  1474. type = "fixed",
  1475. fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16}
  1476. },
  1477. groups = {snappy = 2, dig_immediate = 3, flammable = 2,
  1478. attached_node = 1, sapling = 1},
  1479. sounds = default.node_sound_leaves_defaults(),
  1480. on_construct = function(pos)
  1481. minetest.get_node_timer(pos):start(math.random(300, 1500))
  1482. end,
  1483. on_place = function(itemstack, placer, pointed_thing)
  1484. itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
  1485. "default:bush_sapling",
  1486. -- minp, maxp to be checked, relative to sapling pos
  1487. {x = -1, y = 0, z = -1},
  1488. {x = 1, y = 1, z = 1},
  1489. -- maximum interval of interior volume check
  1490. 2)
  1491. return itemstack
  1492. end,
  1493. })
  1494. minetest.register_node("default:blueberry_bush_leaves_with_berries", {
  1495. description = "Blueberry Bush Leaves with Berries",
  1496. drawtype = "allfaces_optional",
  1497. waving = 1,
  1498. tiles = {"default_blueberry_bush_leaves.png^default_blueberry_overlay.png"},
  1499. paramtype = "light",
  1500. groups = {snappy = 3, flammable = 2, leaves = 1, dig_immediate = 3},
  1501. drop = "default:blueberries",
  1502. sounds = default.node_sound_leaves_defaults(),
  1503. node_dig_prediction = "default:blueberry_bush_leaves",
  1504. after_dig_node = function(pos, oldnode, oldmetadata, digger)
  1505. minetest.set_node(pos, {name = "default:blueberry_bush_leaves"})
  1506. minetest.get_node_timer(pos):start(math.random(300, 1500))
  1507. end,
  1508. })
  1509. minetest.register_node("default:blueberry_bush_leaves", {
  1510. description = "Blueberry Bush Leaves",
  1511. drawtype = "allfaces_optional",
  1512. waving = 1,
  1513. tiles = {"default_blueberry_bush_leaves.png"},
  1514. paramtype = "light",
  1515. groups = {snappy = 3, flammable = 2, leaves = 1},
  1516. drop = {
  1517. max_items = 1,
  1518. items = {
  1519. {items = {"default:blueberry_bush_sapling"}, rarity = 5},
  1520. {items = {"default:blueberry_bush_leaves"}}
  1521. }
  1522. },
  1523. sounds = default.node_sound_leaves_defaults(),
  1524. on_timer = function(pos, elapsed)
  1525. if minetest.get_node_light(pos) < 11 then
  1526. minetest.get_node_timer(pos):start(200)
  1527. else
  1528. minetest.set_node(pos, {name = "default:blueberry_bush_leaves_with_berries"})
  1529. end
  1530. end,
  1531. after_place_node = after_place_leaves,
  1532. })
  1533. minetest.register_node("default:blueberry_bush_sapling", {
  1534. description = "Blueberry Bush Sapling",
  1535. drawtype = "plantlike",
  1536. tiles = {"default_blueberry_bush_sapling.png"},
  1537. inventory_image = "default_blueberry_bush_sapling.png",
  1538. wield_image = "default_blueberry_bush_sapling.png",
  1539. paramtype = "light",
  1540. sunlight_propagates = true,
  1541. walkable = false,
  1542. on_timer = grow_sapling,
  1543. selection_box = {
  1544. type = "fixed",
  1545. fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16}
  1546. },
  1547. groups = {snappy = 2, dig_immediate = 3, flammable = 2,
  1548. attached_node = 1, sapling = 1},
  1549. sounds = default.node_sound_leaves_defaults(),
  1550. on_construct = function(pos)
  1551. minetest.get_node_timer(pos):start(math.random(300, 1500))
  1552. end,
  1553. on_place = function(itemstack, placer, pointed_thing)
  1554. itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
  1555. "default:blueberry_bush_sapling",
  1556. -- minp, maxp to be checked, relative to sapling pos
  1557. {x = -1, y = 0, z = -1},
  1558. {x = 1, y = 1, z = 1},
  1559. -- maximum interval of interior volume check
  1560. 2)
  1561. return itemstack
  1562. end,
  1563. })
  1564. minetest.register_node("default:acacia_bush_stem", {
  1565. description = "Acacia Bush Stem",
  1566. drawtype = "plantlike",
  1567. visual_scale = 1.41,
  1568. tiles = {"default_acacia_bush_stem.png"},
  1569. inventory_image = "default_acacia_bush_stem.png",
  1570. wield_image = "default_acacia_bush_stem.png",
  1571. paramtype = "light",
  1572. sunlight_propagates = true,
  1573. groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
  1574. sounds = default.node_sound_wood_defaults(),
  1575. selection_box = {
  1576. type = "fixed",
  1577. fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16},
  1578. },
  1579. })
  1580. minetest.register_node("default:acacia_bush_leaves", {
  1581. description = "Acacia Bush Leaves",
  1582. drawtype = "allfaces_optional",
  1583. waving = 1,
  1584. tiles = {"default_acacia_leaves_simple.png"},
  1585. paramtype = "light",
  1586. groups = {snappy = 3, flammable = 2, leaves = 1},
  1587. drop = {
  1588. max_items = 1,
  1589. items = {
  1590. {items = {"default:acacia_bush_sapling"}, rarity = 5},
  1591. {items = {"default:acacia_bush_leaves"}}
  1592. }
  1593. },
  1594. sounds = default.node_sound_leaves_defaults(),
  1595. after_place_node = after_place_leaves,
  1596. })
  1597. minetest.register_node("default:acacia_bush_sapling", {
  1598. description = "Acacia Bush Sapling",
  1599. drawtype = "plantlike",
  1600. tiles = {"default_acacia_bush_sapling.png"},
  1601. inventory_image = "default_acacia_bush_sapling.png",
  1602. wield_image = "default_acacia_bush_sapling.png",
  1603. paramtype = "light",
  1604. sunlight_propagates = true,
  1605. walkable = false,
  1606. on_timer = grow_sapling,
  1607. selection_box = {
  1608. type = "fixed",
  1609. fixed = {-3 / 16, -0.5, -3 / 16, 3 / 16, 2 / 16, 3 / 16}
  1610. },
  1611. groups = {snappy = 2, dig_immediate = 3, flammable = 2,
  1612. attached_node = 1, sapling = 1},
  1613. sounds = default.node_sound_leaves_defaults(),
  1614. on_construct = function(pos)
  1615. minetest.get_node_timer(pos):start(math.random(300, 1500))
  1616. end,
  1617. on_place = function(itemstack, placer, pointed_thing)
  1618. itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
  1619. "default:acacia_bush_sapling",
  1620. -- minp, maxp to be checked, relative to sapling pos
  1621. {x = -1, y = 0, z = -1},
  1622. {x = 1, y = 1, z = 1},
  1623. -- maximum interval of interior volume check
  1624. 2)
  1625. return itemstack
  1626. end,
  1627. })
  1628. minetest.register_node("default:pine_bush_stem", {
  1629. description = "Pine Bush Stem",
  1630. drawtype = "plantlike",
  1631. visual_scale = 1.41,
  1632. tiles = {"default_pine_bush_stem.png"},
  1633. inventory_image = "default_pine_bush_stem.png",
  1634. wield_image = "default_pine_bush_stem.png",
  1635. paramtype = "light",
  1636. sunlight_propagates = true,
  1637. groups = {choppy = 2, oddly_breakable_by_hand = 1, flammable = 2},
  1638. sounds = default.node_sound_wood_defaults(),
  1639. selection_box = {
  1640. type = "fixed",
  1641. fixed = {-7 / 16, -0.5, -7 / 16, 7 / 16, 0.5, 7 / 16},
  1642. },
  1643. })
  1644. minetest.register_node("default:pine_bush_needles", {
  1645. description = "Pine Bush Needles",
  1646. drawtype = "allfaces_optional",
  1647. waving = 1,
  1648. tiles = {"default_pine_needles.png"},
  1649. paramtype = "light",
  1650. groups = {snappy = 3, flammable = 2, leaves = 1},
  1651. drop = {
  1652. max_items = 1,
  1653. items = {
  1654. {items = {"default:pine_bush_sapling"}, rarity = 5},
  1655. {items = {"default:pine_bush_needles"}}
  1656. }
  1657. },
  1658. sounds = default.node_sound_leaves_defaults(),
  1659. after_place_node = after_place_leaves,
  1660. })
  1661. minetest.register_node("default:pine_bush_sapling", {
  1662. description = "Pine Bush Sapling",
  1663. drawtype = "plantlike",
  1664. tiles = {"default_pine_bush_sapling.png"},
  1665. inventory_image = "default_pine_bush_sapling.png",
  1666. wield_image = "default_pine_bush_sapling.png",
  1667. paramtype = "light",
  1668. sunlight_propagates = true,
  1669. walkable = false,
  1670. on_timer = grow_sapling,
  1671. selection_box = {
  1672. type = "fixed",
  1673. fixed = {-4 / 16, -0.5, -4 / 16, 4 / 16, 2 / 16, 4 / 16}
  1674. },
  1675. groups = {snappy = 2, dig_immediate = 3, flammable = 2,
  1676. attached_node = 1, sapling = 1},
  1677. sounds = default.node_sound_leaves_defaults(),
  1678. on_construct = function(pos)
  1679. minetest.get_node_timer(pos):start(math.random(300, 1500))
  1680. end,
  1681. on_place = function(itemstack, placer, pointed_thing)
  1682. itemstack = default.sapling_on_place(itemstack, placer, pointed_thing,
  1683. "default:pine_bush_sapling",
  1684. -- minp, maxp to be checked, relative to sapling pos
  1685. {x = -1, y = 0, z = -1},
  1686. {x = 1, y = 1, z = 1},
  1687. -- maximum interval of interior volume check
  1688. 2)
  1689. return itemstack
  1690. end,
  1691. })
  1692. minetest.register_node("default:sand_with_kelp", {
  1693. description = "Kelp",
  1694. drawtype = "plantlike_rooted",
  1695. waving = 1,
  1696. tiles = {"default_sand.png"},
  1697. special_tiles = {{name = "default_kelp.png", tileable_vertical = true}},
  1698. inventory_image = "default_kelp.png",
  1699. paramtype = "light",
  1700. paramtype2 = "leveled",
  1701. groups = {snappy = 3},
  1702. selection_box = {
  1703. type = "fixed",
  1704. fixed = {
  1705. {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
  1706. {-2/16, 0.5, -2/16, 2/16, 3.5, 2/16},
  1707. },
  1708. },
  1709. node_dig_prediction = "default:sand",
  1710. node_placement_prediction = "",
  1711. sounds = default.node_sound_sand_defaults({
  1712. dig = {name = "default_dig_snappy", gain = 0.2},
  1713. dug = {name = "default_grass_footstep", gain = 0.25},
  1714. }),
  1715. on_place = function(itemstack, placer, pointed_thing)
  1716. -- Call on_rightclick if the pointed node defines it
  1717. if pointed_thing.type == "node" and placer and
  1718. not placer:get_player_control().sneak then
  1719. local node_ptu = minetest.get_node(pointed_thing.under)
  1720. local def_ptu = minetest.registered_nodes[node_ptu.name]
  1721. if def_ptu and def_ptu.on_rightclick then
  1722. return def_ptu.on_rightclick(pointed_thing.under, node_ptu, placer,
  1723. itemstack, pointed_thing)
  1724. end
  1725. end
  1726. local pos = pointed_thing.under
  1727. if minetest.get_node(pos).name ~= "default:sand" then
  1728. return itemstack
  1729. end
  1730. local height = math.random(4, 6)
  1731. local pos_top = {x = pos.x, y = pos.y + height, z = pos.z}
  1732. local node_top = minetest.get_node(pos_top)
  1733. local def_top = minetest.registered_nodes[node_top.name]
  1734. local player_name = placer:get_player_name()
  1735. if def_top and def_top.liquidtype == "source" and
  1736. minetest.get_item_group(node_top.name, "water") > 0 then
  1737. if not minetest.is_protected(pos, player_name) and
  1738. not minetest.is_protected(pos_top, player_name) then
  1739. minetest.set_node(pos, {name = "default:sand_with_kelp",
  1740. param2 = height * 16})
  1741. if not (creative and creative.is_enabled_for
  1742. and creative.is_enabled_for(player_name)) then
  1743. itemstack:take_item()
  1744. end
  1745. else
  1746. minetest.chat_send_player(player_name, "Node is protected")
  1747. minetest.record_protection_violation(pos, player_name)
  1748. end
  1749. end
  1750. return itemstack
  1751. end,
  1752. after_destruct = function(pos, oldnode)
  1753. minetest.set_node(pos, {name = "default:sand"})
  1754. end
  1755. })
  1756. --
  1757. -- Corals
  1758. --
  1759. local function coral_on_place(itemstack, placer, pointed_thing)
  1760. if pointed_thing.type ~= "node" or not placer then
  1761. return itemstack
  1762. end
  1763. local player_name = placer:get_player_name()
  1764. local pos_under = pointed_thing.under
  1765. local pos_above = pointed_thing.above
  1766. local node_under = minetest.get_node(pos_under)
  1767. local def_under = minetest.registered_nodes[node_under.name]
  1768. if def_under and def_under.on_rightclick and not placer:get_player_control().sneak then
  1769. return def_under.on_rightclick(pos_under, node_under.name,
  1770. placer, itemstack, pointed_thing) or itemstack
  1771. end
  1772. if node_under.name ~= "default:coral_skeleton" or
  1773. minetest.get_node(pos_above).name ~= "default:water_source" then
  1774. return itemstack
  1775. end
  1776. if minetest.is_protected(pos_under, player_name) or
  1777. minetest.is_protected(pos_above, player_name) then
  1778. minetest.log("action", player_name
  1779. .. " tried to place " .. itemstack:get_name()
  1780. .. " at protected position "
  1781. .. minetest.pos_to_string(pos_under))
  1782. minetest.record_protection_violation(pos_under, player_name)
  1783. return itemstack
  1784. end
  1785. node_under.name = itemstack:get_name()
  1786. minetest.set_node(pos_under, node_under)
  1787. if not (creative and creative.is_enabled_for(player_name)) then
  1788. itemstack:take_item()
  1789. end
  1790. return itemstack
  1791. end
  1792. minetest.register_node("default:coral_green", {
  1793. description = "Green Coral",
  1794. drawtype = "plantlike_rooted",
  1795. waving = 1,
  1796. paramtype = "light",
  1797. tiles = {"default_coral_skeleton.png"},
  1798. special_tiles = {{name = "default_coral_green.png", tileable_vertical = true}},
  1799. inventory_image = "default_coral_green.png",
  1800. groups = {snappy = 3},
  1801. selection_box = {
  1802. type = "fixed",
  1803. fixed = {
  1804. {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
  1805. {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16},
  1806. },
  1807. },
  1808. node_dig_prediction = "default:coral_skeleton",
  1809. node_placement_prediction = "",
  1810. sounds = default.node_sound_stone_defaults({
  1811. dig = {name = "default_dig_snappy", gain = 0.2},
  1812. dug = {name = "default_grass_footstep", gain = 0.25},
  1813. }),
  1814. on_place = coral_on_place,
  1815. after_destruct = function(pos, oldnode)
  1816. minetest.set_node(pos, {name = "default:coral_skeleton"})
  1817. end,
  1818. })
  1819. minetest.register_node("default:coral_pink", {
  1820. description = "Pink Coral",
  1821. drawtype = "plantlike_rooted",
  1822. waving = 1,
  1823. paramtype = "light",
  1824. tiles = {"default_coral_skeleton.png"},
  1825. special_tiles = {{name = "default_coral_pink.png", tileable_vertical = true}},
  1826. inventory_image = "default_coral_pink.png",
  1827. groups = {snappy = 3},
  1828. selection_box = {
  1829. type = "fixed",
  1830. fixed = {
  1831. {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
  1832. {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16},
  1833. },
  1834. },
  1835. node_dig_prediction = "default:coral_skeleton",
  1836. node_placement_prediction = "",
  1837. sounds = default.node_sound_stone_defaults({
  1838. dig = {name = "default_dig_snappy", gain = 0.2},
  1839. dug = {name = "default_grass_footstep", gain = 0.25},
  1840. }),
  1841. on_place = coral_on_place,
  1842. after_destruct = function(pos, oldnode)
  1843. minetest.set_node(pos, {name = "default:coral_skeleton"})
  1844. end,
  1845. })
  1846. minetest.register_node("default:coral_cyan", {
  1847. description = "Cyan Coral",
  1848. drawtype = "plantlike_rooted",
  1849. waving = 1,
  1850. paramtype = "light",
  1851. tiles = {"default_coral_skeleton.png"},
  1852. special_tiles = {{name = "default_coral_cyan.png", tileable_vertical = true}},
  1853. inventory_image = "default_coral_cyan.png",
  1854. groups = {snappy = 3},
  1855. selection_box = {
  1856. type = "fixed",
  1857. fixed = {
  1858. {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5},
  1859. {-4/16, 0.5, -4/16, 4/16, 1.5, 4/16},
  1860. },
  1861. },
  1862. node_dig_prediction = "default:coral_skeleton",
  1863. node_placement_prediction = "",
  1864. sounds = default.node_sound_stone_defaults({
  1865. dig = {name = "default_dig_snappy", gain = 0.2},
  1866. dug = {name = "default_grass_footstep", gain = 0.25},
  1867. }),
  1868. on_place = coral_on_place,
  1869. after_destruct = function(pos, oldnode)
  1870. minetest.set_node(pos, {name = "default:coral_skeleton"})
  1871. end,
  1872. })
  1873. minetest.register_node("default:coral_brown", {
  1874. description = "Brown Coral",
  1875. tiles = {"default_coral_brown.png"},
  1876. groups = {cracky = 3},
  1877. drop = "default:coral_skeleton",
  1878. sounds = default.node_sound_stone_defaults(),
  1879. })
  1880. minetest.register_node("default:coral_orange", {
  1881. description = "Orange Coral",
  1882. tiles = {"default_coral_orange.png"},
  1883. groups = {cracky = 3},
  1884. drop = "default:coral_skeleton",
  1885. sounds = default.node_sound_stone_defaults(),
  1886. })
  1887. minetest.register_node("default:coral_skeleton", {
  1888. description = "Coral Skeleton",
  1889. tiles = {"default_coral_skeleton.png"},
  1890. groups = {cracky = 3},
  1891. sounds = default.node_sound_stone_defaults(),
  1892. })
  1893. --
  1894. -- Liquids
  1895. --
  1896. minetest.register_node("default:water_source", {
  1897. description = "Water Source",
  1898. drawtype = "liquid",
  1899. waving = 3,
  1900. tiles = {
  1901. {
  1902. name = "default_water_source_animated.png",
  1903. backface_culling = false,
  1904. animation = {
  1905. type = "vertical_frames",
  1906. aspect_w = 16,
  1907. aspect_h = 16,
  1908. length = 2.0,
  1909. },
  1910. },
  1911. {
  1912. name = "default_water_source_animated.png",
  1913. backface_culling = true,
  1914. animation = {
  1915. type = "vertical_frames",
  1916. aspect_w = 16,
  1917. aspect_h = 16,
  1918. length = 2.0,
  1919. },
  1920. },
  1921. },
  1922. alpha = 160,
  1923. paramtype = "light",
  1924. walkable = false,
  1925. pointable = false,
  1926. diggable = false,
  1927. buildable_to = true,
  1928. is_ground_content = false,
  1929. drop = "",
  1930. drowning = 1,
  1931. liquidtype = "source",
  1932. liquid_alternative_flowing = "default:water_flowing",
  1933. liquid_alternative_source = "default:water_source",
  1934. liquid_viscosity = 1,
  1935. post_effect_color = {a = 103, r = 30, g = 60, b = 90},
  1936. groups = {water = 3, liquid = 3, cools_lava = 1},
  1937. sounds = default.node_sound_water_defaults(),
  1938. })
  1939. minetest.register_node("default:water_flowing", {
  1940. description = "Flowing Water",
  1941. drawtype = "flowingliquid",
  1942. waving = 3,
  1943. tiles = {"default_water.png"},
  1944. special_tiles = {
  1945. {
  1946. name = "default_water_flowing_animated.png",
  1947. backface_culling = false,
  1948. animation = {
  1949. type = "vertical_frames",
  1950. aspect_w = 16,
  1951. aspect_h = 16,
  1952. length = 0.8,
  1953. },
  1954. },
  1955. {
  1956. name = "default_water_flowing_animated.png",
  1957. backface_culling = true,
  1958. animation = {
  1959. type = "vertical_frames",
  1960. aspect_w = 16,
  1961. aspect_h = 16,
  1962. length = 0.8,
  1963. },
  1964. },
  1965. },
  1966. alpha = 160,
  1967. paramtype = "light",
  1968. paramtype2 = "flowingliquid",
  1969. walkable = false,
  1970. pointable = false,
  1971. diggable = false,
  1972. buildable_to = true,
  1973. is_ground_content = false,
  1974. drop = "",
  1975. drowning = 1,
  1976. liquidtype = "flowing",
  1977. liquid_alternative_flowing = "default:water_flowing",
  1978. liquid_alternative_source = "default:water_source",
  1979. liquid_viscosity = 1,
  1980. post_effect_color = {a = 103, r = 30, g = 60, b = 90},
  1981. groups = {water = 3, liquid = 3, not_in_creative_inventory = 1,
  1982. cools_lava = 1},
  1983. sounds = default.node_sound_water_defaults(),
  1984. })
  1985. minetest.register_node("default:river_water_source", {
  1986. description = "River Water Source",
  1987. drawtype = "liquid",
  1988. tiles = {
  1989. {
  1990. name = "default_river_water_source_animated.png",
  1991. backface_culling = false,
  1992. animation = {
  1993. type = "vertical_frames",
  1994. aspect_w = 16,
  1995. aspect_h = 16,
  1996. length = 2.0,
  1997. },
  1998. },
  1999. {
  2000. name = "default_river_water_source_animated.png",
  2001. backface_culling = true,
  2002. animation = {
  2003. type = "vertical_frames",
  2004. aspect_w = 16,
  2005. aspect_h = 16,
  2006. length = 2.0,
  2007. },
  2008. },
  2009. },
  2010. alpha = 160,
  2011. paramtype = "light",
  2012. walkable = false,
  2013. pointable = false,
  2014. diggable = false,
  2015. buildable_to = true,
  2016. is_ground_content = false,
  2017. drop = "",
  2018. drowning = 1,
  2019. liquidtype = "source",
  2020. liquid_alternative_flowing = "default:river_water_flowing",
  2021. liquid_alternative_source = "default:river_water_source",
  2022. liquid_viscosity = 1,
  2023. -- Not renewable to avoid horizontal spread of water sources in sloping
  2024. -- rivers that can cause water to overflow riverbanks and cause floods.
  2025. -- River water source is instead made renewable by the 'force renew'
  2026. -- option used in the 'bucket' mod by the river water bucket.
  2027. liquid_renewable = false,
  2028. liquid_range = 2,
  2029. post_effect_color = {a = 103, r = 30, g = 76, b = 90},
  2030. groups = {water = 3, liquid = 3, cools_lava = 1},
  2031. sounds = default.node_sound_water_defaults(),
  2032. })
  2033. minetest.register_node("default:river_water_flowing", {
  2034. description = "Flowing River Water",
  2035. drawtype = "flowingliquid",
  2036. tiles = {"default_river_water.png"},
  2037. special_tiles = {
  2038. {
  2039. name = "default_river_water_flowing_animated.png",
  2040. backface_culling = false,
  2041. animation = {
  2042. type = "vertical_frames",
  2043. aspect_w = 16,
  2044. aspect_h = 16,
  2045. length = 0.8,
  2046. },
  2047. },
  2048. {
  2049. name = "default_river_water_flowing_animated.png",
  2050. backface_culling = true,
  2051. animation = {
  2052. type = "vertical_frames",
  2053. aspect_w = 16,
  2054. aspect_h = 16,
  2055. length = 0.8,
  2056. },
  2057. },
  2058. },
  2059. alpha = 160,
  2060. paramtype = "light",
  2061. paramtype2 = "flowingliquid",
  2062. walkable = false,
  2063. pointable = false,
  2064. diggable = false,
  2065. buildable_to = true,
  2066. is_ground_content = false,
  2067. drop = "",
  2068. drowning = 1,
  2069. liquidtype = "flowing",
  2070. liquid_alternative_flowing = "default:river_water_flowing",
  2071. liquid_alternative_source = "default:river_water_source",
  2072. liquid_viscosity = 1,
  2073. liquid_renewable = false,
  2074. liquid_range = 2,
  2075. post_effect_color = {a = 103, r = 30, g = 76, b = 90},
  2076. groups = {water = 3, liquid = 3, not_in_creative_inventory = 1,
  2077. cools_lava = 1},
  2078. sounds = default.node_sound_water_defaults(),
  2079. })
  2080. minetest.register_node("default:lava_source", {
  2081. description = "Lava Source",
  2082. drawtype = "liquid",
  2083. tiles = {
  2084. {
  2085. name = "default_lava_source_animated.png",
  2086. backface_culling = false,
  2087. animation = {
  2088. type = "vertical_frames",
  2089. aspect_w = 16,
  2090. aspect_h = 16,
  2091. length = 3.0,
  2092. },
  2093. },
  2094. {
  2095. name = "default_lava_source_animated.png",
  2096. backface_culling = true,
  2097. animation = {
  2098. type = "vertical_frames",
  2099. aspect_w = 16,
  2100. aspect_h = 16,
  2101. length = 3.0,
  2102. },
  2103. },
  2104. },
  2105. paramtype = "light",
  2106. light_source = default.LIGHT_MAX - 1,
  2107. walkable = false,
  2108. pointable = false,
  2109. diggable = false,
  2110. buildable_to = true,
  2111. is_ground_content = false,
  2112. drop = "",
  2113. drowning = 1,
  2114. liquidtype = "source",
  2115. liquid_alternative_flowing = "default:lava_flowing",
  2116. liquid_alternative_source = "default:lava_source",
  2117. liquid_viscosity = 7,
  2118. liquid_renewable = false,
  2119. damage_per_second = 4 * 2,
  2120. post_effect_color = {a = 191, r = 255, g = 64, b = 0},
  2121. groups = {lava = 3, liquid = 2, igniter = 1},
  2122. })
  2123. minetest.register_node("default:lava_flowing", {
  2124. description = "Flowing Lava",
  2125. drawtype = "flowingliquid",
  2126. tiles = {"default_lava.png"},
  2127. special_tiles = {
  2128. {
  2129. name = "default_lava_flowing_animated.png",
  2130. backface_culling = false,
  2131. animation = {
  2132. type = "vertical_frames",
  2133. aspect_w = 16,
  2134. aspect_h = 16,
  2135. length = 3.3,
  2136. },
  2137. },
  2138. {
  2139. name = "default_lava_flowing_animated.png",
  2140. backface_culling = true,
  2141. animation = {
  2142. type = "vertical_frames",
  2143. aspect_w = 16,
  2144. aspect_h = 16,
  2145. length = 3.3,
  2146. },
  2147. },
  2148. },
  2149. paramtype = "light",
  2150. paramtype2 = "flowingliquid",
  2151. light_source = default.LIGHT_MAX - 1,
  2152. walkable = false,
  2153. pointable = false,
  2154. diggable = false,
  2155. buildable_to = true,
  2156. is_ground_content = false,
  2157. drop = "",
  2158. drowning = 1,
  2159. liquidtype = "flowing",
  2160. liquid_alternative_flowing = "default:lava_flowing",
  2161. liquid_alternative_source = "default:lava_source",
  2162. liquid_viscosity = 7,
  2163. liquid_renewable = false,
  2164. damage_per_second = 4 * 2,
  2165. post_effect_color = {a = 191, r = 255, g = 64, b = 0},
  2166. groups = {lava = 3, liquid = 2, igniter = 1,
  2167. not_in_creative_inventory = 1},
  2168. })
  2169. --
  2170. -- Tools / "Advanced" crafting / Non-"natural"
  2171. --
  2172. local bookshelf_formspec =
  2173. "size[8,7;]" ..
  2174. "list[context;books;0,0.3;8,2;]" ..
  2175. "list[current_player;main;0,2.85;8,1;]" ..
  2176. "list[current_player;main;0,4.08;8,3;8]" ..
  2177. "listring[context;books]" ..
  2178. "listring[current_player;main]" ..
  2179. default.get_hotbar_bg(0,2.85)
  2180. local function update_bookshelf(pos)
  2181. local meta = minetest.get_meta(pos)
  2182. local inv = meta:get_inventory()
  2183. local invlist = inv:get_list("books")
  2184. local formspec = bookshelf_formspec
  2185. -- Inventory slots overlay
  2186. local bx, by = 0, 0.3
  2187. local n_written, n_empty = 0, 0
  2188. for i = 1, 16 do
  2189. if i == 9 then
  2190. bx = 0
  2191. by = by + 1
  2192. end
  2193. local stack = invlist[i]
  2194. if stack:is_empty() then
  2195. formspec = formspec ..
  2196. "image[" .. bx .. "," .. by .. ";1,1;default_bookshelf_slot.png]"
  2197. else
  2198. local metatable = stack:get_meta():to_table() or {}
  2199. if metatable.fields and metatable.fields.text then
  2200. n_written = n_written + stack:get_count()
  2201. else
  2202. n_empty = n_empty + stack:get_count()
  2203. end
  2204. end
  2205. bx = bx + 1
  2206. end
  2207. meta:set_string("formspec", formspec)
  2208. if n_written + n_empty == 0 then
  2209. meta:set_string("infotext", "Empty Bookshelf")
  2210. else
  2211. meta:set_string("infotext", "Bookshelf (" .. n_written ..
  2212. " written, " .. n_empty .. " empty books)")
  2213. end
  2214. end
  2215. minetest.register_node("default:bookshelf", {
  2216. description = "Bookshelf",
  2217. tiles = {"default_wood.png", "default_wood.png", "default_wood.png",
  2218. "default_wood.png", "default_bookshelf.png", "default_bookshelf.png"},
  2219. paramtype2 = "facedir",
  2220. is_ground_content = false,
  2221. groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
  2222. sounds = default.node_sound_wood_defaults(),
  2223. on_construct = function(pos)
  2224. local meta = minetest.get_meta(pos)
  2225. local inv = meta:get_inventory()
  2226. inv:set_size("books", 8 * 2)
  2227. update_bookshelf(pos)
  2228. end,
  2229. can_dig = function(pos,player)
  2230. local inv = minetest.get_meta(pos):get_inventory()
  2231. return inv:is_empty("books")
  2232. end,
  2233. allow_metadata_inventory_put = function(pos, listname, index, stack)
  2234. if minetest.get_item_group(stack:get_name(), "book") ~= 0 then
  2235. return stack:get_count()
  2236. end
  2237. return 0
  2238. end,
  2239. on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
  2240. minetest.log("action", player:get_player_name() ..
  2241. " moves stuff in bookshelf at " .. minetest.pos_to_string(pos))
  2242. update_bookshelf(pos)
  2243. end,
  2244. on_metadata_inventory_put = function(pos, listname, index, stack, player)
  2245. minetest.log("action", player:get_player_name() ..
  2246. " puts stuff to bookshelf at " .. minetest.pos_to_string(pos))
  2247. update_bookshelf(pos)
  2248. end,
  2249. on_metadata_inventory_take = function(pos, listname, index, stack, player)
  2250. minetest.log("action", player:get_player_name() ..
  2251. " takes stuff from bookshelf at " .. minetest.pos_to_string(pos))
  2252. update_bookshelf(pos)
  2253. end,
  2254. on_blast = function(pos)
  2255. local drops = {}
  2256. default.get_inventory_drops(pos, "books", drops)
  2257. drops[#drops+1] = "default:bookshelf"
  2258. minetest.remove_node(pos)
  2259. return drops
  2260. end,
  2261. })
  2262. local function register_sign(material, desc, def)
  2263. minetest.register_node("default:sign_wall_" .. material, {
  2264. description = desc .. " Sign",
  2265. drawtype = "nodebox",
  2266. tiles = {"default_sign_wall_" .. material .. ".png"},
  2267. inventory_image = "default_sign_" .. material .. ".png",
  2268. wield_image = "default_sign_" .. material .. ".png",
  2269. paramtype = "light",
  2270. paramtype2 = "wallmounted",
  2271. sunlight_propagates = true,
  2272. is_ground_content = false,
  2273. walkable = false,
  2274. node_box = {
  2275. type = "wallmounted",
  2276. wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125},
  2277. wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125},
  2278. wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375},
  2279. },
  2280. groups = def.groups,
  2281. legacy_wallmounted = true,
  2282. sounds = def.sounds,
  2283. on_construct = function(pos)
  2284. --local n = minetest.get_node(pos)
  2285. local meta = minetest.get_meta(pos)
  2286. meta:set_string("formspec", "field[text;;${text}]")
  2287. end,
  2288. on_receive_fields = function(pos, formname, fields, sender)
  2289. --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
  2290. local player_name = sender:get_player_name()
  2291. if minetest.is_protected(pos, player_name) then
  2292. minetest.record_protection_violation(pos, player_name)
  2293. return
  2294. end
  2295. local text = fields.text
  2296. if not text then
  2297. return
  2298. end
  2299. if string.len(text) > 512 then
  2300. minetest.chat_send_player(player_name, "Text too long")
  2301. return
  2302. end
  2303. minetest.log("action", (player_name or "") .. " wrote \"" ..
  2304. text .. "\" to sign at " .. minetest.pos_to_string(pos))
  2305. local meta = minetest.get_meta(pos)
  2306. meta:set_string("text", text)
  2307. meta:set_string("infotext", '"' .. text .. '"')
  2308. end,
  2309. })
  2310. end
  2311. register_sign("wood", "Wooden", {
  2312. sounds = default.node_sound_wood_defaults(),
  2313. groups = {choppy = 2, attached_node = 1, flammable = 2, oddly_breakable_by_hand = 3}
  2314. })
  2315. register_sign("steel", "Steel", {
  2316. sounds = default.node_sound_metal_defaults(),
  2317. groups = {cracky = 2, attached_node = 1}
  2318. })
  2319. minetest.register_node("default:ladder_wood", {
  2320. description = "Wooden Ladder",
  2321. drawtype = "signlike",
  2322. tiles = {"default_ladder_wood.png"},
  2323. inventory_image = "default_ladder_wood.png",
  2324. wield_image = "default_ladder_wood.png",
  2325. paramtype = "light",
  2326. paramtype2 = "wallmounted",
  2327. sunlight_propagates = true,
  2328. walkable = false,
  2329. climbable = true,
  2330. is_ground_content = false,
  2331. selection_box = {
  2332. type = "wallmounted",
  2333. --wall_top = = <default>
  2334. --wall_bottom = = <default>
  2335. --wall_side = = <default>
  2336. },
  2337. groups = {choppy = 2, oddly_breakable_by_hand = 3, flammable = 2},
  2338. legacy_wallmounted = true,
  2339. sounds = default.node_sound_wood_defaults(),
  2340. })
  2341. minetest.register_node("default:ladder_steel", {
  2342. description = "Steel Ladder",
  2343. drawtype = "signlike",
  2344. tiles = {"default_ladder_steel.png"},
  2345. inventory_image = "default_ladder_steel.png",
  2346. wield_image = "default_ladder_steel.png",
  2347. paramtype = "light",
  2348. paramtype2 = "wallmounted",
  2349. sunlight_propagates = true,
  2350. walkable = false,
  2351. climbable = true,
  2352. is_ground_content = false,
  2353. selection_box = {
  2354. type = "wallmounted",
  2355. --wall_top = = <default>
  2356. --wall_bottom = = <default>
  2357. --wall_side = = <default>
  2358. },
  2359. groups = {cracky = 2},
  2360. sounds = default.node_sound_metal_defaults(),
  2361. })
  2362. default.register_fence("default:fence_wood", {
  2363. description = "Apple Wood Fence",
  2364. texture = "default_fence_wood.png",
  2365. inventory_image = "default_fence_overlay.png^default_wood.png^" ..
  2366. "default_fence_overlay.png^[makealpha:255,126,126",
  2367. wield_image = "default_fence_overlay.png^default_wood.png^" ..
  2368. "default_fence_overlay.png^[makealpha:255,126,126",
  2369. material = "default:wood",
  2370. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
  2371. sounds = default.node_sound_wood_defaults()
  2372. })
  2373. default.register_fence("default:fence_acacia_wood", {
  2374. description = "Acacia Wood Fence",
  2375. texture = "default_fence_acacia_wood.png",
  2376. inventory_image = "default_fence_overlay.png^default_acacia_wood.png^" ..
  2377. "default_fence_overlay.png^[makealpha:255,126,126",
  2378. wield_image = "default_fence_overlay.png^default_acacia_wood.png^" ..
  2379. "default_fence_overlay.png^[makealpha:255,126,126",
  2380. material = "default:acacia_wood",
  2381. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
  2382. sounds = default.node_sound_wood_defaults()
  2383. })
  2384. default.register_fence("default:fence_junglewood", {
  2385. description = "Jungle Wood Fence",
  2386. texture = "default_fence_junglewood.png",
  2387. inventory_image = "default_fence_overlay.png^default_junglewood.png^" ..
  2388. "default_fence_overlay.png^[makealpha:255,126,126",
  2389. wield_image = "default_fence_overlay.png^default_junglewood.png^" ..
  2390. "default_fence_overlay.png^[makealpha:255,126,126",
  2391. material = "default:junglewood",
  2392. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
  2393. sounds = default.node_sound_wood_defaults()
  2394. })
  2395. default.register_fence("default:fence_pine_wood", {
  2396. description = "Pine Wood Fence",
  2397. texture = "default_fence_pine_wood.png",
  2398. inventory_image = "default_fence_overlay.png^default_pine_wood.png^" ..
  2399. "default_fence_overlay.png^[makealpha:255,126,126",
  2400. wield_image = "default_fence_overlay.png^default_pine_wood.png^" ..
  2401. "default_fence_overlay.png^[makealpha:255,126,126",
  2402. material = "default:pine_wood",
  2403. groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
  2404. sounds = default.node_sound_wood_defaults()
  2405. })
  2406. default.register_fence("default:fence_aspen_wood", {
  2407. description = "Aspen Wood Fence",
  2408. texture = "default_fence_aspen_wood.png",
  2409. inventory_image = "default_fence_overlay.png^default_aspen_wood.png^" ..
  2410. "default_fence_overlay.png^[makealpha:255,126,126",
  2411. wield_image = "default_fence_overlay.png^default_aspen_wood.png^" ..
  2412. "default_fence_overlay.png^[makealpha:255,126,126",
  2413. material = "default:aspen_wood",
  2414. groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
  2415. sounds = default.node_sound_wood_defaults()
  2416. })
  2417. default.register_fence_rail("default:fence_rail_wood", {
  2418. description = "Apple Wood Fence Rail",
  2419. texture = "default_fence_rail_wood.png",
  2420. inventory_image = "default_fence_rail_overlay.png^default_wood.png^" ..
  2421. "default_fence_rail_overlay.png^[makealpha:255,126,126",
  2422. wield_image = "default_fence_rail_overlay.png^default_wood.png^" ..
  2423. "default_fence_rail_overlay.png^[makealpha:255,126,126",
  2424. material = "default:wood",
  2425. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
  2426. sounds = default.node_sound_wood_defaults()
  2427. })
  2428. default.register_fence_rail("default:fence_rail_acacia_wood", {
  2429. description = "Acacia Wood Fence Rail",
  2430. texture = "default_fence_rail_acacia_wood.png",
  2431. inventory_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" ..
  2432. "default_fence_rail_overlay.png^[makealpha:255,126,126",
  2433. wield_image = "default_fence_rail_overlay.png^default_acacia_wood.png^" ..
  2434. "default_fence_rail_overlay.png^[makealpha:255,126,126",
  2435. material = "default:acacia_wood",
  2436. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
  2437. sounds = default.node_sound_wood_defaults()
  2438. })
  2439. default.register_fence_rail("default:fence_rail_junglewood", {
  2440. description = "Jungle Wood Fence Rail",
  2441. texture = "default_fence_rail_junglewood.png",
  2442. inventory_image = "default_fence_rail_overlay.png^default_junglewood.png^" ..
  2443. "default_fence_rail_overlay.png^[makealpha:255,126,126",
  2444. wield_image = "default_fence_rail_overlay.png^default_junglewood.png^" ..
  2445. "default_fence_rail_overlay.png^[makealpha:255,126,126",
  2446. material = "default:junglewood",
  2447. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
  2448. sounds = default.node_sound_wood_defaults()
  2449. })
  2450. default.register_fence_rail("default:fence_rail_pine_wood", {
  2451. description = "Pine Wood Fence Rail",
  2452. texture = "default_fence_rail_pine_wood.png",
  2453. inventory_image = "default_fence_rail_overlay.png^default_pine_wood.png^" ..
  2454. "default_fence_rail_overlay.png^[makealpha:255,126,126",
  2455. wield_image = "default_fence_rail_overlay.png^default_pine_wood.png^" ..
  2456. "default_fence_rail_overlay.png^[makealpha:255,126,126",
  2457. material = "default:pine_wood",
  2458. groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3},
  2459. sounds = default.node_sound_wood_defaults()
  2460. })
  2461. default.register_fence_rail("default:fence_rail_aspen_wood", {
  2462. description = "Aspen Wood Fence Rail",
  2463. texture = "default_fence_rail_aspen_wood.png",
  2464. inventory_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" ..
  2465. "default_fence_rail_overlay.png^[makealpha:255,126,126",
  2466. wield_image = "default_fence_rail_overlay.png^default_aspen_wood.png^" ..
  2467. "default_fence_rail_overlay.png^[makealpha:255,126,126",
  2468. material = "default:aspen_wood",
  2469. groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 2},
  2470. sounds = default.node_sound_wood_defaults()
  2471. })
  2472. minetest.register_node("default:glass", {
  2473. description = "Glass",
  2474. drawtype = "glasslike_framed_optional",
  2475. tiles = {"default_glass.png", "default_glass_detail.png"},
  2476. paramtype = "light",
  2477. paramtype2 = "glasslikeliquidlevel",
  2478. sunlight_propagates = true,
  2479. is_ground_content = false,
  2480. groups = {cracky = 3, oddly_breakable_by_hand = 3},
  2481. sounds = default.node_sound_glass_defaults(),
  2482. })
  2483. minetest.register_node("default:obsidian_glass", {
  2484. description = "Obsidian Glass",
  2485. drawtype = "glasslike_framed_optional",
  2486. tiles = {"default_obsidian_glass.png", "default_obsidian_glass_detail.png"},
  2487. paramtype = "light",
  2488. paramtype2 = "glasslikeliquidlevel",
  2489. is_ground_content = false,
  2490. sunlight_propagates = true,
  2491. sounds = default.node_sound_glass_defaults(),
  2492. groups = {cracky = 3},
  2493. })
  2494. minetest.register_node("default:brick", {
  2495. description = "Brick Block",
  2496. paramtype2 = "facedir",
  2497. place_param2 = 0,
  2498. tiles = {"default_brick.png"},
  2499. is_ground_content = false,
  2500. groups = {cracky = 3},
  2501. sounds = default.node_sound_stone_defaults(),
  2502. })
  2503. minetest.register_node("default:meselamp", {
  2504. description = "Mese Lamp",
  2505. drawtype = "glasslike",
  2506. tiles = {"default_meselamp.png"},
  2507. paramtype = "light",
  2508. sunlight_propagates = true,
  2509. is_ground_content = false,
  2510. groups = {cracky = 3, oddly_breakable_by_hand = 3},
  2511. sounds = default.node_sound_glass_defaults(),
  2512. light_source = default.LIGHT_MAX,
  2513. })
  2514. minetest.register_node("default:mese_post_light", {
  2515. description = "Mese Post Light",
  2516. tiles = {"default_mese_post_light_top.png", "default_mese_post_light_top.png",
  2517. "default_mese_post_light_side_dark.png", "default_mese_post_light_side_dark.png",
  2518. "default_mese_post_light_side.png", "default_mese_post_light_side.png"},
  2519. wield_image = "default_mese_post_light_side.png",
  2520. drawtype = "nodebox",
  2521. node_box = {
  2522. type = "fixed",
  2523. fixed = {
  2524. {-2 / 16, -8 / 16, -2 / 16, 2 / 16, 8 / 16, 2 / 16},
  2525. },
  2526. },
  2527. paramtype = "light",
  2528. light_source = default.LIGHT_MAX,
  2529. sunlight_propagates = true,
  2530. is_ground_content = false,
  2531. groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2},
  2532. sounds = default.node_sound_wood_defaults(),
  2533. })
  2534. --
  2535. -- Misc
  2536. --
  2537. minetest.register_node("default:cloud", {
  2538. description = "Cloud",
  2539. tiles = {"default_cloud.png"},
  2540. is_ground_content = false,
  2541. sounds = default.node_sound_defaults(),
  2542. groups = {not_in_creative_inventory = 1},
  2543. })
  2544. --
  2545. -- register trees for leafdecay
  2546. --
  2547. if minetest.get_mapgen_setting("mg_name") == "v6" then
  2548. default.register_leafdecay({
  2549. trunks = {"default:tree"},
  2550. leaves = {"default:apple", "default:leaves"},
  2551. radius = 2,
  2552. })
  2553. default.register_leafdecay({
  2554. trunks = {"default:jungletree"},
  2555. leaves = {"default:jungleleaves"},
  2556. radius = 3,
  2557. })
  2558. else
  2559. default.register_leafdecay({
  2560. trunks = {"default:tree"},
  2561. leaves = {"default:apple", "default:leaves"},
  2562. radius = 3,
  2563. })
  2564. default.register_leafdecay({
  2565. trunks = {"default:jungletree"},
  2566. leaves = {"default:jungleleaves"},
  2567. radius = 2,
  2568. })
  2569. end
  2570. default.register_leafdecay({
  2571. trunks = {"default:pine_tree"},
  2572. leaves = {"default:pine_needles"},
  2573. radius = 3,
  2574. })
  2575. default.register_leafdecay({
  2576. trunks = {"default:acacia_tree"},
  2577. leaves = {"default:acacia_leaves"},
  2578. radius = 2,
  2579. })
  2580. default.register_leafdecay({
  2581. trunks = {"default:aspen_tree"},
  2582. leaves = {"default:aspen_leaves"},
  2583. radius = 3,
  2584. })
  2585. default.register_leafdecay({
  2586. trunks = {"default:bush_stem"},
  2587. leaves = {"default:bush_leaves"},
  2588. radius = 1,
  2589. })
  2590. default.register_leafdecay({
  2591. trunks = {"default:acacia_bush_stem"},
  2592. leaves = {"default:acacia_bush_leaves"},
  2593. radius = 1,
  2594. })
  2595. default.register_leafdecay({
  2596. trunks = {"default:pine_bush_stem"},
  2597. leaves = {"default:pine_bush_needles"},
  2598. radius = 1,
  2599. })