]> git.lizzy.rs Git - dragonfireclient.git/blob - builtin/client/register.lua
Merge branch 'master' of https://github.com/minetest/minetest
[dragonfireclient.git] / builtin / client / register.lua
1 core.callback_origins = {}
2
3 local getinfo = debug.getinfo
4 debug.getinfo = nil
5
6 --- Runs given callbacks.
7 --
8 -- Note: this function is also called from C++
9 -- @tparam table  callbacks a table with registered callbacks, like `core.registered_on_*`
10 -- @tparam number mode      a RunCallbacksMode, as defined in src/script/common/c_internal.h
11 -- @param         ...       arguments for the callback
12 -- @return depends on mode
13 function core.run_callbacks(callbacks, mode, ...)
14         assert(type(callbacks) == "table")
15         local cb_len = #callbacks
16         if cb_len == 0 then
17                 if mode == 2 or mode == 3 then
18                         return true
19                 elseif mode == 4 or mode == 5 then
20                         return false
21                 end
22         end
23         local ret
24         for i = 1, cb_len do
25                 local cb_ret = callbacks[i](...)
26
27                 if mode == 0 and i == 1 or mode == 1 and i == cb_len then
28                         ret = cb_ret
29                 elseif mode == 2 then
30                         if not cb_ret or i == 1 then
31                                 ret = cb_ret
32                         end
33                 elseif mode == 3 then
34                         if cb_ret then
35                                 return cb_ret
36                         end
37                         ret = cb_ret
38                 elseif mode == 4 then
39                         if (cb_ret and not ret) or i == 1 then
40                                 ret = cb_ret
41                         end
42                 elseif mode == 5 and cb_ret then
43                         return cb_ret
44                 end
45         end
46         return ret
47 end
48
49 function core.override_item(name, redefinition)
50         if redefinition.name ~= nil then
51                 error("Attempt to redefine name of "..name.." to "..dump(redefinition.name), 2)
52         end
53         if redefinition.type ~= nil then
54                 error("Attempt to redefine type of "..name.." to "..dump(redefinition.type), 2)
55         end
56         local itemdef = core.get_item_def(name)
57         if not itemdef then
58                 error("Attempt to override non-existent item "..name, 2)
59         end
60         local nodedef = core.get_node_def(name)
61         table.combine(itemdef, nodedef)
62
63         for k, v in pairs(redefinition) do
64                 rawset(itemdef, k, v)
65         end
66         core.register_item_raw(itemdef)
67 end
68
69 --
70 -- Callback registration
71 --
72
73 local function make_registration()
74         local t = {}
75         local registerfunc = function(func)
76                 t[#t + 1] = func
77                 core.callback_origins[func] = {
78                         mod = core.get_current_modname() or "??",
79                         name = getinfo(1, "n").name or "??"
80                 }
81                 --local origin = core.callback_origins[func]
82                 --print(origin.name .. ": " .. origin.mod .. " registering cbk " .. tostring(func))
83         end
84         return t, registerfunc
85 end
86
87 core.registered_globalsteps, core.register_globalstep = make_registration()
88 core.registered_on_mods_loaded, core.register_on_mods_loaded = make_registration()
89 core.registered_on_shutdown, core.register_on_shutdown = make_registration()
90 core.registered_on_receiving_chat_message, core.register_on_receiving_chat_message = make_registration()
91 core.registered_on_sending_chat_message, core.register_on_sending_chat_message = make_registration()
92 core.registered_on_chatcommand, core.register_on_chatcommand = make_registration()
93 core.registered_on_death, core.register_on_death = make_registration()
94 core.registered_on_hp_modification, core.register_on_hp_modification = make_registration()
95 core.registered_on_damage_taken, core.register_on_damage_taken = make_registration()
96 core.registered_on_formspec_input, core.register_on_formspec_input = make_registration()
97 core.registered_on_dignode, core.register_on_dignode = make_registration()
98 core.registered_on_punchnode, core.register_on_punchnode = make_registration()
99 core.registered_on_placenode, core.register_on_placenode = make_registration()
100 core.registered_on_item_use, core.register_on_item_use = make_registration()
101 core.registered_on_modchannel_message, core.register_on_modchannel_message = make_registration()
102 core.registered_on_modchannel_signal, core.register_on_modchannel_signal = make_registration()
103 core.registered_on_inventory_open, core.register_on_inventory_open = make_registration()
104 core.registered_on_recieve_physics_override, core.register_on_recieve_physics_override = make_registration()
105 core.registered_on_play_sound, core.register_on_play_sound = make_registration()
106 core.registered_on_spawn_particle, core.register_on_spawn_particle = make_registration()
107 core.registered_on_object_properties_change, core.register_on_object_properties_change = make_registration()
108 core.registered_on_object_hp_change, core.register_on_object_hp_change = make_registration()
109 core.registered_on_object_add, core.register_on_object_add = make_registration()
110
111 core.registered_nodes = {}
112 core.registered_items = {}
113 core.object_refs = {}