Античит
Anti-cheat
Все финансовые операции и расчеты запасов выполняются на стороне сервера. Клиент лишь отображает процесс заправки и сообщает о действиях; он никогда не определяет стоимость или объем залитого топлива.
Что контролирует сервер
- Сессии колонок. Открытие колонки запрашивает у сервера токен сессии. Для оплаты требуется этот токен, а объем отпущенных литров ограничивается временем работы сессии с учетом настроенной скорости потока. Если клиент заявляет объем, который физически не мог быть подан колонкой, он ограничивается допустимым по таймеру значением.
- Истечение срока сессии. Токены являются одноразовыми, привязываются к открывшему их игроку и удаляются по истечении
PumpSessionTimeout. Просроченная сессия не списывает средства. - Проверки дистанции. Покупка, заправка, зарядка, замена батареи, заполнение канистры, заказ товаров и любые действия с интерфейсом повторно проверяются на сервере: действительно ли игрок находится на этой станции с учетом погрешности
DistanceSlackметров на задержку позиции педа. - Ограничение частоты запросов (Rate limiting). Каждый эвент и коллбэк расходует токен из индивидуального для каждого игрока пула, который пополняется со скоростью
PerSecondи никогда не превышает лимитBurst. Залипшая клавиша продолжит работать, а цикл спама мгновенно упрётся в ограничение. - Ограничение значений. Цены, зарплаты, заказы, снятия и депозиты проверяются на сервере по диапазонам и типам данных. Значения выше
MaxAmountотклоняются полностью, а цены удерживаются в пределахConfig.Refuel.PriceLimits. - Проверка прав для каждого действия. Права персонала перепроверяются на сервере для каждого запроса, данные из пользовательского интерфейса (UI) никогда не принимаются на веру. Найм, увольнение и редактирование сотрудников с правом
employeesдоступны только владельцу, поэтому сотрудник не сможет повысить себя сам. Передача и продажа станции доступны только владельцу и требуют повторного ввода названия станции. - Запасы и банк находятся на стороне сервера. Продажа происходит только в том случае, если на станции действительно есть литры, а у клиента есть деньги; обе стороны изменяются за один шаг на сервере.
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 сводит на нет защитную функцию этих проверок. Изменяйте их только в том случае, если честные игроки действительно сталкиваются с блокировками.