mirror of
				https://github.com/luanti-org/minetest_game.git
				synced 2025-10-29 23:05:19 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			102 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			102 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| -- Load support for MT game translation.
 | |
| local S = minetest.get_translator("keys")
 | |
| 
 | |
| --
 | |
| -- Craftitems
 | |
| --
 | |
| 
 | |
| minetest.register_craftitem("keys:skeleton_key", {
 | |
| 	description = S("Skeleton Key"),
 | |
| 	inventory_image = "keys_key_skeleton.png",
 | |
| 	on_use = function(itemstack, user, pointed_thing)
 | |
| 		if pointed_thing.type ~= "node" then
 | |
| 			return itemstack
 | |
| 		end
 | |
| 
 | |
| 		local pos = pointed_thing.under
 | |
| 		local node = minetest.get_node(pos)
 | |
| 
 | |
| 		if not node then
 | |
| 			return itemstack
 | |
| 		end
 | |
| 
 | |
| 		local node_reg = minetest.registered_nodes[node.name]
 | |
| 		local on_skeleton_key_use = node_reg and node_reg.on_skeleton_key_use
 | |
| 		if not on_skeleton_key_use then
 | |
| 			return itemstack
 | |
| 		end
 | |
| 
 | |
| 		-- make a new key secret in case the node callback needs it
 | |
| 		local random = math.random
 | |
| 		local newsecret = string.format(
 | |
| 			"%04x%04x%04x%04x",
 | |
| 			random(2^16) - 1, random(2^16) - 1,
 | |
| 			random(2^16) - 1, random(2^16) - 1)
 | |
| 
 | |
| 		local secret, _, _ = on_skeleton_key_use(pos, user, newsecret)
 | |
| 
 | |
| 		if secret then
 | |
| 			local inv = minetest.get_inventory({type="player", name=user:get_player_name()})
 | |
| 
 | |
| 			-- update original itemstack
 | |
| 			itemstack:take_item()
 | |
| 
 | |
| 			-- finish and return the new key
 | |
| 			local new_stack = ItemStack("keys:key")
 | |
| 			local meta = new_stack:get_meta()
 | |
| 			meta:set_string("secret", secret)
 | |
| 			meta:set_string("description", S("Key to @1's @2", user:get_player_name(),
 | |
| 				minetest.registered_nodes[node.name].description))
 | |
| 
 | |
| 			if itemstack:get_count() == 0 then
 | |
| 				itemstack = new_stack
 | |
| 			else
 | |
| 				if inv:add_item("main", new_stack):get_count() > 0 then
 | |
| 					minetest.add_item(user:get_pos(), new_stack)
 | |
| 				end -- else: added to inventory successfully
 | |
| 			end
 | |
| 
 | |
| 			return itemstack
 | |
| 		end
 | |
| 	end
 | |
| })
 | |
| 
 | |
| minetest.register_craftitem("keys:key", {
 | |
| 	description = S("Key"),
 | |
| 	inventory_image = "keys_key.png",
 | |
| 	groups = {key = 1, not_in_creative_inventory = 1},
 | |
| 	on_place = function(itemstack, placer, pointed_thing)
 | |
| 		local under = pointed_thing.under
 | |
| 		local node = minetest.get_node(under)
 | |
| 		local def = minetest.registered_nodes[node.name]
 | |
| 		if def and def.on_rightclick and
 | |
| 				not (placer and placer:is_player() and
 | |
| 				placer:get_player_control().sneak) then
 | |
| 			return def.on_rightclick(under, node, placer, itemstack,
 | |
| 				pointed_thing) or itemstack
 | |
| 		end
 | |
| 		if pointed_thing.type ~= "node" then
 | |
| 			return itemstack
 | |
| 		end
 | |
| 
 | |
| 		local pos = pointed_thing.under
 | |
| 		node = minetest.get_node(pos)
 | |
| 
 | |
| 		if not node or node.name == "ignore" then
 | |
| 			return itemstack
 | |
| 		end
 | |
| 
 | |
| 		local ndef = minetest.registered_nodes[node.name]
 | |
| 		if not ndef then
 | |
| 			return itemstack
 | |
| 		end
 | |
| 
 | |
| 		local on_key_use = ndef.on_key_use
 | |
| 		if on_key_use then
 | |
| 			on_key_use(pos, placer)
 | |
| 		end
 | |
| 
 | |
| 		return nil
 | |
| 	end
 | |
| })
 |