# Sistemul anti-trișare KZ
**Detectarea folosirii de cheat-uri de mișcare pe serverele KZ pentru Counter-Strike 1.6**
Autor: **illusion @ CodeStrike** · [codestrike.store](https://codestrike.store)
---
## Ce detectează
| Detector | Capturi |
|---|---|
| `BUNNYHOP` | bunnyhop automat, scripturi de sărituri, bucle macro`+jump` |
| `GROUNDSTRAFE` | Scripturile GS și SGS, inclusiv variantele care nu accesează niciodată `+duck` |
| `STRAFE-STABILIZER` | optimizatori pentru manevre aeriene / trucuri pentru „manevre perfecte” |
| `PRESTRAFE-STABILIZER` | optimizatori pentru atacuri la sol (experimentali, dezactivați implicit) |
| `INPUT-ANOMALY` | speedhack și manipularea ceasului clientului |
---
## Ideea
Mișcarea jucătorilor din GoldSrc este complet deterministă. La fiecare tick, serverul primește un
usercmd — butoane, milisecunde, deplasare înainte, deplasare laterală, unghiuri de vizualizare — și rulează
`PM_Friction`, `PM_Accelerate`, și`PM_AirAccelerate` pe`PM_Jump` acesta.
Acest plugin reimplementează acea formulă matematică. Pentru fiecare ciclu, acesta cunoaște nu doar
nu ce a făcut motorul, ci **ce ar fi produs cea mai bună intrare posibilă**.
`PM_AirAccelerate` se adaugă `min(K, 30 − dot(v, wishdir)) · wishdir`la viteză,
cu `K = sv_airaccelerate · wishspeed · frametime`. Maximizarea acestuia peste
unghiul de girație ales liber are o formă închisă:
```
Δv_max = √(v² + wishspd² − max(0, wishspd − K)²) − v
```
Totul se bazează pe asta și pe variabilele de configurare ale serverului live. Nimic nu este un
un număr magic scos din aer.
### De ce este important acest lucru pentru airaccelerate
Aceeași comandă de trișare se comportă complet diferit în funcție de `sv_airaccelerate`,
așadar, un singur prag fix nu poate funcționa:
| | `sv_airaccelerate 10` | `sv_airaccelerate 100` |
|---|---|---|
| K la 250 u/s, 100 fps | 25 | 250 |
| optim `dot(v, wishdir)` | 5 | 0 |
| unghiul de vizualizare pe care trebuie să-l mențină | 88.9° | 90° |
| interval pentru un randament ≥0,90 | **±0.85°** | **±2.2°** |
Un stabilizator conceput pentru un server de tip 100 AA vizează perpendicular, ceea ce înseamnă exact
optim acolo — și o abatere de 1,1° pe un server cu 10 AA, unde câștigul este *mai mic*
decât un om bun. Fiecare prag din acest plugin este interpolat între
Valorile 10 AA și 100 AA se calculează folosind variabila din timpul jocului (cvar), astfel încât ambele sunt evaluate corect.
Același principiu se aplică și în cazul jocurilor FPS. Toate timpii de deplasare laterală pe sol sunt măsurați în
**milisecunde ale ceasului de perete**, niciodată în tic-tacuri, deoarece 25 de tic-tacuri înseamnă 250 ms la
100 fps și 27 ms la 940 fps.
---
## Instalare
1. Copiați în`kz_anticheat.amxx` `cstrike/addons/amxmodx/plugins/`
2. Adaugă această linie la`cstrike/addons/amxmodx/configs/plugins.ini`:
```
kz_anticheat.amxx
```
3. Schimbă harta sau repornește serverul.
La prima încărcare, pluginul creează și execută:
```
addons/amxmodx/configs/CodeStrikePlugins/kz_anticheat.cfg
```
Acel fișier este generat **o singură dată** pe baza setărilor implicite ale pluginului și nu este niciodată
a fost suprascris din nou. Ștergeți-l pentru a-l regenera. Totul este configurat din
Așa — nu este nevoie ca vreun fișier sursă să fie editat sau recompilat.
Veți vedea un banner în consola serverului care confirmă încărcarea și mișcarea
variabilele cvars pe care le-a citit și limita maximă prestrafe pe care a dedus-o din acestea.
---
## Primele cinci minute pe un server nou
```
kzac_physics
```
Executați această comandă înainte de orice altceva. Ea afișează modelul de mișcare al pluginului
derivat. **Dacă plafonul prestrafe pe care îl raportează nu corespunde cu cel al jucătorilor tăi
ajunge efectiv (în mod normal ~278 u/s), variabilele de mișcare nu sunt cele pe care le acceptă pluginul
este cititul, iar nimic altceva nu va fi în regulă.**
```
kzac_diag
```
Confirmă că cârligele de deplasare sunt active. `ticks processed`Trebuie să urci în timp ce
cineva se mută.
---
## Comenzi de administrare
Toate necesită indicatorul (**`c`**`ADMIN_KICK`).
Litere de steag AMXX: `a`imunitate · `b`rezervare · excludere**`c`** · `d`interzicere ·
`e` slay · `f`map · `g`cvar · `l`rcon.
| Comandă | Scop |
|---|---|
| `kzac_stats <target>` | toate indicatorii pe care pluginul îi înregistrează pentru un jucător |
| `kzac_watch <țintă\|off>` | telemetrie în timp real pe consola ta |
| `kzac_physics` | modelul de mișcare derivat și toate pragurile active |
| `kzac_diag` | se declanșează cârligele de mișcare și care gardă renunță la tichete |
| `kzac_reset <target>` | șterge probele acumulate de un jucător |
`kzac_stats` este cea importantă. Fiecare detectare poate fi verificată manual
în comparație cu valorile afișate, iar fiecare detector indică **valorile maxime** ale **sesiunii**
bloc — cele mai extreme valori înregistrate de jucătorul respectiv. Asta este ceea ce tu
pe care să vă bazați pentru calibrare, în cazul în care va fi vreodată necesar să modificați un prag.
---
## Configurare
### Anunțuri
```
kzac_announce_mode 1 // 0 = silent, 1 = admins only, 2 = everyone
kzac_announce_flag "c" // flag required to see them in mode 1
```
Modul **1 este setat în mod intenționat ca mod implicit**. Valoarea implicită a indicatorului este `c`(`ADMIN_KICK`),
același pe care îl necesită comenzile de administrator, astfel încât oricine poate investiga un
și sistemul de detectare înregistrează, de asemenea, acest lucru. O acuzație publică nu poate fi retrasă,
și niciun sistem anti-trișare nu este perfect. Afișarea pe consolă și fișierul jurnal sunt întotdeauna generate
indiferent de această setare.
### Pedeapsa
```
kzac_punish_bhop 0 // 0 = nothing, 1 = kick, 2 = ban
kzac_punish_gstrafe 0
kzac_punish_strafe 0
kzac_punish_prestrafe 0
kzac_punish_input 0
kzac_punish_hits 3 // detections of the SAME type before it fires
kzac_ban_minutes 0 // 0 = permanent
```
Fiecare detector are propriul text explicativ, astfel încât unui jucător suspendat i se comunică motivul
o frază reală, nu una generică:
```
kzac_reason_bhop "Bunnyhop Cheat Detected"
kzac_reason_gstrafe "Ground Strafe Cheat Detected"
kzac_reason_strafe "Strafe Stabilizer Cheat Detected"
kzac_reason_prestrafe "Prestrafe Stabilizer Cheat Detected"
kzac_reason_input "Speedhack Detected"
kzac_punish_reason "Movement cheat detected" // fallback
```
Dacă lași una **necompletată**, se revine la `kzac_punish_reason`. Șterge toate cele cinci
să folosești o singură linie pentru toate.
Sancțiunile sunt **dezactivate în mod implicit**. Activează-le în mod deliberat și preferă să
începe cu (`1`kick) în timp ce urmărești statisticile propriului server.
Acestea sunt setate în mod intenționat pentru fiecare detector în parte. `BUNNYHOP`și `GROUNDSTRAFE`au
cea mai mare distanță măsurată între o mână și un text — acestea sunt cele mai sigure
automatizarea. `STRAFE-STABILIZER`are marjele cele mai mici.
### Comanda „Ban”
**Întreaga comandă** este un cvar, așa că pluginului nu îi pasă ce sistem de banuri este utilizat
executați — scrieți ceea ce așteaptă programul vostru, în orice ordine a argumentelor dorește acesta.
```
kzac_ban_cmd amx_ban %n %m %r // default
kzac_kick_cmd amx_kick %n %r // default
```
| | |
|---|---|
| `%m` | durata interdicției în minute, `0`= permanentă |
| `%n` | numele jucătorului — **este deja pus între ghilimele pentru tine** |
| `%r` | textul motivului — **pe care ți l-am citat deja** |
| `%u` | ID-ul utilizatorului, se folosește ca `#%u` |
| `%s` | aburit |
| `%i` | adresa IP |
| `%N` `%R` | numele și motivul **fără ghilimele**, dacă sistemul vostru de blocare le solicită în format brut |
**Verificați mai întâi propriul server.** Tastați `amx_ban`fără argumente în server
consola și afișează instrucțiunile de utilizare așteptate. Ordinea argumentelor **nu** este cea
este la fel în toate sistemele de interdicție — unele afișează mai întâi ținta, altele mai întâi minutele.
Dacă greșești, nu va funcționa`Client with that name or userid not found`.
```
amx_ban %n %m %r # target first (default)
amx_ban %m %n %r # minutes first
amx_ban #%u %m %r # by userid
amx_banip %s %m %r # by steamid
banid %m %s ; writeid ; kick # %u # engine level ban
```
Ordinea argumentelor o stabilești tu — substituenții se extind oriunde îi plasezi,
iar mai multe comenzi pot fi legate între ele cu `;`.
### Dacă pedeapsa nu se aplică
Consola afișează întotdeauna exact comanda pe care a executat-o:
```
[KZ-AC] executing: amx_kick "illusion" "Bunnyhop Cheat Detected"
```
Dacă apare acea linie și jucătorul se află încă acolo, înseamnă că pluginul și-a îndeplinit rolul și
comanda a fost respinsă. Cauza obișnuită este faptul că **`amx_kick` și respectă`amx_ban`
Imunitate AMXX** – un jucător care deține steagul `a`(`ADMIN_IMMUNITY`), pe ce server
pe care proprietarii și-o acordă de obicei este ignorată în tăcere. Testarea pe cont propriu
Prin urmare, contul pare a fi exact ca un plugin defect.
Executați manual aceeași comandă în consola serverului pentru a verifica. Motorul
comenzile ignoră complet imunitatea:
```
kzac_kick_cmd kick # %u
kzac_ban_cmd banid %m %s ; writeid ; kick # %u
```
Dacă `executing:`linia **nu** apare, verificați în consolă următoarele:
```
[KZ-AC] illusion :: BUNNYHOP held - 1 of 3 detections needed (kzac_punish_hits)
```
Doar detectările anunțate sunt luate în calcul`kzac_punish_hits`; cele ascunse de
`kzac_cooldown` nu.
**Nu introduceți niciodată manual un caracter de ghilimele în aceste valori.** O valoare cvar se termină la
prima ghilimelă pe care o întâlnește motorul, așa că un șablon scris cu ghilimele în jurul
rațiunea s-ar întrerupe acolo și ar dispărea în tăcere. Adică
motivul exact pentru care `%n`și `%r`sunt deja menționate.
### Exploatarea forestieră
```
kzac_log 1
kzac_log_file "kzac_detections.log"
```
Scris în `addons/amxmodx/logs/`. De asemenea, detectările sunt întotdeauna direcționate către standard
Jurnalul AMXX prin intermediul `log_amx`.
### Sensibilitate
```
kzac_min_conf 80.0
```
Este necesară o anumită încredere înainte de a anunța o detectare. Creșteți-o la `90`pentru a o menține
Doar cele mai stricte reguli se aplică. Dacă le relaxezi, vor apărea decizii la limită.
```
kzac_immunity ""
```
Semnalări ale administratorilor care nu sunt niciodată raportate sau sancționate. „Gol” înseamnă că nimeni nu este imun.
---
## Testele efectuate
Testat împotriva **unor jucători care folosesc coduri de trișare reale**, nu simulări, pe un server KZ activ:
| Truc | `sv_airaccelerate 10` | `sv_airaccelerate 100` |
|---|---|---|
| Bunnyhop automat | detectat | detectat |
| Scriptul Bunnyhop | detectat | detectat |
| Script GS | detectat | detectat |
| Scriptul SGS | detectat | detectat |
| Stabilizator de zbor lateral | detectat | detectat |
S-au testat mișcările legale în același interval — „bunnyhop” manual cu un
rotița de derulare, GS și SGS manuale, mitralieră cu aer, prestrafe — la 100 fps și la
1000 fps, pentru ambele setări ale funcției „airaccelerate”.
### Distanța măsurată
Fiecare prag activ se situează între o valoare măsurată pe baza jocului real al jucătorilor și o
valoare măsurată pe baza unui cheat real pe același server:
| Semnal | Uman | Prag | Truc |
|---|---|---|---|
| `+jump` apăsări pe salt | 5.26 | 1.20 | 1.00 |
| sărituri perfecte una după alta | 3 | 12 | 20–23 |
| salt perfect – distribuie | 26.6% | 80% | 100% |
| `+duck` presări pe secundă | 13.3 | 35.0 | — |
| `+duck` variația decalajului | 0.70–0.88 | 0.10 | — |
| se produce o întrerupere la mișcările nule | 3% (față de o probabilitate de 9%) | 50% și o șansă de 3 ori mai mare | 99% (față de 5%) |
| eficiența atacului aerian, interval de 300 de tichete | 0.583–0.65 | 0.85 | 0.909 |
| variația eficienței, fereastră de 300 de tick-uri | 0.172 | 0.075 | — |
### Cum arată, de fapt, un atac aerian asupra solului efectuat în mod legitim
Este bine de știut, deoarece acesta este motivul pentru care viteza, în sine, nu este niciodată folosită ca probă:
```
GS spd 324.9->323.2 bound 324.5 | grnd 11 run 6 | z 36.03
GS spd 571.4->569.2 bound n/a | grnd 11 run 1 | z 36.03
+duck edges 102 | +duck held 102 ticks
```
S-a măsurat un GS valid de **571 u/s, la un prag maxim de 278,7 u/s**. Fiecare
`+duck` apăsarea a durat exact un „tick” — adică o rotație a rotiței de derulare. Pe „tick-uri”
atunci când jucătorul se află cu adevărat pe sol, viteza rezultată este întotdeauna puțin *sub*
limita sub formă închisă: principiile fundamentale ale fizicii rămân neschimbate. Viteza provine din
cadrele de aer de o singură mișcare pe care le creează fiecare tranziție de tip „duck”.
Așadar, detectorul de „groundstrafe” nu ține cont niciodată de viteză. Acesta ia în considerare datele de intrare
curent: cât de repede se repetă`+duck`, cât de regulat este și dacă intră în contact cu solul
este întreruptă de comenzi care nu conțin nicio valoare de timp.
---
## Niciun sistem anti-trișare nu este perfect
Nici acesta nu este, și ar trebui să-l rulezi știind acest lucru.
**Sunt posibile rezultate fals pozitive.** În timpul dezvoltării, au fost identificate și remediate șase astfel de cazuri,
fiecare provenind dintr-o regulă diferită, iar toate aveau aceeași cauză principală: un prag
care părea logic, dar nu fusese niciodată evaluat în raport cu jocul uman
în acea situație specifică. Statisticile privind mișcarea umană se modifică odată cu accelerarea aerului,
în funcție de numărul de cadre pe secundă (fps) și de acțiunile jucătorului — deplasarea laterală la sol, săriturile în serie și
Atacurile aeriene generează rezultate cu adevărat diferite, chiar și în cazul aceleiași persoane.
Cinci reguli au fost **dezactivate** după ce au generat rezultate fals pozitive, iar acestea sunt livrate
dezactivate. Acestea se află încă în fișierul de configurare, pentru oricine dorește să le analizeze:
`kzac_st_err_aa10`, `kzac_st_err_aa100`, `kzac_st_err_sd`, `kzac_st_inband`.
Ce înseamnă acest lucru în practică:
- **Nu activați blocările automate încă din prima zi.** Folosiți avertismentele pentru o perioadă.
și citește ce apare pe propriul tău server.
- **`kzac_stats` înainte de a acționa.** Fiecare detectare afișează numerele din spatele
. Dacă nu par extreme, tratează apelul ca fiind marginal.
- **Detectorul de atacuri aeriene este cel mai puțin fiabil dintre cele trei.** Marjele sale de eroare
sunt cele mai subțiri. Avertizează sau dă-i un șut; lasă interzicerea pentru bunnyhop și
detectoare „groundstrafe”, care au o distanță mult mai mare între ele.
- **O trișare folosită doar parțial este mai greu de depistat.** Un stabilizator pe care un jucător
se luptă cu propriile sale contribuții, câștigă mai puțin și pare mai uman. Detectare
se adaptează în funcție de avantajul obținut, ceea ce este o proprietate rezonabilă, dar
nu este una completă.
- **Se poate scrie un program de trișat care să rămână sub orice prag,** prin faptul că este în mod deliberat
mai rău decât ar putea fi. În acel moment, nu mai oferă prea multe avantaje,
dar trebuie să recunoaștem că acoperirea nu este absolută.
Dacă un jucător contestă o detectare, `kzac_stats`se verifică situația acestuia și se compară cu cea din
valorile umane măsurate în tabelul de mai sus. Pluginul îți oferă dovezile necesare pentru a
ia această decizie — nu ți se cere să ai încredere oarbă în ea.
---
## Fișiere
```
kz_anticheat.sma main plugin
include/kzac_core.inc movement math, guards, reporting, punishment
include/kzac_bhop.inc bunnyhop detector
include/kzac_gstrafe.inc ground strafe detector
include/kzac_strafe.inc air strafe detector
include/kzac_config.inc config file generator
compiled/kz_anticheat.amxx ready to use
```
Este`kz_anticheat.amxx` nevoie doar de pentru a rula pluginul. Codul sursă este inclus, așa că
o puteți verifica sau o puteți extinde.
Pentru a recompila, plasează cele cinci fișiere`kzac_*.inc` în directorul tău `scripting/include/`
folder și compilați `kz_anticheat.sma`ca de obicei. Se compilează fără erori pe AMX Mod X
1.10, **fără erori și fără avertismente**.
---
## Note privind securitatea
**Numele jucătorilor sunt curățate înainte de a ajunge la o comandă de consolă.** Un nume
care conține un ghilimel sau un punct și virgulă ar permite, în alte condiții, unui trișor prins să execute
comenzi arbitrare către server prin intermediul șablonului „kick” sau „ban”. Ghilimele, punct și virgulă
iar caracterele de control sunt înlocuite cu `_`.
**Sancțiunile nu se execută niciodată în cadrul fluxului de mișcare.** Acestea sunt puse în coadă și
declanșată dintr-o sarcină cu o cadru mai târziu. Executarea sincronă a unei lovituri cu piciorul din interior
o mișcare înainte deconectează jucătorul în timpul apelului de returnare și blochează serverul -
această problemă a fost identificată și remediată în timpul testării.
---
## Cerințe
- AMX Mod X 1.8.2 sau o versiune mai recentă (dezvoltat și compilat pe versiunea 1.10)
- `fakemeta` modul
- Counter-Strike 1.6 — funcționează cu HLDS, ReHLDS și ReGameDLL
Nu este necesar niciun alt plugin, modul sau dependență.
---
## Performanță
Un singur forward (`FM_CmdStart`) gestionează întregul pipeline. Pentru fiecare jucător, la fiecare tick,
pluginul efectuează câteva operații cu numere zecimale și câteva operații de `pev`citire; variabilele de configurare ale serverului
sunt stocate în cache și actualizate o dată pe secundă, în loc să fie citite la fiecare tic.
Nu există scanarea entităților pentru fiecare cadru, nu există `set_task`bucle pentru fiecare jucător și nu există
operațiuni cu șiruri de caractere pe calea activă.
---
## Asistență
Cumpărat de pe [codestrike.store](https://codestrike.store).
Când raportați o problemă, includeți rezultatul comenzii `kzac_stats <player>`și
`kzac_physics`. Aceste două fișiere conțin tot ce este necesar pentru a crea un fișier autentic
detectarea pe baza unui prag care trebuie ajustat pe serverul dumneavoastră.
---
*KZ Anti-Cheat — illusion @ CodeStrike*
---
## Nivelul de maturitate al detectorului — citiți acest text înainte de a activa sancțiunile
Nu toți cei trei detectori au dat rezultate la fel de bune, iar diferența este destul de mare
că nu ar trebui să fie configurate în același mod.
### BUNNYHOP și GROUNDSTRAFE — gata de producție
Validat în comparație cu **doi jucători independenți**, ambii cu setările airaccelerate, și
trișări adevărate. Nimic nu s-a apropiat de un prag, în niciuna dintre direcții:
| Semnal | Jucătorul A | Jucătorul B | Prag | Truc |
|---|---|---|---|---|
| `+jump` apăsări pe salt | 5.26 | 5.30–6.19 | 1.20 | 1.00 |
| sărituri perfecte una după alta | 3 | 2–4 | 12 | 20–23 |
| `+duck` pe secundă | 13.3 | 9.0–20.2 | 35.0 | — |
| `+duck` variația decalajului | 0.70–0.88 | 1.03–1.16 | 0.10 | — |
| întreruperi la mișcări fără rezultat | 3% | 0% | 50% | 99% |
Acestea pot fi automatizate în condiții de siguranță. `kzac_punish_bhop 2`și `kzac_punish_gstrafe 2`
sunt rezonabile.
### STRAFE-STABILIZER — doar avertizare
În timpul dezvoltării au fost identificate nouă rezultate fals pozitive, fiecare provenind dintr-o regulă diferită.
A fost necesară **dezactivarea** a cinci reguli, deoarece distribuțiile „uman” și „cheat” se suprapun:
| Regula privind persoanele cu dizabilități | De ce |
|---|---|
| eroare de unghi | uman 1,83°, fraudulos 1,34–2,20° — suprapunere |
| eroarea de unghi, deviația standard | intervalul uman 0,69–5,47°, dispersie de opt ori |
| partajare în bandă | este o fereastră unghiulară dependentă de viteză, nu una constantă |
| încuietoare rotativă | valoarea minimă pentru un jucător este 0,139, iar pentru altul **0,026** |
| eficiența unui singur salt | uman 0,684–0**,956**, trișor 0,835–0,946 — *inversat* |
Aceasta din urmă este lecția importantă. La un singur salt, un jucător care pur și simplu
atacurile care se deplasează rapid ating o eficiență comparabilă cu cea a unui program de rezolvare, iar valorile stabilite de om funcționează
trecând direct prin și dincolo de valorile frauduloase. Diferența dintre o mână și o
mașina apare abia după ce se calculează media **a sute de ticuri**.
Cele care rămân active sunt cele două reguli cu ferestre de peste 300 de unități de aer curat —
media eficienței și variația eficienței — care nu au generat niciodată un rezultat eronat
pozitiv în fiecare sesiune înregistrată. Acestea detectează în mod fiabil un stabilizator la viteze mari
`sv_airaccelerate`, unde valoarea sa este de 0,909, față de un prag maxim atins de oameni de 0,65.
**Un`sv_airaccelerate 10` stabilizator reglat la 90° are o amplificare mai mică decât unul bun**
umană și nu poate fi detectată cu certitudine.** Aceasta este o limitare reală, nu o
problemă de reglaj: pe baza datelor disponibile, nu există niciun semnal măsurat care
în acest caz, le separă pe cele două.
Recomandări:
```
kzac_punish_bhop 2 // ban
kzac_punish_gstrafe 2 // ban
kzac_punish_strafe 0 // warn only, decide by hand
```
Folosește-l `kzac_stats`asupra oricărei persoane semnalate de detectorul de mișcare laterală. Numerele din spatele
toate datele necesare pentru verdict sunt prezente, iar un administrator uman le compară cu tabelele de mai sus
este un criteriu mai bun decât orice prag existent în prezent.