Rook
← Back to home

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

Looking for host-specific click-by-click steps (Aternos, Pterodactyl, Docker, etc.)? See the dedicated install guide — this page covers configuration and usage once it's running.

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

  1. Stop the server.
  2. Drop Rook.jar into plugins/ and remove any older Rook build. Don't hot-swap a loaded plugin jar.
  3. Start the server. Watch the startup log for the packet engine, storage, and license lines.
  4. Run /rook activate <your-key> in console (Free tier can skip this).
  5. Review plugins/Rook/config.yml, then /ac info, /ac checks, and /ac shadow.
Every host's control panel is a little different. Full click-by-click steps for Aternos, Exaroton, Apex, Pterodactyl- and Multicraft-panel hosts, your own VPS, and Docker are in the install guide.

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>.*:

KeyMeaning
enabledTurn the check on/off entirely.
weightHow much a confirmed violation adds toward the suspicion score.
cancelWhether a confirmed violation also corrects/cancels the action (vs. flag-only).
disabled-worldsPer-check world exclusions, in addition to the global disabled-worlds list.
disabled-regionsCuboid 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

CommandTierWhat it does
/ac infoFVersion, active check count, current TPS.
/ac checks [filter]FList checks with weight, cancel state, and this-session flag count.
/ac shadowFChecks running in shadow/canary mode and how often they'd have flagged.
/ac susFTop 10 most suspicious players online, with why.
/ac check <player>FOne player's suspicion, ping, brand, channels, violation breakdown.
/ac mods <player>PFull client/mod report.
/ac logs <player> [n]PLast n evidence entries (default 10, max 50).
/ac history <player>PKick / tempban / client-kick / ban / fast-rejoin counts.
/ac lookup <player>PStored record including offline players.
/ac alts <player>PAccounts sharing an IP. Informational only — see Core Concepts.
/ac exportPDump all records to CSV.
/ac replay <player>PList captured replay clips for a player.
/ac dailyreport [hours]UDeterministic security summary over the last n hours.
Where did /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

CommandTierWhat it does
/ac clientmode <mode>FJoin policy: off / blacklist / vanilla-only / whitelist.
/ac strict [on|off]FShortcut for vanilla-only.
/ac allowclient <mod>FLet a specific client/mod join anyway.
/ac probe <player>PRun the sign-probe on demand (identifies Meteor/XRay/FreeCam/Baritone).

Moderation

CommandTierWhat it does
/ac freeze <player>PFreeze/unfreeze a suspect in place.
/ac appeal <code>PLook up a ban by its appeal code.
/ac unban <player>FLift a Rook ban.
/ac reset <player> [full]PWipe suspicion/violations/evidence/history. full also clears inventory.

License & admin

CommandTierWhat it does
/ac activate <key>FActivate a SENT-... license key.
/ac licenseFShow license tier, serial, update window.
/ac reloadFReload config.yml.
/ac preset [name]FList or apply a bundled config profile. See Presets.

Permissions

PermissionDefaultGrants
rook.staffopAll read/inspect commands (/rook, /sus).
rook.adminopDangerous commands: activate, reset, unban, clientmode, allowclient, strict, preset.
rook.alertsopReceive live detection alerts.
rook.bypassfalseExempt this player from all checks and probes.
rook.chat.bypassopBypass 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.

PresetBest for
survivalBalanced default — also doubles as "reset to defaults".
pvpFactions/kitpvp — wider knockback/teleport grace, less alert noise per fight.
minigamesBedwars/skywars/sumo — fast suspicion decay between short matches.
creativeBuild servers — higher thresholds, client-brand blocking off.
anarchyMinimal-rules servers — highest thresholds, 3-check corroboration.
lifestealLifesteal SMPs — faster escalation once evidence is in; hearts lost to a cheater are often permanent.
hardcorePermadeath survival — the most conservative preset; a false positive costs someone their one life.
skyblockIsolated islands — wide teleport grace for constant island/home/visit warping.
prisonMine/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

  1. Floodgate API (authoritative when present) — a soft dependency reached only via reflection.
  2. Client brand — Geyser sets its own outgoing brand regardless of whether Floodgate is installed, so a Geyser-only setup is still caught.
  3. 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.

Rook is a Java Edition Paper plugin. It runs on your Java server and detects Bedrock players connecting through it — it cannot install on a Bedrock Dedicated Server or an Xbox-hosted Realm, because those platforms have no third-party plugin system at all. That's true for every anti-cheat, not a Rook limitation.

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.

Built-in language packs are on the roadmap, not shipped yet. The language switcher in the site header is visible for that reason — English is live today; a translated site and bundled message packs for other languages are coming.

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).

All three events are synchronous and always fired on the primary thread, even when the triggering detection came from an async packet listener — Rook hops threads internally before touching the Bukkit API.

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 to explain <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.