Fix negative offsets not being supported by container[]
[oweals/minetest.git] / builtin / game / register.lua
index 43bb9e0678f65a1e72f290ebf0233fad1f296867..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
@@ -116,8 +118,6 @@ function core.register_item(name, itemdef)
        end
        itemdef.name = name
 
-       local is_overriding = core.registered_items[name]
-
        -- Apply defaults and add to registered_* table
        if itemdef.type == "node" then
                -- Use the nodebox as selection box if it's not set manually
@@ -179,13 +179,7 @@ function core.register_item(name, itemdef)
        --core.log("Registering item: " .. itemdef.name)
        core.registered_items[itemdef.name] = itemdef
        core.registered_aliases[itemdef.name] = nil
-
-       -- Used to allow builtin to register ignore to registered_items
-       if name ~= "ignore" then
-               register_item_raw(itemdef)
-       elseif is_overriding then
-               core.log("warning", "Attempted redefinition of \"ignore\"")
-       end
+       register_item_raw(itemdef)
 end
 
 function core.unregister_item(name)
@@ -453,7 +447,7 @@ end
 function core.run_priv_callbacks(name, priv, caller, method)
        local def = core.registered_privileges[priv]
        if not def or not def["on_" .. method] or
-                       not def[priv]["on_" .. method](name, caller) then
+                       not def["on_" .. method](name, caller) then
                for _, func in ipairs(core["registered_on_priv_" .. method]) do
                        if not func(name, caller, priv) then
                                break
@@ -522,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
@@ -572,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()