GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Karika le 06 Juillet 2011, 15:09:06

Titre: En quoi consiste "cmdtext[x]"?
Posté par: Karika le 06 Juillet 2011, 15:09:06
Bonjour, je suis en train de modifier 2/3 trucs sur un FS et je suis tombé à un moment sur une commande /dire permettant de faire IG "Admin : Salut" (c'est un exemple) et le cmdtext était en 5 (cmdtext[5]). J'ai remplacé ce /dire par /ao et quand je tape IG /ao salut, la console crash donc le serveur plante. J'ai eu l'idée de remplacer ce cmdtext qui était de 5 j'ai mis 3 car dans la commande il n'y a que 3 caractères /ao .
C'est ce qu'il faut faire? Je peux pas test je suis en pleine ré-installation de GTA SA. Merci pour vos réponses !
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: cristab le 06 Juillet 2011, 15:24:36
deja pour le /dire j'aurais mis cmdtext[6] et non 5 a cause de l'espace /dire coucou avant le c il y a bien 6  donc /ao = 4 et non trois mais je te rassure sa ne fait pas planter le serveur si la valeur est erronée
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Karika le 06 Juillet 2011, 15:39:31
Merci de ta réponse! Pourtant quand j'ai fais /ao sans rien marqué il a envoyé un message "Admin : " et ensuite le serveur s'est planté.
Je test ça dès que mon GTA est disponible, merci  :)
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Xolokos le 06 Juillet 2011, 15:44:13
Je pense que c'est mon FS X-Adminsitration pour ça tu peut le remplacé par :

Code: (pawn) [Sélectionner]
if (!strcmp(Cmd, "/dire", true))
{
    new Tmpp[256];
Tmpp = strtok(cmdtext, Idx);
    if (!strlen(Tmpp))
{
SendClientMessage(playerid, GRIS, "USAGE: /dire [Texte]");
return 1;
}
if (Levels[playerid] == 6)
        {
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Fondateur] %s dit, %s",NomAdmin,cmdtext[5]);
SendClientMessageToAll(POURPRE, Tmpp);
Dire(Tmpp);
}
else if (Levels[playerid] == 5)
        {
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Administrateur Suprême] %s dit, %s",NomAdmin,cmdtext[5]);
SendClientMessageToAll(POURPRE, Tmpp);
Dire(Tmpp);
}
else if (Levels[playerid] == 4)
        {
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Administrateur] %s dit, %s",NomAdmin,cmdtext[5]);
SendClientMessageToAll(POURPRE, Tmpp);
Dire(Tmpp);
}
else if (Levels[playerid] == 3)
        {
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Modérateur] %s dit, %s",NomAdmin,cmdtext[5]);
SendClientMessageToAll(POURPRE, Tmpp);
Dire(Tmpp);
}
else if (Levels[playerid] == 2)
        {
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Animateur] %s dit, %s",NomAdmin,cmdtext[5]);
SendClientMessageToAll(POURPRE, Tmpp);
Dire(Tmpp);
}
else if (Levels[playerid] == 1)
        {
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Membre de Confiance] %s dit, %s",NomAdmin,cmdtext[5]);
SendClientMessageToAll(POURPRE, Tmpp);
Dire(Tmpp);
}
else if (Levels[playerid] == 0)
        {
SendClientMessage(playerid,POURPRE, "Tu n'as pas les droits approprié pour utilisé cette commande.");
}
  return 1;
  }

Encore un truc que je modifierais dans la prochaine version.
Titre: Re : Re : En quoi consiste "cmdtext[x]"?
Posté par: Karika le 06 Juillet 2011, 15:51:09
Je pense que c'est mon FS X-Adminsitration pour ça tu peut le remplacé par :

Code: (pawn) [Sélectionner]
if (!strcmp(Cmd, "/dire", true))
{
    new Tmpp[256];
Tmpp = strtok(cmdtext, Idx);
    if (!strlen(Tmpp))
{
SendClientMessage(playerid, GRIS, "USAGE: /dire [Texte]");
return 1;
}
if (Levels[playerid] == 6)
        {
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Fondateur] %s dit, %s",NomAdmin,cmdtext[5]);
SendClientMessageToAll(POURPRE, Tmpp);
Dire(Tmpp);
}
else if (Levels[playerid] == 5)
        {
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Administrateur Suprême] %s dit, %s",NomAdmin,cmdtext[5]);
SendClientMessageToAll(POURPRE, Tmpp);
Dire(Tmpp);
}
else if (Levels[playerid] == 4)
        {
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Administrateur] %s dit, %s",NomAdmin,cmdtext[5]);
SendClientMessageToAll(POURPRE, Tmpp);
Dire(Tmpp);
}
else if (Levels[playerid] == 3)
        {
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Modérateur] %s dit, %s",NomAdmin,cmdtext[5]);
SendClientMessageToAll(POURPRE, Tmpp);
Dire(Tmpp);
}
else if (Levels[playerid] == 2)
        {
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Animateur] %s dit, %s",NomAdmin,cmdtext[5]);
SendClientMessageToAll(POURPRE, Tmpp);
Dire(Tmpp);
}
else if (Levels[playerid] == 1)
        {
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Membre de Confiance] %s dit, %s",NomAdmin,cmdtext[5]);
SendClientMessageToAll(POURPRE, Tmpp);
Dire(Tmpp);
}
else if (Levels[playerid] == 0)
        {
SendClientMessage(playerid,POURPRE, "Tu n'as pas les droits approprié pour utilisé cette commande.");
}
  return 1;
  }

Encore un truc que je modifierais dans la prochaine version.

Je suis en train de bien le modifier :D mais si on est en /ao je vais bien mettre cmd4 alors.

genre /ao va donner -> Admin %s : %s // premier %s pour pseudo de l'admin et deuxième %s pour le texte. Je met cmdtext[4]
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Xolokos le 06 Juillet 2011, 15:54:00
Tu compte le '/''a''o''ESPACE' Et la le texte s'affiche...
En bref / - 1 a - 2 o - 3  - 4 donc c'est bon c'est bête c'est le nombre de caractère que tu saute en bref en comptant le / et espace.
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Karika le 06 Juillet 2011, 15:57:11
Ok, merci je vais tester :p Et aussi Xolokos, je sais pas si c'es moi mais la commande /rapport a aussi fait planter le serveur  :laugh et j'ai pas encore penser à le faire, je vais le changer après :p

EDIT : J'ai fais "/ao test" il a bien affiché "[Fondateur] Aaron : Test" puis le serveur a crashé.

if (!strcmp(Cmd, "/ao", true))
{
if (Levels[playerid] == 6)
        {
new Tmpp[256];
Tmpp = strtok(cmdtext, Idx);
GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
    format(Tmpp, sizeof(Tmpp), "[Fondateur] %s : %s",NomAdmin,cmdtext[4]);
SendClientMessageToAll(ROUGE, Tmpp);
Dire(Tmpp);
}
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Xolokos le 06 Juillet 2011, 16:07:49
Créer le dossier Administration dans Scriptefile et Comptes aussi ça enregistre les Rapport Dire Kick Ban etc si il est pas créer il crash je pense.
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Karika le 06 Juillet 2011, 16:10:03
Aaaaaaaaah! Le dossier...... moi j'avais deux fichiers texte "Comptes" et "Administration"  :laugh
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Xolokos le 06 Juillet 2011, 16:11:18
Il y a même une Define en haut si tu veut modifier le dossier ou tu enregistres Comptes et les Kick&Ban Dire etc...

Code: (pawn) [Sélectionner]
/*== LES LOGIN ==*/

#define ENREGISTREMENT "Comptes/%s.ini"// A modifier si vous voulez enregistrez les comptes autre par...
#define FICHIER "Administration"//Le répertoire d'enregistrement des Ban Kick et autre.

Lignes 95 et 96.
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Karika le 06 Juillet 2011, 16:27:38
J'ai pas trop compris comment le système de /rapport fonctionne...
Du moins, il y a un bug, quand je fais "/rapport help" sans être connecté en admin je reçois 2 fois [[RAPPORT]] Aaron : Help

Mais comme j'ai pas trop compris comment la commande fonctionnait j'ai pas trouvé d'où le doublon venait :s
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: cristab le 06 Juillet 2011, 16:34:25
cela fonctionne comme commande mais un peu bete en meme temps a quoi sert le cmdtext

if (!strcmp(Cmd, "/ao", true))
{
if (Levels[playerid] == 6)
        {

GetPlayerName(playerid, NomAdmin, sizeof(NomAdmin));
   format(Tmpp, sizeof(Tmpp), "[Fondateur] %s : %s",NomAdmin,cmdtext[4]);
SendClientMessageToAll(ROUGE, Tmpp);
Dire(Tmpp);
}
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Karika le 06 Juillet 2011, 17:01:23
if (!strcmp(Cmd, "/rapport", true))
{
        new Tmp[256];
        Tmp = strtok(cmdtext, Idx);
if (!strlen(Tmp))
{
SendClientMessage(playerid, BLANC, "[Usage] /rapport [Texte]");
return 1;
}
new Str[256];
GetPlayerName(playerid, Str, sizeof(Str));
format(Str, sizeof(Str), "[[REPORT %s]]-[%s]", Str, cmdtext[8]);
        SendClientMessage(playerid, ZAZOLIN, Str);
        Rapport(Str);
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && Levels[i] != 0)
{

SendClientMessage(i, ZAZOLIN, Str);

    }
    }
  return 1;

Comme je l'ai dit plus tôt, je n'ai pas trop compris cette commande et je ne vois pas d'où viens le problème que la personne et les admins voient le rapport doublés et pareil.. enfin pareil c'est normal j'ai pas encore fais la réponse.
Titre: Re : Re : En quoi consiste "cmdtext[x]"?
Posté par: Xolokos le 06 Juillet 2011, 18:32:35
if (!strcmp(Cmd, "/rapport", true))
{
        new Tmp[256];
        Tmp = strtok(cmdtext, Idx);
if (!strlen(Tmp))
{
SendClientMessage(playerid, BLANC, "[Usage] /rapport [Texte]");
return 1;
}
new Str[256];
GetPlayerName(playerid, Str, sizeof(Str));
format(Str, sizeof(Str), "[[REPORT %s]]-[%s]", Str, cmdtext[8]);
        SendClientMessage(playerid, ZAZOLIN, Str);
        Rapport(Str);
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && Levels[i] != 0)
{

SendClientMessage(i, ZAZOLIN, Str);

    }
    }
  return 1;

Comme je l'ai dit plus tôt, je n'ai pas trop compris cette commande et je ne vois pas d'où viens le problème que la personne et les admins voient le rapport doublés et pareil.. enfin pareil c'est normal j'ai pas encore fais la réponse.

Si c'est toi qui fait la commande tu vas le voir fois si tu est Administrateur et que tu fait la commande ça lui renvoie son rapport et l'envoie au Administrateur comme ça il vois ce qu'il a écrit.
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Karika le 06 Juillet 2011, 18:38:28
Pourtant, je me suis co sans faire /service + /fondateur et j'ai aussi eu 2 fois [A moins qu'il m'envoit car dès que je me co je suis en admin]
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Xolokos le 06 Juillet 2011, 18:55:55
Ca vérifie si ton Level Administrateur est supérieur a 0 supérieur a joueur pour t'envoyer son report dons si tu est Administrateur et que tu rapport tu le vois 2 fois, si tu a été Administrateur une fois et que tu te déconnecte ça enregistre que t'es Administrateur et a ta prochaine reconnexion tu seras directement Administrateur.
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Karika le 06 Juillet 2011, 19:24:49
Ok merci !
J'ai voulu modifier 2/3 trucs : Que le rapporteur reçoive "Rapport envoyé!" et que l'admin reçoive "Rapport de %s : %s"

J'ai essayé 2/3 trucs mais ça ne fonctionne pas car j'arrive pas ré-indiquer en quoi sagit %s et %s à l'admin.
J'ai un peu restauré du début :

if (!strcmp(Cmd, "/rapport", true))
{
        new Tmp[256];
        Tmp = strtok(cmdtext, Idx);
if (!strlen(Tmp))
{
SendClientMessage(playerid, BLANC, "[Usage] /rapport [Texte]");
return 1;
}
new Str[256];
GetPlayerName(playerid, Str, sizeof(Str));
format(Str, sizeof(Str), "[Info] Rapport envoyé!", Str, cmdtext[8]); // envoyé au rapporteur
        SendClientMessage(playerid, info, Str);
        Rapport(Str);
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && Levels[i] != 0)
{

SendClientMessage(i, info,"[Info] Rapport de %s : %s"); // envoyé a l'admin à GTAo : j'ai essayé de rajouter Str et cmdtext pour copier celui du dessus mais je sais pas comment faire pour l'envoyer dans la deuxième variable

    }
    }
  return 1;
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Xolokos le 06 Juillet 2011, 20:13:54
Je vais essayé d'âtre clair ( Tu vois la subtilité ?)
Ton code et t'es erreurs avec les commentaires //

Code: (pawn) [Sélectionner]
if (!strcmp(Cmd, "/rapport", true))
{
        new Tmp[256];
        Tmp = strtok(cmdtext, Idx);
if (!strlen(Tmp))
{
SendClientMessage(playerid, BLANC, "[Usage] /rapport [Texte]");
return 1;
}
new Str[256];//Une chaine de 256
GetPlayerName(playerid, Str, sizeof(Str));//Tu prend son nom
format(Str, sizeof(Str), "[Info] Rapport envoyé!", Str, cmdtext[8]); //  Tu formate le message alors que tu met pas le nom ?
        SendClientMessage(playerid, info, Str);// Tu envoie le message formaté qui sert a rien.
        Rapport(Str);
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && Levels[i] != 0)
{

SendClientMessage(i, info,"[Info] Rapport de %s : %s"); // Et la tu formate pas le message tu récupère pas son nom tu lui dit %s et %s

    }
    }
  return 1;

La réponse + les explication le code de départ de mon FS.


Code: (pawn) [Sélectionner]
if (!strcmp(Cmd, "/rapport", true))
{
        new Tmp[256];
        Tmp = strtok(cmdtext, Idx);
if (!strlen(Tmp))
{
SendClientMessage(playerid, GRIS, "USAGE: /rapport [Votre Texte]");
return 1;
}
new Str[256];//On créer une chaine de caractère de 256 on peut mettre 256 lettre dedans en bref.
GetPlayerName(playerid, Str, sizeof(Str));//On récupéré le nom du playerid suis qui fait la commande et on le stock dans le Str qu'on a créer plus haut.
format(Str, sizeof(Str), "[[REPORT %s]]-[%s]", Str, cmdtext[8]);//On formate je pense que tu comprend pas ici je t'expliquerais plus bas.
        SendClientMessage(playerid, ZAZOLIN, Str);//On envoie le message formaté.
        Rapport(Str);
for(new i=0; i<MAX_PLAYERS; i++)//Une boucle elle vas tourné jusqu'à t'en que i le new i arrive a MAX_PLAYERS sois 500 elle passe par tout les joueurs
{
if(IsPlayerConnected(i) && Levels[i] != 0)//Si le joueur est connecter(i) && que son Levels[i] (!=) est différent de 0
{

SendClientMessage(i, ZAZOLIN, Str);//On lui envoi aussi le message formaté plus haut.

    }
    }
  return 1;
}

Pour l’explication de formaté

Code: (pawn) [Sélectionner]
new Str[256];//On créer une chaine de caractère de 256 on peut mettre 256 lettre dedans en bref.
GetPlayerName(playerid, Str, sizeof(Str));//On récupéré le nom du playerid suis qui fait la commande et on le stock dans le Str qu'on a créer plus haut.
format(Str, sizeof(Str), "[[REPORT %s]]-[%s]", Str, cmdtext[8]);//Voilà donc le format ! penons la fin elle est intéressante !
        SendClientMessage(playerid, ZAZOLIN, Str);//On envoie le message formaté.

format(Str, sizeof(Str), "[[REPORT %s]]-[%s]", Str, cmdtext[8]);
Comme tu le remarque il y a Str la chaine de caractère qu'on a fait + haut.

GetPlayerName(playerid, Str, sizeof(Str));
La on prend son nom et on le met dans Str.
Et dans le format on le met a la fin pourquoi ?
Pour savoir l'ordre d'affichage pardi ! [[REPORT Xolokos]] et le cmdtext[8] c'est la commande a partir du caractère numéros 8 de la chaine !
Donc Str pour le nom ce qui nous fait [[REPORT Xolokos]] et cmdtext[8] pour mon texte ensuite a savoir que pour mettre une chaine de caractère dans un format ( dans le "[[REPORT %s]]-[%s]") c'est un %s et mettre un nombre simple %d et un Float un nombre avec une virgule %f. En exemple le playerid c'est l'ID du joueur donc si je fait ça :

format(Str, sizeof(Str), "[[REPORT %s ID [%d] ]]-[%s]", Str,playerid,cmdtext[8]);
On auras son ID magnifique non ? Bon ok je m'emballe !
Pour ton rapport voiçi :
if (!strcmp(Cmd, "/rapport", true))
{
        new Tmp[256];
        Tmp = strtok(cmdtext, Idx);
if (!strlen(Tmp))
{
SendClientMessage(playerid, GRIS, "USAGE: /rapport [Votre Texte]");
return 1;
}
new Str[256];
GetPlayerName(playerid, Str, sizeof(Str));
format(Str, sizeof(Str), "[Informatation] Rapport de %s  ID[%d] : %s", Str, playerid, cmdtext[8]);
       
                SendClientMessage(playerid, ZAZOLIN, "Rapport envoyé avec succès !");
               
                Rapport(Str);
for(new i=0; i<MAX_PLAYERS; i++)
{
if(IsPlayerConnected(i) && Levels[i] != 0)
{

SendClientMessage(i, ZAZOLIN, Str);

    }
    }
  return 1;
}

Alors maintenant explique moi ce code ? Héhé ? Heu.
Titre: Re : En quoi consiste "cmdtext[x]"?
Posté par: Karika le 08 Juillet 2011, 15:52:00
Alors il faut que j'inverse quoi :D