Uma coisa é que, você não precisa lançar um forward para a callback OnPlayerDialogResponse, isso já é feito (nativamente) na include 'a_samp' pela OnDialogResponse (o erro é esse).
Mantive a mesma estrutura do seu código (inclusive na solução), mas a forma de como você está fazendo isso (OnPlayerDialogResponse) pode parecer estranho no futuro (para mim foi agora).
Se me permites sugerir algo (faça o que quiser, mas recomendo):
1. Evite fazer a verificação de response == 1 fora do contexto dos diálogos, isso pode confundir.
2. As validações de senha aparecem várias vezes. Coloque isso em uma função separada.
3. Centralize as chamadas de ShowPlayerDialog em funções específicas para registro e login.
4. Verifique a existência de arquivos em uma única função para evitar repetição.
5. A função OnPlayerDialogResponse está muito cheia; divida-a em partes menores para tratar registro e login separadamente.
6. A variável de logado poderia ser booleana (true-false), você provavelmente não vai trabalhar com valores diferentes de 0 e 1.
Resumindo: evite verificações fora de contexto, agrupe validações repetitivas, centralize diálogos e separe funções grandes em partes menores.
Mantive a mesma estrutura do seu código (inclusive na solução), mas a forma de como você está fazendo isso (OnPlayerDialogResponse) pode parecer estranho no futuro (para mim foi agora).
Código:
#define DIALOG_REGISTER 1000
#define DIALOG_LOGIN 1001
new Logged[MAX_PLAYERS];
public OnPlayerConnect(playerid) {
new name[MAX_PLAYER_NAME], file[200];
GetPlayerName(playerid, name, sizeof(name));
format(file, sizeof(file), "\\users\\%s.ini", name);
if (!dini_Exists(file)) {
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registro", "Por favor, insira uma senha para se registrar:", "Registrar", "Cancelar");
} else {
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Login", "Por favor, insira sua senha:", "Logar", "Cancelar");
}
Logged[playerid] = 0;
return 1;
}
public OnDialogResponse(playerid, dialogid, response, input[]) { // ERRO CORRIGIDO
if (response == 1) { // Verifica se o jogador apertou OK
if (strlen(input) == 0) { // Verifica se o campo de senha está vazio
SendClientMessage(playerid, vermelho, "Você precisa inserir uma senha!");
if (dialogid == DIALOG_REGISTER) {
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registro", "Por favor, insira uma senha para se registrar:", "Registrar", "Cancelar");
} else if (dialogid == DIALOG_LOGIN) {
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Login", "Por favor, insira sua senha:", "Logar", "Cancelar");
}
return 1;
}
new name[MAX_PLAYER_NAME], file[200];
GetPlayerName(playerid, name, sizeof(name));
format(file, sizeof(file), "\\users\\%s.ini", name);
if (dialogid == DIALOG_REGISTER) {
if (strlen(input) < 4) { // Verifica se a senha tem no mínimo 4 caracteres
SendClientMessage(playerid, vermelho, "A senha deve ter no mínimo 4 caracteres.");
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registro", "Por favor, insira uma senha para se registrar:", "Registrar", "Cancelar");
return 1;
}
dini_Create(file);
dini_IntSet(file, "password", adler32_hash(input)); // Armazena a senha com hash
dini_IntSet(file, "cash", 0);
dini_IntSet(file, "score", 0);
SendClientMessage(playerid, amarelo, "Você foi registrado com sucesso!");
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Login", "Por favor, insira sua senha:", "Logar", "Cancelar");
return 1;
}
else if (dialogid == DIALOG_LOGIN) {
if (!dini_Exists(file)) { // Verifica se o arquivo do jogador existe
SendClientMessage(playerid, vermelho, "O arquivo de usuário não foi encontrado. Por favor, registre-se.");
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registro", "Por favor, insira uma senha para se registrar:", "Registrar", "Cancelar");
return 1;
}
if (adler32_hash(input) != dini_Int(file, "password")) { // Verifica a senha
SendClientMessage(playerid, vermelho, "Senha incorreta! Tente novamente.");
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "Login", "Senha incorreta! Por favor, tente novamente:", "Logar", "Cancelar");
return 1;
}
// Login bem-sucedido
Logged[playerid] = 1;
GivePlayerMoney(playerid, dini_Int(file, "cash"));
SetPlayerScore(playerid, dini_Int(file, "score"));
SendClientMessage(playerid, amarelo, "Você está logado com sucesso!");
return 1;
}
} else if (response == 0) { // O jogador apertou "Cancelar"
SendClientMessage(playerid, vermelho, "Operação cancelada.");
return 1;
}
return 1;
}
Se me permites sugerir algo (faça o que quiser, mas recomendo):
1. Evite fazer a verificação de response == 1 fora do contexto dos diálogos, isso pode confundir.
2. As validações de senha aparecem várias vezes. Coloque isso em uma função separada.
3. Centralize as chamadas de ShowPlayerDialog em funções específicas para registro e login.
4. Verifique a existência de arquivos em uma única função para evitar repetição.
5. A função OnPlayerDialogResponse está muito cheia; divida-a em partes menores para tratar registro e login separadamente.
6. A variável de logado poderia ser booleana (true-false), você provavelmente não vai trabalhar com valores diferentes de 0 e 1.
Resumindo: evite verificações fora de contexto, agrupe validações repetitivas, centralize diálogos e separe funções grandes em partes menores.