Contenido generado con IA — puede contener errores.

El catálogo

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 tipoArchivoSecciónSe lleva
tagtags.ymltagsuno
nick_colornick-colors.ymlnick_colorsuno
rank_colorrank-colors.ymlrank_colorsuno
chat_colorchat-colors.ymlchat_colorsuno
shadow_colorshadow-colors.ymlshadow_colorsuno
fontfonts.ymlfontsuna
modifiermodifiers.ymlmodifiersvarios 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.

plugins/ExyliaChatCosmetics/cosmetics/tags.yml
categories:
  symbols:
    name: '{primary}&lSYMBOLS'
    icon: NAME_TAG
    priority: 1
  premium:
    name: '{primary}&lPREMIUM'
    icon: NETHER_STAR
    priority: 7

El 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.

ClavePor defectoSignifica
categoryotherla pestaña en la que vive
nameel idcómo lo llama el menú
iconNAME_TAGel ítem que se dibuja en el menú; también se acepta material:
descriptionningunauna línea o una lista; también se acepta lore:
priority999orden dentro de la pestaña, de menor a mayor; los empates se rompen por id
permissiontruesi exyliachatcosmetics.<type>.<id> lo posee
requirementningunose lee del archivo y viaja en la definición, pero todavía nada la evalúa — ver abajo
hiddenfalselo deja fuera del menú; una concesión igual lo pone
metadataningunapares 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'
`requirement` todavía no hace nada

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.

En rank-colors.yml, permission va al revés

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.

EscritoSignifica
#8a51c4un color, seis dígitos hex después de una almohadilla
&#8a51c4, 8a51c4, <#8a51c4>el mismo color, en las otras formas en las que la gente lo escribe
gold, red, dark_aquauno de los dieciséis colores con nombre
{primary}, {accent}, {highlight}un token de paleta de ExyliaLib, que sigue tu colors.yml
#a:#bun degradado de un color al otro
#a:#b:#cun degradado por tres paradas, y así
gradient:#a:#blo 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.

Las sombras leen su propia gramática

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 declared

Lo que te cuesta cada tipo de problema:

ProblemaQué pasa
Falta o no se puede leer un campo sin el que la entrada no existese salta esa entrada, el resto del archivo carga
Una entrada no es una sección, o su id se normaliza a nadalo mismo
Nombra una categoría que nadie declaróse carga igual, pero ninguna pestaña la lista
Falta la sección categoriesel archivo carga sin pestañas
Falta la sección de entradasel 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.

Lee la consola después de recargar

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

¿Falta algo en esta página? Dínoslo en Discord