Skip to content

Anti-cheat

Anti-cheat

Fiecare decizie privind banii și stocul este luată pe server. Clientul deschide pompa și raportează ce s-a întâmplat; acesta nu decide niciodată cât costă ceva sau cât s-a alimentat.

Ce impune serverul

  • Sesiuni de pompare. Deschiderea unei pompe solicită serverului un token de sesiune. Plata necesită acel token, iar litrii facturați sunt limitați de durata efectivă în care sesiunea a fost deschisă la debitul configurat. Un client care revendică mai mult decât ar fi putut livra fizic pompa este limitat la ceea ce permite ceasul.
  • Expirarea sesiunii. Tokenurile sunt de unică folosință, asociate jucătorului care le-a deschis și sunt eliminate după PumpSessionTimeout. O sesiune expirată nu facturează nimic.
  • Verificări de distanță. Cumpărarea, alimentarea, încărcarea, schimbarea unei baterii, umplerea unei canistre, comandarea de stocuri și fiecare acțiune din panou reconfirmă pe server că jucătorul se află cu adevărat la acea stație, cu o marjă de DistanceSlack metri pentru întârzierea poziției ped-ului.
  • Limitarea ratei (Rate limiting). Fiecare eveniment și callback costă un token dintr-un rezervor per jucător care se reumple la PerSecond și nu se acumulează niciodată peste Burst. O tastă blocată funcționează în continuare; o buclă de spam lovește un zid aproape imediat.
  • Limitarea valorilor (Value clamping). Prețurile, salariile, comenzile, retragerile și depunerile sunt verificate în funcție de limite și de tip pe partea de server. Nimic peste MaxAmount nu este acceptat, iar prețurile sunt menținute în interiorul Config.Refuel.PriceLimits.
  • Verificări de permisiuni la fiecare acțiune. Permisiunile de staff sunt re-verificate pe server la fiecare cerere, nefiind niciodată încredințate de la interfața grafică (UI). Angajarea, concedierea și editarea oricărei persoane care deține permisiunea employees sunt rezervate exclusiv patronului, astfel încât un angajat nu se poate promova singur. Transferul și răscumpărarea sunt rezervate exclusiv patronului și necesită reintroducerea numelui stației.
  • Stocul și banca sunt stări ale serverului. O vânzare are loc doar dacă stația are efectiv litrii respectivi și clientul are efectiv banii; ambele părți se actualizează în același pas pe partea de server.
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,
}
Setare Scop
RateLimit Dimensiunea burst-ului și rata de reumple a rezervorului de evenimente per jucător
MaxLitresPerPay Plafon strict pentru o singură sesiune de pompă sau încărcător, indiferent ce indică cronometrul
LitreGrace Marjă pentru verificarea timpului, în litri. Acoperă un tick cu lag
PumpSessionTimeout Secundele în care o sesiune rămâne valabilă
DistanceSlack Metri suplimentariți admiși peste raza unei stații
MaxAmount Plafon pentru orice valoare monetară acceptată de la un client
MaxWage Cel mai mare salariu pe care un patron îl poate stabili pentru un angajat
JerryPourTimeout Secundele în care o turnare nefinalizată este reținută înainte ca restul să nu mai poată fi recuperat

Ajustare

Valorile implicite se potrivesc unui server normal. Cele două care merită atenție:

  • LitreGrace — mărește-l cu un litru sau doi dacă jucătorii cu conexiuni slabe sunt dezavantajați la pompă. Pstrează-l mic; este combustibil gratuit.
  • RateLimit.Burst — mărește-l dacă o benzinărie în mod legitim aglomerată începe să refuze acțiuni. Micșorează-l dacă dorești un control mai strict.

Relaxarea excesivă a MaxLitresPerPay sau DistanceSlack elimină plafonul pentru a cărui existență au fost create aceste verificări. Modifică-le doar dacă jucătorii cinstiți sunt blocați în mod vizibil.