Fly: celá kontrola je gravitační křivka
Hráč ve vzduchu si v Minecraftu nemůže být kde chce. Jeho vertikální rychlost klesá každý tick podle pevného pravidla, ať dělá cokoli: odečti konstantu, pak vynásob konstantou. Skok je ta křivka začínající na pevné počáteční rychlosti; trvá zhruba sekundu a dostane hráče o něco víc než blok nad zem. Pád je ta samá křivka do záporu, zrychlující.
Kontrola se tedy napíše skoro sama: dokud je hráč ve vzduchu, jeho výška musí tu křivku respektovat. Chtějí se po něm dvě věci a ani jedna se nedá vyřešit posíláním více paketů nebo cukáním hlášené výšky, protože obě se měří proti reálnému času, ne proti paketům, a obě proti té nejvelkorysejší legální trajektorii:
- Musí klesat, rychlostí hluboko pod gravitací, ale výrazně nad nulou. Každý efekt, který legitimně zpomaluje pád a je pro proxy neviditelný — slow falling především — hráče pořád snáší o metry za sekundu. Vznášení ne.
- Nikdy se nesmí dostat výrazně nad místo, kde úsek začal, protože nic, co startuje na počáteční rychlosti skoku a klesá, se nedostane výš než zhruba o blok a čtvrt.
Těžké je vědět, že je ve vzduchu
Tady je past. Pohybový paket nese příznak, jestli klient věří, že na něčem stojí, a fly modul ten příznak prostě nastaví na true. Kontrola, která ho čte, kontroluje hodnotu, kterou napsal cheat.
Jediným poctivým zdrojem je svět, který klientovi poslal server. Proxy si drží okno bloků kolem hráče a rekonstruuje, co je pod jeho kolizním kvádrem.
Rozdíl mezi kontrolou, která funguje, a kontrolou, která obviňuje nevinné, dělají dva detaily:
Musí se ptát na kolizní kvádr, ne na jeden sloupec. Hráč stojící na rohu bloku je nad čtyřmi sloupci naráz. Zeptejte se na jediný sloupec u zaokrouhlené pozice hráče a fly modul zaparkovaný na hraně bloku vyjde jako někdo, kdo nestojí na ničem — což je flag proti hráči, který doopravdy stojí na místě.
„Není plný blok" a „nevím" jsou různé odpovědi. Tabulka bloků, která ručí jen za jisté plné kostky, vrátí stejné „není plná kostka" pro půlblok, pro plot i pro vzduch. Sesypat je do „žádná podlaha" znamená, že každý hráč stojící na půlbloku je pro kontrolu ve volném vzduchu. Verdikt potřebuje tři stavy a ten obviňující — hráče nedrží nic — musí být důkazem. Nenačtený chunk, koberec, loďka, žebřík nebo blok, na který daná verze nemá názor, na důkaz nestačí a kontrola nad nimi nesmí říct vůbec nic.
Timer: rychlost je sám cheat
Vanilla klient posílá jeden pohybový paket za tick, dvacetkrát za sekundu, protože to dělá jeho tick smyčka. Timer hack rychlost té smyčky zvýší a všechno, co klient dělá, se zrychlí s ní — pohyb, těžba, útoky, všechno. Tím se z rychlosti pohybových paketů nestává příznak cheatu, ale sám cheat, a proto je to jeden z nejsilnějších dostupných signálů.
Naivní měření ale označí každého. Sítě zamrzají a když se zamrzlé spojení probere, dorazí nabufferované pakety klienta v dávce. Kontrola počítající pakety v pevném okně tu dávku vidí jako timer hack.
Řešením je token bucket naruby: každý pohybový paket utratí token a tokeny se doplňují přesně vanilla tick rate. Klient, který byl chvíli zticha — protože mu zamrzlo spojení — má naspořeno, takže ho dorovnávací dávka nestojí nic. Klient, který opravdu tiká rychleji než hra, kýbl vyprazdňuje nepřetržitě a nemůže přestat, protože zpomalit je právě to, co cheat dělat nechce.
Speed: měřte dlouhodobý průměr, ne tick
Horizontální rychlost zní jako nejjednodušší kontrola ze všech a je tou, která nejspíš dopadne špatně, protože legální maximum se skutečně liší. Led, sliz, elytra, lektvary, jízdní zvířata a tucet pluginových efektů ho zvyšují — a proxy, která neumí ocenit každý z nich, nezná přesný strop pro tohohle hráče v tomhle okamžiku.
Špatná odpověď je odhadnout těsný rozpočet a označovat poctivé hráče. Ta správná, bez plného kontextu bloků, je velkorysý strop na dlouhodobý průměr — hodnota, na kterou nedosáhne žádný výkyv latence ani jediný rychlý tick a pod kterou nezůstane žádný speed modul, protože zůstat pod ní znamená necheatovat. Kontrola je záměrně volná a přesto funguje, protože smyslem speed hacku je být dlouhodobý.
No-clip: nejlevnější možný test
Když hráč tvrdí, že stojí tam, kde je plná pevná kostka, je uvnitř ní. To je jedno porovnání proti oknu bloků a nepotřebuje to žádnou historii.
Bezpečné je to díky konzervativní tabulce bloků. Za pevné se počítají jen bloky, které jsou jistě plné kostky, takže půlblok, plot, dveře nebo tabule skla jsou průchozí a otření se o ně nikdy neobviní. A jeden tick uvnitř bloku je klient a server, kteří se na okamžik neshodli — otevírající se dveře, píst, dopad na laggujícím připojení. Teprve souvislá série znamená, že hráč prostě ignoruje kolize.
Jesus: chození po kapalině
Hráč přecházející vodu je buď v ní, nebo na něčem. Jesus je třetí případ: tělo zůstává nad hladinou, pod ním není nic pevného a přechod pokračuje. Jeden tick téhle situace je skok přes louži, takže k obvinění je potřeba souvislá série — a ta musí urazit skutečnou vzdálenost, jinak by houpání na kraji jezírka vypadalo stejně.
Co dělají poctiví hráči a vypadá to jako cheat
Stojí za to říct to výslovně, protože tohle jsou situace, které špatně napsaná kontrola trestá:
| Běžná situace | Co vidí nedbalá kontrola | Co zabrání falešnému poplachu |
|---|---|---|
| Spojení zamrzne a pak dorovná | Dávku pohybových paketů — timer hack | Naspořený kredit v token bucketu |
| Stání na rohu bloku | Pod hráčem nic — létá | Test celého kolizního kvádru |
| Stání na půlbloku nebo koberci | Žádná pevná podlaha — létá | Odlišení „není plná kostka" od „žádná podlaha" |
| Elytra, led, lektvar rychlosti | Nemožnou horizontální rychlost | Strop na dlouhodobý průměr, nastavený velkoryse |
| Dveře, které se otevřou do hráče | Stání uvnitř bloku — no-clip | Vyžadování souvislé série |
| Skok přes potok | Stání na vodě — Jesus | Vyžadování souvislého pohybu nad kapalinou |
Každý z těch případů je důvod, proč má pohybový anticheat sčítat klesající úroveň porušení místo aby jednal podle okamžiku, a proč je korekční teleport lepší první reakcí než kick. Obojí rozebírá Co je Minecraft anticheat?.
Soubojové cheaty zanechávají úplně jiné stopy a věnuje se jim Killaura a reach hacky.