Metatool Minetest mod provides API for registering metadata manipulation tools and other tools primarily focused on special node data operations.
Basic functionality for tools come as two primary functions: copy and paste.
Privileged tools without recipe will be given by using special /metatool:give
command.
/metatool:give
does not require give
privs./metatool:give
without arguments will list tools player can get.ban
by default.For more complete and tool specific documentation go see README.md files in subdirectories.
Example to add support for technic:injector
local definition = {
name = "sci",
nodes = "technic:injector",
group = "technic injector",
copy = function(self, node, pos, player)
-- Get some metadata from injector node and store it within
-- tool memory and also set new nice description for tool.
local meta = minetest.get_meta(pos)
return {
description = "This wand has some injector data",
myvalue = meta:get_string("owner")
}
end,
paste = function(self, node, pos, player, data)
-- Restore SCI metatdata from tool memory
local meta = minetest.get_meta(pos)
meta:set_string("owner", data.myvalue)
end,
}
Supply above definition for tool, mytool variable is returned from metatool:register_tool method
mytool:load_node_definition(definition)
That's all, now you can use tubetool wand to copy/paste metadata owner value from one injector to another.
mytool
is registered tool)mytool:load_node_definition(definition)
Callback on_read_info(tooldef, player, pointed_thing, node, pos, nodedef)
Example definition:
on_read_info = function(tooldef, player, pointed_thing, node, pos, nodedef)
tooldef:info(node, pos, player)
end,
Callback data, group, description = on_read_node(tooldef, player, pointed_thing, node, pos, nodedef)
Example definition:
on_read_node = function(tooldef, player, pointed_thing, node, pos, nodedef)
local data, group = tooldef:copy(node, pos, player)
local description = type(data) == 'table' and data.description or ('Data from ' .. minetest.pos_to_string(pos))
return data, group, description
end,
Callback on_write_node(tooldef, data, group, player, pointed_thing, node, pos, nodedef)
Example definition:
on_write_node = function(tooldef, data, group, player, pointed_thing, node, pos, nodedef)
tooldef:paste(node, pos, player, data, group)
end,
Callback data = copy(node, pos, player)
Example definition:
copy = function(self, node, pos, player)
return { description = "new description", myvalue = "any value" }
end,
Callback paste(node, pos, player, data)
Example definition:
paste = function(self, node, pos, player, data)
print("Used on " .. node.name .. " by " .. player:get_player_name())
end,
Parameter protection_bypass_info = "privilege1,privilege2"
Bypass all info protection checks when using tool if player has listed privs.
Parameter protection_bypass_read = "privilege1,privilege2"
Bypass all read protection checks when using tool if player has listed privs.
Parameter protection_bypass_write = { "privilege1,privilege2" }
Bypass all write protection checks when using tool if player has listed privs.
Callback allowed = before_info(nodedef, pos, player)
Executed before node info is called, this method can override all protection checks.
Above protection_bypass_info parameters might not work if this is overridden.
Callback allowed = before_read(nodedef, pos, player)
Executed before node reading is called, this method can override all protection checks.
Above protection_bypass_read parameters might not work if this is overridden.
Callback allowed = before_write(nodedef, pos, player)
Executed before node reading is called, this method can override all protection checks.
Above protection_bypass_write parameters might not work if this is overridden.
mytool = metatool:register_tool(name, definition)
metatool:register_node(definition)
node, pos, nodedef = metatool.get_node(tool, player, pointed_thing)
metatool.write_data(itemstack, data, description)
data = metatool.read_data = function(itemstack)
Protection checks are done automatically for all tool uses, node registration does not need any protection checks. By default tools cannot be used to read data from protected nodes and cannot be used to write data to protected nodes.
In addition to global configuration, tools can override default tool wide protection behavior and also node definition
can override default protection behavior for nodes. See before_*
callbacks and protection_bypass_*
attributes.