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
-
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 !
-
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
-
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 :)
-
Je pense que c'est mon FS X-Adminsitration pour ça tu peut le remplacé par :
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 pense que c'est mon FS X-Adminsitration pour ça tu peut le remplacé par :
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]
-
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.
-
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);
}
-
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.
-
Aaaaaaaaah! Le dossier...... moi j'avais deux fichiers texte "Comptes" et "Administration" :laugh
-
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...
/*== 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.
-
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
-
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);
}
-
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.
-
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.
-
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]
-
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.
-
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;
-
Je vais essayé d'âtre clair ( Tu vois la subtilité ?)
Ton code et t'es erreurs avec les commentaires //
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.
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é
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.
-
Alors il faut que j'inverse quoi :D