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.

settings.yml
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.

settings.yml
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.

settings.yml
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.

settings.yml
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 (MONSUN) 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

settings.yml
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

settings.yml
suspicious:
  enabled: true

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

settings.yml
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>.

Last updated