Bienvenue, Invité. Veuillez vous connecter ou vous inscrire.
Avez-vous perdu votre courriel d'activation?
Connexion avec identifiant, mot de passe et durée de la session

 
avancée

249940 Messages dans 13845 Fils de discussion- par 6285 Membres - Dernier membre: pokerman

04 Février 2012 à 21:09:34
GTAOnline.frSan Andreas MultiplayerScripting SA-MP [Pawn center] (Modérateurs: S!m, Ssk, Xartrick)Probleme: Timer
Pages: [1] 2   Bas de page
Imprimer
Auteur Fil de discussion: Probleme: Timer  (Lu 1037 fois)
0 Membres et 1 Invité sur ce fil de discussion.
3klips
Hors ligne Hors ligne

Criminel entrainé
*

Messages: 62


« 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 :
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?
Journalisée
Sismix84
Hors ligne Hors ligne


Tueur en série
*

Messages: 247


« Répondre #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 :

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);
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  Clin d'oeil
Journalisée
3klips
Hors ligne Hors ligne

Criminel entrainé
*

Messages: 62


« Répondre #2 le: 11 Février 2008 à 20:10:44 »

Non  Triste
L'assenceur apparait pas
Journalisée
Sismix84
Hors ligne Hors ligne


Tueur en série
*

Messages: 247


« Répondre #3 le: 11 Février 2008 à 20:24:08 »

Alors, je sais pas; désolé Triste. Attend l'arrivée d'un spécialiste.
Journalisée
Nip
Hors ligne Hors ligne


GTAOnline Big Member
*

>> mon steam: v__manu (il y a deux _)

Messages: 316


« Répondre #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 !!
Journalisée
3klips
Hors ligne Hors ligne

Criminel entrainé
*

Messages: 62


« Répondre #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
Journalisée
UrbanGhetto
Hors ligne Hors ligne


GTAOnline Addict
*

I PWN You !

Messages: 932


WWWUrbanGhetto

« Répondre #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...
Journalisée


˙·٠•● 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 ●•٠·˙
Syg
Expert programmeur C/C++/PAWN
Hors ligne Hors ligne


Administrateur
GTAOnline Legend
*

The GTAOnline Jesus

Messages: 3767


« Répondre #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 :
Code:
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 :
Code:
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 :
Code:
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
Journalisée

Courtesy of GtaManiac
3klips
Hors ligne Hors ligne

Criminel entrainé
*

Messages: 62


« Répondre #8 le: 15 Février 2008 à 13:37:29 »

Ok donc si j'ai bien compri je doit faire sa:

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

Probleme :s:

(679) : error 025: function heading differs from prototype
« Dernière édition: 15 Février 2008 à 17:17:45 par 3klips » Journalisée
ApocKalipsS
Hors ligne Hors ligne


GTAOnline Addict
*

**** | Une experience GTA IV hors du commun !

Messages: 1085


« Répondre #9 le: 15 Février 2008 à 21:09:39 »

Euh non tu fait :

Code:
679: public Dap() {
680:        DestroyObject  (Objet);
681:}
Journalisée
3klips
Hors ligne Hors ligne

Criminel entrainé
*

Messages: 62


« Répondre #10 le: 16 Février 2008 à 11:11:00 »

Si je fait sa par contre => error 017: undefined symbol "Objet"
Journalisée
NatiVe
Group: CNDIEN Killer
Hors ligne Hors ligne


GTAOnline Legend
*

Messages: 4814






NatiVe77NV

NatiVe77NV

« Répondre #11 le: 16 Février 2008 à 11:23:18 »

Definie le OBJECT

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

NV.

Journalisée

N a t i V e ™ - T r i s t a n ™



Citation de: VQZY
J'adorerai changer le monde, mais pas moyen de mettre la main sur le code source.
3klips
Hors ligne Hors ligne

Criminel entrainé
*

Messages: 62


« Répondre #12 le: 16 Février 2008 à 11:42:25 »

Code:
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...
Journalisée
rivoal29
Hors ligne Hors ligne


Tueur en série
*

Messages: 268


rivoal29

« Répondre #13 le: 16 Février 2008 à 12:08:52 »

Moi sa ne marche pas  Triste
La plateforme n'apparait pas mais ya écrit quand meme destruction... au milieu de l'écran
Mais pas de plateforme
On peut m'aider  wallbash  wallbash  wallbash
Journalisée


ApocKalipsS
Hors ligne Hors ligne


GTAOnline Addict
*

**** | Une experience GTA IV hors du commun !

Messages: 1085


« Répondre #14 le: 16 Février 2008 à 19:07:48 »

Nan tu fait un forward...

forward dap (objet);
Journalisée
Pages: [1] 2   Haut de page
Imprimer
Aller à:  

Theme créé par padexx et modifié par GTAOnline.fr
Page générée en 0.521 secondes avec 22 requêtes.
Forum GTAOnline.fr 2.0 | Design par : Lalu et GtaManiac
Merci a toute la communaute pour son support !
Copyright © 2004-2012 - GTAOnline.fr | GTAPro.com