Skip to content

Anti-cheat

Anti-cheat

Każda decyzja dotycząca pieniędzy i zapasów podejmowana jest po stronie serwera. Klient renderuje dystrybutor i zgłasza, co się stało; nigdy nie decyduje o tym, ile coś kosztuje ani ile paliwa zostało wlane.

Co egzekwuje serwer

  • Sesje dystrybutora. Otwarcie dystrybutora wymaga pobrania z serwera tokenu sesji. Płatność wymaga tego tokenu, a naliczone litry są ograniczone czasem, przez jaki sesja była faktycznie otwarta przy skonfigurowanym przepływie. Klient zgłaszający więcej, niż dystrybutor fizycznie mógł dostarczyć, zostaje ograniczony do tego, na co pozwala zegar.
  • Wygasanie sesji. Tokeny są jednorazowe, powiązane z graczem, który je otworzył, i są usuwane po upływie PumpSessionTimeout. Wygasła sesja nie nalicza żadnych opłat.
  • Kontrole odległości. Zakupy, tankowanie, ładowanie, wymiana akumulatora, napełnianie kanistra, zamawianie zapasów oraz każda akcja w panelu sprawdzają ponownie po stronie serwera, czy gracz faktycznie znajduje się na tej stacji, z marginesem DistanceSlack metrów na opóźnienie pozycji postała (ped).
  • Ograniczanie częstotliwości żądań (Rate limiting). Każde zdarzenie i wywołanie zwrotne (callback) kosztuje token z puli gracza, która odnawia się w tempie PerSecond i nigdy nie kumuluje się powyżej Burst. Zacięty klawisz nadal działa; pętla spamująca natychmiast trafia na ścianę.
  • Blokowanie wartości (Value clamping). Ceny, płace, zamówienia, wypłaty i wpłaty przechodzą weryfikację granic oraz typów po stronie serwera. Nic powyżej MaxAmount nie jest akceptowane, a ceny mieszczą się w Config.Refuel.PriceLimits.
  • Kontrola uprawnień przy każdej akcji. Uprawnienia staffu są weryfikowane ponownie po stronie serwera dla każdego żądania, nigdy nie są ufane z poziomu UI. Zatrudnianie, zwalnianie i edycja kogokolwiek posiadającego uprawnienie employees są dostępne tylko dla właściciela, dzięki czemu pracownik nie może awansować samego siebie. Przeniesienie własności i odsprzedaż są dostępne tylko dla właściciela i wymagają ponownego wpisania nazwy stacji.
  • Zapasy i stan konta to stan serwera. Sprzedaż dochodzi do skutku tylko wtedy, gdy stacja faktycznie posiada odpowiednią liczbę litrów, a klient ma wystarczająco dużo pieniędzy; oba te aspekty zmieniają się w tym samym kroku po stronie serwera.
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,
}
Ustawienie Przeznaczenie
RateLimit Rozmiar nagłego zrywu (burst) oraz tempo odnawiania puli zdarzeń dla każdego gracza
MaxLitresPerPay Bezwzględny limit dla pojedynczej sesji dystrybutora lub ładowarki, niezależnie od czasu trwania
LitreGrace Margines błędu weryfikacji czasu, w litrach. Pokrywa tick z opóźnieniem (lagiem)
PumpSessionTimeout Liczba sekund, przez którą sesja pozostaje ważna
DistanceSlack Dodatkowe metry dopuszczone ponad promień stacji
MaxAmount Limit dla każdej wartości pieniężnej akceptowanej od klienta
MaxWage Najwyższa stawka płacy, jaką właściciel może ustawić pracownikowi
JerryPourTimeout Liczba sekund, przez którą niedokończone nalewanie jest pamiętane, zanim resztki nie będą mogły zostać odebrane

Dostrajanie

Domyślne ustawienia pasują do normalnego serwera. Dwa parametry, którymi warto się zająć:

  • LitreGrace — zwiększ o jeden lub dwa litry, jeśli gracze ze słabym połączeniem są oszukiwani przy dystrybutorze. Utrzymuj tę wartość na niskim poziomie; to darmowe paliwo.
  • RateLimit.Burst — zwiększ, jeśli faktycznie zatłoczony podjazd zaczyna odrzucać akcje. Zmniejsz, jeśli chcesz ostrzejszej smyczy.

Znaczące zwiększenie MaxLitresPerPay lub DistanceSlack usuwa limit, dla którego te zabezpieczenia zostały stworzone. Zmieniaj je tylko wtedy, gdy uczciwi gracze są ewidentnie blokowani.