Enforcement
The parts of settings.yml that decide who gets removed, when, and on what evidence.
Reputation
A score derived from cross-server violation data. Low reputation is a signal about a player's history, not a detection on your server.
reputation:
enabled: true
alerts:
enabled: true
threshold: 70.0
permission: "ecstacy.alerts.reputation"
actions:
enabled: false
threshold: 25.0
type: KICK
command: "tempban {player} 7d Suspicious history"
reason: "&cRemoved due to suspicious activity history."
bypass:
permissions:
- "ecstacy.reputation.bypass"
- "group.admin"
- "group.moderator"
uuids: []| Key | Default | Meaning |
|---|---|---|
alerts.threshold |
70.0 |
Alert staff when a joining player's reputation is below this percentage |
alerts.permission |
ecstacy.alerts.reputation |
Who receives those alerts |
actions.enabled |
false |
Whether low reputation does anything by itself |
actions.threshold |
25.0 |
Below this percentage, actions.type runs |
actions.type |
KICK |
KICK, BAN or COMMAND |
actions.command |
n/a | Used when type: COMMAND. Placeholders {player}, {uuid}, {reputation} |
bypass.permissions / bypass.uuids |
n/a | Skip reputation entirely |
Caution
actions.enabled is off by default for a reason. It removes a player for what happened on
other servers, before they have done anything on yours. Turn it on only if that is the
policy you want, and start with the threshold low.
Scope is switched at runtime with /ecstacy reputation mode <LOCAL|GLOBAL>, and a single player
can be reset with /ecstacy reputation reset <player>.
Known-cheaters blacklist
A federated list of UUIDs confirmed cheating across multiple customer servers. Who enters the list, and the corroboration rules that put them there, are decided centrally. You choose only whether to enforce it.
known-cheaters:
enabled: false
action: BAN
reason: "&cYou are on the Ecstacy cross-server cheater blacklist."
bypass:
- "ecstacy.blacklist.bypass"
- "group.admin"With enabled: true, a match is actioned on join and re-checked while the player is online.
Ban waves
Instead of banning on the spot, hold detected cheaters and remove them together on a schedule. Cheaters cannot correlate the ban with the round they were caught in, which makes the detection much harder to probe.
ban-waves:
enabled: false
interval-minutes: 1440
window-days: 7
scope: "SERVER"| Key | Default | Meaning |
|---|---|---|
interval-minutes |
1440 |
How often the queue is flushed and the broadcast sent. 1440 is daily |
window-days |
7 |
Window for the "X banned in the last N days" figure in the broadcast |
scope |
"SERVER" |
SERVER bans on this server only, NETWORK across the licence |
The flush fires a BanWaveEvent, which plugins can use to rewrite or suppress the broadcast. See
Events.
Auto-ban schedule
Restricts when auto-bans may execute. Outside the schedule, bans are skipped entirely. Alerts still fire and violation levels still accumulate.
auto-ban:
enabled: false
timezone: "UTC"
schedule:
- "* 00:00-08:00"
blackout: []
mode: "INSTANT"
batch-broadcast: "&d&l[Ecstacy] &fBatch ban wave! &d{count} &fcheaters removed &7(&d{time}&7)"Window format is <startDOW> <startHH:MM>-<endDOW> <endHH:MM>, where the day is a three-letter
code (MON–SUN) or * for every day. If the end time is at or before the start time, the
window crosses midnight.
| Key | Default | Meaning |
|---|---|---|
enabled |
false |
false means the current 24/7 behaviour |
timezone |
"UTC" |
IANA timezone ID, e.g. Europe/Rome |
schedule |
00:00–08:00 daily |
Active windows. Empty list with enabled: true means always active |
blackout |
[] |
Excluded windows. Always overrides schedule |
mode |
"INSTANT" |
INSTANT bans immediately inside the window; BATCH queues and flushes at a random time within it |
The default window is the night hours, when staff are usually offline and a wrongly removed player cannot be helped quickly.
Placeholders in batch-broadcast: {count}, {window}, {time}.
Staff feedback
feedback:
enabled: true
permission: "ecstacy.feedback"Adds a [Report] suffix to chat alerts. Clicking it sends a TRUE / FALSE / DUNNO verdict
back to the cloud, which feeds detection improvements.
Tip
This is the highest-value thing your staff can do for detection quality on your own server, and
it costs one click. FALSE on a wrong flag is worth more than a support ticket about it.
Suspicious queue
suspicious:
enabled: truePlayers whose scores repeatedly land just below the flag threshold are surfaced in
/ecstacy suspicious, as a console list or a GUI of player heads. The list is computed cloud-side
and pushed roughly every 60 seconds.
Replay recording
Records a player's actions while they are actively crystal-fighting. On a flag, the buffer is trimmed to the seconds before the flag and saved.
replay:
enabled: true
window-seconds: 30
max-record-seconds: 45
trigger-checks:
- "CrystalAura"
idle-disarm-seconds: 10
capture:
nearby-players: true
nearby-radius: 12
upload-to-cloud: true| Key | Default | Meaning |
|---|---|---|
enabled |
true |
Master switch for the recorder |
window-seconds |
30 |
How far back to keep when trimming a clip |
max-record-seconds |
45 |
Rolling buffer capacity. Must be at least window-seconds |
trigger-checks |
["CrystalAura"] |
Which checks trim and save on a flag. An empty list means all checks |
idle-disarm-seconds |
10 |
Seconds without crystal activity before recording stops and the buffer is dropped |
capture.nearby-players |
true |
Also record nearby players, so playback shows the fight and not just one player's movement |
capture.nearby-radius |
12 |
Radius in blocks for those snapshots |
upload-to-cloud |
true |
Upload the clip so staff can play it back from any server on the licence |
Clips are always written locally to plugins/EcstacyAC/replays/ regardless of upload-to-cloud.
When a flag records a clip, the staff alert gains a clickable [Replay] button that runs
/ecstacy replay play <id> for that clip. The same id appears in /ecstacy replay list <player>
and in the local filename. Playback is viewer-only: nobody else on the server sees it.
Note
The replay id is not the [Report] feedback id. Only the AI checks carry a feedback id, so the
recorder mints its own for everything else. Use the id shown next to [Replay].
Note
The clip is trimmed around the reconstructed moment of the flag, not the moment the cloud reported it. Those differ, so the interesting part is in the middle of the clip rather than at the end.
Tip
A flag suppressed by fail.alert.every still records a clip. The modulo only decides whether
staff see the chat line. alerts.mode: WEB_ONLY also keeps recording; the button just has no
chat line to sit on, so find the clip with /ecstacy replay list <player>.