Aller au contenu principal

Entités

Dans GTA V, presque tout ce qui possède une présence physique dans le monde est une Entité. Qu'il s'agisse de Franklin marchant sur Vinewood Boulevard, d'une voiture de police poursuivant un suspect ou d'une caisse en bois tombant d'un chariot, ils partagent tous une même classe de base : GTA.Entity.

La hiérarchie des entités

Dans ScriptHookVDotNet, l'héritage s'organise ainsi :

+--------------+
| GTA.Entity |
+--------------+
/ | \
/ | \
+----------+ +-----------+ +----------+
| GTA.Ped | |GTA.Vehicle| | GTA.Prop |
+----------+ +-----------+ +----------+

Parce que Ped, Vehicle et Prop héritent tous de Entity, ils partagent les propriétés physiques et spatiales élémentaires :

  • Position : La position 3D dans le monde (Vector3).
  • Heading : L'angle de rotation au sol (de 0 à 360 degrés).
  • Health : Les points de vie actuels.
  • IsDead / IsAlive : Vérification rapide de l'état vital.
  • ForwardVector : Le vecteur orienté dans la direction du regard.

Les handles : le système d'identification du moteur

Quand GTA V fait apparaître une voiture ou un passant, il range l'objet dans une table mémoire interne (un pool) de taille fixe et lui attribue un entier appelé handle.

Dans ton code C# :

Ped ped = Game.Player.Character;
int handleMoteur = ped.Handle;

Un handle n'est pas l'objet lui-même ; c'est un numéro de chambre d'hôtel. Quand tu écris ped.Delete(), SHVDN transmet ce numéro à une native du moteur qui libère l'emplacement dans la table.

Propriété du script contre entités du monde

Quand ton script crée une entité, le jeu la marque automatiquement comme mission entity (propriété du script). Cela implique :

  • Le ramasse-miettes ambiant du jeu ne la supprimera jamais, même si tu t'en éloignes de dix kilomètres.
  • Elle reste en mémoire tant que ton script ne la supprime pas ou n'est pas déchargé.

Si ton script fait apparaître cinquante voitures sans jamais les supprimer, le réservoir de véhicules sature complètement et la circulation ordinaire disparaît totalement de la ville.

Rendre une entité au monde

Si tu souhaites qu'une entité disparaisse naturellement quand le joueur s'éloigne (comme un passant ordinaire), libère sa tutelle :

// Indique au moteur : je n'en ai plus besoin, applique les règles de nettoyage habituelles
ped.MarkAsNoLongerNeeded();

Si tu souhaites la faire disparaître immédiatement de la scène :

// Supprime instantanément l'entité de la mémoire et de l'écran
ped.Delete();

Dans la leçon suivante, nous verrons pourquoi tester la validité d'une entité est ta première ligne de défense contre les crashs.