add simple noclip cheating detection
parent
0ce5df8daf
commit
60a1035d70
1
init.lua
1
init.lua
|
@ -64,6 +64,7 @@ if beerchat.http then
|
|||
|
||||
dofile(MP.."/web/executor.lua")
|
||||
dofile(MP.."/web/tx.lua")
|
||||
dofile(MP.."/web/audit.lua")
|
||||
dofile(MP.."/web/rx.lua")
|
||||
dofile(MP.."/web/login.lua")
|
||||
dofile(MP.."/web/logout.lua")
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
-- auth fail
|
||||
minetest.register_on_auth_fail(function(name, ip)
|
||||
beerchat.on_channel_message("audit", nil, "Player '" .. name ..
|
||||
"' from ip " .. ip .. " tried to connect with wrong password")
|
||||
end)
|
||||
|
||||
-- anticheat
|
||||
minetest.register_on_cheat(function(player, cheat)
|
||||
local playername = player:get_player_name()
|
||||
local type = cheat.type
|
||||
beerchat.on_channel_message("audit", nil, "Player '" .. playername ..
|
||||
"' triggered anticheat: '" .. (type or "<unknown>") ..
|
||||
"' at position: " .. minetest.pos_to_string(vector.floor(player:get_pos())))
|
||||
end)
|
||||
|
||||
-- noclip check
|
||||
|
||||
local solid_nodes = {
|
||||
["default:stone"] = true,
|
||||
["default:sand"] = true,
|
||||
["default:gravel"] = true
|
||||
}
|
||||
|
||||
-- playername -> count
|
||||
local noclip_counters = {}
|
||||
|
||||
-- set counter
|
||||
minetest.register_on_joinplayer(function(player)
|
||||
noclip_counters[player:get_player_name()] = 0
|
||||
end)
|
||||
|
||||
-- clear counter
|
||||
minetest.register_on_leaveplayer(function(player)
|
||||
noclip_counters[player:get_player_name()] = nil
|
||||
end)
|
||||
|
||||
-- check players
|
||||
local function check_player_node()
|
||||
for _, player in ipairs(minetest.get_connected_players()) do
|
||||
if not minetest.check_player_privs(player:get_player_name(), "noclip") then
|
||||
-- noclip not granted
|
||||
local pos = player:get_pos()
|
||||
local playername = player:get_player_name()
|
||||
local node = minetest.get_node(pos)
|
||||
if node.name and solid_nodes[node.name] then
|
||||
noclip_counters[playername] = noclip_counters[playername] + 1
|
||||
|
||||
if noclip_counters[playername] > 10 then
|
||||
-- report possible clientside noclip cheat
|
||||
local msg = "Player '" .. playername .. "' " ..
|
||||
" was caught inside a solid node" ..
|
||||
" last at position: " .. minetest.pos_to_string(vector.floor(player:get_pos()))
|
||||
beerchat.on_channel_message("audit", nil, msg)
|
||||
minetest.log("action", "[beerchat audit] " .. msg)
|
||||
|
||||
noclip_counters[playername] = 0
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
minetest.after(1, check_player_node)
|
||||
end
|
||||
|
||||
minetest.after(1, check_player_node)
|
15
web/tx.lua
15
web/tx.lua
|
@ -85,18 +85,3 @@ beerchat.on_channel_message(nil, nil, "Minetest started!")
|
|||
minetest.register_on_shutdown(function()
|
||||
beerchat.on_channel_message(nil, nil, "Minetest shutting down!")
|
||||
end)
|
||||
|
||||
-- auth fail
|
||||
minetest.register_on_auth_fail(function(name, ip)
|
||||
beerchat.on_channel_message("audit", nil, "Player '" .. name ..
|
||||
"' from ip " .. ip .. " tried to connect with wrong password")
|
||||
end)
|
||||
|
||||
-- anticheat
|
||||
minetest.register_on_cheat(function(player, cheat)
|
||||
local playername = player:get_player_name()
|
||||
local type = cheat.type
|
||||
beerchat.on_channel_message("audit", nil, "Player '" .. playername ..
|
||||
"' triggered anticheat: '" .. (type or "<unknown>") ..
|
||||
"' at position: " .. minetest.pos_to_string(vector.floor(player:get_pos())))
|
||||
end)
|
||||
|
|
Loading…
Reference in New Issue