Skip to content

Configuration ​

Main config: plugins/FakeModBlocker/config.yml

Basics ​

yaml
language: en          # locale file suffix → messages_en.yml ("en" and "cn" ship by default)
enable: true          # master switch
logger: true          # print player channels / mod-related messages (great for collecting keywords)
useCustomKickCommand: true
command: "kick %player% %kickMessage%"   # placeholders: %player% %kickMessage%
notifyStaff: true
notificationPermission: fakemodblocker.notify
OptionDescription
languageLoads messages_<language>.yml. en and cn are bundled; see Messages & Locales
enablefalse disables mod detection
loggerVerbose console channel lists; useful for debugging, optional in production
useCustomKickCommandUse a custom kick command instead of the default kick
commandCustom kick command template
notifyStaffNotify staff with the notify permission

forbiddenList ​

These are plugin channel keywords, not mod display names.

yaml
forbiddenList:
  - "fabric"
  - "forge"
  - "xaeroworldmap"
  - "servux:tweaks"      # with ':' → exact channel match only
  - "servux:structures"

Matching rules:

  • No :: channel equals the keyword, or starts with keyword:
    • Example: xaeroworldmap matches xaeroworldmap:main
  • With :: exact channel name only
    • Example: servux:tweaks will not match servux:litematics

Common mistake

Putting display names like meteorclient or sodium in the list usually does nothing — unless that mod actually registers a matching channel.

Do this instead:

  1. Enable logger: true
  2. Join with the mod and copy the channel from console (if any)
  3. Add the real channel keyword to forbiddenList
  4. If the mod never opens a channel, use Sign Translation Detection

extra-detections ​

yaml
extra-detections:
  packet-events:
    enabled: true          # requires PacketEvents
  sign-translation:
    enabled: true
    skip-bedrock-via-floodgate: true
    avoid-open-screens: true      # wait for the player's screen to clear instead of overwriting it
    max-attempts: 4               # rounds to reopen when the client never answers
    evade-timeout-seconds: 300    # report once after this long with a screen still open
    evade-action: NOTICE          # NOTICE | KICK
    mods:
      Freecam:
        detect:
          key: "key.freecam.toggle"
        punishment:
          action: "KICK"   # NOTICE | KICK | BAN | IGNORE
          reason: "&c..."

escalation ​

Optional warn → kick → ban strike system, off by default.

yaml
escalation:
  enabled: false
  per-mod: true
  count-once-per-session: true
  reset-after: "30d"
  ladder:
    - violations: 1
      action: KICK      # WARN | KICK | BAN | COMMAND | IGNORE
      message: "&c&lWarning &7(strike %count%) &fRemove %mod% — next time is a ban."
    - violations: 2
      action: BAN
      duration: ""      # empty = permanent

Counts are stored per player in violations.yml and managed with /modblocker violations <player> and /modblocker clear <player> [mod].

Full reference: Escalation

See also: Channel Detection, Sign Translation Detection

discord ​

Optional Discord notifications via DiscordSRV, off by default.

yaml
discord:
  enabled: false
  channel: ""        # "" = DiscordSRV main channel | game-channel name | raw channel ID
  embed: true
  mention: ""
  events:
    channel-detection: true
    sign-detection: true
    escalation: true
    evade: true

Requires DiscordSRV; without it the section does nothing. Verify with /modblocker discord test. Message templates live in your language file under discord:.

Full reference: Discord Notifications

Released under the MIT License