]> git.lizzy.rs Git - dragonfireclient.git/blobdiff - builtin/game/register.lua
minetest.dig_node: Remove node
[dragonfireclient.git] / builtin / game / register.lua
index 90f095e9fc51f56be97875b78654051568a3c8ab..56e40c75c9ccf13baf978a6caad240590b1d9bc4 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
@@ -254,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
 
@@ -301,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,
@@ -330,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,
@@ -347,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,
@@ -360,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},
 })
 
@@ -404,10 +421,6 @@ function core.run_callbacks(callbacks, mode, ...)
                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
                local cb_ret = callbacks[i](...)
 
@@ -435,6 +448,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
 --
@@ -494,13 +519,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 " ..
@@ -511,7 +555,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
@@ -532,9 +576,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()
@@ -553,10 +602,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
-