Code:
--[[
Rottweiler's Anti-Cheat
06/10/2015 18:13
]]
rac = rac or {};
--Config
rac.G = _G;
rac.ProductName = "[Rottweiler's Anti-Cheat]";
rac.CheckAdmins = false;
rac.PrintServerConsole = true;
rac.BadCVars = {"sv_cheats", "sv_allowcslua", "host_timescale"};
rac.CVarChanged = rac.G.cvars.OnConVarChanged;
rac.AddHook = rac.G.hook.Add;
--Client
if CLIENT then
function rac.SendUpdateVar(cmd, oldval, newval)
net.Start("rac_check")
net.WriteString(cmd)
net.WriteInt((oldval == nil and 0 or oldval), 32)
net.WriteInt((newval == nil and 0 or newval), 32)
net.SendToServer()
end
cvars.OnConVarChanged = function(name, oldvalue, newvalue)
for k,v in pairs(rac.BadCVars) do
if (v == name) then
rac.SendUpdateVar(name, tonumber(oldvalue), tonumber(newvalue))
end
end
rac.CVarChanged(name, oldvalue, newvalue)
end
function rac.InitializeClient()
for k,v in pairs(rac.BadCVars) do
rac.SendUpdateVar(v, 0, GetConVar(v):GetInt())
end
end
net.Receive("rac_check", function(ln, ply)
rac.InitializeClient()
end)
rac.InitializeClient()
end
--Server
if SERVER then
AddCSLuaFile()
util.AddNetworkString("rac_check")
function rac.PrintAdmins(txt)
for k,v in pairs(player.GetAll()) do
if (IsValid(v) and v:IsPlayer()) then
if (v:IsAdmin() or v:IsSuperAdmin()) then
--v:ChatPrint(rac.ProductName .. " " .. pl:Name() .. " (" .. pl:SteamID() .. ") seems to have " .. cvar .. " enabled clientside")
v:ChatPrint(rac.ProductName .. " " .. txt)
end
end
end
end
function rac.Initialize()
print(rac.ProductName .. " Initialized");
end
function rac.Validate(ply, cmd, oldval, newval)
for k,v in pairs(rac.BadCVars) do
if (cmd == v and newval ~= GetConVar(cmd):GetInt()) then
if (rac.CheckAdmins) then
rac.Detected(ply, cmd, oldval, newval)
else
if (not ply:IsAdmin() and not ply:IsSuperAdmin()) then
rac.Detected(ply, cmd, oldval, newval)
end
end
end
end
end
function rac.Detected(ply, cmd, oldval, newval)
rac.PrintAdmins(ply:Name() .. "'s " .. cmd .. " value varies from the server's. (It's set to " .. newval .. " client-side)");
if (rac.PrintServerConsole) then
print(ply:Name() .. "'s " .. cmd .. " value varies from the server's. (It's set to " .. newval .. " client-side)");
end
end
function rac.ForceCheck(ply)
net.Start("rac_check");
net.Send(ply);
end
rac.AddHook("PlayerInitialSpawn", "racPlayerSpawnMethod66", function(ply)
rac.ForceCheck(ply);
end)
net.Receive("rac_check", function(ln, ply)
local cmd = net.ReadString();
local oldval = net.ReadInt(32);
local newval = net.ReadInt(32);
rac.Validate(ply, cmd, oldval, newval);
end)
rac.Initialize()
end