# System antycheatowy KZ
**Wykrywanie oszustw związanych z ruchem na serwerach KZ w grze Counter-Strike 1.6**
Autor: **illusion @ CodeStrike** · [codestrike.store](https://codestrike.store)
---
## Co wykrywa
| Czujnik | Złowione ryby |
|---|---|
| `BUNNYHOP` | automatyczny bunnyhop, skrypty skoków, pętle makr`+jump` |
| `GROUNDSTRAFE` | Skrypty GS i SGS, w tym warianty, które nigdy nie mają z tym nic wspólnego `+duck` |
| `STRAFE-STABILIZER` | narzędzia do optymalizacji ostrzału z powietrza / kody umożliwiające „idealny ostrzał” |
| `PRESTRAFE-STABILIZER` | optymalizatory ostrzału naziemnego (funkcja eksperymentalna, domyślnie wyłączona) |
| `INPUT-ANOMALY` | speedhack i manipulacja zegarem klienta |
---
## Pomysł
Ruchy postaci w grze GoldSrc są w pełni deterministyczne. W każdym takcie serwer otrzymuje
usercmd — przyciski, ms, ruch_do_przodu, ruch_w_bok, kąty_widzenia — oraz uruchamia
`PM_Friction`, `PM_Accelerate`, oraz`PM_AirAccelerate` `PM_Jump`na nim.
Ta wtyczka ponownie implementuje te obliczenia. Dla każdego pojedynczego taktu wie nie tylko
nie to, co zrobił silnik, ale **to, co dałby najlepszy możliwy sygnał wejściowy**.
`PM_AirAccelerate` zwiększa`min(K, 30 − dot(v, wishdir)) · wishdir` prędkość,
z `K = sv_airaccelerate · wishspeed · frametime`. Maksymalizacja tego względem
swobodnie wybrany kąt odchylenia ma postać zamkniętą:
```
Δv_max = √(v² + wishspd² − max(0, wishspd − K)²) − v
```
Wszystko wynika z tego oraz z parametrów cvars serwera produkcyjnego. Nic nie jest
magiczna liczba wyciągnięta z powietrza.
### Dlaczego ma to znaczenie dla AirAccelerate
Ten sam kod działa zupełnie inaczej w zależności od `sv_airaccelerate`,
dlatego pojedynczy, stały próg nie może się sprawdzić:
| | `sv_airaccelerate 10` | `sv_airaccelerate 100` |
|---|---|---|
| K przy 250 u/s, 100 klatek na sekundę | 25 | 250 |
| optymalny `dot(v, wishdir)` | 5 | 0 |
| kąt widzenia, który należy zachować | 88.9° | 90° |
| zakres dla sprawności ≥0,90 | **±0.85°** | **±2.2°** |
Stabilizator zaprogramowany dla serwera 100 AA celuje prostopadle, co jest dokładnie
tam jest optymalna — a na serwerze 10 AA odbiega o 1,1°, gdzie zyskuje *mniej*
niż dobry człowiek. Każdy próg w tej wtyczce jest interpolowany pomiędzy jego
Wartości 10 AA i 100 AA są ustalane za pomocą zmiennej cvar na żywo, więc obie są oceniane poprawnie.
Ta sama zasada dotyczy fps. Wszystkie czasy manewrów strafe na ziemi są mierzone w
**milisekund zegara ściennego**, nigdy w tikach, ponieważ 25 tików to 250 ms przy
100 klatek na sekundę i 27 ms przy 940 klatkach na sekundę.
---
## Instalacja
1. Skopiuj do`kz_anticheat.amxx` `cstrike/addons/amxmodx/plugins/`
2. Dodaj ten wiersz do`cstrike/addons/amxmodx/configs/plugins.ini`:
```
kz_anticheat.amxx
```
3. Zmień mapę lub uruchom serwer ponownie.
Przy pierwszym uruchomieniu wtyczka tworzy i uruchamia:
```
addons/amxmodx/configs/CodeStrikePlugins/kz_anticheat.cfg
```
Ten plik jest generowany **jednorazowo** na podstawie domyślnych ustawień samej wtyczki i nigdy nie jest
zostało ponownie nadpisane. Usuń je, aby wygenerować na nowo. Wszystko jest konfigurowane z
W tym przypadku — nie ma potrzeby edytowania ani ponownej kompilacji żadnego pliku źródłowego.
W konsoli serwera pojawi się baner potwierdzający załadunek oraz przemieszczenie
parametry cvars, które odczytała, oraz maksymalną prędkość przed atakiem, którą wyliczyła na ich podstawie.
---
## Pierwsze pięć minut na nowym serwerze
```
kzac_physics
```
Uruchom to przed wszystkim innym. Wyświetla to model ruchu wtyczki
wyliczone. **Jeśli podana przez nią wysokość pułapu przed atakiem nie zgadza się z tym, co podają gracze
rzeczywiście osiąga (zwykle ~278 u/s), twoje zmienne CVAR dotyczące ruchu nie są zgodne z tym, co przewiduje wtyczka
czyta, i nic innego też nie będzie w porządku.**
```
kzac_diag
```
Sprawdza, czy haki ruchu działają. `ticks processed`Trzeba się wspinać, dopóki
ktoś się przeprowadza.
---
## Polecenia administracyjne
Wszystkie wymagają flagi **`c`**(`ADMIN_KICK`).
Litery flagowe AMXX: `a`immunitet · `b`zastrzeżenie · **`c`**wyrzucenie · `d`blokada ·
`e` slay · `f`map · `g`cvar · `l`rcon.
| Polecenie | Cel |
|---|---|
| `kzac_stats <target>` | wszystkie wskaźniki, jakie wtyczka przechowuje dla jednego gracza |
| `kzac_watch <cel\|off>` | telemetria na żywo w konsoli |
| `kzac_physics` | wywiedziony model ruchu oraz wszystkie progi aktywności |
| `kzac_diag` | czy wyzwalacze ruchu działają i który strażnik odrzuca tiki |
| `kzac_reset <target>` | usunąć zgromadzone dowody dotyczące jednego gracza |
`kzac_stats` to jest najważniejsze. Każde wykrycie można zweryfikować ręcznie
w porównaniu z wartościami, które wyświetla, a każdy czujnik pokazuje **szczyty sesji**
blok — najbardziej skrajne wyniki, jakie osiągnął ten gracz. To właśnie
wykorzystać jako punkt odniesienia, jeśli kiedykolwiek zajdzie potrzeba zmiany wartości progowej.
---
## Konfiguracja
### Ogłoszenia
```
kzac_announce_mode 1 // 0 = silent, 1 = admins only, 2 = everyone
kzac_announce_flag "c" // flag required to see them in mode 1
```
Tryb **1 jest celowo ustawiony jako domyślny**. Domyślna wartość flagi to `c`(`ADMIN_KICK`),
ten sam, którego wymagają polecenia administracyjne, więc każdy, kto może zbadać
system wykrywania również to rejestruje. Publiczne oskarżenie nie może zostać wycofane,
a żaden system antycheatowy nie jest idealny. Wyjście konsoli i plik dziennika są zawsze generowane
niezależnie od tego ustawienia.
### Kara
```
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
```
Każdy detektor zawiera własny tekst uzasadnienia, więc zablokowany gracz dowiaduje się, co było
rzeczywiście złowione, a nie tylko ogólne stwierdzenie:
```
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
```
Jeśli jedno pole pozostanie **puste**, zostanie przywrócona wartość domyślna`kzac_punish_reason`. Wyczyść wszystkie pięć pól
używać jednej linii do wszystkiego.
Kary są **domyślnie wyłączone**. Włącz je celowo i staraj się
zacznij od (`1`kick), obserwując jednocześnie statystyki swojego serwera.
Są one celowo ustawiane dla każdego detektora z osobna. `BUNNYHOP`i mają`GROUNDSTRAFE`
największa zmierzona odległość między pismem odręcznym a pismem drukowanym — to właśnie te są najbezpieczniejsze
do zautomatyzowania. `STRAFE-STABILIZER`charakteryzuje się najmniejszymi marżami.
### Polecenie „ban”
**Całe polecenie** jest zmienną cvar, więc wtyczka nie zwraca uwagi na to, z jakiego systemu blokad korzysta
uruchom — wpisz to, czego oczekuje dany program, w dowolnej kolejności argumentów.
```
kzac_ban_cmd amx_ban %n %m %r // default
kzac_kick_cmd amx_kick %n %r // default
```
| | |
|---|---|
| `%m` | czas trwania blokady w minutach, `0`= stała |
| `%n` | nazwa gracza — **już w cudzysłowie** |
| `%r` | tekst uzasadnienia — **już dla Ciebie zacytowany** |
| `%u` | identyfikator użytkownika, użyj jako `#%u` |
| `%s` | gotowane na parze |
| `%i` | adres IP |
| `%N` `%R` | nazwa i powód **bez cudzysłowu**, jeśli wasz system blokowania wymaga podania tych danych w postaci surowej |
**Najpierw sprawdź swój serwer.** Wpisz `amx_ban`bez żadnych argumentów w serwerze
konsola i wyświetla oczekiwany opis użycia. Kolejność argumentów **nie** jest
jest to jednakowe we wszystkich systemach blokad – niektóre wymagają najpierw podania celu, inne – najpierw minut.
Błędne podejście kończy się niepowodzeniem`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
```
Kolejność argumentów zależy wyłącznie od Ciebie — symbole zastępcze rozwijają się w dowolnym miejscu, w którym je umieścisz,
a kilka poleceń można połączyć za pomocą znaku `;`.
### Jeśli kara nie zostanie wymierzona
Konsola zawsze wyświetla dokładną treść uruchomionego polecenia:
```
[KZ-AC] executing: amx_kick "illusion" "Bunnyhop Cheat Detected"
```
Jeśli pojawi się ten komunikat, a gracz nadal tam jest, oznacza to, że wtyczka zadziałała prawidłowo i
polecenie nie zostało wykonane. Najczęstszą przyczyną jest to, że **`amx_kick` i nie są `amx_ban`uwzględniane
Odporność AMXX** – gracz trzymający flagę (`a``ADMIN_IMMUNITY`), na którym serwerze
które zazwyczaj przyznają sobie właściciele, jest po cichu pomijane. Samodzielne testowanie
Konto wygląda więc dokładnie jak uszkodzona wtyczka.
W celu potwierdzenia uruchom to samo polecenie ręcznie w konsoli serwera. Silnik
Polecenia całkowicie ignorują odporność:
```
kzac_kick_cmd kick # %u
kzac_ban_cmd banid %m %s ; writeid ; kick # %u
```
Jeśli wiersz`executing:` ten się **nie** pojawi, sprawdź w konsoli, czy nie ma następujących komunikatów:
```
[KZ-AC] illusion :: BUNNYHOP held - 1 of 3 detections needed (kzac_punish_hits)
```
Do liczby uwzględniane są wyłącznie ogłoszone wykrycia`kzac_punish_hits`; te, które zostały pominięte przez
`kzac_cooldown` nie.
**Nigdy nie należy samodzielnie umieszczać w tych wartościach znaku cudzysłowu.** Wartość cvar kończy się na
pierwszy cudzysłów, który silnik napotka, więc szablon napisany z cudzysłówami wokół
rozum zostałby tam odcięty i po cichu zniknąłby. To znaczy
dokładnie dlaczego i`%n` `%r`są już podane w cudzysłowie.
### Wycinka drzew
```
kzac_log 1
kzac_log_file "kzac_detections.log"
```
Zapisano do `addons/amxmodx/logs/`. Wyniki wykrywania są również zawsze kierowane do standardowego
Wpis z AMXX za pośrednictwem `log_amx`.
### Czułość
```
kzac_min_conf 80.0
```
Przed ogłoszeniem wykrycia konieczne jest uzyskanie pewności. Należy ją zwiększyć do , aby`90` utrzymać
Obowiązują tylko najsurowsze zasady. Jeśli je złagodzisz, zaczną pojawiać się kontrowersyjne decyzje.
```
kzac_immunity ""
```
Zgłoszenia dotyczące administratorów, które nigdy nie są zgłaszane ani karane. Puste pole oznacza, że nikt nie jest zwolniony z odpowiedzialności.
---
## Przeprowadzone testy
Przetestowano na **prawdziwych oszustach**, a nie w symulacjach, na działającym serwerze KZ:
| Kod | `sv_airaccelerate 10` | `sv_airaccelerate 100` |
|---|---|---|
| Automatyczny bunnyhop | wykryto | wykryto |
| Skrypt „Bunnyhop” | wykryto | wykryto |
| Skrypt GS | wykryto | wykryto |
| Skrypt SGS | wykryto | wykryto |
| Stabilizator strzału | wykryto | wykryto |
Zgodność z zasadami gry została sprawdzona w tym samym zakresie — ręczny bunnyhop z
kółko przewijania, ręczne sterowanie GS i SGS, ostrzał z powietrza, ostrzał wstępny — przy 100 klatkach na sekundę oraz przy
1000 klatek na sekundę, przy obu ustawieniach funkcji AirAccelerate.
### Odległość pomiarowa
Każdy aktywny próg mieści się w przedziale między wartością zmierzoną na podstawie rzeczywistej gry graczy a
wartość zmierzona na podstawie prawdziwego oszusta na tym samym serwerze:
| Sygnał | Człowiek | Próg | Kod |
|---|---|---|---|
| `+jump` liczba naciśnięć na skok | 5.26 | 1.20 | 1.00 |
| seria idealnych skoków | 3 | 12 | 20–23 |
| idealny skok – udostępnij | 26.6% | 80% | 100% |
| `+duck` cyklów na sekundę | 13.3 | 35.0 | — |
| `+duck` zmienność odstępów | 0.70–0.88 | 0.10 | — |
| przerwa w grze w przypadku ruchów bezwartościowych | 3% (w porównaniu z 9% prawdopodobieństwem) | 50% i 3-krotna szansa | 99% (w porównaniu z 5%) |
| skuteczność ostrzału z powietrza, przedział 300 tików | 0.583–0.65 | 0.85 | 0.909 |
| zmienność wydajności, okno 300 tyków | 0.172 | 0.075 | — |
### Jak naprawdę wygląda legalny ostrzał z powietrza
Warto o tym wiedzieć, ponieważ właśnie z tego powodu sama prędkość nigdy nie jest wykorzystywana jako dowód:
```
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
```
Zmierzone wartości GS wyniosły **571 u/s przy górnej granicy wynoszącej 278,7 u/s**. Każde
`+duck` naciśnięcie trwało dokładnie jeden tik — to znaczy obrót kółkiem przewijania. Podczas tików
gdy gracz faktycznie stoi na ziemi, wynikowa prędkość wynosi zawsze nieco *poniżej*
granica w postaci zamkniętej: podstawowe prawa fizyki pozostają niezmienione. Prędkość wynika z
ramy powietrzne o długości jednego tiku, które powstają przy każdym przejściu w pozycję „duck”.
W związku z tym czujnik „groundstrafe” nigdy nie bierze pod uwagę prędkości. Analizuje dane wejściowe
strumień: jak szybko się powtarza`+duck`, jak regularny jest oraz czy ma kontakt z podłożem
jest naruszana przez polecenia, które w ogóle nie zawierają informacji o czasie.
---
## Żaden system anty-oszustwowy nie jest idealny
Ten też nie jest, więc uruchom go, mając tego świadomość.
**Możliwe są fałszywe alarmy.** Podczas prac rozwojowych wykryto sześć takich przypadków i je naprawiono,
każda wynikała z innej zasady, a wszystkie miały tę samą przyczynę źródłową: próg
które wydawały się logiczne, ale nigdy nie zostały zweryfikowane w praktyce w kontekście ludzkiej gry
w tej konkretnej sytuacji. Statystyki dotyczące ruchu ludzi zmieniają się wraz z przyspieszeniem powietrza,
w zależności od liczby klatek na sekundę oraz od tego, co robi gracz — poruszanie się po ziemi z bocznym przesuwaniem, bunnyhopping i
strzelaniny z powietrza dają naprawdę różne wyniki u tej samej osoby.
Pięć reguł zostało **wyłączonych** po tym, jak spowodowały fałszywe alarmy, i są one dostarczane
wyłączone. Nadal znajdują się w pliku konfiguracyjnym dla wszystkich, którzy chcieliby się z nimi zapoznać:
`kzac_st_err_aa10`, `kzac_st_err_aa100`, `kzac_st_err_sd`, `kzac_st_inband`.
Co to oznacza w praktyce:
- **Nie włączaj automatycznych blokad już pierwszego dnia.** Przez jakiś czas ogranicz się do ostrzegania.
i przeczytaj, co wyświetla się na Twoim serwerze.
- **`kzac_stats` zanim podejmiesz działanie.** Każde wykrycie powoduje wyświetlenie liczb stojących za
to. Jeśli nie wydają się ekstremalne, potraktuj to zgłoszenie jako marginalne.
- **Czujnik ostrzału z powietrza jest najmniej niezawodny spośród tych trzech.** Jego marginesy
są najcieńsze. Należy o tym ostrzec lub zareagować; zakazanie niech pozostawimy dla bunnyhopu i
detektory typu „groundstrafe”, które są rozmieszczone w znacznie większych odstępach.
- **Częściowo wykorzystana sztuczka jest trudniejsza do wykrycia.** Stabilizator, który gracz
kiedy walczy, wykorzystując własne dane wejściowe, osiąga mniejsze wyniki i wydaje się bardziej ludzki. Wykrywanie
skala, przy czym wykorzystywana jest ta zaleta, co jest rozsądną właściwością, ale
nie jest to wersja kompletna.
- **Można stworzyć kod, który pozwoli utrzymać się poniżej dowolnego progu** poprzez celowe
gorzej, niż mogłoby być. W tym momencie przestaje to przynosić znaczną korzyść,
trzeba jednak uczciwie przyznać, że zakres ten nie jest całkowity.
Jeśli gracz zakwestionuje wykrycie, `kzac_stats`na nim i porównać z
wartości ludzkie przedstawione w powyższej tabeli. Wtyczka dostarcza dowodów na to, że
wyciągnij ten wniosek — nie wymaga to od ciebie ślepego zaufania.
---
## Pliki
```
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
```
Do uruchomienia wtyczki `kz_anticheat.amxx`wystarczy tylko . Kod źródłowy jest dołączony, więc
można go sprawdzić lub rozszerzyć.
Aby ponownie skompilować, umieść pięć plików`kzac_*.inc` w katalogu `scripting/include/`
folder i skompiluj jak`kz_anticheat.sma` zwykle. Kompilacja przebiega bezbłędnie na AMX Mod X
1.10 bez **żadnych błędów i ostrzeżeń**.
---
## Uwagi dotyczące bezpieczeństwa
**Nazwy graczy są oczyszczane, zanim trafią do polecenia konsoli.** Nazwa
zawierający cudzysłów lub średnik pozwoliłby w przeciwnym razie na wykonanie kodu przez wykrytego oszusta
dowolne polecenia serwera za pośrednictwem szablonu „kick” lub „ban”. Cudzysłowy, średniki
a znaki sterujące są zastępowane znakiem `_`.
**Kary nigdy nie są wykonywane w ramach potoku ruchu.** Są one umieszczane w kolejce i
wystrzelony z zadania o jedną klatkę później. Wykonanie kopnięcia synchronicznie z wnętrza
ruch do przodu powoduje odłączenie gracza w trakcie wywoływania funkcji zwrotnej i awarię serwera –
zostało to wykryte i naprawione podczas testów.
---
## Wymagania
- AMX Mod X w wersji 1.8.2 lub nowszej (opracowany i skompilowany na wersji 1.10)
- `fakemeta` moduł
- Counter-Strike 1.6 — działa z HLDS, ReHLDS i ReGameDLL
Nie są wymagane żadne inne wtyczki, moduły ani biblioteki.
---
## Wydajność
Jeden forward (`FM_CmdStart`) obsługuje cały potok. Na każdego gracza na każdy takt
Wtyczka wykonuje kilka operacji na liczbach zmiennoprzecinkowych i kilka operacji `pev`odczytu; zmienne konfiguracyjne serwera
są buforowane i odświeżane raz na sekundę, a nie odczytywane przy każdym takcie.
Nie ma skanowania obiektów w poszczególnych klatkach, nie ma `set_task`pętli dla każdego gracza ani
operacje na ciągach znaków w ścieżce krytycznej.
---
## Pomoc techniczna
Zakupiono w sklepie [codestrike.store](https://codestrike.store).
Zgłaszając problem, proszę dołączyć wynik polecenia `kzac_stats <player>`oraz
`kzac_physics`. Te dwa zrzuty zawierają wszystko, co jest potrzebne, aby odtworzyć autentyczny
wykrywanie na podstawie progu, który należy dostosować na serwerze.
---
*KZ Anti-Cheat — illusion @ CodeStrike*
---
## Dojrzałość detektora — przeczytaj to przed włączeniem kar
Nie wszystkie trzy czujniki mają równie sprawdzoną skuteczność, a różnica jest wystarczająco duża
że nie powinny być skonfigurowane w ten sam sposób.
### BUNNYHOP i GROUNDSTRAFE — gotowe do produkcji
Zweryfikowano w porównaniu z **dwoma niezależnymi odtwarzaczami**, przy obu ustawieniach AirAccelerate oraz
prawdziwe oszustwa. Żadna z wartości nie zbliżyła się nawet do progu w żadną stronę:
| Sygnał | Gracz A | Gracz B | Próg | Kod |
|---|---|---|---|---|
| `+jump` liczba naciśnięć na skok | 5.26 | 5.30–6.19 | 1.20 | 1.00 |
| seria idealnych skoków | 3 | 2–4 | 12 | 20–23 |
| `+duck` na sekundę | 13.3 | 9.0–20.2 | 35.0 | — |
| `+duck` zmienność odstępów | 0.70–0.88 | 1.03–1.16 | 0.10 | — |
| przerwy przy ruchach bez zmiany pozycji | 3% | 0% | 50% | 99% |
Można je bezpiecznie zautomatyzować. `kzac_punish_bhop 2`oraz `kzac_punish_gstrafe 2`
są rozsądne.
### STRAFE-STABILIZER — tylko ostrzeżenie
W trakcie prac rozwojowych wykryto dziewięć fałszywych alarmów, z których każdy wynikał z innej reguły.
Konieczne było **wyłączenie** pięciu reguł, ponieważ rozkłady wyników graczy i oszustów nakładają się na siebie:
| Zasada dotycząca osób niepełnosprawnych | Dlaczego |
|---|---|
| błąd kąta | człowiek 1,83°, oszust 1,34–2,20° — nakładanie się |
| odchylenie kąta – odchylenie standardowe | zakres dla człowieka 0,69–5,47°, ośmiokrotny rozrzut |
| udział w paśmie | jest to okno kątowe zależne od prędkości, a nie stałe |
| zamek obrotowy | wartość graniczna dla gracza wynosząca 0,139, a dla innego gracza – **0,026** |
| sprawność pojedynczego skoku | człowiek 0,684–0**,956**, oszust 0,835–0,946 — *odwrócone* |
To właśnie ta ostatnia lekcja jest najważniejsza. Podczas pojedynczego skoku gracz, który po prostu
Ataki, które dobrze się przemieszczają, osiągają wydajność na poziomie rozwiązywania zadań, a wartości ustalane przez ludzi są
prosto przez te wartości oszukańcze i dalej. Różnica między ręką a
maszyna pojawia się dopiero po uśrednieniu **setek tików**.
Aktywne pozostają dwie reguły okienne obejmujące ponad 300 impulsów czystego powietrza —
średnia wydajność i zmienność wydajności — które nigdy nie dały fałszywego wyniku
dodatni we wszystkich zarejestrowanych sesjach. Niezawodnie wykrywają stabilizator przy wysokich
`sv_airaccelerate`, gdzie wynosi 0,909, podczas gdy górna granica możliwości ludzkich wynosi 0,65.
**W `sv_airaccelerate 10`przypadku stabilizatora dostrojonego do 90° wzmocnienie jest mniejsze niż w przypadku dobrego
ludzkie i nie da się go wiarygodnie wykryć.** To rzeczywiste ograniczenie, a nie
problem z dostrojeniem: na podstawie dostępnych danych nie ma żadnego sygnału pomiarowego, który
w takim przypadku je od siebie oddziela.
Polecamy:
```
kzac_punish_bhop 2 // ban
kzac_punish_gstrafe 2 // ban
kzac_punish_strafe 0 // warn only, decide by hand
```
Zastosuj to na`kzac_stats` każdej osobie, którą zgłosi wykrywacz strafe. Liczby za
Wszystkie dane dotyczące werdyktu są tam zawarte, a administrator sprawdza je na podstawie powyższych tabel
jest lepszym kryterium oceny niż jakikolwiek obecnie stosowany próg.