Basic 1.8x plugin to detect cheaters in Minecraft Java Edition using the PacketEvents library.
📖 The original YouTube series can be found on YouTube
The following checks below have been implemented:
| ⚔️ Combat | 📦 Packet | 🏃 Movement |
|---|---|---|
| AimA | Timer | NoFallA |
| KillauraA | Blink | NoFallB |
| KillauraB | Invalid Pitch | SpeedA |
| ReachA | PingSpoof | |
| ReachB |
Below check explanations for the first few episodes (the later episodes go more in-depth into explanation) can be found:
KillauraA:
-
In vanilla Minecraft (
1.8x), when a player moves or looks around, the client sends packets such as:PLAYER_FLYINGPLAYER_POSITIONPLAYER_ROTATIONto update its position and orientation.
-
When players attack, the client sends an
INTERACT_ENTITYpacket. Due to:- Human reaction times
- Network latency (lag)
- The game's tick rate
there is usually a delay of more than a few milliseconds between a movement update (
PLAYER_FLYING) and an attack (INTERACT_ENTITY) packet. -
Many killaura cheats are designed to send attack packets almost immediately after the last movement update.
-
This creates an abnormally short interval between:
- The last
PLAYER_FLYINGpacket - The
INTERACT_ENTITYpacket
- The last
-
Our check detects this abnormally short interval to identify potential killaura behavior.
NoFall (A):
-
Cheat clients can avoid taking fall damage by telling the server that they are on the ground, even when they aren't.
- This is done by using the
clientGroundstate.
- This is done by using the
-
As the server, we can calculate a
serverGroundstate by looking at the player'syposition.- Finding a mismatch between
clientGroundandserverGround(while maintaining a buffer and1-tickdesync to avoid false flags) allows us to catch the cheater.
- Finding a mismatch between
NoFall (B):
- Check for the default behavior of taking fall damage when falling from over 3 blocks.
- If the player doesn't take fall damage and didn't land on a soft block like slime or water, then flag them.
Why does NoFall (A) detect Flight hacks sometimes?
- When flying off a solid block, our
serverGroundcalculation (which checks if player's Y % 1/64 roughly = 0) remainstrue, while theclientGroundbecomesfalsebecause the player is now flying in the air. This causesNoFall (A)to flag. - When falling a bit or jumping first before beginning to fly,
NoFall (A)is not triggered because the player's Y becomes a weird decimal, soserverGroundbecomesfalse, which matches theclientGround. Thus,NoFall (A)is not an actual robust fly check, but the fly detection is simply a weird side effect of how we did our check.