24/07/2023 00:58
(23/07/2023 18:01)sabio Escreveu:Eu estava tendo criar um sistema de renomear uma conta in-game com ZCMD, DOF2 e sscanf. Não aparece nenhum erro ou warning na compilação, porém não funciona de jeito nenhum.
Código:CMD:renomearplayer(playerid, params[])
{
new id, nome, str[256], str1[200], str2[200];
if(cargoadmin[playerid] < 4)
return SCM(playerid, -1, MSGPERM);
if(sscanf(params, "ds[16]", id, nome))
return SCM(playerid, -1, "{FF0000}[Erro] Use /renomearplayer [id] [novo nome].");
if(Player[playerid][Logado] == 0)
return SCM(playerid, -1, "{FF0000}[Erro] Jogador nao conectado.");
if(Player[id][Logado] == 0)
return SCM(playerid, -1, "{FF0000}[Erro] Jogador nao conectado.");
if(Trabalhando[playerid] < 1)
return SCM(playerid, -1, "{FF0000}[Erro] Voce nao esta trabalhando! /tb");
if(nome < 4 || nome > 16)
return SCM(playerid, -1, "{FF0000}[Erro] Nome invalido. 4 a 16 caracteres.");
format(str, sizeof(str), "contas/%s.ini", nome);
if(DOF2_FileExists(str)) {
SCM(playerid, -1, "{FF0000}[Erro] Esse nome ja existe no sistema.");
}
else {
DOF2_RenameFile(file(id), str);
if(pAdmin[id] == true) {
format(str1, sizeof(str1), "admins/%s.ini", pName(id));
format(str2, sizeof(str2), "admins/%s.ini", nome);
DOF2_RenameFile(str1, str2);
}
}
format(str, 256, "Voce teve seu nick renomeado pelo administrador: %s. \n\nNovo nick: ( %s )", pName(playerid), nome);
SCM(id, -1, str);
format(str, 256, "renomeou o nick do jogador: %s. para o novo nick: ( %s )", pName(id), nome);
Admlog(str, 1);
SetTimerEx("KickTempo", 10000, false, "i", id);
SCM(id, -1, "Voce teve seu nick alterado e sera kickado para carrega-lo. Nao se esqueca de mudar o nick no samp!");
DOF2_SaveFile();
return 1;
}
Refiz o seu comando, dessa forma deve funcionar:
Código PHP:
CMD:renomearplayer(playerid, const params[]) {
new id, name[MAX_PLAYER_NAME], fileacc[30], fileadmin[30], str[128];
if(cargoadmin[playerid] < 1) return SendClientMessage(playerid, -1, "Você não tem permissão.");
if(sscanf(params, "ds[24]", id, name)) return SendClientMessage(playerid, -1, "Use: /renomearplayer [id] [nome]");
else if(Player[playerid][Logado] == 0) return SendClientMessage(playerid, -1, "Você não está logado.");
else if(Trabalhando[playerid] == 0) return SendClientMessage(playerid, -1, "Você deve estar trabalhando para usar este comando.");
else if(!IsValidNickName(name) return SendClientMessage(playerid, -1, "Selecione um nick que contenha entre 4 e "#MAX_PLAYER_NAME" caracteres e não contenha nenhum símbolo especial.");
format(fileacc, 24, "/contas/%s.ini", GetPlayerNameEx(id));
DOF2_RenameFile(fileacc, name);
if(pAdmin[id]) {
format(fileadmin, 24, "/admins/%s.ini", GetPlayerNameEx(id));
DOF2_RenameFile(fileadmin, name);
}
format(str, sizeof(str), "Seu nome foi renomeado pelo admin: %s[%d].\n\nNovo nome: %s", GetPlayerNameEx(playerid), playerid, name);
SendClientMessage(id, -1, str);
SendClientMessage(playerid, -1, "Agora você será kickado e lembre-se de trocar para o novo nick para que funcione corretamente!");
DOF2_SaveFile();
SetTimerEx("KickTempo", 6500, false, "d", id);
return 1;
}
GetPlayerNameEx(playerid) {
static Name[MAX_PLAYER_NAME];
GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
return Name;
}
IsValidNickName(const nick[]) {
if(strlen(nick) > MAX_PLAYER_NAME || strlen(nick) < 4) return false;
for(new pos = 0, tamanho = strlen(nick); pos < tamanho; pos++) switch(nick[pos]) {
case 'A' .. 'Z', 'a' .. 'z', '$', '_', '@', '[', ']', '(', ')', '.', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0': continue;
default: return false;
}
return true;
}
Existiam 2 problemas no seu código: Você estava verificando se o jogador é admin de uma forma booleana, o que dependendo do sistema de admin é incorreto, outra coisa é que a variável "name" estava definida como um inteiro quando na verdade deveria ser uma string e fora que haviam diversas verificações redundantes e estava mal organizado.
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.