Skip to content
Reece Williams edited this page Sep 2, 2026 · 2 revisions

Chat

Everything ServerTools does to your chat: formatting, cooldowns, emojis, per-player colors, tags, join messages, and custom death messages. Config lives under the Chat: section of config.yml (join MOTD is the one exception, it sits under Events:).

Dependencies at a glance

Most of this is standalone, pure Bukkit. Two features lean on other plugins:

Feature Hard requirement Soft (nice to have)
Tags Vault + a LuckPerms-style perms plugin -
ChatFormat - Vault (prefix/suffix), PlaceholderAPI (PAPI in messages)
JoinMOTD - PlaceholderAPI (for %server_online% etc.)

"Hard" means the feature bails out or does nothing useful without it. "Soft" means it still works, you just lose part of it.

ChatFormat

Rewrites the whole chat line. Runs on two priorities: a LOWEST pass that sets the base format, then a HIGHEST pass that fills in {prefix}/{suffix} and optionally runs PAPI on the message body.

  • Config path: Chat.ChatFormat
  • Default enabled: yes
  • Format tokens (in format): {prefix}, {name}, {suffix}, {message}
  • Where prefix/suffix come from: Vault's Chat service (getPlayerPrefix / getPlayerSuffix). No Vault provider registered means those tokens just stay empty. ServerTools listens for Vault service register/unregister events and re-grabs the provider live, so you don't have to reload.
Chat:
  ChatFormat:
    Enabled: true
    EnabledPAPIinMessages: true
    ChatColorPerm: chatcolor.codes
    PrefixOffset: 0
    format: '{prefix}{name}{suffix} &7» &f{message}'

Notable options:

  • ChatColorPerm (default chatcolor.codes): players with this perm (or OP) get their & color codes in the format/message translated. Without it, codes stay literal. Note the code also hard-checks the literal string chatcolor.codes in the HIGHEST pass, so renaming this perm only changes the LOWEST pass behavior, the HIGHEST colorize still keys off chatcolor.codes. Heads up if you rename it.
  • EnabledPAPIinMessages: run PlaceholderAPI on what the player typed. Only kicks in if PAPI is installed, the message has a % in it, AND the player has chat.placeholder.message. So it's off by default per-player unless you grant that perm.
  • PrefixOffset: trims N chars off the end of the Vault prefix (0 = no trim). Handy if your prefix has trailing padding you don't want.

ChatCooldown

Blocks a player from chatting again until the cooldown passes.

  • Config path: Chat.ChatCooldown
  • Default enabled: yes
  • Command: /chatcooldown (alias /cooldown)
  • Perms: chatcooldown.bypass (skip the cooldown), chatcooldown.admin (use the command)
Chat:
  ChatCooldown:
    Enabled: true
    BypassCooldown: chatcooldown.bypass
    CommandPermission: chatcooldown.admin
    SecondsCooldown: 5
    Message: '&6&l[!] &eYou must wait &6&n%timeleft%s&e before you may chat again.'

%timeleft% in the message is the seconds remaining. /chatcooldown set <n> changes the seconds live (and saves to config), /chatcooldown toggle flips it on/off at runtime.

ChatEmoji

Find-and-replace on chat messages. Type a shortcode, it swaps to a symbol.

  • Config path: Chat.ChatEmoji
  • Default enabled: yes
  • Permission: optional. permission: '' (the default) means everyone gets it. Set a perm node and only players with it get replacement.
Chat:
  ChatEmoji:
    Enabled: true
    permission: ''
    Emojis:
      <3: 
      :flip:: (╯°□°)╯︵ ┻━┻
      :serious:: (ಠ_ಠ)

Add whatever pairs you want under Emojis. Order is preserved (config order).

ChatColor

Per-player chat color via a GUI. Pick a color once, all your future messages get tinted. There's also a Rainbow option that randomizes a color per character.

  • Config path: Chat.ChatColor
  • Default enabled: yes
  • Command: /chatcolor (alias /color) opens the GUI
  • Perms: each swatch needs Chatcolor.<ColorName> (e.g. Chatcolor.Red, Chatcolor.Rainbow). Click a color you don't have the perm for and you get denied.

Colors in the GUI: White, Orange, Pink, Aqua, Yellow, Lime, Dark Gray, Gray, Cyan, Purple, Blue, Green, Red (plus Rainbow via the XP bottle).

Rainbow pulls from your configurable list:

Chat:
  ChatColor:
    Enabled: true
    RainbowColors:
    - '&f'
    - '&e'
    - '&6'
    - '&b'
    - '&2'
    - '&4'
    - '&7'

Choices persist to DATA/ChatColor.yml and reload on restart.

NameColor

Same idea as ChatColor but recolors the player's display name instead of the message.

  • Config path: Chat.NameColor
  • Default enabled: yes
  • Command: /namecolor opens the GUI
  • Perms: Namecolor.<ColorName> per swatch (e.g. Namecolor.Aqua)

Same color list as ChatColor, minus Rainbow. Note: NameColor choices aren't saved to disk, so they reset on restart.

Tags

GUI + command for player chat tags. Selecting a tag sets it as your Vault chat suffix (so it shows up via ChatFormat's {suffix}). Players can pick from predefined tags they have perms for, or set a custom text tag.

Dependencies (both hard):

  • Vault: the class is annotated @RequiresPlugin({"Vault"}) and grabs the Vault Chat provider on startup. No Vault, it returns early and does nothing.

  • LuckPerms (or compatible): the admin give path runs a console lp user ... permission set command (the configurable giveTagCmd) to grant the tag perm node. Out of the box this is LuckPerms syntax.

  • Config path: Chat.Tags

  • Default enabled: NO (Enabled: false)

  • Command: /tags (aliases /servertags, /ctag, /customtag)

  • Perms: ctag.use to set a custom tag (CustomTagPerm); tools.givetag for /tags give; tools.createtag for /tags create. Equipping a predefined tag needs Tags.<TagName>.

Chat:
  Tags:
    Enabled: false
    CustomTagPerm: ctag.use
    CustomMaxLength: 20
    CustomTagFormat: '&8&l<%tag%&8&l>'
    selected: '&e&l[!] &eYou have selected &r%tag% &eas your new tag!'
    removed: '&c&l[!] &cYou have removed your &4current&c tag!'
    giveTagCmd: lp user %name% permission set tags.%tag% true server=skyblock_emc

Subcommands: /tags (open GUI), /tags set <tag>, /tags clear, /tags list, /tags give <player> <tag> (admin), /tags create <name> <tag> (admin). Predefined tags live in Tags.yml (auto-seeded with a bunch of defaults like Boss, OG, Twitch, YouTube on first run). giveTagCmd has a server=skyblock_emc in the default, change or drop that for your setup.

CustomDeathMessages

Wraps (or hides) vanilla death messages with your own format.

  • Config path: Chat.CustomDeathMessages
  • Default enabled: yes
  • Command: /toggledeathmessages (alias /toggledeath) flips death messages on/off at runtime
Chat:
  CustomDeathMessages:
    Enabled: true
    message: '&7&o[-] %message%'

%message% is the original vanilla death message. If the feature's showing state is toggled off, the death message is set to empty (nothing shows).

JoinMOTD (ChatJoinMOTD)

Sends a message block to players when they join. Lives under Events:, not Chat:.

  • Config path: Events.ChatJoinMOTD
  • Default enabled: yes
Events:
  ChatJoinMOTD:
    Enabled: true
    MOTD:
    - '&8&l>&7&m----&r %SERVERNAME% &7&m----&8&l<'
    - '&2&l▎ &A&lSTORE &f%STORE%'
    - '&7&o(( Currently &A&o%server_online% &7&oplayer(s) are playing ))'

Two kinds of placeholders:

  • ServerTools plugin variables like %SERVERNAME%, %STORE%, %DISCORD%, %SERVER% etc. These come from the top-level PluginVariables: config section and always work.
  • PlaceholderAPI placeholders like %server_online%. These only resolve if PAPI is installed, otherwise they pass through as literal text.

Bonus: a line containing <center> gets centered (and %player% in it is replaced with the joining player's name).

Clone this wiki locally