• 22 Avril 2025, 00:09:57


Auteur Sujet: [RESOLU]|Ultra Debutant| Problème avec un commande strtok  (Lu 1732 fois)

0 Membres et 1 Invité sur ce sujet

Hors ligne Kreys

  • © K. - Le rêveur
  • *
  • Nouveau
  • K. pour le meilleur et surtout pour le pire.
  • Messages: 18
    • Voir le profil
Bonsoir à tous,

Je suis ultra débutant en Pawn, et j'ai télécharger le FS X-Administration, que je traduis pour mon "serveur test" (ayant seulement pour but de m'exercer et non d'être mis en ligne). Pour la commande /mute (muter le joueur), j'ai rajouter des SendClientMessage à l'admin ainsi qu'au joueur muté, et un SendClientMessageToAll.
Mon problème est que dans ma dernière fonction, je n'arrive pas à afficher la deuxième information, c'est-à-dire la raison.

Quand je teste la commande IG (Connexion en lan avec deux ordis pour tester les cmds avec relations), les SendClientMessage s'affichent correctement mais SendClientMessageToAll affiche :
"[STAFF] L'administrateur Kreys à muté Kreys2 . Raison : ."
La raison ne s'affiche tout simplement pas (alors que les deux premieres variables s'affichent sans problème). J'ai bien-sûr regardé d'autres script de commandes comprenant plusieurs strtok, mais je ne n'ai quand même pas réussi à saisir le fonctionnement de la chose (j'ai essayer plusieurs choses, sans succès).
Apres un long moment de recherche, je m'en remet à vous afin de pouvoir enfin trouver la solution au problème.

J'ai essayer de développer le plus possible mon problème, en espérant que ça vous aidera :)
Voici le code de la commande : (Je l'ai jugé assez court pour l'insérer directement, dites-le moi si je dois plutôt le mettre sur pastbin)

if (!strcmp(Cmd, "/mute", true))
{
        if (Levels[playerid] >= 1)
        {
new Jid,Tmp[256], Tmp2[256], String[256], Raison;
new Jour,Mois,An;
new Heure,Minute,Seconde;
Tmp = strtok(cmdtext, Idx);
Tmp2 = strtok(cmdtext, Idx);
if ((!strlen(Tmp)) || (!strlen(Tmp2)))
{
SendClientMessage(playerid, ZAZOLIN, "USAGE : /mute [Playerid] [Raison]");
return 1;
}
Jid = strval(Tmp);
Raison = strval(Tmp2);
if (!(IsPlayerConnected(Jid)) && (Levels[playerid] >= 1))
{
SendClientMessage(playerid, color_gris, "Ce joueur n'est pas connecté.");
return 1;
}
getdate(An,Mois,Jour);
getdate(Heure,Minute,Seconde);
  new Texte[125], Nom_admin[MAX_PLAYER_NAME];
                new Texte2[125], Nom[MAX_PLAYER_NAME];
                new Texte3[256];
                GetPlayerName(playerid, Nom_admin, MAX_PLAYER_NAME);
                GetPlayerName(Jid, Nom, MAX_PLAYER_NAME);
if(Levels[playerid] <=2)
{
format(Texte3, sizeof(Texte3), "[STAFF] Le modérateur %s à muté %s . Raison : %s .", Nom_admin, Nom, Raison);
SendClientMessageToAll(color_rouge, Texte3);
}
else
{
    format(Texte3, sizeof(Texte3), "[STAFF] L'administrateur %s à muté %s . Raison : %s .", Nom_admin, Nom, Raison);
SendClientMessageToAll(color_rouge, Texte3);
}
format(Texte, sizeof(Texte), "Vous êtes muté !");
SendClientMessage(Jid,ZAZOLIN, Texte);
format(Texte2, sizeof(Texte2), "Vous avez muté %s !", Nom);
SendClientMessage(playerid, ZAZOLIN, Texte2);
Mute[Jid]=true;
BK(String);

Cordialement,
Kreys.
« Modifié: 10 Juillet 2013, 10:56:03 par Kreys »

Hors ligne Gzsume

  • *
  • Compétent dans l'inutile
  • Messages: 2236
    • Voir le profil
Re : |Ultra Debutant| Problème avec un commande strtok
« Réponse #1 le: 08 Juillet 2013, 22:37:59 »
Salut,

Tu déclares la variable Raison comme une valeur numérique entière, mais comme elle contiendra du texte, tu dois créer un tableau (une case pour chaque caractère). Modifies Raison par Raison[128] dans la déclaration de variable (le new...), et normalement ça devrait être bon.

Bonne soirée,
Gzsume. :-)

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : |Ultra Debutant| Problème avec un commande strtok
« Réponse #2 le: 08 Juillet 2013, 23:21:58 »
Salut,
Tu devrais éviter strtok et directement utiliser le plugin sscanf avec un système de commandes comme zcmd ou dcmd, ça peut paraître compliqué au premier abord mais après avoir réussi à le maîtriser tu auras du mal à t'en passer tellement ça t'évite de faire des commandes de 50 lignes  :wink:
Il y a un tutoriel ici si tu veux : http://www.gtaonline.fr/forums/index.php?topic=9841.0

Hors ligne Kreys

  • © K. - Le rêveur
  • *
  • Nouveau
  • K. pour le meilleur et surtout pour le pire.
  • Messages: 18
    • Voir le profil
Re : |Ultra Debutant| Problème avec un commande strtok
« Réponse #3 le: 09 Juillet 2013, 12:46:55 »
Bonjour,
Merci pour ces réponses.
J'ai ajouté "[128]" à la variable raison, mais j'ai une erreur
error 033: array must be indexed (variable "Raison")
Cette erreur est à la ligne : "Raison = strval(Tmp2);"
Je redonne mon code modifié, si ça peut vous aider à y voir plus clair.
if (!strcmp(Cmd, "/mute", true))
{
        if (Levels[playerid] >= 1)
        {
new Jid,Tmp[256], Tmp2[256], String[256], Raison[128];
new Jour,Mois,An;
new Heure,Minute,Seconde;
Tmp = strtok(cmdtext, Idx);
Tmp2 = strtok(cmdtext, Idx);
if ((!strlen(Tmp)) || (!strlen(Tmp2)))
{
SendClientMessage(playerid, ZAZOLIN, "USAGE : /mute [Playerid] [Raison]");
return 1;
}
Jid = strval(Tmp);
Raison = strval(Tmp2);
if (!(IsPlayerConnected(Jid)) && (Levels[playerid] >= 1))
{
SendClientMessage(playerid, color_gris, "Ce joueur n'est pas connecté.");
return 1;
}
getdate(An,Mois,Jour);
getdate(Heure,Minute,Seconde);
  new Texte[125], Nom_admin[MAX_PLAYER_NAME];
        new Texte2[125], Nom[MAX_PLAYER_NAME];
        new Texte3[256];
        GetPlayerName(playerid, Nom_admin, MAX_PLAYER_NAME);
        GetPlayerName(Jid, Nom, MAX_PLAYER_NAME);
if(Levels[playerid] <=2)
{
format(Texte3, sizeof(Texte3), "[STAFF] Le modérateur %s à muté %s . Raison : %s .", Nom_admin, Nom, Raison);
SendClientMessageToAll(color_rouge, Texte3);
}
else
{
    format(Texte3, sizeof(Texte3), "[STAFF] L'administrateur %s à muté %s . Raison : %s .", Nom_admin, Nom, Raison);
SendClientMessageToAll(color_rouge, Texte3);
}
format(Texte, sizeof(Texte), "Vous êtes muté !");
SendClientMessage(Jid,ZAZOLIN, Texte);
format(Texte2, sizeof(Texte2), "Vous avez muté %s !", Nom);
SendClientMessage(playerid, ZAZOLIN, Texte2);
Mute[Jid]=true;
BK(String);
}
return 1;

Gilux, j'avais déja vu ce poste, mais y'a un truc que j'ai pas compris, tu pourrait m'éclairer ?
Où est-ce qu'on indique la commande ? Car il n'y a aucun endroit de "/kick"

Merci beaucoup,
Kreys.

Hors ligne Gzsume

  • *
  • Compétent dans l'inutile
  • Messages: 2236
    • Voir le profil
Re : |Ultra Debutant| Problème avec un commande strtok
« Réponse #4 le: 09 Juillet 2013, 13:36:27 »
Remplaces

Code: (pawn) [Sélectionner]
Raison = strval(Tmp2);
par

Code: (pawn) [Sélectionner]
format(Raison, 128, "%s", Tmp2);
ou utilises directement Tmp2 comme chaîne de caractère. Mais je te conseille de suivre ce que t'as dit Gilux juste après mon post. ;-)

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : |Ultra Debutant| Problème avec un commande strtok
« Réponse #5 le: 09 Juillet 2013, 13:38:39 »
En fait, si tu utilises zcmd, tu ne dois plus utiliser OnPlayerCommandText mais mettre ça dans un bloc à part, dans un truc du genre : (si mes souvenirs sont bons)
CMD:kick(playerid,params[])
{
     if(Levels[playerid] < 1) SendClientMessage(playerid,color,"Vous n'avez pas le droit d'utiliser cette commande !");
     else
     {
          new id; // id = l'id du joueur à kicker, playerid = id de l'admin qui kicke.
          if (sscanf(params, "d", id)) SendClientMessage(playerid, 0xFF0000AA, "Usage: /kick <ID>");
          else
          {
                 Kick(id);
          }
      }
      return 1;
}

Sinon avec dcmd, tu dois indiquer :
dcmd(kick, 4, cmdtext); dans OnPlayerCommandText et après faire un bloc qui s'appelle dcmd_kick.

Après t'as plus qu'à adapter en fonction de ce que tu veux faire  :wink:

Hors ligne Kreys

  • © K. - Le rêveur
  • *
  • Nouveau
  • K. pour le meilleur et surtout pour le pire.
  • Messages: 18
    • Voir le profil
Re : |Ultra Debutant| Problème avec un commande strtok
« Réponse #6 le: 09 Juillet 2013, 15:44:13 »
Bonjour,
Merci, ça marche.
Glux ca veut dire que je dois ps mettre le slash de la commande ?
K.

Hors ligne Gilux

  • *
  • Mafioso
  • GOOBY PLS
  • Messages: 2209
    • Voir le profil
Re : |Ultra Debutant| Problème avec un commande strtok
« Réponse #7 le: 09 Juillet 2013, 15:58:32 »
Non, pas besoin, l'include s'en charge.

Hors ligne Kreys

  • © K. - Le rêveur
  • *
  • Nouveau
  • K. pour le meilleur et surtout pour le pire.
  • Messages: 18
    • Voir le profil
Re : |Ultra Debutant| Problème avec un commande strtok
« Réponse #8 le: 09 Juillet 2013, 16:56:27 »
D'accord, merci beaucoup à vous deux, problème résolu.
D'ailleurs Gilux j'en profite pour te remercier également car ton tuto m'a été de grande utilité pour comprendre les bases, même si je dois avouer que mes connaissances en Python & PHP m'ont pas mal aidés :P