Content generated with AI — it may contain mistakes.

Reference

Frequently asked questions

The questions that come up most.

Nothing shows in chat at all

Almost always the hook does not match the chat plugin you actually run. chat.hook decides how the message body is styled, and the wrong mode is a mode nothing ever fires. decorate is right for Paper's own chat and for anything rendering through AsyncChatEvent; a plugin that reads message() but ignores decoration wants chat_event at a priority below its own; a plugin still on AsyncPlayerChatEvent wants legacy_event. The table on Integrations matches each case.

The tag and the coloured name are a separate matter: those are never injected for you. If the message is coloured but there is no tag in front of the name, you have not put %exyliachatcosmetics_tag% and %exyliachatcosmetics_nick% into your chat plugin's format yet.

Tags show up as the word they are written from

Sprites, particles and head skins in tags are object components, which arrived in Minecraft 1.21.9. A client older than that has nothing to draw, so it shows the tag as the text it is written in rather than failing — which is why the ANIMATED, PARTICLES, ICONS, INTERFACE and FLAGS tabs read as words on an old client and the SYMBOLS tab does not. Colours, fonts, shadows and the whole chat module work on 1.21 exactly as they do on the newest release.

Some players never see certain messages

That is secure chat. Any change to a message body — a colour is a change — marks the message as modified for a vanilla client, and a client with Only Show Secure Chat turned on hides a modified message. It still arrives; the client refuses to draw it. Every chat-colour plugin on the market has this property. Setting enforce-secure-profile=false in server.properties is the usual answer.

Rank colours do nothing

Two causes. Rank colours repaint the prefix and suffix your permission plugin writes, and that meta comes from LuckPerms — without it there is nothing to repaint, {prefix} and {suffix} draw nothing and the rank-colour screen is empty. The other five cosmetic types are unaffected.

If LuckPerms is there and the colour still looks wrong, it is rank-colors.repaint. The default, letters, paints only letters and digits, so &8[&eVIP&8] keeps its grey brackets and whatever symbol the rank wrote keeps its own colour. all paints everything the rank wrote, brackets included.

A player kept a cosmetic after losing the rank that gave it

For at most a moment, and only without LuckPerms. Permission answers are memoised per profile so that drawing a chat line never goes near the permission plugin. With LuckPerms installed, UserDataRecalculateEvent drops that memo and the render cache the instant a rank changes, and the next line they send is drawn with what they own now — no relog. Without LuckPerms the memo refreshes on join, on /cca reload, and on the thirty-second sweep instead.

What never happens is the cosmetic being deleted from their row. Equipped and owned are separate questions; a cosmetic somebody no longer owns simply stops being drawn, and comes back the day it is theirs again. That is deliberate — a permission plugin still loading on join would otherwise delete what somebody paid for.

I revoked a grant and it did not disappear at once

Ownership is asked wherever a line is drawn, so a revoked grant stops counting immediately for chat. What waits is the announcement and the automatic unequip: one sweep walks the online profiles every thirty seconds, because a grant that ran out is only worth telling somebody who is actually here. EntitlementExpiredEvent, the expired message and taking the cosmetic off all ride on that sweep, so they arrive shortly after the moment rather than exactly on it. An offline player's grant needs no sweep at all: it is simply inactive the next time it is read.

The chat module will not start

The chat module needs Paper. The cosmetics do not — on Spigot they run through legacy_event, and decorate or chat_event fall back to it with a warning at startup — but the module itself is built on Paper's chat events and has no Spigot path. Leave chat.module.enabled off there and use the hook with whatever chat plugin you already run.

If the module fails for any other reason, the console says The built-in chat could not start; cosmetics keep working through the chat hook. and the hook is reinstalled. A chat file that cannot be read must not cost a server its cosmetics.

How do I give somebody a whole tab?

exyliachatcosmetics.<type>.category.<category> — so exyliachatcosmetics.chat_color.category.premium is the whole premium chat-colour tab, and exyliachatcosmetics.tag.category.flags is every flag. exyliachatcosmetics.<type>.* is every entry of a type, and exyliachatcosmetics.* is everything. That is the difference between selling a rank and selling a cosmetic: one node against a hundred grants.

Rank colours are the exception. They ship with permission: false and are owned by being in one of the groups the entry names, so a player in vip wears the VIP colour with no node at all.

Deleting a custom tag gave no token back

By design. A player is not limited by how many custom cosmetics they hold but by how many they were given the right to make: a create token pays for each new one and an edit token for each change, and deleting returns nothing. Somebody handed three creations makes three, and the fourth costs another token however many they delete in between. See Tokens.

A tag's hover runs into the rest of the line

Run /cca chat line [message]. It renders your own chat line and breaks it into the stretches that share a hover and a click, the way a client actually reads it — every character carries the style of its ancestors, so a hover set on a parent reaches every child under it. Each stretch is printed as [text] hover …, click …, to the console and to you, and a piece whose hover swallows the next one is visible there rather than guessed at from a screenshot. The module has to be on for it.

Players type &c and it shows as text

That is chat.sanitize, on by default: a player's own &c, <red> or {primary} is shown as what they typed rather than obeyed, so nobody paints their line a colour they never bought. Give exyliachatcosmetics.chat.format to the people you trust with it. § is neutralised regardless of the setting and of the permission.

Does it run on Spigot? On Folia?

Spigot runs the cosmetics through the legacy hook — everything about tags, colours, fonts and animations works — but not the chat module. Folia is fully supported and written for rather than merely tolerated: profile writes and event firing land on the player's own region, the animation clock and the expiry sweep run async, and chat and placeholder rendering read memory only.

Do I need PlaceholderAPI?

Only if a plugin outside the Exylia ecosystem has to read the placeholders. They are registered with ExyliaLib's own placeholder module and work in every ExyliaLib text with PAPI absent; when PAPI is installed, ExyliaLib bridges the lot into it automatically under %exyliachatcosmetics_<name>%. There is no expansion to download.

Where do I get support?

On the Exylia Discord.

Something missing on this page? Tell us on Discord