Projet 03 : Bodyguard
Dans le Projet 02, tu as fait apparaître un piéton statique. Dans le Projet 03, tu transformes ce piéton en un allié actif et intelligent : un garde du corps individuel qui marche à tes côtés, détecte quand tu subis une agression, cible précisément la menace hostile et reprend sa marche à tes côtés une fois le danger écarté.
La mission
Concevoir un garde du corps individuel remplissant six critères opérationnels majeurs :
- Instancier un garde armé qui marche à pied en formation décalée aux côtés du joueur.
- Établir un groupe de relations d'alliance mutuelle pour proscrire les tirs fratricides et verrouiller la loyauté.
- Détecter l'engagement du joueur en combat et ordonner au garde de riposter spécifiquement contre un agresseur identifié.
- Laisser l'IA de combat native gérer la tactique sans interrompre ni réinitialiser les ordres à chaque frame.
- Rétablir automatiquement le suivi pacifique une fois la menace neutralisée.
- Supprimer proprement le garde et l'agresseur lors du rechargement du script.
Spécifications, contraintes
- Garde individuel exclusif : concentrer l'architecture sur un compagnon unique plutôt que sur des formations d'escouade complexes.
- Cible explicite obligatoire : comprendre que
player.IsInCombatn'est qu'un booléen sans identifiant d'entité, et fournir un handle de cible explicite àTask.Combat. - Hiérarchie stricte des états : structurer
OnTickpour que combat actif, riposte immédiate et marche pacifique ne se parasitent jamais au sein d'une même frame. - Zéro PNJ orphelin : garantir le contrôle et la suppression de toutes les entités créées dans
OnAborted.
Étapes de réalisation
- Déclarer les handles d'entités : définis des champs privés
private Ped _guard;etprivate Ped _testAggressor;. - Configurer les relations diplomatiques : dans le constructeur, crée un groupe de relation d'alliance (
COMPANION_GUARD) et associe une relation mutuelleRelationship.Companionavec le groupe du joueur. - Programmer la création du garde : dans une routine dédiée, streame le modèle
PedHash.Security01SMM, fais-le apparaître à 2 mètres sur la droite du joueur, équipe-le d'une arme, activeBlockPermanentEvents = trueet attribue-lui le groupe d'alliance. - Bâtir la hiérarchie de décision dans
OnTick:- Si le joueur est invalide, quitter immédiatement.
- Si le garde est absent ou mort, déclencher la création.
- Si le garde est déjà au combat (
_guard.IsInCombat), retourner sans toucher à ses tâches pour laisser l'IA native opérer. - Si le joueur et l'agresseur sont simultanément engagés en combat, ordonner
_guard.Task.Combat(_testAggressor, ...). - Sinon, maintenir la marche d'accompagnement via
_guard.Task.FollowToOffsetFromEntity(player, ...).
- Assurer le nettoyage complet : dans
OnAborted, vérifie la présence de_guardet_testAggressoret supprime-les immédiatement.
APIs, outils à explorer
GTA.RelationshipGroup: structure régissant l'allégeance et les relations diplomatiques entre groupes d'entités.RelationshipGroup.SetRelationshipBetweenGroups(RelationshipGroup other, Relationship relation, bool bidirectional): configure l'alignement mutuel entre deux factions.Ped.Task.FollowToOffsetFromEntity(Entity target, Vector3 offset, float speed, int timeout, float stoppingRange, bool persist): ordonne à une entité de suivre une cible en conservant un décalage spatial relatif.Ped.Task.Combat(Ped target, TaskCombatFlags combatFlags, TaskThreatResponseFlags threatResponseFlags): ordonne à un PNJ d'engager le combat armé contre une cible précise.Ped.IsInCombat: propriété booléenne native indiquant si un piéton est actuellement au combat.Ped.BlockPermanentEvents: bloque les réactions ambiantes par défaut (fuite en entendant des coups de feu) pour que le script garde la main.
Critères de validation
Ton mod est validé dès que :
- Le garde du corps apparaît à tes côtés et marche de façon fluide sur ton flanc gauche pendant tes déplacements.
- Lorsqu'un agresseur attaque le joueur, le garde dégaine instantanément et riposte directement contre lui.
- Pendant l'échange de tirs, le garde utilise les couvertures et tire sans saccader ni réinitialiser son animation.
- Dès que l'agresseur s'effondre, le garde range son arme et reprend sa position de marche en formation.
- Recharger avec
Insersupprime proprement le garde et l'agresseur sans laisser de trace en jeu.
Solution, explications
Partner
Solution vérifiée et explications du code
Le sujet, les contraintes et les étapes de réalisation restent 100% libres pour t'exercer par toi-même. Le code source de référence vérifié et les explications détaillées de production sont réservés aux membres du tier Partner.