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
-
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
-
Essaye d'utiliser un DestroyTimer ;)
++
FS'
-
Je connait pas tu peux m'aider
-
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
Comment mettre le temps ?
Utilise un SetTimer
http://wiki.sa-mp.com/wiki/SetTimer (http://wiki.sa-mp.com/wiki/SetTimer)
Edit: if(PlayerToPoint(5.0, playerid, X,Y,Z)
Le 5.0 correspond à la largeur du playertopoint, c'est comme la taille d'un checkpoint.
-
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'
-
La solution de Fusion ne marchera pas et ya plus simple
Dans ta commande:
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:
forward Timer(playerid);
public Timer(playerid)
{
TogglePlayerControllable(playerid,1); //On defreeze le joueur
}
-
J'ai testé ma solution et sa marche, mais bon .. :closedeyes
++
FS'
-
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 ;)
-
Merci beaucoup :happy
-
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);
-
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.
-
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 '%'
-
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
-
Euh moi aussi mdr
-
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
-
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++
-
héhé
on a tout les deux raison mais moi j' utilise plus le "d"
-
ok sim merci pour la précision :)