Skip to content

Anti-cheat

Anti-cheat

Elke geld- en voorraadbeslissing wordt op de server genomen. De client tekent de pump en rapporteert wat er is gebeurd; deze beslist nooit wat iets kost of hoeveel er is ingepompt.

Wat de server afdwingt

  • Pump sessions. Het openen van een pump vraagt de server om een sessietoken. Betalen vereist dat token, en de gefactureerde liters worden begrensd door hoelang de sessie daadwerkelijk open stond tegen de ingestelde stroomsnelheid. Een client die meer claimt dan de pump fysiek had kunnen leveren, wordt ingekort tot wat de klok toestaat.
  • Session expiry. Tokens zijn eenmalig te gebruiken, gekoppeld aan de speler die ze heeft geopend, en worden weggegooid na PumpSessionTimeout. Een verlopen sessie factureert niets.
  • Distance checks. Kopen, bijtanken, opladen, een accu omwisselen, een jerrycan vullen, voorraad bestellen en elke actie in het dashboard worden op de server opnieuw gecontroleerd om te verifiëren dat de speler zich daadwerkelijk bij dat station bevindt, met een marge van DistanceSlack meter voor ped-positievertraging.
  • Rate limiting. Elk event en elke callback kost een token uit een per-speler bucket die zich bijvult op PerSecond en nooit verder stapelt dan Burst. Een vastzittende toetscombinatie blijft werken; een spamloop loopt onmiddellijk tegen een muur aan.
  • Value clamping. Prijzen, lonen, bestellingen, opnames en stortingen worden allemaal aan de serverkant gecontroleerd op grenzen en typen. Niets boven MaxAmount wordt überhaupt geaccepteerd, en prijzen worden binnen Config.Refuel.PriceLimits gehouden.
  • Permission checks on every action. Staff-rechten worden per verzoek opnieuw geverifieerd aan de serverkant, en worden nooit vertrouwd vanuit de UI. Het aannemen, ontslaan en bewerken van iedereen met de employees permissie is alleen voor de eigenaar, zodat een werknemer zichzelf niet kan promoten. Overdragen en terugverkopen zijn alleen voor de eigenaar en vereisen dat de stationnaam wordt teruggetypt.
  • Stock and bank are server state. Een verkoop vindt alleen plaats als het station daadwerkelijk de liters heeft en de klant daadwerkelijk het geld heeft; beide kanten bewegen in dezelfde server-side stap.
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 Burst size and refill rate of the per-player event bucket
MaxLitresPerPay Hard ceiling on a single pump or charger session, whatever the timing says
LitreGrace Slack on the timing check, in litres. Covers a laggy tick
PumpSessionTimeout Seconds a session stays valid
DistanceSlack Extra metres allowed on top of a station's radius
MaxAmount Ceiling on any money value accepted from a client
MaxWage Highest wage an owner can put on an employee
JerryPourTimeout Seconds an unfinished pour is remembered before the leftover can no longer be claimed back

Tuning

De standaardwaarden passen bij een normale server. De twee die de moeite waard zijn om aan te passen:

  • LitreGrace — verhoog deze met een liter of twee als spelers met een slechte verbinding worden benadeeld bij de pump. Houd hem klein; het is gratis brandstof.
  • RateLimit.Burst — verhoog deze als een legitiem druk forecourt acties begint te weigeren. Verlaag hem als je een strakkere controle wilt.

Het sterk versoepelen van MaxLitresPerPay of DistanceSlack verwijdert het plafond waarvoor deze controles bestaan. Pas ze alleen aan als eerlijke spelers zichtbaar worden geblokkeerd.