builtin.lua 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869
  1. --
  2. -- This file contains built-in stuff in Minetest implemented in Lua.
  3. --
  4. -- It is always loaded and executed after registration of the C API,
  5. -- before loading and running any mods.
  6. --
  7. function basic_dump2(o)
  8. if type(o) == "number" then
  9. return tostring(o)
  10. elseif type(o) == "string" then
  11. return string.format("%q", o)
  12. elseif type(o) == "boolean" then
  13. return tostring(o)
  14. elseif type(o) == "function" then
  15. return "<function>"
  16. elseif type(o) == "userdata" then
  17. return "<userdata>"
  18. elseif type(o) == "nil" then
  19. return "nil"
  20. else
  21. error("cannot dump a " .. type(o))
  22. return nil
  23. end
  24. end
  25. function dump2(o, name, dumped)
  26. name = name or "_"
  27. dumped = dumped or {}
  28. io.write(name, " = ")
  29. if type(o) == "number" or type(o) == "string" or type(o) == "boolean"
  30. or type(o) == "function" or type(o) == "nil"
  31. or type(o) == "userdata" then
  32. io.write(basic_dump2(o), "\n")
  33. elseif type(o) == "table" then
  34. if dumped[o] then
  35. io.write(dumped[o], "\n")
  36. else
  37. dumped[o] = name
  38. io.write("{}\n") -- new table
  39. for k,v in pairs(o) do
  40. local fieldname = string.format("%s[%s]", name, basic_dump2(k))
  41. dump2(v, fieldname, dumped)
  42. end
  43. end
  44. else
  45. error("cannot dump a " .. type(o))
  46. return nil
  47. end
  48. end
  49. function dump(o, dumped)
  50. dumped = dumped or {}
  51. if type(o) == "number" then
  52. return tostring(o)
  53. elseif type(o) == "string" then
  54. return string.format("%q", o)
  55. elseif type(o) == "table" then
  56. if dumped[o] then
  57. return "<circular reference>"
  58. end
  59. dumped[o] = true
  60. local t = {}
  61. for k,v in pairs(o) do
  62. t[#t+1] = "" .. k .. " = " .. dump(v, dumped)
  63. end
  64. return "{" .. table.concat(t, ", ") .. "}"
  65. elseif type(o) == "boolean" then
  66. return tostring(o)
  67. elseif type(o) == "function" then
  68. return "<function>"
  69. elseif type(o) == "userdata" then
  70. return "<userdata>"
  71. elseif type(o) == "nil" then
  72. return "nil"
  73. else
  74. error("cannot dump a " .. type(o))
  75. return nil
  76. end
  77. end
  78. --
  79. -- Item definition helpers
  80. --
  81. function minetest.inventorycube(img1, img2, img3)
  82. img2 = img2 or img1
  83. img3 = img3 or img1
  84. return "[inventorycube"
  85. .. "{" .. img1:gsub("%^", "&")
  86. .. "{" .. img2:gsub("%^", "&")
  87. .. "{" .. img3:gsub("%^", "&")
  88. end
  89. function minetest.pos_to_string(pos)
  90. return "(" .. pos.x .. "," .. pos.y .. "," .. pos.z .. ")"
  91. end
  92. function minetest.get_pointed_thing_position(pointed_thing, above)
  93. if pointed_thing.type == "node" then
  94. if above then
  95. -- The position where a node would be placed
  96. return pointed_thing.above
  97. else
  98. -- The position where a node would be dug
  99. return pointed_thing.under
  100. end
  101. elseif pointed_thing.type == "object" then
  102. obj = pointed.thing.ref
  103. if obj ~= nil then
  104. return obj:getpos()
  105. else
  106. return nil
  107. end
  108. else
  109. return nil
  110. end
  111. end
  112. function minetest.dir_to_facedir(dir)
  113. if math.abs(dir.x) > math.abs(dir.z) then
  114. if dir.x < 0 then
  115. return 3
  116. else
  117. return 1
  118. end
  119. else
  120. if dir.z < 0 then
  121. return 2
  122. else
  123. return 0
  124. end
  125. end
  126. end
  127. function minetest.dir_to_wallmounted(dir)
  128. if math.abs(dir.y) > math.max(math.abs(dir.x), math.abs(dir.z)) then
  129. if dir.y < 0 then
  130. return 1
  131. else
  132. return 0
  133. end
  134. elseif math.abs(dir.x) > math.abs(dir.z) then
  135. if dir.x < 0 then
  136. return 3
  137. else
  138. return 2
  139. end
  140. else
  141. if dir.z < 0 then
  142. return 5
  143. else
  144. return 4
  145. end
  146. end
  147. end
  148. function minetest.get_node_drops(nodename, toolname)
  149. local drop = ItemStack({name=nodename}):get_definition().drop
  150. if drop == nil then
  151. -- default drop
  152. return {ItemStack({name=nodename})}
  153. elseif type(drop) == "string" then
  154. -- itemstring drop
  155. return {ItemStack(drop)}
  156. elseif drop.items == nil then
  157. -- drop = {} to disable default drop
  158. return {}
  159. end
  160. -- Extended drop table
  161. local got_items = {}
  162. local got_count = 0
  163. local _, item, tool
  164. for _, item in ipairs(drop.items) do
  165. local good_rarity = true
  166. local good_tool = true
  167. if item.rarity ~= nil then
  168. good_rarity = item.rarity < 1 or math.random(item.rarity) == 1
  169. end
  170. if item.tools ~= nil then
  171. good_tool = false
  172. for _, tool in ipairs(item.tools) do
  173. if tool:sub(1, 1) == '~' then
  174. good_tool = toolname:find(tool:sub(2)) ~= nil
  175. else
  176. good_tool = toolname == tool
  177. end
  178. if good_tool then
  179. break
  180. end
  181. end
  182. end
  183. if good_rarity and good_tool then
  184. got_count = got_count + 1
  185. for _, add_item in ipairs(item.items) do
  186. got_items[#got_items+1] = add_item
  187. end
  188. if drop.max_items ~= nil and got_count == drop.max_items then
  189. break
  190. end
  191. end
  192. end
  193. return got_items
  194. end
  195. function minetest.item_place_node(itemstack, placer, pointed_thing)
  196. local item = itemstack:peek_item()
  197. local def = itemstack:get_definition()
  198. if def.type == "node" and pointed_thing.type == "node" then
  199. local pos = pointed_thing.above
  200. local oldnode = minetest.env:get_node(pos)
  201. local olddef = ItemStack({name=oldnode.name}):get_definition()
  202. if not olddef.buildable_to then
  203. minetest.log("info", placer:get_player_name() .. " tried to place"
  204. .. " node in invalid position " .. minetest.pos_to_string(pos)
  205. .. ", replacing " .. oldnode.name)
  206. return
  207. end
  208. minetest.log("action", placer:get_player_name() .. " places node "
  209. .. def.name .. " at " .. minetest.pos_to_string(pos))
  210. local newnode = {name = def.name, param1 = 0, param2 = 0}
  211. -- Calculate direction for wall mounted stuff like torches and signs
  212. if def.paramtype2 == 'wallmounted' then
  213. local under = pointed_thing.under
  214. local above = pointed_thing.above
  215. local dir = {x = under.x - above.x, y = under.y - above.y, z = under.z - above.z}
  216. newnode.param2 = minetest.dir_to_wallmounted(dir)
  217. -- Calculate the direction for furnaces and chests and stuff
  218. elseif def.paramtype2 == 'facedir' then
  219. local playerpos = placer:getpos()
  220. local dir = {x = pos.x - playerpos.x, y = pos.y - playerpos.y, z = pos.z - playerpos.z}
  221. newnode.param2 = minetest.dir_to_facedir(dir)
  222. minetest.log("action", "facedir: " .. newnode.param2)
  223. end
  224. -- Add node and update
  225. minetest.env:add_node(pos, newnode)
  226. -- Set metadata owner
  227. if def.metadata_name ~= "" then
  228. minetest.env:get_meta(pos):set_owner(placer:get_player_name())
  229. end
  230. -- Run script hook
  231. local _, callback
  232. for _, callback in ipairs(minetest.registered_on_placenodes) do
  233. callback(pos, newnode, placer)
  234. end
  235. itemstack:take_item()
  236. end
  237. return itemstack
  238. end
  239. function minetest.item_place_object(itemstack, placer, pointed_thing)
  240. local pos = minetest.get_pointed_thing_position(pointed_thing, true)
  241. if pos ~= nil then
  242. local item = itemstack:take_item()
  243. minetest.env:add_item(pos, item)
  244. end
  245. return itemstack
  246. end
  247. function minetest.item_place(itemstack, placer, pointed_thing)
  248. if itemstack:get_definition().type == "node" then
  249. return minetest.item_place_node(itemstack, placer, pointed_thing)
  250. else
  251. return minetest.item_place_object(itemstack, placer, pointed_thing)
  252. end
  253. end
  254. function minetest.item_drop(itemstack, dropper, pos)
  255. minetest.env:add_item(pos, itemstack)
  256. return ""
  257. end
  258. function minetest.item_eat(hp_change, replace_with_item)
  259. return function(itemstack, user, pointed_thing) -- closure
  260. if itemstack:take_item() ~= nil then
  261. user:set_hp(user:get_hp() + hp_change)
  262. itemstack:add_item(replace_with_item) -- note: replace_with_item is optional
  263. end
  264. return itemstack
  265. end
  266. end
  267. function minetest.node_punch(pos, node, puncher)
  268. -- Run script hook
  269. local _, callback
  270. for _, callback in ipairs(minetest.registered_on_punchnodes) do
  271. callback(pos, node, puncher)
  272. end
  273. end
  274. function minetest.node_dig(pos, node, digger)
  275. minetest.debug("node_dig")
  276. local def = ItemStack({name=node.name}):get_definition()
  277. if not def.diggable then
  278. minetest.debug("not diggable")
  279. minetest.log("info", digger:get_player_name() .. " tried to dig "
  280. .. node.name .. " which is not diggable "
  281. .. minetest.pos_to_string(pos))
  282. return
  283. end
  284. local meta = minetest.env:get_meta(pos)
  285. if meta ~= nil and not meta:get_allow_removal() then
  286. minetest.debug("dig prevented by metadata")
  287. minetest.log("info", digger:get_player_name() .. " tried to dig "
  288. .. node.name .. ", but removal is disabled by metadata "
  289. .. minetest.pos_to_string(pos))
  290. return
  291. end
  292. minetest.log('action', digger:get_player_name() .. " digs "
  293. .. node.name .. " at " .. minetest.pos_to_string(pos))
  294. if not minetest.setting_getbool("creative_mode") then
  295. local wielded = digger:get_wielded_item()
  296. local drops = minetest.get_node_drops(node.name, wielded:get_name())
  297. -- Wear out tool
  298. mp = def.material
  299. tp = wielded:get_tool_digging_properties()
  300. dp = minetest.get_digging_properties(mp, tp)
  301. wielded:add_wear(dp.wear)
  302. digger:set_wielded_item(wielded)
  303. -- Add dropped items
  304. local _, dropped_item
  305. for _, dropped_item in ipairs(drops) do
  306. digger:get_inventory():add_item("main", dropped_item)
  307. end
  308. end
  309. -- Remove node and update
  310. minetest.env:remove_node(pos)
  311. -- Run script hook
  312. local _, callback
  313. for _, callback in ipairs(minetest.registered_on_dignodes) do
  314. callback(pos, node, digger)
  315. end
  316. end
  317. --
  318. -- Item definition defaults
  319. --
  320. minetest.nodedef_default = {
  321. -- Item properties
  322. type="node",
  323. -- name intentionally not defined here
  324. description = "",
  325. inventory_image = "",
  326. wield_image = "",
  327. wield_scale = {x=1,y=1,z=1},
  328. stack_max = 99,
  329. usable = false,
  330. liquids_pointable = false,
  331. tool_digging_properties = nil,
  332. -- Interaction callbacks
  333. on_place = minetest.item_place,
  334. on_drop = minetest.item_drop,
  335. on_use = nil,
  336. on_punch = minetest.node_punch,
  337. on_dig = minetest.node_dig,
  338. -- Node properties
  339. drawtype = "normal",
  340. visual_scale = 1.0,
  341. tile_images = {""},
  342. special_materials = {
  343. {image="", backface_culling=true},
  344. {image="", backface_culling=true},
  345. },
  346. alpha = 255,
  347. post_effect_color = {a=0, r=0, g=0, b=0},
  348. paramtype = "none",
  349. paramtype2 = "none",
  350. is_ground_content = false,
  351. sunlight_propagates = false,
  352. walkable = true,
  353. pointable = true,
  354. diggable = true,
  355. climbable = false,
  356. buildable_to = false,
  357. metadata_name = "",
  358. liquidtype = "none",
  359. liquid_alternative_flowing = "",
  360. liquid_alternative_source = "",
  361. liquid_viscosity = 0,
  362. light_source = 0,
  363. damage_per_second = 0,
  364. selection_box = {type="regular"},
  365. material = {
  366. diggablity = "normal",
  367. weight = 0,
  368. crackiness = 0,
  369. crumbliness = 0,
  370. cuttability = 0,
  371. flammability = 0,
  372. },
  373. legacy_facedir_simple = false,
  374. legacy_wallmounted = false,
  375. }
  376. minetest.craftitemdef_default = {
  377. type="craft",
  378. -- name intentionally not defined here
  379. description = "",
  380. inventory_image = "",
  381. wield_image = "",
  382. wield_scale = {x=1,y=1,z=1},
  383. stack_max = 99,
  384. liquids_pointable = false,
  385. tool_digging_properties = nil,
  386. -- Interaction callbacks
  387. on_place = minetest.item_place,
  388. on_drop = minetest.item_drop,
  389. on_use = nil,
  390. }
  391. minetest.tooldef_default = {
  392. type="tool",
  393. -- name intentionally not defined here
  394. description = "",
  395. inventory_image = "",
  396. wield_image = "",
  397. wield_scale = {x=1,y=1,z=1},
  398. stack_max = 1,
  399. liquids_pointable = false,
  400. tool_digging_properties = nil,
  401. -- Interaction callbacks
  402. on_place = minetest.item_place,
  403. on_drop = minetest.item_drop,
  404. on_use = nil,
  405. }
  406. minetest.noneitemdef_default = { -- This is used for the hand and unknown items
  407. type="none",
  408. -- name intentionally not defined here
  409. description = "",
  410. inventory_image = "",
  411. wield_image = "",
  412. wield_scale = {x=1,y=1,z=1},
  413. stack_max = 99,
  414. liquids_pointable = false,
  415. tool_digging_properties = nil,
  416. -- Interaction callbacks
  417. on_place = nil,
  418. on_drop = nil,
  419. on_use = nil,
  420. }
  421. --
  422. -- Make raw registration functions inaccessible to anyone except builtin.lua
  423. --
  424. local register_item_raw = minetest.register_item_raw
  425. minetest.register_item_raw = nil
  426. local register_alias_raw = minetest.register_alias_raw
  427. minetest.register_item_raw = nil
  428. --
  429. -- Item / entity / ABM registration functions
  430. --
  431. minetest.registered_abms = {}
  432. minetest.registered_entities = {}
  433. minetest.registered_items = {}
  434. minetest.registered_nodes = {}
  435. minetest.registered_craftitems = {}
  436. minetest.registered_tools = {}
  437. minetest.registered_aliases = {}
  438. -- For tables that are indexed by item name:
  439. -- If table[X] does not exist, default to table[minetest.registered_aliases[X]]
  440. local function set_alias_metatable(table)
  441. setmetatable(table, {
  442. __index = function(name)
  443. return rawget(table, minetest.registered_aliases[name])
  444. end
  445. })
  446. end
  447. set_alias_metatable(minetest.registered_items)
  448. set_alias_metatable(minetest.registered_nodes)
  449. set_alias_metatable(minetest.registered_craftitems)
  450. set_alias_metatable(minetest.registered_tools)
  451. -- These item names may not be used because they would interfere
  452. -- with legacy itemstrings
  453. local forbidden_item_names = {
  454. MaterialItem = true,
  455. MaterialItem2 = true,
  456. MaterialItem3 = true,
  457. NodeItem = true,
  458. node = true,
  459. CraftItem = true,
  460. craft = true,
  461. MBOItem = true,
  462. ToolItem = true,
  463. tool = true,
  464. }
  465. local function check_modname_prefix(name)
  466. if name:sub(1,1) == ":" then
  467. -- Escape the modname prefix enforcement mechanism
  468. return name:sub(2)
  469. else
  470. -- Modname prefix enforcement
  471. local expected_prefix = minetest.get_current_modname() .. ":"
  472. if name:sub(1, #expected_prefix) ~= expected_prefix then
  473. error("Name " .. name .. " does not follow naming conventions: " ..
  474. "\"modname:\" or \":\" prefix required")
  475. end
  476. local subname = name:sub(#expected_prefix+1)
  477. if subname:find("[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]") then
  478. error("Name " .. name .. " does not follow naming conventions: " ..
  479. "contains unallowed characters")
  480. end
  481. return name
  482. end
  483. end
  484. function minetest.register_abm(spec)
  485. -- Add to minetest.registered_abms
  486. minetest.registered_abms[#minetest.registered_abms+1] = spec
  487. end
  488. function minetest.register_entity(name, prototype)
  489. -- Check name
  490. if name == nil then
  491. error("Unable to register entity: Name is nil")
  492. end
  493. name = check_modname_prefix(tostring(name))
  494. prototype.name = name
  495. prototype.__index = prototype -- so that it can be used as a metatable
  496. -- Add to minetest.registered_entities
  497. minetest.registered_entities[name] = prototype
  498. end
  499. function minetest.register_item(name, itemdef)
  500. -- Check name
  501. if name == nil then
  502. error("Unable to register item: Name is nil")
  503. end
  504. name = check_modname_prefix(tostring(name))
  505. if forbidden_item_names[name] then
  506. error("Unable to register item: Name is forbidden: " .. name)
  507. end
  508. itemdef.name = name
  509. -- Apply defaults and add to registered_* table
  510. if itemdef.type == "node" then
  511. setmetatable(itemdef, {__index = minetest.nodedef_default})
  512. minetest.registered_nodes[itemdef.name] = itemdef
  513. elseif itemdef.type == "craft" then
  514. setmetatable(itemdef, {__index = minetest.craftitemdef_default})
  515. minetest.registered_craftitems[itemdef.name] = itemdef
  516. elseif itemdef.type == "tool" then
  517. setmetatable(itemdef, {__index = minetest.tooldef_default})
  518. minetest.registered_tools[itemdef.name] = itemdef
  519. elseif itemdef.type == "none" then
  520. setmetatable(itemdef, {__index = minetest.noneitemdef_default})
  521. else
  522. error("Unable to register item: Type is invalid: " .. dump(itemdef))
  523. end
  524. -- Flowing liquid uses param2
  525. if itemdef.type == "node" and itemdef.liquidtype == "flowing" then
  526. itemdef.paramtype2 = "flowingliquid"
  527. end
  528. -- BEGIN Legacy stuff
  529. if itemdef.cookresult_itemstring ~= nil and itemdef.cookresult_itemstring ~= "" then
  530. minetest.register_craft({
  531. type="cooking",
  532. output=itemdef.cookresult_itemstring,
  533. recipe=itemdef.name,
  534. cooktime=itemdef.furnace_cooktime
  535. })
  536. end
  537. if itemdef.furnace_burntime ~= nil and itemdef.furnace_burntime >= 0 then
  538. minetest.register_craft({
  539. type="fuel",
  540. recipe=itemdef.name,
  541. burntime=itemdef.furnace_burntime
  542. })
  543. end
  544. -- END Legacy stuff
  545. -- Disable all further modifications
  546. getmetatable(itemdef).__newindex = {}
  547. --minetest.log("Registering item: " .. itemdef.name)
  548. minetest.registered_items[itemdef.name] = itemdef
  549. minetest.registered_aliases[itemdef.name] = nil
  550. register_item_raw(itemdef)
  551. end
  552. function minetest.register_node(name, nodedef)
  553. nodedef.type = "node"
  554. minetest.register_item(name, nodedef)
  555. end
  556. function minetest.register_craftitem(name, craftitemdef)
  557. craftitemdef.type = "craft"
  558. -- BEGIN Legacy stuff
  559. if craftitemdef.inventory_image == nil and craftitemdef.image ~= nil then
  560. craftitemdef.inventory_image = craftitemdef.image
  561. end
  562. -- END Legacy stuff
  563. minetest.register_item(name, craftitemdef)
  564. end
  565. function minetest.register_tool(name, tooldef)
  566. tooldef.type = "tool"
  567. tooldef.stack_max = 1
  568. -- BEGIN Legacy stuff
  569. if tooldef.inventory_image == nil and tooldef.image ~= nil then
  570. tooldef.inventory_image = tooldef.image
  571. end
  572. if tooldef.tool_digging_properties == nil and
  573. (tooldef.full_punch_interval ~= nil or
  574. tooldef.basetime ~= nil or
  575. tooldef.dt_weight ~= nil or
  576. tooldef.dt_crackiness ~= nil or
  577. tooldef.dt_crumbliness ~= nil or
  578. tooldef.dt_cuttability ~= nil or
  579. tooldef.basedurability ~= nil or
  580. tooldef.dd_weight ~= nil or
  581. tooldef.dd_crackiness ~= nil or
  582. tooldef.dd_crumbliness ~= nil or
  583. tooldef.dd_cuttability ~= nil) then
  584. tooldef.tool_digging_properties = {
  585. full_punch_interval = tooldef.full_punch_interval,
  586. basetime = tooldef.basetime,
  587. dt_weight = tooldef.dt_weight,
  588. dt_crackiness = tooldef.dt_crackiness,
  589. dt_crumbliness = tooldef.dt_crumbliness,
  590. dt_cuttability = tooldef.dt_cuttability,
  591. basedurability = tooldef.basedurability,
  592. dd_weight = tooldef.dd_weight,
  593. dd_crackiness = tooldef.dd_crackiness,
  594. dd_crumbliness = tooldef.dd_crumbliness,
  595. dd_cuttability = tooldef.dd_cuttability,
  596. }
  597. end
  598. -- END Legacy stuff
  599. minetest.register_item(name, tooldef)
  600. end
  601. function minetest.register_alias(name, convert_to)
  602. if forbidden_item_names[name] then
  603. error("Unable to register alias: Name is forbidden: " .. name)
  604. end
  605. if minetest.registered_items[name] ~= nil then
  606. minetest.log("WARNING: Not registering alias, item with same name" ..
  607. " is already defined: " .. name .. " -> " .. convert_to)
  608. else
  609. --minetest.log("Registering alias: " .. name .. " -> " .. convert_to)
  610. minetest.registered_aliases[name] = convert_to
  611. register_alias_raw(name, convert_to)
  612. end
  613. end
  614. -- Alias the forbidden item names to "" so they can't be
  615. -- created via itemstrings (e.g. /give)
  616. local name
  617. for name in pairs(forbidden_item_names) do
  618. minetest.registered_aliases[name] = ""
  619. register_alias_raw(name, "")
  620. end
  621. -- Deprecated:
  622. -- Aliases for minetest.register_alias (how ironic...)
  623. --minetest.alias_node = minetest.register_alias
  624. --minetest.alias_tool = minetest.register_alias
  625. --minetest.alias_craftitem = minetest.register_alias
  626. --
  627. -- Built-in node definitions. Also defined in C.
  628. --
  629. minetest.register_item(":", {
  630. type = "none",
  631. wield_image = "wieldhand.png",
  632. wield_scale = {x=1,y=1,z=2.5},
  633. tool_digging_properties = {
  634. full_punch_interval = 2.0,
  635. basetime = 0.5,
  636. dt_weight = 1,
  637. dt_crackiness = 0,
  638. dt_crumbliness = -1,
  639. dt_cuttability = 0,
  640. basedurability = 50,
  641. dd_weight = 0,
  642. dd_crackiness = 0,
  643. dd_crumbliness = 0,
  644. dd_cuttability = 0,
  645. }
  646. })
  647. minetest.register_item(":unknown", {
  648. type = "none",
  649. description = "Unknown Item",
  650. inventory_image = "unknown_item.png",
  651. on_place = minetest.item_place,
  652. on_drop = minetest.item_drop,
  653. })
  654. minetest.register_node(":air", {
  655. description = "Air (you hacker you!)",
  656. inventory_image = "unknown_block.png",
  657. wield_image = "unknown_block.png",
  658. drawtype = "airlike",
  659. paramtype = "light",
  660. sunlight_propagates = true,
  661. walkable = false,
  662. pointable = false,
  663. diggable = false,
  664. buildable_to = true,
  665. air_equivalent = true,
  666. })
  667. minetest.register_node(":ignore", {
  668. description = "Ignore (you hacker you!)",
  669. inventory_image = "unknown_block.png",
  670. wield_image = "unknown_block.png",
  671. drawtype = "airlike",
  672. paramtype = "none",
  673. sunlight_propagates = false,
  674. walkable = false,
  675. pointable = false,
  676. diggable = false,
  677. buildable_to = true, -- A way to remove accidentally placed ignores
  678. air_equivalent = true,
  679. })
  680. --
  681. -- Default material types
  682. --
  683. function minetest.digprop_constanttime(time)
  684. return {
  685. diggability = "constant",
  686. constant_time = time,
  687. }
  688. end
  689. function minetest.digprop_stonelike(toughness)
  690. return {
  691. diggablity = "normal",
  692. weight = toughness * 5,
  693. crackiness = 1,
  694. crumbliness = -0.1,
  695. cuttability = -0.2,
  696. }
  697. end
  698. function minetest.digprop_dirtlike(toughness)
  699. return {
  700. diggablity = "normal",
  701. weight = toughness * 1.2,
  702. crackiness = 0,
  703. crumbliness = 1.2,
  704. cuttability = -0.4,
  705. }
  706. end
  707. function minetest.digprop_gravellike(toughness)
  708. return {
  709. diggablity = "normal",
  710. weight = toughness * 2,
  711. crackiness = 0.2,
  712. crumbliness = 1.5,
  713. cuttability = -1.0,
  714. }
  715. end
  716. function minetest.digprop_woodlike(toughness)
  717. return {
  718. diggablity = "normal",
  719. weight = toughness * 1.0,
  720. crackiness = 0.75,
  721. crumbliness = -1.0,
  722. cuttability = 1.5,
  723. }
  724. end
  725. function minetest.digprop_leaveslike(toughness)
  726. return {
  727. diggablity = "normal",
  728. weight = toughness * (-0.5),
  729. crackiness = 0,
  730. crumbliness = 0,
  731. cuttability = 2.0,
  732. }
  733. end
  734. function minetest.digprop_glasslike(toughness)
  735. return {
  736. diggablity = "normal",
  737. weight = toughness * 0.1,
  738. crackiness = 2.0,
  739. crumbliness = -1.0,
  740. cuttability = -1.0,
  741. }
  742. end
  743. --
  744. -- Creative inventory
  745. --
  746. minetest.creative_inventory = {}
  747. minetest.add_to_creative_inventory = function(itemstring)
  748. table.insert(minetest.creative_inventory, itemstring)
  749. end
  750. --
  751. -- Callback registration
  752. --
  753. local function make_registration()
  754. local t = {}
  755. local registerfunc = function(func) table.insert(t, func) end
  756. return t, registerfunc
  757. end
  758. minetest.registered_on_chat_messages, minetest.register_on_chat_message = make_registration()
  759. minetest.registered_globalsteps, minetest.register_globalstep = make_registration()
  760. minetest.registered_on_placenodes, minetest.register_on_placenode = make_registration()
  761. minetest.registered_on_dignodes, minetest.register_on_dignode = make_registration()
  762. minetest.registered_on_punchnodes, minetest.register_on_punchnode = make_registration()
  763. minetest.registered_on_generateds, minetest.register_on_generated = make_registration()
  764. minetest.registered_on_newplayers, minetest.register_on_newplayer = make_registration()
  765. minetest.registered_on_dieplayers, minetest.register_on_dieplayer = make_registration()
  766. minetest.registered_on_respawnplayers, minetest.register_on_respawnplayer = make_registration()
  767. --
  768. -- Set random seed
  769. --
  770. math.randomseed(os.time())
  771. -- END