Fix negative offsets not being supported by container[]
[oweals/minetest.git] / builtin / game / register.lua
index ad16651f897ce60dd988312039c03f6cf15efb60..51492e928b6f5c86c7095a6fdea3e37a2161628c 100644 (file)
@@ -79,6 +79,7 @@ end
 
 function core.register_abm(spec)
        -- Add to core.registered_abms
+       assert(type(spec.action) == "function", "Required field 'action' of type function")
        core.registered_abms[#core.registered_abms + 1] = spec
        spec.mod_origin = core.get_current_modname() or "??"
 end
@@ -86,6 +87,7 @@ end
 function core.register_lbm(spec)
        -- Add to core.registered_lbms
        check_modname_prefix(spec.name)
+       assert(type(spec.action) == "function", "Required field 'action' of type function")
        core.registered_lbms[#core.registered_lbms + 1] = spec
        spec.mod_origin = core.get_current_modname() or "??"
 end
@@ -330,7 +332,7 @@ core.register_item(":unknown", {
 })
 
 core.register_node(":air", {
-       description = "Air (you hacker you!)",
+       description = "Air",
        inventory_image = "air.png",
        wield_image = "air.png",
        drawtype = "airlike",
@@ -347,7 +349,7 @@ core.register_node(":air", {
 })
 
 core.register_node(":ignore", {
-       description = "Ignore (you hacker you!)",
+       description = "Ignore",
        inventory_image = "ignore.png",
        wield_image = "ignore.png",
        drawtype = "airlike",
@@ -360,6 +362,13 @@ core.register_node(":ignore", {
        air_equivalent = true,
        drop = "",
        groups = {not_in_creative_inventory=1},
+       on_place = function(itemstack, placer, pointed_thing)
+               minetest.chat_send_player(
+                               placer:get_player_name(),
+                               minetest.colorize("#FF0000",
+                               "You can't place 'ignore' nodes!"))
+               return ""
+       end,
 })
 
 -- The hand (bare definition)
@@ -436,10 +445,11 @@ function core.run_callbacks(callbacks, mode, ...)
 end
 
 function core.run_priv_callbacks(name, priv, caller, method)
-       if not core.registered_privileges[priv]["on_" .. method] or
-                       core.registered_privileges[priv]["on_" .. method](name, caller) then
+       local def = core.registered_privileges[priv]
+       if not def or not def["on_" .. method] or
+                       not def["on_" .. method](name, caller) then
                for _, func in ipairs(core["registered_on_priv_" .. method]) do
-                       if not func(name, caller) then
+                       if not func(name, caller, priv) then
                                break
                        end
                end
@@ -506,11 +516,17 @@ local function make_registration_wrap(reg_fn_name, clear_fn_name)
 end
 
 local function make_wrap_deregistration(reg_fn, clear_fn, list)
-       local unregister = function (unregistered_key)
+       local unregister = function (key)
+               if type(key) ~= "string" then
+                       error("key is not a string", 2)
+               end
+               if not list[key] then
+                       error("Attempt to unregister non-existent element - '" .. key .. "'", 2)
+               end
                local temporary_list = table.copy(list)
                clear_fn()
                for k,v in pairs(temporary_list) do
-                       if unregistered_key ~= k then
+                       if key ~= k then
                                reg_fn(v)
                        end
                end
@@ -520,11 +536,11 @@ end
 
 core.registered_on_player_hpchanges = { modifiers = { }, loggers = { } }
 
-function core.registered_on_player_hpchange(player, hp_change)
+function core.registered_on_player_hpchange(player, hp_change, reason)
        local last = false
        for i = #core.registered_on_player_hpchanges.modifiers, 1, -1 do
                local func = core.registered_on_player_hpchanges.modifiers[i]
-               hp_change, last = func(player, hp_change)
+               hp_change, last = func(player, hp_change, reason)
                if type(hp_change) ~= "number" then
                        local debuginfo = debug.getinfo(func)
                        error("The register_on_hp_changes function has to return a number at " ..
@@ -535,7 +551,7 @@ function core.registered_on_player_hpchange(player, hp_change)
                end
        end
        for i, func in ipairs(core.registered_on_player_hpchanges.loggers) do
-               func(player, hp_change)
+               func(player, hp_change, reason)
        end
        return hp_change
 end
@@ -556,11 +572,13 @@ core.registered_biomes      = make_registration_wrap("register_biome",      "cle
 core.registered_ores        = make_registration_wrap("register_ore",        "clear_registered_ores")
 core.registered_decorations = make_registration_wrap("register_decoration", "clear_registered_decorations")
 
-core.unregister_biome = make_wrap_deregistration(core.register_biome, core.clear_registered_biomes, core.registered_biomes)
+core.unregister_biome = make_wrap_deregistration(core.register_biome,
+               core.clear_registered_biomes, core.registered_biomes)
 
 core.registered_on_chat_messages, core.register_on_chat_message = make_registration()
 core.registered_globalsteps, core.register_globalstep = make_registration()
 core.registered_playerevents, core.register_playerevent = make_registration()
+core.registered_on_mods_loaded, core.register_on_mods_loaded = make_registration()
 core.registered_on_shutdown, core.register_on_shutdown = make_registration()
 core.registered_on_punchnodes, core.register_on_punchnode = make_registration()
 core.registered_on_placenodes, core.register_on_placenode = make_registration()
@@ -581,6 +599,11 @@ core.registered_on_item_eats, core.register_on_item_eat = make_registration()
 core.registered_on_punchplayers, core.register_on_punchplayer = make_registration()
 core.registered_on_priv_grant, core.register_on_priv_grant = make_registration()
 core.registered_on_priv_revoke, core.register_on_priv_revoke = make_registration()
+core.registered_can_bypass_userlimit, core.register_can_bypass_userlimit = make_registration()
+core.registered_on_modchannel_message, core.register_on_modchannel_message = make_registration()
+core.registered_on_auth_fail, core.register_on_auth_fail = make_registration()
+core.registered_on_player_inventory_actions, core.register_on_player_inventory_action = make_registration()
+core.registered_allow_player_inventory_actions, core.register_allow_player_inventory_action = make_registration()
 
 --
 -- Compatibility for on_mapgen_init()