Advertisement
Guest User

Untitled

a guest
Dec 6th, 2012
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 10.27 KB | None | 0 0
  1. -- Minetest: builtin/misc_register.lua
  2.  
  3. --
  4. -- Make raw registration functions inaccessible to anyone except this file
  5. --
  6.  
  7. local register_item_raw = minetest.register_item_raw
  8. minetest.register_item_raw = nil
  9.  
  10. local register_alias_raw = minetest.register_alias_raw
  11. minetest.register_item_raw = nil
  12.  
  13. --
  14. -- Item / entity / ABM registration functions
  15. --
  16.  
  17. minetest.registered_abms = {}
  18. minetest.registered_entities = {}
  19. minetest.registered_items = {}
  20. minetest.registered_nodes = {}
  21. minetest.registered_craftitems = {}
  22. minetest.registered_tools = {}
  23. minetest.registered_aliases = {}
  24.  
  25. -- For tables that are indexed by item name:
  26. -- If table[X] does not exist, default to table[minetest.registered_aliases[X]]
  27. local function set_alias_metatable(table)
  28.     setmetatable(table, {
  29.         __index = function(name)
  30.             return rawget(table, minetest.registered_aliases[name])
  31.         end
  32.     })
  33. end
  34. set_alias_metatable(minetest.registered_items)
  35. set_alias_metatable(minetest.registered_nodes)
  36. set_alias_metatable(minetest.registered_craftitems)
  37. set_alias_metatable(minetest.registered_tools)
  38.  
  39. -- These item names may not be used because they would interfere
  40. -- with legacy itemstrings
  41. local forbidden_item_names = {
  42.     MaterialItem = true,
  43.     MaterialItem2 = true,
  44.     MaterialItem3 = true,
  45.     NodeItem = true,
  46.     node = true,
  47.     CraftItem = true,
  48.     craft = true,
  49.     MBOItem = true,
  50.     ToolItem = true,
  51.     tool = true,
  52. }
  53.  
  54. -- This is used to define a biome
  55. minetest.biomedef_default = {
  56.     group_id = 0,
  57.     name = "Biome",
  58.     terrain_type = "generic",
  59.     node_top = "mapgen_stone",
  60.     node_filler = "mapgen_stone",
  61.     num_top_nodes = 4,
  62.     height_min = -3000,
  63.     height_max = 3000,
  64.     heat_min = -50.0,
  65.     heat_max = 100.0,
  66.     humidity_min = 0.0,
  67.     humidity_max = 100.0,
  68.     scale = 20.0,
  69.     offset = 0.0,
  70. }
  71.  
  72. local function check_modname_prefix(name)
  73.     if name:sub(1,1) == ":" then
  74.         -- Escape the modname prefix enforcement mechanism
  75.         return name:sub(2)
  76.     else
  77.         -- Modname prefix enforcement
  78.         local expected_prefix = minetest.get_current_modname() .. ":"
  79.         if name:sub(1, #expected_prefix) ~= expected_prefix then
  80.             error("Name " .. name .. " does not follow naming conventions: " ..
  81.                 "\"modname:\" or \":\" prefix required")
  82.         end
  83.         local subname = name:sub(#expected_prefix+1)
  84.         if subname:find("[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_]") then
  85.             error("Name " .. name .. " does not follow naming conventions: " ..
  86.                 "contains unallowed characters")
  87.         end
  88.         return name
  89.     end
  90. end
  91.  
  92. function minetest.register_biome(biomedef)
  93.     register_biome_raw(biomedef)
  94. end
  95.  
  96. function minetest.register_abm(spec)
  97.     -- Add to minetest.registered_abms
  98.     minetest.registered_abms[#minetest.registered_abms+1] = spec
  99. end
  100.  
  101. function minetest.register_entity(name, prototype)
  102.     -- Check name
  103.     if name == nil then
  104.         error("Unable to register entity: Name is nil")
  105.     end
  106.     name = check_modname_prefix(tostring(name))
  107.  
  108.     prototype.name = name
  109.     prototype.__index = prototype  -- so that it can be used as a metatable
  110.  
  111.     -- Add to minetest.registered_entities
  112.     minetest.registered_entities[name] = prototype
  113. end
  114.  
  115. function minetest.register_item(name, itemdef)
  116.     -- Check name
  117.     if name == nil then
  118.         error("Unable to register item: Name is nil")
  119.     end
  120.     name = check_modname_prefix(tostring(name))
  121.     if forbidden_item_names[name] then
  122.         error("Unable to register item: Name is forbidden: " .. name)
  123.     end
  124.     itemdef.name = name
  125.  
  126.     -- Apply defaults and add to registered_* table
  127.     if itemdef.type == "node" then
  128.         setmetatable(itemdef, {__index = minetest.nodedef_default})
  129.         minetest.registered_nodes[itemdef.name] = itemdef
  130.     elseif itemdef.type == "craft" then
  131.         setmetatable(itemdef, {__index = minetest.craftitemdef_default})
  132.         minetest.registered_craftitems[itemdef.name] = itemdef
  133.     elseif itemdef.type == "tool" then
  134.         setmetatable(itemdef, {__index = minetest.tooldef_default})
  135.         minetest.registered_tools[itemdef.name] = itemdef
  136.     elseif itemdef.type == "none" then
  137.         setmetatable(itemdef, {__index = minetest.noneitemdef_default})
  138.     else
  139.         error("Unable to register item: Type is invalid: " .. dump(itemdef))
  140.     end
  141.  
  142.     -- Flowing liquid uses param2
  143.     if itemdef.type == "node" and itemdef.liquidtype == "flowing" then
  144.         itemdef.paramtype2 = "flowingliquid"
  145.     end
  146.  
  147.     -- BEGIN Legacy stuff
  148.     if itemdef.cookresult_itemstring ~= nil and itemdef.cookresult_itemstring ~= "" then
  149.         minetest.register_craft({
  150.             type="cooking",
  151.             output=itemdef.cookresult_itemstring,
  152.             recipe=itemdef.name,
  153.             cooktime=itemdef.furnace_cooktime
  154.         })
  155.     end
  156.     if itemdef.furnace_burntime ~= nil and itemdef.furnace_burntime >= 0 then
  157.         minetest.register_craft({
  158.             type="fuel",
  159.             recipe=itemdef.name,
  160.             burntime=itemdef.furnace_burntime
  161.         })
  162.     end
  163.     -- END Legacy stuff
  164.  
  165.     -- Disable all further modifications
  166.     getmetatable(itemdef).__newindex = {}
  167.  
  168.     --minetest.log("Registering item: " .. itemdef.name)
  169.     minetest.registered_items[itemdef.name] = itemdef
  170.     minetest.registered_aliases[itemdef.name] = nil
  171.     register_item_raw(itemdef)
  172. end
  173.  
  174. function minetest.register_node(name, nodedef)
  175.     nodedef.type = "node"
  176.     minetest.register_item(name, nodedef)
  177. end
  178.  
  179. function minetest.register_craftitem(name, craftitemdef)
  180.     craftitemdef.type = "craft"
  181.  
  182.     -- BEGIN Legacy stuff
  183.     if craftitemdef.inventory_image == nil and craftitemdef.image ~= nil then
  184.         craftitemdef.inventory_image = craftitemdef.image
  185.     end
  186.     -- END Legacy stuff
  187.  
  188.     minetest.register_item(name, craftitemdef)
  189. end
  190.  
  191. function minetest.register_tool(name, tooldef)
  192.     tooldef.type = "tool"
  193.     tooldef.stack_max = 1
  194.  
  195.     -- BEGIN Legacy stuff
  196.     if tooldef.inventory_image == nil and tooldef.image ~= nil then
  197.         tooldef.inventory_image = tooldef.image
  198.     end
  199.     if tooldef.tool_capabilities == nil and
  200.        (tooldef.full_punch_interval ~= nil or
  201.         tooldef.basetime ~= nil or
  202.         tooldef.dt_weight ~= nil or
  203.         tooldef.dt_crackiness ~= nil or
  204.         tooldef.dt_crumbliness ~= nil or
  205.         tooldef.dt_cuttability ~= nil or
  206.         tooldef.basedurability ~= nil or
  207.         tooldef.dd_weight ~= nil or
  208.         tooldef.dd_crackiness ~= nil or
  209.         tooldef.dd_crumbliness ~= nil or
  210.         tooldef.dd_cuttability ~= nil) then
  211.         tooldef.tool_capabilities = {
  212.             full_punch_interval = tooldef.full_punch_interval,
  213.             basetime = tooldef.basetime,
  214.             dt_weight = tooldef.dt_weight,
  215.             dt_crackiness = tooldef.dt_crackiness,
  216.             dt_crumbliness = tooldef.dt_crumbliness,
  217.             dt_cuttability = tooldef.dt_cuttability,
  218.             basedurability = tooldef.basedurability,
  219.             dd_weight = tooldef.dd_weight,
  220.             dd_crackiness = tooldef.dd_crackiness,
  221.             dd_crumbliness = tooldef.dd_crumbliness,
  222.             dd_cuttability = tooldef.dd_cuttability,
  223.         }
  224.     end
  225.     -- END Legacy stuff
  226.  
  227.     minetest.register_item(name, tooldef)
  228. end
  229.  
  230. function minetest.register_alias(name, convert_to)
  231.     if forbidden_item_names[name] then
  232.         error("Unable to register alias: Name is forbidden: " .. name)
  233.     end
  234.     if minetest.registered_items[name] ~= nil then
  235.         minetest.log("WARNING: Not registering alias, item with same name" ..
  236.             " is already defined: " .. name .. " -> " .. convert_to)
  237.     else
  238.         --minetest.log("Registering alias: " .. name .. " -> " .. convert_to)
  239.         minetest.registered_aliases[name] = convert_to
  240.         register_alias_raw(name, convert_to)
  241.     end
  242. end
  243.  
  244. -- Alias the forbidden item names to "" so they can't be
  245. -- created via itemstrings (e.g. /give)
  246. local name
  247. for name in pairs(forbidden_item_names) do
  248.     minetest.registered_aliases[name] = ""
  249.     register_alias_raw(name, "")
  250. end
  251.  
  252.  
  253. -- Deprecated:
  254. -- Aliases for minetest.register_alias (how ironic...)
  255. --minetest.alias_node = minetest.register_alias
  256. --minetest.alias_tool = minetest.register_alias
  257. --minetest.alias_craftitem = minetest.register_alias
  258.  
  259. --
  260. -- Built-in node definitions. Also defined in C.
  261. --
  262.  
  263. minetest.register_item(":unknown", {
  264.     type = "none",
  265.     description = "Unknown Item",
  266.     inventory_image = "unknown_item.png",
  267.     on_place = minetest.item_place,
  268.     on_drop = minetest.item_drop,
  269.     groups = {not_in_creative_inventory=1},
  270. })
  271.  
  272. minetest.register_node(":air", {
  273.     description = "Air (you hacker you!)",
  274.     inventory_image = "unknown_block.png",
  275.     wield_image = "unknown_block.png",
  276.     drawtype = "airlike",
  277.     paramtype = "light",
  278.     sunlight_propagates = true,
  279.     walkable = false,
  280.     pointable = false,
  281.     diggable = false,
  282.     buildable_to = true,
  283.     air_equivalent = true,
  284.     groups = {not_in_creative_inventory=1},
  285. })
  286.  
  287. minetest.register_node(":ignore", {
  288.     description = "Ignore (you hacker you!)",
  289.     inventory_image = "unknown_block.png",
  290.     wield_image = "unknown_block.png",
  291.     drawtype = "airlike",
  292.     paramtype = "none",
  293.     sunlight_propagates = false,
  294.     walkable = false,
  295.     pointable = false,
  296.     diggable = false,
  297.     buildable_to = true, -- A way to remove accidentally placed ignores
  298.     air_equivalent = true,
  299.     groups = {not_in_creative_inventory=1},
  300. })
  301.  
  302. -- The hand (bare definition)
  303. minetest.register_item(":", {
  304.     type = "none",
  305.     groups = {not_in_creative_inventory=1},
  306. })
  307.  
  308. --
  309. -- Callback registration
  310. --
  311.  
  312. local function make_registration()
  313.     local t = {}
  314.     local registerfunc = function(func) table.insert(t, func) end
  315.     return t, registerfunc
  316. end
  317.  
  318. local function make_registration_reverse()
  319.     local t = {}
  320.     local registerfunc = function(func) table.insert(t, 1, func) end
  321.     return t, registerfunc
  322. end
  323.  
  324. minetest.registered_on_chat_messages, minetest.register_on_chat_message = make_registration()
  325. minetest.registered_globalsteps, minetest.register_globalstep = make_registration()
  326. minetest.registered_on_punchnodes, minetest.register_on_punchnode = make_registration()
  327. minetest.registered_on_placenodes, minetest.register_on_placenode = make_registration()
  328. minetest.registered_on_dignodes, minetest.register_on_dignode = make_registration()
  329. minetest.registered_on_generateds, minetest.register_on_generated = make_registration()
  330. minetest.registered_on_newplayers, minetest.register_on_newplayer = make_registration()
  331. minetest.registered_on_dieplayers, minetest.register_on_dieplayer = make_registration()
  332. minetest.registered_on_respawnplayers, minetest.register_on_respawnplayer = make_registration()
  333. minetest.registered_on_joinplayers, minetest.register_on_joinplayer = make_registration()
  334. minetest.registered_on_leaveplayers, minetest.register_on_leaveplayer = make_registration()
  335. minetest.registered_on_player_receive_fields, minetest.register_on_player_receive_fields = make_registration_reverse()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement