GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: 3klips le 11 Février 2008, 19:20:38

Titre: Probleme: Timer
Posté par: 3klips le 11 Février 2008, 19:20:38
Bonjour à tous =),
Bon voila je vous explique.
Quand je fait /asc(assenceur) sur mon serveur, une jolie plateforme se mets sous tes pied et monte dans les air.
Pas de probleme de se coté la.
Donc dans mon code :
if(strcmp(cmdtext,"/asc",true)==0)
{
new Float:x;
new Float:y;
new Float:z;
GetPlayerPos(playerid,x,y,z);
ap = CreateObject(7909,x,y,z-3,271.000000,0.000000,0.000000);
MoveObject(ap,x,y,2252.4399,2);
GameTextForPlayer(playerid,"~g~Destruction de l'assenceur dans 3 min !",6000,3);
SetTimer("Dap",180000,1);

return 1;
}

// en dessou

public Dap() {
DestroyObject (ap);
}

Dans mon code, je fais un timer qui permet de détruire l'assenceur apres 3 minutes, pour évité si plusieur personne en font, le crash du serveur.
J'en viens donc au faite:
Je monte dans les aire avec mon premier assenceur, 2 minute apres, je veux monté plus haut donc je refait un deuxieme => /asc à nouveau
Probleme, mon premier timer agis sur les 2 assenceur.
Comment y remédier?
Titre: Re : Probleme: Timer
Posté par: Sismix84 le 11 Février 2008, 19:35:55
Je ne suis pas sûr mais détruit directement le premier objet quand tu fait ta commande /asc en rajoutant la ligne DestroyObject à ta commande :

if(strcmp(cmdtext,"/asc",true)==0)
{
new Float:x;
new Float:y;
new Float:z;
GetPlayerPos(playerid,x,y,z);
ap = CreateObject(7909,x,y,z-3,271.000000,0.000000,0.000000);
DestroyObject (ap);
MoveObject(ap,x,y,2252.4399,2);
GameTextForPlayer(playerid,"~g~Destruction de l'assenceur dans 3 min !",6000,3);
SetTimer("Dap",180000,1);

return 1;
}

// en dessou

public Dap() {
DestroyObject (ap);
}

Je pense que c'est ça essai  ;)
Titre: Re : Probleme: Timer
Posté par: 3klips le 11 Février 2008, 20:10:44
Non  :(
L'assenceur apparait pas
Titre: Re : Probleme: Timer
Posté par: Sismix84 le 11 Février 2008, 20:24:08
Alors, je sais pas; désolé :(. Attend l'arrivée d'un spécialiste.
Titre: Re : Probleme: Timer
Posté par: Nip le 11 Février 2008, 20:31:11
Salut
tu doit suprimé le premier /asc puis en cree un autre pas en le contraire !!
Titre: Re : Probleme: Timer
Posté par: 3klips le 11 Février 2008, 20:42:25
Bein ouai, mais ses pasque j'ai vu que dans un serveur il fesait sa, donc :s
Titre: Re : Probleme: Timer
Posté par: UrbanGhetto le 12 Février 2008, 21:14:28
Tu calcules le temps que mets l'assenseur pour monter, Tu fais un nouveau Timer et tu mets un DestroyObject dedant...
Titre: Re : Probleme: Timer
Posté par: Syg le 14 Février 2008, 12:07:49
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
Titre: Re : Probleme: Timer
Posté par: 3klips le 15 Février 2008, 13:37:29
Ok donc si j'ai bien compri je doit faire sa:

679: public Dap(Objet){
680:        DestroyObject  (Objet);
681:}

Probleme :s:

(679) : error 025: function heading differs from prototype
Titre: Re : Probleme: Timer
Posté par: ApocKalipsS le 15 Février 2008, 21:09:39
Euh non tu fait :

679: public Dap() {
680:        DestroyObject  (Objet);
681:}
Titre: Re : Probleme: Timer
Posté par: 3klips le 16 Février 2008, 11:11:00
Si je fait sa par contre => error 017: undefined symbol "Objet"
Titre: Re : Probleme: Timer
Posté par: NatiVe™ le 16 Février 2008, 11:23:18
Definie le OBJECT

Sinon c'est sur que sa risque pas de marcher :happy

NV.

Titre: Re : Probleme: Timer
Posté par: 3klips le 16 Février 2008, 11:42:25
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;
}

C'est fait je pense non?
Si je le mets tout en haut de mon script, j'ai re le probleme de départ...
Titre: Re : Probleme: Timer
Posté par: rivoal29 le 16 Février 2008, 12:08:52
Moi sa ne marche pas  :(
La plateforme n'apparait pas mais ya écrit quand meme destruction... au milieu de l'écran
Mais pas de plateforme
On peut m'aider  :wall  :wall  :wall
Titre: Re : Probleme: Timer
Posté par: ApocKalipsS le 16 Février 2008, 19:07:48
Nan tu fait un forward...

forward dap (objet);
Titre: Re : Probleme: Timer
Posté par: 3klips le 16 Février 2008, 19:46:32
Quel con -___- xD^^
Merci :p