Comando inválido - ZEDD666 - 19/10/2023
Olá pessoal, preciso de uma ajuda em questão a um comando onde uso ele é o OnPlayerCommandPerformed retorna falando que o comando não existe. porém no sscanf para avisa que o uso correto e tal jeito ele retorna normalmente o Uso correto tipo "uso: /setadmin [id/nick] [level]
Meu comando é este aqui
Código: CMD:setadmin(playerid, params[]){
if(Player[playerid][pLogged] == false)
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Você não está logado!");
if(!IsPlayerAdmin(playerid))
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Você não tem permissão para usar este comando!");
new idx, level;
if(sscanf(params, "ud", idx, level))
return SCM(playerid, COLOR_USOCORRETO, "Uso: /setadmin [id/nick] [level]");
if(level < 0 || level > 6)
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Máximo de level para administradores é de 0 até 6.");
if(!IsPlayerConnected(idx))
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Este jogador não está conectado.");
if(!Player[idx][pLogged])
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Este jogador não está Logado!");
new string[128];
if(level == 0){
format(string, sizeof(string),"%s removeu seu cargo de Administrador.", getPName(playerid));
SCM(idx, -1, string);
format(string, sizeof(string), "%s removeu %s do cargo de Administrador.", getPName(playerid), getPName(idx));
for(new x; x < MAX_PLAYERS; x++)
{
if(Player[x][pAdmin])
SCM(x, COR_AZUL, string);
}
}
if(level >= 1){
format(string, sizeof(string),"%s setou você de Administrador level %d.", AccountName(playerid), getPName(playerid), level);
SCM(idx, -1, string);
format(string, sizeof(string), "Você foi setado de Administrador pelo %s de level %d.", getPName(idx), level);
SCM(playerid, -1, string);
format(string, sizeof(string), "%s mudou o level de Administrador da conta de %s para %d.", getPName(playerid), getPName(idx), level);
for(new x; x < MAX_PLAYERS; x++)
{
if(Player[x][pAdmin])
SCM(x, COR_AZUL, string);
}
}
Player[idx][pAdmin] = level;
return true;
}
meu OnPlayerCommandPerformed
Código: public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
new str[120];
if(!success){
format(str, sizeof(str), ""TAG_ERRO"O Comando \"%s\" não existe!", cmdtext);
SCM(playerid, COLOR_ERRO, str);
}
return 1;
}
Não sei se é conflito com algo, FS's não estou usando nada do tipo sempre quando chego na parte de setar um id que não está conectado no servidor ele avisa que o comando não existe, sendo que era para falar "Este jogador não está conectado." agora players que estão conectados funcionalmente.
RE: Comando inválido - leonardos08bt - 19/10/2023
Código PHP: CMD:setadmin(playerid, params[]){ if(Player[playerid][pLogged] == false) return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Você não está logado!");
if(!IsPlayerAdmin(playerid)) return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Você não tem permissão para usar este comando!");
new idx, level; if(sscanf(params, "ud", idx, level)) return SCM(playerid, COLOR_USOCORRETO, "Uso: /setadmin [id/nick] [level]");
if(!IsPlayerConnected(idx))
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Este jogador não está conectado.");
if(!Player[idx][pLogged])
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Este jogador não está Logado!");
if(level < 0 || level > 6) return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Máximo de level para administradores é de 0 até 6.");
new string[128]; if(level == 0){ format(string, sizeof(string),"%s removeu seu cargo de Administrador.", getPName(playerid)); SCM(idx, -1, string);
format(string, sizeof(string), "%s removeu %s do cargo de Administrador.", getPName(playerid), getPName(idx)); for(new x; x < MAX_PLAYERS; x++) { if(Player[x][pAdmin]) SCM(x, COR_AZUL, query); } } if(level >= 1){ format(string, sizeof(string),"%s setou você de Administrador level %d.", AccountName(playerid), getPName(playerid), level); SCM(idx, -1, string);
format(string, sizeof(string), "Você foi setado de Administrador pelo %s de level %d.", getPName(idx), level); SCM(playerid, -1, string);
format(string, sizeof(string), "%s mudou o level de Administrador da conta de %s para %d.", getPName(playerid), getPName(idx), level); for(new x; x < MAX_PLAYERS; x++) { if(Player[x][pAdmin]) SCM(x, COR_AZUL, query); } }
Player[idx][pAdmin] = level; return true; }
A única coisa que fiz foi colocar as verificações de conectado e logado primeiro. Com isso deve funcionar.
Também verifique se você está usando alguma filterscript que usa um processador de comando diferente ao que você usa na Gamemode, isso da conflito.
RE: Comando inválido - ZEDD666 - 19/10/2023
(19/10/2023 20:15)leonardos08bt Escreveu: Código PHP: CMD:setadmin(playerid, params[]){ if(Player[playerid][pLogged] == false) return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Você não está logado!");
if(!IsPlayerAdmin(playerid)) return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Você não tem permissão para usar este comando!");
new idx, level; if(sscanf(params, "ud", idx, level)) return SCM(playerid, COLOR_USOCORRETO, "Uso: /setadmin [id/nick] [level]");
if(!IsPlayerConnected(idx))
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Este jogador não está conectado.");
if(!Player[idx][pLogged])
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Este jogador não está Logado!");
if(level < 0 || level > 6) return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Máximo de level para administradores é de 0 até 6.");
new string[128]; if(level == 0){ format(string, sizeof(string),"%s removeu seu cargo de Administrador.", getPName(playerid)); SCM(idx, -1, string);
format(string, sizeof(string), "%s removeu %s do cargo de Administrador.", getPName(playerid), getPName(idx)); for(new x; x < MAX_PLAYERS; x++) { if(Player[x][pAdmin]) SCM(x, COR_AZUL, query); } } if(level >= 1){ format(string, sizeof(string),"%s setou você de Administrador level %d.", AccountName(playerid), getPName(playerid), level); SCM(idx, -1, string);
format(string, sizeof(string), "Você foi setado de Administrador pelo %s de level %d.", getPName(idx), level); SCM(playerid, -1, string);
format(string, sizeof(string), "%s mudou o level de Administrador da conta de %s para %d.", getPName(playerid), getPName(idx), level); for(new x; x < MAX_PLAYERS; x++) { if(Player[x][pAdmin]) SCM(x, COR_AZUL, query); } }
Player[idx][pAdmin] = level; return true; }
A única coisa que fiz foi colocar as verificações de conectado e logado primeiro. Com isso deve funcionar.
Também verifique se você está usando alguma filterscript que usa um processador de comando diferente ao que você usa na Gamemode, isso da conflito.
não estou usando nenhum filterscript está sendo executado. comando funciona normalmente certo, porém olhe este print. em vez de mostrar a mensagem "Este jogador não está conectado." ele mostra o que o setadmin 2 3 n existe. pois não ele não está conectado mesmo, mas era para exibi a mensagem "Este jogador não está conectado."
RE: Comando inválido - White_Blue - 19/10/2023
(19/10/2023 19:29)ZEDD666 Escreveu: Olá pessoal, preciso de uma ajuda em questão a um comando onde uso ele é o OnPlayerCommandPerformed retorna falando que o comando não existe. porém no sscanf para avisa que o uso correto e tal jeito ele retorna normalmente o Uso correto tipo "uso: /setadmin [id/nick] [level]
Meu comando é este aqui
Código: CMD:setadmin(playerid, params[]){
if(Player[playerid][pLogged] == false)
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Você não está logado!");
if(!IsPlayerAdmin(playerid))
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Você não tem permissão para usar este comando!");
new idx, level;
if(sscanf(params, "ud", idx, level))
return SCM(playerid, COLOR_USOCORRETO, "Uso: /setadmin [id/nick] [level]");
if(level < 0 || level > 6)
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Máximo de level para administradores é de 0 até 6.");
if(!IsPlayerConnected(idx))
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Este jogador não está conectado.");
if(!Player[idx][pLogged])
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Este jogador não está Logado!");
new string[128];
if(level == 0){
format(string, sizeof(string),"%s removeu seu cargo de Administrador.", getPName(playerid));
SCM(idx, -1, string);
format(string, sizeof(string), "%s removeu %s do cargo de Administrador.", getPName(playerid), getPName(idx));
for(new x; x < MAX_PLAYERS; x++)
{
if(Player[x][pAdmin])
SCM(x, COR_AZUL, string);
}
}
if(level >= 1){
format(string, sizeof(string),"%s setou você de Administrador level %d.", AccountName(playerid), getPName(playerid), level);
SCM(idx, -1, string);
format(string, sizeof(string), "Você foi setado de Administrador pelo %s de level %d.", getPName(idx), level);
SCM(playerid, -1, string);
format(string, sizeof(string), "%s mudou o level de Administrador da conta de %s para %d.", getPName(playerid), getPName(idx), level);
for(new x; x < MAX_PLAYERS; x++)
{
if(Player[x][pAdmin])
SCM(x, COR_AZUL, string);
}
}
Player[idx][pAdmin] = level;
return true;
}
meu OnPlayerCommandPerformed
Código: public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
new str[120];
if(!success){
format(str, sizeof(str), ""TAG_ERRO"O Comando \"%s\" não existe!", cmdtext);
SCM(playerid, COLOR_ERRO, str);
}
return 1;
}
Não sei se é conflito com algo, FS's não estou usando nada do tipo sempre quando chego na parte de setar um id que não está conectado no servidor ele avisa que o comando não existe, sendo que era para falar "Este jogador não está conectado." agora players que estão conectados funcionalmente.
Caso o sscanf e o zcmd estejam em suas últimas versões, o problema pode estar no seu script, verifique se você está utilizando a callback "OnPlayerCommandText" para fazer a verificação de comandos inválidos, se sim, remova o código dessa callback, pois pode estar gerando conflitos. E não recomendo o uso do zcmd, já que é uma include desatualizada e lenta, recomendo utilizar o Pawn.CMD que é mais moderno e rápido e para usá-lo, você não tem que mudar nada no seu script além dos parâmetros das callbacks.
Código PHP: public OnPlayerCommandPerformed(playerid, cmdtext[], success) { if(!success) format(string, sizeof(string), ""TAG_ERRO"O Comando \"%s\" não existe!", cmdtext), SendClientMessage(playerid, COR_ERRO, string); return 1; }
CMD:setadm(playerid, params[]) { new id, level; if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COR_ERRO, "Você não tem permissão para usar este comando."); if(sscanf(params, "ud", id, level)) return SendClientMessage(playerid, COR_ERRO, "Uso: /setadm [id] [nível]"); if(!IsPlayerConnected(id)) return SendClientMessage(playerid, COR_ERRO, "Este jogador não está conectado."); else if(Player[id][pLogged] == 0) return SendClientMessage(playerid, COR_ERRO, "Este jogador não está logado."); if(level < 0 || level > 6) return SendClientMessage(playerid, COR_ERRO, "Você apenas pode usar levels entre 0 e 6."); else if(level == 0) { if(Player[id][pAdmin] == 0) return SendClientMessage(playerid, COR_ERRO, "Este jogador não é um Administrador e portanto não há como retirar seu cargo de Administrador."); Player[id][pAdmin] = 0; // Retira o nível de administrador do jogador. format(string, sizeof(string), "%s removeu %s do seu cargo de Administrador.", GetPName(playerid), GetPName(id)); SendClientMessageToAll(COR_AZUL, string); // Manda uma mensagem para todos online(Sem necessidade daquele loop que você criou, apenas usando a função nativa "SendClientMessageToAll"). } if(Player[id][pAdmin]) { format(string, sizeof(string), "%s mudou seu level de Administrador de %d para %d.", GetPName(playerid), GetPName(id), Player[id][pAdmin], level); SendClientMessage(id, -1, string); Player[id][pAdmin] = level; }
format(string, sizeof(string), "%s te setou para o level de Admin %d!", GetPName(playerid), level); SendClientMessage(id, -1, string); Player[id][pAdmin] = level; return 1; }
stock GetPName(playerid) { static Name[MAX_PLAYER_NAME]; GetPlayerName(playerid, Name, sizeof(Name)); return Name; }
No código acima:
- Removi diversas verificações redundantes.
- Troquei SCM para SendClientMessage pois acho que melhora a leitura do código usando as funções nativas "SendClientMessage" e "SendClientMessageToAll".
- Removi a string "str" da callback OnPlayerCommandPerformed já que suponho que a string "string" seja uma string global e portanto não há a necessidade de criar outra string exclusivamente para formatar essa mensagem.
- Adicionei a função "GetPName" no código.
- Mudei o nome da variável "idx" para id para melhor nomeamento de variável.
RE: Comando inválido - ZEDD666 - 19/10/2023
(19/10/2023 21:20)White_Blue Escreveu: (19/10/2023 19:29)ZEDD666 Escreveu: Olá pessoal, preciso de uma ajuda em questão a um comando onde uso ele é o OnPlayerCommandPerformed retorna falando que o comando não existe. porém no sscanf para avisa que o uso correto e tal jeito ele retorna normalmente o Uso correto tipo "uso: /setadmin [id/nick] [level]
Meu comando é este aqui
Código: CMD:setadmin(playerid, params[]){
if(Player[playerid][pLogged] == false)
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Você não está logado!");
if(!IsPlayerAdmin(playerid))
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Você não tem permissão para usar este comando!");
new idx, level;
if(sscanf(params, "ud", idx, level))
return SCM(playerid, COLOR_USOCORRETO, "Uso: /setadmin [id/nick] [level]");
if(level < 0 || level > 6)
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Máximo de level para administradores é de 0 até 6.");
if(!IsPlayerConnected(idx))
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Este jogador não está conectado.");
if(!Player[idx][pLogged])
return SCM(playerid, COLOR_ERRO, ""TAG_ERRO"Este jogador não está Logado!");
new string[128];
if(level == 0){
format(string, sizeof(string),"%s removeu seu cargo de Administrador.", getPName(playerid));
SCM(idx, -1, string);
format(string, sizeof(string), "%s removeu %s do cargo de Administrador.", getPName(playerid), getPName(idx));
for(new x; x < MAX_PLAYERS; x++)
{
if(Player[x][pAdmin])
SCM(x, COR_AZUL, string);
}
}
if(level >= 1){
format(string, sizeof(string),"%s setou você de Administrador level %d.", AccountName(playerid), getPName(playerid), level);
SCM(idx, -1, string);
format(string, sizeof(string), "Você foi setado de Administrador pelo %s de level %d.", getPName(idx), level);
SCM(playerid, -1, string);
format(string, sizeof(string), "%s mudou o level de Administrador da conta de %s para %d.", getPName(playerid), getPName(idx), level);
for(new x; x < MAX_PLAYERS; x++)
{
if(Player[x][pAdmin])
SCM(x, COR_AZUL, string);
}
}
Player[idx][pAdmin] = level;
return true;
}
meu OnPlayerCommandPerformed
Código: public OnPlayerCommandPerformed(playerid, cmdtext[], success)
{
new str[120];
if(!success){
format(str, sizeof(str), ""TAG_ERRO"O Comando \"%s\" não existe!", cmdtext);
SCM(playerid, COLOR_ERRO, str);
}
return 1;
}
Não sei se é conflito com algo, FS's não estou usando nada do tipo sempre quando chego na parte de setar um id que não está conectado no servidor ele avisa que o comando não existe, sendo que era para falar "Este jogador não está conectado." agora players que estão conectados funcionalmente.
Caso o sscanf e o zcmd estejam em suas últimas versões, o problema pode estar no seu script, verifique se você está utilizando a callback "OnPlayerCommandText" para fazer a verificação de comandos inválidos, se sim, remova o código dessa callback, pois pode estar gerando conflitos. E não recomendo o uso do zcmd, já que é uma include desatualizada e lenta, recomendo utilizar o Pawn.CMD que é mais moderno e rápido e para usá-lo, você não tem que mudar nada no seu script além dos parâmetros das callbacks.
Código PHP: public OnPlayerCommandPerformed(playerid, cmdtext[], success) { if(!success) format(string, sizeof(string), ""TAG_ERRO"O Comando \"%s\" não existe!", cmdtext), SendClientMessage(playerid, COR_ERRO, string); return 1; }
CMD:setadm(playerid, params[]) { new id, level; if(!IsPlayerAdmin(playerid)) return SendClientMessage(playerid, COR_ERRO, "Você não tem permissão para usar este comando."); if(sscanf(params, "ud", id, level)) return SendClientMessage(playerid, COR_ERRO, "Uso: /setadm [id] [nível]"); if(!IsPlayerConnected(id)) return SendClientMessage(playerid, COR_ERRO, "Este jogador não está conectado."); else if(Player[id][pLogged] == 0) return SendClientMessage(playerid, COR_ERRO, "Este jogador não está logado."); if(level < 0 || level > 6) return SendClientMessage(playerid, COR_ERRO, "Você apenas pode usar levels entre 0 e 6."); else if(level == 0) { if(Player[id][pAdmin] == 0) return SendClientMessage(playerid, COR_ERRO, "Este jogador não é um Administrador e portanto não há como retirar seu cargo de Administrador."); Player[id][pAdmin] = 0; // Retira o nível de administrador do jogador. format(string, sizeof(string), "%s removeu %s do seu cargo de Administrador.", GetPName(playerid), GetPName(id)); SendClientMessageToAll(COR_AZUL, string); // Manda uma mensagem para todos online(Sem necessidade daquele loop que você criou, apenas usando a função nativa "SendClientMessageToAll"). } if(Player[id][pAdmin]) { format(string, sizeof(string), "%s mudou seu level de Administrador de %d para %d.", GetPName(playerid), GetPName(id), Player[id][pAdmin], level); SendClientMessage(id, -1, string); Player[id][pAdmin] = level; }
format(string, sizeof(string), "%s te setou para o level de Admin %d!", GetPName(playerid), level); SendClientMessage(id, -1, string); Player[id][pAdmin] = level; return 1; }
stock GetPName(playerid) { static Name[MAX_PLAYER_NAME]; GetPlayerName(playerid, Name, sizeof(Name)); return Name; }
No código acima:
- Removi diversas verificações redundantes.
- Troquei SCM para SendClientMessage pois acho que melhora a leitura do código usando as funções nativas "SendClientMessage" e "SendClientMessageToAll".
- Removi a string "str" da callback OnPlayerCommandPerformed já que suponho que a string "string" seja uma string global e portanto não há a necessidade de criar outra string exclusivamente para formatar essa mensagem.
- Adicionei a função "GetPName" no código.
- Mudei o nome da variável "idx" para id para melhor nomeamento de variável.
Obrigado pela dica meu caro, irei usar sim, porém continua apresentando que o comando não existe quando tento dar admin para um id que não está online. Queria mesmo que aparecesse a mensagem Este jogador não está conectado. mesmo. pois o comando existe isso que é engraçado kkk, sempre fiz desse jeito em meus gamemodes em 2014 em adiante nunca me apresentou algo assim. e sobre a callback OnPlayerCommandText foi uma das primeiras coisas que removi kkk
Peguei a versão 0.3.1 de 2009 do ZCMD e a versão do SSCANF que estou usando é a 2.13.8
RE: Comando inválido - ZEDD666 - 20/10/2023
Bom, depois de algumas horas fiz um DEBUG era para ter feito isso desde o início. mas obtive alguma reposta.
Quando dou Admin para um player online está tudo ok, id e valor são reconhecidos
DEBUG antes da verificação do SSCANF -> 0 6
DEBUG depois da verificação do SSCANF -> id = 0, level = 6
Agora coloco o cargo Admin em um ID que não está conectado ele me retorna assim
DEBUG antes da verificação do SSCANF -> 3 5
DEBUG depois da verificação do SSCANF -> id = 65535, level = 5
percebi também que se usar "dd" ao no lugar de "ud" ele verifica e aparece mensagem "Este jogador não está conectado." porém, ai talvez arrumaria meu problema mas no caso não quero assim pois se não me engano U seria para pegar tanto id e nome certo ? e caso precise usar U para um strfind talvez apresente o mesmo erro
RE: Comando inválido - pushline - 20/10/2023
https://github.com/Y-Less/sscanf#specifiers - Especificadores do sscanf.
u = user name / id (bots e players)
r = player name / id
i/d = inteiros (n eh recomendado pra player)
O "u" e o "r" ja fazem as buscas se o id mencionado está online.
https://github.com/Y-Less/sscanf#sendcash-command
"Note that if a player has a numeric name such as 69 you will have to use their ID only, typing that name will always select the player with ID 69, not the player with name "69"".
RE: Comando inválido - ZEDD666 - 20/10/2023
(20/10/2023 09:20)pushline Escreveu: https://github.com/Y-Less/sscanf#specifiers - Especificadores do sscanf.
u = user name / id (bots e players)
r = player name / id
i/d = inteiros (n eh recomendado pra player)
O "u" e o "r" ja fazem as buscas se o id mencionado está online.
https://github.com/Y-Less/sscanf#sendcash-command
"Note that if a player has a numeric name such as 69 you will have to use their ID only, typing that name will always select the player with ID 69, not the player with name "69"".
Então, usei tanto u e r porém mesma coisa
DEBUG antes da verificação do SSCANF -> 3 5
DEBUG depois da verificação do SSCANF -> id = 65535, level = 5
quando o assunto é digita o ID ou NICKNAME da pessoa ele já passa para 65535, usei o i que seria para Inteiro e funcionou mas é aquilo, preciso do uso do nickname no comando tbm.
Att:
Acabei fazendo igual o y_less fez no exemplo.
troquei o IsPlayerConnected por id == INVALID_PLAYER_ID porém ainda retorna o id = 65535 quando não está conectado, mas agora volta a mensagem do player não está conectado, talvez este quase tudo certo kkk
|