Deepcopy pointed_thing for after_place_node, give it to on_rightclick too.
[oweals/minetest.git] / builtin / misc_register.lua
index aa8399f1631770845fc18316b04df05a7905e25f..6c50ff02e53e7d3426c979dcf8ef4840d0341a34 100644 (file)
@@ -24,17 +24,15 @@ minetest.registered_aliases = {}
 
 -- For tables that are indexed by item name:
 -- If table[X] does not exist, default to table[minetest.registered_aliases[X]]
-local function set_alias_metatable(table)
-       setmetatable(table, {
-               __index = function(name)
-                       return rawget(table, minetest.registered_aliases[name])
-               end
-       })
-end
-set_alias_metatable(minetest.registered_items)
-set_alias_metatable(minetest.registered_nodes)
-set_alias_metatable(minetest.registered_craftitems)
-set_alias_metatable(minetest.registered_tools)
+local alias_metatable = {
+       __index = function(t, name)
+               return rawget(t, minetest.registered_aliases[name])
+       end
+}
+setmetatable(minetest.registered_items, alias_metatable)
+setmetatable(minetest.registered_nodes, alias_metatable)
+setmetatable(minetest.registered_craftitems, alias_metatable)
+setmetatable(minetest.registered_tools, alias_metatable)
 
 -- These item names may not be used because they would interfere
 -- with legacy itemstrings
@@ -106,6 +104,11 @@ function minetest.register_item(name, itemdef)
                -- Use the nodebox as selection box if it's not set manually
                if itemdef.drawtype == "nodebox" and not itemdef.selection_box then
                        itemdef.selection_box = itemdef.node_box
+               elseif itemdef.drawtype == "fencelike" and not itemdef.selection_box then
+                       itemdef.selection_box = {
+                               type = "fixed",
+                               fixed = {-1/8, -1/2, -1/8, 1/8, 1/2, 1/8},
+                       }
                end
                setmetatable(itemdef, {__index = minetest.nodedef_default})
                minetest.registered_nodes[itemdef.name] = itemdef
@@ -270,6 +273,7 @@ minetest.register_item(":unknown", {
        on_place = minetest.item_place,
        on_drop = minetest.item_drop,
        groups = {not_in_creative_inventory=1},
+       diggable = true,
 })
 
 minetest.register_node(":air", {
@@ -310,6 +314,45 @@ minetest.register_item(":", {
        groups = {not_in_creative_inventory=1},
 })
 
+
+function minetest.run_callbacks(callbacks, mode, ...)
+       assert(type(callbacks) == "table")
+       local cb_len = #callbacks
+       if cb_len == 0 then
+               if mode == 2 or mode == 3 then
+                       return true
+               elseif mode == 4 or mode == 5 then
+                       return false
+               end
+       end
+       local ret = nil
+       for i = 1, cb_len do
+               local cb_ret = callbacks[i](...)
+
+               if mode == 0 and i == 1 then
+                       ret = cb_ret
+               elseif mode == 1 and i == cb_len then
+                       ret = cb_ret
+               elseif mode == 2 then
+                       if not cb_ret or i == 1 then
+                               ret = cb_ret
+                       end
+               elseif mode == 3 then
+                       if cb_ret then
+                               return cb_ret
+                       end
+                       ret = cb_ret
+               elseif mode == 4 then
+                       if (cb_ret and not ret) or i == 1 then
+                               ret = cb_ret
+                       end
+               elseif mode == 5 and cb_ret then
+                       return cb_ret
+               end
+       end
+       return ret
+end
+
 --
 -- Callback registration
 --
@@ -337,10 +380,12 @@ minetest.registered_on_generateds, minetest.register_on_generated = make_registr
 minetest.registered_on_newplayers, minetest.register_on_newplayer = make_registration()
 minetest.registered_on_dieplayers, minetest.register_on_dieplayer = make_registration()
 minetest.registered_on_respawnplayers, minetest.register_on_respawnplayer = make_registration()
+minetest.registered_on_prejoinplayers, minetest.register_on_prejoinplayer = make_registration()
 minetest.registered_on_joinplayers, minetest.register_on_joinplayer = make_registration()
 minetest.registered_on_leaveplayers, minetest.register_on_leaveplayer = make_registration()
 minetest.registered_on_player_receive_fields, minetest.register_on_player_receive_fields = make_registration_reverse()
 minetest.registered_on_cheats, minetest.register_on_cheat = make_registration()
 minetest.registered_on_crafts, minetest.register_on_craft = make_registration()
 minetest.registered_craft_predicts, minetest.register_craft_predict = make_registration()
+minetest.registered_on_protection_violation, minetest.register_on_protection_violation = make_registration()