• 06 Juin 2026, 07:58:00


Auteur Sujet: Commande qui ne s'affiche pas  (Lu 2702 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
Commande qui ne s'affiche pas
« 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;
}
« Modifié: 03 Novembre 2011, 22:26:03 par Ashley11 »

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #1 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" ;)

++

Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #2 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;

Hors ligne spiirou

  • *
  • L'avenir appartient à ceux qui se lèvent
  • Messages: 866
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #3 le: 03 Novembre 2011, 22:03:55 »
le ratio c'est un Float donc %f et pas %d :)

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #4 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
Courtesy of GtaManiac

Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #5 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]++;
« Modifié: 03 Novembre 2011, 23:52:17 par Ashley11 »

Hors ligne Syg

  • Expert programmeur C/C++/PAWN
  • *
  • The GTAOnline Jesus
  • Messages: 3908
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #6 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
Courtesy of GtaManiac

Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #7 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
« Modifié: 04 Novembre 2011, 18:52:19 par Ashley11 »

Hors ligne spiirou

  • *
  • L'avenir appartient à ceux qui se lèvent
  • Messages: 866
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #8 le: 04 Novembre 2011, 18:15:14 »
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( <= b// Si a est inférieur ou égal à b
{
     
// Code
}
else 
// Sinon ( a est supérieur à b )
{
     
// Code
}




Spiirou
++

Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #9 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..

Hors ligne Brian Turner

  • PAWN/PHP/SQL/MAP/SQUIRIEL
  • *
  • Bandit
  • Messages: 438
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #10 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

}

Momoto33127
__________________________________________
[TRADUCTION][FS]Celular call 1.5 : Voir le poste
[ADDON/INC]Motor System (/clef et /vsortir pour Gveh) : Voir le poste
[FS]BanList (BlackListe) [Systeme de BAN] : Voir le poste

Hors ligne spiirou

  • *
  • L'avenir appartient à ceux qui se lèvent
  • Messages: 866
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #11 le: 04 Novembre 2011, 19:34:44 »

if(InfoJoueur[playerid][mort] == 0InfoJoueur[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

Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #12 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;
}
« Modifié: 04 Novembre 2011, 19:53:20 par Ashley11 »

Hors ligne spiirou

  • *
  • L'avenir appartient à ceux qui se lèvent
  • Messages: 866
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #13 le: 04 Novembre 2011, 20:11:51 »
	
if(
strcmp("/stats"cmdtexttrue10) == 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] == 0ratio 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(playeridnamesizeof(name)); // on récupéré le nom du joueur

	
	
     
	
format(stringsizeof(string), "%s | ID: %d | Score: %d | Death: %d | Ratio: %.2f | Money: %d"nameplayeridscoreInfoJoueur[playerid][mort], ratioGetPlayerMoney(playerid));

	
	
     
	
SendClientMessage(playeridCOLOR_ORANGEstring);
 
	
	
}
	
	
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

Hors ligne Ashley11

  • C++ user
  • *
  • Bandit
  • Messages: 260
    • Voir le profil
Re : Commande qui ne s'affiche pas
« Réponse #14 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;
}
« Modifié: 04 Novembre 2011, 20:44:53 par Ashley11 »