aboutsummaryrefslogtreecommitdiff
path: root/builtin/game/item_entity.lua
diff options
context:
space:
mode:
Diffstat (limited to 'builtin/game/item_entity.lua')
-rw-r--r--builtin/game/item_entity.lua33
1 files changed, 23 insertions, 10 deletions
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,
})