Introduction
Rook is a confidence-based, packet-level anti-cheat for Paper and Purpur servers. It combines Bukkit event checks with a shaded PacketEvents pipeline, then routes every live detection through one evidence, alert, decay, setback, and punishment system.
The central rule is accuracy before aggression: a check contributes weighted evidence; serious action requires repeated evidence, and a permanent ban can require independent corroboration from a second check before it's issued outright.
What's covered here
- Installation — drop the jar in, pick your host.
- Commands — the full
/rookreference. - Core Concepts — how the scoring and punishment ladder actually works.
- API & Events — hook your own plugin into Rook's detections.
Installation
Rook is a normal Paper/Purpur plugin: no extra dependencies to install (PacketEvents is shaded and relocated inside the jar).
Requirements
- Paper or Purpur, 1.21+
- Java 21 runtime (Rook emits Java 21 bytecode; Paper 1.21+ builds may require a newer JDK to run the server itself)
- Plain Spigot/CraftBukkit is not supported — anti-xray and a few checks use Paper-only APIs
Steps
- Stop the server.
- Drop
Rook.jarintoplugins/and remove any older Rook build. Don't hot-swap a loaded plugin jar. - Start the server. Watch the startup log for the packet engine, storage, and license lines.
- Run
/rook activate <your-key>in console (Free tier can skip this). - Review
plugins/Rook/config.yml, then/ac info,/ac checks, and/ac shadow.
Configuration
Everything lives in plugins/Rook/config.yml, generated with commented defaults on first boot. Run /rook reload after editing (new check toggles still need a restart).
Per-check settings
Every check lives under checks.<id>.*:
| Key | Meaning |
|---|---|
enabled | Turn the check on/off entirely. |
weight | How much a confirmed violation adds toward the suspicion score. |
cancel | Whether a confirmed violation also corrects/cancels the action (vs. flag-only). |
disabled-worlds | Per-check world exclusions, in addition to the global disabled-worlds list. |
disabled-regions | Cuboid regions where this check never runs — useful for a minigame arena inside a survival world. |
Lag compensation
lag-compensation.min-tps suspends timing-sensitive checks below that TPS floor; soft-ping widens tolerances for laggy connections, hard-ping exempts them outright.
Punishment thresholds
suspicion.thresholds.* sets the alert/kick/tempban/ban score cutoffs. punishments.* controls tempban duration, escalation after repeat kicks/tempbans, and whether punishments broadcast server-wide.
Commands
Root command /rook (alias /ac). Works in-game and from console. Tab-completion covers every sub-command and player-name argument.
F Free P Pro/Ultimate U Ultimate only
Inspection
| Command | Tier | What it does |
|---|---|---|
/ac info | F | Version, active check count, current TPS. |
/ac checks [filter] | F | List checks with weight, cancel state, and this-session flag count. |
/ac shadow | F | Checks running in shadow/canary mode and how often they'd have flagged. |
/ac sus | F | Top 10 most suspicious players online, with why. |
/ac check <player> | F | One player's suspicion, ping, brand, channels, violation breakdown. |
/ac mods <player> | P | Full client/mod report. |
/ac logs <player> [n] | P | Last n evidence entries (default 10, max 50). |
/ac history <player> | P | Kick / tempban / client-kick / ban / fast-rejoin counts. |
/ac lookup <player> | P | Stored record including offline players. |
/ac alts <player> | P | Accounts sharing an IP. Informational only — see Core Concepts. |
/ac export | P | Dump all records to CSV. |
/ac replay <player> | P | List captured replay clips for a player. |
/ac dailyreport [hours] | U | Deterministic security summary over the last n hours. |
/ac explain go? It moved off the in-game command list — the exact, appeals-grade evidence timeline is now answered live by the dashboard's Ask Rook chat (type "explain <player>"), reading straight from the plugin's own record rather than being paraphrased.Client / cheat-client control
| Command | Tier | What it does |
|---|---|---|
/ac clientmode <mode> | F | Join policy: off / blacklist / vanilla-only / whitelist. |
/ac strict [on|off] | F | Shortcut for vanilla-only. |
/ac allowclient <mod> | F | Let a specific client/mod join anyway. |
/ac probe <player> | P | Run the sign-probe on demand (identifies Meteor/XRay/FreeCam/Baritone). |
Moderation
| Command | Tier | What it does |
|---|---|---|
/ac freeze <player> | P | Freeze/unfreeze a suspect in place. |
/ac appeal <code> | P | Look up a ban by its appeal code. |
/ac unban <player> | F | Lift a Rook ban. |
/ac reset <player> [full] | P | Wipe suspicion/violations/evidence/history. full also clears inventory. |
License & admin
| Command | Tier | What it does |
|---|---|---|
/ac activate <key> | F | Activate a SENT-... license key. |
/ac license | F | Show license tier, serial, update window. |
/ac reload | F | Reload config.yml. |
/ac preset [name] | F | List or apply a bundled config profile. See Presets. |
Permissions
| Permission | Default | Grants |
|---|---|---|
rook.staff | op | All read/inspect commands (/rook, /sus). |
rook.admin | op | Dangerous commands: activate, reset, unban, clientmode, allowclient, strict, preset. |
rook.alerts | op | Receive live detection alerts. |
rook.bypass | false | Exempt this player from all checks and probes. |
rook.chat.bypass | op | Bypass chat protection. |
Core Concepts
Confidence scoring
A single detection never punishes anyone. Each check adds vl × weight to a hidden, decaying suspicion score. Kick, tempban, and ban have separate thresholds, escalating only as evidence accumulates.
Shadow / canary mode
Any check can run observe-only: it records evidence and replay clips, but adds zero suspicion and can never cancel or punish. New or materially changed checks are meant to ship shadowed until observed against real traffic before they can punish — that's the intended process, and where a specific check is in it (automated-tested only, or actually observed live) is stated in the changelog rather than assumed. /ac shadow shows what's currently shadowed.
Second-opinion ban gate
Reaching the permanent-ban threshold doesn't ban outright. It also needs a second opinion: two distinct checks flagging within a short window, or one check whose own confidence clears a high bar. If neither is met, Rook issues a tempban instead and logs a held-back-ban entry for staff to review. This only gates permanent bans — kicks and tempbans are unaffected.
Alt-account correlation
When a player joins from an IP already linked to another known account, staff (and optionally Discord) get a heads-up. This never adds suspicion, cancels anything, or punishes — shared IPs are routine (siblings, schools, VPNs, CGNAT). The one case worth acting on is called out visually: a linked account that's currently banned or tempbanned. IPs are stored as a salted hash by default, never in plaintext.
Combat
Aim, reach, click-rate, and attack-state cheats.
- Reach (hitbox raytrace + ping leniency)
- KillAura A–D: state, angle, multi-target, raytrace
- AutoClicker (CPS + click-interval + pattern)
- Criticals, Velocity, VelocityV (partial anti-knockback)
- NoSwing, AutoBlock, AimSnap, AimGcd (aim quantization)
- BowSpam, BowAimbot, CrystalAura, AutoTotem
- BedAura, AutoAnchor, AutoPot, AutoWeapon, Honeypot
Movement
Rebuilt around physics prediction: checks forecast the expected next-tick position from real gravity/velocity math rather than flat thresholds, and read the server's actual gravity/speed attributes so a legitimate effect is never mistaken for a hack.
- Flight A (gravity prediction) + Flight B (hover/anti-kick)
- Speed A (rolling-window) + Speed B (friction prediction)
- NoFall, Jesus, Step, Spider A–B, HighJump, Strafe
- NoSlow, FastClimb, BoatFly, ElytraFly, ElytraSpeed
- Timer, Phase, VClip, Bhop, AutoWalk, SafeWalk, Glide
- LongJump, AutoJump, AntiVoid, Riptide, KeepSprint
Packet Layer
Runs on a shaded PacketEvents pipeline, off the main thread where needed, all timing measured with monotonic clocks (immune to system clock adjustments).
- BadPackets A–E: invalid rotation, non-finite position, malformed slot, implausible position jump, self-attack
- AbilitiesA — forged flight-abilities packet
- Crash-book & sign-exploit protection
- Illegal creative-action drop
- GCD aim analyzer + rotation spoof (advisory)
- Blink/phase teleport detection (TimerA/TimerB)
World & Economy
- X-ray ore-exposure scoring (advisory — Paper's own anti-xray engine does the actual obfuscation; see
/ac antixray) - Anti-ESP / freecam occlusion — mitigation, not detection: hides entities a viewer genuinely can't see rather than trying to detect the renderer
- Dupe watermarking and audit
- Nuker, FastBreak, FastPlace, FastUse, Scaffold
- AutoFish, Tower, AutoEat, AutoInteract
- IllegalItems / NBT scan, GhostBlock
Config Presets
/ac preset lists the bundled profiles; /ac preset <name> applies one. Every preset backs up your live config.yml first, then overwrites only top-level tunables — lag tolerance, suspicion pacing, corroboration strictness, alert noise, client-brand policy. A preset never touches an individual check's weight or threshold, so switching profiles can never make Rook worse at catching a real cheater — only how eagerly it punishes and how much latency it tolerates.
| Preset | Best for |
|---|---|
survival | Balanced default — also doubles as "reset to defaults". |
pvp | Factions/kitpvp — wider knockback/teleport grace, less alert noise per fight. |
minigames | Bedwars/skywars/sumo — fast suspicion decay between short matches. |
creative | Build servers — higher thresholds, client-brand blocking off. |
anarchy | Minimal-rules servers — highest thresholds, 3-check corroboration. |
lifesteal | Lifesteal SMPs — faster escalation once evidence is in; hearts lost to a cheater are often permanent. |
hardcore | Permadeath survival — the most conservative preset; a false positive costs someone their one life. |
skyblock | Isolated islands — wide teleport grace for constant island/home/visit warping. |
prison | Mine/rank-up servers — custom block-break enchants can resemble nuker/fastbreak; scope those checks to your mine regions. |
Bedrock & Geyser
Bedrock players reach the server through fundamentally different input hardware (touch screen or a game controller, translated by Geyser), and their movement/interaction timing genuinely differs from mouse-and-keyboard Java play — a known false-ban source for anti-cheats that treat every client identically.
Detection — three independent signals
- Floodgate API (authoritative when present) — a soft dependency reached only via reflection.
- Client brand — Geyser sets its own outgoing brand regardless of whether Floodgate is installed, so a Geyser-only setup is still caught.
- UUID version heuristic (fallback, needs neither plugin) — Floodgate issues version-0 UUIDs, a value no Mojang-issued or offline-mode account ever produces.
However detected, every violation level a Bedrock player generates is scaled down before it reaches their suspicion score (bedrock.vl-multiplier, default 0.7). This can only make Rook more lenient toward a detected Bedrock player, never more aggressive. Disable with bedrock.enabled: false.
Localization
All player-facing text lives under messages.* in config.yml using MiniMessage formatting, so you can already reword or fully translate kick/ban screens and chat notices yourself.
Dashboard Remote Actions
Ultimate's web dashboard can moderate your server without you being in-game. The plugin never opens an inbound port — it dials out to the dashboard on a short timer and drains a queue of actions a moderator queued in the browser.
Available actions
kick · tempban · ban · unban · freeze · notify · broadcast · setcheck · setconfig · addbannedword · removebannedword · reload
Plus two read-only queries used by the Player Inspector: inspect and peekcontainer, and explain for the evidence-timeline lookup behind the Ask Rook chat.
Safety model
- Fixed whitelist — only the actions above are ever honoured, re-validated on the plugin side even though the backend already validated them. There is deliberately no "run arbitrary console command" action.
- Config changes are allow-listed to a safe subset of paths — sync/license settings can never be rewritten remotely.
- Fails quietly — a dashboard outage never touches the anti-cheat itself.
API & Events
Rook fires standard, cancellable Bukkit events so other plugins can observe — or veto — a detection or punishment before it takes effect. No separate API jar needed; depend on Rook and listen normally.
RookViolationEvent
Fired synchronously before a live check violation is accepted. Cancelling it rejects the detection completely — no suspicion change, no evidence write, no staff alert.
@EventHandler
public void onViolation(RookViolationEvent e) {
Player p = e.getPlayer();
String checkId = e.getCheckId();
double projected = e.getProjectedSuspicion();
// e.setCancelled(true) to veto this detection
}
Exposes getRawViolationLevel(), getEffectiveViolationLevel() (after platform dampening, e.g. Bedrock scaling), getWeightedViolationLevel(), current/projected check total, and current/projected suspicion.
RookPunishmentEvent
Fired before a kick/tempban/ban is actually applied. Cancelling it blocks the punishment; the player is never touched.
@EventHandler
public void onPunishment(RookPunishmentEvent e) {
if (e.getAction() == RookPunishmentEvent.Action.BAN) {
// inspect e.getReason(), e.getSuspicion(), e.getExpiresAt()
}
}
RookAlertEvent
Fired when a staff alert is generated, letting a network plugin mirror alerts elsewhere (a cross-server staff channel, a custom overlay, etc).
Reporting a Bug
Email support@rookac.com with:
- Your Rook version (
/ac info) and Paper/Purpur build - What happened, and what you expected instead
- For a false positive: the player's
/ac logs <player>output or, better, ask the dashboard's Ask Rook chat toexplain <player>for the full timeline - Anything unusual about the setup (Bedrock/Geyser, a custom preset, disabled regions)
Pro and Ultimate licenses get priority replies. See also the Q&A for common issues before reporting.
