El catálogo
Cómo funcionan los archivos de cosmetics/: uno por tipo, los campos que comparten todas las entradas, la gramática de colores y qué pasa cuando una entrada está mal.
Todo lo que un jugador puede ponerse está declarado en plugins/ExyliaChatCosmetics/cosmetics/, un
archivo por tipo. Son YAML común, están hechos para editarlos a mano, y /cca reload los vuelve a
leer.
A propósito no los gestiona un esquema, como sí pasa con config.yml. Un catálogo está curado: tiene
separadores de sección, una descripción escrita como frase en una entrada y como lista en la
siguiente, comentarios que explican por qué un id se escribe así. Un escritor de esquemas pasa el
archivo por un cargador que no conserva nada de eso. config.yml es del esquema; estos archivos son
de quien los edita.
Un archivo por tipo
| Id de tipo | Archivo | Sección | Se lleva |
|---|---|---|---|
tag | tags.yml | tags | uno |
nick_color | nick-colors.yml | nick_colors | uno |
rank_color | rank-colors.yml | rank_colors | uno |
chat_color | chat-colors.yml | chat_colors | uno |
shadow_color | shadow-colors.yml | shadow_colors | uno |
font | fonts.yml | fonts | una |
modifier | modifiers.yml | modifiers | varios a la vez |
customtag | — filas del jugador | — | uno |
customcolor | — filas del jugador | — | uno |
customnick | — filas del jugador | — | uno |
customrank | — filas del jugador | — | uno |
Los cuatro tipos custom* no tienen archivo: son lo que los jugadores se escriben, una fila de base
de datos cada uno, y están documentados en
Cosméticos personalizados.
cosmetics/animations.yml vive en la misma carpeta pero no es un tipo. Es una biblioteca de
movimiento que cualquier otra entrada nombra con animation: — ver
Animaciones.
Cómo se nombra un cosmético
Un cosmético es type:id en todos lados — en una concesión, un favorito, un loadout, un placeholder,
un comando: tag:mvp, chat_color:aurora, customtag:42. Una sola forma significa que un valor
escrito por cualquiera de ellos lo puede leer cualquier otro.
Las dos mitades se normalizan al entrar: se recortan los espacios, se pasa a minúsculas, los espacios
internos se vuelven guiones bajos y se descarta todo lo que no sea a-z, 0-9, _ o -. Así MVP
y mvp son el mismo id, y una fila que un admin escribió hace años como Tag:MVP sigue resolviendo.
Un id que se normaliza a nada se reporta y se salta: ya no queda cosmético que nombrar.
Pestañas
Todos los archivos empiezan con una sección categories. Cada entrada de ahí es una pestaña del menú
que recorre ese tipo, y priority es el orden en el que se colocan, de menor a mayor.
categories:
symbols:
name: '{primary}&lSYMBOLS'
icon: NAME_TAG
priority: 1
premium:
name: '{primary}&lPREMIUM'
icon: NETHER_STAR
priority: 7El id de una categoría se normaliza como cualquier otra clave. icon acepta material: como su otra
forma de escribirse, y si falta usa PAPER. Una entrada que nombra una categoría que nadie declaró
igual se carga — simplemente no hay pestaña que la liste, y un comando todavía puede concederla —
pero el fallo se reporta para que lo veas.
Lo que declara toda entrada
Sea del tipo que sea, estas son las claves que leen el menú, la comprobación de propiedad y los placeholders sin necesitar saber qué clase de cosmético están mirando.
| Clave | Por defecto | Significa |
|---|---|---|
category | other | la pestaña en la que vive |
name | el id | cómo lo llama el menú |
icon | NAME_TAG | el ítem que se dibuja en el menú; también se acepta material: |
description | ninguna | una línea o una lista; también se acepta lore: |
priority | 999 | orden dentro de la pestaña, de menor a mayor; los empates se rompen por id |
permission | true | si exyliachatcosmetics.<type>.<id> lo posee |
requirement | ninguno | se lee del archivo y viaja en la definición, pero todavía nada la evalúa — ver abajo |
hidden | false | lo deja fuera del menú; una concesión igual lo pone |
metadata | ninguna | pares clave: valor libres que otro plugin puede leer |
tags:
mvp:
category: premium
name: '{primary}&lMVP'
icon: GOLD_INGOT
description: 'Reservada para los {highlight}mejores.'
priority: 1
permission: true
hidden: false
metadata:
season: '2026'Cualquier entrada puede llevar un requirement, se lee sin quejarse y llega hasta la definición —
pero en la 1.0.0 no hay código que la evalúe. Lo que de verdad deja un cosmético fuera del menú es
hidden, y quién puede llevarlo lo decide la propiedad. Escribe la clave si quieres; no esperes nada
de ella hasta que un release diga lo contrario.
name y description se parsean como cualquier otro texto de Exylia: dentro funcionan los tokens de
paleta, los códigos & y MiniMessage.
Encima de esto, cada tipo añade las claves que lo hacen ese tipo — display y head en una etiqueta,
color o gradient en un color, alphabet en una fuente, decoration en un modificador. Eso está
en las páginas de etiquetas,
colores, fuentes y
cosméticos personalizados.
permission vale true por defecto en todos los archivos menos en rank-colors.yml, donde un color
de rango normalmente lo posee el rango en vez de comprarse. Está explicado en
Colores.
La propiedad por permiso lee exyliachatcosmetics.<type>.<id>,
exyliachatcosmetics.<type>.category.<category>, exyliachatcosmetics.<type>.* o
exyliachatcosmetics.*. Poner permission: false deja solo las concesiones — ver
Concesiones.
La gramática de colores
Donde sea que se escriba un color — color:, una parada dentro de gradient:, un color que mezcla un
jugador, chat.default-color — se lee igual.
| Escrito | Significa |
|---|---|
#8a51c4 | un color, seis dígitos hex después de una almohadilla |
a51c4, 8a51c4, <#8a51c4> | el mismo color, en las otras formas en las que la gente lo escribe |
gold, red, dark_aqua | uno de los dieciséis colores con nombre |
{primary}, {accent}, {highlight} | un token de paleta de ExyliaLib, que sigue tu colors.yml |
#a:#b | un degradado de un color al otro |
#a:#b:#c | un degradado por tres paradas, y así |
gradient:#a:#b | lo mismo, escrito con todas las letras |
<gradient:#a:#b> | lo mismo otra vez, para quien escribe MiniMessage por costumbre |
En un archivo, color: toma uno de esos como cadena y gradient: toma una lista; una lista de uno se
lee como color sólido en vez de rechazarse. Una almohadilla tiene que ir seguida de exactamente seis
dígitos: #12 no es un hex corto, es un error, y se reporta como tal.
Como los tokens de paleta se resuelven al leer el archivo, un cosmético escrito con {primary} sigue
la paleta de tu servidor en vez de un hex fijo: cambias colors.yml, recargas, y cambia con ella.
shadow-colors.yml es la excepción. Una sombra no se pinta con un degradado, y se le puede pedir que
siga al mensaje en vez de nombrar un color propio, así que su color: acepta además #rrggbbaa,
auto, auto:0.5 y none. La tabla completa está en Colores.
Cuando una entrada está mal
En un catálogo no se lanza nada. Cada problema se reporta con la ruta de la que vino y esa entrada se salta, porque una etiqueta mal escrita no puede costarle a un servidor las otras doscientas.
Un reporte nombra el archivo, la entrada y el campo:
cosmetics/tags.yml tags.mvp.display: is missing, so there is nothing to draw
cosmetics/rank-colors.yml rank_colors.azure.color: cannot be read: 'blurple'
cosmetics/tags.yml tags.event: names the category 'seasonal', which is not declaredLo que te cuesta cada tipo de problema:
| Problema | Qué pasa |
|---|---|
| Falta o no se puede leer un campo sin el que la entrada no existe | se salta esa entrada, el resto del archivo carga |
| Una entrada no es una sección, o su id se normaliza a nada | lo mismo |
| Nombra una categoría que nadie declaró | se carga igual, pero ninguna pestaña la lista |
Falta la sección categories | el archivo carga sin pestañas |
| Falta la sección de entradas | el servidor no tiene ninguno de ese tipo |
El catálogo de un tipo se publica como una sola instantánea y se reemplaza entero, así que una recarga nunca deja un menú mostrando medio archivo.
Recargar
/cca reload vuelve a leer la configuración, todos los catálogos, las animaciones y los menús. Los
jugadores siguen conectados, lo que llevan puesto sigue puesto, y un menú que estaba abierto toma la
paleta nueva.
Los problemas de arriba son avisos, no errores: el servidor sigue funcionando y el archivo conserva casi todas sus entradas. Si un cosmético que acabas de escribir no aparece en el menú, el motivo es una línea en la consola.
Por tipo
display, head, format, y qué puede dibujar una etiqueta en cada cliente.
Colores de nick, chat, sombra y rango, y cuál gana en cada sitio.
Fuentes y modificadoresAlfabetos, dígitos, pares extra y las cinco decoraciones.
AnimacionesLos seis tipos de movimiento que cualquier entrada puede nombrar con animation:.
Los cuatro tipos sin archivo: lo que los jugadores se escriben.
ConcesionesPermisos, concesiones que caducan, y la diferencia entre poseer y llevar puesto.
¿Falta algo en esta página? Dínoslo en Discord