Tout d'abord, si un autre joueur utilise cette commande, il va remplacer la valeur de ap par la sienne et le premier ascenseur ne sera pas détruit. Par contre, celui du deuxième joueur risque d'être détruit avant les trois minutes.
Explication :
- un premier joueur fait /asc donc ap=1 (par exemple) et le timer est lancé
- deux minutes plus tard, un autre joueur fait /asc donc ap prend une autre valeur (par exemple 2) et on relance le timer (je ne sais pas ce que ça fait dans ce cas)
- A l'échéance du timer (soit 1 minute soit 3), l'objet 2 est détruit et le premier existe toujours.
Et le problème se complique si chaque joueur peut créer plusieurs objets.
Pour résoudre ce problème, il existe une fonction magique : SetTimerEx.
Cette fonction permet de lancer un timer avec des paramètres et donc d'associer un timer à un objet en particulier. Et il est possible d'en lancer plusieurs, un pour chaque objet créé.
Demonstration :
if(strcmp(cmdtext,"/asc",true)==0)
{
new Float:x;
new Float:y;
new Float:z;
new Objet;
GetPlayerPos(playerid,x,y,z);
Objet = CreateObject(7909,x,y,z-3,271.000000,0.000000,0.000000);
MoveObject(Objet,x,y,2252.4399,2);
GameTextForPlayer(playerid,"~g~Destruction de l'assenceur dans 3 min !",6000,3);
SetTimerEx ("Dap",180000,0, "i", Objet);
return 1;
}
// en dessou
public Dap(ObjetADetruire) {
DestroyObject (ObjetADetruire);
}
Dans cet exemple, la variable Objet reste locale à la commande et n'a pas besoin d'être conservée (sa valeur est conservée par l'appel à SetTimerEx).
La variable ap n'est plus nécessaire et peut être supprimée.
J'ai enlevé le DestroyObject qui trainait dans le commande car il ne servait à rien.
Le timer n'est lancé qu'une seule fois pour chaque objet (troisième paramètre à 0).
Sinon, une remarque, dans ton MoveObject, tu mets 2252.4399 comme valeur finale pour la hauteur ce qui fait que quelque soit la hauteur du joueur, il ne montera pas à plus de 2252.4399 mètres de hauteur.
J'aurais plutôt vu un déplacement de 1000 mètres par rapport à la hauteur du joueur au moment de la commande :
MoveObject(Objet,x,y,z+1000.0,2);
Mais c'est juste une suggestion.
Et aussi, 1000 mètre de déplacement à 2 m/s -> 500 secondes (largement plus que les 3 minutes) donc l'objet sera détruit avant qu'il n'arrive à destination.
Comme il est détruit au bout de 180 secondes, il sera monté de 360 metres. Pour corriger ça, on peut soit augmenter la vitesse, soit augmenter le temps du timer soit diminuer la distance parcourue.
Une vitesse trop élevée risque de faire tomber le joueur et un timer trop long risque de gaver certains. Donc ne faire monter la plateforme que de 200 mètres à 4 m/s (50 secondes) me semble un bon compromis.
Soit :
MoveObject(Objet,x,y,z+200.0,4);
Maintenant, c'est à toi de voir et de faire des essais pour savoir ce qui te convient le mieux.
++
Syg