Aller au contenu principal

Projet 04 : Vehicle spawner

Dans le Projet 03, tu as conçu un garde du corps allié qui te suit à pied. Dans le Projet 04, tu t'attaques aux véhicules motorisés. Ton objectif est de bâtir un spawner fiable qui interroge le maillage routier, cale une voiture vide sur le nœud d'asphalte le plus proche devant le joueur, plaque ses roues au sol via la physique native et gère proprement son cycle de vie.


La mission

Concevoir un spawner de véhicule vide remplissant cinq objectifs techniques majeurs :

  1. Interroger le graphe routier du jeu pour localiser le nœud de rue valide le plus proche devant le joueur.
  2. Gérer gracieusement les zones sauvages ou hors-piste où aucun nœud routier n'existe sans lever d'exception.
  3. Streamer le modèle du véhicule de façon asynchrone en mémoire avec un délai de sécurité.
  4. Faire apparaître un véhicule vide aux coordonnées calculées et stabiliser ses suspensions avec PlaceOnGround.
  5. Verrouiller la possession d'une entité unique pour éviter que des véhicules ne s'empilent lors des actualisations.
  6. Supprimer proprement le véhicule lors du rechargement du script.

Spécifications, contraintes

  • Véhicule vide uniquement : ne pas faire apparaître de conducteur IA dans ce projet ; la conduite autonome par IA fait l'objet de la leçon 48 avant le Complete Mod.
  • Calage sur les nœuds routiers : toujours sonder les coordonnées candidates avec World.GetNextPositionOnStreet et vérifier l'absence d'égalité avec Vector3.Zero.
  • Stabilisation des collisions au sol : appeler systématiquement PlaceOnGround() immédiatement après la création pour prévenir les rebonds de suspension ou l'enfoncement dans le bitume.
  • Indicateur de persistance : passer _car.IsPersistent = true pour protéger le véhicule du ramasse-miettes natif lorsque le joueur s'éloigne.
  • Zéro véhicule orphelin : assurer la suppression définitive de _car dans OnAborted.

Étapes de réalisation

  1. Déclarer le champ de suivi : crée un champ privé private Vehicle _car; dans ta classe de script.
  2. Brancher les événements : dans le constructeur, enregistre des gestionnaires pour Tick et Aborted.
  3. Contrôler la possession active : dans OnTick, vérifie si _car n'est pas nul et existe. Si oui, retourne immédiatement pour préserver l'instance unique.
  4. Calculer la position sur la route : calcule un point candidat à 25 mètres devant le joueur (player.Position + player.ForwardVector * 25f) et interroge World.GetNextPositionOnStreet.
  5. Gérer le repli hors route : si la coordonnée renvoyée vaut Vector3.Zero, interromps la méthode sans instanciation.
  6. Streamer le modèle : charge VehicleHash.Dominator avec model.Request(2000) en contrôlant les délais d'attente.
  7. Créer et plaquer au sol : dans un bloc try-finally, appelle World.CreateVehicle, active IsPersistent = true et exécute _car.PlaceOnGround().
  8. Libérer la ressource : dans le bloc finally, invoque model.MarkAsNoLongerNeeded().
  9. Implémenter le nettoyage : dans OnAborted, vérifie l'existence de _car et appelle _car.Delete().

APIs, outils à explorer

  • GTA.World.GetNextPositionOnStreet(Vector3 position) : analyse le maillage de circulation pour renvoyer la coordonnée d'asphalte la plus proche.
  • GTA.Vehicle : classe gérant les automobiles, deux-roues, hélicoptères et embarcations maritimes.
  • GTA.World.CreateVehicle(Model model, Vector3 position, float heading) : instancie physiquement un véhicule dans l'univers de jeu.
  • Vehicle.PlaceOnGround() : plaque instantanément les quatre roues et le châssis de collision sur le relief du terrain.
  • Entity.IsPersistent : indique au ramasse-miettes natif de conserver l'entité en mémoire même si la caméra s'en détourne.
  • GTA.VehicleHash.Dominator : hash identifiant la muscle car Vapid Dominator.

Critères de validation

Ton mod est validé dès que :

  • Placé sur ou près d'une chaussée, la Dominator apparaît proprement orientée sur l'asphalte devant le joueur.
  • Le véhicule repose de façon stable sur ses pneus, sans saut parasite, sans enfoncement et sans vibration de châssis.
  • Placé au sommet du Mont Chiliad ou dans l'océan loin de toute route, le script refuse d'apparaître sans provoquer de crash.
  • S'éloigner du véhicule ne le fait pas disparaître de la carte (preuve de la bonne configuration de persistance).
  • Recharger avec Inser supprime immédiatement la voiture du monde physique.

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.