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

Titre: Commande qui ne s'affiche pas
Posté 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;
}
Titre: Re : Commande qui ne s'affiche pas
Posté par: Gilux le 03 Novembre 2011, 19:48:34
T'as inversé l'ordre des conditions, teste si le joueur tape la commande, puis s'il est admin.

PS : C'est "Unknown" ;)

++
Titre: Re : Commande qui ne s'affiche pas
Posté par: Ashley11 le 03 Novembre 2011, 19:52:14
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;
Titre: Re : Commande qui ne s'affiche pas
Posté par: spiirou le 03 Novembre 2011, 22:03:55
le ratio c'est un Float donc %f et pas %d :)
Titre: Re : Commande qui ne s'affiche pas
Posté par: Syg le 03 Novembre 2011, 22:14:31
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
Titre: Re : Commande qui ne s'affiche pas
Posté par: Ashley11 le 03 Novembre 2011, 22:19:11
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]++;
Titre: Re : Commande qui ne s'affiche pas
Posté par: Syg le 04 Novembre 2011, 14:30:48
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
Titre: Re : Commande qui ne s'affiche pas
Posté par: Ashley11 le 04 Novembre 2011, 15:49:19
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
Titre: Re : Commande qui ne s'affiche pas
Posté par: spiirou le 04 Novembre 2011, 18:15:14
Tu utilise une condition avec un operateur dans cette liste :




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
++
Titre: Re : Commande qui ne s'affiche pas
Posté par: Ashley11 le 04 Novembre 2011, 18:47:09
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..
Titre: Re : Commande qui ne s'affiche pas
Posté par: Brian Turner le 04 Novembre 2011, 19:11:02
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

}

Titre: Re : Commande qui ne s'affiche pas
Posté par: spiirou le 04 Novembre 2011, 19:34:44

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
Titre: Re : Commande qui ne s'affiche pas
Posté par: Ashley11 le 04 Novembre 2011, 19:42:10
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;
}
Titre: Re : Commande qui ne s'affiche pas
Posté par: spiirou le 04 Novembre 2011, 20:11:51
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
Titre: Re : Commande qui ne s'affiche pas
Posté par: Ashley11 le 04 Novembre 2011, 20:27:16
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;
}
Titre: Re : Commande qui ne s'affiche pas
Posté par: Brian Turner le 04 Novembre 2011, 21:22:07
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?)
Titre: Re : Commande qui ne s'affiche pas
Posté par: spiirou le 04 Novembre 2011, 21:26:31
Ah oui desolé je ne me suis pas relu, faute te temps :S
Encore désolé
Titre: Re : Commande qui ne s'affiche pas
Posté par: Ashley11 le 04 Novembre 2011, 21:43:36
C'est pas grave merci à vous tous ;)