Latest commit

History

215 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

🌈 ChatColor

ChatColor is an advanced Minecraft chat color plugin built for Paper 1.21+ (with full Folia support) that lets players personalize their chat messages with solid colors, multi-stop gradients, and character-cycling patterns — all through a sleek GUI or simple commands.


✨ Features

  • 🎨 24+ Solid Colors — From standard Minecraft colors to custom hex values like Hot Pink, Coral, Mint, and Lavender.
  • 🌅 12 Gradient Presets — Multi-stop gradients including Sunset, Ocean, Cosmic, Rose Gold, Lava, and more.
  • 🔥 6 Pattern Presets — Character-cycling color patterns like Rainbow, Fire, Ice, Galaxy, Toxic, and Cherry.
  • 🛠️ Custom Color Creation — Create your own custom colors with simple commands.
  • 🖥️ Interactive GUI — Full inventory-based color selector with a main menu and category pages.
  • ⌨️ Command Support — Set, reset, and manage colors entirely from the command line.
  • 🔒 Per-Entry Permissions — Grant or restrict individual colors, gradients, and patterns per player/group, registered with the server at runtime so LuckPerms wildcards actually work.
  • 🤝 Drop-In Compatibility — Colors are applied from a chat renderer that runs after every other listener, so EssentialsChat and friends can't strip them.
  • 🩺 Built-In Diagnostics/color debug traces the whole chat pipeline into the console.
  • 🧵 Folia Ready — Region-thread safe, with Folia-aware scheduling throughout.
  • 💾 Persistent Data — Player color selections are saved to disk and restored on rejoin.
  • 🔌 PlaceholderAPI Support — Expose player color data as placeholders for use in other plugins.
  • 🛠️ Developer API — Clean ChatColorAPI class for third-party plugin integration.
  • Hot Reload — Reload all configuration files at runtime without restarting.
  • 📊 Metrics — Anonymized usage statistics via bStats and FastStats.

📚 Documentation

PageCovers
InstallationRequirements, platform support, verifying the install
Commands & PermissionsEvery command, every permission node
ConfigurationAll config files, settings reference, troubleshooting
GUI CustomizationTitles, layouts, items, status lore
PlaceholdersPlaceholderAPI expansion and chat plugin integration
Chat CompatibilityHow coloring works, /color debug, Folia, known plugins
Developer APIChatColorAPI reference and thread safety

🕹️ Commands

CommandDescriptionPermission
/colorOpens the main color selector GUIchatcolor.use
/color gui [player]Opens the color selector for you or otherschatcolor.use*
/color reset [player]Removes active chat colorchatcolor.use*
/color set <type> <key> [player]Sets a color, gradient, or pattern by keychatcolor.use*
/color list [type]Lists colors, gradients, patterns, customchatcolor.use
/color create <name> <tag> <icon> [permission] [default]Create or update a custom colorchatcolor.create
/color delete <name>Delete a custom colorchatcolor.create
/color reloadReloads all plugin configurationchatcolor.reload
/color debug [off|pipeline|all]Trace the chat pipeline in the consolechatcolor.debug

*Using [player] argument (or running from console) requires chatcolor.admin.

Aliases:/chatcolor, /colors

Note for Console: Console usage requires specifying a target player for gui, reset, and set.


🔑 Permissions

PermissionDescriptionDefault
chatcolor.useAccess to the GUI and basic commandstrue
chatcolor.reloadReload the plugin configop
chatcolor.createCreate custom colorsop
chatcolor.adminUse admin command arguments & consoleop
chatcolor.debugTrace the chat pipeline in the consoleop
chatcolor.minimessageUse MiniMessage & legacy codes in chatfalse
chatcolor.gui.solidAccess to Solid Colors sectiontrue
chatcolor.gui.gradientAccess to Gradients sectiontrue
chatcolor.gui.patternAccess to Patterns sectiontrue
chatcolor.color.*Access to all solid colorsop
chatcolor.gradient.*Access to all gradientsop
chatcolor.pattern.*Access to all patternsop
chatcolor.custom.*Access to all custom colorsop
chatcolor.group.<name>Apply group-based default colorsfalse

Individual entries have their own permission nodes, for example:

  • chatcolor.color.red
  • chatcolor.gradient.sunset
  • chatcolor.pattern.rainbow
  • chatcolor.custom.pastel-pink

Every entry from colors.yml and patterns.yml is registered with the server as a real permission at runtime, so LuckPerms can tab-complete your custom nodes and the * wildcards genuinely expand over them. Entries with no permission: set are public.


⚙️ Configuration

Updating never means deleting a config. Drop in the new jar and restart: new settings and colours arrive, documentation is refreshed, and everything you edited — including your custom-colors — is kept. Keys you deleted stay deleted, a backup is written to backups/ before any change, and a restart that changes nothing rewrites nothing. Details, and the one first-run exception, in docs/advanced/config-updates.md.

config.yml

Controls general plugin settings and behavior.

settings:
apply-to-message: true # Apply color to chat messagesapply-to-name: false # Apply color to display namedefault-color: "NONE"# Default color for new playersgroup-defaults: # Group-based prioritized defaultsadmin: "<gradient:red:gold>"vip: "<aqua>"event-priority: "DEFAULT"# Options: HIGHEST, LOWEST, etc. or DEFAULT (auto-detect)chat-hook: "AUTO"# Chat event to hook: AUTO / MODERN / LEGACYmessage-mode: "AUTO"# How colour is applied: AUTO / RENDERER / DIRECTlate-bind: false # Only for placeholder-driven formats like LPCclean-console: true # Strip colors from console logsshow-standard-colors: true # Toggle visibility of standard colorsshow-standard-gradients: true # Toggle visibility of standard gradientsshow-standard-patterns: true # Toggle visibility of standard patterns

gui/gui.yml

Full control over GUI titles, items, layouts, and messages.

colors/colors.yml

Defines all solid colors and gradients.

colors:
red:
display-name: "Red"tag: "<red>"permission: "chatcolor.color.red"icon: "RED_WOOL"gradients:
sunset:
display-name: "Sunset"tag: "<gradient:#FF4500:#FF8C00:#FFD700>"permission: "chatcolor.gradient.sunset"icon: "ORANGE_WOOL"

colors/patterns.yml

Defines character-cycling color patterns.

patterns:
rainbow:
display-name: "Rainbow"permission: "chatcolor.pattern.rainbow"icon: "YELLOW_WOOL"colors:
- "<red>"
- "<gold>"
- "<yellow>"
- "<green>"
- "<aqua>"
- "<blue>"
- "<light_purple>"

🔌 PlaceholderAPI

When PlaceholderAPI is installed, the following placeholders are available. All placeholders return results in Legacy Hex format (§x§r§r§g§g§b§b) for universal compatibility.

PlaceholderAliasesDescriptionExample Output
%chatcolor_color%%chatcolor%, %chatcolor_prefix%, %chatcolor_tag%Returns the player's active legacy color code.§c or §x§f§f§5§5§f§f
%chatcolor_name%-Returns the player's name with their active color applied.§cBusyBee
%chatcolor_message%-Applies the player's color to their last sent message.§cHello world!
%chatcolor_apply_<text>%%chatcolor_apply:<text>%Wraps the provided <text> with the player's active color.§cWelcome!
%chatcolor_key%-Returns the internal identifier of the selection.rainbow
%chatcolor_type%-Returns the category (SOLID, GRADIENT, PATTERN).GRADIENT

Note: For modern plugins that support MiniMessage (like LPC or Tab), we recommend using these placeholders in their format strings and letting the plugin handle the conversion if necessary.


🛠️ Integration Tips

Most setups need no configuration at all. On Paper, ChatColor applies color from a chat renderer that runs after every other listener, so plugins that format or strip chat can't interfere with it. Where a formatter ignores renderers outright, ChatColor detects it and switches to colouring the message in front of that plugin instead — also automatically.

EssentialsChat

  • Works out of the box. Use the standard {MESSAGE} tag in your Essentials format.
  • EssentialsChat's renderer ignores the message it is handed, so ChatColor detects it and colours the message from in front of it instead of rendering. This is automatic — leave event-priority and message-mode on their defaults, and in particular do not force event-priority: "HIGHEST", which puts ChatColor behind the point where Essentials reads the message.
  • No essentials.chat.color / essentials.chat.rgb grants required — those only control whether players may type their own & codes.

LuckPermsChat (LPC)

LPC builds its format from placeholders and discards the rendered message, so it needs the placeholder route:

  1. In LPC config.yml, set your format to use %chatcolor_message% (e.g. {prefix}{name}&r: %chatcolor_message%).
  2. In ChatColor config.yml, set late-bind: true.

DiscordSRV

  • ChatColor automatically works with DiscordSRV.
  • For the best experience on Paper, ensure UseModernPaperChatEvent: true is set in DiscordSRV's config.

Something not working?

Run /color debug, say something, and read the console. It prints the full chat listener order, ChatColor's permission resolution for that player, and whether its renderer survived to the end of the event. See docs/advanced/chat-compatibility.md.

About

Plugin for Spigot that allows you to create patterns and colors for the chat

Resources

Stars

1 star

Watchers

0 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

215 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

🌈 ChatColor

ChatColor is an advanced Minecraft chat color plugin built for Paper 1.21+ (with full Folia support) that lets players personalize their chat messages with solid colors, multi-stop gradients, and character-cycling patterns — all through a sleek GUI or simple commands.


✨ Features

  • 🎨 24+ Solid Colors — From standard Minecraft colors to custom hex values like Hot Pink, Coral, Mint, and Lavender.
  • 🌅 12 Gradient Presets — Multi-stop gradients including Sunset, Ocean, Cosmic, Rose Gold, Lava, and more.
  • 🔥 6 Pattern Presets — Character-cycling color patterns like Rainbow, Fire, Ice, Galaxy, Toxic, and Cherry.
  • 🛠️ Custom Color Creation — Create your own custom colors with simple commands.
  • 🖥️ Interactive GUI — Full inventory-based color selector with a main menu and category pages.
  • ⌨️ Command Support — Set, reset, and manage colors entirely from the command line.
  • 🔒 Per-Entry Permissions — Grant or restrict individual colors, gradients, and patterns per player/group, registered with the server at runtime so LuckPerms wildcards actually work.
  • 🤝 Drop-In Compatibility — Colors are applied from a chat renderer that runs after every other listener, so EssentialsChat and friends can't strip them.
  • 🩺 Built-In Diagnostics/color debug traces the whole chat pipeline into the console.
  • 🧵 Folia Ready — Region-thread safe, with Folia-aware scheduling throughout.
  • 💾 Persistent Data — Player color selections are saved to disk and restored on rejoin.
  • 🔌 PlaceholderAPI Support — Expose player color data as placeholders for use in other plugins.
  • 🛠️ Developer API — Clean ChatColorAPI class for third-party plugin integration.
  • Hot Reload — Reload all configuration files at runtime without restarting.
  • 📊 Metrics — Anonymized usage statistics via bStats and FastStats.

📚 Documentation

PageCovers
InstallationRequirements, platform support, verifying the install
Commands & PermissionsEvery command, every permission node
ConfigurationAll config files, settings reference, troubleshooting
GUI CustomizationTitles, layouts, items, status lore
PlaceholdersPlaceholderAPI expansion and chat plugin integration
Chat CompatibilityHow coloring works, /color debug, Folia, known plugins
Developer APIChatColorAPI reference and thread safety

🕹️ Commands

CommandDescriptionPermission
/colorOpens the main color selector GUIchatcolor.use
/color gui [player]Opens the color selector for you or otherschatcolor.use*
/color reset [player]Removes active chat colorchatcolor.use*
/color set <type> <key> [player]Sets a color, gradient, or pattern by keychatcolor.use*
/color list [type]Lists colors, gradients, patterns, customchatcolor.use
/color create <name> <tag> <icon> [permission] [default]Create or update a custom colorchatcolor.create
/color delete <name>Delete a custom colorchatcolor.create
/color reloadReloads all plugin configurationchatcolor.reload
/color debug [off|pipeline|all]Trace the chat pipeline in the consolechatcolor.debug

*Using [player] argument (or running from console) requires chatcolor.admin.

Aliases:/chatcolor, /colors

Note for Console: Console usage requires specifying a target player for gui, reset, and set.


🔑 Permissions

PermissionDescriptionDefault
chatcolor.useAccess to the GUI and basic commandstrue
chatcolor.reloadReload the plugin configop
chatcolor.createCreate custom colorsop
chatcolor.adminUse admin command arguments & consoleop
chatcolor.debugTrace the chat pipeline in the consoleop
chatcolor.minimessageUse MiniMessage & legacy codes in chatfalse
chatcolor.gui.solidAccess to Solid Colors sectiontrue
chatcolor.gui.gradientAccess to Gradients sectiontrue
chatcolor.gui.patternAccess to Patterns sectiontrue
chatcolor.color.*Access to all solid colorsop
chatcolor.gradient.*Access to all gradientsop
chatcolor.pattern.*Access to all patternsop
chatcolor.custom.*Access to all custom colorsop
chatcolor.group.<name>Apply group-based default colorsfalse

Individual entries have their own permission nodes, for example:

  • chatcolor.color.red
  • chatcolor.gradient.sunset
  • chatcolor.pattern.rainbow
  • chatcolor.custom.pastel-pink

Every entry from colors.yml and patterns.yml is registered with the server as a real permission at runtime, so LuckPerms can tab-complete your custom nodes and the * wildcards genuinely expand over them. Entries with no permission: set are public.


⚙️ Configuration

Updating never means deleting a config. Drop in the new jar and restart: new settings and colours arrive, documentation is refreshed, and everything you edited — including your custom-colors — is kept. Keys you deleted stay deleted, a backup is written to backups/ before any change, and a restart that changes nothing rewrites nothing. Details, and the one first-run exception, in docs/advanced/config-updates.md.

config.yml

Controls general plugin settings and behavior.

settings:
apply-to-message: true # Apply color to chat messagesapply-to-name: false # Apply color to display namedefault-color: "NONE"# Default color for new playersgroup-defaults: # Group-based prioritized defaultsadmin: "<gradient:red:gold>"vip: "<aqua>"event-priority: "DEFAULT"# Options: HIGHEST, LOWEST, etc. or DEFAULT (auto-detect)chat-hook: "AUTO"# Chat event to hook: AUTO / MODERN / LEGACYmessage-mode: "AUTO"# How colour is applied: AUTO / RENDERER / DIRECTlate-bind: false # Only for placeholder-driven formats like LPCclean-console: true # Strip colors from console logsshow-standard-colors: true # Toggle visibility of standard colorsshow-standard-gradients: true # Toggle visibility of standard gradientsshow-standard-patterns: true # Toggle visibility of standard patterns

gui/gui.yml

Full control over GUI titles, items, layouts, and messages.

colors/colors.yml

Defines all solid colors and gradients.

colors:
red:
display-name: "Red"tag: "<red>"permission: "chatcolor.color.red"icon: "RED_WOOL"gradients:
sunset:
display-name: "Sunset"tag: "<gradient:#FF4500:#FF8C00:#FFD700>"permission: "chatcolor.gradient.sunset"icon: "ORANGE_WOOL"

colors/patterns.yml

Defines character-cycling color patterns.

patterns:
rainbow:
display-name: "Rainbow"permission: "chatcolor.pattern.rainbow"icon: "YELLOW_WOOL"colors:
- "<red>"
- "<gold>"
- "<yellow>"
- "<green>"
- "<aqua>"
- "<blue>"
- "<light_purple>"

🔌 PlaceholderAPI

When PlaceholderAPI is installed, the following placeholders are available. All placeholders return results in Legacy Hex format (§x§r§r§g§g§b§b) for universal compatibility.

PlaceholderAliasesDescriptionExample Output
%chatcolor_color%%chatcolor%, %chatcolor_prefix%, %chatcolor_tag%Returns the player's active legacy color code.§c or §x§f§f§5§5§f§f
%chatcolor_name%-Returns the player's name with their active color applied.§cBusyBee
%chatcolor_message%-Applies the player's color to their last sent message.§cHello world!
%chatcolor_apply_<text>%%chatcolor_apply:<text>%Wraps the provided <text> with the player's active color.§cWelcome!
%chatcolor_key%-Returns the internal identifier of the selection.rainbow
%chatcolor_type%-Returns the category (SOLID, GRADIENT, PATTERN).GRADIENT

Note: For modern plugins that support MiniMessage (like LPC or Tab), we recommend using these placeholders in their format strings and letting the plugin handle the conversion if necessary.


🛠️ Integration Tips

Most setups need no configuration at all. On Paper, ChatColor applies color from a chat renderer that runs after every other listener, so plugins that format or strip chat can't interfere with it. Where a formatter ignores renderers outright, ChatColor detects it and switches to colouring the message in front of that plugin instead — also automatically.

EssentialsChat

  • Works out of the box. Use the standard {MESSAGE} tag in your Essentials format.
  • EssentialsChat's renderer ignores the message it is handed, so ChatColor detects it and colours the message from in front of it instead of rendering. This is automatic — leave event-priority and message-mode on their defaults, and in particular do not force event-priority: "HIGHEST", which puts ChatColor behind the point where Essentials reads the message.
  • No essentials.chat.color / essentials.chat.rgb grants required — those only control whether players may type their own & codes.

LuckPermsChat (LPC)

LPC builds its format from placeholders and discards the rendered message, so it needs the placeholder route:

  1. In LPC config.yml, set your format to use %chatcolor_message% (e.g. {prefix}{name}&r: %chatcolor_message%).
  2. In ChatColor config.yml, set late-bind: true.

DiscordSRV

  • ChatColor automatically works with DiscordSRV.
  • For the best experience on Paper, ensure UseModernPaperChatEvent: true is set in DiscordSRV's config.

Something not working?

Run /color debug, say something, and read the console. It prints the full chat listener order, ChatColor's permission resolution for that player, and whether its renderer survived to the end of the event. See docs/advanced/chat-compatibility.md.

About

Plugin for Spigot that allows you to create patterns and colors for the chat

Resources

Stars

1 star

Watchers

0 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

215 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

🌈 ChatColor

ChatColor is an advanced Minecraft chat color plugin built for Paper 1.21+ (with full Folia support) that lets players personalize their chat messages with solid colors, multi-stop gradients, and character-cycling patterns — all through a sleek GUI or simple commands.


✨ Features

  • 🎨 24+ Solid Colors — From standard Minecraft colors to custom hex values like Hot Pink, Coral, Mint, and Lavender.
  • 🌅 12 Gradient Presets — Multi-stop gradients including Sunset, Ocean, Cosmic, Rose Gold, Lava, and more.
  • 🔥 6 Pattern Presets — Character-cycling color patterns like Rainbow, Fire, Ice, Galaxy, Toxic, and Cherry.
  • 🛠️ Custom Color Creation — Create your own custom colors with simple commands.
  • 🖥️ Interactive GUI — Full inventory-based color selector with a main menu and category pages.
  • ⌨️ Command Support — Set, reset, and manage colors entirely from the command line.
  • 🔒 Per-Entry Permissions — Grant or restrict individual colors, gradients, and patterns per player/group, registered with the server at runtime so LuckPerms wildcards actually work.
  • 🤝 Drop-In Compatibility — Colors are applied from a chat renderer that runs after every other listener, so EssentialsChat and friends can't strip them.
  • 🩺 Built-In Diagnostics/color debug traces the whole chat pipeline into the console.
  • 🧵 Folia Ready — Region-thread safe, with Folia-aware scheduling throughout.
  • 💾 Persistent Data — Player color selections are saved to disk and restored on rejoin.
  • 🔌 PlaceholderAPI Support — Expose player color data as placeholders for use in other plugins.
  • 🛠️ Developer API — Clean ChatColorAPI class for third-party plugin integration.
  • Hot Reload — Reload all configuration files at runtime without restarting.
  • 📊 Metrics — Anonymized usage statistics via bStats and FastStats.

📚 Documentation

PageCovers
InstallationRequirements, platform support, verifying the install
Commands & PermissionsEvery command, every permission node
ConfigurationAll config files, settings reference, troubleshooting
GUI CustomizationTitles, layouts, items, status lore
PlaceholdersPlaceholderAPI expansion and chat plugin integration
Chat CompatibilityHow coloring works, /color debug, Folia, known plugins
Developer APIChatColorAPI reference and thread safety

🕹️ Commands

CommandDescriptionPermission
/colorOpens the main color selector GUIchatcolor.use
/color gui [player]Opens the color selector for you or otherschatcolor.use*
/color reset [player]Removes active chat colorchatcolor.use*
/color set <type> <key> [player]Sets a color, gradient, or pattern by keychatcolor.use*
/color list [type]Lists colors, gradients, patterns, customchatcolor.use
/color create <name> <tag> <icon> [permission] [default]Create or update a custom colorchatcolor.create
/color delete <name>Delete a custom colorchatcolor.create
/color reloadReloads all plugin configurationchatcolor.reload
/color debug [off|pipeline|all]Trace the chat pipeline in the consolechatcolor.debug

*Using [player] argument (or running from console) requires chatcolor.admin.

Aliases:/chatcolor, /colors

Note for Console: Console usage requires specifying a target player for gui, reset, and set.


🔑 Permissions

PermissionDescriptionDefault
chatcolor.useAccess to the GUI and basic commandstrue
chatcolor.reloadReload the plugin configop
chatcolor.createCreate custom colorsop
chatcolor.adminUse admin command arguments & consoleop
chatcolor.debugTrace the chat pipeline in the consoleop
chatcolor.minimessageUse MiniMessage & legacy codes in chatfalse
chatcolor.gui.solidAccess to Solid Colors sectiontrue
chatcolor.gui.gradientAccess to Gradients sectiontrue
chatcolor.gui.patternAccess to Patterns sectiontrue
chatcolor.color.*Access to all solid colorsop
chatcolor.gradient.*Access to all gradientsop
chatcolor.pattern.*Access to all patternsop
chatcolor.custom.*Access to all custom colorsop
chatcolor.group.<name>Apply group-based default colorsfalse

Individual entries have their own permission nodes, for example:

  • chatcolor.color.red
  • chatcolor.gradient.sunset
  • chatcolor.pattern.rainbow
  • chatcolor.custom.pastel-pink

Every entry from colors.yml and patterns.yml is registered with the server as a real permission at runtime, so LuckPerms can tab-complete your custom nodes and the * wildcards genuinely expand over them. Entries with no permission: set are public.


⚙️ Configuration

Updating never means deleting a config. Drop in the new jar and restart: new settings and colours arrive, documentation is refreshed, and everything you edited — including your custom-colors — is kept. Keys you deleted stay deleted, a backup is written to backups/ before any change, and a restart that changes nothing rewrites nothing. Details, and the one first-run exception, in docs/advanced/config-updates.md.

config.yml

Controls general plugin settings and behavior.

settings:
apply-to-message: true # Apply color to chat messagesapply-to-name: false # Apply color to display namedefault-color: "NONE"# Default color for new playersgroup-defaults: # Group-based prioritized defaultsadmin: "<gradient:red:gold>"vip: "<aqua>"event-priority: "DEFAULT"# Options: HIGHEST, LOWEST, etc. or DEFAULT (auto-detect)chat-hook: "AUTO"# Chat event to hook: AUTO / MODERN / LEGACYmessage-mode: "AUTO"# How colour is applied: AUTO / RENDERER / DIRECTlate-bind: false # Only for placeholder-driven formats like LPCclean-console: true # Strip colors from console logsshow-standard-colors: true # Toggle visibility of standard colorsshow-standard-gradients: true # Toggle visibility of standard gradientsshow-standard-patterns: true # Toggle visibility of standard patterns

gui/gui.yml

Full control over GUI titles, items, layouts, and messages.

colors/colors.yml

Defines all solid colors and gradients.

colors:
red:
display-name: "Red"tag: "<red>"permission: "chatcolor.color.red"icon: "RED_WOOL"gradients:
sunset:
display-name: "Sunset"tag: "<gradient:#FF4500:#FF8C00:#FFD700>"permission: "chatcolor.gradient.sunset"icon: "ORANGE_WOOL"

colors/patterns.yml

Defines character-cycling color patterns.

patterns:
rainbow:
display-name: "Rainbow"permission: "chatcolor.pattern.rainbow"icon: "YELLOW_WOOL"colors:
- "<red>"
- "<gold>"
- "<yellow>"
- "<green>"
- "<aqua>"
- "<blue>"
- "<light_purple>"

🔌 PlaceholderAPI

When PlaceholderAPI is installed, the following placeholders are available. All placeholders return results in Legacy Hex format (§x§r§r§g§g§b§b) for universal compatibility.

PlaceholderAliasesDescriptionExample Output
%chatcolor_color%%chatcolor%, %chatcolor_prefix%, %chatcolor_tag%Returns the player's active legacy color code.§c or §x§f§f§5§5§f§f
%chatcolor_name%-Returns the player's name with their active color applied.§cBusyBee
%chatcolor_message%-Applies the player's color to their last sent message.§cHello world!
%chatcolor_apply_<text>%%chatcolor_apply:<text>%Wraps the provided <text> with the player's active color.§cWelcome!
%chatcolor_key%-Returns the internal identifier of the selection.rainbow
%chatcolor_type%-Returns the category (SOLID, GRADIENT, PATTERN).GRADIENT

Note: For modern plugins that support MiniMessage (like LPC or Tab), we recommend using these placeholders in their format strings and letting the plugin handle the conversion if necessary.


🛠️ Integration Tips

Most setups need no configuration at all. On Paper, ChatColor applies color from a chat renderer that runs after every other listener, so plugins that format or strip chat can't interfere with it. Where a formatter ignores renderers outright, ChatColor detects it and switches to colouring the message in front of that plugin instead — also automatically.

EssentialsChat

  • Works out of the box. Use the standard {MESSAGE} tag in your Essentials format.
  • EssentialsChat's renderer ignores the message it is handed, so ChatColor detects it and colours the message from in front of it instead of rendering. This is automatic — leave event-priority and message-mode on their defaults, and in particular do not force event-priority: "HIGHEST", which puts ChatColor behind the point where Essentials reads the message.
  • No essentials.chat.color / essentials.chat.rgb grants required — those only control whether players may type their own & codes.

LuckPermsChat (LPC)

LPC builds its format from placeholders and discards the rendered message, so it needs the placeholder route:

  1. In LPC config.yml, set your format to use %chatcolor_message% (e.g. {prefix}{name}&r: %chatcolor_message%).
  2. In ChatColor config.yml, set late-bind: true.

DiscordSRV

  • ChatColor automatically works with DiscordSRV.
  • For the best experience on Paper, ensure UseModernPaperChatEvent: true is set in DiscordSRV's config.

Something not working?

Run /color debug, say something, and read the console. It prints the full chat listener order, ChatColor's permission resolution for that player, and whether its renderer survived to the end of the event. See docs/advanced/chat-compatibility.md.

About

Plugin for Spigot that allows you to create patterns and colors for the chat

Resources

Stars

1 star

Watchers

0 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

215 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

🌈 ChatColor

ChatColor is an advanced Minecraft chat color plugin built for Paper 1.21+ (with full Folia support) that lets players personalize their chat messages with solid colors, multi-stop gradients, and character-cycling patterns — all through a sleek GUI or simple commands.


✨ Features

  • 🎨 24+ Solid Colors — From standard Minecraft colors to custom hex values like Hot Pink, Coral, Mint, and Lavender.
  • 🌅 12 Gradient Presets — Multi-stop gradients including Sunset, Ocean, Cosmic, Rose Gold, Lava, and more.
  • 🔥 6 Pattern Presets — Character-cycling color patterns like Rainbow, Fire, Ice, Galaxy, Toxic, and Cherry.
  • 🛠️ Custom Color Creation — Create your own custom colors with simple commands.
  • 🖥️ Interactive GUI — Full inventory-based color selector with a main menu and category pages.
  • ⌨️ Command Support — Set, reset, and manage colors entirely from the command line.
  • 🔒 Per-Entry Permissions — Grant or restrict individual colors, gradients, and patterns per player/group, registered with the server at runtime so LuckPerms wildcards actually work.
  • 🤝 Drop-In Compatibility — Colors are applied from a chat renderer that runs after every other listener, so EssentialsChat and friends can't strip them.
  • 🩺 Built-In Diagnostics/color debug traces the whole chat pipeline into the console.
  • 🧵 Folia Ready — Region-thread safe, with Folia-aware scheduling throughout.
  • 💾 Persistent Data — Player color selections are saved to disk and restored on rejoin.
  • 🔌 PlaceholderAPI Support — Expose player color data as placeholders for use in other plugins.
  • 🛠️ Developer API — Clean ChatColorAPI class for third-party plugin integration.
  • Hot Reload — Reload all configuration files at runtime without restarting.
  • 📊 Metrics — Anonymized usage statistics via bStats and FastStats.

📚 Documentation

PageCovers
InstallationRequirements, platform support, verifying the install
Commands & PermissionsEvery command, every permission node
ConfigurationAll config files, settings reference, troubleshooting
GUI CustomizationTitles, layouts, items, status lore
PlaceholdersPlaceholderAPI expansion and chat plugin integration
Chat CompatibilityHow coloring works, /color debug, Folia, known plugins
Developer APIChatColorAPI reference and thread safety

🕹️ Commands

CommandDescriptionPermission
/colorOpens the main color selector GUIchatcolor.use
/color gui [player]Opens the color selector for you or otherschatcolor.use*
/color reset [player]Removes active chat colorchatcolor.use*
/color set <type> <key> [player]Sets a color, gradient, or pattern by keychatcolor.use*
/color list [type]Lists colors, gradients, patterns, customchatcolor.use
/color create <name> <tag> <icon> [permission] [default]Create or update a custom colorchatcolor.create
/color delete <name>Delete a custom colorchatcolor.create
/color reloadReloads all plugin configurationchatcolor.reload
/color debug [off|pipeline|all]Trace the chat pipeline in the consolechatcolor.debug

*Using [player] argument (or running from console) requires chatcolor.admin.

Aliases:/chatcolor, /colors

Note for Console: Console usage requires specifying a target player for gui, reset, and set.


🔑 Permissions

PermissionDescriptionDefault
chatcolor.useAccess to the GUI and basic commandstrue
chatcolor.reloadReload the plugin configop
chatcolor.createCreate custom colorsop
chatcolor.adminUse admin command arguments & consoleop
chatcolor.debugTrace the chat pipeline in the consoleop
chatcolor.minimessageUse MiniMessage & legacy codes in chatfalse
chatcolor.gui.solidAccess to Solid Colors sectiontrue
chatcolor.gui.gradientAccess to Gradients sectiontrue
chatcolor.gui.patternAccess to Patterns sectiontrue
chatcolor.color.*Access to all solid colorsop
chatcolor.gradient.*Access to all gradientsop
chatcolor.pattern.*Access to all patternsop
chatcolor.custom.*Access to all custom colorsop
chatcolor.group.<name>Apply group-based default colorsfalse

Individual entries have their own permission nodes, for example:

  • chatcolor.color.red
  • chatcolor.gradient.sunset
  • chatcolor.pattern.rainbow
  • chatcolor.custom.pastel-pink

Every entry from colors.yml and patterns.yml is registered with the server as a real permission at runtime, so LuckPerms can tab-complete your custom nodes and the * wildcards genuinely expand over them. Entries with no permission: set are public.


⚙️ Configuration

Updating never means deleting a config. Drop in the new jar and restart: new settings and colours arrive, documentation is refreshed, and everything you edited — including your custom-colors — is kept. Keys you deleted stay deleted, a backup is written to backups/ before any change, and a restart that changes nothing rewrites nothing. Details, and the one first-run exception, in docs/advanced/config-updates.md.

config.yml

Controls general plugin settings and behavior.

settings:
apply-to-message: true # Apply color to chat messagesapply-to-name: false # Apply color to display namedefault-color: "NONE"# Default color for new playersgroup-defaults: # Group-based prioritized defaultsadmin: "<gradient:red:gold>"vip: "<aqua>"event-priority: "DEFAULT"# Options: HIGHEST, LOWEST, etc. or DEFAULT (auto-detect)chat-hook: "AUTO"# Chat event to hook: AUTO / MODERN / LEGACYmessage-mode: "AUTO"# How colour is applied: AUTO / RENDERER / DIRECTlate-bind: false # Only for placeholder-driven formats like LPCclean-console: true # Strip colors from console logsshow-standard-colors: true # Toggle visibility of standard colorsshow-standard-gradients: true # Toggle visibility of standard gradientsshow-standard-patterns: true # Toggle visibility of standard patterns

gui/gui.yml

Full control over GUI titles, items, layouts, and messages.

colors/colors.yml

Defines all solid colors and gradients.

colors:
red:
display-name: "Red"tag: "<red>"permission: "chatcolor.color.red"icon: "RED_WOOL"gradients:
sunset:
display-name: "Sunset"tag: "<gradient:#FF4500:#FF8C00:#FFD700>"permission: "chatcolor.gradient.sunset"icon: "ORANGE_WOOL"

colors/patterns.yml

Defines character-cycling color patterns.

patterns:
rainbow:
display-name: "Rainbow"permission: "chatcolor.pattern.rainbow"icon: "YELLOW_WOOL"colors:
- "<red>"
- "<gold>"
- "<yellow>"
- "<green>"
- "<aqua>"
- "<blue>"
- "<light_purple>"

🔌 PlaceholderAPI

When PlaceholderAPI is installed, the following placeholders are available. All placeholders return results in Legacy Hex format (§x§r§r§g§g§b§b) for universal compatibility.

PlaceholderAliasesDescriptionExample Output
%chatcolor_color%%chatcolor%, %chatcolor_prefix%, %chatcolor_tag%Returns the player's active legacy color code.§c or §x§f§f§5§5§f§f
%chatcolor_name%-Returns the player's name with their active color applied.§cBusyBee
%chatcolor_message%-Applies the player's color to their last sent message.§cHello world!
%chatcolor_apply_<text>%%chatcolor_apply:<text>%Wraps the provided <text> with the player's active color.§cWelcome!
%chatcolor_key%-Returns the internal identifier of the selection.rainbow
%chatcolor_type%-Returns the category (SOLID, GRADIENT, PATTERN).GRADIENT

Note: For modern plugins that support MiniMessage (like LPC or Tab), we recommend using these placeholders in their format strings and letting the plugin handle the conversion if necessary.


🛠️ Integration Tips

Most setups need no configuration at all. On Paper, ChatColor applies color from a chat renderer that runs after every other listener, so plugins that format or strip chat can't interfere with it. Where a formatter ignores renderers outright, ChatColor detects it and switches to colouring the message in front of that plugin instead — also automatically.

EssentialsChat

  • Works out of the box. Use the standard {MESSAGE} tag in your Essentials format.
  • EssentialsChat's renderer ignores the message it is handed, so ChatColor detects it and colours the message from in front of it instead of rendering. This is automatic — leave event-priority and message-mode on their defaults, and in particular do not force event-priority: "HIGHEST", which puts ChatColor behind the point where Essentials reads the message.
  • No essentials.chat.color / essentials.chat.rgb grants required — those only control whether players may type their own & codes.

LuckPermsChat (LPC)

LPC builds its format from placeholders and discards the rendered message, so it needs the placeholder route:

  1. In LPC config.yml, set your format to use %chatcolor_message% (e.g. {prefix}{name}&r: %chatcolor_message%).
  2. In ChatColor config.yml, set late-bind: true.

DiscordSRV

  • ChatColor automatically works with DiscordSRV.
  • For the best experience on Paper, ensure UseModernPaperChatEvent: true is set in DiscordSRV's config.

Something not working?

Run /color debug, say something, and read the console. It prints the full chat listener order, ChatColor's permission resolution for that player, and whether its renderer survived to the end of the event. See docs/advanced/chat-compatibility.md.

About

Plugin for Spigot that allows you to create patterns and colors for the chat

Resources

Stars

1 star

Watchers

0 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

215 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

🌈 ChatColor

ChatColor is an advanced Minecraft chat color plugin built for Paper 1.21+ (with full Folia support) that lets players personalize their chat messages with solid colors, multi-stop gradients, and character-cycling patterns — all through a sleek GUI or simple commands.


✨ Features

  • 🎨 24+ Solid Colors — From standard Minecraft colors to custom hex values like Hot Pink, Coral, Mint, and Lavender.
  • 🌅 12 Gradient Presets — Multi-stop gradients including Sunset, Ocean, Cosmic, Rose Gold, Lava, and more.
  • 🔥 6 Pattern Presets — Character-cycling color patterns like Rainbow, Fire, Ice, Galaxy, Toxic, and Cherry.
  • 🛠️ Custom Color Creation — Create your own custom colors with simple commands.
  • 🖥️ Interactive GUI — Full inventory-based color selector with a main menu and category pages.
  • ⌨️ Command Support — Set, reset, and manage colors entirely from the command line.
  • 🔒 Per-Entry Permissions — Grant or restrict individual colors, gradients, and patterns per player/group, registered with the server at runtime so LuckPerms wildcards actually work.
  • 🤝 Drop-In Compatibility — Colors are applied from a chat renderer that runs after every other listener, so EssentialsChat and friends can't strip them.
  • 🩺 Built-In Diagnostics/color debug traces the whole chat pipeline into the console.
  • 🧵 Folia Ready — Region-thread safe, with Folia-aware scheduling throughout.
  • 💾 Persistent Data — Player color selections are saved to disk and restored on rejoin.
  • 🔌 PlaceholderAPI Support — Expose player color data as placeholders for use in other plugins.
  • 🛠️ Developer API — Clean ChatColorAPI class for third-party plugin integration.
  • Hot Reload — Reload all configuration files at runtime without restarting.
  • 📊 Metrics — Anonymized usage statistics via bStats and FastStats.

📚 Documentation

PageCovers
InstallationRequirements, platform support, verifying the install
Commands & PermissionsEvery command, every permission node
ConfigurationAll config files, settings reference, troubleshooting
GUI CustomizationTitles, layouts, items, status lore
PlaceholdersPlaceholderAPI expansion and chat plugin integration
Chat CompatibilityHow coloring works, /color debug, Folia, known plugins
Developer APIChatColorAPI reference and thread safety

🕹️ Commands

CommandDescriptionPermission
/colorOpens the main color selector GUIchatcolor.use
/color gui [player]Opens the color selector for you or otherschatcolor.use*
/color reset [player]Removes active chat colorchatcolor.use*
/color set <type> <key> [player]Sets a color, gradient, or pattern by keychatcolor.use*
/color list [type]Lists colors, gradients, patterns, customchatcolor.use
/color create <name> <tag> <icon> [permission] [default]Create or update a custom colorchatcolor.create
/color delete <name>Delete a custom colorchatcolor.create
/color reloadReloads all plugin configurationchatcolor.reload
/color debug [off|pipeline|all]Trace the chat pipeline in the consolechatcolor.debug

*Using [player] argument (or running from console) requires chatcolor.admin.

Aliases:/chatcolor, /colors

Note for Console: Console usage requires specifying a target player for gui, reset, and set.


🔑 Permissions

PermissionDescriptionDefault
chatcolor.useAccess to the GUI and basic commandstrue
chatcolor.reloadReload the plugin configop
chatcolor.createCreate custom colorsop
chatcolor.adminUse admin command arguments & consoleop
chatcolor.debugTrace the chat pipeline in the consoleop
chatcolor.minimessageUse MiniMessage & legacy codes in chatfalse
chatcolor.gui.solidAccess to Solid Colors sectiontrue
chatcolor.gui.gradientAccess to Gradients sectiontrue
chatcolor.gui.patternAccess to Patterns sectiontrue
chatcolor.color.*Access to all solid colorsop
chatcolor.gradient.*Access to all gradientsop
chatcolor.pattern.*Access to all patternsop
chatcolor.custom.*Access to all custom colorsop
chatcolor.group.<name>Apply group-based default colorsfalse

Individual entries have their own permission nodes, for example:

  • chatcolor.color.red
  • chatcolor.gradient.sunset
  • chatcolor.pattern.rainbow
  • chatcolor.custom.pastel-pink

Every entry from colors.yml and patterns.yml is registered with the server as a real permission at runtime, so LuckPerms can tab-complete your custom nodes and the * wildcards genuinely expand over them. Entries with no permission: set are public.


⚙️ Configuration

Updating never means deleting a config. Drop in the new jar and restart: new settings and colours arrive, documentation is refreshed, and everything you edited — including your custom-colors — is kept. Keys you deleted stay deleted, a backup is written to backups/ before any change, and a restart that changes nothing rewrites nothing. Details, and the one first-run exception, in docs/advanced/config-updates.md.

config.yml

Controls general plugin settings and behavior.

settings:
apply-to-message: true # Apply color to chat messagesapply-to-name: false # Apply color to display namedefault-color: "NONE"# Default color for new playersgroup-defaults: # Group-based prioritized defaultsadmin: "<gradient:red:gold>"vip: "<aqua>"event-priority: "DEFAULT"# Options: HIGHEST, LOWEST, etc. or DEFAULT (auto-detect)chat-hook: "AUTO"# Chat event to hook: AUTO / MODERN / LEGACYmessage-mode: "AUTO"# How colour is applied: AUTO / RENDERER / DIRECTlate-bind: false # Only for placeholder-driven formats like LPCclean-console: true # Strip colors from console logsshow-standard-colors: true # Toggle visibility of standard colorsshow-standard-gradients: true # Toggle visibility of standard gradientsshow-standard-patterns: true # Toggle visibility of standard patterns

gui/gui.yml

Full control over GUI titles, items, layouts, and messages.

colors/colors.yml

Defines all solid colors and gradients.

colors:
red:
display-name: "Red"tag: "<red>"permission: "chatcolor.color.red"icon: "RED_WOOL"gradients:
sunset:
display-name: "Sunset"tag: "<gradient:#FF4500:#FF8C00:#FFD700>"permission: "chatcolor.gradient.sunset"icon: "ORANGE_WOOL"

colors/patterns.yml

Defines character-cycling color patterns.

patterns:
rainbow:
display-name: "Rainbow"permission: "chatcolor.pattern.rainbow"icon: "YELLOW_WOOL"colors:
- "<red>"
- "<gold>"
- "<yellow>"
- "<green>"
- "<aqua>"
- "<blue>"
- "<light_purple>"

🔌 PlaceholderAPI

When PlaceholderAPI is installed, the following placeholders are available. All placeholders return results in Legacy Hex format (§x§r§r§g§g§b§b) for universal compatibility.

PlaceholderAliasesDescriptionExample Output
%chatcolor_color%%chatcolor%, %chatcolor_prefix%, %chatcolor_tag%Returns the player's active legacy color code.§c or §x§f§f§5§5§f§f
%chatcolor_name%-Returns the player's name with their active color applied.§cBusyBee
%chatcolor_message%-Applies the player's color to their last sent message.§cHello world!
%chatcolor_apply_<text>%%chatcolor_apply:<text>%Wraps the provided <text> with the player's active color.§cWelcome!
%chatcolor_key%-Returns the internal identifier of the selection.rainbow
%chatcolor_type%-Returns the category (SOLID, GRADIENT, PATTERN).GRADIENT

Note: For modern plugins that support MiniMessage (like LPC or Tab), we recommend using these placeholders in their format strings and letting the plugin handle the conversion if necessary.


🛠️ Integration Tips

Most setups need no configuration at all. On Paper, ChatColor applies color from a chat renderer that runs after every other listener, so plugins that format or strip chat can't interfere with it. Where a formatter ignores renderers outright, ChatColor detects it and switches to colouring the message in front of that plugin instead — also automatically.

EssentialsChat

  • Works out of the box. Use the standard {MESSAGE} tag in your Essentials format.
  • EssentialsChat's renderer ignores the message it is handed, so ChatColor detects it and colours the message from in front of it instead of rendering. This is automatic — leave event-priority and message-mode on their defaults, and in particular do not force event-priority: "HIGHEST", which puts ChatColor behind the point where Essentials reads the message.
  • No essentials.chat.color / essentials.chat.rgb grants required — those only control whether players may type their own & codes.

LuckPermsChat (LPC)

LPC builds its format from placeholders and discards the rendered message, so it needs the placeholder route:

  1. In LPC config.yml, set your format to use %chatcolor_message% (e.g. {prefix}{name}&r: %chatcolor_message%).
  2. In ChatColor config.yml, set late-bind: true.

DiscordSRV

  • ChatColor automatically works with DiscordSRV.
  • For the best experience on Paper, ensure UseModernPaperChatEvent: true is set in DiscordSRV's config.

Something not working?

Run /color debug, say something, and read the console. It prints the full chat listener order, ChatColor's permission resolution for that player, and whether its renderer survived to the end of the event. See docs/advanced/chat-compatibility.md.

About

Plugin for Spigot that allows you to create patterns and colors for the chat

Resources

Stars

1 star

Watchers

0 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

215 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

🌈 ChatColor

ChatColor is an advanced Minecraft chat color plugin built for Paper 1.21+ (with full Folia support) that lets players personalize their chat messages with solid colors, multi-stop gradients, and character-cycling patterns — all through a sleek GUI or simple commands.


✨ Features

  • 🎨 24+ Solid Colors — From standard Minecraft colors to custom hex values like Hot Pink, Coral, Mint, and Lavender.
  • 🌅 12 Gradient Presets — Multi-stop gradients including Sunset, Ocean, Cosmic, Rose Gold, Lava, and more.
  • 🔥 6 Pattern Presets — Character-cycling color patterns like Rainbow, Fire, Ice, Galaxy, Toxic, and Cherry.
  • 🛠️ Custom Color Creation — Create your own custom colors with simple commands.
  • 🖥️ Interactive GUI — Full inventory-based color selector with a main menu and category pages.
  • ⌨️ Command Support — Set, reset, and manage colors entirely from the command line.
  • 🔒 Per-Entry Permissions — Grant or restrict individual colors, gradients, and patterns per player/group, registered with the server at runtime so LuckPerms wildcards actually work.
  • 🤝 Drop-In Compatibility — Colors are applied from a chat renderer that runs after every other listener, so EssentialsChat and friends can't strip them.
  • 🩺 Built-In Diagnostics/color debug traces the whole chat pipeline into the console.
  • 🧵 Folia Ready — Region-thread safe, with Folia-aware scheduling throughout.
  • 💾 Persistent Data — Player color selections are saved to disk and restored on rejoin.
  • 🔌 PlaceholderAPI Support — Expose player color data as placeholders for use in other plugins.
  • 🛠️ Developer API — Clean ChatColorAPI class for third-party plugin integration.
  • Hot Reload — Reload all configuration files at runtime without restarting.
  • 📊 Metrics — Anonymized usage statistics via bStats and FastStats.

📚 Documentation

PageCovers
InstallationRequirements, platform support, verifying the install
Commands & PermissionsEvery command, every permission node
ConfigurationAll config files, settings reference, troubleshooting
GUI CustomizationTitles, layouts, items, status lore
PlaceholdersPlaceholderAPI expansion and chat plugin integration
Chat CompatibilityHow coloring works, /color debug, Folia, known plugins
Developer APIChatColorAPI reference and thread safety

🕹️ Commands

CommandDescriptionPermission
/colorOpens the main color selector GUIchatcolor.use
/color gui [player]Opens the color selector for you or otherschatcolor.use*
/color reset [player]Removes active chat colorchatcolor.use*
/color set <type> <key> [player]Sets a color, gradient, or pattern by keychatcolor.use*
/color list [type]Lists colors, gradients, patterns, customchatcolor.use
/color create <name> <tag> <icon> [permission] [default]Create or update a custom colorchatcolor.create
/color delete <name>Delete a custom colorchatcolor.create
/color reloadReloads all plugin configurationchatcolor.reload
/color debug [off|pipeline|all]Trace the chat pipeline in the consolechatcolor.debug

*Using [player] argument (or running from console) requires chatcolor.admin.

Aliases:/chatcolor, /colors

Note for Console: Console usage requires specifying a target player for gui, reset, and set.


🔑 Permissions

PermissionDescriptionDefault
chatcolor.useAccess to the GUI and basic commandstrue
chatcolor.reloadReload the plugin configop
chatcolor.createCreate custom colorsop
chatcolor.adminUse admin command arguments & consoleop
chatcolor.debugTrace the chat pipeline in the consoleop
chatcolor.minimessageUse MiniMessage & legacy codes in chatfalse
chatcolor.gui.solidAccess to Solid Colors sectiontrue
chatcolor.gui.gradientAccess to Gradients sectiontrue
chatcolor.gui.patternAccess to Patterns sectiontrue
chatcolor.color.*Access to all solid colorsop
chatcolor.gradient.*Access to all gradientsop
chatcolor.pattern.*Access to all patternsop
chatcolor.custom.*Access to all custom colorsop
chatcolor.group.<name>Apply group-based default colorsfalse

Individual entries have their own permission nodes, for example:

  • chatcolor.color.red
  • chatcolor.gradient.sunset
  • chatcolor.pattern.rainbow
  • chatcolor.custom.pastel-pink

Every entry from colors.yml and patterns.yml is registered with the server as a real permission at runtime, so LuckPerms can tab-complete your custom nodes and the * wildcards genuinely expand over them. Entries with no permission: set are public.


⚙️ Configuration

Updating never means deleting a config. Drop in the new jar and restart: new settings and colours arrive, documentation is refreshed, and everything you edited — including your custom-colors — is kept. Keys you deleted stay deleted, a backup is written to backups/ before any change, and a restart that changes nothing rewrites nothing. Details, and the one first-run exception, in docs/advanced/config-updates.md.

config.yml

Controls general plugin settings and behavior.

settings:
apply-to-message: true # Apply color to chat messagesapply-to-name: false # Apply color to display namedefault-color: "NONE"# Default color for new playersgroup-defaults: # Group-based prioritized defaultsadmin: "<gradient:red:gold>"vip: "<aqua>"event-priority: "DEFAULT"# Options: HIGHEST, LOWEST, etc. or DEFAULT (auto-detect)chat-hook: "AUTO"# Chat event to hook: AUTO / MODERN / LEGACYmessage-mode: "AUTO"# How colour is applied: AUTO / RENDERER / DIRECTlate-bind: false # Only for placeholder-driven formats like LPCclean-console: true # Strip colors from console logsshow-standard-colors: true # Toggle visibility of standard colorsshow-standard-gradients: true # Toggle visibility of standard gradientsshow-standard-patterns: true # Toggle visibility of standard patterns

gui/gui.yml

Full control over GUI titles, items, layouts, and messages.

colors/colors.yml

Defines all solid colors and gradients.

colors:
red:
display-name: "Red"tag: "<red>"permission: "chatcolor.color.red"icon: "RED_WOOL"gradients:
sunset:
display-name: "Sunset"tag: "<gradient:#FF4500:#FF8C00:#FFD700>"permission: "chatcolor.gradient.sunset"icon: "ORANGE_WOOL"

colors/patterns.yml

Defines character-cycling color patterns.

patterns:
rainbow:
display-name: "Rainbow"permission: "chatcolor.pattern.rainbow"icon: "YELLOW_WOOL"colors:
- "<red>"
- "<gold>"
- "<yellow>"
- "<green>"
- "<aqua>"
- "<blue>"
- "<light_purple>"

🔌 PlaceholderAPI

When PlaceholderAPI is installed, the following placeholders are available. All placeholders return results in Legacy Hex format (§x§r§r§g§g§b§b) for universal compatibility.

PlaceholderAliasesDescriptionExample Output
%chatcolor_color%%chatcolor%, %chatcolor_prefix%, %chatcolor_tag%Returns the player's active legacy color code.§c or §x§f§f§5§5§f§f
%chatcolor_name%-Returns the player's name with their active color applied.§cBusyBee
%chatcolor_message%-Applies the player's color to their last sent message.§cHello world!
%chatcolor_apply_<text>%%chatcolor_apply:<text>%Wraps the provided <text> with the player's active color.§cWelcome!
%chatcolor_key%-Returns the internal identifier of the selection.rainbow
%chatcolor_type%-Returns the category (SOLID, GRADIENT, PATTERN).GRADIENT

Note: For modern plugins that support MiniMessage (like LPC or Tab), we recommend using these placeholders in their format strings and letting the plugin handle the conversion if necessary.


🛠️ Integration Tips

Most setups need no configuration at all. On Paper, ChatColor applies color from a chat renderer that runs after every other listener, so plugins that format or strip chat can't interfere with it. Where a formatter ignores renderers outright, ChatColor detects it and switches to colouring the message in front of that plugin instead — also automatically.

EssentialsChat

  • Works out of the box. Use the standard {MESSAGE} tag in your Essentials format.
  • EssentialsChat's renderer ignores the message it is handed, so ChatColor detects it and colours the message from in front of it instead of rendering. This is automatic — leave event-priority and message-mode on their defaults, and in particular do not force event-priority: "HIGHEST", which puts ChatColor behind the point where Essentials reads the message.
  • No essentials.chat.color / essentials.chat.rgb grants required — those only control whether players may type their own & codes.

LuckPermsChat (LPC)

LPC builds its format from placeholders and discards the rendered message, so it needs the placeholder route:

  1. In LPC config.yml, set your format to use %chatcolor_message% (e.g. {prefix}{name}&r: %chatcolor_message%).
  2. In ChatColor config.yml, set late-bind: true.

DiscordSRV

  • ChatColor automatically works with DiscordSRV.
  • For the best experience on Paper, ensure UseModernPaperChatEvent: true is set in DiscordSRV's config.

Something not working?

Run /color debug, say something, and read the console. It prints the full chat listener order, ChatColor's permission resolution for that player, and whether its renderer survived to the end of the event. See docs/advanced/chat-compatibility.md.

About

Plugin for Spigot that allows you to create patterns and colors for the chat

Resources

Stars

1 star

Watchers

0 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

215 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

🌈 ChatColor

ChatColor is an advanced Minecraft chat color plugin built for Paper 1.21+ (with full Folia support) that lets players personalize their chat messages with solid colors, multi-stop gradients, and character-cycling patterns — all through a sleek GUI or simple commands.


✨ Features

  • 🎨 24+ Solid Colors — From standard Minecraft colors to custom hex values like Hot Pink, Coral, Mint, and Lavender.
  • 🌅 12 Gradient Presets — Multi-stop gradients including Sunset, Ocean, Cosmic, Rose Gold, Lava, and more.
  • 🔥 6 Pattern Presets — Character-cycling color patterns like Rainbow, Fire, Ice, Galaxy, Toxic, and Cherry.
  • 🛠️ Custom Color Creation — Create your own custom colors with simple commands.
  • 🖥️ Interactive GUI — Full inventory-based color selector with a main menu and category pages.
  • ⌨️ Command Support — Set, reset, and manage colors entirely from the command line.
  • 🔒 Per-Entry Permissions — Grant or restrict individual colors, gradients, and patterns per player/group, registered with the server at runtime so LuckPerms wildcards actually work.
  • 🤝 Drop-In Compatibility — Colors are applied from a chat renderer that runs after every other listener, so EssentialsChat and friends can't strip them.
  • 🩺 Built-In Diagnostics/color debug traces the whole chat pipeline into the console.
  • 🧵 Folia Ready — Region-thread safe, with Folia-aware scheduling throughout.
  • 💾 Persistent Data — Player color selections are saved to disk and restored on rejoin.
  • 🔌 PlaceholderAPI Support — Expose player color data as placeholders for use in other plugins.
  • 🛠️ Developer API — Clean ChatColorAPI class for third-party plugin integration.
  • Hot Reload — Reload all configuration files at runtime without restarting.
  • 📊 Metrics — Anonymized usage statistics via bStats and FastStats.

📚 Documentation

PageCovers
InstallationRequirements, platform support, verifying the install
Commands & PermissionsEvery command, every permission node
ConfigurationAll config files, settings reference, troubleshooting
GUI CustomizationTitles, layouts, items, status lore
PlaceholdersPlaceholderAPI expansion and chat plugin integration
Chat CompatibilityHow coloring works, /color debug, Folia, known plugins
Developer APIChatColorAPI reference and thread safety

🕹️ Commands

CommandDescriptionPermission
/colorOpens the main color selector GUIchatcolor.use
/color gui [player]Opens the color selector for you or otherschatcolor.use*
/color reset [player]Removes active chat colorchatcolor.use*
/color set <type> <key> [player]Sets a color, gradient, or pattern by keychatcolor.use*
/color list [type]Lists colors, gradients, patterns, customchatcolor.use
/color create <name> <tag> <icon> [permission] [default]Create or update a custom colorchatcolor.create
/color delete <name>Delete a custom colorchatcolor.create
/color reloadReloads all plugin configurationchatcolor.reload
/color debug [off|pipeline|all]Trace the chat pipeline in the consolechatcolor.debug

*Using [player] argument (or running from console) requires chatcolor.admin.

Aliases:/chatcolor, /colors

Note for Console: Console usage requires specifying a target player for gui, reset, and set.


🔑 Permissions

PermissionDescriptionDefault
chatcolor.useAccess to the GUI and basic commandstrue
chatcolor.reloadReload the plugin configop
chatcolor.createCreate custom colorsop
chatcolor.adminUse admin command arguments & consoleop
chatcolor.debugTrace the chat pipeline in the consoleop
chatcolor.minimessageUse MiniMessage & legacy codes in chatfalse
chatcolor.gui.solidAccess to Solid Colors sectiontrue
chatcolor.gui.gradientAccess to Gradients sectiontrue
chatcolor.gui.patternAccess to Patterns sectiontrue
chatcolor.color.*Access to all solid colorsop
chatcolor.gradient.*Access to all gradientsop
chatcolor.pattern.*Access to all patternsop
chatcolor.custom.*Access to all custom colorsop
chatcolor.group.<name>Apply group-based default colorsfalse

Individual entries have their own permission nodes, for example:

  • chatcolor.color.red
  • chatcolor.gradient.sunset
  • chatcolor.pattern.rainbow
  • chatcolor.custom.pastel-pink

Every entry from colors.yml and patterns.yml is registered with the server as a real permission at runtime, so LuckPerms can tab-complete your custom nodes and the * wildcards genuinely expand over them. Entries with no permission: set are public.


⚙️ Configuration

Updating never means deleting a config. Drop in the new jar and restart: new settings and colours arrive, documentation is refreshed, and everything you edited — including your custom-colors — is kept. Keys you deleted stay deleted, a backup is written to backups/ before any change, and a restart that changes nothing rewrites nothing. Details, and the one first-run exception, in docs/advanced/config-updates.md.

config.yml

Controls general plugin settings and behavior.

settings:
apply-to-message: true # Apply color to chat messagesapply-to-name: false # Apply color to display namedefault-color: "NONE"# Default color for new playersgroup-defaults: # Group-based prioritized defaultsadmin: "<gradient:red:gold>"vip: "<aqua>"event-priority: "DEFAULT"# Options: HIGHEST, LOWEST, etc. or DEFAULT (auto-detect)chat-hook: "AUTO"# Chat event to hook: AUTO / MODERN / LEGACYmessage-mode: "AUTO"# How colour is applied: AUTO / RENDERER / DIRECTlate-bind: false # Only for placeholder-driven formats like LPCclean-console: true # Strip colors from console logsshow-standard-colors: true # Toggle visibility of standard colorsshow-standard-gradients: true # Toggle visibility of standard gradientsshow-standard-patterns: true # Toggle visibility of standard patterns

gui/gui.yml

Full control over GUI titles, items, layouts, and messages.

colors/colors.yml

Defines all solid colors and gradients.

colors:
red:
display-name: "Red"tag: "<red>"permission: "chatcolor.color.red"icon: "RED_WOOL"gradients:
sunset:
display-name: "Sunset"tag: "<gradient:#FF4500:#FF8C00:#FFD700>"permission: "chatcolor.gradient.sunset"icon: "ORANGE_WOOL"

colors/patterns.yml

Defines character-cycling color patterns.

patterns:
rainbow:
display-name: "Rainbow"permission: "chatcolor.pattern.rainbow"icon: "YELLOW_WOOL"colors:
- "<red>"
- "<gold>"
- "<yellow>"
- "<green>"
- "<aqua>"
- "<blue>"
- "<light_purple>"

🔌 PlaceholderAPI

When PlaceholderAPI is installed, the following placeholders are available. All placeholders return results in Legacy Hex format (§x§r§r§g§g§b§b) for universal compatibility.

PlaceholderAliasesDescriptionExample Output
%chatcolor_color%%chatcolor%, %chatcolor_prefix%, %chatcolor_tag%Returns the player's active legacy color code.§c or §x§f§f§5§5§f§f
%chatcolor_name%-Returns the player's name with their active color applied.§cBusyBee
%chatcolor_message%-Applies the player's color to their last sent message.§cHello world!
%chatcolor_apply_<text>%%chatcolor_apply:<text>%Wraps the provided <text> with the player's active color.§cWelcome!
%chatcolor_key%-Returns the internal identifier of the selection.rainbow
%chatcolor_type%-Returns the category (SOLID, GRADIENT, PATTERN).GRADIENT

Note: For modern plugins that support MiniMessage (like LPC or Tab), we recommend using these placeholders in their format strings and letting the plugin handle the conversion if necessary.


🛠️ Integration Tips

Most setups need no configuration at all. On Paper, ChatColor applies color from a chat renderer that runs after every other listener, so plugins that format or strip chat can't interfere with it. Where a formatter ignores renderers outright, ChatColor detects it and switches to colouring the message in front of that plugin instead — also automatically.

EssentialsChat

  • Works out of the box. Use the standard {MESSAGE} tag in your Essentials format.
  • EssentialsChat's renderer ignores the message it is handed, so ChatColor detects it and colours the message from in front of it instead of rendering. This is automatic — leave event-priority and message-mode on their defaults, and in particular do not force event-priority: "HIGHEST", which puts ChatColor behind the point where Essentials reads the message.
  • No essentials.chat.color / essentials.chat.rgb grants required — those only control whether players may type their own & codes.

LuckPermsChat (LPC)

LPC builds its format from placeholders and discards the rendered message, so it needs the placeholder route:

  1. In LPC config.yml, set your format to use %chatcolor_message% (e.g. {prefix}{name}&r: %chatcolor_message%).
  2. In ChatColor config.yml, set late-bind: true.

DiscordSRV

  • ChatColor automatically works with DiscordSRV.
  • For the best experience on Paper, ensure UseModernPaperChatEvent: true is set in DiscordSRV's config.

Something not working?

Run /color debug, say something, and read the console. It prints the full chat listener order, ChatColor's permission resolution for that player, and whether its renderer survived to the end of the event. See docs/advanced/chat-compatibility.md.

About

Plugin for Spigot that allows you to create patterns and colors for the chat

Resources

Stars

1 star

Watchers

0 watching

Forks

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

215 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

🌈 ChatColor

ChatColor is an advanced Minecraft chat color plugin built for Paper 1.21+ (with full Folia support) that lets players personalize their chat messages with solid colors, multi-stop gradients, and character-cycling patterns — all through a sleek GUI or simple commands.


✨ Features

  • 🎨 24+ Solid Colors — From standard Minecraft colors to custom hex values like Hot Pink, Coral, Mint, and Lavender.
  • 🌅 12 Gradient Presets — Multi-stop gradients including Sunset, Ocean, Cosmic, Rose Gold, Lava, and more.
  • 🔥 6 Pattern Presets — Character-cycling color patterns like Rainbow, Fire, Ice, Galaxy, Toxic, and Cherry.
  • 🛠️ Custom Color Creation — Create your own custom colors with simple commands.
  • 🖥️ Interactive GUI — Full inventory-based color selector with a main menu and category pages.
  • ⌨️ Command Support — Set, reset, and manage colors entirely from the command line.
  • 🔒 Per-Entry Permissions — Grant or restrict individual colors, gradients, and patterns per player/group, registered with the server at runtime so LuckPerms wildcards actually work.
  • 🤝 Drop-In Compatibility — Colors are applied from a chat renderer that runs after every other listener, so EssentialsChat and friends can't strip them.
  • 🩺 Built-In Diagnostics/color debug traces the whole chat pipeline into the console.
  • 🧵 Folia Ready — Region-thread safe, with Folia-aware scheduling throughout.
  • 💾 Persistent Data — Player color selections are saved to disk and restored on rejoin.
  • 🔌 PlaceholderAPI Support — Expose player color data as placeholders for use in other plugins.
  • 🛠️ Developer API — Clean ChatColorAPI class for third-party plugin integration.
  • Hot Reload — Reload all configuration files at runtime without restarting.
  • 📊 Metrics — Anonymized usage statistics via bStats and FastStats.

📚 Documentation

PageCovers
InstallationRequirements, platform support, verifying the install
Commands & PermissionsEvery command, every permission node
ConfigurationAll config files, settings reference, troubleshooting
GUI CustomizationTitles, layouts, items, status lore
PlaceholdersPlaceholderAPI expansion and chat plugin integration
Chat CompatibilityHow coloring works, /color debug, Folia, known plugins
Developer APIChatColorAPI reference and thread safety

🕹️ Commands

CommandDescriptionPermission
/colorOpens the main color selector GUIchatcolor.use
/color gui [player]Opens the color selector for you or otherschatcolor.use*
/color reset [player]Removes active chat colorchatcolor.use*
/color set <type> <key> [player]Sets a color, gradient, or pattern by keychatcolor.use*
/color list [type]Lists colors, gradients, patterns, customchatcolor.use
/color create <name> <tag> <icon> [permission] [default]Create or update a custom colorchatcolor.create
/color delete <name>Delete a custom colorchatcolor.create
/color reloadReloads all plugin configurationchatcolor.reload
/color debug [off|pipeline|all]Trace the chat pipeline in the consolechatcolor.debug

*Using [player] argument (or running from console) requires chatcolor.admin.

Aliases:/chatcolor, /colors

Note for Console: Console usage requires specifying a target player for gui, reset, and set.


🔑 Permissions

PermissionDescriptionDefault
chatcolor.useAccess to the GUI and basic commandstrue
chatcolor.reloadReload the plugin configop
chatcolor.createCreate custom colorsop
chatcolor.adminUse admin command arguments & consoleop
chatcolor.debugTrace the chat pipeline in the consoleop
chatcolor.minimessageUse MiniMessage & legacy codes in chatfalse
chatcolor.gui.solidAccess to Solid Colors sectiontrue
chatcolor.gui.gradientAccess to Gradients sectiontrue
chatcolor.gui.patternAccess to Patterns sectiontrue
chatcolor.color.*Access to all solid colorsop
chatcolor.gradient.*Access to all gradientsop
chatcolor.pattern.*Access to all patternsop
chatcolor.custom.*Access to all custom colorsop
chatcolor.group.<name>Apply group-based default colorsfalse

Individual entries have their own permission nodes, for example:

  • chatcolor.color.red
  • chatcolor.gradient.sunset
  • chatcolor.pattern.rainbow
  • chatcolor.custom.pastel-pink

Every entry from colors.yml and patterns.yml is registered with the server as a real permission at runtime, so LuckPerms can tab-complete your custom nodes and the * wildcards genuinely expand over them. Entries with no permission: set are public.


⚙️ Configuration

Updating never means deleting a config. Drop in the new jar and restart: new settings and colours arrive, documentation is refreshed, and everything you edited — including your custom-colors — is kept. Keys you deleted stay deleted, a backup is written to backups/ before any change, and a restart that changes nothing rewrites nothing. Details, and the one first-run exception, in docs/advanced/config-updates.md.

config.yml

Controls general plugin settings and behavior.

settings:
apply-to-message: true # Apply color to chat messagesapply-to-name: false # Apply color to display namedefault-color: "NONE"# Default color for new playersgroup-defaults: # Group-based prioritized defaultsadmin: "<gradient:red:gold>"vip: "<aqua>"event-priority: "DEFAULT"# Options: HIGHEST, LOWEST, etc. or DEFAULT (auto-detect)chat-hook: "AUTO"# Chat event to hook: AUTO / MODERN / LEGACYmessage-mode: "AUTO"# How colour is applied: AUTO / RENDERER / DIRECTlate-bind: false # Only for placeholder-driven formats like LPCclean-console: true # Strip colors from console logsshow-standard-colors: true # Toggle visibility of standard colorsshow-standard-gradients: true # Toggle visibility of standard gradientsshow-standard-patterns: true # Toggle visibility of standard patterns

gui/gui.yml

Full control over GUI titles, items, layouts, and messages.

colors/colors.yml

Defines all solid colors and gradients.

colors:
red:
display-name: "Red"tag: "<red>"permission: "chatcolor.color.red"icon: "RED_WOOL"gradients:
sunset:
display-name: "Sunset"tag: "<gradient:#FF4500:#FF8C00:#FFD700>"permission: "chatcolor.gradient.sunset"icon: "ORANGE_WOOL"

colors/patterns.yml

Defines character-cycling color patterns.

patterns:
rainbow:
display-name: "Rainbow"permission: "chatcolor.pattern.rainbow"icon: "YELLOW_WOOL"colors:
- "<red>"
- "<gold>"
- "<yellow>"
- "<green>"
- "<aqua>"
- "<blue>"
- "<light_purple>"

🔌 PlaceholderAPI

When PlaceholderAPI is installed, the following placeholders are available. All placeholders return results in Legacy Hex format (§x§r§r§g§g§b§b) for universal compatibility.

PlaceholderAliasesDescriptionExample Output
%chatcolor_color%%chatcolor%, %chatcolor_prefix%, %chatcolor_tag%Returns the player's active legacy color code.§c or §x§f§f§5§5§f§f
%chatcolor_name%-Returns the player's name with their active color applied.§cBusyBee
%chatcolor_message%-Applies the player's color to their last sent message.§cHello world!
%chatcolor_apply_<text>%%chatcolor_apply:<text>%Wraps the provided <text> with the player's active color.§cWelcome!
%chatcolor_key%-Returns the internal identifier of the selection.rainbow
%chatcolor_type%-Returns the category (SOLID, GRADIENT, PATTERN).GRADIENT

Note: For modern plugins that support MiniMessage (like LPC or Tab), we recommend using these placeholders in their format strings and letting the plugin handle the conversion if necessary.


🛠️ Integration Tips

Most setups need no configuration at all. On Paper, ChatColor applies color from a chat renderer that runs after every other listener, so plugins that format or strip chat can't interfere with it. Where a formatter ignores renderers outright, ChatColor detects it and switches to colouring the message in front of that plugin instead — also automatically.

EssentialsChat

  • Works out of the box. Use the standard {MESSAGE} tag in your Essentials format.
  • EssentialsChat's renderer ignores the message it is handed, so ChatColor detects it and colours the message from in front of it instead of rendering. This is automatic — leave event-priority and message-mode on their defaults, and in particular do not force event-priority: "HIGHEST", which puts ChatColor behind the point where Essentials reads the message.
  • No essentials.chat.color / essentials.chat.rgb grants required — those only control whether players may type their own & codes.

LuckPermsChat (LPC)

LPC builds its format from placeholders and discards the rendered message, so it needs the placeholder route:

  1. In LPC config.yml, set your format to use %chatcolor_message% (e.g. {prefix}{name}&r: %chatcolor_message%).
  2. In ChatColor config.yml, set late-bind: true.

DiscordSRV

  • ChatColor automatically works with DiscordSRV.
  • For the best experience on Paper, ensure UseModernPaperChatEvent: true is set in DiscordSRV's config.

Something not working?

Run /color debug, say something, and read the console. It prints the full chat listener order, ChatColor's permission resolution for that player, and whether its renderer survived to the end of the event. See docs/advanced/chat-compatibility.md.

About

Plugin for Spigot that allows you to create patterns and colors for the chat

Resources

Stars

1 star

Watchers

0 watching

Forks

Used by

Contributors

Languages