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

Titre: Else... else if... :s
Posté 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
Titre: Re : Else... else if... :s
Posté par: S!m le 02 Janvier 2008, 22:22:23
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++
Titre: Re : Else... else if... :s
Posté par: ApocKalipsS le 02 Janvier 2008, 22:50:26
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 !
Titre: Re : Else... else if... :s
Posté par: S!m le 03 Janvier 2008, 00:56:35


De rien,
en plus c'est en ligne si d'autres se posent la meme question!!

et bonne année :D :D
 :cheers

 :jesors
Titre: Re : Else... else if... :s
Posté par: Malppower le 03 Janvier 2008, 15:25:11
Code: (cpp) [Sélectionner]
//---------------------------------------------------------

#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...

Code: (cpp) [Sélectionner]
//---------------------------------------------------------

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...

Citer
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...
Titre: Re : Else... else if... :s
Posté par: S!m le 03 Janvier 2008, 19:24:46
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++
Titre: Re : Re : Else... else if... :s
Posté par: Syg le 03 Janvier 2008, 23:24:15
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
Titre: Re : Else... else if... :s
Posté par: Malppower le 04 Janvier 2008, 01:14:37
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 !!
Titre: Re : Else... else if... :s
Posté par: S!m le 12 Janvier 2008, 03:09:54
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++
Titre: Re : Else... else if... :s
Posté par: Malppower le 12 Janvier 2008, 10:50:35
ouaip ca a l'air bien...
Titre: Re : Else... else if... :s
Posté par: ApocKalipsS le 26 Janvier 2008, 17:28:47
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 !
Titre: Re : Re : Else... else if... :s
Posté par: MrFredo le 26 Janvier 2008, 17:43:22

 if(GetPlayerSkin(playerid) == 265)


Voila je pense que c sa
Titre: Re : Else... else if... :s
Posté par: ApocKalipsS le 26 Janvier 2008, 17:50:24
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
}
Titre: Re : Else... else if... :s
Posté par: MrFredo le 26 Janvier 2008, 22:01:30
Tu fait comme d'habitude pas besoin de mettre quelque chose a coté du else
Titre: Re : Else... else if... :s
Posté par: ApocKalipsS le 27 Janvier 2008, 08:38:49
Ahh ba oui j'y avais même pas pensé qu'on est pas obkigé de mettre quelqu'chose -_-'
Titre: Re : Else... else if... :s
Posté par: S!m le 01 Février 2008, 00:20:43
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++
Titre: Re : Else... else if... :s
Posté par: Syg le 01 Février 2008, 01:25:11
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
Titre: Re : Else... else if... :s
Posté par: S!m le 01 Février 2008, 05:24:54
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++
Titre: Re : Else... else if... :s
Posté par: Syg le 01 Février 2008, 10:23:44
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