|
Sistema de login e registro - Diálogos - Usando Y_INI
Sistema de login e registro - Diálogos - Usando Y_INI O que é isso? Um tutorial simples de como fazer um sistema de Login e Registro usando Y_INI.
O que é Y_INI? Y_INI é um extenso leitor e gravador de arquivos baseado em .INI, também conhecido como 'Sistema de Gerenciamento de Arquivos' criado por Y_Less. Isso está incluído na biblioteca / diretório YSI junto com outros itens úteis, como y_commands (YCMD) e y_groups. Qual é a diferença entre este e meu escritor de arquivo? Y_INI não apenas foi dito, mas provou ser um dos leitores e gravadores de arquivos .INI mais rápidos e eficientes criados. Você pode ler mais visitando:
Etapa IAdicione o Y_INI Include no início do script. Isso inclui todas as funções necessárias para criar nosso sistema de Login e Registro. Etapa II Vamos definir alguns Diálogos. Código de peão: #define DIALOG_REGISTER 1 #define DIALOG_LOGIN 2 #define DIALOG_SUCCESS_1 3 #define DIALOG_SUCCESS_2 4
Etapa IIIDefinindo o 'PATH' do arquivo .INI. Código de peão: #define PATH "/Users/%s.ini"
Etapa IVVamos adicionar algumas cores. Código de peão: #define COL_WHITE "{FFFFFF}" #define COL_RED "{F81414}" #define COL_GREEN "{00FF22}" #define COL_LIGHTBLUE "{00CED1}"
Etapa VVamos usar um enum para armazenar nossas variáveis. Código de peão: enum pInfo { pPass, pCash, pAdmin, pKills, pDeaths } novo PlayerInfo [ MAX_PLAYERS ] [ pInfo ] ;
Etapa VI Agora vamos criar uma função para carregar os dados do usuário. Código de peão: encaminhar LoadUser_data ( playerid, nome [ ] , valor [ ] ) ; public LoadUser_data ( playerid, nome [ ] , valor [ ] ) { INI_Int ( "Senha" , PlayerInfo [ playerid ] [ pPass ] ) ; INI_Int ( "Dinheiro" , PlayerInfo [ playerid ] [ pCash ] ) ; INI_Int ( "Admin", PlayerInfo [ playerid ] [ pAdmin ] ) ; INI_Int ( "Kills" , PlayerInfo [ playerid ] [ pKills ] ) ; INI_Int ( "Mortes" , PlayerInfo [ playerid ] [ pMortees ] ) ; return 1 ; }
Etapa VII Vamos criar uma função de estoque simples. Código de peão: estoque UserPath ( playerid ) { nova string [ 128 ] , playername [ MAX_PLAYER_NAME ] ; GetPlayerName ( playerid, playername, sizeof ( playername ) ) ; formato ( string, sizeof ( string ) , PATH, playername ) ; string de retorno ; }
A função de estoque 'UserPath' vai simplesmente 'pegar' o 'PATH' do arquivo do usuário.Etapa VIII Adicione este código abaixo de sua função de estoque anterior.Código de peão: / * Créditos para Dracoblue * / estoque udb_hash ( buf [ ] ) { new length = strlen ( buf ) ; novo s1 = 1 ; novo s2 = 0 ; novo n; para ( n = 0 ; n < comprimento; n ++ ) { s1 = ( s1 + buf [ n ] ) % 65521 ; s2 = ( s2 + s1 ) % 65521 ; } return ( s2 << 16 ) + s1; }
O estoque acima é um simples 'hasher' e será usado para fazer hash de senhas, Créditos para Dracoblue. Etapa IX Agora vamos usar o callback 'OnPlayerConnect' para verificar se o jogador está registrado ou não.Código de peão: public OnPlayerConnect ( playerid ) { if ( fexist ( UserPath ( playerid ) ) ) { INI_ParseFile ( UserPath ( playerid ) , "LoadUser_% s" , .bExtra = true, .extra = playerid ) ; ShowPlayerDialog ( playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "" COL_WHITE "Login" , "" COL_WHITE "Digite sua senha abaixo para fazer o login." ,"Login" , "Sair" ) ; } else { ShowPlayerDialog ( playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, "" COL_WHITE "Registrando ..." , "" COL_WHITE "Digite sua senha abaixo para registrar uma nova conta." , "Registrar" , "Sair" ) ; } return 1 ; }
Estaremos usando a função nativa 'fexist' para pesquisar nosso arquivo. Os parâmetros são definidos para nossa função de estoque que criamos. Se o arquivo existir, você receberá uma caixa de diálogo 'Login'. Caso contrário, você receberá uma caixa de diálogo de registro. Etapa X Código de peão: public OnDialogResponse ( playerid, dialogid, response, listitem, inputtext [ ] ) { switch ( dialogid ) { case DIALOG_REGISTER : { if ( ! response ) return Kick ( playerid ) ; if ( resposta ) { if ( ! strlen ( inputtext ) ) return ShowPlayerDialog ( playerid, DIALOG_REGISTER, DIALOG_STYLE_INPUT, ""COL_WHITE "Registrando ..." , "" COL_RED "Você digitou uma senha inválida. \ N " COL_WHITE "Digite sua senha abaixo para registrar uma nova conta." , "Registrar" , "Sair" ) ; novo INI : Arquivo = INI_Open ( UserPath ( playerid ) ) ; INI_SetTag ( Arquivo, "dados" ) ; INI_WriteInt ( Arquivo, "Senha" ,) ) ; INI_WriteInt ( Arquivo, "Dinheiro" , 0 ) ; INI_WriteInt ( Arquivo, "Admin" , 0 ) ; INI_WriteInt ( Arquivo, "Kills" , 0 ) ; INI_WriteInt ( Arquivo, "Mortes" , 0 ) ; INI_Close ( Arquivo ) ;
SetSpawnInfo ( playerid, 0 , 0, 1958,33 , 1343,12 , 15,36 , 269,15 , 0 , 0 , 0 , 0 , 0 , 0 ) ; SpawnPlayer ( playerid ) ; ShowPlayerDialog ( playerid, DIALOG_SUCCESS_1, DIALOG_STYLE_MSGBOX, "" COL_WHITE "Sucesso!" , "" COL_GREEN "Ótimo! Seu sistema Y_INI funciona perfeitamente. Relog para salvar suas estatísticas!" , "Ok" , "" ) ; }
case DIALOG_LOGIN : { if ( ! resposta ) return Kick ( playerid ) ; if ( resposta ) { if ( udb_hash ( inputtext ) == PlayerInfo [ playerid ] [ pPass ] ) { INI_ParseFile ( UserPath ( playerid ) , "LoadUser_% s" , .bExtra = true, .extra =playerid ) ; GivePlayerMoney ( playerid, PlayerInfo [ playerid ] [ pCash ] ) ; ShowPlayerDialog ( playerid, DIALOG_SUCCESS_2, DIALOG_STYLE_MSGBOX, "" COL_WHITE "Sucesso!" , "" COL_GREEN "Você fez login com sucesso!" , "Ok" , "" ) ; } else { ShowPlayerDialog ( playerid, DIALOG_LOGIN, DIALOG_STYLE_INPUT, "", "" COL_RED "Você digitou uma senha incorreta. \ N " COL_WHITE "Digite sua senha abaixo para fazer o login." , "Login" , "Sair" ) ; } return 1 ; } } } return 1 ; }
Em vez de usar a instrução 'if' para definir meus diálogos, usei casos porque eles parecem ocupar menos espaço e são supostamente 'mais rápidos'. A (! Resposta) é a função se o primeiro botão não tiver sido clicado, ele chutará o jogador.
O if (! Strlen (texto de entrada)) explica se nada foi inserido na caixa de diálogo (entrada), você será solicitado a outra caixa de diálogo que mostra 'Senha incorreta'.
Se tudo correr bem, a função INI_Open é então 'executada' que carrega e abre o Userfile. Uma vez aberta, a função 'INI_WriteInt' é então chamada e começa a escrever os dados no arquivo do usuário. O udb_hash geraria um código hash a partir do texto de entrada do jogador (o que você digitou). E depois que tudo isso for concluído, ele é fechado por 'INI_Close'
Quando terminar, você será solicitado a acessar a caixa de diálogo 'Login'.Em 'DIALOG_LOGIN', se a resposta for falsa (você clicou em 'SAIR), você será expulso. Se as informações corretas forem fornecidas (senha fornecida), a função INI_Parsefile fará a varredura e carregará os dados do seu player.Etapa XI Não se esqueça, você precisaria de uma maneira de salvar essas variáveis. O retorno de chamada OnPlayerDisconnect simplesmente abre novamente os arquivos, grava quaisquer valores que foram armazenados e, em seguida, fecha-o.Código de peão: public OnPlayerDisconnect ( playerid, motivo ) { new INI : File = INI_Open ( UserPath ( playerid ) ) ; INI_SetTag ( Arquivo, "dados" ) ; INI_WriteInt ( File, "Cash" , GetPlayerMoney ( playerid ) ) ; INI_WriteInt ( Arquivo, "Admin" , PlayerInfo [ playerid ] [ pAdmin ] ) ; INI_WriteInt ( Arquivo, "Kills" , PlayerInfo [ playerid ] [ pKills ] ) ; INI_WriteInt ( File, "Deaths" , PlayerInfo [ playerid ] [ pDeaths ] ) ; INI_Close ( Arquivo ) ; return 1 ; }
Etapa XII Finalmente, adicione isso a OnPlayerDeath para agregar valor (es) a mortes e mortes. Código de peão: public OnPlayerDeath ( playerid, killerid, motivo ) { PlayerInfo [ killerid ] [ pKills ] ++ ; PlayerInfo [ playerid ] [ pDeaths ] ++ ; return 1 ; }
Transferências:
Pastebin - http://pastebin.com/
|
0 Comentários