Polymart is now Voxel Shop! We're upgrading many features of the site, and during this open beta you will experience occasional bugs. Learn more
Statistical anti-AFK-fishing detection with gorgeous Discord alerts.
Auto-fishing macros are the single most profitable, hardest-to-catch cheat on survival and economy servers. They look entirely innocent, generate insane loot over an AFK night, and leave moderators staring at perfectly-played footage with zero proof.
FishSentry stops guessing and starts measuring. It silently analyzes the statistical fingerprint of every player's fishing session and flags the ones that no human could produce—like reaction-time consistency, bobber clustering, and sub-300ms re-casts. It then dispatches a rich Discord alert with every data point your staff needs to take action.
No grey-area bans. No false positives from lucky players. Just math.
🔍 What It Detects
FishSentry runs four independent behavioral checks in the background. Each check is worth a configurable number of violation points. When a player's running total crosses your threshold, the configured punishment fires.
1. Reaction-Time Standard Deviation: Tracks the time between BITE and CAUGHT over a rolling 20-catch buffer and computes the population standard deviation. Humans sit in the 80–300 ms range; macros sit under 10 ms. Anything below your threshold (default 150 ms) is flagged.
2. Bobber Clustering: Compares the cast position of every fishing bobber to the previous cast. A macro recasts to the exact same voxel every time; a human cannot. (Uses squared distance to avoid sqrt overhead in the hot path).
3. Instant Re-cast Detection: Measures the time between a successful CAUGHT and the next FISHING event. Macros re-cast in 10–50 ms; humans take 300+ ms just to react and click.
4. Flawless-Streak Tracking: Counts consecutive catches without a FAILED_ATTEMPT and surfaces the streak in the Discord alert, giving staff clear visual evidence of macro behavior.
💬 The Ultimate Evidence Packet
Forget bland "Player was kicked" console messages. Every punishment triggers a comprehensive Discord embed so your moderators get the entire evidence packet in one place—no chasing logs, no cross-referencing, no doubt.
• Player Identity: 3D skin render (full body), avatar thumbnail, and a clickable NameMC link to their account history.
• Session Stats: Violation points vs. threshold (with a color-coded progress bar), session duration, total catches, and catches/minute rate.
• Mathematical Proof: Mean reaction time, standard deviation over the buffer, and consecutive flawless-catch streak.
• Check Breakdown: Exact checks that fired and how many times each was triggered.
• Action Details: Full UUID in a copy-friendly code block, the exact console command that was executed, Server name, Paper build, and an ISO-8601 timestamp.
⚡ Built for Production Servers
• Zero Dependencies: No Gson, no Jackson, no third-party HTTP clients. Drops in cleanly next to Spartan, Matrix, Grim, or any other anti-cheat.
• Allocation-Free Hot Path: All per-player state lives in primitive fields on a preallocated profile object. No HashMaps, no boxing, no lambdas inside PlayerFishEvent.
• Fixed-Size Circular Buffers: Reaction samples use predictable, constant memory—no matter how long a player fishes.
• Off-Thread Networking: Webhook dispatch is offloaded to BukkitScheduler.runTaskAsynchronously. The main thread never blocks on Discord's API, even if Discord goes down.
• Thread-Safe: Immutable detection snapshots are handed to the async task, ensuring the live profile can never race the HTTP thread.
• Hot-Reloadable: Every threshold, point value, punishment command, and webhook setting is tunable without a server restart.
• Clean Java 21 Codebase: Built using modern records, switch expressions, and sealed models. Thoroughly documented.
🛡️ Why not just use a full Anti-Cheat?
Because full anti-cheats don't catch this. Auto-fishing is legal-looking player input: right-click, reel, right-click, reel. Movement checks, combat checks, and packet checks all pass. Only behavioral statistics catch it, and FishSentry is the one plugin on the market purpose-built for that job. Run it alongside your existing anti-cheat, not instead of it.
⚙️ Configuration (Excerpt)
thresholds:
max-std: 150.0 # ms; reaction StdDev below this = bot-like
min-recast-delay: 300 # ms; instant-recast threshold
min-bobber-distance-sq: 0.25 # blocks^2; cluster threshold
points:
std-violation: 3
clustering-violation: 2
recast-violation: 2
punishment:
max-points: 15
command: "kick {player} Suspected auto-fishing."
# Examples:
# "tempban {player} 1h Auto-fishing"
# "tell {player} Your fishing pattern looks automated."
webhook:
enabled: true
url: "https://discord.com/api/webhooks/..."
📦 What's In The Box
• FishSentry-1.0.0.jar
• Fully commented default config.yml
• Automatic config generation on first start
• Lifetime updates for the 1.21.x line
• Direct Discord support from the developer
📋 Requirements
• Paper (or any Paper fork — Purpur, Pufferfish, etc.)
• Minecraft 1.21.x
• Java 21
• A Discord webhook URL (Optional, but highly recommended)
🚀 Roadmap
• /FishSentry reload, status, and test-webhook commands
• Per-world enable/disable and permission-based bypasses
• MySQL / Redis support for cross-server point persistence
• PlaceholderAPI integration
• ViaVersion compatibility notes (already tested with 1.8 - 1.21.11 clients)