GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: pinouf42 le 28 Mai 2008, 15:41:26
-
Comme je le dit dans le titre à nouveau un problème à chaque fois que je tape une commande, même si elle fonctionne, il me met SERVER:Unknow Command.
-
a la fin de OnPlayerCommandtext tu change le return 0; en return 1;
:)
-
merci
mais cette fois si je met une commande fausse il ne me met plus server unknow command
D'ailleur comment changer la phrase server unknow command?
-
Sujet déjà abordé...
-
Ce problème a souvent été traité et je vous avoue que même moi il m'embête un peux,
Comme l'a dit Staff Man essaye de mettre le return en true (Celui de la commande en question et aussi celui de la CallBack)
Mais encore une question:
- Quand tu tape une commande, /Aide exemple, Es-ce que la commande s'exécute (Que ça t'affiche le texte de l'aide) et ça te met SERVER:Unknow Command ou es-ce que rien ne se passe mais tu as toujours SERVER:Unknow Command ?
-
Comment modifier server unknow command oui mais je n'ai pas réussi. Mais au moins afficher server unknow command au pire !
-
Cherche dans les autre sujets, cette question a été posée il n'y a pas longtemps, pour ton problème de ne pas savoir si ta commande fonctionne ou pas, c'est pas un prob, puisque le Unknow sert juste a te dire que la commande existe ou pas, donc si tu veut savoir si elle fonctionne ou pas, tu ajoute des lignes de textes dans ta commande, par exemple pour ta commande /repair, tu ajoute :
SendClientMessage(playerid, COLOR_YELLOW, "Tu as réparé ta voiture");
Dans ton code pour cette commande, alors quand tu tapera /repair, ta voiture sera réparée et tu aura un message ;)
-
J'ai déjà le message et la commande /aide s'execute bien mais c'est juste que lorsque une commande fausse cette fois-ci est tapé rien ne s'affiche! On ne sait pas si cela a marché ou pas
-
Cherche dans les autre sujets, cette question a été posée il n'y a pas longtemps
ça répond à ta question ?? ^^ Allé un peut de patiente :p
-
j'ai chercher (en vain) :'(
EDIT: ah non finalement sa marche ! Merci beaucoup !
-
Il faut mettre return true; à la fin de tes commandes :)
-
je me suis rejouit trop vite car maintenant que j'ai réussi à modifier server unknow command il me le remet meme lorsqu'une commande est juste et la, il y a bien un return!
Voici le code:
new erreur[256];
format(erreur, sizeof (erreur), "Commande invalide",cmdtext);
return SendClientMessage(playerid,COLOR_RED, erreur) ;
}
}
-
new erreur[256];
format(erreur, sizeof (erreur), "Commande invalide",cmdtext);
return SendClientMessage(playerid,COLOR_RED, erreur) ;
}
return 1;
}
essaye ça
-
Il faut mettre return true; à la fin de tes commandes :)
Pas forcement !
NV.
-
il me met ça:
C:\samp022server.win32\gamemodes\test.pwn(259) : warning 225: unreachable code
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
1 Warning.
-
Ah...
tu la mis ou ton code ? a la fin de OnPlayerCommandText ??
Si c'est ça tu doit faire ça :
en haut de ton OnPlayerCommand :
new erreur[256];
après ta dernière commande tu as le return 0; , bah tu le remplace par :
format(erreur, sizeof (erreur), "Commande invalide",cmdtext);
return SendClientMessage(playerid,COLOR_RED, erreur) ;
en faite ça donnera ça :
ta commande
return 1;
}
}
format(erreur, sizeof (erreur), "Commande invalide",cmdtext);
return SendClientMessage(playerid,COLOR_RED, erreur);
}
OnPlayerrequestClass (c'est pour l'exemple, pour te dire que le OnPlayerCommandeCommandText fini juste par le code)
-
si je met new erreur machin au debut de On player command il me met une erreur:
C:\samp022server.win32\gamemodes\test.pwn(200) : error 003: declaration of a local variable must appear in a compound block
C:\samp022server.win32\gamemodes\test.pwn(203) : error 010: invalid function or declaration
C:\samp022server.win32\gamemodes\test.pwn(205) : error 010: invalid function or declaration
C:\samp022server.win32\gamemodes\test.pwn(214) : error 054: unmatched closing brace ("}")
C:\samp022server.win32\gamemodes\test.pwn(215) : error 010: invalid function or declaration
C:\samp022server.win32\gamemodes\test.pwn(217) : error 010: invalid function or declaration
C:\samp022server.win32\gamemodes\test.pwn(226) : error 054: unmatched closing brace ("}")
C:\samp022server.win32\gamemodes\test.pwn(227) : error 010: invalid function or declaration
C:\samp022server.win32\gamemodes\test.pwn(229) : error 010: invalid function or declaration
C:\samp022server.win32\gamemodes\test.pwn(240) : error 054: unmatched closing brace ("}")
C:\samp022server.win32\gamemodes\test.pwn(241) : error 010: invalid function or declaration
C:\samp022server.win32\gamemodes\test.pwn(247) : error 010: invalid function or declaration
C:\samp022server.win32\gamemodes\test.pwn(252) : error 010: invalid function or declaration
C:\samp022server.win32\gamemodes\test.pwn(258) : error 010: invalid function or declaration
Pawn compiler 3.2.3664 Copyright (c) 1997-2006, ITB CompuPhase
14 Errors.
et voila le script normalement j'ai fait ce que tu as dit:
public OnPlayerCommandText(playerid, cmdtext[])
new erreur[256];
{
{
if(strcmp("/aide",cmdtext, true) == 0)
{
if(IsPlayerConnected(playerid))
{
SendClientMessage(playerid, COLOR_RED,"_______________________________________");
SendClientMessage(playerid, COLOR_RED,"*** TELEPORTATIONS *** /tlp");
SendClientMessage(playerid, COLOR_YELLOW,"*** COMMANDES *** /cmd");
SendClientMessage(playerid, COLOR_GREEN,"*** CREDITS *** MERCI A RAS POUR LE SCRIPT ADMIN");
SendClientMessage(playerid, COLOR_RED,"_______________________________________");
}
}
else if(strcmp("/tlp",cmdtext, true) == 0)
{
if(IsPlayerConnected(playerid))
{
SendClientMessage(playerid, COLOR_RED,"_______________________________________");
SendClientMessage(playerid, COLOR_PURPLE,"*** TELEPORTATIONS ***");
SendClientMessage(playerid, COLOR_PURPLE,"-------------------");
SendClientMessage(playerid, COLOR_PURPLE,"/paradis vous téléporte au parking rempli de voiture (en constructions)");
SendClientMessage(playerid, COLOR_RED,"_______________________________________");
}
}
else if(strcmp("/cmd",cmdtext, true) == 0)
{
if(IsPlayerConnected(playerid))
{
SendClientMessage(playerid, COLOR_RED,"_______________________________________");
SendClientMessage(playerid, COLOR_YELLOW,"*** COMMANDES ***");
SendClientMessage(playerid, COLOR_YELLOW,"-------------------");
SendClientMessage(playerid, COLOR_YELLOW,"/aide vous affice le menu des commandes disponibles");
SendClientMessage(playerid, COLOR_YELLOW,"/rep repare votre vehicule");
SendClientMessage(playerid, COLOR_YELLOW,"/kill tue votre personneage (F4 pour choisir un nouveau personnage puis /kill)");
SendClientMessage(playerid, COLOR_RED,"_______________________________________");
}
}
else if(strcmp("/rep",cmdtext, true) == 0)
{
SetVehicleHealth(GetPlayerVehicleID(playerid), 1000.0);
GameTextForPlayer(playerid,"Moteur repare",500,1);
}
else if (strcmp("/kill", cmdtext, true, 5) == 0)
{
SetPlayerHealth(playerid, 0.0);
}
else if (strcmp("/paradis", cmdtext, true)==0)
{
SetPlayerPos(playerid,2318.96,1424.59,42.55);
}
}
format(erreur, sizeof (erreur), "Commande invalide",cmdtext);
return SendClientMessage(playerid,COLOR_RED, erreur) ;
}
-
juste en dessous de la 1er accolade lol
public OnPlayerCommandText(playerid, cmdtext[])
{
new erreur[256];
-
c'est toujours la meme chose ! Dsl
-
les deux accolades que j'ai mis moi, dans mon exemple ne sont pas a copier ^^ tu a juste a remplacer le return 0; par sa
format(erreur, sizeof (erreur), "Commande invalide",cmdtext);
return SendClientMessage(playerid,COLOR_RED, erreur) ;
tu n'a en aucun cas a toucher aux accolades ;)
-
je ne les ai pas mises !
-
ça marche très bien chez moi lol ^^ regarde :
public OnPlayerCommandText(playerid, cmdtext[])
{
new name[MAX_PLAYER_NAME];
new texte[256];
new erreur[256];
if (strcmp(cmdtext, "/aide", true)==0)
{
SendClientMessage(playerid, COLOR_YELLOW, "Les Terrorists doivent planter la bombe à l'endroit prévu et tuer les Anti-T");
SendClientMessage(playerid, COLOR_YELLOW, "Les Anti-Terroristes doivent défendre la site de bombe et tuer les Terroristes");
return 1;
}
else if (strcmp(cmdtext, "/lost", true) ==0)
{
if(gTeam[playerid] == TEAM_CT)
{
GetPlayerName(playerid, name, sizeof(name));
format(texte, sizeof(texte), "le player %s est entré dans la map de Lost Pueblo", name);
SendClientMessageToAll(COLOR_YELLOW, texte);
SendClientMessageToAll(COLOR_ORANGE, "pour rejoindre le player : /lost");
SendClientMessage(playerid, COLOR_ORANGE, "Protège la zone de bombardement !!");
SetPlayerPos(playerid, -1265.6532,2425.5444,86.1919);
lost[playerid] = 1;
return 1;
}else{
if(gTeam[playerid] == TEAM_T)
{
GetPlayerName(playerid, name, sizeof(name));
format(texte, sizeof(texte), "le player %s est entré dans la map de Lost Pueblo)", name);
SendClientMessageToAll(COLOR_YELLOW, texte);
SendClientMessageToAll(COLOR_ORANGE, "pour rejoindre le player : /lost");
SendClientMessage(playerid, COLOR_ORANGE, "Dépose la bombe dans la zone de bombardement !!");
SetPlayerPos(playerid, -1329.1263,2573.4634,82.2715);
GangZoneShowForAll(gang2, 0xFF00004E);
lost[playerid] = 1;
}else{
if(gTeam[playerid] == TEAM_T_BOMB)
{
GetPlayerName(playerid, name, sizeof(name));
format(texte, sizeof(texte), "le player %s est entré dans la map de Lost Pueblo)", name);
SendClientMessageToAll(COLOR_YELLOW, texte);
SendClientMessageToAll(COLOR_ORANGE, "pour rejoindre le player : /lost");
SendClientMessage(playerid, COLOR_ORANGE, "Dépose la bombe dans la zone de bombardement !!");
SetPlayerPos(playerid, -1329.1263,2573.4634,82.2715);
GangZoneShowForAll(gang2, 0xFF00004E);
lost[playerid] = 1;
bomb[playerid] = 1;
}
return 1;
}
}
}
format(erreur, sizeof (erreur), "Commande invalide",cmdtext);
return SendClientMessage(playerid,COLOR_RED, erreur);
}
deux commandes que j'ai fais pour mon mode counter, dans lequel j'ai des probs ^^ je vais poster un sujet ;)
prend exemple sur moi, regarde comment j'ai fais, regarde si c'est pareil dans ton GM
La chez moi sa fonctionne nikel
-
bon je laisse tomber pour le texte qui dit commande invalide mais au moins comment empecher de marquer server unknow quand la commande fonctionne? voici le code sans la commande : commande invalide:
public OnPlayerCommandText(playerid, cmdtext[])
{
{
if(strcmp("/aide",cmdtext, true) == 0)
{
if(IsPlayerConnected(playerid))
{
SendClientMessage(playerid, COLOR_RED,"_______________________________________");
SendClientMessage(playerid, COLOR_RED,"*** TELEPORTATIONS *** /tlp");
SendClientMessage(playerid, COLOR_YELLOW,"*** COMMANDES *** /cmd");
SendClientMessage(playerid, COLOR_GREEN,"*** CREDITS *** MERCI A RAS POUR LE SCRIPT ADMIN");
SendClientMessage(playerid, COLOR_RED,"_______________________________________");
}
}
else if(strcmp("/tlp",cmdtext, true) == 0)
{
if(IsPlayerConnected(playerid))
{
SendClientMessage(playerid, COLOR_RED,"_______________________________________");
SendClientMessage(playerid, COLOR_PURPLE,"*** TELEPORTATIONS ***");
SendClientMessage(playerid, COLOR_PURPLE,"-------------------");
SendClientMessage(playerid, COLOR_PURPLE,"/paradis vous téléporte au parking rempli de voiture (en constructions)");
SendClientMessage(playerid, COLOR_RED,"_______________________________________");
}
}
else if(strcmp("/cmd",cmdtext, true) == 0)
{
if(IsPlayerConnected(playerid))
{
SendClientMessage(playerid, COLOR_RED,"_______________________________________");
SendClientMessage(playerid, COLOR_YELLOW,"*** COMMANDES ***");
SendClientMessage(playerid, COLOR_YELLOW,"-------------------");
SendClientMessage(playerid, COLOR_YELLOW,"/aide vous affice le menu des commandes disponibles");
SendClientMessage(playerid, COLOR_YELLOW,"/rep repare votre vehicule");
SendClientMessage(playerid, COLOR_YELLOW,"/kill tue votre personneage (F4 pour choisir un nouveau personnage puis /kill)");
SendClientMessage(playerid, COLOR_YELLOW,"/s-on active la sauvegarde de position par touches 6 et 4 du Pav Num");
SendClientMessage(playerid, COLOR_YELLOW,"/s-on désactive la sauvegarde de position par touches 6 et 4 du Pav Num");
SendClientMessage(playerid, COLOR_YELLOW,"/l verouillage de votre vehicule");
SendClientMessage(playerid, COLOR_YELLOW,"/ul déverouillage de votre vehicule");
SendClientMessage(playerid, COLOR_RED,"_______________________________________");
}
}
else if(strcmp("/rep",cmdtext, true) == 0)
{
SetVehicleHealth(GetPlayerVehicleID(playerid), 1000.0);
GameTextForPlayer(playerid,"Moteur repare",500,1);
}
else if (strcmp("/kill", cmdtext, true, 5) == 0)
{
SetPlayerHealth(playerid, 0.0);
}
else if (strcmp("/paradis", cmdtext, true)==0)
{
SetPlayerPos(playerid,2318.96,1424.59,42.55);
}
else if (strcmp(cmdtext, "/l", true)==0){
if(IsPlayerInAnyVehicle(playerid)){
new State=GetPlayerState(playerid);
if(State!=PLAYER_STATE_DRIVER){
SendClientMessage(playerid,COLOR_YELLOW,"Seulement le conducteur peut verouiller les portes");
return 1;
}
new i;
for(i=0;i<MAX_PLAYERS;i++){
if(i != playerid)
{
SetVehicleParamsForPlayer(GetPlayerVehicleID(playerid),i, 0, 1);
}
}
SendClientMessage(playerid, COLOR_YELLOW, "Vehicule Verouillé");
new Float:pX, Float:pY, Float:pZ;
GetPlayerPos(playerid,pX,pY,pZ);
PlayerPlaySound(playerid,1056,pX,pY,pZ);
}else{
SendClientMessage(playerid, COLOR_YELLOW, "Vous n'êtes pas dans un vehicule");
}
return 1;
}
if (strcmp(cmdtext, "/ul", true)==0){
if(IsPlayerInAnyVehicle(playerid)){
new State=GetPlayerState(playerid);
if(State!=PLAYER_STATE_DRIVER){
SendClientMessage(playerid, COLOR_YELLOW,"Seulement le conducteur peut deverouiller les portes");
return 1;
}
new i;
for(i=0;i<MAX_PLAYERS;i++){
SetVehicleParamsForPlayer(GetPlayerVehicleID(playerid),i, 0, 0);
}
SendClientMessage(playerid, COLOR_YELLOW, "Vehicule Déverouillé");
new Float:pX, Float:pY, Float:pZ;
GetPlayerPos(playerid,pX,pY,pZ);
PlayerPlaySound(playerid,1057,pX,pY,pZ);
}else{
SendClientMessage(playerid, COLOR_YELLOW, "Vous n'êtes pas dans un vehicule");
}
return 1;
}
}
return 0;
}
-
tu as encore un return 0; en bas de ton script !!! retire le ^^
-
i je l'enlève:
C:\Program Files\Rockstar Games\GTA San Andreas\gamemodes\test.pwn(383) : warning 209: function "OnPlayerCommandText" should return a value
-
heu oui mais met return 1; ^^
-
remplace (return 0;)
par
new erreur[256];
format(erreur, sizeof (erreur), "Commande invalide [%s] Tapez /aide",cmdtext);
return SendClientMessage(playerid,COLOR_YELLOW, erreur);
}
Cordialement,
-
C'est ce qu'il fait depuis tout a l'heure mais ça na pas l'air de fonctionner ....
-
Cets bizar alors comme bug ???
++
nikko
-
oui... (zao : C'est chelou....)
Lol ^^ Mais il y a bien une solution... Faut juste la trouver :s
-
Met un return 1; a la fin de chaque else if, ca marchera ;)
-
ah oui pas bete ;)
++
nikko
-
oui lol, pourquoi on se fait ch*** pour ça alors que c'est tout simple :laugh
-
Content d'avoir pu aider ;)
-
Merciiiii sa marche j'ai meme pu mettre commande invalide
Merci beaucoup
-
Pas forcement !
NV.
Comment ça ? ...
-
Je répond pour Native à Alexandre :
En fait, on peut avoir envie que certaines commandes ne soit visible que par certains joueurs.
Par exemple, la commande /ban qui ne doit être utilisée que par les admins.
Soit lorsqu'un joueur non admin l'utilise on lui affiche un message du genre "Vous n'êtes pas admin" soit on lui fait croire que le commande n'existe pas :
if (strcmp(cmdtext, "/ban", true) == 0)
{
if (IsPlayerAdmin (playerid))
{
/* Code pour bannir un joueur */
...
return 1;
}
else
{
return 0;
}
}
++
Syg
-
Ha Ha !! ça c'est trop fort !! Allé paf dans les dents les petits curieux qui pensent connaitre la commande ^^ (même si elle est belle et bien sur le serveur :p )
-
Pk tu dit ca ???
Nempeche, je savais pas qu'on pouvait metre un reuturn 1 ou 0 dans une commande. cets pas mal pour dissimuler les comandes admin ^^
++
nikko
-
je dis ça parce que j'y avais pas pensé et que c'est bien pratique pour faire croire que cette commande existe pas alors que, si, elle existe ^^
-
Je répond pour Native à Alexandre :
En fait, on peut avoir envie que certaines commandes ne soit visible que par certains joueurs.
Par exemple, la commande /ban qui ne doit être utilisée que par les admins.
Soit lorsqu'un joueur non admin l'utilise on lui affiche un message du genre "Vous n'êtes pas admin" soit on lui fait croire que le commande n'existe pas :
if (strcmp(cmdtext, "/ban", true) == 0)
{
if (IsPlayerAdmin (playerid))
{
/* Code pour bannir un joueur */
...
return 1;
}
else
{
return 0;
}
}
++
Syg
Ah, ok je vois. :happy
Je voyait pas car moi j'"englobe" mes commandes admins dans une condition pour regarder son niveau admin, ça sert à rien de vérifier si le joueur à tapé une commande admin alors qu'il ne l'est pas. :happy
if(pInfo[playerid][admin])
{
if(!strcmp(cmd, "/cmd", true))
{
// ...
return 1;
}
}
++
Alexandre
-
J'ai pris le statut d'admin comme un exemple mais ça pourrait être en fonction d'autre chose (team, level).
Si tu n'as que deux status (joueur/admin), tu peux faire comme tu as dit, c'est effectivement plus efficace (en terme de temps de traitement).
Par contre, lorsque tu as plusieurs niveau d'administration, c'est plus facilement gérable de mettre le test dans chaque commande.
++
Syg
-
Enfait j'ai plusieurs niveau d'administration, là j'ai retiré le >= 1. ;D
Si j'englobe toutes les conditions admin (de 1 à 6), pour ensuite en faire 6 conditions dans une, est-ce qu'il y aura un gain de temps d'éxécution pour les nons-admins ? :)
++
Alexandre
-
A mon avis si il y a un gain, il ne sera pas sensible.
Un test sur un variable droit prendre moins d'1 milliseconde.
Donc à moins d'avoir un millier de tests, tu ne verras pas la différence.
Par contre, les test sur les strcmp sont beaucoup plus long (on compare caractère par caractère la commande saisie avec des chaines).
Dans ce cas, l'emploi de else avant chaque if et la fait d'essayer de mettre les commandes en commençant par la plus utilisée peut peut-être faire gagner quelques centaines de millisecondes.
Reste à savoir quelles sont les commandes les plus utilisées.
++
Syg
-
Un test sur un variable droit prendre moins d'1 milliseconde.
[...]
Par contre, les test sur les strcmp sont beaucoup plus long (on compare caractère par caractère la commande saisie avec des chaines).
Donc il vaut mieux englober les strcmp par des if(pInfo), non ? :happy
Sinon, bonne idée celle de mettre des else if en placant les plus utilisées en premiers. :happy
Je pense que je vais faire ça. :)
++
Alexandre