Ragdolls
El cuerpo de un jugador cortado en sus partes y coreografiado: lanzado, bailado, importado de Blockbench o Emotecraft.
Un cuerpo que se deshace, o que se mueve como uno. El jugador se corta en sus seis partes (cabeza, torso, dos brazos, dos piernas), cada una con su propia skin, y esas partes se mueven como una sola coreografía. Puede ser lanzado, abierto, deletreado en letras o llevado, o bailado fotograma a fotograma.
effects:
# Reventado. Las piezas salen hacia fuera, caen, rebotan y se quedan.
- '[RAGDOLL] {victim};intact:0.3;life:2.6;speed:4.2;up:6.4;spin:2.2;detail:2;light:15'
# Levantado, abierto y llevado hacia arriba. No queda nada en el suelo.
- '[RAGDOLL] {victim};pose:vortex;rise:3.0;open:0.7;turns:1.8;life:3.0;detail:2;glow:{highlight}'
# Un saludo importado de Blockbench, con el retraso y la respiración de un cuerpo.
- '[RAGDOLL] {victim};anim:wave;follow:1;breathe:1;rig:tophat'Los ragdolls necesitan PacketEvents, como cualquier display.
A quién lleva
| Cabeza | Cuerpo |
|---|---|
{victim} | La víctima, o el asesino si no hay víctima. La de por defecto. |
{killer} | El asesino, o la víctima si no hay asesino. |
{crowd} | Un espectador que no es ninguno de los dos; seat: elige cuál (0, 1, 2…). |
Si no hay ningún jugador que llevar, la línea lo dice una vez y no dibuja nada. Un plugin puede darle a la
línea un cuerpo propio con SequenceTarget.wearing(model).
Las poses
| Pose | Qué pasa | También se escribe |
|---|---|---|
burst | Reventado: las piezas salen hacia fuera, caen, rebotan y se quedan. La de por defecto. | |
spread | Se levanta del suelo y se abre, brazos y piernas en cruz, girando despacio, y luego se suelta. | starfish, open |
knocked | Abierto como spread y golpeado varias veces desde distintos lados. | knock, batted, hit |
vortex | Llevado: las piezas suben en espiral hacia dentro y desaparecen arriba. | taken, ascend, spiral |
balloon | La cabeza se hincha demasiado, se tambalea y revienta. | bighead, big_head, swell, pop |
helicopter | Los brazos se ponen planos sobre la cabeza como un rotor, el cuerpo gira al revés y se va hacia delante. | chopper, rotor |
plane | Brazos como alas, morro arriba, inclinándose mientras sube. Con subida negativa es un picado. | fly, glide, jet |
flatten | Clavado contra el suelo y dejado plano: una mancha con forma de jugador. | pancake, squash, flat |
melt | Se hunde donde está y desaparece. Ni lanzamiento ni rebote. | sink, dissolve |
sign | Las piezas se colocan formando letras y aguantan ahí, luego caen. | letters, spell, word |
thrown | Enviado a algún sitio de una pieza, dando vueltas. Sin gravedad no vuelve. | launched, ejected, carried, spaced |
animate | Reproduce los fotogramas de keys: o un anim: importado. Se elige sola cuando se escribe cualquiera de los dos. | animated, dance, choreography, keys |
Una pose desconocida reproduce burst.
Sus parámetros
| Parámetro | Qué hace | Por defecto |
|---|---|---|
pose: | Cuál de las doce de arriba. | burst |
life: | Segundos que duran las piezas. | 2.2; ver abajo |
intact: | Segundos que el cuerpo aguanta entero antes de que le pase nada. | 0.3 |
detail: | Lo fino que se corta el cuerpo, de 1 a 5. | 1 |
size: | Cómo de grande es; 1 es tamaño jugador. | 1 |
light: | Nivel de luz, de 0 a 15. | la del mundo |
glow: | Color del contorno: un nombre, #rrggbb o un token {palette}. | ninguno |
fade: | Se encoge al final en vez de desaparecer. | true |
settle: | Deja de girar al aterrizar. | true |
y: | Altura sobre el ancla. | 0 |
face: | Se gira hacia quien lanzó la secuencia. | true |
speed: up: | Con qué velocidad salen las piezas, hacia fuera y hacia arriba. | 3.2 / 6.5 |
spread: | Cuánto se diferencian las piezas entre sí, de 0 a 1. | 0.45 |
gravity: bounce: | Bloques por segundo al cuadrado, y la velocidad que conservan al caer. | 26 / 0.32 |
spin: | Vueltas por segundo. | 1.8 |
rise: open: | A qué altura cuelga un cuerpo sostenido, y cuánto abre las extremidades. | 1.1 / 0.55 |
lift: hang: turns: | Segundos que tarda en subir, segundos que cuelga y vueltas que da mientras cuelga. | 0.45 / 0.9 / 0.35 |
hits: every: force: | Para knocked: cuántos golpes, segundos entre ellos y cuánto lo empuja cada uno. | 3 / 0.32 / 0.85 |
swell: | Para balloon: cuántas veces su tamaño alcanza la cabeza. | 3 |
squash: | Para flatten: qué queda de la altura de una pieza. | 0.14 |
sign: letters: | Para sign: qué deletrea el cuerpo, y cuánto mide una letra en bloques. | EZ / 2.4 |
dir: | Hacia dónde se lanza o vuela, en grados. 0 es este, 90 es sur. | lejos del asesino |
hold: offhand: hat: | Objetos en la mano derecha, en la izquierda y en la cabeza. | ninguno |
hold_size: hat_size: hat_y: | Sus tamaños, y a qué altura va el sombrero. | 0.7 / 0.6 / 0 |
rig: | Props de rigs.yml, separados por comas. | ninguno |
strings: | Hilos de marioneta desde las dos manos y la cabeza hasta esta altura. | 0 |
chains: | Cadenas de las muñecas al suelo, a esta distancia hacia cada lado. | 0 |
snip: | Segundos hasta que se rompen los hilos o las cadenas. | el último fotograma |
Un life: escrito siempre gana. Sin él, un cuerpo en bucle dura cinco minutos como red de seguridad, y
uno coreografiado dura su tiempo entero, sus fotogramas y su final.
La cabeza es siempre una pieza; las otras partes se cortan en columnas y filas según su tamaño. Detalle
1 son seis displays, 2 diecinueve, 3 cincuenta y seis y 4 setenta y tres. 5 es una carcasa: un
bloque por parte con el diseño de la skin en placas sobre cada cara, hasta 120 displays. Un cuerpo que
deletrea se corta como mucho a 4. Dos ya se lee como un cuerpo a cualquier distancia desde la que
alguien lo mire de verdad.
Coreografía: keys:
keys: es un baile escrito fotograma a fotograma, separados por |. Cada fotograma empieza con los
segundos que tarda en llegar a él, y luego una palabra de pose o canales:
effects:
- '[RAGDOLL] {victim};keys:0.25 crouch ease=anticipate | 0.35 stand up=1.6 flip=~-360 elbows=60 ease=out | 0.3 up=0 plant=1 knees=40 ease=bounce | 0.3 stand;then:dissolve;follow:1'| Canal | Qué mueve |
|---|---|
at=r,u,f, right= up= forward= | Las caderas, a la derecha, arriba y adelante. |
flip= turn= lean= | El cuerpo entero alrededor de las caderas. |
head= body= arm_r= arm_l= leg_r= leg_l= arms= legs= | Una articulación, como pitch,yaw,roll. |
<joint>_at=out,up,fwd | Separa una parte de su articulación. |
size=, <joint>_size= | Tamaño del cuerpo o de una parte. |
elbow_r= elbow_l= elbows= knee_r= knee_l= knees= spine= | Dobla una articulación, como ángulo,dirección. |
plant=0..1 | Mantiene los pies en el suelo vayan donde vayan las caderas. |
shake= | Lo sacude. |
ease= | in_out (por defecto), in, out, linear, back, anticipate, elastic, bounce, snap, smooth. |
~ hace un valor relativo: flip=~-360 es una voltereta más. Las palabras de pose son stand, tpose,
star, cheer, reach, zombie, hug, crouch, sit, kneel, lie, prone, bow, pray, dab,
superman, splits, float, limp, fetal, swoon, heart y arabesque; una palabra de pose
deshace todos los dobleces. Un giro de más de 160° por tick se avisa al cargar.
Doblar, plantar y respirar
- Dobleces. Un codo dobla el antebrazo hacia delante, una rodilla la espinilla hacia atrás, la
columna el pecho hacia delante. Una dirección de
90dobla hacia fuera;-90en un codo lo cruza por delante del cuerpo. Un cuerpo que se dobla se corta en al menos dos filas por extremidad, incluso con detalle 1. - Pies plantados. Con
plant=1las piernas se resuelven para llegar al suelo, así que un cuerpo que se hunde dobla las rodillas. Los pies se quedan donde estaban cuandoplantsubió de cero por última vez. - Respiración.
breathe:(de0a3) pone una respiración lenta sobre cada fotograma: la columna, los hombros y la cabeza, una respiración cada 3,4 segundos, ajustada para que un bucle contenga un número entero de ellas. - Inercia.
follow:(de0a3) hace que las articulaciones sueltas vayan con retraso y se pasen:0es exacto,1un cuerpo,2un dibujo animado.
El final: then:
Lo que pasa tras el último fotograma: hold (por defecto), burst, collapse, implode, dissolve
o spell.
Bucles y aceleraciones
| Clave | Qué hace |
|---|---|
loop: | Repite los fotogramas. Avisa si el último fotograma no coincide con el primero; una vuelta entera cuenta como coincidencia. |
loop_from: | Segundos de entrada que se reproducen una vez antes del bucle. |
accel: max_speed: | Cada ciclo esas veces más rápido, hasta el tope: una aceleración progresiva. |
tempo: | Velocidad de reproducción, o un rango 1-1.6 que se tira una vez por reproducción para que una multitud no baile al compás. |
Una cámara que gira con un cuerpo en bucle es su propia línea [CAMERA] en la
secuencia.
Importar animaciones de Blockbench y Emotecraft
plugins/<TuPlugin>/animations/wave.jsonPon el archivo en la carpeta animations del plugin cuya secuencia lo reproduce. Los archivos se leen al
primer uso y otra vez cada vez que cambia la carpeta; no hay nada que recargar.
| Formato | Qué se lee |
|---|---|
| Blockbench (exportación Bedrock o GeckoLib) | Huesos head, torso, body (el cuerpo entero), right_arm, left_arm, right_leg, left_leg, y huesos <parte>_bend para los dobleces. Rotación, posición y escala, con sus curvas. "loop": true hace bucle. |
| Emotecraft | moves por tick, con sus ticks de inicio, fin y parada, y su punto de bucle. |
Un archivo con una sola animación se llama como el archivo (wave.json → wave). Un archivo de
Emotecraft también responde a su name, y cada animación de un archivo de Blockbench a su clave completa
(animation.player.wave) o a su última parte (wave). Los nombres no distinguen mayúsculas. Un archivo
que hace bucle pone loop y loop_from por ti.
Props: rigs.yml
plugins/ExyliaLib/rigs.yml guarda cosas hechas de bloques que un cuerpo lleva puestas, sostiene o
carga. Es el archivo del servidor, no de un plugin, así que cualquier línea [RAGDOLL] del servidor
puede usar cualquier prop: rig:tophat, rig:crown,wand. Viene con tophat, crown, wand y cake.
rigs:
halo:
joint: head
at: 0, 0.25, 0
blocks:
- 'ring GOLD_BLOCK r:0.30 n:18 y:0 s:0.08'| Campo | Qué es |
|---|---|
joint | head, face, chest, hips, hand_r, hand_l, foot_r, foot_l. |
at | Desplazamiento del prop entero respecto a la articulación. |
blocks | at MATERIAL x: y: z: s: un bloque; ring MATERIAL r: n: y: s: un círculo; disc MATERIAL r: y: s: uno relleno. |
Los números van en los ejes de la propia articulación: y sigue la extremidad y z es hacia donde mira
el cuerpo. Un prop se resuelve junto con el cuerpo, así que se queda en la mano durante una rueda. Como
mucho 256 bloques por prop.
Skins reales: ragdoll-skin-quality
Un ragdoll lleva la skin real del jugador sin configurar nada: ni clave ni cuenta. La cabeza es el objeto
de cabeza real del jugador, así que la cara es exacta desde el primer fotograma. El resto del cuerpo se
corta en piezas, y cada pieza se convierte en textura con Exylia Skins, un
servicio gratuito con una caché compartida por todos los servidores. Una pieza que cualquier servidor ya
hizo llega al momento; una nueva se dibuja con bloques del color más parecido hasta que llega. Lo único
que se configura es lo fino que se corta el cuerpo, en plugins/ExyliaLib/config.yml:
ragdoll-skin-quality: normal| Calidad | Piezas por skin | Cómo se ve |
|---|---|---|
high | 18 | Cubos de 4 píxeles; un cuerpo que se rompe sale en 19 piezas. |
normal (por defecto) | 10 | Cada píxel de la skin, exacto; cada parte una caja superior y una inferior, 11 piezas. |
low | 5 | Una cabeza por parte; se pierde un tercio de las filas. |
En cuanto llega cualquiera de sus piezas, un cuerpo con su skin real se corta según esta calidad e ignora
detail:.
- Se hace una vez, para todos. Una pieza se nombra por el hash de sus píxeles y se sube una sola vez.
Una pieza que es entera del color de un bloque se dibuja como ese bloque y nunca se sube. Cada plugin
que muestra cuerpos guarda las piezas que recibió en su propia base de datos (tabla
exylia_ragdoll_skins), así que al reiniciar no pide nada. - Se prepara al entrar. Una skin se prepara cuando entra su dueño. Una skin cambiada en mitad de la
sesión (por ejemplo con
/skinde SkinsRestorer) se vuelve a preparar la siguiente vez que se lee. - Modo offline. Un jugador sin skin lleva la skin por defecto que el juego da a su UUID (Steve, Alex y las demás skins por defecto, anchas o finas).
- Nunca se espera. Una pieza cuya textura aún no ha llegado se dibuja con bloques hasta que llega.
- Se aplica en caliente.
/exylialib reloadlee la calidad, y un cambio vuelve a preparar las skins de todos los conectados.
Las versiones anteriores necesitaban una mineskin-key. Ya no se lee: el siguiente arranque la quita del
config.yml, como hace con cualquier clave que el archivo ya no tiene.
La API
PluginRagdolls ragdolls = Ragdolls.of(this);
RagdollAnimation hop = RagdollAnimation.parse(
"0.25 crouch ease=anticipate | 0.35 stand up=1.6 flip=~-360 | 0.3 up=0 plant=1 knees=40 ease=bounce",
problem -> getLogger().warning(problem));
RagdollMotion dance = RagdollMotion.builder()
.pose(RagdollPose.ANIMATE)
.animation(hop)
.finish(RagdollFinish.DISSOLVE)
.follow(1).breathe(1)
.tempo(1.0, 1.3)
.build();
RagdollProp crown = Rigs.get("crown");
RagdollModel body = RagdollModel.of(victim).detail(2).light(15)
.rigs(crown == null ? List.of() : List.of(crown));
RagdollHandle handle = ragdolls.show(body, dance, victim.getLocation(), viewers);| Tipo | Qué da |
|---|---|
RagdollModel | of(player), ofTexture(base64), ofAccount(name) (un future que cae a la skin por defecto), of(RagdollSkin.flat(colores), cabeza) para un cuerpo que no es un jugador. Luego detail, scale, glow, light, carrying(main, off, hat), rigs. |
RagdollMotion.builder() | Cada clave de la línea como método: pose, animation, finish, loop, loopFrom, winding, tempo, follow, breathe, strings, chains, life, speed, gravity… |
RagdollAnimations | find(pluginName, name) para un archivo importado; read(json, file, problems) para leer uno sin servidor. |
RagdollHandle | remove(), settle(millis) para ponerlo de pie y que se vaya, isShowing(), pieces(). |
Rigs | get(id), ids(). |
ragdolls.show resuelve el vuelo entero antes de volver. Aquí no se simula nada ni se tickea nada: cada
pose se calcula de antemano y se le entrega al cliente.
¿Falta algo en esta página? Dínoslo en Discord