description = "Callback test item 1\n(Use/Drop + Sneak to switch to item 2)",
inventory_image = "callbacks_callback_item_1.png",
wield_image = "callbacks_callback_item_1.png",
+ groups = { callback_test = 1 },
on_secondary_use = function(itemstack, user, pointed_thing)
minetest.log("[callbacks:callback_item_1 on_secondary_use] " .. itemstack:get_name())
description = "Callback test item 2\n(Use to switch to item 1)",
inventory_image = "callbacks_callback_item_2.png",
wield_image = "callbacks_callback_item_2.png",
+ groups = { callback_test = 1 },
on_use = function(itemstack, user, pointed_thing)
minetest.log("[callbacks:callback_item_2 on_use]")
description = "Callback Test Node (construct/destruct/timer)".."\n"..
"Tests callbacks: on_construct, after_place_node, on_destruct, after_destruct, after_dig_node, on_timer",
tiles = {"callbacks_callback_node.png"},
- groups = {dig_immediate=3},
+ groups = {callback_test=1, dig_immediate=3},
-- This was known to cause a bug in minetest.item_place_node() when used
-- via minetest.place_node(), causing a placer with no position
paramtype2 = "facedir",
minetest.register_chatcommand("test_place_nodes", {
params = "[ no_param2 ]",
- description = "Test: Place all nodes and optionally their permissible param2 variants",
+ description = "Test: Place all nodes (except dummy and callback nodes) and optionally their permissible param2 variants",
func = function(name, param)
local player = minetest.get_player_by_name(name)
if not player then
local nodes = {}
local emerge_estimate = 0
for itemstring, def in pairs(minetest.registered_nodes) do
- if itemstring ~= "ignore" then
+ if itemstring ~= "ignore" and
+ -- Skip callback test and dummy nodes
+ -- to avoid clutter and chat spam
+ minetest.get_item_group(itemstring, "callback_test") == 0 and
+ minetest.get_item_group(itemstring, "dummy") == 0 then
table.insert(nodes, itemstring)
if def.paramtype2 == 0 then
emerge_estimate = emerge_estimate + 1