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
-
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?
-
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 ;)
-
Non :(
L'assenceur apparait pas
-
Alors, je sais pas; désolé :(. Attend l'arrivée d'un spécialiste.
-
Salut
tu doit suprimé le premier /asc puis en cree un autre pas en le contraire !!
-
Bein ouai, mais ses pasque j'ai vu que dans un serveur il fesait sa, donc :s
-
Tu calcules le temps que mets l'assenseur pour monter, Tu fais un nouveau Timer et tu mets un DestroyObject dedant...
-
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
-
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
-
Euh non tu fait :
679: public Dap() {
680: DestroyObject (Objet);
681:}
-
Si je fait sa par contre => error 017: undefined symbol "Objet"
-
Definie le OBJECT
Sinon c'est sur que sa risque pas de marcher :happy
NV.
-
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...
-
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
-
Nan tu fait un forward...
forward dap (objet);
-
Quel con -___- xD^^
Merci :p