GTAOnline.net

San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: asto63 le 25 Décembre 2013, 21:20:40

Titre: [COMMANDE] Unknow Commande
Posté par: asto63 le 25 Décembre 2013, 21:20:40
Salut,
J'ai un petit problème, j'ai créer une commande qui donne sur des sous-commandes:

if(strcmp(cmdtext, "/devenir", true) == 0)
{
subcmd = strtok(cmdtext, idx);
if( !strlen(subcmd) )
{
SendClientMessage(playerid, COLOR_RED, "[UTILISATION]{0xFF4500FF} /devenir <nom>");
SendClientMessage(playerid, COLOR_RED, "[UTILISATION]{0xFF4500FF} (mem)bre, (help)eur, (mod)erateur, (admin)istrateur");
return 1;
}
else if(strcmp(subcmd, "mem", true) == 0 || strlen(subcmd, "membre", true) == 0)
{
    if(UserInformation[playerid] == USER_MEMBER)
    {
        SendClientMessage(playerid, COLOR_ERROR, "Vous êtes déjà membre.");
}
else
{
    UserInformation[playerid] == USER_MEMBER;
    SendClientMessage(playerid, COLOR_GREEN, "Vous êtes désormais membre ! ");
}
}
else if(strcmp(subcmd, "help", true) == 0 || strlen(subcmd, "helpeur", true) == 0)
{
    if(UserInformation[playerid] == USER_MEMBER)
    {
        SendClientMessage(playerid, COLOR_ERROR, "Vous n'avez pas les droits nécessaire pour executer cela.");
}
else
{
UserInformation[playerid] == USER_HELPEUR;
SendClientMessage(playerid, COLOR_GREEN, "Vous êtes désormais Helpeur !");
}
}
return 1;
}
Et lorsque l'on fait:
/devenir helpeur ou /devenir help
Sa fait un Unknow Command !

Help pliz ! (Tout le code marche sauf la sous-commande)
Merci de votre futur aide.
Titre: Re : [COMMANDE] Unknow Commande
Posté par: Infu le 25 Décembre 2013, 23:11:24
Bonsoir, Joyeux Noël  :xmas_happy:
Mes changements effectués sont notés en commentaire. C'est la manière que j'aurai utilisé pour faire ça... Je n'ai pas compilé je ne sais pas si cela fonctionne. Bonne soirée  :biggrin:


Code: (pawn) [Sélectionner]
if(strcmp(cmdtext, "/devenir", true) == 0)
{
subcmd = strtok(cmdtext, idx); // ça, je supprime.
if( !strlen(cmdtext) ) // Remplacement subcmd -> cmdtext
{
SendClientMessage(playerid, COLOR_RED, "[UTILISATION]{0xFF4500FF} /devenir <nom>");
SendClientMessage(playerid, COLOR_RED, "[UTILISATION]{0xFF4500FF} (mem)bre, (help)eur, (mod)erateur, (admin)istrateur");
return 1;
}
else if(strcmp(cmdtext, "mem", true) == 0 || strlen(cmdtext, "membre", true) == 0) // Remplacement subcmd -> cmdtext
{
    if(UserInformation[playerid] == USER_MEMBER)
    {
        SendClientMessage(playerid, COLOR_ERROR, "Vous êtes déjà membre.");
}
else
{
    UserInformation[playerid] == USER_MEMBER;
    SendClientMessage(playerid, COLOR_GREEN, "Vous êtes désormais membre ! ");
}
}
else if(strcmp(cmdtext, "help", true) == 0 || strlen(cmdtext, "helpeur", true) == 0) // Remplacement subcmd -> cmdtext
{
    if(UserInformation[playerid] == USER_MEMBER)
    {
        SendClientMessage(playerid, COLOR_ERROR, "Vous n'avez pas les droits nécessaire pour executer cela.");
}
else
{
UserInformation[playerid] == USER_HELPEUR;
SendClientMessage(playerid, COLOR_GREEN, "Vous êtes désormais Helpeur !");
}
}
return 1;
}

Edit: Je viens de penser, il serait peut-être judicieux d'utiliser strfind pour vérifier si la commande contient (ou non) tel ou tel mot.  :smile:
Titre: Re : [COMMANDE] Unknow Commande
Posté par: asto63 le 25 Décembre 2013, 23:26:16
Sa ne marche pas :s
Titre: Re : [COMMANDE] Unknow Commande
Posté par: Infu le 26 Décembre 2013, 00:56:17
Montre moi le code après modifications stp
Titre: Re : [COMMANDE] Unknow Commande
Posté par: asto63 le 26 Décembre 2013, 11:24:22
     if(strcmp(cmdtext, "/devenir", true) == 0)
        {
                if( !strlen(cmdtext) )
                {
                        SendClientMessage(playerid, COLOR_RED, "[UTILISATION]{0xFF4500FF} /devenir <nom>");
                        SendClientMessage(playerid, COLOR_RED, "[UTILISATION]{0xFF4500FF} (mem)bre, (help)eur, (mod)erateur, (admin)istrateur");
                        return 1;
                }
                else if(strcmp(cmdtext, "mem", true) == 0 || strlen(cmdtext, "membre", true) == 0)
                {
                    if(UserInformation[playerid] == USER_MEMBER)
                    {
                        SendClientMessage(playerid, COLOR_ERROR, "Vous êtes déjà membre.");
                        }
                        else
                        {
                            UserInformation[playerid] == USER_MEMBER;
                            SendClientMessage(playerid, COLOR_GREEN, "Vous êtes désormais membre ! ");
                        }
                }
                else if(strcmp(cmdtext, "help", true) == 0 || strlen(cmdtext, "helpeur", true) == 0)
                {
                    if(UserInformation[playerid] == USER_MEMBER)
                    {
                        SendClientMessage(playerid, COLOR_ERROR, "Vous n'avez pas les droits nécessaire pour executer cela.");
                        }
                        else
                        {
                                UserInformation[playerid] == USER_HELPEUR;
                                SendClientMessage(playerid, COLOR_GREEN, "Vous êtes désormais Helpeur !");
                        }
                }
        return 1;
        }
Titre: Re : [COMMANDE] Unknow Commande
Posté par: Infu le 26 Décembre 2013, 14:16:14
Je t'ai demandé de remplacer par strfind au cas où ça ne fonctionnerai pas ^^
Titre: Re : [COMMANDE] Unknow Commande
Posté par: Kiloutre le 27 Décembre 2013, 00:38:11
Pourquoi tu utilses STRLEN pour comparer ? Ô_Ô
Citer
else if(strcmp(cmdtext, "help", true) == 0 || strlen(cmdtext, "helpeur", true) == 0)
strlen permet d'obtenir la taille d'une chaîne et non pas de comparer
http://wiki.sa-mp.com/wiki/Strlen_FR (http://wiki.sa-mp.com/wiki/Strlen_FR)
Titre: Re : [COMMANDE] Unknow Commande
Posté par: S!m le 27 Décembre 2013, 15:01:00
Salut,

attention, j'ai vu quelques petits problèmes.

Si on reprend la commande originale:

if(strcmp(cmdtext, "/devenir", true) == 0)
{
subcmd = strtok(cmdtext, idx);
if( !strlen(subcmd) )
{
SendClientMessage(playerid, COLOR_RED, "[UTILISATION]{0xFF4500FF} /devenir <nom>");
SendClientMessage(playerid, COLOR_RED, "[UTILISATION]{0xFF4500FF} (mem)bre, (help)eur, (mod)erateur, (admin)istrateur");
return 1;
}
else if(strcmp(subcmd, "mem", true) == 0 || strlen(subcmd, "membre", true) == 0)
{
    if(UserInformation[playerid] == USER_MEMBER)
    {
        SendClientMessage(playerid, COLOR_ERROR, "Vous êtes déjà membre.");
}
else
{
    UserInformation[playerid] == USER_MEMBER;
    SendClientMessage(playerid, COLOR_GREEN, "Vous êtes désormais membre ! ");
}
}
else if(strcmp(subcmd, "help", true) == 0 || strlen(subcmd, "helpeur", true) == 0)
{
    if(UserInformation[playerid] == USER_MEMBER)
    {
        SendClientMessage(playerid, COLOR_ERROR, "Vous n'avez pas les droits nécessaire pour executer cela.");
}
else
{
UserInformation[playerid] == USER_HELPEUR;
SendClientMessage(playerid, COLOR_GREEN, "Vous êtes désormais Helpeur !");
}
}
return 1;
}

Es-ce que ton OnPlayerCommandText commence avec un strtok?

La façon de fonctionner de strtok est très simple, elle va chercher le enieme mot dans le texte.
Si tu as fait un strtok auparavant, elle ira chercher le second terme.
Sinon, elle ira chercher le premier terme (soit «/devenir»).
Attention, si tu utilise strtok dans tout ton système de commande sache que ce n'est pas vraiment le meilleur système (tendance à faire des erreurs (dans le code), risque au niveau des dimensions des array etc...).

Petit conseil:
Si tu as peut de commande et voudrait bien te lancer dans une petite amélioration de ton script, tu pourrais essayer de passer ton code en YCMD ou ZCMD qui sont très bons (ZCMD un peu plus simple pour toi).

Si tu ne veut pas passer avec un tel système de commande, j'aurais tendance à faire ainsi:

if(strcmp(cmdtext[1], "devenir", true, 7) == 0) //(on ne vérifie pas le premier caractère que l'on sait être "/"
    {
        format(subcmd, size(subcmd), cmdtext[9]); // on copie à partir du 9e caratère qui est la première lettre du second mot ('/0' si aucun mot normalement)
        if(strlen(subcmd) < 3) // tout texte de moins de 3 caractère sera trop court
        {
            ........
        }
        else if(strcmp(subcmd, "mem", true) == 0 || strcmp(subcmd, "membre", true) == 0)
        {
            ...............
        }
        ........
        return 1;
    }

Voilà, ça devrait fonctionner pour remplacer ta façon de faire et c'est plus rapide.
Toutefois, c'est moins compréhensible, si tu veut tu peut changer le cmdtext[1] en cmdtext, il faut alors mettre "/devenir" et 8 pour la longueur au lieu de 7.

merci et bonne chance

++Sim++