]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - builtin/game/register.lua
Improve LBMManager::applyLBMs() code
[dragonfireclient.git] / builtin / game / register.lua
index d3f6b3df89f69fb797dcf1dc989dd59cb7606dcd..0be107c3633344a378736964522dcf730a213fb1 100644 (file)
@@ -1,5 +1,7 @@
 -- Minetest: builtin/misc_register.lua
 
+local S = core.get_translator("__builtin")
+
 --
 -- Make raw registration functions inaccessible to anyone except this file
 --
@@ -65,20 +67,21 @@ local function check_modname_prefix(name)
                        error("Name " .. name .. " does not follow naming conventions: " ..
                                "\"" .. expected_prefix .. "\" or \":\" prefix required")
                end
-               
+
                -- Enforce that the name only contains letters, numbers and underscores.
                local subname = name:sub(#expected_prefix+1)
                if subname:find("[^%w_]") then
                        error("Name " .. name .. " does not follow naming conventions: " ..
                                "contains unallowed characters")
                end
-               
+
                return name
        end
 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 +89,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
@@ -128,7 +132,9 @@ function core.register_item(name, itemdef)
                        }
                end
                if itemdef.light_source and itemdef.light_source > core.LIGHT_MAX then
-                       error("Unable to register node: 'light_source' exceeds maximum: " .. name)
+                       itemdef.light_source = core.LIGHT_MAX
+                       core.log("warning", "Node 'light_source' value exceeds maximum," ..
+                               " limiting to maximum: " ..name)
                end
                setmetatable(itemdef, {__index = core.nodedef_default})
                core.registered_nodes[itemdef.name] = itemdef
@@ -252,6 +258,18 @@ function core.register_tool(name, tooldef)
        end
        -- END Legacy stuff
 
+       -- This isn't just legacy, but more of a convenience feature
+       local toolcaps = tooldef.tool_capabilities
+       if toolcaps and toolcaps.punch_attack_uses == nil then
+               for _, cap in pairs(toolcaps.groupcaps or {}) do
+                       local level = (cap.maxlevel or 0) - 1
+                       if (cap.uses or 0) ~= 0 and level >= 0 then
+                               toolcaps.punch_attack_uses = cap.uses * (3 ^ level)
+                               break
+                       end
+               end
+       end
+
        core.register_item(name, tooldef)
 end
 
@@ -299,26 +317,18 @@ end
 
 -- Alias the forbidden item names to "" so they can't be
 -- created via itemstrings (e.g. /give)
-local name
 for name in pairs(forbidden_item_names) do
        core.registered_aliases[name] = ""
        register_alias_raw(name, "")
 end
 
-
--- Deprecated:
--- Aliases for core.register_alias (how ironic...)
---core.alias_node = core.register_alias
---core.alias_tool = core.register_alias
---core.alias_craftitem = core.register_alias
-
 --
 -- Built-in node definitions. Also defined in C.
 --
 
 core.register_item(":unknown", {
        type = "none",
-       description = "Unknown Item",
+       description = S("Unknown Item"),
        inventory_image = "unknown_item.png",
        on_place = core.item_place,
        on_secondary_use = core.item_secondary_use,
@@ -328,9 +338,9 @@ core.register_item(":unknown", {
 })
 
 core.register_node(":air", {
-       description = "Air (you hacker you!)",
-       inventory_image = "unknown_node.png",
-       wield_image = "unknown_node.png",
+       description = S("Air"),
+       inventory_image = "air.png",
+       wield_image = "air.png",
        drawtype = "airlike",
        paramtype = "light",
        sunlight_propagates = true,
@@ -345,9 +355,9 @@ core.register_node(":air", {
 })
 
 core.register_node(":ignore", {
-       description = "Ignore (you hacker you!)",
-       inventory_image = "unknown_node.png",
-       wield_image = "unknown_node.png",
+       description = S("Ignore"),
+       inventory_image = "ignore.png",
+       wield_image = "ignore.png",
        drawtype = "airlike",
        paramtype = "none",
        sunlight_propagates = false,
@@ -358,11 +368,20 @@ core.register_node(":ignore", {
        air_equivalent = true,
        drop = "",
        groups = {not_in_creative_inventory=1},
+       node_placement_prediction = "",
+       on_place = function(itemstack, placer, pointed_thing)
+               core.chat_send_player(
+                               placer:get_player_name(),
+                               core.colorize("#FF0000",
+                               S("You can't place 'ignore' nodes!")))
+               return ""
+       end,
 })
 
 -- The hand (bare definition)
 core.register_item(":", {
        type = "none",
+       wield_image = "wieldhand.png",
        groups = {not_in_creative_inventory=1},
 })
 
@@ -384,8 +403,14 @@ function core.override_item(name, redefinition)
        register_item_raw(item)
 end
 
-
-core.callback_origins = {}
+do
+       local default = {mod = "??", name = "??"}
+       core.callback_origins = setmetatable({}, {
+               __index = function()
+                       return default
+               end
+       })
+end
 
 function core.run_callbacks(callbacks, mode, ...)
        assert(type(callbacks) == "table")
@@ -400,13 +425,7 @@ function core.run_callbacks(callbacks, mode, ...)
        local ret = nil
        for i = 1, cb_len do
                local origin = core.callback_origins[callbacks[i]]
-               if origin then
-                       core.set_last_run_mod(origin.mod)
-                       --print("Running " .. tostring(callbacks[i]) ..
-                       --      " (a " .. origin.name .. " callback in " .. origin.mod .. ")")
-               else
-                       --print("No data associated with callback")
-               end
+               core.set_last_run_mod(origin.mod)
                local cb_ret = callbacks[i](...)
 
                if mode == 0 and i == 1 then
@@ -433,6 +452,18 @@ function core.run_callbacks(callbacks, mode, ...)
        return ret
 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["on_" .. method](name, caller) then
+               for _, func in ipairs(core["registered_on_priv_" .. method]) do
+                       if not func(name, caller, priv) then
+                               break
+                       end
+               end
+       end
+end
+
 --
 -- Callback registration
 --
@@ -492,13 +523,32 @@ local function make_registration_wrap(reg_fn_name, clear_fn_name)
        return list
 end
 
+local function make_wrap_deregistration(reg_fn, clear_fn, list)
+       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 key ~= k then
+                               reg_fn(v)
+                       end
+               end
+       end
+       return unregister
+end
+
 core.registered_on_player_hpchanges = { modifiers = { }, loggers = { } }
 
-function core.registered_on_player_hpchange(player, hp_change)
-       local last = false
+function core.registered_on_player_hpchange(player, hp_change, reason)
+       local last
        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 " ..
@@ -509,7 +559,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
@@ -530,9 +580,14 @@ 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.registered_on_chat_messages, core.register_on_chat_message = make_registration()
+core.registered_on_chatcommands, core.register_on_chatcommand = 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()
@@ -551,10 +606,18 @@ core.registered_craft_predicts, core.register_craft_predict = make_registration(
 core.registered_on_protection_violation, core.register_on_protection_violation = make_registration()
 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_on_authplayers, core.register_on_authplayer = 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_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()
+core.registered_on_rightclickplayers, core.register_on_rightclickplayer = make_registration()
+core.registered_on_liquid_transformed, core.register_on_liquid_transformed = make_registration()
 
 --
 -- Compatibility for on_mapgen_init()
 --
 
 core.register_on_mapgen_init = function(func) func(core.get_mapgen_params()) end
-