From cd39ac77a7c760965c44b2694ff3387e3daa0b21 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Mon, 6 Apr 2015 16:04:23 +0200 Subject: [PATCH] Added first version of metatools - Allowed admins to read metadatas --- mods/metatools/README.md | 25 ++ mods/metatools/init.lua | 256 ++++++++++++++++++++ mods/metatools/textures/metatools_stick.png | Bin 0 -> 3484 bytes 3 files changed, 281 insertions(+) create mode 100644 mods/metatools/README.md create mode 100644 mods/metatools/init.lua create mode 100644 mods/metatools/textures/metatools_stick.png diff --git a/mods/metatools/README.md b/mods/metatools/README.md new file mode 100644 index 00000000..222c9fec --- /dev/null +++ b/mods/metatools/README.md @@ -0,0 +1,25 @@ +Minetest mod metatools +###################### + +A mod inspired by mgl512's itemframe issue + +# Authors + - LeMagnesium / Mg / ElectronLibre : Source code writer + - Ataron : Texture creater + +# Purpose +This mod's aim is to provide a way for admins to navigate through any (ok, not +ignores) nodes on the map, and see values of its metadatas at any of their +stratum. + +# Media +"metatools_stick.png" by Ataron (CC-BY-NC-SA) + +# Todo + - Add a way to SET the metadatas (will be complicated) + - Fix the LICENSE + +# Special thanks + - mgl512 (Le_Docteur) for its locked itemframe which gave me the idea of a tool +allowing to see/edit metadatas + - Ataron who created the stick's texture diff --git a/mods/metatools/init.lua b/mods/metatools/init.lua new file mode 100644 index 00000000..b8651233 --- /dev/null +++ b/mods/metatools/init.lua @@ -0,0 +1,256 @@ +-- Meta-tools mod ßý Mg -- +-- License : GPLv2+ +-- + +metatools = {} +meta_info = {} + +metatools.handle_meta = function(name,value,username) + +end + +metatools.get_metalist = function(meta,username) + for name,value in pairs(meta) do + if (type(value) == "table") then + metatools.get_metalist(value,username) + else + minetest.chat_send_player(username,name.." ==> "..value) + end + end +end + +minetest.register_craftitem("metatools:stick",{ + description = "Meta stick", + inventory_image = "metatools_stick.png", + on_use = function(itemstack, user, pointed_thing) + local username = user:get_player_name() + local nodepos = pointed_thing.under + local nodename = minetest.get_node(nodepos).name + local node = minetest.registered_nodes[nodename] + local meta = minetest.get_meta(nodepos) + local metalist = meta:to_table() + meta_info[username] = {} + meta_info[username]["depth"] = 0 + + metatools.get_metalist(metalist.fields,username) + minetest.chat_send_player(username,"Node located at "..minetest.pos_to_string(nodepos)) + minetest.log("action","[metatools] Player "..username.." saw metadatas of node at "..minetest.pos_to_string(nodepos)) + + end, +}) + +minetest.register_chatcommand("meta", { + privs = {server = true}, + params = "help | open (x,y,z) | show | enter name | quit name | close", + description = "Manipulate metadatas", + func = function(name,param) + local paramlist = param:split(" ") + if param == "" then + minetest.chat_send_player(name,"- meta - Type /meta help for help") + return true + end + + + if paramlist[1] == "help" then + minetest.chat_send_player(name,"Meta help: /meta +") + minetest.chat_send_player(name," help : show this help") + minetest.chat_send_player(name," open (x,y,z) : open node at pos x,y,z") + minetest.chat_send_player(name," show : show fields at node/depth") + minetest.chat_send_player(name," enter name : enter in field name at node/depth") + minetest.chat_send_player(name," quit name : quit field name at node/depth") + --minetest.chat_send_player(name," set name value : set field name to value at node/depth") + minetest.chat_send_player(name," close : close the current node") + + elseif paramlist[1] == "open" then + if meta_info[name] and meta_info[name]["node"] then + minetest.chat_send_player(name,"- meta::open - You already have opened a node without closing it, use /meta close "..minetest.pos_to_string(meta_info[name]["node"]).." to close it and retry") + minetest.log("action","[metatools] Player "..name.." failed opening node : already has one") + return false + end + + if not paramlist[2] then + minetest.chat_send_player(name,"- meta::open - You must provide a position in the forme of (x,y,z)") + minetest.log("action","[metatools] Player "..name.." failed opening node : no position given") + return false + end + + local position = minetest.string_to_pos(paramlist[2]) + if position == nil then + minetest.chat_send_player(name,"- meta::open - Incorrect position format : "..paramlist[2]..", use (x,y,z)") + minetest.log("action","[metatools] Player "..name.." failed opening node : invalid position given") + return false + end + + if minetest.get_node(position).name == "ignore" then + minetest.chat_send_player(name,"- meta::open - You cannot write on ignore : load the nodes near "..paramlist[2].." then retry.") + minetest.log("action","[metatools] Player "..name.." failed opening node at "..paramlist[2].." : node is ignore") + return false + end + + for i,k in ipairs(meta_info) do + if meta_info[i]["node"] and minetest.pos_to_string(meta_info[i]["node"]) == paramlist[2] then + minetest.chat_send_player(name,"- meta::open - Node at "..paramlist[2].." is being held by "..i..". You cannot open it") + minetest.log("action","[metatools] Player "..name.." failed opening node at "..paramlist[2].." : node is held by player "..i) + return false + end + end + + minetest.chat_send_player(name,"- meta::open - You opened node "..minetest.get_node(position).name.." at position "..paramlist[2]) + minetest.chat_send_player(name,"- meta::open - Use /close "..paramlist[2].." to close it") + if not meta_info[name] then + meta_info[name] = {} + end + meta_info[name]["node"] = position + meta_info[name]["stratum"] = 0 + meta_info[name]["pointer"] = minetest.get_meta(position):to_table() + meta_info[name]["path"] = {} + meta_info[name]["path"][0] = meta_info[name]["pointer"] + + minetest.log("action","[metatools] Player "..name.." opened node "..minetest.get_node(position).name.." at pos "..paramlist[2]) + return true + elseif paramlist[1] == "close" then + if not meta_info[name] or not meta_info[name]["node"] then + minetest.chat_send_player(name,"- meta::close - You have no node open, use /meta open (x,y,z) to open one") + minetest.log("action","[metatools] Player "..name.." failed closing node : no node opened") + return false + end + + minetest.chat_send_player(name,"- meta::close - You closed node "..minetest.get_node(meta_info[name]["node"]).name.." at position "..minetest.pos_to_string(meta_info[name]["node"])) + minetest.log("action","[metatools] Player "..name.." closed his node "..minetest.get_node(meta_info[name]["node"]).name.." at pos "..minetest.pos_to_string(meta_info[name]["node"])) + meta_info[name]["node"] = nil + meta_info[name]["stratum"] = nil + meta_info[name]["pointer"] = nil + meta_info[name]["path"] = nil + return true + + elseif paramlist[1] == "show" then + if not meta_info[name] or not meta_info[name]["node"] then + minetest.chat_send_player(name,"- meta::show - You have no node open, use /meta open (x,y,z) to open one") + minetest.log("action","[metatools] Player "..name.." failed showing node : no node opened") + return false + end + + local metalist = meta_info[name]["pointer"] + local position = minetest.pos_to_string(meta_info[name]["node"]) + minetest.chat_send_player(name,"- meta::show - Showing ways at stratum "..meta_info[name]["stratum"].." : ") + + for key,value in pairs(metalist) do + if type(value) == "table" then + minetest.chat_send_player(name,key.." -> Stratum "..meta_info[name]["stratum"]+1) + elseif type(value) ~= "userdata" then + minetest.chat_send_player(name,key.." => "..value) + else + minetest.chat_send_player(name,key.." => ") + end + end + minetest.chat_send_player(name,#metalist .. " items shown") + minetest.log("action","[metatools] Player "..name.." saw datas of node "..minetest.get_node(meta_info[name]["node"]).name.." at pos "..position.." with stratum "..meta_info[name]["stratum"]) + + elseif paramlist[1] == "enter" then + if not meta_info[name] or not meta_info[name]["node"] then + minetest.chat_send_player(name,"- meta::enter - You have no node open, use /meta open (x,y,z) to open one") + minetest.log("action","[metatools] Player "..name.." failed showing node : no node opened") + return false + end + + if not paramlist[2] then + minetest.chat_send_player(name,"- meta::enter - You must provide a name for the stratum you want to enter in") + minetest.log("action","[metatools] Player "..name.." failed entering in stratum : no name given") + return false + end + + local metalist = meta_info[name]["pointer"] + for key,value in pairs(metalist) do + if key == paramlist[2] and (type(value) == "table") then + minetest.chat_send_player(name,"- meta::enter - Entering stratum "..meta_info[name]["stratum"]+1 .. " through "..paramlist[2]) + meta_info[name]["pointer"] = value + meta_info[name]["path"][meta_info[name]["stratum"]+1] = value + meta_info[name]["stratum"] = meta_info[name]["stratum"]+1 + minetest.log("action","[metatools] Player "..name.." entered stratum "..meta_info[name]["stratum"].." of node "..minetest.get_node(meta_info[name]["node"]).name.." at pos "..minetest.pos_to_string(meta_info[name]["node"])) + return true + end + end + + minetest.chat_send_player(name,"- meta::enter - Cannot enter further stratum through "..paramlist[2]) + minetest.log("action","[metatools] Player "..name.." failed entering stratum "..meta_info[name]["stratum"].." of node "..minetest.get_node(meta_info[name]["node"]).name.." at pos "..minetest.pos_to_string(meta_info[name]["node"])) + return false + + elseif paramlist[1] == "quit" then + if not meta_info[name] or not meta_info[name]["node"] then + minetest.chat_send_player(name,"- meta::quit - You have no node open, use /meta open (x,y,z) to open one") + minetest.log("action","[metatools] Player "..name.." failed quitting stratum : no node opened") + return false + end + + if meta_info[name]["stratum"] == 0 then + minetest.chat_send_player(name,"- meta::quit - You are in the highest stratum, you cannot go back") + minetest.log("action","[metatools] Player "..name.." tried quitting highest stratum") + return false + end + + meta_info[name]["stratum"] = meta_info[name]["stratum"] - 1 + meta_info[name]["pointer"] = meta_info[name]["path"][meta_info[name]["stratum"]] + meta_info[name]["path"][meta_info[name]["stratum"] + 1] = nil + + minetest.chat_send_player(name,"- meta::quit - Stratum "..meta_info[name]["stratum"] + 1 .." quitted. Actual stratum is "..meta_info[name]["stratum"]) + minetest.log("action","[metatools] Player "..name.." quited stratum "..meta_info[name]["stratum"]+1 .." of node "..minetest.get_node(meta_info[name]["node"]).name.." at pos "..minetest.pos_to_string(meta_info[name]["node"])) + return true + +--[[ elseif paramlist[1] == "set" then + if not meta_info[name] or not meta_info[name]["node"] then + minetest.chat_send_player(name,"- meta::set - You have no node open, use /meta open (x,y,z) to open one") + minetest.log("action","[metatools] Player "..name.." failed setting value : no node opened") + return false + end + + if not paramlist[2] or tonumber(paramlist[2]) == nil then + minetest.chat_send_player(name,"- meta::set - You must provide a number of index for the value you want to set") + minetest.log("action","[metatools] Player "..name.." failed setting value : no index given") + return false + end + paramlist[2] = tonumber(paramlist[2]) + + if not paramlist[3] then + minetest.chat_send_player(name,"- meta::set - You must provide a value for the variable you want to set") + minetest.log("action","[metatools] Player "..name.." failed setting variable ".. paramlist[3] .." : no value given") + return false + end + + local i = 4 + while (i < #paramlist) do + paramlist[3] = paramlist[3] .. " " .. paramlist[i] + paramlist[i] = nil + i = i + 1 + end + + local metalist = meta_info[name]["pointer"] + local keyring = 0 + for key,value in pairs(metalist) do + print(keyring .."==".. paramlist[2]) + if keyring == paramlist[2] and type(value) ~= "table" and type(value) ~= "userdata" then + minetest.chat_send_player(name,"- meta::set - Set variable "..key .. " with value "..paramlist[3]) + value = paramlist[3] + minetest.log("action","[metatools] Player "..name .. " set variable ".. paramlist[2] .. " to " .. paramlist[3] .. " at stratum "..meta_info[name]["stratum"]+1 .." of node "..minetest.get_node(meta_info[name]["node"]).name.." at pos "..minetest.pos_to_string(meta_info[name]["node"])) + VoxelManip():update_map() + return true + end + keyring = keyring + 1 + end + + minetest.chat_send_player(name,"- meta::set - Variable at "..paramlist[2] .." not found") + minetest.log("action","[metatools] Player "..name.." failed setting variable ".. paramlist[2] .." to value ".. paramlist[3] .." in stratum "..meta_info[name]["stratum"].." of node "..minetest.get_node(meta_info[name]["node"]).name.." at pos "..minetest.pos_to_string(meta_info[name]["node"])) + return false]] + else + minetest.chat_send_player(name,"- meta - Subcommand " .. paramlist[1] .. " not known. Type /meta help for help") + return false + end + end +}) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + if meta_info[name] then + meta_info[name] = nil + minetest.log("action","[metatools] Flushed datas of player "..name) + end +end) diff --git a/mods/metatools/textures/metatools_stick.png b/mods/metatools/textures/metatools_stick.png new file mode 100644 index 0000000000000000000000000000000000000000..42302e667f00d5d1503939b2548ab94fe3688270 GIT binary patch literal 3484 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 KMNUMnLSTZ$K!W-J literal 0 HcmV?d00001