[Tutorial] [TUT]Crear sistema de registro usando ShowPlayerDialog.
#1

Hola, hoy les voy a explicar como hacer un sencillo sistema de registro con la nueva funcion de la 0.3 llamada ShowPlayerDialog.

їQue es el ShowPlayerDialog?

El ShowPlayerDialog, es una nueva funcion de la nueva version de SA-MP (0.3.x), el ShowPlayerDialog tiene 2 estilos, el que se usa para los registros en especial que es el DIALOG_STYLE_INPUT y el que se usa a modo de menu, poner un texto, reglas, etc... es el DIALOG_STYLE_OUTPUT(creo que era asi).


Vamos a proceder a crear nuestro sistema de registro usando el ShowPlayerDialog.

Ahora tenemos que definir cada dialog con un numero que queremos (cada dialog significa que como creamos el registro, el fallo de la pass y el login, tenemos que definir 3 dialogs):

pawn Код:
new registro 0
new logueo 1
new fallopass 2
Despues tenemos que definir un estado que identificara si el usuario esta logueado o no:

pawn Код:
new gPlayerLogged[MAX_PLAYER_NAME];
Bien, ahora nos tenemos que dirigir al public OnPlayerRequestClass y ahi agregamos la primera parte de nuestro sistema de registro:

pawn Код:
if(RegistrationStep[playerid] == 0 && gPlayerLogged[playerid] != 1);
{
  ClearChatbox(playerid, 10);
  {
        if (gPlayerAccount[playerid] != 0)
        {
            new jugador[64];
            GetPlayerName(playerid,jugador,sizeof(jugador));
            ShowPlayerDialog(playerid,logueo,DIALOG_STYLE_INPUT,"Loguear",Hola, tu usuario ya existe\n Introduze tu contraseсa para entrar,"Loguear","Salir");
        }
        else
        {
            new jugador[64];
            GetPlayerName(playerid,jugador,sizeof(jugador));
            ShowPlayerDialog(playerid,registro,DIALOG_STYLE_INPUT,"Registro",Hola, no tienes cuenta en el servidor\n Por favor introduze una contraseсa para registrarte,"Registro","Salir");
        }
Ahora Explicare que es cada cosa:

ShowPlayerDialog(playerid, logueo, DIALOG_STYLE_INPUT, "Logueo", "Hola, tu usuario ya existe\n Introduze tu contraseсa para entrar", "Loguearme", "Salir"

-ShowPlayerDialog: Eso esta claro lo que estamos usando
-playerid: tambien esta claro.
-logueo: es la id del dialog que definimos mas arriba que era para recordar "new logueo 1;"
-DIALOG_STYLE_INPUT: El estilo del cuadro del dialog
-Logueo: Lo que nos va a salir arriba del cuadro, se puede cambiar como quieras ej. X Server, inicio de sesion.
"Tu cuenta....\n...": Es el texto que va a salir en el cuadro y para aсadirle un espacio del linea agregamos \n (que significa "new line").
-Loguearme: Es el boton para loguarse.
-Salir: Si pulsas ese boton te sacara del juego.

Ahora vamos al callback public OtherTimer(), y agregamos esto

pawn Код:
if(SafeTime[i] == 1)
            {
                if(gPlayerAccount[i] == 1 && gPlayerLogged[i] == 0)
                {
                  new jugadorlogin[64];
                    new jugador[128];
                    GetPlayerName(playerid,jugadorlogin,64);
                    format(jugador,sizeof(jugador),"Bienvenido, %s\nAhora puede iniciar sesiуn:",jugadorlogin);
                    ShowPlayerDialog(i,logueo,DIALOG_STYLE_INPUT,"Loguear",loginstring,"Loguear","Salir");
                }
            }
Ahora vamos al callback public OnPlayerRegister y agregamos esto al final del public:

pawn Код:
new loginstring[128];
                new loginname[64];
                GetPlayerName(playerid,loginname,sizeof(loginname));
                format(loginstring,sizeof(loginstring),"Bienvenido, %s\nAhora puede iniciar sesiуn:",loginname);
                ShowPlayerDialog(playerid,logueo,DIALOG_STYLE_INPUT,"Loguear",loginstring,"Loguear","Salir");
Ahora vamos al callback public OnPlayerLogin y agregamos esto al final:

pawn Код:
}
        else
        {
          new loginstring[128];
            new loginname[64];
            GetPlayerName(playerid,loginname,sizeof(loginname));
            format(loginstring,sizeof(loginstring),"WRONG PASSWORD \nPor favor introduzca la contraseсa correcta:",loginname);
            ShowPlayerDialog(playerid,fallopass,DIALOG_STYLE_INPUT,"Loguear",loginstring,"Loguear","Salir");
        fclose(UserFile);
        gPlayerLogTries[playerid] += 1;
        if(gPlayerLogTries[playerid] == 4) { Ban(playerid); }
        return 1;
        }
Y por ultimo vamos al callback public OnDialogResponse, si no lo tenemos lo creamos y agregamos esto:

pawn Код:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    new sendername[MAX_PLAYER_NAME];
    new string[128];
    if(response)
    {
        if(dialogid == logueo || dialogid == fallopass)
        {
          if(strlen(inputtext))
          {
                new tmppass[64];
                strmid(tmppass, inputtext, 0, strlen(inputtext), 255);
                Encrypt(tmppass);
                OnPlayerLogin(playerid,tmppass);
            }
            else
            {
                new loginstring[128];
                new loginname[64];
                GetPlayerName(playerid,loginname,sizeof(loginname));
                format(loginstring,sizeof(loginstring),"WRONG PASSWORD \n Por favor introduzca la contraseсa correcta:",loginname);
                ShowPlayerDialog(playerid,fallopass,DIALOG_STYLE_INPUT,"Loguear",loginstring,"Loguear","Salir");
                gPlayerLogTries[playerid] += 1;
                if(gPlayerLogTries[playerid] == 4) { Ban(playerid); }
            }
        }
        if(dialogid == registro)
        {
          if(strlen(inputtext))
          {
                GetPlayerName(playerid, sendername, sizeof(sendername));
                format(string, sizeof(string), "users/%s.ini", sendername);
                new File: hFile = fopen(string, io_read);
                if (hFile)
                {
                    SendClientMessage(playerid, COLOR_YELLOW, "Nombre de usuario que ya estб ocupado, por favor, elija uno diferente.");
                    fclose(hFile);
                    return 1;
                }
                new tmppass[64];
                strmid(tmppass, inputtext, 0, strlen(inputtext), 255);
                Encrypt(tmppass);
                OnPlayerRegister(playerid,tmppass);
            }
            else
            {
                new regstring[128];
                new regname[64];
                GetPlayerName(playerid,regname,sizeof(regname));
                format(regstring,sizeof(regstring),"Bienvenido, %s\nNo tienes una cuenta.\nPor favor regнstrese:",regname);
                ShowPlayerDialog(playerid,registro,DIALOG_STYLE_INPUT,"Registrar",regstring,"Registrar","Salir");
            }
        }
    }
    else
    {
        Kick(playerid);
    }
        return 1;
  }
Si seguimos correctamente estos pasos tiene que funcionar ala perfecciуn, si les sale algun warning de "loose identification" eso significa que algo no esta bien alineado en el GM para no andar buscando y crearte quebraderos de cabeza vamos arriba de nuestro GM y debajo de "#include <a_samp>" agregamos esto:

pawn Код:
#pragma tabsize 0
Si teneis algun fallo con este sistema preguntarlo en este post y os ayudare a solucionarlo.

Creditos:

-DoJi(Yo)
Reply
#2

Esto ya esta posteado :S
Reply
#3

Me parece Doble post >O

salu2
Reply
#4

mnm no se pero bueno... Esta bien explicado.
Reply
#5

Y en donde se almacenan los datos de los jugadores registrados?
Reply
#6

fijate en OnDialogResponse
Reply
#7

Hola man, una pregunta, yo tengo un sistema de registro pero con comando, necesito saber como pasarlo a dialogo, nose como hacer se me complica
Reply
#8

Nada mбs y nada menos que 18 Errores + 8 Warnings...! Un record! Jajaja.
Te paso los fallos a ver si me puedes ayudar. Ok?
Код:
(259) : error 001: expected token: ";", but found "-integer value-"
(260) : error 001: expected token: ";", but found "-integer value-"
(261) : error 001: expected token: ";", but found "-integer value-"
(409) : error 021: symbol already defined: "gPlayerLogged"
(4443) : error 010: invalid function or declaration
(4446) : error 055: start of function body without function header
(4447) : error 010: invalid function or declaration
(4450) : error 021: symbol already defined: "GetPlayerName"
(4453) : error 010: invalid function or declaration
(4455) : error 021: symbol already defined: "jugador"
(4672) : error 017: undefined symbol "i"
(4675) : warning 219: local variable "jugador" shadows a variable at a preceding level
(4676) : error 017: undefined symbol "playerid"
(4678) : error 017: undefined symbol "i"
(8636) : warning 219: local variable "loginstring" shadows a variable at a preceding level
(8637) : warning 219: local variable "loginname" shadows a variable at a preceding level
(9093) : error 054: unmatched closing brace ("}")
(9094) : error 010: invalid function or declaration
(9098) : error 021: symbol already defined: "GetPlayerName"
(9103) : error 010: invalid function or declaration
(9104) : error 010: invalid function or declaration
(9142) : warning 219: local variable "loginstring" shadows a variable at a preceding level
(9143) : warning 219: local variable "loginname" shadows a variable at a preceding level
(27696) : warning 235: public function lacks forward declaration (symbol "OnPlayerPrivmsg")
(27744) : warning 203: symbol is never used: "jugador"
(27744) : warning 203: symbol is never used: "loginname"
Pawn compiler 3.2.3664	 	 	Copyright © 1997-2006, ITB CompuPhase


18 Errors.
Reply
#9

Quote:
Originally Posted by Extremaydura
Nada mбs y nada menos que 18 Errores + 8 Warnings...! Un record! Jajaja.
Te paso los fallos a ver si me puedes ayudar. Ok?
Код:
(259) : error 001: expected token: ";", but found "-integer value-"
(260) : error 001: expected token: ";", but found "-integer value-"
(261) : error 001: expected token: ";", but found "-integer value-"
(409) : error 021: symbol already defined: "gPlayerLogged"
(4443) : error 010: invalid function or declaration
(4446) : error 055: start of function body without function header
(4447) : error 010: invalid function or declaration
(4450) : error 021: symbol already defined: "GetPlayerName"
(4453) : error 010: invalid function or declaration
(4455) : error 021: symbol already defined: "jugador"
(4672) : error 017: undefined symbol "i"
(4675) : warning 219: local variable "jugador" shadows a variable at a preceding level
(4676) : error 017: undefined symbol "playerid"
(4678) : error 017: undefined symbol "i"
(8636) : warning 219: local variable "loginstring" shadows a variable at a preceding level
(8637) : warning 219: local variable "loginname" shadows a variable at a preceding level
(9093) : error 054: unmatched closing brace ("}")
(9094) : error 010: invalid function or declaration
(9098) : error 021: symbol already defined: "GetPlayerName"
(9103) : error 010: invalid function or declaration
(9104) : error 010: invalid function or declaration
(9142) : warning 219: local variable "loginstring" shadows a variable at a preceding level
(9143) : warning 219: local variable "loginname" shadows a variable at a preceding level
(27696) : warning 235: public function lacks forward declaration (symbol "OnPlayerPrivmsg")
(27744) : warning 203: symbol is never used: "jugador"
(27744) : warning 203: symbol is never used: "loginname"
Pawn compiler 3.2.3664	 	 	Copyright © 1997-2006, ITB CompuPhase


18 Errors.
No es ningun record una vez tube 164 errores y 1240 warnings en un gm todo hecho mal xD

Con respecto a esto

borra el callback onplaterprivmsg

tenes que definir "i"

Reply
#10

Quote:
Originally Posted by xenowort
Посмотреть сообщение
No es ningun record una vez tube 164 errores y 1240 warnings en un gm todo hecho mal xD

Con respecto a esto

borra el callback onplaterprivmsg

tenes que definir "i"
Exageraste un poco... 1240 lineas con warnings? naaa. Ademas 164 errores? ._.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)