Contenido generado con IA — puede contener errores.

El catálogo

Animaciones

Las seis formas en que un color puede moverse sobre el texto, las dieciocho incluidas y el único reloj que hay detrás.

Una animación no es algo que un jugador se ponga. Es un movimiento declarado una vez en animations.yml y luego prestado: una etiqueta, un color de nick, un color de chat o un color de rango dice animation: <id>, y a partir de ahí se dibuja en movimiento. Nada de este archivo se navega, nada se posee y ningún jugador elige una directamente.

La entrada

plugins/ExyliaChatCosmetics/cosmetics/animations.yml
animations:
  shine:
    type: gradient_shift
    period: 60                                 # ticks de un ciclo completo; 20 = un segundo
    colors: ['#ffd700', '#ffffff', '#ffd700']  # opcional; sin esto, los del cosmético
    intensity: 1.0                             # de 0 a 1

No hay sección categories ni campos de menú. Una entrada son cuatro claves y nada más.

ClaveQué hace
typeuno de los seis de abajo. Una entrada que nombre otra cosa se reporta con su ruta y se salta
periodticks de un ciclo completo. Cualquier valor por debajo de 1 se lee como 1. Por defecto 40
colorslas paradas por las que moverse, escritas en la gramática de colores de siempre. Si se omite, se mueve por el color del cosmético que la lleve
intensityde 0 a 1, acotado. Lo que significa depende del tipo. Por defecto 1.0

Una parada puede ser un color hex, un color con nombre o un token de paleta, y un degradado escrito como una sola parada se lee como sus paradas en orden — colors: ['#a:#b'] y colors: ['#a', '#b'] son lo mismo.

Los seis tipos

typeCómo se veLee colorsLee intensity
gradient_shiftlas paradas se deslizan por el texto y dan la vueltasíno
rainbowtodos los tonos por turno, deslizándose por el textonosí, como saturación
cycletodo el texto es un solo color que camina por las paradassíno
waveuna onda de brillo recorre el textonosí, como profundidad
pulsetodo el texto respira, más claro y más oscuro a la veznosí, como profundidad
flickerlos caracteres se apagan al azar, como una bombilla malanosí, como cuántos

Lo que hay que saber está en esas dos últimas columnas. gradient_shift y cycle deciden el color por completo, y por eso son los dos que leen colors. wave, pulse y flicker no deciden ningún color — oscurecen el que ya está ahí — así que un colors puesto en uno de ellos se lee y luego no se usa nunca. Y rainbow calcula un tono desde cero, así que ignora tanto colors como el color del cosmético; lo único que le llega es intensity, como lo saturados que salen los tonos.

flicker elige a sus víctimas con un hash barato de la posición del carácter y del momento, así que el mismo fotograma apaga siempre los mismos caracteres y un fotograma cacheado sigue siendo honesto. Con intensity: 1.0 se apaga alrededor de un carácter de cada seis a poco más de un tercio de su brillo en cualquier fotograma dado; con 0.7, uno de cada nueve; con 0.35, uno de cada dieciocho.

Por qué colores se mueve una animación

Una entrada que omite colors toma prestado el color del cosmético que la nombró, y eso es lo que hace que la misma animación se lea distinta en cada degradado que la lleve.

El color propio del cosméticoLa animación se mueve por
un degradadosus propias paradas, sin tocar
un solo colorese color y el blanco
ningunoel blanco y {primary}

De las dieciocho incluidas, trece toman prestado así, tres llevan paradas propias — shine, cycle y house — y dos, rainbow y spectrum, ignoran el color por completo.

Las dieciocho incluidas

idtypeperiodintensityColores
rushgradient_shift30—los del cosmético
shinegradient_shift60—#ffd700, #ffffff, #ffd700
flowgradient_shift70—los del cosmético
housegradient_shift100—{primary}, {secondary_light}, {letters}, {secondary}
driftgradient_shift160—los del cosmético
spectrumrainbow401.0sus propios tonos
rainbowrainbow800.9sus propios tonos
cycle_owncycle90—los del cosmético
cyclecycle120—{primary}, {secondary}, {accent}
emberwave280.8los del cosmético
wavewave400.6los del cosmético
sweepwave600.35los del cosmético
glowpulse260.7los del cosmético
pulsepulse400.5los del cosmético
breathepulse900.3los del cosmético
staticflicker101.0los del cosmético
sparkleflicker160.35los del cosmético
flickerflicker200.7los del cosmético

Las dos entradas de paleta son las primeras que hay que mirar. house y cycle están escritas con tokens de paleta en vez de hex, así que siguen el colors.yml de tu servidor: un servidor que repinta su paleta repinta con ella esas dos animaciones, y todos los cosméticos que las lleven.

Cómo se nombra una

animation: va en la entrada que la quiere, en cuatro de los archivos del catálogo.

ArchivoEn
tags.ymluna etiqueta
nick-colors.ymlun color de nick
chat-colors.ymlun color de chat
rank-colors.ymlun color de rango
plugins/ExyliaChatCosmetics/cosmetics/chat-colors.yml
chat_colors:
  aurora:
    category: premium
    name: '{primary}&lAURORA'
    gradient: ['#00f260', '#0575e6', '#8a51c4']
    animation: flow
    icon: END_ROD
    description: 'Northern lights, in a sentence.'
    priority: 2

Los colores de sombra, las fuentes y las decoraciones no nombran ninguna — ahí la clave no se lee. Un cosmético hecho por un jugador lleva ese mismo campo en su fila y se dibuja con él cuando la fila nombra uno, aunque todavía no hay nada en los comandos ni en los menús que lo escriba.

Un id que no existe no es un error y no rompe nada: el cosmético simplemente se dibuja con su propio color, quieto. Lo mismo pasa después de una recarga que quitó una animación que alguna entrada sigue nombrando.

En el chat, una línea es un fotograma

Un mensaje de chat ya entregado no cambia nunca. El cliente se queda con lo que le mandaron, y ningún plugin puede volver atrás a repintarlo. Así que un mensaje lleva el fotograma del momento en que se envió, y "animado" en el chat significa que cada línea es un fotograma distinto del mismo movimiento — no que una línea concreta se mueva.

Los menús son la otra mitad de eso. Los navegadores se redibujan con el reloj, así que una fila que lleva una animación se mueve mientras el jugador la mira, y lo que ve en el menú es lo que la animación hace de verdad. Todo lo que se imprime en el chat, /cc preview incluido, es un fotograma suyo.

Una etiqueta se cachea antes de animarse

Las etiquetas, prefijos y sufijos ya dibujados se guardan por jugador para que una línea de chat no tenga que rehacerlos. Lo que se guarda es la etiqueta antes de aplicarle la animación — guardada después, el fotograma en el que se dibujó la primera vez sería el fotograma que mostrarían todas las líneas siguientes, y el jugador pensaría que la animación se paró.

El reloj

Un solo temporizador para todo el servidor, y su único trabajo es contar.

plugins/ExyliaChatCosmetics/config.yml
animations:
  # Ticks between animation frames. Lower is smoother and costs more
  tick: 2

Un ciclo tiene period / tick fotogramas: flow, con un periodo de 70 y un tick de 2, dura 35 fotogramas.

Nada de una animación es por jugador. Un fotograma es una función de la animación, el color que hay debajo, cuántos caracteres hay y qué fotograma es — así que dos jugadores con la misma etiqueta animada son los mismos colores calculados, y una línea de chat solo lee un array que ya calculó otro. La caché guarda hasta 4096 de esos arrays y se olvida de uno cinco minutos después de la última vez que se leyó. /cca reload la vacía, porque la animación con la que se calculó puede haber cambiado.

Ahí es donde animations.tick se gana su sitio. Subirlo a 4 reduce a la mitad los fotogramas de cada ciclo, lo que reduce a la mitad los arrays a calcular y a la mitad los redibujados de cada menú abierto. Bajarlo a 1 es más suave y cuesta lo contrario.

Los colores de rango animan solo las letras

Cuando rank-colors.repaint vale letters — el valor por defecto — un color de rango animado pasa su fotograma solo por las letras y los dígitos, los mismos caracteres que pinta el color de debajo. Una animación que llegara a los corchetes de &8[&eVIP&8] desharía justo aquello para lo que existe el modo de solo letras.

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