aboutsummaryrefslogtreecommitdiff
path: root/games/devtest/mods/testitems/init.lua
diff options
context:
space:
mode:
Diffstat (limited to 'games/devtest/mods/testitems/init.lua')
-rw-r--r--games/devtest/mods/testitems/init.lua108
1 files changed, 108 insertions, 0 deletions
diff --git a/games/devtest/mods/testitems/init.lua b/games/devtest/mods/testitems/init.lua
index 33ebf50fc..0c4cc60de 100644
--- a/games/devtest/mods/testitems/init.lua
+++ b/games/devtest/mods/testitems/init.lua
@@ -53,3 +53,111 @@ minetest.register_craftitem("testitems:overlay_global", {
})
+--
+-- Item callbacks
+--
+
+minetest.register_craftitem("testitems:callback_1", {
+ description = "Callback test item 1\n(Use/Drop + Sneak to switch to item 2)",
+ inventory_image = "testitems_callback_1.png",
+ wield_image = "testitems_callback_1.png",
+
+ on_secondary_use = function(itemstack, user, pointed_thing)
+ minetest.log("[testitems:callback_1 on_secondary_use] " .. itemstack:get_name())
+ local ctrl = user and user:get_player_control() or {}
+ if ctrl.sneak then
+ itemstack = ItemStack(itemstack)
+ itemstack:set_name("testitems:callback_2")
+ return itemstack
+ end
+ end,
+
+ on_drop = function(itemstack, dropper, pos)
+ minetest.log("[testitems:callback_1 on_drop] " .. itemstack:get_name())
+ local ctrl = dropper and dropper:get_player_control() or {}
+ if ctrl.sneak then
+ itemstack = ItemStack(itemstack)
+ itemstack:set_name("testitems:callback_2")
+ end
+
+ return minetest.item_drop(itemstack, dropper, pos)
+ end,
+
+ on_pickup = function(itemstack, picker, pointed_thing, ...)
+ minetest.log("[testitems:callback_1 on_pickup]")
+ assert(pointed_thing.ref:get_luaentity().name == "__builtin:item")
+ local ctrl = picker and picker:get_player_control() or {}
+ if ctrl.aux1 then
+ -- Debug message
+ minetest.log(dump({...}))
+ end
+ if ctrl.sneak then
+ -- Pick up one item of the other kind at once
+ local taken = itemstack:take_item()
+ taken:set_name("testitems:callback_2")
+ local leftover = minetest.item_pickup(taken, picker, pointed_thing, ...)
+ leftover:set_name("testitems:callback_1")
+ itemstack:add_item(leftover)
+ return itemstack
+ elseif ctrl.up then
+ -- Don't pick up
+ return
+ elseif ctrl.left then
+ -- Eat it
+ return minetest.do_item_eat(2, nil, itemstack, picker, pointed_thing)
+ else
+ -- Normal: pick up everything
+ return minetest.item_pickup(itemstack, picker, pointed_thing, ...)
+ end
+ end,
+
+ on_use = function(itemstack, user, pointed_thing)
+ minetest.log("[testitems:callback_1 on_use] " .. itemstack:get_name())
+ local ctrl = user and user:get_player_control() or {}
+ if ctrl.sneak then
+ itemstack = ItemStack(itemstack)
+ itemstack:set_name("testitems:callback_2")
+ return itemstack
+ end
+ end,
+
+ after_use = function(itemstack, user, node, digparams) -- never called
+ minetest.log("[testitems:callback_1 after_use]")
+ local ctrl = user and user:get_player_control() or {}
+ if ctrl.up then
+ itemstack = ItemStack(itemstack)
+ itemstack:set_name("testitems:callback_2")
+ return itemstack
+ end
+ end,
+})
+
+minetest.register_craftitem("testitems:callback_2", {
+ description = "Callback test item 2\n(Use to switch to item 1)",
+ inventory_image = "testitems_callback_2.png",
+ wield_image = "testitems_callback_2.png",
+
+ on_use = function(itemstack, user, pointed_thing)
+ minetest.log("[testitems:callback_2 on_use]")
+ itemstack = ItemStack(itemstack)
+ itemstack:set_name("testitems:callback_1")
+ return itemstack
+ end,
+})
+
+minetest.register_on_item_pickup(function(itemstack, picker, pointed_thing, time_from_last_punch, ...)
+ assert(not pointed_thing or pointed_thing.ref:get_luaentity().name == "__builtin:item")
+
+ local item_name = itemstack:get_name()
+ if item_name ~= "testitems:callback_1" and item_name ~= "testitems:callback_2" then
+ return
+ end
+ minetest.log("["..item_name.." register_on_item_pickup]")
+
+ local ctrl = picker and picker:get_player_control() or {}
+ if item_name == "testitems:callback_2" and not ctrl.sneak then
+ -- Same here. Pick up the other item type.
+ itemstack:set_name("testitems:callback_1")
+ return picker:get_inventory():add_item("main", itemstack)
+ end
+end)