GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: JohnAnto le 18 Janvier 2013, 16:11:24

Titre: Détruire véhicule aprés qu'il est spawn
Posté par: JohnAnto le 18 Janvier 2013, 16:11:24
Bonjours,

Je connais la fonction DestroyVehicule mais je sais pas m'en servir :/
Donc j'ai fais un fs pour pouvoir spawn des véhicule mais quand un véhicule et spawner et qu'on en spawn un autre, et bien il reste, sa fais que les véhicule vont s'accumulé et sa vas pourrir la map. Bien évidemment faudrait qu'ils se détruisent automatiquement sans que l'on est besoin de faire une commande genre /vdestroy
Titre: Re : Détruire véhicule aprés qu'il est spawn
Posté par: Infu le 18 Janvier 2013, 16:22:42
Faut que tu attribues un nom aux véhicules que tu spawn.
Ensuite, tu peux détruire ce véhicule en utilisant ce nom.

Code: (pawn) [Sélectionner]
new nom;
nom = CreateVehicle(....);
DestroyVehicle(nom);

Titre: Re : Détruire véhicule aprés qu'il est spawn
Posté par: chneubeul le 18 Janvier 2013, 17:56:51
Salut,

une petite chose, kick le joueur du véhicule avant de détruire le véhicule :p
Titre: Re : Détruire véhicule aprés qu'il est spawn
Posté par: Xartrick le 18 Janvier 2013, 19:42:14
Alors ce genre de système est très simple à mettre en place.
Pour cela, tu vas avoir besoin de:



Alors, le but est de vérifié si un joueur à déjà crée un véhicule en lisant une variable, si c'est le cas, on vérifie s'il existe.
S'il existe, on le détruit puis on créé un nouveau véhicule.
S'il n'existe pas, on créer un véhicule directement.

Donc, la fonction
CreateVehicle retourne l'indice du véhicule créé, il faut donc garder cette valeur dans un tableau avec un indice correspondant au joueur courant.

Citer
Returns: The ID of the vehicle created (NOTE: starts at 1).

On sait que les véhicules commence à l'indice 1, on peut donc utilisé 0 comme valeur d'initialisation.

Code: (pawn) [Sélectionner]
new spawnedVehicle[MAX_PLAYERS] = { 0 };
Maintenant qu'on à ça, lorsqu'un joueur demande de faire apparaître un véhicule, on vérifie si l'indice n'est pas 0, si il n'est pas à 0, on vérifie si le véhicule existe, et enfin si c'est le cas, on le détruit.

Code: (pawn) [Sélectionner]
if ( spawnedVehicle[playerid] != 0 ) {
    if ( IsValidVehicle(spawnedVehicle[playerid]) ) {
        DestroyVehicle(spawnedVehicle[playerid]);
       
        spawnedVehicle[playerid] = 0;
    }
}

Après cette vérification, on peut créer sans soucis notre véhicule:

Code: (pawn) [Sélectionner]
spawnedVehicle[playerid] = CreateVehicle(modelid, x, y, z, angle, color1, color2, respawn_delay);
Maintenant, quand un joueur va se déconnecter, son véhicule va rester là, sans conducteur, on peut donc, dans la fonction évènementielle OnPlayerDisconnect utiliser le code précédent pour supprimer son véhicule si il en a créé un et si il existe toujours.
Pour cela, on va factoriser le code.


Code: (pawn) [Sélectionner]
stock destroyPlayerVehicle(playerid) {
    if ( spawnedVehicle[playerid] != 0 ) {
        if ( IsValidVehicle(spawnedVehicle[playerid]) ) {
            DestroyVehicle(spawnedVehicle[playerid]);
           
            spawnedVehicle[playerid] = 0;
        }
    }
}

À présent, dans notre demande de création de véhicule, on aura qu'à appeler cette fonction, lui laisser faire son boulot et créer directement le véhicule, et lors de la déconnexion, l'appeler simplement.

Code: (pawn) [Sélectionner]
destroyPlayerVehicle(playerid);

spawnedVehicle[playerid] = CreateVehicle(modelid, x, y, z, angle, color1, color2, respawn_delay);

Code: (pawn) [Sélectionner]
public OnPlayerDisconnect(playerid, reason) {
    destroyPlayerVehicle(playerid);
}

Et voilà, ton système fonctionne et ne laissera plus de véhicule fantôme.

Remarque: Ce message est volontairement appuyé sur les détails, il montre comment on doit raisonner simplement pour créer un système simple.