• 08 Juillet 2025, 00:25:49


Auteur Sujet: Probleme: Timer  (Lu 3055 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne 3klips

  • *
  • Tueur
  • Messages: 62
    • Voir le profil
Probleme: Timer
« 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?

Hors ligne Sismix84

  • *
  • Tueur en série
  • Messages: 247
    • Voir le profil
Re : Probleme: Timer
« Réponse #1 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  ;)

Hors ligne 3klips

  • *
  • Tueur
  • Messages: 62
    • Voir le profil
Re : Probleme: Timer
« Réponse #2 le: 11 Février 2008, 20:10:44 »
Non  :(
L'assenceur apparait pas

Hors ligne Sismix84

  • *
  • Tueur en série
  • Messages: 247
    • Voir le profil
Re : Probleme: Timer
« Réponse #3 le: 11 Février 2008, 20:24:08 »
Alors, je sais pas; désolé :(. Attend l'arrivée d'un spécialiste.

Hors ligne Nip

  • *
  • Bandit
  • >> mon steam: v__manu (il y a deux _)
  • Messages: 314
    • Voir le profil
Re : Probleme: Timer
« Réponse #4 le: 11 Février 2008, 20:31:11 »
Salut
tu doit suprimé le premier /asc puis en cree un autre pas en le contraire !!

Hors ligne 3klips

  • *
  • Tueur
  • Messages: 62
    • Voir le profil
Re : Probleme: Timer
« Réponse #5 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

Hors ligne UrbanGhetto

  • *
  • Grand Banditisme
  • I PWN You !
  • Messages: 948
    • Voir le profil
    • http://h2oteam.roxorgamers.com/
Re : Probleme: Timer
« Réponse #6 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...

˙·٠•● Je dis, mieux vaut toucher à un clavier qu'a de la drogue | Le meilleur topic du forum | Ce que j'ai fait a fait de moi ce que je suis ●•٠·˙

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Probleme: Timer
« Réponse #7 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
Courtesy of GtaManiac

Hors ligne 3klips

  • *
  • Tueur
  • Messages: 62
    • Voir le profil
Re : Probleme: Timer
« Réponse #8 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
« Modifié: 15 Février 2008, 17:17:45 par 3klips »

Hors ligne ApocKalipsS

  • *
  • Gangster
  • **** | Une experience GTA IV hors du commun !
  • Messages: 1141
    • Voir le profil
Re : Probleme: Timer
« Réponse #9 le: 15 Février 2008, 21:09:39 »
Euh non tu fait :

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

Hors ligne 3klips

  • *
  • Tueur
  • Messages: 62
    • Voir le profil
Re : Probleme: Timer
« Réponse #10 le: 16 Février 2008, 11:11:00 »
Si je fait sa par contre => error 017: undefined symbol "Objet"

Hors ligne NatiVe™

  • *
  • Messages: 7977
    • Voir le profil
Re : Probleme: Timer
« Réponse #11 le: 16 Février 2008, 11:23:18 »
Definie le OBJECT

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

NV.



Tu vois avant? Bah j'étais là encore avant!

Hors ligne 3klips

  • *
  • Tueur
  • Messages: 62
    • Voir le profil
Re : Probleme: Timer
« Réponse #12 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...

Hors ligne rivoal29

  • *
  • Bandit
  • Messages: 269
    • Voir le profil
Re : Probleme: Timer
« Réponse #13 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


Hors ligne ApocKalipsS

  • *
  • Gangster
  • **** | Une experience GTA IV hors du commun !
  • Messages: 1141
    • Voir le profil
Re : Probleme: Timer
« Réponse #14 le: 16 Février 2008, 19:07:48 »
Nan tu fait un forward...

forward dap (objet);