Salida del Resource Pack de FreeMinecraftModels
Actualmente FreeMinecraftModels escribe su pack generado en output, no en outputs.
Rutas de Salida Predeterminadas
El plugin reconstruye esta carpeta durante el inicio y con /fmm reload:
plugins/FreeMinecraftModels/output/FreeMinecraftModels
Luego comprime esa carpeta en:
plugins/FreeMinecraftModels/output/FreeMinecraftModels.zip
Esa ruta zip es la que ResourcePackManager espera cuando se integra con FreeMinecraftModels.
Qué se Genera
La carpeta generada siempre incluye:
pack.mcmetapack.pngassets/minecraft/atlases/blocks.jsonassets/freeminecraftmodels/...salida de modelos y texturas
Para Minecraft 1.21.4+, FreeMinecraftModels genera archivos de definición de item-model bajo:
assets/freeminecraftmodels/items
Para servidores más antiguos, recurre a la ruta heredada del modelo override de leather-horse-armor.
Salida del Modelo de Visualización (1.21.4+)
Cuando un modelo tiene un archivo .json hermano de modelo de visualización (consulta Notas de Creación de Modelos), FMM copia ese JSON (con las referencias de textura reescritas para coincidir con las texturas extraídas) en:
assets/freeminecraftmodels/models/display/{modelId}.json
También genera una definición de item correspondiente en:
assets/freeminecraftmodels/items/display/{modelId}.json
El DisplayModelRegistry rastrea qué modelos tienen JSONs de display en runtime para que ItemMeta.setItemModel() pueda ser llamado en ItemStacks para darles la apariencia correcta en la mano y en el inventario.
Paquete de Entidades Personalizadas de Bedrock
Junto a los assets del pack de Java, FreeMinecraftModels exporta un paquete de entidades personalizadas de Bedrock para cada modelo convertido en:
plugins/FreeMinecraftModels/output/FreeMinecraftModels/assets/freeminecraftmodels/rspm_bedrock_pack
Cada modelo aporta sus texturas, geometría, render controller, animaciones, animation controllers y definición de entidad, todo bajo el namespace freeminecraftmodels: (freeminecraftmodels:<model_id>).
Notas que importan al crear modelos:
- Un modelo sin texturas se omite, con
Skipping Bedrock custom entity export for <id>: model has no textures.en la consola - La geometría Bedrock excluye los huesos de montura (
m_), los de etiquetas generados (fmm_nametag_bone_*) yhitbox. Los anclajestag_creados por el autor permanecen, a menudo sin cubos. - Un modelo sin animaciones exporta igualmente una única ranura de animación
idle - El ancho/alto del hitbox en runtime para la entidad de Bedrock provienen del hueso
hitboxdel modelo; sin él recae en1.0x2.0
El backend Bedrock necesita un plugin activo llamado floodgate, Geyser-Spigot o Geyser. La comparación ignora mayúsculas, pero no acepta otros nombres. En un servidor solo Java, FMM sigue exportando el paquete, pero no crea ni ejecuta ese backend.
Salida Condicional de Item para Arco y Ballesta
Cuando FMM detecta un conjunto de modelos de estado de arco o ballesta (consulta Notas de Creación de Modelos), genera una única definición de item JSON para el modelo _idle que conmuta condicionalmente entre todos los estados a nivel de resource pack. No se necesita trabajo de paquetes del lado del servidor -- el cliente maneja las transiciones de estado de forma nativa.
Salida de Arco
Para arcos, la definición de item generada usa minecraft:condition sobre using_item con un minecraft:range_dispatch sobre use_duration (escala 0.05):
| Condición | Modelo usado |
|---|---|
| No usando el objeto | _idle |
| Usando, fallback (recién iniciado) | _draw_start |
Usando, umbral 0.65 | _draw_half |
Usando, umbral 0.9 | _draw_full |
Salida de Ballesta
Para ballestas, la definición de item generada usa minecraft:select sobre charge_type. Cuando está cargada (flecha o cohete), muestra el modelo _charged. El fallback sin cargar usa minecraft:range_dispatch sobre crossbow/pull:
| Condición | Modelo usado |
|---|---|
| No usando, no cargada | _idle |
| Usando, fallback (recién iniciado) | _draw_start |
Usando, umbral 0.58 | _draw_half |
Usando, umbral 1.0 | _draw_full |
| Cargada (flecha o cohete) | _charged |
Ubicación de Salida
La definición condicional de item generada se escribe junto a las demás definiciones de item en:
assets/freeminecraftmodels/items/display/{baseModelId}_idle.json
Solo el modelo _idle obtiene un archivo de definición de item. Los modelos de draw y charged se referencian dentro de él como entradas condicionales.
Correcciones de Compatibilidad para Minecraft 26.1+
El generador de packs aplica dos correcciones de compatibilidad automáticas para Minecraft 26.1 y posterior:
- Clamping de UV: las UV de las caras se clampean a los propios límites de píxeles de la textura de origen (
0–textureWidth/0–textureHeight) antes de reescalarse al espacio UV de 16x16 de Minecraft. Algunos autores de.bbmodeldejan UVs negativas o excesivas en las caras — se redimensionó un atlas, el autouv se pasó del borde, etc. — que el validador más estricto de 26.1 rechaza. El clamping permite que el modelo se compile; una cara con UV fuera de rango pierde como mucho unos pocos píxeles de detalle de textura. - Los huesos vacíos y los que solo son anclajes se omiten: un hueso sin cubos no escribe ningún JSON de geometría, así que escribir una definición de item model para él dejaría una referencia colgante. 1.21.x lo toleraba en silencio; 26.1+ registra cada caso como
Missing block model: freeminecraftmodels:.... El generador ahora omite tanto el archivo de geometría como la definición de item para esos huesos. Esto también cubre los huesoshitbox(solo colisión), los anclajes posicionalestag_name, las variantesfmm_nametag_bone_*autogeneradas de FMM y los huesos puramente envolventes o de anclaje.
Estas correcciones se aplican automáticamente; no se requiere configuración.
Omitir esos huesos es la razón por la que un hueso de nametag tag_ nunca necesita cubos — es un anclaje posicional, y el generador deliberadamente no escribe nada para él. Consulta Los nametags requieren un hueso tag_.
Salida Determinista
El pack generado es estable a nivel de bytes: regenerarlo a partir de modelos sin cambios produce un zip idéntico y, por tanto, un SHA1 idéntico.
Esto importa porque ResourcePackManager omite volver a subir un pack cuyo SHA1 ya coincide con lo que tiene el host remoto. Si los bytes cambian sin motivo, esa comprobación nunca coincide, RSPM vuelve a subir en cada reinicio, y todos los jugadores vuelven a descargar un pack cuyo contenido no cambió.
Dos puntos del generador escriben JSON directamente a disco, así que el orden de iteración de sus mapas es el orden de bytes del archivo:
- las definiciones de item model por hueso bajo
assets/freeminecraftmodels/items - el bloque
displaydel JSON de modelo por hueso bajoassets/freeminecraftmodels/models
Ambos usan ahora mapas que conservan el orden de inserción. Antes usaban Map.of, que se apoya en java.util.ImmutableCollections — eso siembra una sal aleatoria por JVM y sondea desde un índice dependiente de la sal, de modo que el mismo puñado de claves salía en un orden distinto en cada arranque del servidor. Claves como translation / scale, y type / index / default, intercambiaban posiciones en cada arranque, reescribiendo cada definición de item y cada archivo de modelo sin ningún motivo.
Si antes veías que los jugadores volvían a descargar el resource pack después de cada reinicio aunque no hubieras cambiado nada, esta era la razón.
El determinismo solo se mantiene si tu conjunto de modelos no cambia. Añadir, eliminar, renombrar o editar un modelo cambia legítimamente los bytes del pack y debe provocar una nueva subida.
Comportamiento de Recarga
Cuando FreeMinecraftModels se recarga:
- vuelve a ejecutar el paso de import de contenido
- reconstruye la carpeta
output/FreeMinecraftModels - regenera
output/FreeMinecraftModels.zip - despacha
resourcepackmanager reloadsi ResourcePackManager está instalado
Por esto las configuraciones modernas de FMM + ResourcePackManager ya no necesitan el viejo flujo manual de copiar el zip.
Una recarga correcta emite FmmReloadedEvent después de reconstruir el contenido. La exportación Bedrock valida antes los modelos y omite entidades sin texturas en lugar de publicar geometría incompleta.