GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Xoss le 04 Octobre 2009, 22:24:59

Titre: Freeze la voiture selon un temps
Posté par: Xoss le 04 Octobre 2009, 22:24:59
Salut, j aimerais svp de l'aide
Je voudrais faire une commande du style /blinder

Cela met la santé du vehicule a 10000
Je veux qu'on ne puisse faire que cette commande sur un cherckpoint et que quand on fasse cette commande ça freeze le vehicule et le jouer 1minutes
Apres ces une minutes les jouers est unfrezzé ainsi que la voiture, qui a a maintenant la vie de 10000

En reflechissant un peu je un peu essayer !

En haut de mon GM :
SetPlayerCheckpoint(playerid, X Y Z , 5.0);

La commande :

        if(strcmp(cmd, "/blindage", true) == 0 ) // Comment definir que ça soit que pour ce checkpoint ?
   {
        SendClientMessage(playerid,COLOR_GREEN, "Des mecanicien sont entrain de blindé ta voiture"); // le message
        TogglePlayerControllable(playerid,0); // le freezer Comment mettre le temps ?
        SetVehiculeHealth(playerid, 1000); // le blindage
        GivePlayerMoney(playerid,-1000); // le prix
   return 1;
   }

Merci de m'aider
Titre: Re : Freeze la voiture selon un temps
Posté par: FuSion le 04 Octobre 2009, 22:31:29
Essaye d'utiliser un DestroyTimer  ;)


++
FS'
Titre: Re : Freeze la voiture selon un temps
Posté par: Xoss le 04 Octobre 2009, 22:42:00
Je connait pas tu peux m'aider
Titre: Re : Freeze la voiture selon un temps
Posté par: MadX le 04 Octobre 2009, 23:08:16
Citer
Comment definir que ça soit que pour ce checkpoint ?
Utilise un PlayerToPoint qui verifie si le joueur est ou il devrait être pour utiliser la commande, je me rappel plus trop comment l'utiliser mais je me rappel d'un poste de cristab ou il expliquait comment faire :happy

Citer
Comment mettre le temps ?
Utilise un SetTimer
http://wiki.sa-mp.com/wiki/SetTimer (http://wiki.sa-mp.com/wiki/SetTimer)

Edit:
Citer
if(PlayerToPoint(5.0, playerid, X,Y,Z)
Le 5.0 correspond à la largeur du playertopoint, c'est comme la taille d'un checkpoint.
Titre: Re : Freeze la voiture selon un temps
Posté par: FuSion le 04 Octobre 2009, 23:12:31
Insère sa dans les bidules prêt des includes :

new FreezeTimer;
Sa dans ta commande :

FreezeTimer = SetTimer("Timer", ton temps, true);
Insère sa a côté des includes :

forward Timer(playerid);
Puis sa dans OneGameModeInit

public Timer(playerid)
{
KillTimer(FreezeTimer);
}

++
FS'
Titre: Re : Freeze la voiture selon un temps
Posté par: MrFredo le 04 Octobre 2009, 23:25:51
La solution de Fusion ne marchera pas et ya plus simple


Dans ta commande:
Code: (pawn) [Sélectionner]
SetTimerEx("Timer",TEMPS EN MS,0,"i",playerid);//On lance un timer qui defreezera le joueur , inutile de stocker la valeur de retour de settimer puisque c'est un timer unique qui s'arretera tout seul une fois le temps passé
En bas du script:
Code: (pawn) [Sélectionner]
forward Timer(playerid);
public Timer(playerid)
{
       TogglePlayerControllable(playerid,1); //On defreeze le joueur
}
Titre: Re : Freeze la voiture selon un temps
Posté par: FuSion le 04 Octobre 2009, 23:34:39
J'ai testé ma solution et sa marche, mais bon .. :closedeyes
++
FS'
Titre: Re : Freeze la voiture selon un temps
Posté par: MrFredo le 04 Octobre 2009, 23:37:41
Normal sa marche pour l'id 0 uniquement  :P

La raison est simple tu appele la fonction Timer depuis un SetTimer mais tu oublie que ta fonction Timer doit prendre le parametre playerid et donc pour transmetre un parametre il faut utiliser SetTimerEx , lorsque tu ne transmet pas le parametre a la fonction celui ci prend une valeur nulle donc 0 donc la fonction s'executera sur l'id 0 peux importe le joueur qui tape la commande ;)
Titre: Re : Freeze la voiture selon un temps
Posté par: Xoss le 05 Octobre 2009, 07:26:36
Merci beaucoup   :happy
Titre: Re : Freeze la voiture selon un temps
Posté par: Ssk le 05 Octobre 2009, 08:16:00
petite erreur Mr Fredo le playerid est un decimal non pas un integer donc a la place de ca


SetTimerEx("Timer",TEMPS EN MS,0,"i",playerid);

C'est ca:
SetTimerEx("Timer",TEMPS EN MS,0,"d",playerid);
Titre: Re : Re : Freeze la voiture selon un temps
Posté par: rafffel le 05 Octobre 2009, 13:01:19
petite erreur Mr Fredo le playerid est un decimal non pas un integer donc a la place de ca


SetTimerEx("Timer",TEMPS EN MS,0,"i",playerid);

C'est ca:
SetTimerEx("Timer",TEMPS EN MS,0,"d",playerid);

Le paramètre qui est passé est l'id du joueur je en voit pas pourquoi il faudrai un decimal pour sa . un integer fera largement l'affaire.
Titre: Re : Freeze la voiture selon un temps
Posté par: Ssk le 05 Octobre 2009, 13:57:01
Oui mais l' id d' un joueur c' est bien un chiffre ??!
Donc c' est un décimal que l' ont met

Preuve:

%b Inserts a number at this position in binary radix
%c Inserts a single character.
%d Inserts an integer (whole) number
%f Inserts a floating point number.
%i Inserts an integer.
%s Inserts a string.
%x Inserts a number in hexadecimal notation.
%% Inserts the literal '%'
Titre: Re : Freeze la voiture selon un temps
Posté par: rafffel le 05 Octobre 2009, 14:46:37
DECIMAL(precision,scale)    variable    precision = 1 à 15 (digits) et scale 1 à 15 (decimals incluses)    Exemple : DECIMAL(10,3) autorisera un nombre de type ppppppp.sss
DOUBLE PRECISION            64 bits    1.7x10-308 à 1.7x10308                                                    notation scientifique, 15 digits de précision
FLOAT                            32 bits    3.4x10-38 à 3.4x1038                                                        simple précision, 7 digits
NUMERIC(precision,scale)    variable    precision = 1 à 15 (digits) et scale 1 à 15 (decimals incluses)    Idem DECIMAL
INTEGER                            32 bits    -2.147.483.648 à 2.147.483.647                                            entier long signé
SMALLINT                            16 bits    -32 768 à 32 767                                                            entier court signé

extrait de cette page : http://interbase.developpez.com/ib-datatype/ (http://interbase.developpez.com/ib-datatype/)

enfaite un integer est un nombre entier allant de -2.147.483.648 à 2.147.483.647
et un decimal et un nombre a virgule .
donc pour moi un integer convient mieux qu'un decimal bien que le decimal convient aussi .

Fin après je pense que c'est aussi valable en pawn .

Quoique en voyant qu'il mette que %d c'est un entier .

Donc j'avoue que je suis un peu perdu :s
Titre: Re : Freeze la voiture selon un temps
Posté par: Xoss le 05 Octobre 2009, 22:14:38
Euh moi aussi mdr
Titre: Re : Re : Freeze la voiture selon un temps
Posté par: cristab le 05 Octobre 2009, 23:23:35
DECIMAL(precision,scale)    variable    precision = 1 à 15 (digits) et scale 1 à 15 (decimals incluses)    Exemple : DECIMAL(10,3) autorisera un nombre de type ppppppp.sss
DOUBLE PRECISION        64 bits    1.7x10-308 à 1.7x10308                            notation scientifique, 15 digits de précision
FLOAT                32 bits    3.4x10-38 à 3.4x1038                              simple précision, 7 digits
NUMERIC(precision,scale)    variable    precision = 1 à 15 (digits) et scale 1 à 15 (decimals incluses)    Idem DECIMAL
INTEGER                32 bits    -2.147.483.648 à 2.147.483.647                        entier long signé
SMALLINT                16 bits    -32 768 à 32 767                                entier court signé

extrait de cette page : http://interbase.developpez.com/ib-datatype/ (http://interbase.developpez.com/ib-datatype/)

enfaite un integer est un nombre entier allant de -2.147.483.648 à 2.147.483.647
et un decimal et un nombre a virgule .
donc pour moi un integer convient mieux qu'un decimal bien que le decimal convient aussi .

Fin après je pense que c'est aussi valable en pawn .

Quoique en voyant qu'il mette que %d c'est un entier .

Donc j'avoue que je suis un peu perdu :s

je ne voit pas ou tu veut en venir enfaite


Titre: Re : Re : Freeze la voiture selon un temps
Posté par: S!m le 06 Octobre 2009, 00:36:26
Salut,

enfaite un integer est un nombre entier allant de -2.147.483.648 à 2.147.483.647
effectivement, mais il existe une version qui ne comprend que des valeurs positives (donc de 0 à 4 294 967 295 inclusivement)

et un decimal et un nombre a virgule .
donc pour moi un integer convient mieux qu'un decimal bien que le decimal convient aussi.
un décimal n'est pas un nombre a virgule (%d), il s'agit simplement d'un nombre en base décimal, bref les nombres en base 10 comme nous les écrivons habituellement
Pour un nombre à virgule (ou en anglais Floating point d'où le tag Float), il faut utiliser %f
dans le script, on rencontre souvent des nombres en base 2 (binaire) et hexadécimale (0xFB8600FF par exemple, base 16)
ps. la conversion hexadécimale -> binaire est bien plus simple que décimale car 4 bit = 1 valeur en hexadécimale (2^4 = 16)

Simple remarques/en bref:

il n'existe qu'un seul type de variable en PAWN: l'entier de 32 bit (en fait on ne peut dire l'entier car cette caractéristique dépend de l'usage)

par la suite, il est utilisé différemment selon les tag associés (Float, bool, File ....)

pour ce qui est de %d ou %i, la différence est négligeable, un ou l'autre, le résultat sera le même... (personnellement j'utilise plus fréquemment %d, mais il s'agit d'une simple habitude)

++Sim++
Titre: Re : Freeze la voiture selon un temps
Posté par: Ssk le 06 Octobre 2009, 08:04:23
héhé

on a tout les deux raison mais moi j' utilise plus le "d"
Titre: Re : Freeze la voiture selon un temps
Posté par: rafffel le 06 Octobre 2009, 14:37:57
ok sim merci pour la précision :)