-- -- Minetest player cloaking mod -- -- © 2018 by luk3yx -- cloaking = {} -- Expose the real get_connected_players and get_player_by_name for mods that -- can use them. cloaking.get_connected_players = minetest.get_connected_players cloaking.get_player_by_name = minetest.get_player_by_name local cloaked_players = {} -- Override built-in functions minetest.get_connected_players = function() local a = {} for _, player in ipairs(cloaking.get_connected_players()) do if not cloaked_players[player:get_player_name()] then table.insert(a, player) end end return a end minetest.get_player_by_name = function(player) if cloaked_players[player] then return nil else return cloaking.get_player_by_name(player) end end -- Override chatcommands minetest.register_chatcommand("status", { description = "Print server status", func = function(name, param) local status = minetest.get_server_status() status = status:sub(1, status:find('{', 1, true)) local players = {} for _, player in ipairs(minetest.get_connected_players()) do table.insert(players, player:get_player_name()) end players = table.concat(players, ', ') status = status .. players .. '}' return true, status end }) -- The cloak and uncloak functions cloaking.cloak_player = function(player) if type(player) == "string" then player = cloaking.get_player_by_name(player) end victim = player:get_player_name() player:set_properties({visual_size = {x = 0, y = 0}, collisionbox = {0,0,0,0,0,0}}) p:set_nametag_attributes({text = " "}) cloaked_players[victim] = true minetest.chat_send_all("*** " .. victim .. " left the game") if irc then irc.say("*** " .. victim .. " left the game") end end cloaking.uncloak_player = function(player) if type(player) == "string" then player = cloaking.get_player_by_name(player) end victim = player:get_player_name() player:set_properties({visual_size = {x = 1, y = 1}, collisionbox = {-0.25,-0.85,-0.25,0.25,0.85,0.25}}) p:set_nametag_attributes({text = victim}) cloaked_players[victim] = false minetest.chat_send_all("*** " .. victim .. " joined the game") if irc then irc.say("*** " .. victim .. " joined the game") end end -- Auto-uncloak on chat message minetest.register_on_chat_message(function(name, message) if cloaked_players[name] then cloaking.uncloak_player(name) end end) -- The /cloak and /uncloak commands minetest.register_chatcommand("cloak", { params = "[victim]", description = "Cloak a player so they are not visible.", privs = {privs = true}, func = function(player, victim) if not victim or victim == '' then victim = player end p = cloaking.get_player_by_name(victim) if not p then return false, "Could not find a player with the name '" .. victim .. "'!" end if cloaked_players[victim] then return false, victim .. " is already cloaked!" end cloaking.cloak_player(p) return true, "Cloaked!" end }) minetest.register_chatcommand("uncloak", { params = "[victim]", description = "Uncloak a player so they are visible.", func = function(player, victim) if not victim or victim == '' then victim = player elseif not minetest.get_player_privs(player).privs then return false, "You don't have permission to uncloak someone else." end p = cloaking.get_player_by_name(victim) if not p then return false, "Could not find a player with the name '" .. victim .. "'!" end if not cloaked_players[victim] then return false, victim .. " is not cloaked!" end cloaking.uncloak_player(p) return true, "Uncloaked!" end })