[Tutorial] Cуmo crear un sistema de registro con Dini
#1

[Tutorial] Cуmo crear un sistema de registro con Dini



Hola, les enseсarй cуmo crear un sistema de registro con Dini, este podrб guardar Asesinatos, Muertes, Logins, Puntaje, etc...


_________________________________________________


1) Primero necesitaremos los includes Dini 1.6, Dudb 2.4 y Dutils 1.10




2) Ahora vamos arriba de todo de nuestro script, donde estбn los includes y agregamos los includes Dini y Dudb:

pawn Код:
#include <a_samp>
#include <dini>
#include <dudb>

#pragma unused ret_mempcy
Explicaciуn: Los includes son los archivos que tienen las funciones que usaremos, la funcion ret_memcpy como no es usada ni en los includes ni en nuestro tutorial, le pusimos el #pragma para que no de una advertencia.




3) Ahora debajo de los includes agregamos esto:

pawn Код:
new IsLogged[MAX_PLAYERS];
new IsRegistered[MAX_PLAYERS];

enum pInfo
{
    pAdmin,
    pKills,
    pDeaths,
    pLogins
}

new PlayerInfo[MAX_PLAYERS][pInfo];
Explicaciуn:
El enum junto con el PlayerInfo funcionan como un contador de lo que especifican. Ej: PlayerInfo[killerid][pKills] ++;
Los IsLogged e IsRegistered son para hacer restricciones. Ej: if(IsLogged) ...





4) Ahora nos situaremos en OnPlayerConnect y agregaremos esto:
pawn Код:
public OnPlayerConnect(playerid)
{
    IsLogged[playerid] = 0;
    IsRegistered[playerid] = 0;

    new Nombre[MAX_PLAYERS];
    new file[MAX_PLAYERS];
    GetPlayerName(playerid, Nombre, sizeof(Nombre));
    format(file, sizeof(file), "%s.ini", Nombre);

    if(fexist(file)) { IsRegistered[playerid] = 1; }

    if(IsRegistered[playerid] == 0)
    {
    SendClientMessage(playerid, 0xFFFFFFFF, "Cuenta sin registrar, por favor registrate: /Registrar [Contraseсa]");
    }
    else
    {
    SendClientMessage(playerid, 0xFFFFFFFF, "Cuenta registrada, por favor identificate: /Sesion [Contraseсa]");
    }
    return 1;
}
Explicaciуn:
Al principio indicamos que cuando el player se conecta, el no estб registrado ni logeado.
En lo siguiente especificamos que file es igual a NombreDelPlayer.ini para poder checkear si su cuenta existe.
Luego al final se checkea si el player estб registrado, luego envia el mensaje correspondiente.




5) Ahora nos situaremos en OnPlayerDisconnect y agregaremos esto:
pawn Код:
public OnPlayerDisconnect(playerid)
{
    new Nombre[MAX_PLAYERS];
    new file[MAX_PLAYERS];
    GetPlayerName(playerid, Nombre, sizeof(Nombre));
    format(file, sizeof(file), "%s.ini", Nombre);

    if(IsLogged[playerid] == 1)
    {
    dini_IntSet(file, "Admin", PlayerInfo[playerid][pAdmin]);
    dini_IntSet(file, "Kills", PlayerInfo[playerid][pKills]);
    dini_IntSet(file, "Deaths", PlayerInfo[playerid][pDeaths]);
    dini_IntSet(file, "Logins", PlayerInfo[playerid][pLogins]);
    }
    return 1;
}
Explicaciуn:
Al principio especificamos que file es igual a NombreDelJugador.Ini
Luego checkea si esta logeado, si lo estб guarda los datos del jugador en el archivo Ini
dini_IntSet(file, "Admin", PlayerInfo[playerid][pAdmin]); (modifica el archivo "file", cambiando el valor de "admin" por el nivel del player)




6) Ahora iremos a OnPlayerDeath y agregaremos esto:
pawn Код:
public OnPlayerDeath(playerid, killerid, reason)
{
    PlayerInfo[playerid][pDeaths] ++;
    PlayerInfo[killerid][pKills] ++;
    return 1;
}
Explicaciуn:
Esto obviamente suma 1 asesinato al asesino y suma 1 muerte a la victima.




7) Ahora iremos a OnPlayerCommandText y crearemos los comandos de registro y de login:
pawn Код:
public OnPlayerCommandText(playerid, cmdtext[])
{
    new cmd[256];
    new idx;
    cmd = strtok(cmdtext, idx);

    if(strcmp(cmd, "/Registrar", true) == 0)
    {
        new tmp[256];
        new Nombre[MAX_PLAYERS];
        new String[100];
        new file[MAX_PLAYERS];
        GetPlayerName(playerid, Nombre, sizeof(Nombre));
        tmp = strtok(cmdtext, idx);
        format(file, sizeof(file), "%s.ini", Nombre);

        if(!strlen(tmp))
        {
            SendClientMessage(playerid, 0xFFFFFFFF, "Use: /Registrar [Contraseсa]");
            return 1;
        }

        if(!fexist(file))
        {
            dini_Create(file);
            dini_IntSet(file, "Password", udb_hash(tmp));
            dini_IntSet(file, "Admin", 0);
            dini_IntSet(file, "Kills", 0);
            dini_IntSet(file, "Deaths", 0);
            dini_IntSet(file, "Logins", 1);
            PlayerInfo[playerid][pAdmin] = dini_Int(file, "Admin");
            PlayerInfo[playerid][pKills] = dini_Int(file, "Kills");
            PlayerInfo[playerid][pDeaths] = dini_Int(file, "Deaths");
            PlayerInfo[playerid][pLogins] = dini_Int(file, "Logins");
            format(String, sizeof(file), "Cuenta creada exitosamente! %s - ''%s''", Nombre, tmp);
            SendClientMessage(playerid, 0xFFFFFFFF, String);
            SendClientMessage(playerid, 0xFFFFFFFF, "Has sido identificado automбticamente");
            IsLogged[playerid] = 1;
        }
        else
        {
            SendClientMessage(playerid, 0xFFFFFFFF, "Error: La cuenta ya estб registrada");
        }

        return 1;
    }


    if(strcmp(cmd, "/Sesion", true) == 0)
    {
        new tmp[256];
        new tmp2[256];
        new Nombre[MAX_PLAYERS];
        new file[MAX_PLAYERS];
        GetPlayerName(playerid, Nombre, sizeof(Nombre));
        format(file, sizeof(file), "%s.ini", Nombre);
        tmp = strtok(cmdtext, idx);
        tmp2 = dini_Get(file, "Password");

        if(!strlen(tmp))
        {
            SendClientMessage(playerid, 0xFFFFFFFF, "Use: /Sesion [Contraseсa]");
            return 1;
        }

        if(IsLogged[playerid] == 1)
        {
            SendClientMessage(playerid, COLOR_VERDE, "Tъ ya estбs identificado!");
            return 1;
        }
        else
        {
        if(fexist(file))
        {
            if(udb_hash(tmp) == strval(tmp2))
            {
                IsLogged[playerid] = 1;
                PlayerInfo[playerid][pAdmin] = dini_Int(file, "Admin");
                PlayerInfo[playerid][pKills] = dini_Int(file, "Kills");
                PlayerInfo[playerid][pDeaths] = dini_Int(file, "Deaths");
                PlayerInfo[playerid][pLogins] = dini_Int(file, "Logins");
                PlayerInfo[playerid][pLogins] ++;
                SendClientMessage(playerid, COLOR_VERDE, "Te has identificado exitosamente.");
            }
        }
        }
        return 1;
    }


    if (strcmp("/Cuenta", cmdtext, true, 10) == 0)
    {
        new Nombre[MAX_PLAYERS];
        new String[100];
        GetPlayerName(playerid, Nombre, sizeof(Nombre));

        format(String, sizeof(String), "%s Estadisticas:", Nombre);
        SendClientMessage(playerid, 0xFFFFFFFF, String);
        format(String, sizeof(String), "Asesinatos: %d - Muertes: %d - Radio: %0.2f - Logins: %d", PlayerInfo[playerid][pKills], PlayerInfo[playerid][pDeaths], Float:PlayerInfo[playerid][pKills]/PlayerInfo[playerid][pDeaths], PlayerInfo[playerid][pLogins]);
        SendClientMessage(playerid, 0xFFFFFFFF, String);
        return 1;
    }

    return 0;
}
Explicaciуn:
Esos son los comandos, el registro crea un archivo Ini, donde adentro asigna los valores Deaths, Kills, Admin, Logins y Contraseсa.
El login checkea si la contraseсa indicada es igual a la de la cuenta, de ser correcto, hace que los datos del player (PlayerInfo[Playerid][Dato]) sean iguales a los del archivo ini.
Y el comando de cuenta, muestra las estadнsticas.




8 ) Explicaciуn:
Las cuentas que se registren se guardarбn en "scriptfiles" y de nombre tendrбn: NickDelJugador.Ini
Los comando que creamos son /Registrar /Sesion /Cuenta

Bueno este fuй mi primer post, cualquier duda me dicen!
Reply
#2

No se por que pero este post me diу mucha risa, me suena a copiar y pegar :P. Explica mejor...

їQue es esto?
pawn Код:
dini_IntSet(file, "Admin", PlayerInfo[playerid][pAdmin]);
Reply
#3

Quote:
Originally Posted by SAWC™
No se por que pero este post me diу mucha risa, me suena a copiar y pegar :P. Explica mejor...

їQue es esto?
pawn Код:
dini_IntSet(file, "Admin", PlayerInfo[playerid][pAdmin]);
hiciste lo mismo :P.
Reply
#4

No, no fue copiar y pegar, hace ya bastante que aprendн a hacer los sistemas de registros...

Quote:
Originally Posted by SAWC™
No se por que pero este post me diу mucha risa, me suena a copiar y pegar :P. Explica mejor...

їQue es esto?
pawn Код:
dini_IntSet(file, "Admin", PlayerInfo[playerid][pAdmin]);
Eso es para que se guarde en un archivo .Ini el nivel admin del player...

PD: Luego le agregarй explicaciones debajo de cada paso.
Reply
#5

Quote:
Originally Posted by Infierno
Quote:
Originally Posted by SAWC™
No se por que pero este post me diу mucha risa, me suena a copiar y pegar :P. Explica mejor...

їQue es esto?
pawn Код:
dini_IntSet(file, "Admin", PlayerInfo[playerid][pAdmin]);
hiciste lo mismo :P.
jajajajaja suerte que yo soy un simple lammer
Reply
#6

No entiendo una cosa, tio podrias acerlo 1 poco mas completo?
esque v eras ponen /sesion [pass] la ponen Invalida
y No dice nada, Almenos podrias Poner "Contraseсa Invalida"
Si me Puedes ayudar te estare agradecido
Reply
#7

Quote:
Originally Posted by pooooolo
No entiendo una cosa, tio podrias acerlo 1 poco mas completo?
esque v eras ponen /sesion [pass] la ponen Invalida
y No dice nada, Almenos podrias Poner "Contraseсa Invalida"
Si me Puedes ayudar te estare agradecido
pawn Код:
if(strcmp(cmd, "/Sesion", true) == 0)
    {
        new tmp[256];
        new tmp2[256];
        new Nombre[MAX_PLAYERS];
        new file[MAX_PLAYERS];
        GetPlayerName(playerid, Nombre, sizeof(Nombre));
        format(file, sizeof(file), "%s.ini", Nombre);
        tmp = strtok(cmdtext, idx);
        tmp2 = dini_Get(file, "Password");

        if(!strlen(tmp))
        {
            SendClientMessage(playerid, 0xFFFFFFFF, "Use: /Sesion [Contraseсa]");
            return 1;
        }

        if(IsLogged[playerid] == 1)
        {
            SendClientMessage(playerid, COLOR_VERDE, "Tъ ya estбs identificado!");
            return 1;
        }
        else
        {
        if(fexist(file))
        {
            if(udb_hash(tmp) == strval(tmp2))
            {
                IsLogged[playerid] = 1;
                PlayerInfo[playerid][pAdmin] = dini_Int(file, "Admin");
                PlayerInfo[playerid][pKills] = dini_Int(file, "Kills");
                PlayerInfo[playerid][pDeaths] = dini_Int(file, "Deaths");
                PlayerInfo[playerid][pLogins] = dini_Int(file, "Logins");
                PlayerInfo[playerid][pLogins] ++;
                SendClientMessage(playerid, COLOR_VERDE, "Te has identificado exitosamente.");
            }
            else
            {
                SendClientMessage(playerid, COLOR_VERDE, "Contraseсa invalida");
            }

        }
        }
        return 1;
    }
Ahн estб
Reply
#8

Tampoco era tan difнcil que lo puieras tъ polooooo, siempre agradezco tutoriales y podrнais hacer lo mismo...
Reply
#9

Hola, necesito ayuda, eh querido usar este metodo, pero cuando le tiro a compilar me tira un monton de errores.
No se si estoy haciendo bien, recien soy un novаto en esto de los servers (empeze modificando el lvdm) y en ese gm me da error la copilacion, ayuda.-
[img width=1024 height=576]/imageshack/img18/2773/asdzzc.jpg[/img]
Reply
#10

te falta la funcion "SendPlayerFormattedText"
Reply
#11

Quote:
Originally Posted by Chiri
te falta la funcion "SendPlayerFormattedText"
mira, hay esta ,pero mira lo que dice :S


[img width=1024 height=576]/imageshack/img442/9955/asd2b.jpg[/img]
Reply
#12

Use la funcion "SendClientMessage".
Reply
#13

aja, y con las otras que sale onplayerdissconet y onplayercommand not implemented.
y cmdtext..
O es mejor que haga un gamemode aparte, al de las lvdm?
Reply
#14

Un poco mas de explicacion no vendria mal para los q no saben que hace cada funcion...
Reply
#15

Quote:
Originally Posted by agusfn20
Un poco mas de explicacion no vendria mal para los q no saben que hace cada funcion...
mm.. si necesito ayuda :/
Reply
#16

Muchas gracias por el tutorial, me sirviу y ya lo tengo incluнdo en mi gamemode aunque tengo una duda. їCуmo hago para exбctamente agregar una cantidad determinada de (ejemplo) puntos [score] sin usar el "++" que solo agrega uno?

Muchas gracias.
Facu.
Reply
#17

Hola llevo con el San andreas multiplayer 2 dнas y no se que hay que hacer para lo de la contraseсa invalida. їDonde hay que registrarse? Eso que pone hay es pura programaciуn ademбs de ser lio.
Reply
#18

Quote:
Originally Posted by MrDeath
No, no fue copiar y pegar, hace ya bastante que aprendн a hacer los sistemas de registros...

Quote:
Originally Posted by SAWC™
No se por que pero este post me diу mucha risa, me suena a copiar y pegar :P. Explica mejor...

їQue es esto?
pawn Code:
dini_IntSet(file, "Admin", PlayerInfo[playerid][pAdmin]);
Eso es para que se guarde en un archivo .Ini el nivel admin del player...

PD: Luego le agregarй explicaciones debajo de cada paso.
claro el nivel de admin,pero tiraria error no definistes el nivel de admin,ni los comandos.
esta mal,es mucho mas largo el tuto
Reply
#19

Gracias , por no ayudar (N)
Reply
#20

mejor con esto en los defines de tu script

pawn Code:
new FALSE = false;
#define SendPlayerFormattedText(%0,%1,%2) \
            do{new formatted[MAX_STRING]; format(formatted, sizeof(formatted), %2); SendClientMessage(%0, %1, formatted);}while(FALSE)
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)