GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Ashley11 le 03 Novembre 2011, 19:04:30
-
Bonsoir, :D
J'ai un problème avec la commande "/stats", en effet lorsque je compile tout se passe à merveille mais quand je tape la commande en jeu j'obtiens un :
SERVEUR: UNKNOWN Commande. :wall
Voici le code :
public OnPlayerCommandText(playerid, cmdtext[])
{
if(IsPlayerIsAdmin(playerid, 3))
{
if(strcmp("/stopspec", cmdtext, true) == 0)
{
TogglePlayerSpectating(playerid, 0);
}
dcmd(kick, 4, cmdtext);
dcmd(ban, 3, cmdtext);
dcmd(spec, 4, cmdtext);
else
{
SendClientMessage(playerid, COLOR_RED, "ERROR: You are not an ADMIN !");
return 1;
}
}
if(strcmp("/stats", cmdtext, true, 10) == 0)
{
new string[128];
new name[MAX_PLAYER_NAME];
new score = GetPlayerScore(playerid);
new ratio = score/mort;
GetPlayerName(playerid, name, sizeof(name));
format(string, sizeof(string), "%s | ID: %d | Score: %d | Death: %d | Ratio: %f | Money: %d", name, playerid, score, mort, ratio, GetPlayerMoney(playerid));
SendClientMessage(playerid, COLOR_ORANGE, string);
return 1;
}
return 0;
}
-
T'as inversé l'ordre des conditions, teste si le joueur tape la commande, puis s'il est admin.
PS : C'est "Unknown" ;)
++
-
C'est voulu.
J'ai trouver l'erreur, c'est le ratio, car si j’enlève sa marche, j'ai essayer avec ça mais pareille :
new score = GetPlayerScore(playerid);
new ratio = score/mort;
-
le ratio c'est un Float donc %f et pas %d :)
-
C'est juste Spiirou mais le %f n'est pas obligatoire, PAWN fera la conversion en entier, le résultat ne sera pas celui attendu mais l'affichage se fera.
En fait, le problème vient du fait que tu fais une division par un variable qui peut prendre la valeur 0 :
GetPlayerScore(playerid)/mort
Si la variable vaut 0, il est certain que ta commande ne se terminera pas et que tu auras le message "Unknown command".
Dans le cas d'un serveur qui démarre et sur lequel il n'y a que toi, cette variable sera forcément à 0.
De plus, la variable mort devrait être liée au joueur car il y a fort à parier que tu vas compter les morts (ou meurtres) de tous les joueurs dans cette même variable. Mais c'est un autre problème.
Et écoute Gilux, il est de bons conseils.
++
Syg
-
Merci Syg, comme quoi il faut toujours se relire ::)
J'ai procédé comme ceci :
enum Info
{
mort
};
new InfoJoueur[MAX_PLAYER][Info];
et dans le OnPlayerDeath
InfoJoueur[playerid][mort]++;
-
Très bien, maintenant, il ne te reste plus qu'à vérifier que cette valeur n'est pas à 0 quand tu fais la division pour calculer le ratio.
++
Syg
-
Merci, j'ai essayer comme ça :
new ratio = if((score/InfoJoueur[playerid][mort])!=0);
Mais j'obtiens des erreurs donc j'en conclu que je ne doit pas faire comme ça.
Je me suis permis d'afficher les "stats" seulement quand le score>0, mais si tu as une autre idée je suis preneur ::)
if(ratio != 0)
{
GetPlayerName(playerid, name, sizeof(name));
format(string, sizeof(string), "%s | ID: %d | Score: %d | Death: %d | Ratio: %d | Money: %d", name, playerid, score, InfoJoueur[playerid][mort], ratio, GetPlayerMoney(playerid));
SendClientMessage(playerid, COLOR_ORANGE, string);
}
Merci d'avance
-
Tu utilise une condition avec un operateur dans cette liste :
- a > b - a est strictement supérieur à b
- a < b - a est strictement inférieur à b
- a >= b - a est supérieur ou égal à b
- a <= b - a est inférieur ou égal à b
- a == b - a est égal à b
- a != b - a est différent de b
Exemple, si tu veux tester si a est inferieur ou egal à b :
if( a <= b) // Si a est inférieur ou égal à b
{
// Code
}
else // Sinon ( a est supérieur à b )
{
// Code
}
Spiirou
++
-
Merci spiirou
meme si je connait déjà la liste :D
Mais ce que Syg ma dit, est de n'affiche le ratio seulement quand ratio != 0..
-
Tu continu a faire le calcule et tu divise donc encore par 0 (prends un calculette scientifique(si tu en a une, je sais pas si les calculettes classic le font), ou meme la calculatrice de windows) fait une division dont le dénominateur est 0 elle te dira erreur, le script te fera pareil, donc sa te fera planter ta commande. Donc fais plutot comme sa:
if(InfoJoueur[playerid][mort] != 0)
{
//ton code
}
-
if(InfoJoueur[playerid][mort] == 0) InfoJoueur[playerid][ratio] = GetPlayerScore(playerid); // Valable uniquement si le score est le nombre de tués
// Ton code
Si le joueur n'est jamais mort, alors le ratio est tout simplement le nombre de tués :p
-
Merci à vous 2,
Mais je comprend toujours pas comment faire...
Je vous donne mon code actuel :
if(strcmp("/stats", cmdtext, true, 10) == 0)
{
new string[128];
new name[MAX_PLAYER_NAME];
if(InfoJoueur[playerid][mort] != 0)
{
new score = GetPlayerScore(playerid);
new ratio = score/InfoJoueur[playerid][mort];
GetPlayerName(playerid, name, sizeof(name));
format(string, sizeof(string), "%s | ID: %d | Score: %d | Death: %d | Ratio: %d | Money: %d", name, playerid, score, InfoJoueur[playerid][mort], ratio, GetPlayerMoney(playerid));
SendClientMessage(playerid, COLOR_ORANGE, string);
}
return 1;
}
-
if(strcmp("/stats", cmdtext, true, 10) == 0)
{
new string[128]; // string pour contenir le texte formaté
new name[MAX_PLAYER_NAME]; // name pour contenir le nom du joueur
if(InfoJoueur[playerid][mort] != 0)
{
new score = GetPlayerScore(playerid); // On mets le score du joueur dans la var score
new Float:ratio; // On crée la variable qui va contenir le ratio
if( InfoJoueur[playerid][mort] == 0) ratio = score; // Si le nombre de morts est nul, son ration est égal a son score
else ratio = score/InfoJoueur[playerid][mort]; // sinon, le ratio est égal a tués/morts
GetPlayerName(playerid, name, sizeof(name)); // on récupéré le nom du joueur
format(string, sizeof(string), "%s | ID: %d | Score: %d | Death: %d | Ratio: %.2f | Money: %d", name, playerid, score, InfoJoueur[playerid][mort], ratio, GetPlayerMoney(playerid));
SendClientMessage(playerid, COLOR_ORANGE, string);
}
return 1;
}
PS: %d affiche un entier ( integer ),
et %f affiche un nombre a virgule( float ).
Pour preciser le nombre de decimal on fait comme ca :
- 1decimale : %.1f
- 4decimales : %.4f
-
Tu as fait des erreurs spiirou,
Tu créer une premire condition if(InfoJoueur[playerid][mort] != 0) et juste aprés une autre imbriquer
if( InfoJoueur[playerid][mort] == 0)
En revanche avec ce code tout fonctionne à merveille :happy :
if(strcmp("/stats", cmdtext, true, 10) == 0)
{
new string[128];
new name[MAX_PLAYER_NAME];
new score = GetPlayerScore(playerid);
new Float:ratio;
if(InfoJoueur[playerid][mort] == 0)
{
ratio = score;
GetPlayerName(playerid, name, sizeof(name));
format(string, sizeof(string), "%s | ID: %d | Score: %d | Death: %d | Ratio: %.2f | Money: %d", name, playerid, score, InfoJoueur[playerid][mort], ratio, GetPlayerMoney(playerid));
SendClientMessage(playerid, COLOR_ORANGE, string);
}
else
{
ratio = score/InfoJoueur[playerid][mort];
GetPlayerName(playerid, name, sizeof(name));
format(string, sizeof(string), "%s | ID: %d | Score: %d | Death: %d | Ratio: %.2f | Money: %d", name, playerid, score, InfoJoueur[playerid][mort], ratio, GetPlayerMoney(playerid));
SendClientMessage(playerid, COLOR_ORANGE, string);
}
return 1;
}
-
Ben voila ta reussi!
Spiirou n'a pas fait de faute, mais c'est pas très utile de revérifier, puis de préférence met des { } (c'est quoi le nom déjà, accolade?)
-
Ah oui desolé je ne me suis pas relu, faute te temps :S
Encore désolé
-
C'est pas grave merci à vous tous ;)