Projet 06 : Dynamic event
Dans le Projet 05, tu as conçu une confrontation statique de gang. Dans le Projet 06, tu crées un événement dynamique vivant inspiré des rencontres aléatoires de GTA V : deux inconnus se rencontrent dans une ruelle pour un échange suspect. Lorsque le joueur s'en mêle, la négociation dégénère : l'un des acteurs s'enfuit en courant paniqué tandis que l'autre sort une arme pour se battre, et la scène se nettoie d'elle-même une fois achevée.
La mission
Concevoir un événement dynamique d'ambiance remplissant six critères fondamentaux :
- Déclencher une mise en scène dynamiquement dès que le joueur s'approche à moins de 60 mètres d'un point géographique précis.
- Faire apparaître deux acteurs distincts (un vendeur et un acheteur) face à face en pleine conversation (
Task.ChatTo). - Surveiller la proximité et l'état d'armement du joueur en direct.
- Faire escalader la scène : l'acheteur prend la fuite à pied tandis que le vendeur ouvre le feu sur le joueur.
- Décharger la scène et réinitialiser l'événement si le joueur ignore la rencontre et s'éloigne au-delà de 120 mètres.
- Supprimer proprement toutes les entités créées lors du déchargement du script.
Spécifications, contraintes
- Fuite à pied exclusivement : limiter la retraite de l'acheteur à un sprint pédestre avec
_buyer.Task.FleeFrom(player); les poursuites en véhicule sont abordées plus loin. - Verrou d'exécution unique : utiliser des drapeaux d'état pour interdire toute réapparition ou doublon pendant qu'une scène est déjà en cours.
- Suppression basée sur la distance : libérer la mémoire en détruisant les deux acteurs si le joueur s'éloigne à plus de 120 mètres.
- Zéro fuite d'entité : détruire systématiquement les deux PNJ dans
OnAborted.
Étapes de réalisation
- Déclarer les états et références : définis des champs pour
_dealer,_buyer,_eventTriggered,_dealEscalatedet la coordonnée cible_dealLocation. - Brancher les événements : dans le constructeur, enregistre des gestionnaires pour
TicketAborted. - Gérer l'activation de proximité : dans
OnTick, calculeplayer.Position.DistanceTo(_dealLocation). Si la scène n'est pas encore déclenchée et que le joueur est à moins de 60 mètres, appelleSpawnDealScene()et active le drapeau. - Gérer le déchargement à distance : si la scène est active et que le joueur s'éloigne à plus de 120 mètres, appelle
CleanUp(). - Évaluer les critères d'escalade : si la scène est active sans être en conflit, vérifie si le joueur entre à moins de 8 mètres ou tient une arme. Si oui, appelle
EscalateConflict(player). - Mettre en scène la transaction : dans
SpawnDealScene, charge les deux modèles, place les acteurs à 1,5 mètre l'un de l'autre en vis-à-vis, donne une arme au vendeur et ordonne un échange viaTask.ChatTo. - Bâtir la cinématique d'escalade : dans
EscalateConflict, réinitialise les tâches des deux PNJ, ordonne au vendeur d'attaquer le joueur et à l'acheteur de fuir à pied. - Programmer le nettoyage : dans
CleanUp, supprime les acteurs existants et réinitialise les drapeaux booléens. RelieCleanUpàOnAborted.
APIs, outils à explorer
Ped.Task.ChatTo(Ped otherPed): ordonne à deux piétons de se faire face et de jouer des gestes de conversation naturels.Ped.Task.FleeFrom(Entity target): déclenche un sprint de panique à pied pour fuir une entité hostile ou intimidante.Ped.Task.Combat(Ped target): ordonne un assaut hostile ciblant précisément un PNJ ou le joueur.Entity.Position.DistanceTo(Vector3 point): calcule la distance euclidienne pour administrer les déclencheurs de proximité.GTA.UI.Notification.PostTicker(string message, bool isImportant): publie des alertes contextuelles au-dessus de la mini-carte.
Critères de validation
Ton mod est validé dès que :
- Approche à moins de 60 mètres de la ruelle : le vendeur et l'acheteur apparaissent face à face en pleine conversation.
- Approche à moins de 8 mètres ou arme dégainée : l'acheteur tourne les talons et s'enfuit en courant dans la rue, tandis que le vendeur tire.
- Éloignement à 120 mètres en cours d'événement : les deux acteurs disparaissent proprement sans saturer le monde de déchets résiduels.
- Rechargement avec
Inser: les deux acteurs sont supprimés immédiatement.
Solution, explications
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.