19/10/2023 21:20
(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
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.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;
}
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.
Não estou disponível para realizar serviços relacionados ao SA-MP e não costumo responder a mensagens privadas, a menos que estejam relacionadas à moderação do fórum.