Skip to content

Commit

Permalink
add simple noclip cheating detection
Browse files Browse the repository at this point in the history
  • Loading branch information
BuckarooBanzay committed Sep 11, 2020
1 parent 0ce5df8 commit 60a1035
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 15 deletions.
1 change: 1 addition & 0 deletions init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
65 changes: 65 additions & 0 deletions web/audit.lua
Original file line number Diff line number Diff line change
@@ -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 changes: 0 additions & 15 deletions web/tx.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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)

0 comments on commit 60a1035

Please sign in to comment.