Skip to content

Anti-cheat

Anti-cheat

Každé rozhodnutí týkající se peněz a zásob probíhá na serveru. Klient vykresluje stojan a hlásí, co se stalo; nikdy nerozhoduje o tom, kolik co stojí nebo kolik paliva nateklo.

Co server vynucuje

  • Relace stojanů. Otevření stojanu si vyžádá od serveru token relace. Platba vyžaduje tento token a naúčtované litry jsou limitovány tím, jak dlouho byla relace skutečně otevřená při nastaveném průtoku. Klient, který si nárokuje víc, než mohl stojan fyzicky vydat, je zkrácen na to, co hodiny umožňují.
  • Vypršení platnosti relace. Tokeny jsou jednorázové, vázané na hráče, který je otevřel, a po uplynutí PumpSessionTimeout jsou zahozeny. Vypršená relace nezaúčtuje nic.
  • Kontroly vzdálenosti. Nákup, tankování, nabíjení, výměna baterie, plnění kanystru, objednávání zásob a každá akce v dashboardu jsou na serveru znovu kontrolovány, aby se ověřilo, že hráč je opravdu u dané stanice, s tolerancí DistanceSlack metrů pro zpoždění pozice postavy.
  • Omezení četnosti (Rate limiting). Každá událost (event) a callback stojí jeden token z hráčova osobního zásobníku, který se doplňuje rychlostí PerSecond a nikdy se kumuluje nad hodnotu Burst. Zaseknutá klávesová zkratka stále funguje; spamová smyčka narazí na zeď téměř okamžitě.
  • Omezení hodnot (Value clamping). Ceny, mzdy, objednávky, výběry a vklady mají na serveru kontrolované limity a datové typy. Nic nad MaxAmount není vůbec akceptováno a ceny jsou drženy v rámci Config.Refuel.PriceLimits.
  • Kontroly oprávnění při každé akci. Oprávnění staffu jsou znovu ověřována na serveru pro každý požadavek, nikdy se jim nedůvěřuje z UI. Najímání, propouštění a úpravy kohokoliv, kdo drží oprávnění employees, jsou výhradně pro majitele, takže zaměstnanec nemůže povýšit sám sebe. Převod a zpětný odprodej jsou výhradně pro majitele a vyžadují opětovné napsání názvu stanice.
  • Zásoby a banka jsou stav serveru. Prodej se uskuteční pouze tehdy, pokud má stanice reálně k dispozici litry a zákazník má reálně peníze; obě strany se pohnou ve stejném kroku na straně serveru.
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,
}
Nastavení Účel
RateLimit Velikost dávky (Burst) a rychlost doplňování zásobníku událostí pro každého hráče
MaxLitresPerPay Pevný strop pro jednorázovou relaci stojanu nebo nabíječky, bez ohledu na časování
LitreGrace Rezerva pro kontrolu časování v litrech. Pokrývá tik s lagem
PumpSessionTimeout Počet sekund, po které zůstává relace platná
DistanceSlack Extra metry povolené nad rámec poloměru stanice
MaxAmount Strop pro jakoukoliv peněžní hodnotu přijatou od klienta
MaxWage Nejvyšší mzda, kterou může majitel nastavit zaměstnanci
JerryPourTimeout Počet sekund, po které se nedokončené lití pamatuje, než již zbývající palivo nelze nárokovat zpět

Ladění

Výchozí hodnoty vyhovují běžnému serveru. Dvě, které stojí za to upravit:

  • LitreGrace — zvyšte o litr nebo dva, pokud jsou hráči se špatným připojením ochuzováni u stojanu. Udržujte ji malou; je to palivo zdarma.
  • RateLimit.Burst — zvyšte, pokud legitimně vytížené čerpadlo začne odmítat akce. Snižte ji, pokud chcete přísnější řetěz.

Výrazné uvolnění MaxLitresPerPay nebo DistanceSlack odstraní strop, kvůli kterému tyto kontroly existují. Měňte je pouze tehdy, jsou-li poctiví hráči viditelně blokováni.