Aller au contenu principal

Exemple de code : TP 0

C'est une façon de répondre au cahier des charges, pas la seule bonne réponse. Lis-la pour la comparer à ta tentative et comprendre les compromis, pas pour recopier un modèle définitif. Toute approche qui passe la checklist de validation est tout aussi valable.

← Retour au cahier des charges public

Compiler la DLL de diagnostic​

Crée une bibliothèque de classes (.NET Framework) ciblant net48. Ajoute une référence au ScriptHookVDotNet3.dll de ton installation du jeu, puis un fichier C# contenant le code ci-dessous et compile. Copie seulement le P0Diagnostic.dll obtenu dans le dossier scripts/ du jeu. Le guide d’installation indique quels fichiers de chargement vont à la racine. Cet exemple compile aussi dans le harnais de vérification du site contre le vrai SDK ; son comportement reste à contrôler en jeu.

Le code​

using System;
using System.IO;
using GTA;

public sealed class P0Diagnostic : Script
{
private const string LogPath = "scripts/p0_diagnostic.log";
private int _nextAnnouncement;

public P0Diagnostic()
{
Tick += OnTick;
Aborted += OnAborted;
}

private void OnTick(object sender, EventArgs e)
{
if (Game.GameTime < _nextAnnouncement)
{
return;
}

_nextAnnouncement = Game.GameTime + 5000;

WriteLog("diagnostic actif");
GTA.UI.Screen.ShowSubtitle("Diagnostic : ScriptHookVDotNet fonctionne.", 3000);
}

private void OnAborted(object sender, EventArgs e)
{
WriteLog("script decharge");
}

private static void WriteLog(string message)
{
try
{
string line = $"{DateTime.Now:HH:mm:ss} P0 {message}{Environment.NewLine}";
File.AppendAllText(LogPath, line);
}
catch (Exception)
{
// Le log est secondaire : le sous-titre suffit comme preuve visuelle.
}
}
}

Les choix clés​

  • Héritage de GTA.Script : toute classe C# exécutée par ScriptHookVDotNet doit hériter de GTA.Script. Le pont analyse les assemblies du dossier scripts/ et instancie ces classes lors du rechargement.
  • Attachement des événements dans le constructeur : s'abonner à Tick += OnTick; et Aborted += OnAborted; enregistre les points d'entrée de notre script. Tick est appelé à chaque frame, tandis qu'Aborted s'exécute quand le script est déchargé ou rechargé.
  • Régulation temporelle avec Game.GameTime : Tick s'exécute des dizaines de fois par seconde. Écrire sur le disque ou afficher un sous-titre à chaque frame provoquerait des saccades majeures. _nextAnnouncement = Game.GameTime + 5000; garantit que l'opération ne tourne qu'une fois toutes les 5 secondes.
  • Journalisation défensive avec try-catch : les écritures sur disque peuvent échouer si le fichier est verrouillé par un éditeur ou un antivirus. Encadrer File.AppendAllText dans un try-catch évite qu'une erreur d'E/S ne fasse planter le jeu.
  • Notification d'arrêt : dans OnAborted, l'écriture de "script decharge" prouve que ScriptHookVDotNet prévient proprement les scripts en mémoire avant de les retirer.