Aller au contenu principal

Bases de la conduite de véhicule

Dans le Projet 04, tu as fait apparaître une voiture vide. Mais dans les vraies missions de GTA V, les véhicules ne restent pas immobiles : des chauffeurs viennent te chercher, des patrouilles poursuivent des suspects et des complices t'attendent au volant. Dans cette dernière leçon technique du Stage 4, tu apprends à installer un PNJ au volant et à lui ordonner de naviguer dans Los Santos jusqu'à destination.

Monter à bord : EnterVehicle

Ne téléporte jamais un PNJ sur le siège conducteur, sauf pour une cinématique instantanée. L'immersion du jeu repose sur le fait de voir l'acteur ouvrir la portière, s'asseoir et démarrer le moteur :

using GTA;
using GTA.Math;

// Ordonner au conducteur de monter à bord avec un délai de 6 secondes, en courant (8.0f)
conducteur.Task.EnterVehicle(voiture, VehicleSeat.Driver, 6000, 8.0f, EnterVehicleFlags.None);

Tester conducteur.IsInVehicle(voiture) t'indique quand le conducteur a refermé sa porte et tient le volant en main.

Conduire vers une destination : DriveTo

Une fois le conducteur installé, ordonne-lui d'emprunter le réseau routier vers une position cible :

Vector3 destination = new Vector3(-802f, 175f, 72.8f);
float vitesseEnMetresParSeconde = 22.0f; // Environ 80 km/h
VehicleDrivingFlags drapeaux = VehicleDrivingFlags.StopForVehicles;
float rayonArrivee = 6.0f;

conducteur.Task.DriveTo(voiture, destination, vitesseEnMetresParSeconde, drapeaux, rayonArrivee);

Le moteur de recherche de chemin du jeu suit automatiquement les voies de circulation, négocie les ronds-points, respecte les feux et ralentit à l'approche du rayon d'arrivée.

Avertissement critique : Bannir les drapeaux de conduite obsolètes

Dans les documentations anciennes et sur le web, tu trouveras souvent :

// OBSOLÈTE dans le SHVDN moderne : ne pas utiliser
VehicleDrivingFlags flags = VehicleDrivingFlags.FollowTraffic;

VehicleDrivingFlags.FollowTraffic est obsolète dans ScriptHookVDotNet3 moderne. Il génère des avertissements de compilation et provoque des comportements aberrants où les véhicules s'arrêtent indéfiniment aux feux verts.

Utilise plutôt les drapeaux modernes composables :

  • VehicleDrivingFlags.StopForVehicles : Conduite sécurisée standard qui freine face aux véhicules qui la précèdent.
  • VehicleDrivingFlags.Rushed : Conduite agressive qui zigzague dans le trafic et ignore les feux rouges.
  • VehicleDrivingFlags.AvoidVehicles : Évitement d'urgence.

L'implémentation validée de conduite

Voici le code complet correspondant au snippet vérifié S04 :

using System;
using GTA;
using GTA.Math;

public sealed class DriverDriveTo : Script
{
private Ped _driver;
private Vehicle _target;
private readonly Vector3 _destination = new Vector3(-802f, 175f, 72.8f);

public DriverDriveTo()
{
Tick += OnTick;
Aborted += OnAborted;
}

private void OnTick(object sender, EventArgs e)
{
Ped player = Game.Player.Character;
if (player == null || !player.Exists())
{
return;
}

if (_driver == null || !_driver.Exists())
{
SpawnDriverNear(player);
return;
}

if (!_driver.IsInVehicle(_target))
{
_driver.Task.EnterVehicle(_target, VehicleSeat.Driver, 6000, 8f, EnterVehicleFlags.None);
}
else
{
VehicleDrivingFlags flags = VehicleDrivingFlags.StopForVehicles;
_driver.Task.DriveTo(_target, _destination, 22f, flags, 6f);
}
}

private void SpawnDriverNear(Ped player)
{
Model model = new Model(PedHash.Cop01SMY);
if (!model.IsValid || !model.IsInCdImage || !model.Request(2000))
{
model.MarkAsNoLongerNeeded();
return;
}

try
{
_target = player.CurrentVehicle;
if (_target == null || !_target.Exists())
{
return;
}

_driver = World.CreatePed(model, _target.Position + _target.RightVector * 2f, _target.Heading);
if (_driver != null && _driver.Exists())
{
_driver.BlockPermanentEvents = true;
}
}
finally
{
model.MarkAsNoLongerNeeded();
}
}

private void OnAborted(object sender, EventArgs e)
{
if (_driver != null && _driver.Exists())
{
_driver.Delete();
}
}
}

Tu disposes désormais de chaque brique technique nécessaire pour concevoir des mods complets dans GTA V. Dans le Stage 5 Déployer, tu vas orchestrer tous ces systèmes dans le Projet 09 : Mod complet, apprendre à versionner et packager tes créations, et te préparer pour ton projet Capstone en autonomie.