init.lua 49 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896
  1. -- default (Minetest 0.4 mod)
  2. -- Most default stuff
  3. -- The API documentation in here was moved into doc/lua_api.txt
  4. WATER_ALPHA = 160
  5. WATER_VISC = 1
  6. LAVA_VISC = 7
  7. LIGHT_MAX = 14
  8. -- Definitions made by this mod that other mods can use too
  9. default = {}
  10. -- Load other files
  11. dofile(minetest.get_modpath("default").."/mapgen.lua")
  12. -- Set a noticeable inventory formspec for players
  13. minetest.register_on_joinplayer(function(player)
  14. local cb = function(player)
  15. minetest.chat_send_player(player:get_player_name(), "This is the [minimal] \"Minimal Development Test\" game. Use [minetest_game] for the real thing.")
  16. player:set_attribute("test_attribute", "test_me")
  17. player:set_attribute("remove_this", nil)
  18. end
  19. minetest.after(2.0, cb, player)
  20. end)
  21. --
  22. -- Tool definition
  23. --
  24. -- The hand
  25. minetest.register_item(":", {
  26. type = "none",
  27. wield_image = "wieldhand.png",
  28. wield_scale = {x=1,y=1,z=2.5},
  29. tool_capabilities = {
  30. full_punch_interval = 1.0,
  31. max_drop_level = 0,
  32. groupcaps = {
  33. fleshy = {times={[2]=2.00, [3]=1.00}, uses=0, maxlevel=1},
  34. crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1},
  35. snappy = {times={[3]=0.40}, uses=0, maxlevel=1},
  36. oddly_breakable_by_hand = {times={[1]=7.00,[2]=4.00,[3]=1.40}, uses=0, maxlevel=3},
  37. },
  38. damage_groups = {fleshy=1},
  39. }
  40. })
  41. --
  42. -- Picks
  43. --
  44. minetest.register_tool("default:pick_wood", {
  45. description = "Wooden Pickaxe",
  46. inventory_image = "default_tool_woodpick.png",
  47. tool_capabilities = {
  48. max_drop_level=0,
  49. groupcaps={
  50. cracky={times={[2]=2.00, [3]=1.20}, uses=10, maxlevel=1}
  51. },
  52. damage_groups = {fleshy=2},
  53. },
  54. })
  55. minetest.register_tool("default:pick_stone", {
  56. description = "Stone Pickaxe",
  57. inventory_image = "default_tool_stonepick.png",
  58. tool_capabilities = {
  59. max_drop_level=0,
  60. groupcaps={
  61. cracky={times={[1]=2.00, [2]=1.20, [3]=0.80}, uses=20, maxlevel=1}
  62. },
  63. damage_groups = {fleshy=3},
  64. },
  65. })
  66. minetest.register_tool("default:pick_steel", {
  67. description = "Steel Pickaxe",
  68. inventory_image = "default_tool_steelpick.png",
  69. tool_capabilities = {
  70. max_drop_level=1,
  71. groupcaps={
  72. cracky={times={[1]=4.00, [2]=1.60, [3]=1.00}, uses=10, maxlevel=2}
  73. },
  74. damage_groups = {fleshy=4},
  75. },
  76. })
  77. minetest.register_tool("default:pick_mese", {
  78. description = "Mese Pickaxe",
  79. inventory_image = "default_tool_mesepick.png",
  80. tool_capabilities = {
  81. full_punch_interval = 1.0,
  82. max_drop_level=3,
  83. groupcaps={
  84. cracky={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3},
  85. crumbly={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3},
  86. snappy={times={[1]=2.0, [2]=1.0, [3]=0.5}, uses=20, maxlevel=3}
  87. },
  88. damage_groups = {fleshy=4},
  89. },
  90. })
  91. --
  92. -- Shovels
  93. --
  94. minetest.register_tool("default:shovel_wood", {
  95. description = "Wooden Shovel",
  96. inventory_image = "default_tool_woodshovel.png",
  97. tool_capabilities = {
  98. max_drop_level=0,
  99. groupcaps={
  100. crumbly={times={[1]=2.00, [2]=0.80, [3]=0.50}, uses=10, maxlevel=1}
  101. },
  102. damage_groups = {fleshy=2},
  103. },
  104. })
  105. minetest.register_tool("default:shovel_stone", {
  106. description = "Stone Shovel",
  107. inventory_image = "default_tool_stoneshovel.png",
  108. tool_capabilities = {
  109. max_drop_level=0,
  110. groupcaps={
  111. crumbly={times={[1]=1.20, [2]=0.50, [3]=0.30}, uses=20, maxlevel=1}
  112. },
  113. damage_groups = {fleshy=3},
  114. },
  115. })
  116. minetest.register_tool("default:shovel_steel", {
  117. description = "Steel Shovel",
  118. inventory_image = "default_tool_steelshovel.png",
  119. tool_capabilities = {
  120. max_drop_level=1,
  121. groupcaps={
  122. crumbly={times={[1]=1.00, [2]=0.70, [3]=0.60}, uses=10, maxlevel=2}
  123. },
  124. damage_groups = {fleshy=4},
  125. },
  126. })
  127. --
  128. -- Axes
  129. --
  130. minetest.register_tool("default:axe_wood", {
  131. description = "Wooden Axe",
  132. inventory_image = "default_tool_woodaxe.png",
  133. tool_capabilities = {
  134. max_drop_level=0,
  135. groupcaps={
  136. choppy={times={[2]=1.40, [3]=0.80}, uses=10, maxlevel=1},
  137. fleshy={times={[2]=1.50, [3]=0.80}, uses=10, maxlevel=1}
  138. },
  139. damage_groups = {fleshy=2},
  140. },
  141. })
  142. minetest.register_tool("default:axe_stone", {
  143. description = "Stone Axe",
  144. inventory_image = "default_tool_stoneaxe.png",
  145. tool_capabilities = {
  146. max_drop_level=0,
  147. groupcaps={
  148. choppy={times={[1]=1.50, [2]=1.00, [3]=0.60}, uses=20, maxlevel=1},
  149. fleshy={times={[2]=1.30, [3]=0.70}, uses=20, maxlevel=1}
  150. },
  151. damage_groups = {fleshy=3},
  152. },
  153. })
  154. minetest.register_tool("default:axe_steel", {
  155. description = "Steel Axe",
  156. inventory_image = "default_tool_steelaxe.png",
  157. tool_capabilities = {
  158. max_drop_level=1,
  159. groupcaps={
  160. choppy={times={[1]=2.00, [2]=1.60, [3]=1.00}, uses=10, maxlevel=2},
  161. fleshy={times={[2]=1.10, [3]=0.60}, uses=40, maxlevel=1}
  162. },
  163. damage_groups = {fleshy=3},
  164. },
  165. })
  166. --
  167. -- Swords
  168. --
  169. minetest.register_tool("default:sword_wood", {
  170. description = "Wooden Sword",
  171. inventory_image = "default_tool_woodsword.png",
  172. tool_capabilities = {
  173. full_punch_interval = 1.0,
  174. max_drop_level=0,
  175. groupcaps={
  176. fleshy={times={[2]=1.10, [3]=0.60}, uses=10, maxlevel=1},
  177. snappy={times={[2]=1.00, [3]=0.50}, uses=10, maxlevel=1},
  178. choppy={times={[3]=1.00}, uses=20, maxlevel=0}
  179. },
  180. damage_groups = {fleshy=2},
  181. }
  182. })
  183. minetest.register_tool("default:sword_stone", {
  184. description = "Stone Sword",
  185. inventory_image = "default_tool_stonesword.png",
  186. tool_capabilities = {
  187. full_punch_interval = 1.0,
  188. max_drop_level=0,
  189. groupcaps={
  190. fleshy={times={[2]=0.80, [3]=0.40}, uses=20, maxlevel=1},
  191. snappy={times={[2]=0.80, [3]=0.40}, uses=20, maxlevel=1},
  192. choppy={times={[3]=0.90}, uses=20, maxlevel=0}
  193. },
  194. damage_groups = {fleshy=4},
  195. }
  196. })
  197. minetest.register_tool("default:sword_steel", {
  198. description = "Steel Sword",
  199. inventory_image = "default_tool_steelsword.png",
  200. tool_capabilities = {
  201. full_punch_interval = 1.0,
  202. max_drop_level=1,
  203. groupcaps={
  204. fleshy={times={[1]=2.00, [2]=0.80, [3]=0.40}, uses=10, maxlevel=2},
  205. snappy={times={[2]=0.70, [3]=0.30}, uses=40, maxlevel=1},
  206. choppy={times={[3]=0.70}, uses=40, maxlevel=0}
  207. },
  208. damage_groups = {fleshy=6},
  209. }
  210. })
  211. --
  212. -- Crafting definition
  213. --
  214. minetest.register_craft({
  215. output = 'default:wood 4',
  216. recipe = {
  217. {'default:tree'},
  218. }
  219. })
  220. minetest.register_craft({
  221. output = 'default:stick 4',
  222. recipe = {
  223. {'default:wood'},
  224. }
  225. })
  226. minetest.register_craft({
  227. output = 'default:fence_wood 2',
  228. recipe = {
  229. {'default:stick', 'default:stick', 'default:stick'},
  230. {'default:stick', 'default:stick', 'default:stick'},
  231. }
  232. })
  233. minetest.register_craft({
  234. output = 'default:sign_wall',
  235. recipe = {
  236. {'default:wood', 'default:wood', 'default:wood'},
  237. {'default:wood', 'default:wood', 'default:wood'},
  238. {'', 'default:stick', ''},
  239. }
  240. })
  241. minetest.register_craft({
  242. output = 'default:torch 4',
  243. recipe = {
  244. {'default:coal_lump'},
  245. {'default:stick'},
  246. }
  247. })
  248. minetest.register_craft({
  249. output = 'default:pick_wood',
  250. recipe = {
  251. {'default:wood', 'default:wood', 'default:wood'},
  252. {'', 'default:stick', ''},
  253. {'', 'default:stick', ''},
  254. }
  255. })
  256. minetest.register_craft({
  257. output = 'default:pick_stone',
  258. recipe = {
  259. {'default:cobble', 'default:cobble', 'default:cobble'},
  260. {'', 'default:stick', ''},
  261. {'', 'default:stick', ''},
  262. }
  263. })
  264. minetest.register_craft({
  265. output = 'default:pick_steel',
  266. recipe = {
  267. {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
  268. {'', 'default:stick', ''},
  269. {'', 'default:stick', ''},
  270. }
  271. })
  272. minetest.register_craft({
  273. output = 'default:pick_mese',
  274. recipe = {
  275. {'default:mese', 'default:mese', 'default:mese'},
  276. {'', 'default:stick', ''},
  277. {'', 'default:stick', ''},
  278. }
  279. })
  280. minetest.register_craft({
  281. output = 'default:shovel_wood',
  282. recipe = {
  283. {'default:wood'},
  284. {'default:stick'},
  285. {'default:stick'},
  286. }
  287. })
  288. minetest.register_craft({
  289. output = 'default:shovel_stone',
  290. recipe = {
  291. {'default:cobble'},
  292. {'default:stick'},
  293. {'default:stick'},
  294. }
  295. })
  296. minetest.register_craft({
  297. output = 'default:shovel_steel',
  298. recipe = {
  299. {'default:steel_ingot'},
  300. {'default:stick'},
  301. {'default:stick'},
  302. }
  303. })
  304. minetest.register_craft({
  305. output = 'default:axe_wood',
  306. recipe = {
  307. {'default:wood', 'default:wood'},
  308. {'default:wood', 'default:stick'},
  309. {'', 'default:stick'},
  310. }
  311. })
  312. minetest.register_craft({
  313. output = 'default:axe_stone',
  314. recipe = {
  315. {'default:cobble', 'default:cobble'},
  316. {'default:cobble', 'default:stick'},
  317. {'', 'default:stick'},
  318. }
  319. })
  320. minetest.register_craft({
  321. output = 'default:axe_steel',
  322. recipe = {
  323. {'default:steel_ingot', 'default:steel_ingot'},
  324. {'default:steel_ingot', 'default:stick'},
  325. {'', 'default:stick'},
  326. }
  327. })
  328. minetest.register_craft({
  329. output = 'default:sword_wood',
  330. recipe = {
  331. {'default:wood'},
  332. {'default:wood'},
  333. {'default:stick'},
  334. }
  335. })
  336. minetest.register_craft({
  337. output = 'default:sword_stone',
  338. recipe = {
  339. {'default:cobble'},
  340. {'default:cobble'},
  341. {'default:stick'},
  342. }
  343. })
  344. minetest.register_craft({
  345. output = 'default:sword_steel',
  346. recipe = {
  347. {'default:steel_ingot'},
  348. {'default:steel_ingot'},
  349. {'default:stick'},
  350. }
  351. })
  352. minetest.register_craft({
  353. output = 'default:rail 15',
  354. recipe = {
  355. {'default:steel_ingot', '', 'default:steel_ingot'},
  356. {'default:steel_ingot', 'default:stick', 'default:steel_ingot'},
  357. {'default:steel_ingot', '', 'default:steel_ingot'},
  358. }
  359. })
  360. minetest.register_craft({
  361. output = 'default:chest',
  362. recipe = {
  363. {'default:wood', 'default:wood', 'default:wood'},
  364. {'default:wood', '', 'default:wood'},
  365. {'default:wood', 'default:wood', 'default:wood'},
  366. }
  367. })
  368. minetest.register_craft({
  369. output = 'default:chest_locked',
  370. recipe = {
  371. {'default:wood', 'default:wood', 'default:wood'},
  372. {'default:wood', 'default:steel_ingot', 'default:wood'},
  373. {'default:wood', 'default:wood', 'default:wood'},
  374. }
  375. })
  376. minetest.register_craft({
  377. output = 'default:furnace',
  378. recipe = {
  379. {'default:cobble', 'default:cobble', 'default:cobble'},
  380. {'default:cobble', '', 'default:cobble'},
  381. {'default:cobble', 'default:cobble', 'default:cobble'},
  382. }
  383. })
  384. minetest.register_craft({
  385. output = 'default:steelblock',
  386. recipe = {
  387. {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
  388. {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
  389. {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'},
  390. }
  391. })
  392. minetest.register_craft({
  393. output = 'default:sandstone',
  394. recipe = {
  395. {'default:sand', 'default:sand'},
  396. {'default:sand', 'default:sand'},
  397. }
  398. })
  399. minetest.register_craft({
  400. output = 'default:clay',
  401. recipe = {
  402. {'default:clay_lump', 'default:clay_lump'},
  403. {'default:clay_lump', 'default:clay_lump'},
  404. }
  405. })
  406. minetest.register_craft({
  407. output = 'default:brick',
  408. recipe = {
  409. {'default:clay_brick', 'default:clay_brick'},
  410. {'default:clay_brick', 'default:clay_brick'},
  411. }
  412. })
  413. minetest.register_craft({
  414. output = 'default:paper',
  415. recipe = {
  416. {'default:papyrus', 'default:papyrus', 'default:papyrus'},
  417. }
  418. })
  419. minetest.register_craft({
  420. output = 'default:book',
  421. recipe = {
  422. {'default:paper'},
  423. {'default:paper'},
  424. {'default:paper'},
  425. }
  426. })
  427. minetest.register_craft({
  428. output = 'default:bookshelf',
  429. recipe = {
  430. {'default:wood', 'default:wood', 'default:wood'},
  431. {'default:book', 'default:book', 'default:book'},
  432. {'default:wood', 'default:wood', 'default:wood'},
  433. }
  434. })
  435. minetest.register_craft({
  436. output = 'default:ladder',
  437. recipe = {
  438. {'default:stick', '', 'default:stick'},
  439. {'default:stick', 'default:stick', 'default:stick'},
  440. {'default:stick', '', 'default:stick'},
  441. }
  442. })
  443. -- Tool repair
  444. minetest.register_craft({
  445. type = "toolrepair",
  446. additional_wear = -0.02,
  447. })
  448. --
  449. -- Cooking recipes
  450. --
  451. minetest.register_craft({
  452. type = "cooking",
  453. output = "default:glass",
  454. recipe = "default:sand",
  455. })
  456. minetest.register_craft({
  457. type = "cooking",
  458. output = "default:coal_lump",
  459. recipe = "default:tree",
  460. })
  461. minetest.register_craft({
  462. type = "cooking",
  463. output = "default:stone",
  464. recipe = "default:cobble",
  465. })
  466. minetest.register_craft({
  467. type = "cooking",
  468. output = "default:steel_ingot",
  469. recipe = "default:iron_lump",
  470. })
  471. minetest.register_craft({
  472. type = "cooking",
  473. output = "default:clay_brick",
  474. recipe = "default:clay_lump",
  475. })
  476. --
  477. -- Fuels
  478. --
  479. minetest.register_craft({
  480. type = "fuel",
  481. recipe = "default:tree",
  482. burntime = 30,
  483. })
  484. minetest.register_craft({
  485. type = "fuel",
  486. recipe = "default:junglegrass",
  487. burntime = 2,
  488. })
  489. minetest.register_craft({
  490. type = "fuel",
  491. recipe = "default:leaves",
  492. burntime = 1,
  493. })
  494. minetest.register_craft({
  495. type = "fuel",
  496. recipe = "default:cactus",
  497. burntime = 15,
  498. })
  499. minetest.register_craft({
  500. type = "fuel",
  501. recipe = "default:papyrus",
  502. burntime = 1,
  503. })
  504. minetest.register_craft({
  505. type = "fuel",
  506. recipe = "default:bookshelf",
  507. burntime = 30,
  508. })
  509. minetest.register_craft({
  510. type = "fuel",
  511. recipe = "default:fence_wood",
  512. burntime = 15,
  513. })
  514. minetest.register_craft({
  515. type = "fuel",
  516. recipe = "default:ladder",
  517. burntime = 5,
  518. })
  519. minetest.register_craft({
  520. type = "fuel",
  521. recipe = "default:wood",
  522. burntime = 7,
  523. })
  524. minetest.register_craft({
  525. type = "fuel",
  526. recipe = "default:mese",
  527. burntime = 30,
  528. })
  529. minetest.register_craft({
  530. type = "fuel",
  531. recipe = "default:lava_source",
  532. burntime = 60,
  533. })
  534. minetest.register_craft({
  535. type = "fuel",
  536. recipe = "default:torch",
  537. burntime = 4,
  538. })
  539. minetest.register_craft({
  540. type = "fuel",
  541. recipe = "default:sign_wall",
  542. burntime = 10,
  543. })
  544. minetest.register_craft({
  545. type = "fuel",
  546. recipe = "default:chest",
  547. burntime = 30,
  548. })
  549. minetest.register_craft({
  550. type = "fuel",
  551. recipe = "default:chest_locked",
  552. burntime = 30,
  553. })
  554. minetest.register_craft({
  555. type = "fuel",
  556. recipe = "default:nyancat",
  557. burntime = 1,
  558. })
  559. minetest.register_craft({
  560. type = "fuel",
  561. recipe = "default:nyancat_rainbow",
  562. burntime = 1,
  563. })
  564. minetest.register_craft({
  565. type = "fuel",
  566. recipe = "default:sapling",
  567. burntime = 10,
  568. })
  569. minetest.register_craft({
  570. type = "fuel",
  571. recipe = "default:apple",
  572. burntime = 3,
  573. })
  574. minetest.register_craft({
  575. type = "fuel",
  576. recipe = "default:coal_lump",
  577. burntime = 40,
  578. })
  579. --
  580. -- Node definitions
  581. --
  582. -- Default node sounds
  583. function default.node_sound_defaults(table)
  584. table = table or {}
  585. table.footstep = table.footstep or
  586. {name="", gain=1.0}
  587. table.dug = table.dug or
  588. {name="default_dug_node", gain=1.0}
  589. return table
  590. end
  591. function default.node_sound_stone_defaults(table)
  592. table = table or {}
  593. table.footstep = table.footstep or
  594. {name="default_hard_footstep", gain=0.2}
  595. default.node_sound_defaults(table)
  596. return table
  597. end
  598. function default.node_sound_dirt_defaults(table)
  599. table = table or {}
  600. table.footstep = table.footstep or
  601. {name="", gain=0.5}
  602. --table.dug = table.dug or
  603. -- {name="default_dirt_break", gain=0.5}
  604. table.place = table.place or
  605. {name="default_grass_footstep", gain=0.5}
  606. default.node_sound_defaults(table)
  607. return table
  608. end
  609. function default.node_sound_sand_defaults(table)
  610. table = table or {}
  611. table.footstep = table.footstep or
  612. {name="default_grass_footstep", gain=0.25}
  613. --table.dug = table.dug or
  614. -- {name="default_dirt_break", gain=0.25}
  615. table.dug = table.dug or
  616. {name="", gain=0.25}
  617. default.node_sound_defaults(table)
  618. return table
  619. end
  620. function default.node_sound_wood_defaults(table)
  621. table = table or {}
  622. table.footstep = table.footstep or
  623. {name="default_hard_footstep", gain=0.3}
  624. default.node_sound_defaults(table)
  625. return table
  626. end
  627. function default.node_sound_leaves_defaults(table)
  628. table = table or {}
  629. table.footstep = table.footstep or
  630. {name="default_grass_footstep", gain=0.25}
  631. table.dig = table.dig or
  632. {name="default_dig_crumbly", gain=0.4}
  633. table.dug = table.dug or
  634. {name="", gain=1.0}
  635. default.node_sound_defaults(table)
  636. return table
  637. end
  638. function default.node_sound_glass_defaults(table)
  639. table = table or {}
  640. table.footstep = table.footstep or
  641. {name="default_stone_footstep", gain=0.25}
  642. table.dug = table.dug or
  643. {name="default_break_glass", gain=1.0}
  644. default.node_sound_defaults(table)
  645. return table
  646. end
  647. -- Register nodes
  648. minetest.register_node("default:stone", {
  649. description = "Stone",
  650. tiles ={"default_stone.png"},
  651. groups = {cracky=3},
  652. drop = 'default:cobble',
  653. legacy_mineral = true,
  654. sounds = default.node_sound_stone_defaults(),
  655. })
  656. minetest.register_node("default:stone_with_coal", {
  657. description = "Stone with coal",
  658. tiles ={"default_stone.png^default_mineral_coal.png"},
  659. groups = {cracky=3},
  660. drop = 'default:coal_lump',
  661. sounds = default.node_sound_stone_defaults(),
  662. })
  663. minetest.register_node("default:stone_with_iron", {
  664. description = "Stone with iron",
  665. tiles ={"default_stone.png^default_mineral_iron.png"},
  666. groups = {cracky=3},
  667. drop = 'default:iron_lump',
  668. sounds = default.node_sound_stone_defaults(),
  669. })
  670. minetest.register_node("default:dirt_with_grass", {
  671. description = "Dirt with grass",
  672. tiles ={"default_grass.png", "default_dirt.png",
  673. {name = "default_dirt.png^default_grass_side.png",
  674. tileable_vertical = false}},
  675. groups = {crumbly=3, soil=1},
  676. drop = 'default:dirt',
  677. sounds = default.node_sound_dirt_defaults({
  678. footstep = {name="default_grass_footstep", gain=0.4},
  679. }),
  680. })
  681. minetest.register_node("default:dirt_with_grass_footsteps", {
  682. description = "Dirt with grass and footsteps",
  683. tiles ={"default_grass_footsteps.png", "default_dirt.png",
  684. {name = "default_dirt.png^default_grass_side.png",
  685. tileable_vertical = false}},
  686. groups = {crumbly=3, soil=1},
  687. drop = 'default:dirt',
  688. sounds = default.node_sound_dirt_defaults({
  689. footstep = {name="default_grass_footstep", gain=0.4},
  690. }),
  691. })
  692. minetest.register_node("default:dirt", {
  693. description = "Dirt",
  694. tiles ={"default_dirt.png"},
  695. groups = {crumbly=3, soil=1},
  696. sounds = default.node_sound_dirt_defaults(),
  697. })
  698. minetest.register_node("default:sand", {
  699. description = "Sand",
  700. tiles ={"default_sand.png"},
  701. groups = {crumbly=3, falling_node=1},
  702. sounds = default.node_sound_sand_defaults(),
  703. })
  704. minetest.register_node("default:gravel", {
  705. description = "Gravel",
  706. tiles ={"default_gravel.png"},
  707. groups = {crumbly=2, falling_node=1},
  708. sounds = default.node_sound_dirt_defaults({
  709. footstep = {name="default_gravel_footstep", gain=0.45},
  710. }),
  711. })
  712. minetest.register_node("default:sandstone", {
  713. description = "Sandstone",
  714. tiles ={"default_sandstone.png"},
  715. groups = {crumbly=2,cracky=2},
  716. drop = 'default:sand',
  717. sounds = default.node_sound_stone_defaults(),
  718. })
  719. minetest.register_node("default:clay", {
  720. description = "Clay",
  721. tiles ={"default_clay.png"},
  722. groups = {crumbly=3},
  723. drop = 'default:clay_lump 4',
  724. sounds = default.node_sound_dirt_defaults({
  725. footstep = "",
  726. }),
  727. })
  728. minetest.register_node("default:brick", {
  729. description = "Brick",
  730. tiles ={"default_brick.png"},
  731. is_ground_content = false,
  732. groups = {cracky=3},
  733. drop = 'default:clay_brick 4',
  734. sounds = default.node_sound_stone_defaults(),
  735. })
  736. minetest.register_node("default:tree", {
  737. description = "Tree",
  738. tiles ={"default_tree_top.png", "default_tree_top.png", "default_tree.png"},
  739. is_ground_content = false,
  740. groups = {snappy=2,choppy=2,oddly_breakable_by_hand=1},
  741. sounds = default.node_sound_wood_defaults(),
  742. })
  743. minetest.register_node("default:junglegrass", {
  744. description = "Jungle Grass",
  745. drawtype = "plantlike",
  746. visual_scale = 1.3,
  747. tiles ={"default_junglegrass.png"},
  748. inventory_image = "default_junglegrass.png",
  749. wield_image = "default_junglegrass.png",
  750. paramtype = "light",
  751. walkable = false,
  752. groups = {snappy=3,attached_node=1},
  753. sounds = default.node_sound_leaves_defaults(),
  754. })
  755. minetest.register_node("default:leaves", {
  756. description = "Leaves",
  757. drawtype = "allfaces_optional",
  758. visual_scale = 1.3,
  759. tiles ={"default_leaves.png"},
  760. paramtype = "light",
  761. is_ground_content = false,
  762. groups = {snappy=3},
  763. drop = {
  764. max_items = 1,
  765. items = {
  766. {
  767. -- player will get sapling with 1/20 chance
  768. items = {'default:sapling'},
  769. rarity = 20,
  770. },
  771. {
  772. -- player will get leaves only if he get no saplings,
  773. -- this is because max_items is 1
  774. items = {'default:leaves'},
  775. }
  776. }
  777. },
  778. sounds = default.node_sound_leaves_defaults(),
  779. })
  780. minetest.register_node("default:cactus", {
  781. description = "Cactus",
  782. tiles ={"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"},
  783. groups = {snappy=2,choppy=3},
  784. sounds = default.node_sound_wood_defaults(),
  785. })
  786. minetest.register_node("default:papyrus", {
  787. description = "Papyrus",
  788. drawtype = "plantlike",
  789. tiles ={"default_papyrus.png"},
  790. inventory_image = "default_papyrus.png",
  791. wield_image = "default_papyrus.png",
  792. paramtype = "light",
  793. walkable = false,
  794. groups = {snappy=3},
  795. sounds = default.node_sound_leaves_defaults(),
  796. })
  797. minetest.register_node("default:bookshelf", {
  798. description = "Bookshelf",
  799. tiles ={"default_wood.png", "default_wood.png", "default_bookshelf.png"},
  800. is_ground_content = false,
  801. groups = {snappy=2,choppy=3,oddly_breakable_by_hand=2},
  802. sounds = default.node_sound_wood_defaults(),
  803. })
  804. minetest.register_node("default:glass", {
  805. description = "Glass",
  806. drawtype = "glasslike",
  807. tiles ={"default_glass.png"},
  808. paramtype = "light",
  809. is_ground_content = false,
  810. sunlight_propagates = true,
  811. groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3},
  812. sounds = default.node_sound_glass_defaults(),
  813. })
  814. minetest.register_node("default:fence_wood", {
  815. description = "Wooden Fence",
  816. drawtype = "fencelike",
  817. tiles ={"default_wood.png"},
  818. inventory_image = "default_fence.png",
  819. wield_image = "default_fence.png",
  820. paramtype = "light",
  821. is_ground_content = false,
  822. selection_box = {
  823. type = "fixed",
  824. fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7},
  825. },
  826. groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
  827. sounds = default.node_sound_wood_defaults(),
  828. })
  829. minetest.register_node("default:rail", {
  830. description = "Rail",
  831. drawtype = "raillike",
  832. tiles ={"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"},
  833. inventory_image = "default_rail.png",
  834. wield_image = "default_rail.png",
  835. paramtype = "light",
  836. is_ground_content = false,
  837. walkable = false,
  838. selection_box = {
  839. type = "fixed",
  840. fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2},
  841. },
  842. groups = {bendy=2,snappy=1,dig_immediate=2},
  843. })
  844. minetest.register_node("default:ladder", {
  845. description = "Ladder",
  846. drawtype = "signlike",
  847. tiles ={"default_ladder.png"},
  848. inventory_image = "default_ladder.png",
  849. wield_image = "default_ladder.png",
  850. paramtype = "light",
  851. paramtype2 = "wallmounted",
  852. is_ground_content = false,
  853. walkable = false,
  854. climbable = true,
  855. selection_box = {
  856. type = "wallmounted",
  857. --wall_top = = <default>
  858. --wall_bottom = = <default>
  859. --wall_side = = <default>
  860. },
  861. groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3},
  862. legacy_wallmounted = true,
  863. sounds = default.node_sound_wood_defaults(),
  864. })
  865. minetest.register_node("default:wood", {
  866. description = "Wood",
  867. tiles ={"default_wood.png"},
  868. is_ground_content = false,
  869. groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
  870. sounds = default.node_sound_wood_defaults(),
  871. })
  872. minetest.register_node("default:mese", {
  873. description = "Mese",
  874. tiles ={"default_mese.png"},
  875. groups = {cracky=1,level=2},
  876. sounds = default.node_sound_defaults(),
  877. })
  878. minetest.register_node("default:cloud", {
  879. description = "Cloud",
  880. tiles ={"default_cloud.png"},
  881. is_ground_content = false,
  882. sounds = default.node_sound_defaults(),
  883. })
  884. minetest.register_node("default:water_flowing", {
  885. description = "Water (flowing)",
  886. drawtype = "flowingliquid",
  887. tiles = {"default_water.png"},
  888. special_tiles = {
  889. {name = "default_water.png", backface_culling = false},
  890. {name = "default_water.png", backface_culling = true},
  891. },
  892. alpha = WATER_ALPHA,
  893. paramtype = "light",
  894. paramtype2 = "flowingliquid",
  895. walkable = false,
  896. pointable = false,
  897. diggable = false,
  898. buildable_to = true,
  899. is_ground_content = false,
  900. drop = "",
  901. drowning = 1,
  902. liquidtype = "flowing",
  903. liquid_alternative_flowing = "default:water_flowing",
  904. liquid_alternative_source = "default:water_source",
  905. liquid_viscosity = WATER_VISC,
  906. post_effect_color = {a = 64, r = 100, g = 100, b = 200},
  907. groups = {water = 3, liquid = 3},
  908. })
  909. minetest.register_node("default:water_source", {
  910. description = "Water",
  911. drawtype = "liquid",
  912. tiles = {"default_water.png"},
  913. special_tiles = {
  914. -- New-style water source material (mostly unused)
  915. {name = "default_water.png", backface_culling = false},
  916. },
  917. alpha = WATER_ALPHA,
  918. paramtype = "light",
  919. walkable = false,
  920. pointable = false,
  921. diggable = false,
  922. buildable_to = true,
  923. is_ground_content = false,
  924. drop = "",
  925. drowning = 1,
  926. liquidtype = "source",
  927. liquid_alternative_flowing = "default:water_flowing",
  928. liquid_alternative_source = "default:water_source",
  929. liquid_viscosity = WATER_VISC,
  930. post_effect_color = {a = 64, r = 100, g = 100, b = 200},
  931. groups = {water = 3, liquid = 3},
  932. })
  933. minetest.register_node("default:river_water_source", {
  934. description = "River Water Source",
  935. drawtype = "liquid",
  936. tiles = {"default_river_water.png"},
  937. special_tiles = {
  938. -- New-style water source material (mostly unused)
  939. {name = "default_river_water.png", backface_culling = false},
  940. },
  941. alpha = 160,
  942. paramtype = "light",
  943. walkable = false,
  944. pointable = false,
  945. diggable = false,
  946. buildable_to = true,
  947. is_ground_content = false,
  948. drop = "",
  949. drowning = 1,
  950. liquidtype = "source",
  951. liquid_alternative_flowing = "default:river_water_flowing",
  952. liquid_alternative_source = "default:river_water_source",
  953. liquid_viscosity = 1,
  954. liquid_renewable = false,
  955. liquid_range = 2,
  956. post_effect_color = {a = 103, r = 30, g = 76, b = 90},
  957. groups = {water = 3, liquid = 3, puts_out_fire = 1, cools_lava = 1},
  958. })
  959. minetest.register_node("default:river_water_flowing", {
  960. description = "Flowing River Water",
  961. drawtype = "flowingliquid",
  962. tiles = {"default_river_water.png"},
  963. special_tiles = {
  964. {name = "default_river_water.png", backface_culling = false},
  965. {name = "default_river_water.png", backface_culling = true},
  966. },
  967. alpha = 160,
  968. paramtype = "light",
  969. paramtype2 = "flowingliquid",
  970. walkable = false,
  971. pointable = false,
  972. diggable = false,
  973. buildable_to = true,
  974. is_ground_content = false,
  975. drop = "",
  976. drowning = 1,
  977. liquidtype = "flowing",
  978. liquid_alternative_flowing = "default:river_water_flowing",
  979. liquid_alternative_source = "default:river_water_source",
  980. liquid_viscosity = 1,
  981. liquid_renewable = false,
  982. liquid_range = 2,
  983. post_effect_color = {a = 103, r = 30, g = 76, b = 90},
  984. groups = {water = 3, liquid = 3, puts_out_fire = 1,
  985. not_in_creative_inventory = 1, cools_lava = 1},
  986. })
  987. minetest.register_node("default:lava_flowing", {
  988. description = "Lava (flowing)",
  989. inventory_image = minetest.inventorycube("default_lava.png"),
  990. drawtype = "flowingliquid",
  991. tiles ={"default_lava.png"},
  992. special_tiles = {
  993. {
  994. image="default_lava_flowing_animated.png",
  995. backface_culling=false,
  996. animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3}
  997. },
  998. {
  999. image="default_lava_flowing_animated.png",
  1000. backface_culling=true,
  1001. animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.3}
  1002. },
  1003. },
  1004. paramtype = "light",
  1005. light_source = LIGHT_MAX - 1,
  1006. walkable = false,
  1007. pointable = false,
  1008. diggable = false,
  1009. buildable_to = true,
  1010. is_ground_content = false,
  1011. drowning = 1,
  1012. liquidtype = "flowing",
  1013. liquid_alternative_flowing = "default:lava_flowing",
  1014. liquid_alternative_source = "default:lava_source",
  1015. liquid_viscosity = LAVA_VISC,
  1016. damage_per_second = 4*2,
  1017. post_effect_color = {a=192, r=255, g=64, b=0},
  1018. groups = {lava=3, liquid=2, hot=3},
  1019. })
  1020. minetest.register_node("default:lava_source", {
  1021. description = "Lava",
  1022. inventory_image = minetest.inventorycube("default_lava.png"),
  1023. drawtype = "liquid",
  1024. --tiles ={"default_lava.png"},
  1025. tiles = {
  1026. {
  1027. name = "default_lava_source_animated.png",
  1028. animation = {type="sheet_2d", frames_w=3, frames_h=2, frame_length=0.5}
  1029. }
  1030. },
  1031. special_tiles = {
  1032. -- New-style lava source material (mostly unused)
  1033. {name="default_lava.png", backface_culling=false},
  1034. },
  1035. paramtype = "light",
  1036. light_source = LIGHT_MAX - 1,
  1037. walkable = false,
  1038. pointable = false,
  1039. diggable = false,
  1040. buildable_to = true,
  1041. is_ground_content = false,
  1042. drowning = 1,
  1043. liquidtype = "source",
  1044. liquid_alternative_flowing = "default:lava_flowing",
  1045. liquid_alternative_source = "default:lava_source",
  1046. liquid_viscosity = LAVA_VISC,
  1047. damage_per_second = 4*2,
  1048. post_effect_color = {a=192, r=255, g=64, b=0},
  1049. groups = {lava=3, liquid=2, hot=3},
  1050. })
  1051. minetest.register_node("default:torch", {
  1052. description = "Torch",
  1053. drawtype = "torchlike",
  1054. tiles ={"default_torch_on_floor.png", "default_torch_on_ceiling.png", "default_torch.png"},
  1055. inventory_image = "default_torch_on_floor.png",
  1056. wield_image = "default_torch_on_floor.png",
  1057. paramtype = "light",
  1058. paramtype2 = "wallmounted",
  1059. sunlight_propagates = true,
  1060. is_ground_content = false,
  1061. walkable = false,
  1062. light_source = LIGHT_MAX-1,
  1063. selection_box = {
  1064. type = "wallmounted",
  1065. wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1},
  1066. wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1},
  1067. wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1},
  1068. },
  1069. groups = {choppy=2,dig_immediate=3,attached_node=1},
  1070. legacy_wallmounted = true,
  1071. sounds = default.node_sound_defaults(),
  1072. })
  1073. minetest.register_node("default:sign_wall", {
  1074. description = "Sign",
  1075. drawtype = "signlike",
  1076. tiles ={"default_sign_wall.png"},
  1077. inventory_image = "default_sign_wall.png",
  1078. wield_image = "default_sign_wall.png",
  1079. paramtype = "light",
  1080. paramtype2 = "wallmounted",
  1081. sunlight_propagates = true,
  1082. is_ground_content = false,
  1083. walkable = false,
  1084. selection_box = {
  1085. type = "wallmounted",
  1086. --wall_top = <default>
  1087. --wall_bottom = <default>
  1088. --wall_side = <default>
  1089. },
  1090. groups = {choppy=2,dig_immediate=2,attached_node=1},
  1091. legacy_wallmounted = true,
  1092. sounds = default.node_sound_defaults(),
  1093. on_construct = function(pos)
  1094. --local n = minetest.get_node(pos)
  1095. local meta = minetest.get_meta(pos)
  1096. meta:set_string("formspec", "field[text;;${text}]")
  1097. meta:set_string("infotext", "\"\"")
  1098. end,
  1099. on_receive_fields = function(pos, formname, fields, sender)
  1100. --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields))
  1101. local meta = minetest.get_meta(pos)
  1102. fields.text = fields.text or ""
  1103. print((sender:get_player_name() or "").." wrote \""..fields.text..
  1104. "\" to sign at "..minetest.pos_to_string(pos))
  1105. meta:set_string("text", fields.text)
  1106. meta:set_string("infotext", '"'..fields.text..'"')
  1107. end,
  1108. })
  1109. minetest.register_node("default:chest", {
  1110. description = "Chest",
  1111. tiles ={"default_chest.png^[sheet:2x2:0,0", "default_chest.png^[sheet:2x2:0,0",
  1112. "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,0",
  1113. "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:0,1"},
  1114. paramtype2 = "facedir",
  1115. groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
  1116. legacy_facedir_simple = true,
  1117. is_ground_content = false,
  1118. sounds = default.node_sound_wood_defaults(),
  1119. on_construct = function(pos)
  1120. local meta = minetest.get_meta(pos)
  1121. meta:set_string("formspec",
  1122. "size[8,9]"..
  1123. "list[current_name;main;0,0;8,4;]"..
  1124. "list[current_player;main;0,5;8,4;]" ..
  1125. "listring[]")
  1126. meta:set_string("infotext", "Chest")
  1127. local inv = meta:get_inventory()
  1128. inv:set_size("main", 8*4)
  1129. end,
  1130. can_dig = function(pos,player)
  1131. local meta = minetest.get_meta(pos);
  1132. local inv = meta:get_inventory()
  1133. return inv:is_empty("main")
  1134. end,
  1135. })
  1136. local function has_locked_chest_privilege(meta, player)
  1137. if player:get_player_name() ~= meta:get_string("owner") then
  1138. return false
  1139. end
  1140. return true
  1141. end
  1142. minetest.register_node("default:chest_locked", {
  1143. description = "Locked Chest",
  1144. tiles ={"default_chest.png^[sheet:2x2:0,0", "default_chest.png^[sheet:2x2:0,0",
  1145. "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,0",
  1146. "default_chest.png^[sheet:2x2:1,0", "default_chest.png^[sheet:2x2:1,1"},
  1147. paramtype2 = "facedir",
  1148. groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
  1149. legacy_facedir_simple = true,
  1150. is_ground_content = false,
  1151. sounds = default.node_sound_wood_defaults(),
  1152. after_place_node = function(pos, placer)
  1153. local meta = minetest.get_meta(pos)
  1154. meta:set_string("owner", placer:get_player_name() or "")
  1155. meta:set_string("infotext", "Locked Chest (owned by "..
  1156. meta:get_string("owner")..")")
  1157. end,
  1158. on_construct = function(pos)
  1159. local meta = minetest.get_meta(pos)
  1160. meta:set_string("formspec",
  1161. "size[8,9]"..
  1162. "list[current_name;main;0,0;8,4;]"..
  1163. "list[current_player;main;0,5;8,4;]" ..
  1164. "listring[]")
  1165. meta:set_string("infotext", "Locked Chest")
  1166. meta:set_string("owner", "")
  1167. local inv = meta:get_inventory()
  1168. inv:set_size("main", 8*4)
  1169. -- this is not really the intended usage but works for testing purposes:
  1170. meta:mark_as_private("owner")
  1171. end,
  1172. can_dig = function(pos,player)
  1173. local meta = minetest.get_meta(pos);
  1174. local inv = meta:get_inventory()
  1175. return inv:is_empty("main")
  1176. end,
  1177. allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
  1178. local meta = minetest.get_meta(pos)
  1179. if not has_locked_chest_privilege(meta, player) then
  1180. minetest.log("action", player:get_player_name()..
  1181. " tried to access a locked chest belonging to "..
  1182. meta:get_string("owner").." at "..
  1183. minetest.pos_to_string(pos))
  1184. return 0
  1185. end
  1186. return count
  1187. end,
  1188. allow_metadata_inventory_put = function(pos, listname, index, stack, player)
  1189. local meta = minetest.get_meta(pos)
  1190. if not has_locked_chest_privilege(meta, player) then
  1191. minetest.log("action", player:get_player_name()..
  1192. " tried to access a locked chest belonging to "..
  1193. meta:get_string("owner").." at "..
  1194. minetest.pos_to_string(pos))
  1195. return 0
  1196. end
  1197. return stack:get_count()
  1198. end,
  1199. allow_metadata_inventory_take = function(pos, listname, index, stack, player)
  1200. local meta = minetest.get_meta(pos)
  1201. if not has_locked_chest_privilege(meta, player) then
  1202. minetest.log("action", player:get_player_name()..
  1203. " tried to access a locked chest belonging to "..
  1204. meta:get_string("owner").." at "..
  1205. minetest.pos_to_string(pos))
  1206. return 0
  1207. end
  1208. return stack:get_count()
  1209. end,
  1210. on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
  1211. minetest.log("action", player:get_player_name()..
  1212. " moves stuff in locked chest at "..minetest.pos_to_string(pos))
  1213. end,
  1214. on_metadata_inventory_put = function(pos, listname, index, stack, player)
  1215. minetest.log("action", player:get_player_name()..
  1216. " moves stuff to locked chest at "..minetest.pos_to_string(pos))
  1217. end,
  1218. on_metadata_inventory_take = function(pos, listname, index, stack, player)
  1219. minetest.log("action", player:get_player_name()..
  1220. " takes stuff from locked chest at "..minetest.pos_to_string(pos))
  1221. end,
  1222. })
  1223. default.furnace_inactive_formspec =
  1224. "size[8,9]"..
  1225. "image[2,2;1,1;default_furnace_fire_bg.png]"..
  1226. "list[current_name;fuel;2,3;1,1;]"..
  1227. "list[current_name;src;2,1;1,1;]"..
  1228. "list[current_name;dst;5,1;2,2;]"..
  1229. "list[current_player;main;0,5;8,4;]" ..
  1230. "listring[current_name;dst]" ..
  1231. "listring[current_player;main]" ..
  1232. "listring[current_name;src]" ..
  1233. "listring[current_player;main]"
  1234. minetest.register_node("default:furnace", {
  1235. description = "Furnace",
  1236. tiles ={"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
  1237. "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front.png"},
  1238. paramtype2 = "facedir",
  1239. groups = {cracky=2},
  1240. legacy_facedir_simple = true,
  1241. is_ground_content = false,
  1242. sounds = default.node_sound_stone_defaults(),
  1243. on_construct = function(pos)
  1244. local meta = minetest.get_meta(pos)
  1245. meta:set_string("formspec", default.furnace_inactive_formspec)
  1246. meta:set_string("infotext", "Furnace")
  1247. local inv = meta:get_inventory()
  1248. inv:set_size("fuel", 1)
  1249. inv:set_size("src", 1)
  1250. inv:set_size("dst", 4)
  1251. end,
  1252. can_dig = function(pos,player)
  1253. local meta = minetest.get_meta(pos);
  1254. local inv = meta:get_inventory()
  1255. if not inv:is_empty("fuel") then
  1256. return false
  1257. elseif not inv:is_empty("dst") then
  1258. return false
  1259. elseif not inv:is_empty("src") then
  1260. return false
  1261. end
  1262. return true
  1263. end,
  1264. })
  1265. minetest.register_node("default:furnace_active", {
  1266. description = "Furnace",
  1267. tiles ={"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png",
  1268. "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front_active.png"},
  1269. paramtype2 = "facedir",
  1270. light_source = 8,
  1271. drop = "default:furnace",
  1272. groups = {cracky=2},
  1273. legacy_facedir_simple = true,
  1274. is_ground_content = false,
  1275. sounds = default.node_sound_stone_defaults(),
  1276. on_construct = function(pos)
  1277. local meta = minetest.get_meta(pos)
  1278. meta:set_string("formspec", default.furnace_inactive_formspec)
  1279. meta:set_string("infotext", "Furnace");
  1280. local inv = meta:get_inventory()
  1281. inv:set_size("fuel", 1)
  1282. inv:set_size("src", 1)
  1283. inv:set_size("dst", 4)
  1284. end,
  1285. can_dig = function(pos,player)
  1286. local meta = minetest.get_meta(pos);
  1287. local inv = meta:get_inventory()
  1288. if not inv:is_empty("fuel") then
  1289. return false
  1290. elseif not inv:is_empty("dst") then
  1291. return false
  1292. elseif not inv:is_empty("src") then
  1293. return false
  1294. end
  1295. return true
  1296. end,
  1297. })
  1298. function swap_node(pos,name)
  1299. local node = minetest.get_node(pos)
  1300. if node.name == name then
  1301. return
  1302. end
  1303. node.name = name
  1304. minetest.swap_node(pos, node)
  1305. end
  1306. minetest.register_abm({
  1307. nodenames = {"default:furnace","default:furnace_active"},
  1308. interval = 1.0,
  1309. chance = 1,
  1310. action = function(pos, node, active_object_count, active_object_count_wider)
  1311. local meta = minetest.get_meta(pos)
  1312. for i, name in ipairs({
  1313. "fuel_totaltime",
  1314. "fuel_time",
  1315. "src_totaltime",
  1316. "src_time"
  1317. }) do
  1318. if meta:get_string(name) == "" then
  1319. meta:set_float(name, 0.0)
  1320. end
  1321. end
  1322. local inv = meta:get_inventory()
  1323. local srclist = inv:get_list("src")
  1324. local cooked = nil
  1325. if srclist then
  1326. cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
  1327. end
  1328. local was_active = false
  1329. if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
  1330. was_active = true
  1331. meta:set_float("fuel_time", meta:get_float("fuel_time") + 1)
  1332. meta:set_float("src_time", meta:get_float("src_time") + 1)
  1333. if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then
  1334. -- check if there's room for output in "dst" list
  1335. if inv:room_for_item("dst",cooked.item) then
  1336. -- Put result in "dst" list
  1337. inv:add_item("dst", cooked.item)
  1338. -- take stuff from "src" list
  1339. srcstack = inv:get_stack("src", 1)
  1340. srcstack:take_item()
  1341. inv:set_stack("src", 1, srcstack)
  1342. else
  1343. print("Could not insert '"..cooked.item:to_string().."'")
  1344. end
  1345. meta:set_string("src_time", 0)
  1346. end
  1347. end
  1348. if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then
  1349. local percent = math.floor(meta:get_float("fuel_time") /
  1350. meta:get_float("fuel_totaltime") * 100)
  1351. meta:set_string("infotext","Furnace active: "..percent.."%")
  1352. swap_node(pos,"default:furnace_active")
  1353. meta:set_string("formspec",
  1354. "size[8,9]"..
  1355. "image[2,2;1,1;default_furnace_fire_bg.png^[lowpart:"..
  1356. (100-percent)..":default_furnace_fire_fg.png]"..
  1357. "list[current_name;fuel;2,3;1,1;]"..
  1358. "list[current_name;src;2,1;1,1;]"..
  1359. "list[current_name;dst;5,1;2,2;]"..
  1360. "list[current_player;main;0,5;8,4;]" ..
  1361. "listring[current_name;dst]" ..
  1362. "listring[current_player;main]" ..
  1363. "listring[current_name;src]" ..
  1364. "listring[current_player;main]")
  1365. return
  1366. end
  1367. local fuel = nil
  1368. local cooked = nil
  1369. local fuellist = inv:get_list("fuel")
  1370. local srclist = inv:get_list("src")
  1371. if srclist then
  1372. cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist})
  1373. end
  1374. if fuellist then
  1375. fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist})
  1376. end
  1377. if fuel.time <= 0 then
  1378. meta:set_string("infotext","Furnace out of fuel")
  1379. swap_node(pos,"default:furnace")
  1380. meta:set_string("formspec", default.furnace_inactive_formspec)
  1381. return
  1382. end
  1383. if cooked.item:is_empty() then
  1384. if was_active then
  1385. meta:set_string("infotext","Furnace is empty")
  1386. swap_node(pos,"default:furnace")
  1387. meta:set_string("formspec", default.furnace_inactive_formspec)
  1388. end
  1389. return
  1390. end
  1391. meta:set_string("fuel_totaltime", fuel.time)
  1392. meta:set_string("fuel_time", 0)
  1393. local stack = inv:get_stack("fuel", 1)
  1394. stack:take_item()
  1395. inv:set_stack("fuel", 1, stack)
  1396. end,
  1397. })
  1398. minetest.register_node("default:cobble", {
  1399. description = "Cobble",
  1400. tiles ={"default_cobble.png"},
  1401. is_ground_content = false,
  1402. groups = {cracky=3},
  1403. sounds = default.node_sound_stone_defaults(),
  1404. })
  1405. minetest.register_node("default:mossycobble", {
  1406. description = "Mossy Cobble",
  1407. tiles ={"default_mossycobble.png"},
  1408. is_ground_content = false,
  1409. groups = {cracky=3},
  1410. sounds = default.node_sound_stone_defaults(),
  1411. })
  1412. minetest.register_node("default:steelblock", {
  1413. description = "Steel Block",
  1414. tiles ={"default_steel_block.png"},
  1415. is_ground_content = false,
  1416. groups = {snappy=1,bendy=2},
  1417. sounds = default.node_sound_stone_defaults(),
  1418. })
  1419. minetest.register_node("default:nyancat", {
  1420. description = "Nyancat",
  1421. tiles ={"default_nc_side.png", "default_nc_side.png", "default_nc_side.png",
  1422. "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"},
  1423. inventory_image = "default_nc_front.png",
  1424. paramtype2 = "facedir",
  1425. groups = {cracky=2},
  1426. legacy_facedir_simple = true,
  1427. is_ground_content = false,
  1428. sounds = default.node_sound_defaults(),
  1429. })
  1430. minetest.register_node("default:nyancat_rainbow", {
  1431. description = "Nyancat Rainbow",
  1432. tiles ={"default_nc_rb.png"},
  1433. inventory_image = "default_nc_rb.png",
  1434. is_ground_content = false,
  1435. groups = {cracky=2},
  1436. sounds = default.node_sound_defaults(),
  1437. })
  1438. minetest.register_node("default:sapling", {
  1439. description = "Sapling",
  1440. drawtype = "plantlike",
  1441. visual_scale = 1.0,
  1442. tiles ={"default_sapling.png"},
  1443. inventory_image = "default_sapling.png",
  1444. wield_image = "default_sapling.png",
  1445. paramtype = "light",
  1446. walkable = false,
  1447. groups = {snappy=2,dig_immediate=3,attached_node=1},
  1448. sounds = default.node_sound_defaults(),
  1449. })
  1450. minetest.register_node("default:apple", {
  1451. description = "Apple",
  1452. drawtype = "plantlike",
  1453. visual_scale = 1.0,
  1454. tiles ={"default_apple.png"},
  1455. inventory_image = "default_apple.png",
  1456. paramtype = "light",
  1457. is_ground_content = false,
  1458. sunlight_propagates = true,
  1459. walkable = false,
  1460. groups = {fleshy=3,dig_immediate=3},
  1461. on_use = minetest.item_eat(4),
  1462. sounds = default.node_sound_defaults(),
  1463. })
  1464. --
  1465. -- Grow tree function
  1466. --
  1467. local c_air = minetest.get_content_id("air")
  1468. local c_ignore = minetest.get_content_id("ignore")
  1469. local c_tree = minetest.get_content_id("default:tree")
  1470. local c_leaves = minetest.get_content_id("default:leaves")
  1471. local c_apple = minetest.get_content_id("default:apple")
  1472. function default.grow_tree(data, a, pos, is_apple_tree, seed)
  1473. --[[
  1474. NOTE: Tree-placing code is currently duplicated in the engine
  1475. and in games that have saplings; both are deprecated but not
  1476. replaced yet
  1477. ]]--
  1478. local pr = PseudoRandom(seed)
  1479. local th = pr:next(4, 5)
  1480. local x, y, z = pos.x, pos.y, pos.z
  1481. for yy = y, y+th-1 do
  1482. local vi = a:index(x, yy, z)
  1483. if a:contains(x, yy, z) and (data[vi] == c_air or yy == y) then
  1484. data[vi] = c_tree
  1485. end
  1486. end
  1487. y = y+th-1 -- (x, y, z) is now last piece of trunk
  1488. local leaves_a = VoxelArea:new{MinEdge={x=-2, y=-1, z=-2}, MaxEdge={x=2, y=2, z=2}}
  1489. local leaves_buffer = {}
  1490. -- Force leaves near the trunk
  1491. local d = 1
  1492. for xi = -d, d do
  1493. for yi = -d, d do
  1494. for zi = -d, d do
  1495. leaves_buffer[leaves_a:index(xi, yi, zi)] = true
  1496. end
  1497. end
  1498. end
  1499. -- Add leaves randomly
  1500. for iii = 1, 8 do
  1501. local d = 1
  1502. local xx = pr:next(leaves_a.MinEdge.x, leaves_a.MaxEdge.x - d)
  1503. local yy = pr:next(leaves_a.MinEdge.y, leaves_a.MaxEdge.y - d)
  1504. local zz = pr:next(leaves_a.MinEdge.z, leaves_a.MaxEdge.z - d)
  1505. for xi = 0, d do
  1506. for yi = 0, d do
  1507. for zi = 0, d do
  1508. leaves_buffer[leaves_a:index(xx+xi, yy+yi, zz+zi)] = true
  1509. end
  1510. end
  1511. end
  1512. end
  1513. -- Add the leaves
  1514. for xi = leaves_a.MinEdge.x, leaves_a.MaxEdge.x do
  1515. for yi = leaves_a.MinEdge.y, leaves_a.MaxEdge.y do
  1516. for zi = leaves_a.MinEdge.z, leaves_a.MaxEdge.z do
  1517. if a:contains(x+xi, y+yi, z+zi) then
  1518. local vi = a:index(x+xi, y+yi, z+zi)
  1519. if data[vi] == c_air or data[vi] == c_ignore then
  1520. if leaves_buffer[leaves_a:index(xi, yi, zi)] then
  1521. if is_apple_tree and pr:next(1, 100) <= 10 then
  1522. data[vi] = c_apple
  1523. else
  1524. data[vi] = c_leaves
  1525. end
  1526. end
  1527. end
  1528. end
  1529. end
  1530. end
  1531. end
  1532. end
  1533. --
  1534. -- ABMs
  1535. --
  1536. minetest.register_abm({
  1537. nodenames = {"default:sapling"},
  1538. interval = 10,
  1539. chance = 50,
  1540. action = function(pos, node)
  1541. if minetest.get_item_group(minetest.get_node(
  1542. {x = pos.x, y = pos.y - 1, z = pos.z}).name, "soil") == 0 then
  1543. return
  1544. end
  1545. print("A sapling grows into a tree at "..minetest.pos_to_string(pos))
  1546. local vm = minetest.get_voxel_manip()
  1547. local minp, maxp = vm:read_from_map({x=pos.x-16, y=pos.y, z=pos.z-16}, {x=pos.x+16, y=pos.y+16, z=pos.z+16})
  1548. local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp}
  1549. local data = vm:get_data()
  1550. default.grow_tree(data, a, pos, math.random(1, 4) == 1, math.random(1,100000))
  1551. vm:set_data(data)
  1552. vm:write_to_map(data)
  1553. vm:update_map()
  1554. end
  1555. })
  1556. minetest.register_abm({
  1557. nodenames = {"default:dirt"},
  1558. interval = 2,
  1559. chance = 200,
  1560. action = function(pos, node)
  1561. local above = {x=pos.x, y=pos.y+1, z=pos.z}
  1562. local name = minetest.get_node(above).name
  1563. local nodedef = minetest.registered_nodes[name]
  1564. if nodedef and (nodedef.sunlight_propagates or nodedef.paramtype == "light")
  1565. and nodedef.liquidtype == "none"
  1566. and (minetest.get_node_light(above) or 0) >= 13 then
  1567. if name == "default:snow" or name == "default:snowblock" then
  1568. minetest.set_node(pos, {name = "default:dirt_with_snow"})
  1569. else
  1570. minetest.set_node(pos, {name = "default:dirt_with_grass"})
  1571. end
  1572. end
  1573. end
  1574. })
  1575. minetest.register_abm({
  1576. nodenames = {"default:dirt_with_grass"},
  1577. interval = 2,
  1578. chance = 20,
  1579. action = function(pos, node)
  1580. local above = {x=pos.x, y=pos.y+1, z=pos.z}
  1581. local name = minetest.get_node(above).name
  1582. local nodedef = minetest.registered_nodes[name]
  1583. if name ~= "ignore" and nodedef
  1584. and not ((nodedef.sunlight_propagates or nodedef.paramtype == "light")
  1585. and nodedef.liquidtype == "none") then
  1586. minetest.set_node(pos, {name = "default:dirt"})
  1587. end
  1588. end
  1589. })
  1590. --
  1591. -- Crafting items
  1592. --
  1593. minetest.register_craftitem("default:stick", {
  1594. description = "Stick",
  1595. inventory_image = "default_stick.png",
  1596. })
  1597. minetest.register_craftitem("default:paper", {
  1598. description = "Paper",
  1599. inventory_image = "default_paper.png",
  1600. })
  1601. minetest.register_craftitem("default:book", {
  1602. description = "Book",
  1603. inventory_image = "default_book.png",
  1604. })
  1605. minetest.register_craftitem("default:coal_lump", {
  1606. description = "Lump of coal",
  1607. inventory_image = "default_coal_lump.png",
  1608. })
  1609. minetest.register_craftitem("default:iron_lump", {
  1610. description = "Lump of iron",
  1611. inventory_image = "default_iron_lump.png",
  1612. })
  1613. minetest.register_craftitem("default:clay_lump", {
  1614. description = "Lump of clay",
  1615. inventory_image = "default_clay_lump.png",
  1616. })
  1617. minetest.register_craftitem("default:steel_ingot", {
  1618. description = "Steel ingot",
  1619. inventory_image = "default_steel_ingot.png",
  1620. })
  1621. minetest.register_craftitem("default:clay_brick", {
  1622. description = "Clay brick",
  1623. inventory_image = "default_steel_ingot.png",
  1624. inventory_image = "default_clay_brick.png",
  1625. })
  1626. minetest.register_craftitem("default:scorched_stuff", {
  1627. description = "Scorched stuff",
  1628. inventory_image = "default_scorched_stuff.png",
  1629. })
  1630. --
  1631. -- Support old code
  1632. --
  1633. function default.spawn_falling_node(p, nodename)
  1634. spawn_falling_node(p, nodename)
  1635. end
  1636. -- Horrible crap to support old code
  1637. -- Don't use this and never do what this does, it's completely wrong!
  1638. -- (More specifically, the client and the C++ code doesn't get the group)
  1639. function default.register_falling_node(nodename, texture)
  1640. minetest.log("error", debug.traceback())
  1641. minetest.log('error', "WARNING: default.register_falling_node is deprecated")
  1642. if minetest.registered_nodes[nodename] then
  1643. minetest.registered_nodes[nodename].groups.falling_node = 1
  1644. end
  1645. end
  1646. --
  1647. -- Global callbacks
  1648. --
  1649. -- Global environment step function
  1650. function on_step(dtime)
  1651. -- print("on_step")
  1652. end
  1653. minetest.register_globalstep(on_step)
  1654. function on_placenode(p, node)
  1655. --print("on_placenode")
  1656. end
  1657. minetest.register_on_placenode(on_placenode)
  1658. function on_dignode(p, node)
  1659. --print("on_dignode")
  1660. end
  1661. minetest.register_on_dignode(on_dignode)
  1662. function on_punchnode(p, node)
  1663. end
  1664. minetest.register_on_punchnode(on_punchnode)
  1665. --
  1666. -- Test some things
  1667. --
  1668. local function test_get_craft_result()
  1669. minetest.log("info", "test_get_craft_result()")
  1670. -- normal
  1671. local input = {
  1672. method = "normal",
  1673. width = 2,
  1674. items = {"", "default:coal_lump", "", "default:stick"}
  1675. }
  1676. minetest.log("info", "torch crafting input: "..dump(input))
  1677. local output, decremented_input = minetest.get_craft_result(input)
  1678. minetest.log("info", "torch crafting output: "..dump(output))
  1679. minetest.log("info", "torch crafting decremented input: "..dump(decremented_input))
  1680. assert(output.item)
  1681. minetest.log("info", "torch crafting output.item:to_table(): "..dump(output.item:to_table()))
  1682. assert(output.item:get_name() == "default:torch")
  1683. assert(output.item:get_count() == 4)
  1684. -- fuel
  1685. local input = {
  1686. method = "fuel",
  1687. width = 1,
  1688. items = {"default:coal_lump"}
  1689. }
  1690. minetest.log("info", "coal fuel input: "..dump(input))
  1691. local output, decremented_input = minetest.get_craft_result(input)
  1692. minetest.log("info", "coal fuel output: "..dump(output))
  1693. minetest.log("info", "coal fuel decremented input: "..dump(decremented_input))
  1694. assert(output.time)
  1695. assert(output.time > 0)
  1696. -- cook
  1697. local input = {
  1698. method = "cooking",
  1699. width = 1,
  1700. items = {"default:cobble"}
  1701. }
  1702. minetest.log("info", "cobble cooking input: "..dump(output))
  1703. local output, decremented_input = minetest.get_craft_result(input)
  1704. minetest.log("info", "cobble cooking output: "..dump(output))
  1705. minetest.log("info", "cobble cooking decremented input: "..dump(decremented_input))
  1706. assert(output.time)
  1707. assert(output.time > 0)
  1708. assert(output.item)
  1709. minetest.log("info", "cobble cooking output.item:to_table(): "..dump(output.item:to_table()))
  1710. assert(output.item:get_name() == "default:stone")
  1711. assert(output.item:get_count() == 1)
  1712. end
  1713. test_get_craft_result()
  1714. --
  1715. -- Done, print some random stuff
  1716. --
  1717. --print("minetest.registered_entities:")
  1718. --dump2(minetest.registered_entities)
  1719. -- END