GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: ApocKalipsS le 28 Décembre 2007, 19:27:02
-
if (strcmp("/buycj", cmdtext, true) == 0){
if (IsPlayerInArea(playerid,2520.434, 2421.56, -1634.489, -1737.13)) { // max_x, min_x max_y, min_y
GivePlayerMoney(playerid, -50000);
GameTextForPlayer(playerid, "~r~Ok, ~w~tu as acheter la ~b~maison de Cj", 5000, 5);
SendClientMessage(playerid, COLOR_GREEN, "Tu peux revenir à tous moment sans payer.");
SetPlayerInterior(playerid,3);
SetPlayerPos(playerid, 2496.1284,-1693.8943,1014.7422);
SetPlayerFacingAngle(playerid, 184.3867);
SetCameraBehindPlayer (playerid);
}else{
}
}
}
Salut, moi qui m'aitrise pas beaucoup les "else", je voudrais que vous me dîtes comment mettre un message quand je n'est pas assez d'argent ...
J'ai déjà mit un else mais c'est pour quand on est pas dans la zone.
Voila aidez-moi plz ! :D
-
salut,
C'est très simple, tu met une ligne au début et à la fin, comme ceci:
if(GetPlayerMoney(playerid) >= le montant nécéssaire){//tu fais ta commande ici par exemple:
GivePlayerMoney(playerid,-50000);
GameTextForPlayer(playerid, COLOR_GREEN, "Tu peux revenir à tous moment sans payer.");
//....
}else return SendClientMessage(playerid,COLOR_RED,"Tu n'as pas suffisament d'argent pour acheter cette maison.");
c'est très simple, comme je vien de dire,
tu regarde si le joueur a suffisament d'argent avec le GetPlayerMoney >= (est plus grand ou égal à...)
puis à la fin, le else signifie sinon, s'il avait suffisament d'argent, le else n'est pas appeler,
mais si le joueur n'avais pas l'argent, le else lui dit, sinon, envoie lui ce message. :happy
Les else if sont équivalent excepté qu'ils regardent une autre condition(ce n'est qu'un else suivit d'un if) :ohmy
et permettent donc d'avoir plus de 2 possibilité. :D
J'espere t'avoir suffisament aidé ;)
++Sim++
-
Ouki, merci Sim !
Il me falais juste le... :
if(GetPlayerMoney(playerid) >= le montant nécéssaire){//tu fais ta commande ici par exemple:
Voila merci beaucoup !
-
De rien,
en plus c'est en ligne si d'autres se posent la meme question!!
et bonne année :D :D
:cheers
:jesors
-
//---------------------------------------------------------
#include <a_samp>
#include <core>
#include <float>
#define COLOR_RED 0xAA3333AA
#define COLOR_YELLOW 0xFFFF00AA
#define COLOR_GREEN 0x33AA33AA
new argent[MAX_PLAYERS] = 0;
new bomb;
forward kill(playerid);
C'est ce qu'il y est en haut du GM...
//---------------------------------------------------------
public OnPlayerDeath(playerid, killerid, reason)
{
new name[MAX_PLAYER_NAME+1];
new string[256];
new message[256];
GetPlayerName(playerid, name, sizeof(name));
format(string, sizeof(string), "%s est mort.", name, reason);
SendClientMessageToAll(COLOR_RED, string);
if(argent(playerid) >= 1);
{
argent[playerid] -= 1;
SendClientMessage(playerid,COLOR_YELLOW,message);
format(message, sizeof(message),"[!] DRCash points : -1");
}
else return argent[playerid] -= 0;
return 1;
}
//---------------------------------------------------------
C'est les lignes concernés...
C:\Program Files\Rockstar Games\GTA San Andreas\gamemodes\ls-parachute2.pwn(360) : error 012: invalid function call, not a valid address
C:\Program Files\Rockstar Games\GTA San Andreas\gamemodes\ls-parachute2.pwn(360) : warning 215: expression has no effect
C:\Program Files\Rockstar Games\GTA San Andreas\gamemodes\ls-parachute2.pwn(360) : error 001: expected token: ";", but found ")"
C:\Program Files\Rockstar Games\GTA San Andreas\gamemodes\ls-parachute2.pwn(360) : error 029: invalid expression, assumed zero
C:\Program Files\Rockstar Games\GTA San Andreas\gamemodes\ls-parachute2.pwn(360) : fatal error 107: too many error messages on one line
Compilation aborted.Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
4 Errors.
J'ai pas trouvé le problème...
PS : argent = la monnaie qui remplace le dollars du jeu...
-
salut,
je voudrais te dire que c'est vraiment une bonne chose que tu aie mit une autre monnai, je pense à faire pareil sur mon serveur :happy :cheers
selon moi, il y a certaines choses à changer, comme le name[MAX_PLAYER_NAME+1] :blink :blink
qu'es que c'est ca???? ;D ;D
La variable entre [] représente tous simplement la longueur du nom, le nombre de symbole qu'il contient, :ohmy
met tout simplement 24(c'est la longueur maximale d'un nom) 8)
cela ne devrait régler aucune de tes erreur mais j'y vois quand même un certain risque de "BUG",
la ligne 360, es-ce qu'il s'agit du: format(string, sizeof(string), "%s est mort.", name, reason);
si oui, Tu as insérer deux valeurs à la fin alors qu'il n'y a qu'un seul %s
il faudrait la change pour:
format(string, sizeof(string), "%s est mort.(%s)", name, reason);
Si sa marche pas, tu pourrait peut-être être plus précis sur la ligne en question.. :bangin
et je n'ai pas testé donc je ne suis pas sûr que ça marche :closedeyes
++Sim++
-
met tout simplement 24(c'est la longueur maximale d'un nom) 8)
Non, l'utilisation du define MAX_PLAYER_NAME (qui se trouve dans a_samp.inc) a un double avantage :
1 - Si cette valeur change dans la prochaine version de SAMP, un simple recompilation du script suffit.
2 - Si ton script de 20000 lignes contient 67 lignes avec la valeur 24, il faudra que tu les retrouves toutes pour les modifiées un par une. Alors que si les lignes contiennent MAX_PLAYER_NAME, tu n'as même pas besoin de les chercher.
NB : Le +1 sert à réserver la place pour le caractère de fin de chaîne.
format(string, sizeof(string), "%s est mort.(%s)", name, reason);
Ceci ne fonctionne pas car la variable resaon n'est pas une chaîne de caractères mais un nombre (compris entre 0 et 2).
il aurait donc fallu mettre :
format(string, sizeof(string), "%s est mort.(%d)", name, reason);
Mais ce nombre entre parenthèses n'est pas très parlant. Je pense que le mieux c'est de ne rien mettre :
format(string, sizeof(string), "%s est mort.", name);
Sinon, pour repondre à ton problème Malppower, ton erreur vient de cette ligne :
if(argent(playerid) >= 1);
Supprime le ; (point-virgule) à la fin de cette ligne, c'est lui qui provoque tes erreurs su la ligne qui contient le else
++
Syg
-
heu j'ai remplacé le message de "*** est mort" par un "SetDeathMessage" ensuite je vous tiens au courant...
EDIT : Non ca donne rien, mais j'ai supprimé des erreurs, regardez ca...
EDIT 2 : erreurs toutes trouvés !! Merci !!
-
salut,
par contre, pour la raison, je vien de penser à quelque chose,
tu peut créer un string qui serait la raison en text:
public OnPlayerDeath(playerid, killerid, reason)
{
new name[MAX_PLAYER_NAME+1], new string[256], message[256],raison[256]
GetPlayerName(playerid, name, sizeof(name));
if(reason == 0) return raison = Chute(je ne sais pas les vraies raisons)
if(reason == 1) return raison = Assassiné
format(string, sizeof(string), "%s est mort.(%s)", name, raison); ««««««««««--------------------ICI tu insere le string créé
SendClientMessageToAll(COLOR_RED, string);
if(argent(playerid) >= 1);
{
argent[playerid] -= 1;
SendClientMessage(playerid,COLOR_YELLOW,message);
format(message, sizeof(message),"[!] DRCash points : -1");
}
else return argent[playerid] -= 0;
return 1;
}
Je crois que cela devrait être à peu près ce que tu désirais, il va juste falloir que tu cherche sur WIKI pour trouver les vraies significations des différentes valeurs ;)
++Sim++
-
ouaip ca a l'air bien...
-
Bonjour, (je remonte ce topic mais bon ca sert à rien d'en avoir 2 quasi pareille)
Je voudrais maintenant savoir comment faire pour un skin... exemple :
if(GetPlayerSkin(playerid) = 265)
J'ai essayer ca mais nan ! Donc si quelsu'un sais... Merci !
-
if(GetPlayerSkin(playerid) == 265)
Voila je pense que c sa
-
Merci ca marche ! :D
Maintenant 2° Question : comment je fais pour dire : Si le joueur n'as pas ce skin la ?
If(GetPlayerSkin(playerid) == 265)
{
//action
}else //Le je doit mettre quoi ?{
//action
}
-
Tu fait comme d'habitude pas besoin de mettre quelque chose a coté du else
-
Ahh ba oui j'y avais même pas pensé qu'on est pas obkigé de mettre quelqu'chose -_-'
-
salut
lepro,
au cas où tu voudrais mettre une autre action si le joueur n'a pas le skin en question, :-X
tu n'as qu'a mettre un ! en avant, ;)
le ! signifie l'inverse,
donc si tu lui dit de faire une action si le joueur a le skin,
tu met un ! et se sera comme si tu lui disait s'il est faux que le joueur a le skin, fait ce qui suit....
donc le code:
if(!GetPlayerSkin(playerid) == 265) {
//action
}
:hs
P.S. juste un truc en passant, pour ceux qui n,aurait pas remarquer, lorsqu'on a environ 25 erreurs qui nous arrivent tout d'un coup il s'agit souvent d'une fermeture d'accolade manquant(})
fin du HS
et voila, c a peu près ca ;)
++SIM++
-
L'exemple que tu donnes n'est pas bon Sim.
En fait le ! (point d'exclamation) veut dire NOT (ce qui correspond effectivement plus ou moins à l'inverse).
Et un NOT en PAWN (ou C ou C++ ou ...) est une inversion de tous les bits d'une expression (variable, code retour de fonction, résultat d'un test)
Comme exemple il aurait fallu donner :
/* Si le joueur n'est pas admin */
if (!IsPlayerAdmin (playerid))
Et ton exemple aurai du s'écrire :
if (GetPlayerSkin(playerid) != 265)
ou
if (!(GetPlayerSkin(playerid) == 265))
Avec des parenthèses opur encadrer TOUT le test.
D'ailleurs, le test que tu as écrit ne sera jamais vérifié.
Démonstration :
Chaque variable est stockée sur 32 bits dans PAWN (sauf les chaines de caractères).
Donc imaginons, un joueur qui à le skin 233 (qui devrait vérifié ton test puisque tu veux ceux qui n'ont pas le 265).
La fonction GetPlayerSkin nous retourne donc 233 (=11101001 en binaire)
En fait plus exactement 00000000000000000000000011101001 (binaire sur 32 bits)
Maintenant, si on calcul !233, on trouve !00000000000000000000000011101001 = 11111111111111111111111100010110
Ce qui fait 4294967062 en décimal et donc ton test n'est pas vérifié car 4294967062 n'est pas égal à 265 (si si, je vous assure, c'est deux nombres différents).
Si il y en a qui ont pas compris, qu'il le dise, j'écrirais deux pages de plus sur l'algèbre booléenne (qu'il vous faudra apprendre par coeur).
++
Syg
-
salut,
désolé
j'ai fait ce bout de code très rapidement
je n'ai pas regarder si la syntaxe était ok :closedeyes
mais c'est vraiment interressant a savoir exactement
(l'avis d'un pro est toujours meilleure) :D
++Sim++
-
La syntaxe était correcte, mais le résultat non.
En fait, c'est un des gros problèmes du C/C++ et du PAWN, on peut écrire des lignes de code qui compilent mais qui font n'importe quoi (ou du moins pas ce qu'on voudrait qu'elles fassent). Et ce genre d'erreur est souvent très difficile à trouver et à corriger.
Par exemple, le point-virgule malencontreux :
if (IsPlayerAdmin (playerid));
{
SetVehicleHealth (GetPlayerVehicleID (playerid), 1000.0);
}
Dans cette exemple, le SetVehicleHealth est exécuté, même si le joueur n'est pas admin.
Il existe des dizaines de cas dans ce genre. (= à la place de ==, nombre de % différent du nombre de paramètres dans un format, etc ...)
++
Syg