diff options
Diffstat (limited to 'builtin')
| -rw-r--r-- | builtin/game/item.lua | 26 | ||||
| -rw-r--r-- | builtin/game/item_entity.lua | 33 | ||||
| -rw-r--r-- | builtin/game/register.lua | 1 |
3 files changed, 48 insertions, 12 deletions
diff --git a/builtin/game/item.lua b/builtin/game/item.lua index af3fcb645..2e8fcc343 100644 --- a/builtin/game/item.lua +++ b/builtin/game/item.lua @@ -349,8 +349,26 @@ function core.item_drop(itemstack, dropper, pos) -- environment failed end +function core.item_pickup(itemstack, picker, pointed_thing, ...) + itemstack = ItemStack(itemstack) + -- Invoke global on_item_pickup callbacks. + for _, callback in ipairs(core.registered_on_item_pickups) do + local result = callback(itemstack, picker, pointed_thing, ...) + if result then + return ItemStack(result) + end + end + + -- Pickup item. + local inv = picker and picker:get_inventory() + if inv then + return inv:add_item("main", itemstack) + end + return itemstack +end + function core.do_item_eat(hp_change, replace_with_item, itemstack, user, pointed_thing) - for _, callback in pairs(core.registered_on_item_eats) do + for _, callback in ipairs(core.registered_on_item_eats) do local result = callback(hp_change, replace_with_item, itemstack, user, pointed_thing) if result then return result @@ -589,6 +607,7 @@ core.nodedef_default = { -- Interaction callbacks on_place = redef_wrapper(core, 'item_place'), -- core.item_place on_drop = redef_wrapper(core, 'item_drop'), -- core.item_drop + on_pickup = redef_wrapper(core, 'item_pickup'), -- core.item_pickup on_use = nil, can_dig = nil, @@ -641,6 +660,7 @@ core.craftitemdef_default = { -- Interaction callbacks on_place = redef_wrapper(core, 'item_place'), -- core.item_place on_drop = redef_wrapper(core, 'item_drop'), -- core.item_drop + on_pickup = redef_wrapper(core, 'item_pickup'), -- core.item_pickup on_secondary_use = redef_wrapper(core, 'item_secondary_use'), on_use = nil, } @@ -661,6 +681,7 @@ core.tooldef_default = { on_place = redef_wrapper(core, 'item_place'), -- core.item_place on_secondary_use = redef_wrapper(core, 'item_secondary_use'), on_drop = redef_wrapper(core, 'item_drop'), -- core.item_drop + on_pickup = redef_wrapper(core, 'item_pickup'), -- core.item_pickup on_use = nil, } @@ -677,8 +698,9 @@ core.noneitemdef_default = { -- This is used for the hand and unknown items tool_capabilities = nil, -- Interaction callbacks - on_place = redef_wrapper(core, 'item_place'), + on_place = redef_wrapper(core, 'item_place'), -- core.item_place on_secondary_use = redef_wrapper(core, 'item_secondary_use'), + on_pickup = redef_wrapper(core, 'item_pickup'), -- core.item_pickup on_drop = nil, on_use = nil, } diff --git a/builtin/game/item_entity.lua b/builtin/game/item_entity.lua index 53f98a7c7..f321bb1dd 100644 --- a/builtin/game/item_entity.lua +++ b/builtin/game/item_entity.lua @@ -318,16 +318,29 @@ core.register_entity(":__builtin:item", { end end, - on_punch = function(self, hitter) - local inv = hitter:get_inventory() - if inv and self.itemstring ~= "" then - local left = inv:add_item("main", self.itemstring) - if left and not left:is_empty() then - self:set_item(left) - return - end + on_punch = function(self, hitter, ...) + if self.itemstring == "" then + self.object:remove() + return + end + + -- Call on_pickup callback in item definition. + local itemstack = ItemStack(self.itemstring) + local callback = itemstack:get_definition().on_pickup + + local ret = callback(itemstack, hitter, {type = "object", ref = self.object}, ...) + if not ret then + -- Don't modify (and don't reset rotation) + return + end + itemstack = ItemStack(ret) + + -- Handle the leftover itemstack + if itemstack:is_empty() then + self.itemstring = "" + self.object:remove() + else + self:set_item(itemstack) end - self.itemstring = "" - self.object:remove() end, }) diff --git a/builtin/game/register.lua b/builtin/game/register.lua index 8b6f5b990..d4c876898 100644 --- a/builtin/game/register.lua +++ b/builtin/game/register.lua @@ -607,6 +607,7 @@ core.registered_on_crafts, core.register_on_craft = make_registration() 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_item_pickups, core.register_on_item_pickup = 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() |
