mirror of
				https://github.com/luanti-org/luanti.git
				synced 2025-11-04 09:15:29 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			168 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local S = minetest.get_translator("testitems")
 | 
						|
 | 
						|
--
 | 
						|
-- Texture overlays for items
 | 
						|
--
 | 
						|
 | 
						|
-- For the global overlay color test
 | 
						|
local GLOBAL_COLOR_ARG = "orange"
 | 
						|
 | 
						|
-- Punch handler to set random color with "color" argument in item metadata
 | 
						|
local overlay_on_use = function(itemstack, user, pointed_thing)
 | 
						|
	local meta = itemstack:get_meta()
 | 
						|
	local color = math.random(0x0, 0xFFFFFF)
 | 
						|
	local colorstr = string.format("#%06x", color)
 | 
						|
	meta:set_string("color", colorstr)
 | 
						|
	minetest.log("action", "[testitems] Color of "..itemstack:get_name().." changed to "..colorstr)
 | 
						|
	return itemstack
 | 
						|
end
 | 
						|
-- Place handler to clear item metadata color
 | 
						|
local overlay_on_place = function(itemstack, user, pointed_thing)
 | 
						|
	local meta = itemstack:get_meta()
 | 
						|
	meta:set_string("color", "")
 | 
						|
	return itemstack
 | 
						|
end
 | 
						|
 | 
						|
minetest.register_craftitem("testitems:overlay_meta", {
 | 
						|
	description = S("Texture Overlay Test Item, Meta Color") .. "\n" ..
 | 
						|
		S("Image must be a square with rainbow cross (inventory and wield)") .. "\n" ..
 | 
						|
		S("Item meta color must only change square color") .. "\n" ..
 | 
						|
		S("Punch: Set random color") .. "\n" ..
 | 
						|
		S("Place: Clear color"),
 | 
						|
	-- Base texture: A grayscale square (can be colorized)
 | 
						|
	inventory_image = "testitems_overlay_base.png",
 | 
						|
	wield_image = "testitems_overlay_base.png",
 | 
						|
	-- Overlay: A rainbow cross (NOT to be colorized!)
 | 
						|
	inventory_overlay = "testitems_overlay_overlay.png",
 | 
						|
	wield_overlay = "testitems_overlay_overlay.png",
 | 
						|
 | 
						|
	on_use = overlay_on_use,
 | 
						|
	on_place = overlay_on_place,
 | 
						|
	on_secondary_use = overlay_on_place,
 | 
						|
})
 | 
						|
minetest.register_craftitem("testitems:overlay_global", {
 | 
						|
	description = S("Texture Overlay Test Item, Global Color") .. "\n" ..
 | 
						|
		S("Image must be an orange square with rainbow cross (inventory and wield)"),
 | 
						|
	-- Base texture: A grayscale square (to be colorized)
 | 
						|
	inventory_image = "testitems_overlay_base.png",
 | 
						|
	wield_image = "testitems_overlay_base.png",
 | 
						|
	-- Overlay: A rainbow cross (NOT to be colorized!)
 | 
						|
	inventory_overlay = "testitems_overlay_overlay.png",
 | 
						|
	wield_overlay = "testitems_overlay_overlay.png",
 | 
						|
	color = GLOBAL_COLOR_ARG,
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
--
 | 
						|
-- Item callbacks
 | 
						|
--
 | 
						|
 | 
						|
minetest.register_craftitem("testitems:callback_1", {
 | 
						|
	description = "Callback Test Item 1".."\n"..
 | 
						|
		"Tests callbacks: on_secondary_use, on_drop, on_pickup, on_use, after_use".."\n"..
 | 
						|
		"Punch/Drop + Sneak: Switch to Callback Test Item 2",
 | 
						|
		"Aux1 + pickup item: Print additional on_pickup arguments",
 | 
						|
	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"..
 | 
						|
		"Punch to switch to Callback Test 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)
 |