MAATRIX GAMES / Блог / Античит для GTA-серверов

Античит для GTA-серверов

MAATRIX GAMES

Один спидхакер на RP-сервере — и вечер испорчен: игроки жалуются в дискорде, модератор бегает банить вручную, а через час приходит второй такой же с летающей машиной. Читы на GTA-серверах — не гипотетическая угроза, а рутина для любого проекта, набравшего хотя бы сотню онлайна. Разберём, что умеет встроенная защита FiveM, чем её усиливают сторонние скрипты обнаружения на FiveM, SA-MP/open.mp и RAGE:MP, и почему главный принцип один для всех платформ: клиенту нельзя доверять ничего, что влияет на баланс игры.

Почему клиент — это враг по умолчанию

GTA-мультиплеерные платформы (FiveM, SA-MP, open.mp, RAGE:MP, alt:V) устроены одинаково в главном: игра запускается на компьютере игрока, а сервер получает от неё события — "я выстрелил", "я нанёс урон", "у меня теперь 50000 долларов". Клиент — это чужой процесс на чужом железе, и человек с базовыми навыками может подключить к нему отладчик, инжектор DLL или готовый чит-лаунчер и начать отправлять серверу события, которых на самом деле не было.

Отсюда правило, которое стоит прибить гвоздями над каждым техническим решением на сервере: клиент может предлагать, сервер решает. Клиентский скрипт может сказать "хочу купить эту машину", но именно серверный код должен проверить баланс, списать деньги и заспавнить машину — а не наоборот. Расчёт денег на клиенте, доверие к клиентским координатам без проверки, урон, который клиент сам себе засчитывает — всё это рано или поздно превращается в дыру, через которую читер выкачает экономику сервера за один вечер.

Античит в этом смысле — не отдельная программа, которую можно "включить и забыть", а сумма трёх слоёв: защита платформы, сторонние скрипты обнаружения аномального поведения и, самое важное, архитектура вашего собственного гейммод-скрипта.

Встроенная защита FiveM

У FiveM нет единого продукта под названием "антивирус", но платформа даёт цепочку защит на нескольких уровнях, часть из которых администратор может донастроить через server.cfg.

Проверка исполняемого клиента. FiveM запускается поверх модифицированного клиента GTA V и на уровне платформы отсеивает часть популярных чит-инжекторов и модифицированные исполняемые файлы ещё до входа в игру — первый барьер, отсекающий самых ленивых читеров.

OneSync и владение сущностями. С OneSync сервер отслеживает, какой клиент управляет (owns) конкретным объектом — машиной, педом, оружием в мире. Без этого невозможно понять, кто из игроков реально мог повлиять на конкретную сущность, а значит и ловить читера с телепортом или дюпом становится сложнее.

Server-side convars безопасности. В server.cfg есть параметры, которые стоит проверить на любом продакшн-сервере:

set sv_enforceGameBuild "3095"
set sv_filterRequestControl "1"
set sv_scriptHookAllowed "0"
set sv_authMaxVariance "1"
set sv_authMinTrust "5"

sv_enforceGameBuild фиксирует версию клиента (актуальную стоит сверять с документацией Cfx.re), отсекая устаревшие или подменённые сборки. sv_filterRequestControl ограничивает, кто может запрашивать управление чужой сущностью — частый вектор дюп-читов на машины. sv_scriptHookAllowed 0 блокирует легаси-читы на ScriptHookV для клиентов без явного разрешения ресурса.

txAdmin. Официальная админ-панель FiveM — не античит, но через неё вы получаете журнал подключений и возможность забанить не только по имени, а по нескольким идентификаторам сразу (Steam, license, discord, IP), что усложняет читеру возврат под новым ником.

Встроенная защита ловит известные и массовые чит-клиенты, но не защитит от игрока, который написал собственный скрипт под конкретную дыру в вашем гейммоде — это зона ответственности серверной логики и сторонних скриптов обнаружения.

Нужен игровой сервер?

MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.

Создать сервер

Сторонние скрипты обнаружения на FiveM

Поверх платформенной защиты RP-серверы обычно ставят отдельный ресурс-детектор — скрипт, который на сервере (не на клиенте!) следит за поведением игроков и триггерит алерты или автобан при подозрительных паттернах. Логика похожа у большинства таких решений, и её вполне реально написать самому под свой фреймворк.

Проверка скорости передвижения. Сервер знает позицию игрока в момент времени T1 и T2, знает разницу во времени между тиками и может посчитать, какую дистанцию игрок реально мог преодолеть на своём средстве передвижения (пешком, в машине, на самолёте — лимиты разные). Псевдологика на серверном событии:

AddEventHandler('playerConnecting', function()
  -- регистрируем позицию при коннекте
end)

CreateThread(function()
  while true do
    Wait(1000)
    for _, playerId in ipairs(GetPlayers()) do
      local ped = GetPlayerPed(playerId)
      local coords = GetEntityCoords(ped)
      local dist = #(coords - lastCoords[playerId] or coords)
      if dist > maxAllowedDistancePerSecond then
        FlagSuspicious(playerId, 'speed', dist)
      end
      lastCoords[playerId] = coords
    end
  end
end)

Детект телепортов. Частный случай проверки скорости — резкий скачок координат за один тик без логичного объяснения (не респавн, не загрузка в дом через дверь-триггер). Такие скрипты ведут "белый список" легитимных телепортов (двери, гараж, эвакуация) — всё, что не попало в список, считают подозрительным.

God mode и спавн предметов вне логики. Бессмертие ловят сверкой: сервер знает, что применил к игроку урон (через ApplyDamageToPed или серверную валидацию клиентского события), но здоровье в течение нескольких тиков не падает — повод для флага. Аналогично с оружием: если игрок внезапно получил ствол, которого не было в его инвентаре по данным сервера, и не прошёл легитимный путь (магазин, крафт, лут) — это сигнал дюп-чита или инжекта.

Такие скрипты по-хорошему не банят сразу автоматически (ложные срабатывания на лаге — обычное дело), а копят очки подозрительности и либо кикают при явном превышении порога, либо шлют алерт модераторам в дискорд-вебхук для ручной проверки. Слепой автобан на первом флаге быстро выжигает лояльную аудиторию из-за рассинхрона сети.

SA-MP, open.mp: детекция без OneSync

На SA-MP и его современном форке open.mp ситуация архитектурно другая: нет OneSync, сеть работает иначе, и большинство функций сервер должен реализовывать с нуля через нативы (SetPlayerHealth, GetPlayerPos, таймеры). Именно поэтому в SA-MP-комьюнити исторически много отдельных open-source плагинов-античитов — они компенсируют то, чего нет "из коробки".

Логика та же, что на FiveM (скорость, телепорты, урон), но реализуется на уровне серверного плагина (C++/Pawn), цепляющегося к нативным событиям раньше игрового скрипта. Это даёт более низкоуровневый контроль, но требует совместимости плагина с конкретной версией сервера — при обновлении open.mp сверяйтесь с changelog, прежде чем катить на продакшн, иначе плагин может конфликтовать с движком или не загрузиться. Отдельно стоит следить за подделкой версии клиента при рукопожатии и дюпом оружия через баги конкретных геймодов — это уже вопрос ревью вашего Pawn-кода, а не общий античит.

RAGE:MP и alt:V: акцент на серверную валидацию

RAGE:MP и alt:V построены на модели "тонкий клиент, толстый сервер" сильнее, чем FiveM: серверная часть пишется на JavaScript/TypeScript или C# (alt:V) и по умолчанию не доверяет клиенту почти ничего, кроме управления. Готовых античит-пакетов под эти платформы меньше, чем под FiveM, поэтому основная нагрузка ложится на архитектуру вашего собственного серверного кода.

Практический паттерн для RAGE:MP (JS):

mp.events.add('playerDamage', (player, healthLoss, armorLoss, weapon) => {
  const expected = calculateExpectedDamage(player, weapon); // не доверяем клиенту
  if (Math.abs(healthLoss - expected) > tolerance) {
    logSuspicious(player, 'damage_mismatch', { healthLoss, expected });
    return;
  }
  applyServerSideDamage(player, expected);
});

Даже если платформа технически позволяет клиенту сообщить "нанесён урон X", итоговое изменение здоровья и денежные последствия (штраф за смерть, страховка, лут с трупа) должен считать и применять только серверный код с проверкой на разумность значения.

Серверная валидация денег и урона в ESX/QBCore

Это самая частая дыра на реальных RP-серверах — не чит в чистом виде, а архитектурная ошибка гейммода, которая читера вообще не требует: достаточно перехватить один клиентский эвент.

Деньги. В ESX и QBCore баланс всегда должен изменяться через серверные события/колбэки, а не приниматься как готовое число от клиента:

-- ESX: правильно — сервер сам считает сумму
ESX.RegisterServerCallback('shop:buyItem', function(source, cb, itemName, qty)
  local price = Config.Items[itemName].price -- цена берётся с сервера, не от клиента
  local total = price * qty
  local xPlayer = ESX.GetPlayerFromId(source)
  if xPlayer.getMoney() >= total then
    xPlayer.removeMoney(total)
    xPlayer.addInventoryItem(itemName, qty)
    cb(true)
  else
    cb(false)
  end
end)

Если вместо этого клиент присылает готовую сумму списания (TriggerServerEvent('shop:pay', 500)), достаточно одного изменённого клиентского ресурса, чтобы отправить сумму 0 — и получить товар бесплатно. В QBCore тот же принцип: QBCore.Functions.CreateCallback на сервере считает цену и списывает через Player.Functions.RemoveMoney, клиент только просит и показывает результат.

Урон. Критичные для геймплея события (смерть, потеря лута, штрафы) должны опираться на серверную копию здоровья игрока, а не на клиентский GetEntityHealth, который читер может подделать локально. Сервер держит собственное значение HP, сверяет его с тем, что репортит клиент, и при постоянном рассинхроне триггерит проверку/кик.

Полезная проверка архитектуры: пройдитесь по всем RegisterNetEvent/mp.events.add и задайте вопрос "что если этот эвент вызовет не игра, а игрок вручную через консоль с любыми параметрами". Если ответ — "он получит деньги/урон без проверки" — это дыра, которую сторонний античит не закроет, потому что читов там формально нет, есть только доверие к клиенту.

Организационные меры: логи, баны, наблюдение

Технические скрипты ловят не всё — часть работы остаётся за людьми:

  • Централизованные логи. Вебхук в дискорд с деталями (ник, id, тип флага, координаты) экономит модераторам часы разбора жалоб.
  • Бан по нескольким идентификаторам. На FiveM через txAdmin баньте по license/discord/steam-id — простой бан по нику читер обходит за 30 секунд.
  • Whitelist для чувствительных команд. Телепорт, спавн техники, выдача денег должны быть за ACL/permissions, а не за паролем в коде.
  • Регулярный аудит собственных скриптов, особенно кастомных, поставленных "на скорую руку" — именно они чаще всего становятся дырой, а не сама игра.

Сравнение подходов по платформам:

ПлатформаВстроенная защитаСторонние решенияНагрузка на вас
FiveMПроверка клиента, OneSync, convars, txAdminГотовые ресурсы-детекторыСредняя
SA-MP / open.mpМинимальнаяPlugin-античиты на C++Высокая
RAGE:MP / alt:VТонкий клиент по архитектуреМало готовых пакетовВысокая

Больше о выборе платформы под RP-проект — в статье SA-MP, FiveM или RAGE:MP: что выбрать. Разворачивать сервер и настраивать server.cfg удобнее с готовой инструкцией: как поднять сервер FiveM (GTA V). Для RAGE:MP — отдельный гайд: как поднять сервер RAGE:MP. А сравнение фреймворков для валидации денег — здесь: ESX и QBCore: сравнение.

Нужен игровой сервер?

MAATRIX GAMES — 45+ игр, деплой за минуты, DDoS-защита, автобэкапы. Тарифы от 399 ₽/мес.

Создать сервер

Частые вопросы

Можно ли обойтись только встроенной защитой FiveM без сторонних скриптов?

На небольшом проекте с доверенным комьюнити — да, на старте это разумно. Как только онлайн растёт за пределы пары десятков активных игроков, стоит добавить хотя бы базовый детектор скорости/телепортов.

Даёт ли сторонний античит стопроцентную защиту?

Нет. Скрипт обнаружения — это гонка вооружений: он ловит известные паттерны, а новые чит-клиенты подстраиваются под них. Надёжнее архитектура, где читеру физически нечего эксплуатировать, потому что критичные действия проверяет сервер.

Почему сервер иногда ошибочно банит игрока за "телепорт", хотя человек просто лагал?

Проверки скорости завязаны на сетевые тики — при скачке пинга клиент может "телепортироваться" с точки зрения сервера без всякого чита. Поэтому автобан на первом флаге — плохая практика, лучше копить очки подозрительности и подключать модератора.

Нужен ли отдельный античит для урона, если используется OneSync на FiveM?

OneSync решает вопрос владения сущностями, но не валидирует значения урона — это по-прежнему задача вашего гейммода. OneSync необходим, но недостаточен для честной синхронизации боя.

Стоит ли писать свой античит с нуля вместо готового решения?

При нестандартном геймплее (кастомные транспортные средства, необычная физика) — часто да, готовые пороги придётся перенастраивать. При стандартном RP быстрее стартовать с open-source решения и допилить под себя.