Skip to content

Античит

Anti-cheat

Все финансовые операции и расчеты запасов выполняются на стороне сервера. Клиент лишь отображает процесс заправки и сообщает о действиях; он никогда не определяет стоимость или объем залитого топлива.

Что контролирует сервер

  • Сессии колонок. Открытие колонки запрашивает у сервера токен сессии. Для оплаты требуется этот токен, а объем отпущенных литров ограничивается временем работы сессии с учетом настроенной скорости потока. Если клиент заявляет объем, который физически не мог быть подан колонкой, он ограничивается допустимым по таймеру значением.
  • Истечение срока сессии. Токены являются одноразовыми, привязываются к открывшему их игроку и удаляются по истечении PumpSessionTimeout. Просроченная сессия не списывает средства.
  • Проверки дистанции. Покупка, заправка, зарядка, замена батареи, заполнение канистры, заказ товаров и любые действия с интерфейсом повторно проверяются на сервере: действительно ли игрок находится на этой станции с учетом погрешности DistanceSlack метров на задержку позиции педа.
  • Ограничение частоты запросов (Rate limiting). Каждый эвент и коллбэк расходует токен из индивидуального для каждого игрока пула, который пополняется со скоростью PerSecond и никогда не превышает лимит Burst. Залипшая клавиша продолжит работать, а цикл спама мгновенно упрётся в ограничение.
  • Ограничение значений. Цены, зарплаты, заказы, снятия и депозиты проверяются на сервере по диапазонам и типам данных. Значения выше MaxAmount отклоняются полностью, а цены удерживаются в пределах Config.Refuel.PriceLimits.
  • Проверка прав для каждого действия. Права персонала перепроверяются на сервере для каждого запроса, данные из пользовательского интерфейса (UI) никогда не принимаются на веру. Найм, увольнение и редактирование сотрудников с правом employees доступны только владельцу, поэтому сотрудник не сможет повысить себя сам. Передача и продажа станции доступны только владельцу и требуют повторного ввода названия станции.
  • Запасы и банк находятся на стороне сервера. Продажа происходит только в том случае, если на станции действительно есть литры, а у клиента есть деньги; обе стороны изменяются за один шаг на сервере.
config.lua
Config.AntiCheat = {
    RateLimit = { Burst = 14, PerSecond = 6 },
    MaxLitresPerPay = 200.0,
    LitreGrace = 3.0,
    PumpSessionTimeout = 900,
    DistanceSlack = 15.0,
    MaxAmount = 100000000,
    MaxWage = 25000,
    JerryPourTimeout = 600,
}
Setting Purpose
RateLimit Размер пакета и скорость пополнения пула эвентов для каждого игрока
MaxLitresPerPay Жесткий лимит на одну сессию колонки или зарядки, независимо от таймингов
LitreGrace Запас по времени проверки в литрах. Компенсирует лаги тика
PumpSessionTimeout Время жизни сессии в секундах
DistanceSlack Дополнительные метры, разрешенные поверх радиуса станции
MaxAmount Максимальный лимит для любого денежного значения, принимаемого от клиента
MaxWage Максимальная зарплата, которую владелец может установить сотруднику
JerryPourTimeout Время в секундах, в течение которого незавершенный полив запоминается до того, как остаток нельзя будет вернуть

Настройка

Стандартные значения подходят для обычного сервера. Стоит обратить внимание на два параметра:

  • LitreGrace — увеличьте на пару литров, если игроки с плохим соединением сталкиваются с нехваткой топлива на колонке. Держите значение небольшим; это бесплатное топливо.
  • RateLimit.Burst — увеличьте, если на действительно загруженной заправке начинают отклоняться действия. Уменьшите, если хотите усилить контроль.

Сильное увеличение MaxLitresPerPay или DistanceSlack сводит на нет защитную функцию этих проверок. Изменяйте их только в том случае, если честные игроки действительно сталкиваются с блокировками.