Dans la modification de jeux de rôle en monde ouvert 3D, peu de problèmes se révèlent aussi déconcertants et ardus à isoler que les retours brutaux sur le bureau survenant au moment précis où le joueur franchit une porte ou traverse une frontière invisible du décor. Un joueur peut explorer l'univers pendant des dizaines d'heures sans la moindre anicroche, avant de subir un retour bureau immédiat et reproductible (Crash to Desktop ou CTD) en pénétrant dans une auberge rénovée, un donjon créé par un mod ou un nouveau quartier urbain.
Dans l'immense majorité de ces plantages survenant lors du changement de cellule (cell transition), le responsable n'est ni une texture corrompue ni une saturation de la mémoire vidéo, mais un maillage de navigation (Navmesh) altéré ou en conflit. Le navmesh constitue la géométrie invisible fondamentale sur laquelle s'appuie l'intelligence artificielle (IA) pour calculer ses déplacements, trouver des abris et emprunter les portes de chargement. Lorsque les auteurs de mods suppriment par mégarde des maillages du jeu de base ou superposent des agencements incompatibles, le sous-système de calcul de trajectoire du moteur subit de fatales violations d'accès à la mémoire.
Qu'est-ce qu'un navmesh et comment le moteur l'exploite-t-il ?
Dans les moteurs de jeu récents (tels que le Creation Engine de Bethesda, utilisé pour The Elder Scrolls et Fallout), les personnages non-joueurs (PNJ) et les créatures ne calculent pas leurs déplacements en testant des collisions physiques contre les volumes visibles du décor. Effectuer des calculs de collision en temps réel pour des dizaines d'entités simultanées saturerait immédiatement les capacités du processeur.
Afin de permettre des déplacements d'IA fluides et économiques en ressources, les développeurs et les moddeurs déploient une toile bidimensionnelle invisible sur toutes les surfaces praticables :
- Réseaux nodaux triangulaires : Le navmesh est constitué de polygones triangulaires reliés entre eux, épousant le sol, les marches et le relief. Chaque triangle représente une surface praticable reconnue par le système, dotée de coordonnées précises et de propriétés dédiées (comme les zones aquatiques, les secteurs dangereux ou les trajectoires prioritaires).
- Graphes de calcul de trajectoire : Lorsqu'un PNJ doit se rendre vers un point donné, le moteur de déplacement exécute l'algorithme de recherche de chemin A-star à travers les triangles contigus du navmesh, s'affranchissant ainsi de tout calcul physique lourd.
- Liaisons de bordure (Edge-Links) et repères de porte : En extérieur, les maillages doivent être raccordés le long des limites de cellules par des liaisons vertes afin que les entités puissent franchir les zones de chargement de manière transparente. En intérieur, des repères jaunes de téléportation associés aux portes (
DOORTeleport Markers) ancrent le navmesh aux portails d'accès, indiquant au moteur l'endroit exact où placer le PNJ après le chargement.
Le danger fatal des maillages supprimés (« Deleted Navmesh »)
Au sein de la communauté des moddeurs avertis, le terme « Deleted Navmesh » est synonyme direct d'instabilité majeure. Pour appréhender ce phénomène, il faut observer la manière dont le moteur gère les pointeurs d'enregistrement en mémoire.
Violation d'accès par déréférencement de pointeur nul
Chaque ressource d'un plugin se voit attribuer un identifiant hexadécimal unique (FormID, par exemple 00021A4B). Sur le navmesh du jeu d'origine, de nombreuses routines de quêtes, des comportements d'IA radiante et d'autres mods enregistrent des références directes pointant vers ce FormID.
Si un créateur de mod décide de réaménager une pièce intérieure et supprime le navmesh d'origine dans l'éditeur avec la touche Suppr au lieu d'en ajuster les sommets, le plugin inscrit l'en-tête Record Flags: Deleted sur cet enregistrement. Lorsque le joueur entre dans la zone ou qu'un PNJ distant tente de calculer un chemin passant par ces coordonnées, l'incident se produit :
- Le moteur demande en mémoire le FormID exigé par ses fichiers maîtres.
- L'enregistrement renvoyé est marqué comme supprimé, ce qui implique que ses tableaux de sommets et ses index de triangles n'ont pas été alloués dans la mémoire active.
- Le thread de calcul de trajectoire tente de déréférencer un pointeur nul ou de lire une zone mémoire non attribuée, provoquant une exception irrécupérable
0xC0000005 Access Violationqui ferme le jeu sur-le-champ.
Contrairement aux objets statiques simples (comme les tonneaux ou les meubles, que les utilitaires de nettoyage peuvent « restaurer et masquer » automatiquement via la fonction « Undelete and Disable »), les navmeshes possèdent une topologie géométrique continue que les scripts automatiques ne peuvent pas reconstituer seuls.
Conflits d'écrasement et dysfonctionnements du comportement des PNJ
Même en l'absence de maillage supprimé, l'installation de plusieurs mods modifiant un même lieu engendre de graves anomalies de déplacement en vertu de la Règle Unique (Rule of One) du moteur.
Perte de données par superposition
Si le Mod A agrandit une auberge en y adjoignant des chambres d'hôtes, il génère un nouveau navmesh pour couvrir la surface nouvellement créée. Si le Mod B modifie cette même auberge pour y installer une cheminée, des éclairages et des tables supplémentaires, il réécrit lui aussi le navmesh de la cellule.
Le moteur de jeu ne peut pas fusionner dynamiquement deux enregistrements de navmesh en cours d'exécution. Le mod situé en dernière position dans votre ordre de chargement écrase purement et simplement l'enregistrement NAVM de tous les mods précédents :
- Si le Mod B a la priorité dans l'ordre de chargement, l'extension bâtie par le Mod A perd toutes ses informations de navigation. Pour l'IA, cette pièce devient un vide inaccessible ; les compagnons refuseront d'y entrer ou courront indéfiniment contre des seuils invisibles.
- Si le Mod A l'emporte, l'espace occupé par la nouvelle cheminée du Mod B conservera un navmesh praticable sous l'objet. Les PNJ ne détecteront pas l'obstacle physique et buteront continuellement contre la maçonnerie.
Liaisons rompues et désynchronisation des repères de porte
Lorsque des anomalies de navmesh surviennent en extérieur, les symptômes se traduisent couramment par l'abandon des compagnons ou des écrans de chargement infinis :
- Bordures de cellules disjointes : Si un mod de relief modifie l'élévation du terrain à proximité d'une frontière de cellule sans procéder à la finalisation et au raccordement des arêtes (Finalize), la ligne de démarcation devient un fossé infranchissable pour l'IA. Les compagnons s'arrêtent net ou effectuent d'immenses détours jusqu'à ce qu'un voyage rapide force leur téléportation.
- Repères de porte décalés : Lorsqu'un mod d'intérieur déplace une porte sans réancrer convenablement le repère jaune sur un triangle de navmesh valide, les PNJ se figent au passage de la porte ou déclenchent un cycle de chargement infini.
Protocole de diagnostic et de réparation
La résolution des conflits de navmesh requiert des outils d'édition et de contrôle confirmés.
1. Détection des erreurs avec xEdit
Ouvrez votre ordre de chargement dans xEdit (comme SSEEdit ou FO4Edit) et lancez une analyse d'intégrité :
- Sélectionnez l'ensemble des plugins chargés, faites un clic droit et choisissez
Check for Errors. - Filtrez les résultats en observant les enregistrements de type
NAVM. - Repérez en priorité les mentions
Record marked as deletedouCould not be resolved. Ce sont les causes directes des retours bureau lors des changements de cellule.
2. La méthode d'enfouissement pour les maillages supprimés
Si un mod comporte un navmesh d'origine supprimé, la méthode préconisée consiste à le restaurer puis à l'enfouir sous le niveau du sol :
- Dans xEdit, localisez l'enregistrement
NAVMsupprimé et décochez le flagDeletedpour rétablir l'en-tête de l'enregistrement. - Ouvrez le plugin dans le Creation Kit officiel.
- Plutôt que de supprimer le maillage excédentaire, sélectionnez l'ensemble de ses sommets et déplacez-les très profondément sous la zone jouable (en réglant la coordonnée Z à
-30 000). - Réduisez la taille des triangles enfouis au minimum et rompez toutes leurs liaisons de bordure. Le moteur conserve le FormID valide en mémoire sans qu'aucun PNJ ne puisse jamais y poser le pied, ce qui élimine toute erreur de pointeur nul.
Lors du diagnostic de fermetures inattendues du jeu au franchissement de portes intérieures ou au passage d'une région à une autre, les guides de modding de 365Finds recommandent de vérifier en priorité la présence d'erreurs de navmesh supprimé dans votre ordre de chargement avant d'incriminer les pilotes graphiques ou les fuites de mémoire.
Liste de contrôle pour le diagnostic et la prévention
- Vérifier les alertes LOOT : Maintenez la liste principale de LOOT à jour pour identifier les plugins signalés avec l'avertissement « Contains deleted navmeshes ».
- Exécuter un contrôle d'erreurs xEdit : Pour tout nouveau mod d'aménagement urbain, de demeure ou de donjon, effectuez un scan d'erreurs dans xEdit avant de démarrer une partie.
- Analyser les journaux de crash : Si vous utilisez un utilitaire tel que Crash Logger, examinez les piles d'appels à la recherche de mots-clés comme
PathingCell,NavMeshouBSPathing. - Créer des patchs de compatibilité : Si plusieurs mods modifient la même cellule, ouvrez l'éditeur officiel pour raccorder manuellement les maillages et finaliser les frontières entre les nouvelles zones.