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 deGTA.Script. Le pont analyse les assemblies du dossierscripts/et instancie ces classes lors du rechargement. - Attachement des événements dans le constructeur : s'abonner à
Tick += OnTick;etAborted += OnAborted;enregistre les points d'entrée de notre script.Tickest appelé à chaque frame, tandis qu'Aborteds'exécute quand le script est déchargé ou rechargé. - Régulation temporelle avec
Game.GameTime:Ticks'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. EncadrerFile.AppendAllTextdans untry-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.