Aller au contenu principal

La chaîne du code au jeu

Quand tu écris du C# dans Visual Studio, GTA V n'en sait absolument rien. Le moteur du jeu est codé en C++, compilé en binaire machine, et exécute sa propre boucle de simulation à chaque image. Comprendre comment ton code passe d'un fichier .cs à cette boucle de simulation fait toute la différence entre diagnostiquer un bug en trente secondes ou fixer un écran qui ne réagit pas pendant trois heures.

Les quatre couches

Ton script ne parle pas directement au moteur. Il traverse quatre couches distinctes, chacune avec son rôle précis et ses modes de panne :

  1. Ton script C# : Une classe qui hérite de Script, compilée en bibliothèque .NET (.dll). C'est ton code qui s'exécute dans le runtime .NET.
  2. ScriptHookVDotNet (SHVDN) : Une passerelle écrite en C++/CLI. Elle charge ta DLL en mémoire, gère le cycle de vie de ton script et expose des classes C# sécurisées comme World, Player et Vehicle.
  3. ScriptHookV (SHV) : Le hook natif d'Alexander Blade. Il s'injecte dans le processus du jeu, donne accès à la table interne des fonctions natives et suspend l'exécution des scripts pendant le rendu des images.
  4. Le moteur RAGE : Rockstar Advanced Game Engine. Il pilote la physique, le rendu, la mémoire et les milliers de fonctions natives qui font tourner Los Santos.
+------------------------------------------+
| Ton mod C# (.dll) |
+------------------------------------------+
| (appels API C#)
v
+------------------------------------------+
| ScriptHookVDotNet3.dll (passerelle) |
+------------------------------------------+
| (invocations natives)
v
+------------------------------------------+
| ScriptHookV.dll (hook d'injection) |
+------------------------------------------+
| (mémoire moteur / pools)
v
+------------------------------------------+
| GTA5.exe (Moteur RAGE) |
+------------------------------------------+

Pourquoi cette passerelle existe

Aux premiers jours du modding GTA, il fallait appeler les fonctions du moteur directement par leurs signatures hexadécimales. Si tu passais un nombre à virgule là où le jeu attendait un entier, tout le processus mourait sur le coup, sans le moindre message d'erreur.

SHVDN joue le rôle d'interprète et d'amortisseur. Quand tu écris World.Weather = Weather.ExtraSunny;, SHVDN convertit cet appel en hash natif SET_WEATHER_TYPE_NOW_PERSIST en arrière-plan, vérifie la validité des paramètres et transmet l'instruction au jeu. Si quelque chose dérape, SHVDN intercepte l'erreur et l'inscrit dans ScriptHookVDotNet.log au lieu de laisser le jeu crasher sur le bureau.

Le modèle des fibres

Le moteur du jeu s'exécute sur un thread principal unique. Il ne peut pas attendre que ton script termine un calcul lourd ou s'endorme deux secondes. Si ton code bloque ce thread principal, tout le jeu freeze et Windows affiche le cercle de chargement.

Pour éviter cela, SHVDN exécute chaque script dans une fibre (un micro-thread géré en mémoire utilisateur). Dès que ton script termine son événement Tick ou fait une pause contrôlée (Yield), la main revient immédiatement au moteur. Le jeu calcule l'image suivante, met à jour la physique, et redonne la parole à ton script au tour suivant.

Où se produisent les pannes

Connaître cette chaîne te permet de savoir immédiatement où chercher quand un script ne répond pas :

  • Erreurs de compilation : Visual Studio les repère avant même que le jeu soit lancé. Faute de syntaxe, accolade manquante, mauvais type de donnée.
  • Échecs de chargement : SHVDN ne trouve pas ou ne parvient pas à charger ta DLL. Ouvre ScriptHookVDotNet.log à la racine du jeu. Le problème vient le plus souvent d'une mauvaise version du .NET Framework ou d'une dépendance absente.
  • Exceptions à l'exécution : Ton code a déclenché une erreur non interceptée dans un gestionnaire Tick ou KeyDown. SHVDN arrête ton script et consigne la pile d'appels, mais le jeu continue de tourner.
  • Saturation des réserves du moteur : Ton script a créé des centaines d'entités sans jamais les libérer. Le jeu épuise ses emplacements de peds ou de véhicules et refuse d'en faire apparaître de nouveaux.

Dans la leçon suivante, nous disséquons la structure exacte d'une classe de script C# pour voir comment ces couches s'articulent autour de ton code.