Portal SAMP
[Ajuda] ajuda no meu registro / loging - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] ajuda no meu registro / loging (/showthread.php?tid=4898)



ajuda no meu registro / loging - André Santos - 15/10/2024

ola pessoa queria saber porq meu sistema de registro e login nao ta funcionando 
quando o playerconecta aparece a dialog de registrar caso ele nao seja registrado ai se eu aperta na dialog sem nem precisar colocar senha ou nada so no fato de apertar ela some assim fazendo que eu nao consiga me registrar , a mesma coisa e na hora de logar a dialog aparece mas mesmo sem colocar senhar so no fato de apertar nela ela some fazendo assim o player nao poder logar para spawnar 
estou quebrando a cabeca pois estou me esforcando no pawn para criar minha propia gm mas ta dificl nisso 

#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))
    {
        // Se não existe, mostra o diálogo de registro
        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; // Inicializa como não logado
    return 1;
}
forward OnPlayerDialogResponse(playerid, dialogid, response, input[]);
public OnPlayerDialogResponse(playerid, dialogid, response, input[])
{
    if (response == 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) == 0)
            {
                SendClientMessage(playerid, vermelho, "Você precisa colocar uma senha para se registrar!");
                ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "Registro", "Por favor, insira uma senha para se registrar:", "Registrar", "Cancelar");
                return 1;
            }
            if (strlen(input) < 4)
            {
                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));
            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))
            {
                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"))
            {
                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;
            }
            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)
    {
        SendClientMessage(playerid, vermelho, "Operação cancelada.");
        return 1;
    }

    return 1;
}


RE: ajuda no meu registro / loging - BitSain - 15/10/2024

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).

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.


RE: ajuda no meu registro / loging - André Santos - 15/10/2024

( 19:04)BitSain Escreveu: Uma coisa é que, você não precisa lançar um forward para a callback OnPlayerDialogResponse, isso já é feito (nativamente) na include 'a_samp'.
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;
}

forward OnPlayerDialogResponse(playerid, dialogid, response, input[]);
public OnPlayerDialogResponse(playerid, dialogid, response, input[]) {
    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;
}

obg pela ajuda o problema todo ainda continua quando eu registro ao ivez de colocar a senha se apertar na dialo do registro ele fecha a mesma coisa e no login to quase desistindo e arrumar um sistema simples de login que salve senha em hash grana e score mas obg ainda sim nao funcionou mas compilou tudo sem erro vou tentar ver se consigo descobri


RE: ajuda no meu registro / loging - BitSain - 15/10/2024

Cara, o problema é que você está criando seus script em uma coisa que não é chamada em parte em nenhuma do código.

Retire isso: forward OnPlayerDialogResponse(playerid, dialogid, response, input[]);

mude isso: public OnPlayerDialogResponse(playerid, dialogid, response, input[])
para isso: public OnDialogResponse(playerid, dialogid, response, inputtext[])

O código que forneci, está correto (a estrutura do seu código repito: está confuso)
Pode usar um CTRL+C e CTRL+V, vai funcionar.


RE: ajuda no meu registro / loging - André Santos - 15/10/2024

( 19:25)BitSain Escreveu: Cara, o problema é que você está criando seus script em uma coisa que não é chamada em parte em nenhuma do código.

Retire isso: forward OnPlayerDialogResponse(playerid, dialogid, response, input[]);

mude isso: public OnPlayerDialogResponse(playerid, dialogid, response, input[])
para isso: public OnDialogResponse(playerid, dialogid, response, input[])

O código que forneci, está correto (a estrutura do seu código repito: está confuso)
Pode usar um CTRL+C e CTRL+V, vai funcionar.

consegui descobrir onde tava o problema corrigi e agora ta tudo funcional o problema esta nesse input quando o correto seria inputtext so isso agora tudo funciona obrigado , desculpa a estrutura do meu codigo nao sou muito experiente mas sempre aprendo mais todo dia 
a estrutura do meu codigo pra vc pode parecer confuso mas pra mim nao pois foi nessa logica da minha mente doida q consegi fazer e muito simples quando o player entra na public onplayerconnect a dialog registro aparece caso ele nao seja registrado depois que ele se registra a dialog login aparece pra ele logar e spawnar so isso Wink obg muito obg pelo seu precisoso tempo a responder minha duvida o erro tava na minha cara todo o tempo uma coisa simples que eu nao prestei atencao quando olhei direito vi onde tava o problema e corrigi kkk