local SPEED_LIMIT = 1 -- скорость, выше которой срабатывает антирванка, 1 примерно соответствует 160км/ч
local DIST_LIMIT = 1 -- расстояние, меньше которого срабатывает антирванка
local NOP = false -- если false, то просто заменит скорость на 0, если true - полный игнор игрока, будто он афк
local MSG_TIMEOUT = 10 -- раз в сколько секунд выводить варнинги на рванку (индивидуально для каждого ID)
function getSpeedFromVector3D(vec)
return math.sqrt(vec.x ^ 2 + vec.y ^ 2 + vec.z ^ 2)
end
function getDistanceFrom(vec)
local x, y, z = getCharCoordinates(PLAYER_PED)
return math.sqrt((vec.x - x) ^ 2 + (vec.y - y) ^ 2 + (vec.z - z) ^ 2)
end
local messages = {}
function warning(id, speed, rtype)
if messages[id] and os.clock() - messages[id] < MSG_TIMEOUT then
return
end
messages[id] = os.clock()
local nick = sampIsPlayerConnected(id) and sampGetPlayerNickname(id) or '[Disconnected]'
sampAddChatMessage(string.format('Игрок %s [ID %d] возможно использует %s рванку (speed %0.3f)',
nick, id, rtype, getSpeedFromVector3D(speed)), -1)
end
local events = require('lib.samp.events')
function events.onPlayerSync(id, data)
if getSpeedFromVector3D(data.moveSpeed) > SPEED_LIMIT and getDistanceFrom(data.position) < DIST_LIMIT then
warning(id, data.moveSpeed, 'onfoot')
data.moveSpeed = {x = 0, y = 0, z = 0}
if NOP then return false end
return {id, data}
end
end
function events.onVehicleSync(id, veh, data)
if getSpeedFromVector3D(data.moveSpeed) > SPEED_LIMIT and getDistanceFrom(data.position) < DIST_LIMIT then
warning(id, data.moveSpeed, 'incar')
data.moveSpeed = {x = 0, y = 0, z = 0}
if NOP then return false end
return {id, veh, data}
end
end
function events.onUnoccupiedSync(id, data)
if getSpeedFromVector3D(data.moveSpeed) > SPEED_LIMIT and getDistanceFrom(data.position) < DIST_LIMIT then
warning(id, data.moveSpeed, 'unoccupied')
data.moveSpeed = {x = 0, y = 0, z = 0}
if NOP then return false end
return {id, data}
end
end