[TuT] Kako napraviti register sistem ( Dialogs, SQLite i rBits )

Započeo Sergio_Don, Septembar 22, 2011, 11:41:29 PRE PODNE

prethodna tema - sledeća tema

0 članova i 2 gostiju pregledaju ovu temu.

Sergio_Don

Vidio sam da puno ljudi trazi ovaj tutorial al ka niko nije htio napraviti, pa sam ja htio svima vama pomoci editiranje ovog tutoriala!Pozorno pratite!
U ovom tutorialu ce se spremati sljedece:

  • Ime
  • Lozinka
  • IP address
  • Level
  • Novci
  • Admin Level

Pocnimo
Definiramo variable i funkcije
#include                        <a_samp>
#include                        <rBits>

/* ** Colours ** */
#define COL_GREEN               "{6EF83C}" // Zelebna boja
#define COL_RED                 "{F81414}" // Crvena boja
#define COL_BLUE                "{00C0FF}" // Plava boja

/* ** Player Data ** */
new
    Bit1:  g_PlayerLogged       <MAX_PLAYERS>,
    Bit16: g_AdminLevel         <MAX_PLAYERS>,
    DB: Database
;

Trebat cemo sve ovo ispod, pa zaljepite nekamo u skriptu
stock DB_Escape(text[])
{
    new
        ret[80 * 2],
        ch,
        i,
        j;
    while ((ch = text[i++]) && j < sizeof (ret))
    {
        if (ch == '\'')
        {
            if (j < sizeof (ret) - 2)
            {
                ret[j++] = '\'';
                ret[j++] = '\'';
            }
        }
        else if (j < sizeof (ret))
        {
            ret[j++] = ch;
        }
        else
        {
            j++;
        }
    }
    ret[sizeof (ret) - 1] = '\0';
    return ret;
}

Trebat cete ove funkcije da mozete pratiti tutorial
Stvaranje i otvaranje database
public OnFilterScriptInit()
{
    Database = db_open("ServerDatabase.db"); // Ovo ce otvoriti databasu pod imenom , 'ServerDatabase.db'
    //Ako tablica ne postoji, naparvit cemo ju u gamemodu
    db_query(Database, "CREATE TABLE IF NOT EXISTS `USERS` (`NAME`, `PASSWORD`, `IP`, `SCORE`, `CASH`, `ADMINLEVEL`)");
    return 1;
}

Kada ce se server pokrenuti napravit ce databasu sam, procedura je:
Otvaranje database > pisanej u databasu > zatvaranje database
Evo zasto je SQLite zanimljiv, skoro sve radi umjesto vas!
Zato provjerite dal imate ovo u gamemodu
POZOR
Provjerite dal ste zatovirli databasu, ako niste nesto bi moglo poci krivo, zato napravvite ovako
public OnFilterScriptExit()
{
    for(new i; i != MAX_PLAYERS; i++) OnPlayerDisconnect(i, 1);
    db_close(Database);
    return 1;
}

Otvaranje database "rucno"
Da ovo korisitite trebat ce vam SQLite database opener.SQLite Database Browser cu ja koristiti tako da i vama preporucujem, skinete ga tako da u google napisete SQLite Database Browser 2.0 b1 download"
Ako igrac nije ili je registriran
public OnPlayerConnect(playerid)
{
    new
        Query[ 150 ], // napravi Query
        DBResult: Result, // Napravi database Result
        name[ MAX_PLAYER_NAME ] //napravi a name string
    ;
    GetPlayerName(playerid, name, sizeof(name)); // Dobivanje igracevog imena.
   
    Bit1_Set(g_PlayerLogged, playerid, false); // mi cemo resetirati varijablu na 0 = false.
   
    // sada cemo odabrati od  `USERS` gdje ce naci ime korisnika.
    format(Query, sizeof(Query), "SELECT `NAME` FROM `USERS` WHERE `NAME` = '%s'", DB_Escape(name));
    // ubacit cemo  query u db rezultat. Query ce napraviti sve sta kaze
    Result = db_query(Database, Query);
    // ako su num rows tamo, to znaci da je registiran
    if(db_num_rows(Result))
    {
        // salje dobrodosli poruku
        format(Query, sizeof(Query), "{FFFFFF}Dobrodosli "COL_BLUE"%s(%d){FFFFFF} na server, vi ste registrirani\n\nMolimo vas da se logirate s vasom lozinkom.", name, playerid);
        // Pokazuje dialog (login)
        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "{FFFFFF}Register System", Query, "Login", "Leave");
    }
    else // Else ako nije registiran
    {
        // salje dobrodosli poruku
        format(Query, sizeof(Query), "{FFFFFF}Dobrodosli "COL_BLUE"%s(%d){FFFFFF} na server, vi "COL_RED"niste{FFFFFF} registrirani\n\n napisite vasu lozinku da vas mozemo registrirati.", name, playerid);
        // Pokazuje dialog registriranje
        ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "{FFFFFF}Register System", Query, "Register", "Leave");
    }
    db_free_result(Result);
    return 1;
}

Ovaj dolje kod je povezan s ovim gore, tako da ga morate imati u skripti
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    new
        Query[ 256 ], // Radi array . No lies :X
        DBResult: Result, // Radi database Result
        name[ MAX_PLAYER_NAME ], // Radi name string
        ip[ 16 ] // Radi IP string
    ;
    GetPlayerName(playerid, name, sizeof(name)); // Dobivamo ime igraca
    GetPlayerIp(playerid, ip, sizeof(ip));
   
    if(dialogid == 1) // To je id dialoga koji smo gore dodali
    {
        if(response) // Pokrece se ako je igrac odabrao Login
        {
            // ako unutra naÄ'emo NAME ako lozinka pripada igracevom imenu onda
            format(Query, sizeof(Query), "SELECT * FROM `USERS` WHERE `NAME` = '%s' AND `PASSWORD` = '%s'", DB_Escape(name), DB_Escape(inputtext));
            // sprema ^ sta je u database bazi
            Result = db_query(Database, Query);
            // ako su podaci nadjeni onda korisnik postoji, uradimo ovo dolje
            if(db_num_rows(Result))
            {
                new Field[ 20 ]; //Izrada polja za preuzimanje podataka
                // dobivamo polje "SCORE"'s i stavimo u polje
                db_get_field_assoc(Result, "SCORE", Field, 30);
                // stavljamo igracev Lvl
                SetPlayerScore(playerid, strval(Field));
                // strval pretvara string u broj
                // Sad cemo raditi sve isto za ostalo

                // dobivamo polje "CASH"
                db_get_field_assoc(Result, "CASH", Field, 30);
                // dajemo igracu onoliko novca kolko je imao
                GivePlayerMoney(playerid, strval(Field));

                // dobivamo polje "ADMINLEVEL"
                db_get_field_assoc(Result, "ADMINLEVEL", Field, 30);
                // Stavljamo igracu lvl admina koji je bio
                Bit16_Set(g_AdminLevel, playerid, strval(Field));
                // logiranje
                Bit1_Set(g_PlayerLogged, playerid, true);
                // SSalje poruku
                SendClientMessage(playerid, -1, "Vi ste "COL_GREEN"uspjesno{FFFFFF} logirani! ");
            }
            else // Ako je lozinka krivo napisana
            {
                // salje poruku
                format(Query, sizeof(Query), "{FFFFFF}Dobrodosli "COL_BLUE"%s(%d){FFFFFF} na server, vi ste registirani\n\nLogirajte se s vasom lozinkom.", name, playerid);
                // prikazuje dialog
                ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "{FFFFFF}Register System", Query, "Login", "Leave");
                // Pokazuje igracu da je kriva lozinka
                SendClientMessage(playerid, -1, ""COL_RED"Kriva{FFFFFF} lozinka, pokusaj ponovo!");
            }
            db_free_result(Result);
        }
        else return Kick(playerid); // Kicka igraca ako je odabrao leave
    }
    if(dialogid == 0) // id od dialoga
    {
        if(response) // radi ako je igrac odabrao register
        {
            //provjerava dali je lozinka najmanje duga 3 slova/brojeva
            if(strlen(inputtext) > 24 || strlen(inputtext) < 3)
            {
                // salje poruku
                format(Query, sizeof(Query), "{FFFFFF}Dobrodosli "COL_BLUE"%s(%d){FFFFFF} na server, vi ste "COL_RED"not{FFFFFF} registrirani\n\nNapisite vasu lozinku.", name, playerid);
                // Pokazuje opet dialog
                ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "{FFFFFF}Register System", Query, "Register", "Leave");
                // Pokazuje ako je lozinka najmanje duga 3 slova/brojka
                SendClientMessage(playerid, -1, "Vasa lozinka mora imati najmanje 3 slova/brojka");
            }
            else
            {
                // Ubacuje sve u databasu pri registriranju
                format(Query, sizeof(Query), "INSERT INTO `USERS` (`NAME`, `PASSWORD`, `IP`, `SCORE`, `CASH`, `ADMINLEVEL`) VALUES('%s','%s','%s', '0', '500', '0')", DB_Escape(name), DB_Escape(inputtext), DB_Escape(ip));
                // Querying the formatted Query ^
                db_query(Database, Query);
                // logiranje
                Bit1_Set(g_PlayerLogged, playerid, true);
                GivePlayerMoney(playerid, 500); // Give Player the money.
                // resetira lvl
                SetPlayerScore(playerid, 0);
                // salje poruku
                SendClientMessage(playerid, -1, "Vi ste "COL_GREEN"uspjesno{FFFFFF} registirani! automatski ste registrirani!");
            }
        }
        else return Kick(playerid); // Kicka ako je igrac odabrao leave
    }
    return 1;
}

Posljednji korak, spremanje podataka!
public OnPlayerDisconnect(playerid, reason)
{
    new
        Query[ 200 ],
        name[ MAX_PLAYER_NAME ] // radi name string
    ;
    GetPlayerName(playerid, name, sizeof(name)); // dobivamo ime igraca

    if(Bit1_Get(g_PlayerLogged, playerid) == 1)
    {
        //ovo ce updatovati vase podatke s najnovijim
        format(Query,sizeof(Query),"UPDATE `USERS` SET SCORE = '%d', CASH = '%d', ADMINLEVEL = '%d' WHERE `NAME` = '%s'",
                                                                                        GetPlayerScore(playerid), // Dobivamo LVL igraca
                                                                                        GetPlayerMoney(playerid), // Dobivamo igracev novac
                                                                                        Bit16_Get(g_AdminLevel, playerid), // Dobivamo admin lvl
                                                                                        DB_Escape(name)); // Dobivamo igracevo ime
        db_query(Database, Query);
        // resetirat cemo ovaj array na 0, = false.
        Bit1_Set(g_PlayerLogged, playerid, false);
    }
    return 1;
}

Evo napokon smo gotovi!
Provjerite dal imate sve kao u tutorialu.
Ako ima bugova javite u komentar da popravimo!
Preveo i editirao Don_Sergio
Napravio Lorenc_
Hvala svima na citanju
Poslednja Izmena: April 17, 2012, 14:46:12 POSLE PODNE od joXy_

Sergio_Don



Sergio_Don





Sergio_Don


bravo lep tut
Respect: Gagi, Maki187, Phillips, TerminuS, Neno, Lepotic, [AL] K4[Я]!K3â,,¢, Gotti747

Citat: BloodMaster poslato Septembar 23, 2011, 11:15:16 PRE PODNE
http://balkan-samp.com/forum/index.php?topic=12028.0

Čini mi se da je to isto ovo, samo u ovom Lukšinom ima i za page.

Ovo je SQLlite, a ono MySQL i ovo koristi od Ryder-a rBit's - ono su obicne varijable ili PVarovi (nisam zapamtio)

Nije loše, dobar tutorial :)
Kristijan Stipić


dobar tut
Respect: Gagi, Maki187, Phillips, TerminuS, Neno, Lepotic, [AL] K4[Я]!K3â,,¢, Gotti747

Sergio_Don


Nisam isprobao, ali cini mi se da nece biti, odlican TuT cestitam, na forumu dugo nije bio ovakav.
Last nick: Vectro64

JusT

Dobro je al bilo bi bolje da si FS napravio zbog nekih koji neznaju