Factions et hostilité
Quand deux personnages se croisent dans Los Santos, le moteur consulte une matrice de relations pour déterminer leur attitude spontanée : vont-ils s'ignorer, se saluer ou dégainer à vue ? Dans ScriptHookVDotNet, ce système repose sur RelationshipGroup.
La struct moderne RelationshipGroup
Dans les anciennes versions de SHVDN et les documentations obsolètes, les groupes de relations étaient de simples entiers (int), et l'on appelait une méthode statique comme World.SetRelationshipBetweenGroups(int, int, ...). Cette API est totalement obsolète et fausse aujourd'hui.
Dans SHVDN3 moderne, GTA.RelationshipGroup est une struct fortement typée :
using GTA;
// 1. Créer ou récupérer un groupe de relations nommé
RelationshipGroup groupeGarde = World.AddRelationshipGroup("COMPANION_GUARD");
// 2. Récupérer le groupe natif du joueur
RelationshipGroup groupeJoueur = Game.Player.Character.RelationshipGroup;
// 3. Définir une alliance mutuelle (bidirectionnel = true)
groupeGarde.SetRelationshipBetweenGroups(groupeJoueur, Relationship.Companion, true);
Les degrés de la relation (enum Relationship)
L'énumération Relationship définit la perception mutuelle de deux factions :
| Degré | Comportement en jeu |
|---|---|
Companion | Allié indéfectible. Défend les membres du groupe et attaque leurs agresseurs. |
Respect | Amical. Prête main-forte si un combat éclate à proximité. |
Like | Favorable. Tolère la proximité et les légères bousculades. |
Neutral | Comportement citoyen par défaut. Ignore les autres tant qu'aucune violence n'a lieu. |
Dislike | Méfiant. Peut insulter ou reculer si le joueur s'approche trop près. |
Hate | Hostile à vue. Attaque ou fuit selon son courage et son armement. |
Assigner un groupe à une entité
Une fois les règles de relation établies, assigne ce groupe à tes personnages :
Ped garde = World.CreatePed(model, pointSpawn);
garde.RelationshipGroup = groupeGarde;
Le moteur de jeu reconnaît désormais que ce garde et le joueur appartiennent à la même faction alliée.
Appartenance à une faction contre décision d'attaquer
Voici une nuance cruciale que tu appliqueras dans le Projet 05 :
Appartenir à une faction qui a du Relationship.Hate envers le joueur indique au moteur qui est l'ennemi, mais ne doit pas décider du moment exact où la fusillade éclate. Si tu laisses faire l'hostilité ambiante brute, des PNJ commenceront à tirer à travers trois pâtés de maisons à travers des buissons dès leur apparition.
Dans un mod professionnel, les groupes de relations servent à poser l'identité des factions, mais c'est la machine à états de ton script (mesurant la distance, le champ de vision et l'arme dégainée) qui décide de déclencher Task.Combat().
Dans la leçon suivante, nous mettons tout cela en pratique dans le Projet 03 : Garde du corps.