1
0
mirror of https://github.com/minetest/minetest_game.git synced 2024-11-14 14:00:19 +01:00
minetest_game/mods/default/tools.lua

519 lines
12 KiB
Lua
Raw Normal View History

2013-05-19 18:43:04 +02:00
-- mods/default/tools.lua
-- support for MT game translation.
local S = default.get_translator
2013-05-19 18:43:04 +02:00
-- The hand
minetest.register_item(":", {
type = "none",
wield_image = "wieldhand.png",
wield_scale = {x=1,y=1,z=2.5},
tool_capabilities = {
full_punch_interval = 0.9,
max_drop_level = 0,
groupcaps = {
crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1},
snappy = {times={[3]=0.40}, uses=0, maxlevel=1},
oddly_breakable_by_hand = {times={[1]=3.50,[2]=2.00,[3]=0.70}, uses=0}
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=1},
}
})
--
-- Picks
--
minetest.register_tool("default:pick_wood", {
description = S("Wooden Pickaxe"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_woodpick.png",
tool_capabilities = {
full_punch_interval = 1.2,
max_drop_level=0,
groupcaps={
cracky = {times={[3]=1.60}, uses=10, maxlevel=1},
},
damage_groups = {fleshy=2},
},
sound = {breaks = "default_tool_breaks"},
groups = {pickaxe = 1, flammable = 2}
2013-05-19 18:43:04 +02:00
})
2013-05-19 18:43:04 +02:00
minetest.register_tool("default:pick_stone", {
description = S("Stone Pickaxe"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_stonepick.png",
tool_capabilities = {
full_punch_interval = 1.3,
max_drop_level=0,
groupcaps={
2014-11-30 08:08:45 +01:00
cracky = {times={[2]=2.0, [3]=1.00}, uses=20, maxlevel=1},
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=3},
},
sound = {breaks = "default_tool_breaks"},
groups = {pickaxe = 1}
2013-05-19 18:43:04 +02:00
})
minetest.register_tool("default:pick_bronze", {
description = S("Bronze Pickaxe"),
inventory_image = "default_tool_bronzepick.png",
2013-05-19 18:43:04 +02:00
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=1,
groupcaps={
cracky = {times={[1]=4.50, [2]=1.80, [3]=0.90}, uses=20, maxlevel=2},
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=4},
},
sound = {breaks = "default_tool_breaks"},
groups = {pickaxe = 1}
2013-05-19 18:43:04 +02:00
})
minetest.register_tool("default:pick_steel", {
description = S("Steel Pickaxe"),
inventory_image = "default_tool_steelpick.png",
2013-05-19 18:43:04 +02:00
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=1,
groupcaps={
cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=20, maxlevel=2},
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=4},
},
sound = {breaks = "default_tool_breaks"},
groups = {pickaxe = 1}
2013-05-19 18:43:04 +02:00
})
2013-05-19 18:43:04 +02:00
minetest.register_tool("default:pick_mese", {
description = S("Mese Pickaxe"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_mesepick.png",
tool_capabilities = {
full_punch_interval = 0.9,
max_drop_level=3,
groupcaps={
cracky = {times={[1]=2.4, [2]=1.2, [3]=0.60}, uses=20, maxlevel=3},
},
damage_groups = {fleshy=5},
},
sound = {breaks = "default_tool_breaks"},
groups = {pickaxe = 1}
2013-05-19 18:43:04 +02:00
})
2013-05-19 18:43:04 +02:00
minetest.register_tool("default:pick_diamond", {
description = S("Diamond Pickaxe"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_diamondpick.png",
tool_capabilities = {
full_punch_interval = 0.9,
max_drop_level=3,
groupcaps={
cracky = {times={[1]=2.0, [2]=1.0, [3]=0.50}, uses=30, maxlevel=3},
},
damage_groups = {fleshy=5},
},
sound = {breaks = "default_tool_breaks"},
groups = {pickaxe = 1}
2013-05-19 18:43:04 +02:00
})
--
-- Shovels
--
minetest.register_tool("default:shovel_wood", {
description = S("Wooden Shovel"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_woodshovel.png",
wield_image = "default_tool_woodshovel.png^[transformR90",
tool_capabilities = {
full_punch_interval = 1.2,
max_drop_level=0,
groupcaps={
crumbly = {times={[1]=3.00, [2]=1.60, [3]=0.60}, uses=10, maxlevel=1},
},
damage_groups = {fleshy=2},
},
sound = {breaks = "default_tool_breaks"},
groups = {shovel = 1, flammable = 2}
2013-05-19 18:43:04 +02:00
})
2013-05-19 18:43:04 +02:00
minetest.register_tool("default:shovel_stone", {
description = S("Stone Shovel"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_stoneshovel.png",
wield_image = "default_tool_stoneshovel.png^[transformR90",
tool_capabilities = {
full_punch_interval = 1.4,
max_drop_level=0,
groupcaps={
crumbly = {times={[1]=1.80, [2]=1.20, [3]=0.50}, uses=20, maxlevel=1},
},
damage_groups = {fleshy=2},
},
sound = {breaks = "default_tool_breaks"},
groups = {shovel = 1}
2013-05-19 18:43:04 +02:00
})
minetest.register_tool("default:shovel_bronze", {
description = S("Bronze Shovel"),
inventory_image = "default_tool_bronzeshovel.png",
wield_image = "default_tool_bronzeshovel.png^[transformR90",
2013-05-19 18:43:04 +02:00
tool_capabilities = {
full_punch_interval = 1.1,
max_drop_level=1,
groupcaps={
crumbly = {times={[1]=1.65, [2]=1.05, [3]=0.45}, uses=25, maxlevel=2},
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=3},
},
sound = {breaks = "default_tool_breaks"},
groups = {shovel = 1}
2013-05-19 18:43:04 +02:00
})
minetest.register_tool("default:shovel_steel", {
description = S("Steel Shovel"),
inventory_image = "default_tool_steelshovel.png",
wield_image = "default_tool_steelshovel.png^[transformR90",
2013-05-19 18:43:04 +02:00
tool_capabilities = {
full_punch_interval = 1.1,
max_drop_level=1,
groupcaps={
crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=30, maxlevel=2},
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=3},
},
sound = {breaks = "default_tool_breaks"},
groups = {shovel = 1}
2013-05-19 18:43:04 +02:00
})
2013-05-19 18:43:04 +02:00
minetest.register_tool("default:shovel_mese", {
description = S("Mese Shovel"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_meseshovel.png",
wield_image = "default_tool_meseshovel.png^[transformR90",
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=3,
groupcaps={
crumbly = {times={[1]=1.20, [2]=0.60, [3]=0.30}, uses=20, maxlevel=3},
},
damage_groups = {fleshy=4},
},
sound = {breaks = "default_tool_breaks"},
groups = {shovel = 1}
2013-05-19 18:43:04 +02:00
})
2013-05-19 18:43:04 +02:00
minetest.register_tool("default:shovel_diamond", {
description = S("Diamond Shovel"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_diamondshovel.png",
wield_image = "default_tool_diamondshovel.png^[transformR90",
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=1,
groupcaps={
crumbly = {times={[1]=1.10, [2]=0.50, [3]=0.30}, uses=30, maxlevel=3},
},
damage_groups = {fleshy=4},
},
sound = {breaks = "default_tool_breaks"},
groups = {shovel = 1}
2013-05-19 18:43:04 +02:00
})
--
-- Axes
--
minetest.register_tool("default:axe_wood", {
description = S("Wooden Axe"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_woodaxe.png",
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=0,
groupcaps={
2014-11-30 08:08:45 +01:00
choppy = {times={[2]=3.00, [3]=1.60}, uses=10, maxlevel=1},
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=2},
},
sound = {breaks = "default_tool_breaks"},
groups = {axe = 1, flammable = 2}
2013-05-19 18:43:04 +02:00
})
2013-05-19 18:43:04 +02:00
minetest.register_tool("default:axe_stone", {
description = S("Stone Axe"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_stoneaxe.png",
tool_capabilities = {
full_punch_interval = 1.2,
max_drop_level=0,
groupcaps={
2014-11-30 08:08:45 +01:00
choppy={times={[1]=3.00, [2]=2.00, [3]=1.30}, uses=20, maxlevel=1},
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=3},
},
sound = {breaks = "default_tool_breaks"},
groups = {axe = 1}
2013-05-19 18:43:04 +02:00
})
minetest.register_tool("default:axe_bronze", {
description = S("Bronze Axe"),
inventory_image = "default_tool_bronzeaxe.png",
2013-05-19 18:43:04 +02:00
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=1,
groupcaps={
choppy={times={[1]=2.75, [2]=1.70, [3]=1.15}, uses=20, maxlevel=2},
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=4},
},
sound = {breaks = "default_tool_breaks"},
groups = {axe = 1}
2013-05-19 18:43:04 +02:00
})
minetest.register_tool("default:axe_steel", {
description = S("Steel Axe"),
inventory_image = "default_tool_steelaxe.png",
2013-05-19 18:43:04 +02:00
tool_capabilities = {
full_punch_interval = 1.0,
max_drop_level=1,
groupcaps={
choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=20, maxlevel=2},
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=4},
},
sound = {breaks = "default_tool_breaks"},
groups = {axe = 1}
2013-05-19 18:43:04 +02:00
})
2013-05-19 18:43:04 +02:00
minetest.register_tool("default:axe_mese", {
description = S("Mese Axe"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_meseaxe.png",
tool_capabilities = {
full_punch_interval = 0.9,
max_drop_level=1,
groupcaps={
choppy={times={[1]=2.20, [2]=1.00, [3]=0.60}, uses=20, maxlevel=3},
},
damage_groups = {fleshy=6},
},
sound = {breaks = "default_tool_breaks"},
groups = {axe = 1}
2013-05-19 18:43:04 +02:00
})
2013-05-19 18:43:04 +02:00
minetest.register_tool("default:axe_diamond", {
description = S("Diamond Axe"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_diamondaxe.png",
tool_capabilities = {
full_punch_interval = 0.9,
max_drop_level=1,
groupcaps={
choppy={times={[1]=2.10, [2]=0.90, [3]=0.50}, uses=30, maxlevel=3},
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=7},
},
sound = {breaks = "default_tool_breaks"},
groups = {axe = 1}
2013-05-19 18:43:04 +02:00
})
--
-- Swords
--
minetest.register_tool("default:sword_wood", {
description = S("Wooden Sword"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_woodsword.png",
tool_capabilities = {
full_punch_interval = 1,
max_drop_level=0,
groupcaps={
snappy={times={[2]=1.6, [3]=0.40}, uses=10, maxlevel=1},
},
damage_groups = {fleshy=2},
},
sound = {breaks = "default_tool_breaks"},
groups = {sword = 1, flammable = 2}
2013-05-19 18:43:04 +02:00
})
2013-05-19 18:43:04 +02:00
minetest.register_tool("default:sword_stone", {
description = S("Stone Sword"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_stonesword.png",
tool_capabilities = {
full_punch_interval = 1.2,
max_drop_level=0,
groupcaps={
snappy={times={[2]=1.4, [3]=0.40}, uses=20, maxlevel=1},
},
damage_groups = {fleshy=4},
},
sound = {breaks = "default_tool_breaks"},
groups = {sword = 1}
2013-05-19 18:43:04 +02:00
})
minetest.register_tool("default:sword_bronze", {
description = S("Bronze Sword"),
inventory_image = "default_tool_bronzesword.png",
2013-05-19 18:43:04 +02:00
tool_capabilities = {
full_punch_interval = 0.8,
max_drop_level=1,
groupcaps={
snappy={times={[1]=2.75, [2]=1.30, [3]=0.375}, uses=25, maxlevel=2},
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=6},
},
sound = {breaks = "default_tool_breaks"},
groups = {sword = 1}
2013-05-19 18:43:04 +02:00
})
minetest.register_tool("default:sword_steel", {
description = S("Steel Sword"),
inventory_image = "default_tool_steelsword.png",
2013-05-19 18:43:04 +02:00
tool_capabilities = {
full_punch_interval = 0.8,
max_drop_level=1,
groupcaps={
snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=30, maxlevel=2},
2013-05-19 18:43:04 +02:00
},
damage_groups = {fleshy=6},
},
sound = {breaks = "default_tool_breaks"},
groups = {sword = 1}
2013-05-19 18:43:04 +02:00
})
2013-05-19 18:43:04 +02:00
minetest.register_tool("default:sword_mese", {
description = S("Mese Sword"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_mesesword.png",
tool_capabilities = {
full_punch_interval = 0.7,
max_drop_level=1,
groupcaps={
snappy={times={[1]=2.0, [2]=1.00, [3]=0.35}, uses=30, maxlevel=3},
},
damage_groups = {fleshy=7},
},
sound = {breaks = "default_tool_breaks"},
groups = {sword = 1}
2013-05-19 18:43:04 +02:00
})
2013-05-19 18:43:04 +02:00
minetest.register_tool("default:sword_diamond", {
description = S("Diamond Sword"),
2013-05-19 18:43:04 +02:00
inventory_image = "default_tool_diamondsword.png",
tool_capabilities = {
full_punch_interval = 0.7,
max_drop_level=1,
groupcaps={
snappy={times={[1]=1.90, [2]=0.90, [3]=0.30}, uses=40, maxlevel=3},
},
damage_groups = {fleshy=8},
},
sound = {breaks = "default_tool_breaks"},
groups = {sword = 1}
2013-05-19 18:43:04 +02:00
})
Keys: Allow easy sharing of access without commands This code adds the key concept to minetest_game, and integrates it with lockable nodes. Currently supported lockable items are the Steel Door, the Steel Trapdoor, and the Locked Chest. The goal of this modification is to introduce a fine-grained multi- player permission system that is intuitive and usable without any console or chat commands, and doesn't require extra privileges to be granted or setup. Keys can also physically be conveyed to other players, adding to gameplay and adding some personality that is preferable to console commands or editing formspecs. A skeleton key can be crafted with 1 gold ingot. Skeleton keys can then be matched to a lockable node by right-clicking the skeleton key on a lockable node, which changes the skeleton key to a "key". Gold was chosen as it's currently a not-so very useful item, and therefore it's likely that players have some, but aren't really using it for any purpose. This key can subsequently used by any player to open or access that lockable node, including retrieving items from Locked Chests, or putting items in them. They key is programmed to fit only the particular locked node it is programmed to. This is achieved by storing a secret value in both key and locked node. If this secret value doesn't match, the key will not open the locked node. This allows many keys to be created for one chest or door, but a key will only fit one node ever. The secrets are stored in node, and item meta for the key. If a locked node is removed, all keys that opened it are no longer valid. Even if a new door/chest is placed in exactly the same spot, the old keys will no longer fit that node. Keys can be smelted back in gold ingots if they are no longer useful. The method of storing a secret in nodemeta and itemstackmeta is secure as there is no way for the client to create new items on the server with a particular secret metadata value. Even if you could possible create such an itemstack on the client, the server does not ever read itemstackmeta from a client package. The patch adds an API that allows other nodes and nodes added by mods to use the same keys as well. The method how to implement this is described in game_api.txt. The mod should add 2 callbacks to it's node definition. Example code is given. Textures are from PixelBOX, thanks to Gambit.
2015-12-26 20:16:49 +01:00
--
-- Register Craft Recipies
--
local craft_ingreds = {
wood = "group:wood",
stone = "group:stone",
steel = "default:steel_ingot",
bronze = "default:bronze_ingot",
mese = "default:mese_crystal",
diamond = "default:diamond"
}
for name, mat in pairs(craft_ingreds) do
minetest.register_craft({
output = "default:pick_".. name,
recipe = {
{mat, mat, mat},
{"", "group:stick", ""},
{"", "group:stick", ""}
}
})
minetest.register_craft({
output = "default:shovel_".. name,
recipe = {
{mat},
{"group:stick"},
{"group:stick"}
}
})
minetest.register_craft({
output = "default:axe_".. name,
recipe = {
{mat, mat},
{mat, "group:stick"},
{"", "group:stick"}
}
})
minetest.register_craft({
output = "default:sword_".. name,
recipe = {
{mat},
{mat},
{"group:stick"}
}
})
end
Keys: Allow easy sharing of access without commands This code adds the key concept to minetest_game, and integrates it with lockable nodes. Currently supported lockable items are the Steel Door, the Steel Trapdoor, and the Locked Chest. The goal of this modification is to introduce a fine-grained multi- player permission system that is intuitive and usable without any console or chat commands, and doesn't require extra privileges to be granted or setup. Keys can also physically be conveyed to other players, adding to gameplay and adding some personality that is preferable to console commands or editing formspecs. A skeleton key can be crafted with 1 gold ingot. Skeleton keys can then be matched to a lockable node by right-clicking the skeleton key on a lockable node, which changes the skeleton key to a "key". Gold was chosen as it's currently a not-so very useful item, and therefore it's likely that players have some, but aren't really using it for any purpose. This key can subsequently used by any player to open or access that lockable node, including retrieving items from Locked Chests, or putting items in them. They key is programmed to fit only the particular locked node it is programmed to. This is achieved by storing a secret value in both key and locked node. If this secret value doesn't match, the key will not open the locked node. This allows many keys to be created for one chest or door, but a key will only fit one node ever. The secrets are stored in node, and item meta for the key. If a locked node is removed, all keys that opened it are no longer valid. Even if a new door/chest is placed in exactly the same spot, the old keys will no longer fit that node. Keys can be smelted back in gold ingots if they are no longer useful. The method of storing a secret in nodemeta and itemstackmeta is secure as there is no way for the client to create new items on the server with a particular secret metadata value. Even if you could possible create such an itemstack on the client, the server does not ever read itemstackmeta from a client package. The patch adds an API that allows other nodes and nodes added by mods to use the same keys as well. The method how to implement this is described in game_api.txt. The mod should add 2 callbacks to it's node definition. Example code is given. Textures are from PixelBOX, thanks to Gambit.
2015-12-26 20:16:49 +01:00
minetest.register_tool("default:key", {
description = S("Key"),
Keys: Allow easy sharing of access without commands This code adds the key concept to minetest_game, and integrates it with lockable nodes. Currently supported lockable items are the Steel Door, the Steel Trapdoor, and the Locked Chest. The goal of this modification is to introduce a fine-grained multi- player permission system that is intuitive and usable without any console or chat commands, and doesn't require extra privileges to be granted or setup. Keys can also physically be conveyed to other players, adding to gameplay and adding some personality that is preferable to console commands or editing formspecs. A skeleton key can be crafted with 1 gold ingot. Skeleton keys can then be matched to a lockable node by right-clicking the skeleton key on a lockable node, which changes the skeleton key to a "key". Gold was chosen as it's currently a not-so very useful item, and therefore it's likely that players have some, but aren't really using it for any purpose. This key can subsequently used by any player to open or access that lockable node, including retrieving items from Locked Chests, or putting items in them. They key is programmed to fit only the particular locked node it is programmed to. This is achieved by storing a secret value in both key and locked node. If this secret value doesn't match, the key will not open the locked node. This allows many keys to be created for one chest or door, but a key will only fit one node ever. The secrets are stored in node, and item meta for the key. If a locked node is removed, all keys that opened it are no longer valid. Even if a new door/chest is placed in exactly the same spot, the old keys will no longer fit that node. Keys can be smelted back in gold ingots if they are no longer useful. The method of storing a secret in nodemeta and itemstackmeta is secure as there is no way for the client to create new items on the server with a particular secret metadata value. Even if you could possible create such an itemstack on the client, the server does not ever read itemstackmeta from a client package. The patch adds an API that allows other nodes and nodes added by mods to use the same keys as well. The method how to implement this is described in game_api.txt. The mod should add 2 callbacks to it's node definition. Example code is given. Textures are from PixelBOX, thanks to Gambit.
2015-12-26 20:16:49 +01:00
inventory_image = "default_key.png",
groups = {key = 1, not_in_creative_inventory = 1},
stack_max = 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
2017-10-01 15:41:58 +02:00
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
Keys: Allow easy sharing of access without commands This code adds the key concept to minetest_game, and integrates it with lockable nodes. Currently supported lockable items are the Steel Door, the Steel Trapdoor, and the Locked Chest. The goal of this modification is to introduce a fine-grained multi- player permission system that is intuitive and usable without any console or chat commands, and doesn't require extra privileges to be granted or setup. Keys can also physically be conveyed to other players, adding to gameplay and adding some personality that is preferable to console commands or editing formspecs. A skeleton key can be crafted with 1 gold ingot. Skeleton keys can then be matched to a lockable node by right-clicking the skeleton key on a lockable node, which changes the skeleton key to a "key". Gold was chosen as it's currently a not-so very useful item, and therefore it's likely that players have some, but aren't really using it for any purpose. This key can subsequently used by any player to open or access that lockable node, including retrieving items from Locked Chests, or putting items in them. They key is programmed to fit only the particular locked node it is programmed to. This is achieved by storing a secret value in both key and locked node. If this secret value doesn't match, the key will not open the locked node. This allows many keys to be created for one chest or door, but a key will only fit one node ever. The secrets are stored in node, and item meta for the key. If a locked node is removed, all keys that opened it are no longer valid. Even if a new door/chest is placed in exactly the same spot, the old keys will no longer fit that node. Keys can be smelted back in gold ingots if they are no longer useful. The method of storing a secret in nodemeta and itemstackmeta is secure as there is no way for the client to create new items on the server with a particular secret metadata value. Even if you could possible create such an itemstack on the client, the server does not ever read itemstackmeta from a client package. The patch adds an API that allows other nodes and nodes added by mods to use the same keys as well. The method how to implement this is described in game_api.txt. The mod should add 2 callbacks to it's node definition. Example code is given. Textures are from PixelBOX, thanks to Gambit.
2015-12-26 20:16:49 +01:00
if pointed_thing.type ~= "node" then
return itemstack
end
local pos = pointed_thing.under
node = minetest.get_node(pos)
Keys: Allow easy sharing of access without commands This code adds the key concept to minetest_game, and integrates it with lockable nodes. Currently supported lockable items are the Steel Door, the Steel Trapdoor, and the Locked Chest. The goal of this modification is to introduce a fine-grained multi- player permission system that is intuitive and usable without any console or chat commands, and doesn't require extra privileges to be granted or setup. Keys can also physically be conveyed to other players, adding to gameplay and adding some personality that is preferable to console commands or editing formspecs. A skeleton key can be crafted with 1 gold ingot. Skeleton keys can then be matched to a lockable node by right-clicking the skeleton key on a lockable node, which changes the skeleton key to a "key". Gold was chosen as it's currently a not-so very useful item, and therefore it's likely that players have some, but aren't really using it for any purpose. This key can subsequently used by any player to open or access that lockable node, including retrieving items from Locked Chests, or putting items in them. They key is programmed to fit only the particular locked node it is programmed to. This is achieved by storing a secret value in both key and locked node. If this secret value doesn't match, the key will not open the locked node. This allows many keys to be created for one chest or door, but a key will only fit one node ever. The secrets are stored in node, and item meta for the key. If a locked node is removed, all keys that opened it are no longer valid. Even if a new door/chest is placed in exactly the same spot, the old keys will no longer fit that node. Keys can be smelted back in gold ingots if they are no longer useful. The method of storing a secret in nodemeta and itemstackmeta is secure as there is no way for the client to create new items on the server with a particular secret metadata value. Even if you could possible create such an itemstack on the client, the server does not ever read itemstackmeta from a client package. The patch adds an API that allows other nodes and nodes added by mods to use the same keys as well. The method how to implement this is described in game_api.txt. The mod should add 2 callbacks to it's node definition. Example code is given. Textures are from PixelBOX, thanks to Gambit.
2015-12-26 20:16:49 +01:00
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
})
minetest.register_craft({
type = "fuel",
recipe = "default:pick_wood",
burntime = 6,
})
minetest.register_craft({
type = "fuel",
recipe = "default:shovel_wood",
burntime = 4,
})
minetest.register_craft({
type = "fuel",
recipe = "default:axe_wood",
burntime = 6,
})
minetest.register_craft({
type = "fuel",
recipe = "default:sword_wood",
burntime = 5,
})