Notes de création de modèles FreeMinecraftModels
Ces notes décrivent les fichiers de modèles, leurs fichiers associés et les noms que FreeMinecraftModels lit à l'importation et à l'exécution.
Formats sources
FreeMinecraftModels accepte actuellement :
- les fichiers
.bbmodelpour les importations de sources éditables - les fichiers
.fmmodelpour les données de modèle prêtes à l'exécution et allégées
Pour un .bbmodel isolé sans fichiers associés :
- placez-le directement dans
plugins/FreeMinecraftModels/imports, avec l'extension.bbmodelen minuscules - exécutez
/fmm reload - vérifiez que sa conversion
.fmmodelapparaît dans le dossier de modèles actif et que le rechargement réussit
L'importateur de fichiers isolés laisse l'original dans imports, donc les importations suivantes le convertissent à nouveau. Il ne récupère pas les fichiers .json ou .yml associés et n'accepte pas de .fmmodel isolé. Pour vos ensembles de modèles, conservez modèles et fichiers associés ensemble dans le dossier models actif, ou utilisez un paquet de contenu correctement structuré. Un sous-dossier quelconque d'imports sans pack.meta est ignoré. Un rechargement rejeté peut laisser l'ancien catalogue actif ; vérifiez la console.
La conversion des fichiers isolés ne conserve que source, id et name pour les textures, en supprimant les métadonnées de dimensions et de durée d'animation. Elle exige aussi un tableau textures. Lorsque ces métadonnées comptent, utilisez le dossier de modèles actif ou un paquet qui préserve le fichier d'origine ; le lecteur de modèles à l'exécution accepte, lui, l'absence du tableau de textures.
Rôles des dossiers
plugins/FreeMinecraftModels/imports
plugins/FreeMinecraftModels/models
plugins/FreeMinecraftModels/models_disabled
importsest le dossier de réception pour les importations manuelles de modèles et les téléchargements de packs officiels avant traitementmodelscontient le contenu des modèles installés et actifsmodels_disabledcontient le contenu des packs téléchargés ou installés qui sont actuellement désactivés
Les anciennes installations peuvent posséder un dossier Models avec une majuscule. À l'exécution, FreeMinecraftModels préfère models en minuscules s'il existe et utilise Models sinon. Sur un système de fichiers insensible à la casse, les deux noms désignent le même dossier. Sur un système sensible à la casse, ils peuvent coexister : l'importateur partagé de paquets préfère alors une destination Models existante, tandis que le moteur lit models. Sauvegardez leur contenu et regroupez-le dans models en minuscules pendant que le serveur est arrêté, pour éviter d'importer des fichiers hors de l'arborescence active.
Identifiants de modèles
- Les identifiants de modèles à l'exécution proviennent du nom de fichier, sans l'extension
.bbmodelou.fmmodel - Utilisez des noms de fichiers stables et uniques car l'identifiant est ce que les commandes et les appels API résolvent
- Les références d'animation Blockbench sont basées sur les noms, donc un nommage dupliqué ou peu clair à l'intérieur du modèle est plus susceptible de causer des problèmes qu'un schéma de nommage propre et explicite
- Dans le dossier de modèles actif, la comparaison des extensions ignore la casse :
.BBModelet.FMModelsont acceptés. L'importation de fichiers isolés depuisimportsne reconnaît que.bbmodelen minuscules
Normalisation des identifiants et collisions
Le nom de fichier est normalisé avant de devenir l'identifiant de modèle à l'exécution et le nom de fichier dans le resource pack :
- mis en minuscules
- chaque caractère hors de
a-z,0-9,.,_et-est remplacé par_
Ainsi, My Table.bbmodel, my table.bbmodel et my_table.bbmodel se normalisent tous en un même identifiant, my_table.
Avant toute conversion, FreeMinecraftModels balaie l'ensemble de l'arborescence des modèles et recherche les fichiers qui se normalisent vers le même identifiant. Lorsque tous les fichiers portant cet identifiant sont identiques octet par octet, comme lorsque deux packs de contenu fournissent le même modèle, FMM charge celui dont le chemin absolu arrive en premier dans l'ordre de tri et ignore les copies sans avertissement. Lorsque les fichiers diffèrent :
- tous les fichiers en collision sont rejetés — aucun n'est chargé, il n'y a donc pas de « le dernier l'emporte » silencieux
- l'identifiant de modèle est bloqué pour le reste de cette passe de chargement
- les modèles rejetés sont également exclus de l'export du bundle d'entités personnalisées Bedrock
- la console reçoit :
[FMM Models] Rejected normalized model ID collision '<id>'. These files normalize to the same ID: <paths>. Rename the files so every normalized model ID is unique; no colliding model was loaded.
La correction consiste toujours à renommer les fichiers pour que les identifiants normalisés soient distincts. La meilleure habitude est de nommer les fichiers de modèles en minuscules avec des underscores dès le départ (stone_table.bbmodel), ce qui rend le nom de fichier et l'identifiant d'exécution identiques et supprime tout risque de collision surprise.
Compatibilité Blockbench
- FreeMinecraftModels lit
meta.format_versiondans le.bbmodelet se branche sur son numéro majeur - Un bloc
metaabsent, unformat_versionabsent, ou une valeur qu'il ne peut pas analyser retombent tous sur la version4, avec une ligne d'information ou d'avertissement nommant le modèle - Un tableau
texturesabsent est accepté et traité comme une liste de textures vide au lieu de faire planter l'importateur. L'exportateur d'entités personnalisées Bedrock ignore ensuite ce modèle, car l'export Bedrock exige au moins une texture - Les noms de fichiers de textures extraites sont normalisés vers une seule extension
.png. Un nom source tel quebody.jpg,body.PNGoubodyest écrit et référencé sous la formebody.png format_version4.xet antérieur : les os sont lus directement dans l'arbreoutliner, qui porte les noms d'os en ligneformat_version5.xet ultérieur : le schéma de l'outliner a changé.outlinerest désormais un arbre imbriqué de simples chaînes UUID et de dictionnaires{uuid, isOpen, children}sans clé de nom, tandis qu'un tableau platgroupsdistinct contient les véritables données d'os (dontname). FMM joint les deux par UUID — chaque nœud de l'outliner est remplacé par son entréegroupscorrespondante, puis les enfants sont fusionnés récursivement — de sorte que les noms d'os, origines et rotations se résolvent normalement- Conséquences à connaître lorsque vous éditez ou générez des fichiers
.bbmodelà la main :- Un fichier v5 sans tableau
groupsest transmis sans fusion. Un outliner déjà fusionné peut fonctionner ; des nœuds de groupe v5 bruts sans nom peuvent faire échouer le chargement lorsque le lecteur du squelette attend un nom - Les UUID doivent correspondre exactement entre
outlineretgroups; un nœud d'outliner sans groupe correspondant est conservé tel quel plutôt que supprimé - Ne mélangez pas un
format_versionv5 avec un outliner de forme v4, ni l'inverse — la branche est choisie d'après la version déclarée, pas d'après la forme réelle
- Un fichier v5 sans tableau
- Si les journaux d'importation indiquent que le format du modèle n'est pas compatible avec FreeMinecraftModels, traitez cela comme un problème de format de modèle d'abord, pas comme un problème de wiki ou de commande
Conventions de nommage des os ayant un effet à l'exécution
Le convertisseur actuel et le pipeline de squelette reconnaissent quelques conventions de nommage :
hitbox- réservé à la génération de hitbox
- doit définir proprement la hitbox du modèle au lieu d'être utilisé comme un os visuel
- doit être un os de premier niveau dans l'outliner pour définir les collisions à l'exécution. Un
hitboximbriqué suit l'analyse ordinaire des os, mais reste masqué et ne définit pas la hitbox du modèle - doit contenir exactement un cube, qui définit la largeur (x), la profondeur (z) et la hauteur (y). Les cubes supplémentaires journalisent
has more than one value defining a hitbox! Only the first cube will be used. Un groupe vide journalisehas a hitbox bone but no hitbox cube!et laisse des dimensions nulles ; ce n'est pas équivalent à une hitbox absente. Les décalages et rotations du cube ne deviennent pas un décalage de hitbox : le lecteur utilise les longueurs absolues des côtés et un décalage de modèle nul - jamais animé (les pistes d'animation ciblant
hitboxsont ignorées), jamais rendu, et exclu de l'export de géométrie Bedrock. Sur Bedrock, un modèle sans oshitboxretombe sur1.0x2.0
tag_...- ancrage facultatif de plaque de nom créé par l'auteur. Consultez la position des plaques de nom ci-dessous
h_...- traité comme des os de tête
b_...- os sans affichage dans le moteur Java. Utilisez des os sans cubes pour la structure : l'export de géométrie Bedrock ne filtre pas le préfixe
b_, donc leurs cubes peuvent y rester visibles
- os sans affichage dans le moteur Java. Utilisez des os sans cubes pour la structure : l'export de géométrie Bedrock ne filtre pas le préfixe
m_...- os de point de montage. Chaque os avec ce préfixe crée un siège pour un joueur, géré par
MountPointManager. Plusieurs osm_créent plusieurs sièges. Le gestionnaire choisit le premier siège libre et utilise une entité Interaction temporaire pendant son occupation ; sa méthode publique de montage accepte des joueurs, pas des entités quelconques.
- os de point de montage. Chaque os avec ce préfixe crée un siège pour un joueur, géré par
Les préfixes sont sensibles à la casse ; le nom hitbox est comparé sans tenir compte de la casse. Ces noms influencent la conversion et le comportement à l'exécution.
Position des plaques de nom
Un os tag_ est désormais facultatif. FMM choisit comme ancrage le premier os tag_ par ordre alphabétique. S'il n'y en a aucun, la plaque de nom est placée au-dessus de la hitbox mise à l'échelle : un modèle sans cet os peut donc afficher son nom.
Utilisez un os tag_name sans cube si cette position de repli ne convient pas. Plusieurs os de nom ne produisent plus plusieurs copies de la même plaque.
L'API prend en charge les noms sur plusieurs lignes, l'échelle, l'espacement des lignes et la visibilité. Les lignes sont ordonnées du haut vers le bas, la dernière se trouvant à l'ancrage. Consultez le guide de l'API.
Ombrage des cubes et émission de lumière
- La valeur
light_emissiond'un cube définie dans Blockbench est conservée lorsqu'il s'agit d'un nombre entier de0à15. Toute autre valeur est ignorée avec un avertissement console se terminant parwith invalid light_emission. Expected an integer from 0 to 15; ignoring this value. - Un cube dont l'ombrage est désactivé (
shade: false) reçoit aussishade_direction_override: "up"dans la géométrie générée, afin que les clients Minecraft 26.3 l'affichent sans ombrage comme les clients plus anciens. FMM applique la même règle aux cubes d'un modèle d'affichage.jsonvoisin. Une valeur que vous avez définie vous-même est conservée
Cubes sans groupe
Les cubes déclarés en haut de l'outliner sans groupe conteneur arrivent sous forme de simples chaînes UUID plutôt que d'entrées d'os. FreeMinecraftModels les rattache à l'os racine auto-généré (freeminecraftmodels_autogenerated_root) afin qu'ils s'affichent quand même. Ils ne sont pas adressables par les animations : placez donc tout ce que vous comptez animer à l'intérieur d'un vrai groupe.
IK, objets nuls et locators
Le code actuel confirme le support de :
- les objets nuls de Blockbench en tant que contrôleurs IK
- les plans de chaînes IK et la résolution IK à l'exécution (FABRIK)
- l'analyse des locators. Les locators peuvent aussi servir d'ancrage aux effets de particules Blockbench ; voir Particules
Un objet nul ne devient un contrôleur IK que si son entrée .bbmodel porte à la fois ik_source (os source) et ik_target (os ou locator cible). L'importateur recherche dans la hiérarchie, y compris entre éléments frères et vers les descendants. Des éléments frères à la racine produisent une chaîne limitée à la source. lock_ik_target_rotation est lu et conservé, mais le solveur actuel ne l'applique pas.
Contraintes pratiques importantes :
- Le lien source/cible se fait par UUID, il survit donc aux renommages — mais si l'un des UUID est absent du modèle, la console journalise
IK chain in model <model>: Could not find source bone with UUID .../Could not find target with UUID ...et cette chaîne est ignorée - Si le parcours ne trouve aucun chemin de la source vers la cible, vous obtenez
Could not find path from source to targetet la chaîne est ignorée - La recherche d'animation pour un contrôleur est basée sur les noms, donc le nommage des contrôleurs doit rester stable entre la structure du modèle et les données d'animation
- Seules les images clés de position pilotent l'IK. Leur décalage s'ajoute à la position de repos de l'os ou du locator cible, et non à celle du contrôleur conservée en mémoire. Les pistes de rotation et d'échelle ne pilotent pas l'IK
Voir Animations pour savoir comment l'IK est pilotée image par image.
Organisation de la sortie en 1.21.4+
FreeMinecraftModels déclare api-version: 1.21.4, donc 1.21.4 est la version minimale du serveur et la disposition moderne des définitions de modèles d'objets est celle que vous obtiendrez toujours :
plugins/FreeMinecraftModels/output/FreeMinecraftModels/assets/freeminecraftmodels/items
Les branches héritées (antérieures à 1.21.4) basées sur les overrides d'armure de cheval en cuir existent toujours dans le code, mais aucun serveur capable de charger le plugin actuel ne les atteint. Si vous lisez d'anciennes notes ou consultez un ancien dossier de sortie, c'est la différence que vous constatez.
JSON de modèle d'affichage (1.21.4+)
Les administrateurs peuvent placer un fichier .json adjacent à un fichier .bbmodel ou .fmmodel avec le même nom de base (par exemple, table.bbmodel + table.json). Ce JSON doit être exporté depuis Blockbench en tant que modèle "Java Block/Item" et définit l'apparence de l'objet lorsqu'il est tenu en main ou affiché dans l'inventaire.
FMM lit le JSON voisin du modèle actif, le copie dans le resource pack et réécrit les valeurs sans espace de noms de sa table textures. Les clés numériques correspondent aux indices des textures extraites ; une clé sans correspondance utilise une texture disponible, s'il y en a une. Les valeurs avec espace de noms restent inchangées. Sans JSON voisin, l'objet utilise l'apparence de son matériau de base : généralement du papier pour placer un prop, ou le matériau configuré pour un objet tenu. Un fichier associé mal formé journalise Failed to process display model JSON for ... et ce modèle d'affichage n'est pas enregistré.
Configuration d'un objet personnalisé en YML
Définissez material dans le YAML voisin du modèle pour enregistrer un objet tenu :
isEnabled: true
material: DIAMOND_SWORD
name: "&6Flame Blade"
lore:
- "&7A blade with a fire enchantment"
enchantments:
- "minecraft:fire_aspect,2"
Utilisez des identifiants d'enchantements en minuscules avec espace de noms. Les matériaux en cuir acceptent un suffixe de teinture RVB tel que LEATHER_CHESTPLATE:ff8800 ; voir Configuration. Un objet dont le matériau n'est pas pris en charge, qui contient un enchantement sans espace de noms ou une liste scripts: non vide est indisponible. La console explique pourquoi et le fichier d'origine est conservé. scripts: reste réservé aux props.
D'autres définitions invalides, comme un isEnabled non booléen, des entrées d'enchantement mal formées, des enchantements en double ou un nom de fichier d'objet invalide, peuvent faire rejeter le catalogue candidat et le rechargement. Utilisez des noms de fichiers d'objets en minuscules, composés uniquement de a-z, 0-9, ., _ et -, sur 128 caractères au maximum. La recherche d'objets personnalisés lit .yml, pas .yaml. Obtenez un objet enregistré avec /fmm giveitem <item> ou le navigateur d'administration ; les recettes de props et les achats en boutique produisent des objets en papier pour le placement.
Les effets des objets appartiennent désormais aux définitions d'enchantements. Les baguettes et les bâtons utilisent la configuration des armes magiques. Aucun de ces systèmes n'utilise l'ancien moteur Lua d'objets équipés.
Notes sur Bedrock et le rendu
- Le support de Bedrock dépend de
sendCustomModelsToBedrockClientsV2(valeur par défauttrue; remplace l'ancienne clésendCustomModelsToBedrockClients) et du chemin Floodgate/Geyser/resource pack environnant - Les clients Java sur les versions supportées peuvent utiliser le rendu par display entities lorsque
useDisplayEntitiesWhenPossibleest activé - Ne supposez pas qu'un modèle qui apparaît correctement sur un client Java est automatiquement sûr pour votre chemin Bedrock
Conseils pratiques de création
- gardez les noms de fichiers stables car ils deviennent des identifiants d'exécution
- gardez le nommage des contrôleurs et des animations explicite car la recherche d'animations Blockbench est pilotée par les noms
- utilisez les noms d'os virtuels réservés à bon escient (
hitbox,tag_,h_,b_,m_). Ajoutez un ancragetag_seulement si la position de repli au-dessus de la hitbox ne convient pas - utilisez
spawn,idle,walk,attacketdeathen minuscules pour les états partagés ; attaque et mort nécessitent toujours leur déclencheur à l'exécution, et les autres noms exigent une lecture explicite (voir Animations) - un modèle destiné à
/fmm disguisedevrait au minimum fournir aussiidle, et peut ajoutersneaketjump, que seul le contrôleur de déguisement reconnaît (voir Déguisements des joueurs) - validez la sortie importée après
/fmm reload, pas seulement dans Blockbench - vérifiez le contenu du pack généré pour votre ligne Minecraft cible, surtout sur
1.21.4+
Modèles d'état d'arc et d'arbalète
FMM détecte automatiquement les états d'affichage des arcs et arbalètes pendant la génération du resource pack. Chaque état requis nécessite un modèle chargé et un .json d'affichage voisin traité avec succès ; les noms de fichiers seuls ne suffisent pas. Configurez l'objet tenu sous son nom de base avec le matériau BOW ou CROSSBOW approprié.
Convention de nommage
| Suffixe | Objectif | Arc | Arbalète |
|---|---|---|---|
_idle | Objet en main, pas en train de tirer ou chargé | requis | requis |
_draw_start | Vient de commencer à tirer | requis | requis |
_draw_half | À moitié tiré | requis | requis |
_draw_full | Complètement tiré | requis | requis |
_charged | Arbalète chargée (flèche ou fusée) | -- | requis |
Un arc nécessite quatre modèles (tous sauf _charged). Une arbalète nécessite les cinq.
Exemple d'organisation des fichiers
plugins/FreeMinecraftModels/models/my_weapons/
cool_bow_idle.bbmodel
cool_bow_idle.json
cool_bow_draw_start.bbmodel
cool_bow_draw_start.json
cool_bow_draw_half.bbmodel
cool_bow_draw_half.json
cool_bow_draw_full.bbmodel
cool_bow_draw_full.json
cool_bow.yml
Pour une arbalète, ajoutez aussi cool_bow_charged.bbmodel et cool_bow_charged.json. La configuration de l'objet est cool_bow.yml, avec le nom de base sans _idle.
Fonctionnement de la détection
- La détection se fait automatiquement lorsque le resource pack est généré (au démarrage ou lors de
/fmm reload). - Un ensemble complet d'états d'affichage reçoit une définition d'objet publique sous le nom de base, comme
cool_bow.json. Les définitions individuelles de_idle, d'armement et de charge sont supprimées ; leur géométrie reste référencée dans la définition de base - Le registre d'affichage expose l'ID de base et retire les ID des états. Un ensemble complet avec
_chargedest traité comme une arbalète ; sans cet état, comme un arc. Des états d'affichage manquants empêchent le regroupement - Utilisez le nom de base pour la configuration YML, comme
cool_bow.yml. Le catalogue d'objets ignore les fichiers YML portant un suffixe d'état ; la recherche de configuration des props retire également le suffixe
JSON de modèle d'affichage
Chaque état requis doit avoir son propre .json d'affichage voisin, comme cool_bow_idle.json et cool_bow_draw_full.json. FMM les relie par la définition d'objet de base générée. Consultez la sortie du resource pack pour ses conditions et son chemin de sortie.
Hors du périmètre
Cette page n'essaie pas de garantir :
- les étapes exactes de l'interface Blockbench
- les préférences de flux de travail artistique
- chaque particularité héritée des fichiers
.bbmodeldécrites dans l'ancien matériel README local
Ces détails changent plus rapidement que le contrat d'exécution vérifié ci-dessus.