Setup

How to install Counter and set it up for your server.

Requirements

  • Spigot, Paper, Purpur or Folia on Minecraft 1.20 or newer
  • Java 21
  • The latest PacketEvents

Install

  1. Install PacketEvents

    Drop it in your plugins folder.

  2. Add Counter

    Download it from Modrinth or SpigotMC and put the jar in the same folder.

  3. Restart

    Counter writes its config on first start. On later updates it adds new settings to your config by itself.

First week

Out of the box, 68 checks punish, 46 only alert and 1 is off. The checks page shows which is which.

  1. Watch the alerts

    Turn them on with /counter alerts. Hover an alert to see why it fired.

  2. Decide what punishes

    Each check has a punish-vl in config.yml. Set alert-only: true on any check you don't trust yet. Newer parts of some checks are listed under watch and only alert until you remove them.

  3. Tune it

    After a few days, /counter tune shows which checks false flag on your server and /counter tune apply loosens them.

checks:
  flya:
    enabled: true
    alert-only: false
    punish-vl: 20
    watch: [boost, early, lowgrav]

Commands

Everything starts with /counter, or /c and /anticheat for short.

/counterOpen the main menu
/counter alertsTurn alerts on or off
/counter verboseShow the raw info on alert lines
/counter check <name> [player]What a check does and its violation level
/counter info <check>Check details
/counter toggle <name>Turn a check on or off
/counter status [player]Server or player info
/counter vl <player>Every violation level of a player
/counter history <player>Stored flag history
/counter client <player>Client, version and mods
/counter topTop online violators
/counter suspectsOnline players ranked by violation level
/counter recent [page]Recent flags across the server
/counter logs [page]Recent flag logs
/counter inspect <player>Staff view of a player
/counter freeze <player|list>Freeze or unfreeze a player, or list who is frozen
/counter spectate [player]Spectate a player
/counter backReturn from spectating
/counter exempt <player> [check] [time]Exempt a player from one check or all
/counter reset <player>Reset a player's data
/counter replay [id|list|save|...]Watch, save and share replays
/counter banwaveQueued bans and when the next wave runs
/counter world [world]Turn checks off or alert only in a world
/counter region <id>The same for a WorldGuard region
/counter tune [apply]Tune checks from your flag data
/counter shadowCompare the newer prediction model
/counter networkLinked servers and their status
/counter discordDiscord bot status
/counter shieldBase shield status
/counter lang [code|auto]Pick your own language
/counter debug [player]Toggle debug
/counter versionPlugin, server and hook info
/counter dumpWrite a support file for bug reports
/counter clearWipe all violation data
/counter reloadReload the config

Permissions

counter.adminFull access
counter.staffFreeze, spectate, inspect and replays
counter.alertsReceive alerts
counter.guiOpen the menu
counter.useUse /counter at all. Each subcommand still checks its own permission
counter.freezeFreeze and unfreeze players
counter.spectateSpectate and teleport to players
counter.inspectInspect players, suspects and recent flags
counter.replaySave, list and watch replays
counter.replay.deleteDelete saved replays
counter.networkSee network status
counter.debugUse debug mode
counter.shield.seeSee everything the base shield would hide
counter.freeze.bypassCan't be frozen
counter.exemptExempt from checks
counter.bypassBypass every check. Narrow it with counter.bypass.move, .combat or .player, a group like counter.bypass.fly, or one check like counter.bypass.flya

Placeholders and API

With PlaceholderAPI installed, these work anywhere placeholders do.

%counter_vl%Total violation level
%counter_vl_<check>%Violation level on one check, like %counter_vl_flya%
%counter_top_check%The check with the highest violation level
%counter_flags%Total flags
%counter_offenses%Punishment offenses
%counter_ping%Ping
%counter_cps%Clicks per second
%counter_client%Client name
%counter_bedrock%yes or no
%counter_device%Bedrock device, or Java
%counter_frozen%yes or no
%counter_alerts%Whether alerts are on
%counter_tps%Server TPS

Plugins can get CounterApi from the Bukkit services manager to read and reset violation levels, and check a player's client, ping and Bedrock status. FlagEvent, PunishEvent and SetbackEvent fire as they happen, and all three can be cancelled.

Networks

Install Counter on every backend server, then turn on network in each config. Give every server its own name and the same secret. Use Redis, or set transport: proxy to go through BungeeCord or Velocity plugin messaging instead.

network:
  enabled: true
  transport: redis
  server: survival
  secret: "same-on-every-server"
  redis:
    host: 127.0.0.1
    port: 6379

Storage

Violations and flag history are kept in SQLite with nothing to set up. For MySQL or MariaDB, create the database and Counter makes the table.

database:
  enabled: true
  type: mysql
  mysql:
    host: localhost
    port: 3306
    database: counter

Older clients

  • For 1.8 and 1.9 to 1.16 players, some tick checks need handle-pings-as-inv-acknowledgements: true in the ViaBackwards config.
  • If ViaVersion runs on your proxy, leave post_tick and multi out of the proof list under aurab. They are off by default.