Saltar al contenido principal

Disfraces de Jugador

FreeMinecraftModels puede disfrazar a cualquier jugador conectado como un modelo cargado. Los disfraces se controlan mediante comandos, una DisguiseAPI pública y una PlayerDisguiseEntity por jugador que gestiona la invisibilidad y el renderizado del modelo para el jugador disfrazado.

Comandos

ComandoPermisoNotas
/fmm disguise <modelID>freeminecraftmodels.disguise.selfDisfraza al emisor. Solo para jugadores
/fmm disguise <modelID> <player>freeminecraftmodels.disguise.othersDisfraza al jugador indicado. Funciona desde consola
/fmm undisguisefreeminecraftmodels.disguise.selfElimina el disfraz del emisor. Solo para jugadores
/fmm undisguise <player>freeminecraftmodels.disguise.othersElimina el disfraz del jugador indicado. Funciona desde consola
/fmm disguiselistfreeminecraftmodels.disguise.othersLista todos los jugadores disfrazados y el modelo bajo el que está disfrazado cada uno

El comodín freeminecraftmodels.* otorga admin, deleteall, disguise.self y disguise.others con valor predeterminado OP. También otorga el permiso freeminecraftmodels.bypassregionprotection, que se registra por separado.

Comportamiento

  • Disfrazar a un jugador que ya está disfrazado reemplaza limpiamente el disfraz previo — no es necesario quitarlo antes.
  • El jugador disfrazado se vuelve invisible para los demás jugadores de modo que solo se ve el modelo. El jugador disfrazado se sigue viendo a sí mismo normalmente.
  • La invisibilidad persiste a través de cubos de leche, /effect clear, clears de efectos por baliza, la muerte y el respawn, y cualquier otra interacción o plugin que normalmente eliminaría el efecto (se vuelve a aplicar en el siguiente tick mediante DisguiseEffectListener).
  • La hitbox del jugador no cambia. El targeting de mobs, la colisión y el PvP funcionan como siempre.
  • Los disfraces no sobreviven a un reinicio del servidor, a un /fmm reload ni a que el jugador se desconecte: se rastrean en memoria y el manejador DisguiseListeners.onQuit elimina el disfraz con PlayerQuitEvent. La muerte y los cambios de mundo no quitan el disfraz.
  • Con /fmm reload, todos los disfraces activos se derriban como parte del shutdown del plugin. Los jugadores deben volver a disfrazarse tras una recarga.

Animaciones de Disfraz

Los disfraces no usan la máquina de estados de animación normal de las entidades modeladas. Cada disfraz recibe su propio controlador, que lee al jugador disfrazado en cada tick y elige una animación por nombre.

Se reconocen cinco nombres de animación reservados, en este orden de prioridad (de mayor a menor):

PrioridadAnimaciónTipoSe activa con
1attackun solo usoEl jugador mueve el brazo
2jumpun solo usoEl jugador deja el suelo moviéndose hacia arriba
3sneakbucleEl jugador está agachado
4walkbucleEl jugador se movió más de ~0,01 bloques desde el último tick
5idlebucleNo se aplica nada más

Comportamientos que conviene conocer:

  • Solo se consideran las animaciones que el modelo tiene realmente. Un modelo sin animación sneak simplemente pasa a walk o a idle.

  • Una animación de un solo uso interrumpe el bucle actual y suprime las animaciones de menor prioridad durante 20 ticks (1 segundo) fijos. El sistema de animación no expone ningún callback de finalización, así que ese valor es un límite superior asumido y no la duración real: mantén las animaciones attack y jump en un segundo o menos si quieres un retorno limpio al bucle.

  • Los bucles solo se vuelven a emitir cuando la animación elegida cambia de verdad, así que un caminar continuo no se reinicia en cada tick.

  • jump sí está realmente conectado para los disfraces, a diferencia del estado de salto (actualmente inerte) de las entidades modeladas normales. Consulta Animaciones.

  • Un modelo de disfraz sin animación idle registra un aviso cada vez que se aplica el disfraz:

    Disguise model '<model>' has no 'idle' animation — disguised players using this model will freeze on the last animation frame whenever no other action is active.

    Incluye una animación idle en cualquier modelo que pienses usar como disfraz.

Clientes Bedrock

Los disfraces dependen de que FMM renderice el modelo personalizado. El valor predeterminado sendCustomModelsToBedrockClientsV2: true en config.yml habilita el envío de modelos a Bedrock desde el principio; si lo pones en false (o arrastras el antiguo sendCustomModelsToBedrockClients: false), los jugadores Bedrock no verán ni el modelo ni al jugador invisible subyacente — efectivamente, no verán nada donde está el jugador disfrazado. Incluso con la opción activada, sigues necesitando una cadena de resource pack compatible con Bedrock (Floodgate + Geyser + resource pack convertido) para que el modelo se renderice.

DisguiseAPI

Los plugins de terceros pueden controlar disfraces programáticamente a través de com.magmaguy.freeminecraftmodels.api.DisguiseAPI.

import com.magmaguy.freeminecraftmodels.api.DisguiseAPI;

// Disfrazar (devuelve false si el ID del modelo no está cargado)
boolean ok = DisguiseAPI.disguise(player, "dragon");

// Quitar el disfraz (devuelve true si se eliminó un disfraz)
DisguiseAPI.undisguise(player);

// Consultas
boolean isDisguised = DisguiseAPI.isDisguised(player);
String modelID = DisguiseAPI.getDisguiseModelID(player); // null si no está disfrazado

// Snapshot inmutable de todos los jugadores disfrazados
Collection<Player> all = DisguiseAPI.getDisguisedPlayers();

La API es el punto de entrada público y seguro frente a refactorizaciones. Los plugins deben llamar a DisguiseAPI en lugar del DisguiseManager interno.

Casos de Uso Comunes

  • Servidores de rol y RPG: disfrazar jugadores como modelos de jefes para cinemáticas o scripts de misiones.
  • Hosting de eventos: disfrazar a un anunciador como un modelo personalizado gigante.
  • Monturas y vehículos: combinar /fmm mount con /fmm disguise para configuraciones creativas de transporte.
  • Integración con EliteMobs: los scripts de jefe pueden disfrazar al jugador que desencadenó un evento para un efecto temporal de transformación.

Solución de Problemas

No pasa nada cuando ejecuto /fmm disguise dragon. El ID del modelo debe coincidir exactamente con un modelo cargado. Consulta /fmm admin o el autocompletado del comando para verificar el nombre del modelo. La variante con jugador objetivo comprueba freeminecraftmodels.disguise.others antes de resolver el modelo o el jugador, e informa directamente de ese permiso faltante.

Mi disfraz desapareció después de /fmm reload. Esperado. Todos los disfraces se derriban en la recarga. Escucha FmmReloadedEvent si necesitas reaplicar los disfraces automáticamente.

Los jugadores Bedrock no pueden ver el disfraz. Consulta Clientes Bedrock más arriba.

El jugador disfrazado sigue siendo visible para los demás. La invisibilidad se aplica como un efecto a nivel de paquete. Si otro plugin está eliminando la invisibilidad de forma forzada cada tick (algunos plugins anti-cheat hacen esto), puede entrar en conflicto con la reaplicación de FMM. Pon a FMM en lista blanca o deshabilita la comprobación conflictiva.