X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=builtin%2Fchatcommands.lua;h=f8df83d8e2a8bef9fba33d79517d16ead48a1843;hb=f20267862f075cf9cb7a05df3d173499088dca90;hp=6a3b29e7c83004b88fddf4d15387edd718a28f7a;hpb=ab433775777c4f5055bcf4d2a1cffc506c4f9961;p=dragonfireclient.git diff --git a/builtin/chatcommands.lua b/builtin/chatcommands.lua index 6a3b29e7c..f8df83d8e 100644 --- a/builtin/chatcommands.lua +++ b/builtin/chatcommands.lua @@ -107,7 +107,7 @@ minetest.register_chatcommand("grant", { description = "Give privilege to player", privs = {}, func = function(name, param) - if not minetest.check_player_privs(name, {privs=true}) and + if not minetest.check_player_privs(name, {privs=true}) and not minetest.check_player_privs(name, {basic_privs=true}) then minetest.chat_send_player(name, "Your privileges are insufficient.") return @@ -153,7 +153,7 @@ minetest.register_chatcommand("revoke", { description = "Remove privilege from player", privs = {}, func = function(name, param) - if not minetest.check_player_privs(name, {privs=true}) and + if not minetest.check_player_privs(name, {privs=true}) and not minetest.check_player_privs(name, {basic_privs=true}) then minetest.chat_send_player(name, "Your privileges are insufficient.") return @@ -261,9 +261,12 @@ minetest.register_chatcommand("teleport", { } for _, d in ipairs(tries) do local p = {x = pos.x+d.x, y = pos.y+d.y, z = pos.z+d.z} - local n = minetest.get_node(p) - if not minetest.registered_nodes[n.name].walkable then - return p, true + local n = minetest.get_node_or_nil(p) + if n and n.name then + local def = minetest.registered_nodes[n.name] + if def and not def.walkable then + return p, true + end end end return pos, false @@ -272,6 +275,9 @@ minetest.register_chatcommand("teleport", { local teleportee = nil local p = {} p.x, p.y, p.z = string.match(param, "^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$") + p.x = tonumber(p.x) + p.y = tonumber(p.y) + p.z = tonumber(p.z) teleportee = minetest.get_player_by_name(name) if teleportee and p.x and p.y and p.z then minetest.chat_send_player(name, "Teleporting to ("..p.x..", "..p.y..", "..p.z..")") @@ -302,6 +308,9 @@ minetest.register_chatcommand("teleport", { local p = {} local teleportee_name = nil teleportee_name, p.x, p.y, p.z = string.match(param, "^([^ ]+) +([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+)$") + p.x = tonumber(p.x) + p.y = tonumber(p.y) + p.z = tonumber(p.z) if teleportee_name then teleportee = minetest.get_player_by_name(teleportee_name) end @@ -465,10 +474,10 @@ minetest.register_chatcommand("spawnentity", { minetest.chat_send_player(name, "entityname required") return end - print('/spawnentity invoked, entityname="'..entityname..'"') + minetest.log("action", '/spawnentity invoked, entityname="'..entityname..'"') local player = minetest.get_player_by_name(name) if player == nil then - print("Unable to spawn entity, player is nil") + minetest.log("error", "Unable to spawn entity, player is nil") return true -- Handled chat message end local p = player:getpos() @@ -485,7 +494,7 @@ minetest.register_chatcommand("pulverize", { func = function(name, param) local player = minetest.get_player_by_name(name) if player == nil then - print("Unable to pulverize, player is nil") + minetest.log("error", "Unable to pulverize, player is nil") return true -- Handled chat message end if player:get_wielded_item():is_empty() then @@ -509,34 +518,45 @@ minetest.register_on_punchnode(function(pos, node, puncher) end) minetest.register_chatcommand("rollback_check", { - params = "[] []", + params = "[] [] [limit]", description = "check who has last touched a node or near it, ".. - "max. ago (default range=0, seconds=86400=24h)", + "max. ago (default range=0, seconds=86400=24h, limit=5)", privs = {rollback=true}, func = function(name, param) - local range, seconds = string.match(param, "(%d+) *(%d*)") + local range, seconds, limit = + param:match("(%d+) *(%d*) *(%d*)") range = tonumber(range) or 0 seconds = tonumber(seconds) or 86400 - minetest.chat_send_player(name, "Punch a node (limits set: range=".. - dump(range).." seconds="..dump(seconds).."s)") + limit = tonumber(limit) or 5 + if limit > 100 then + minetest.chat_send_player(name, "That limit is too high!") + return + end + minetest.chat_send_player(name, "Punch a node (range=".. + range..", seconds="..seconds.."s, limit="..limit..")") + minetest.rollback_punch_callbacks[name] = function(pos, node, puncher) local name = puncher:get_player_name() - minetest.chat_send_player(name, "Checking...") - local actor, act_p, act_seconds = - minetest.rollback_get_last_node_actor(pos, range, seconds) - if actor == "" then + minetest.chat_send_player(name, "Checking "..minetest.pos_to_string(pos).."...") + local actions = minetest.rollback_get_node_actions(pos, range, seconds, limit) + local num_actions = #actions + if num_actions == 0 then minetest.chat_send_player(name, "Nobody has touched the ".. - "specified location in "..dump(seconds).." seconds") + "specified location in "..seconds.." seconds") return end - local nodedesc = "this node" - if act_p.x ~= pos.x or act_p.y ~= pos.y or act_p.z ~= pos.z then - nodedesc = minetest.pos_to_string(act_p) + local time = os.time() + for i = num_actions, 1, -1 do + local action = actions[i] + minetest.chat_send_player(name, + ("%s %s %s -> %s %d seconds ago.") + :format( + minetest.pos_to_string(action.pos), + action.actor, + action.oldnode.name, + action.newnode.name, + time - action.time)) end - local nodename = minetest.get_node(act_p).name - minetest.chat_send_player(name, "Last actor on "..nodedesc.. - " was "..actor..", "..dump(act_seconds).. - "s ago (node is now "..nodename..")") end end, }) @@ -548,7 +568,7 @@ minetest.register_chatcommand("rollback", { func = function(name, param) local target_name, seconds = string.match(param, ":([^ ]+) *(%d*)") if not target_name then - local player_name = nil; + local player_name = nil player_name, seconds = string.match(param, "([^ ]+) *(%d*)") if not player_name then minetest.chat_send_player(name, "Invalid parameters. See /help rollback and /help rollback_check") @@ -558,13 +578,13 @@ minetest.register_chatcommand("rollback", { end seconds = tonumber(seconds) or 60 minetest.chat_send_player(name, "Reverting actions of ".. - dump(target_name).." since "..dump(seconds).." seconds.") + target_name.." since "..seconds.." seconds.") local success, log = minetest.rollback_revert_actions_by( target_name, seconds) - if #log > 10 then + if #log > 100 then minetest.chat_send_player(name, "(log is too long to show)") else - for _,line in ipairs(log) do + for _, line in pairs(log) do minetest.chat_send_player(name, line) end end @@ -653,6 +673,24 @@ minetest.register_chatcommand("unban", { end, }) +minetest.register_chatcommand("kick", { + params = " [reason]", + description = "kick a player", + privs = {kick=true}, + func = function(name, param) + local tokick, reason = string.match(param, "([^ ]+) (.+)") + if not tokick then + tokick = param + end + if not minetest.kick_player(tokick, reason) then + minetest.chat_send_player(name, "Failed to kick player " .. tokick) + else + minetest.chat_send_player(name, "kicked " .. tokick) + minetest.log("action", name .. " kicked " .. tokick) + end + end, +}) + minetest.register_chatcommand("clearobjects", { params = "", description = "clear all objects in world", @@ -675,7 +713,7 @@ minetest.register_chatcommand("msg", { if found then if minetest.get_player_by_name(sendto) then minetest.log("action", "PM from "..name.." to "..sendto..": "..message) - minetest.chat_send_player(sendto, "PM from "..name..": "..message, false) + minetest.chat_send_player(sendto, "PM from "..name..": "..message) minetest.chat_send_player(name, "Message sent") else minetest.chat_send_player(name, "The player "..sendto.." is not online")