GTAMulti.com - Türkiye'nin Türkçe GTA Sitesi

Easy-SQLite Kayıt Sistem - Dialoglu

Başlatan Levi, 01 Haziran 2017, 15:34:14

« önceki - sonraki »

0 Üye ve 3 Ziyaretçi konuyu incelemekte.

Levi

Easy SQLite Kayıt Sistemi



Ne Yapacağız?

Bu anlatım boyunca database dosyası ile oyuncu verilerinin nasıl kaydını yapacağınızı göstereceğim.


Easy-Sqlite Nedir?

Easy-Sqlite, a_sampdb includesinin sorgularının daha basite indirgenmiş halidir.
a_sampdb.inc olmadan çalışmaz.
ThePhoenix tarafından yapılmıştır.



Aşama I

Modun başına include tanıtımını yapın.
#include <easy-sqlite>


Aşama II

Sıra geldi dialogları tanıtmaya.

#define DIALOG_GIRIS 0
#define DIALOG_KAYIT 1



Aşama III

Verileri kayıt altına almak için enum kullanacağız.
enum pInfo
{
    ID, // Oyuncunun veritabanındaki ID'si
    Nick[24], // Oyuncunun nicki ( Değeri maksimum karakter 24 olsun )
    Sifre[64], // Oyuncunun şifresi
    Skor, // Oyuncunun skoru
    GirisDurumu // Oyuncunun giriş yapıp yapmadığını kontrol eder.
};
new UserInfo[MAX_PLAYERS][pInfo];



Aşama IV

Veritabanı bağlantısını yapacağız. Bunun için OnGameModeInit publicine geliyoruz
SL::Connect("kayitsistemi.db"); // Eğer database dosyası yok ise kendisi oluşturur.


Aşama V

Veritabanında 'Oyuncular' adında bir tablo oluşturacağız ve kayıt edilmesini istediğimiz verilerin sütunlarını ekleyeceğiz.
if(!SL::ExistsTable("Oyuncular")) // Eğer 'Oyuncular' adında bir tablo yoksa
    {
        new handle = SL::Open(SL::CREATE, "Oyuncular");
SL::AddTableEntry(handle, "ID", SL_TYPE_INT, 11, true);
        SL::AddTableEntry(handle, "Nick", SL_TYPE_VCHAR, 24);
        SL::AddTableEntry(handle, "Sifre", SL_TYPE_VCHAR, 64);
        SL::AddTableEntry(handle, "Skor", SL_TYPE_INT);
        SL::Close(handle);
print("'Oyuncular' adlı tablo başarıyla oluşturuldu.");
    }
else // Eğer 'Oyuncular' tablo varsa
{
print("'Oyuncular' adlı tablo başarıyla yüklendi.");
}



Aşama VI

Oyuncunun nickini çekmek için küçük bir stock oluşturalım.

stock GetName(playerid)
{
new name[24];
GetPlayerName(playerid,name,24);
return name;
}



Aşama VII

Oyuncu sunucuya bağlandığında çıkacak olan giriş ve kayıt dialoglarını oluşturalım. Bunun için OnPlayerConnect publicine geliyoruz verdiğim kodları ekleyin.
if(SL::RowExistsEx("Oyuncular", "Nick", GetName(playerid))) // Eğer girilen nick veritabanında kayıtlı ise giriş dialogu çıkacaktır.
    {
        new handle = SL::OpenEx(SL::READ, "Oyuncular", "Nick", GetName(playerid));
        SL::ReadString(handle, "Sifre", UserInfo[playerid][Sifre], 64);
        SL::ReadInt(handle, "ID", UserInfo[playerid][ID]);
        SL::Close(handle);
        ShowPlayerDialog(playerid, DIALOG_GIRIS, DIALOG_STYLE_Sifre, "{0080FF}Giriş", "Giriş yapmak için aşağıya şifreni gir.", "Giriş", "Ayrıl");
    }
    else // Eğer girilen nick veritabanında kayıtlı değil ise kayıt dialogu çıkacaktır.
    {
        ShowPlayerDialog(playerid, DIALOG_KAYIT, DIALOG_STYLE_Sifre, "{0080FF}Kayıt", "Kayıt olmak için aşağıya bir şifre gir.", "Kaydol", "Ayrıl");
    }



Aşama VIII

Dialog penceresine şifre girildikten sonra olacaklar. OnDialogResponse publicine gelip verdiğim kodları ekliyoruz.
switch(dialogid)
    {
        case DIALOG_KAYIT:
        {
            if(!response) return Kick(playerid);
            if(strlen(inputtext) < 5) // 5 karakterden az şifre girilirse
            {
                ShowPlayerDialog(playerid, DIALOG_KAYIT, DIALOG_STYLE_Sifre, "{0080FF}Kayıt", "Kayıt olmak için aşağıya bir şifre gir.\n{FF0000}Hata: {FFFFFF}Girdiğiniz şifre 5 karakterden az olamaz.", "Kayıt", "Ayrıl");
                return 1;
            }
            SHA256_PassHash(inputtext, "", UserInfo[playerid][Sifre], 64);
            new handle = SL::Open(SL::INSERT, "Oyuncular");
SL::ToggleAutoIncrement(handle, true);
            SL::WriteString(handle, "Nick", GetName(playerid));
            SL::WriteString(handle, "Sifre", UserInfo[playerid][Sifre]);
            SL::WriteInt(handle, "Skor", 0);
            UserInfo[playerid][ID] = SL::Close(handle); 
            SendClientMessage(playerid, -1, "Başarıyla kayıt oldun.");
            UserInfo[playerid][GirisDurumu] = 1;
        }
        case DIALOG_GIRIS:
        {
            if(!response) Kick(playerid); 
            new hash[64];
            SHA256_PassHash(inputtext, "", hash, 64);
            if(!strcmp(hash, UserInfo[playerid][Sifre]))
            { 
                new handle = SL::Open(SL::READ, "Oyuncular", "ID", UserInfo[playerid][ID]);
                SL::ReadInt(handle, "Skor", UserInfo[playerid][Skor]);
                SL::Close(handle);
                SetPlayerSkor(playerid, UserInfo[playerid][Skor]);
                UserInfo[playerid][GirisDurumu] = 1;
            }
            else  // Şifre yanlış girilirse
            {
                ShowPlayerDialog(playerid, DIALOG_GIRIS, DIALOG_STYLE_Sifre, "{0080FF}Giriş", "Giriş yapmak için aşağıya şifreni gir.\n{FF0000}Hata: {FFFFFF}Girdiğiniz şifre yanlış", "Giriş", "Ayrıl");
            }
        }
    }



Aşama IX

Oyuncu sunucudan çıktıktan sonra verilerinin kaydını yapacağız. Bunun için OnPlayerDisconnect publicine geliyoruz.
if(UserInfo[playerid][GirisDurumu] == 1)
    {
        new handle = SL::Open(SL::UPDATE, "Oyuncular", "ID", UserInfo[playerid][ID]);
        SL::WriteInt(handle, "Skor", GetPlayerScore(playerid));
        SL::Close(handle);
    }



Aşama X

Son olarak verilerin yüklenmesinde karışıklık olmasın diye oyuncu giriş yaptığında bütün verileri sıfırlayacağız. OnPlayerConnect publicine gelip en üste ekleyin.UserInfo[playerid][GirisDurumu] = 0;
UserInfo[playerid][Skor] = 0;




Not 1: Kodlarda ufak tefek hatalar olabilir. İnsanlık hali gözden kaçan şeyler de olabilir. Böyle bir şey gözünüze çarparsa lütfen konu altından bildirin.

Not 2: Bütün kodlara ulaşmak isteyen arkadaşlar buradan bütün kodlara ulaşabilir.

Not 3: Birşeyler anlatma konusunda pek iyi değilimdir. O yüzden anlamadığınız yerleri sorabilirsiniz. Elimden geldiğince cevaplamaya çalışırım.
Son düzenlenme: 01 Haziran 2017, 18:58:59 REFRACTIx
"I'm the best damn thing that your eyes have ever seen."

olaf09_


Marshmello


Zoxy

Başarılı bir konu olmuş, eline sağlık.


Drake


Excision

Eline sağlık kardeşim.
Ayrıca GirisDurum değişkenini boolen yapıda kullanırsan daha sağlıklı olur.
Son düzenlenme: 01 Haziran 2017, 17:02:38 Excision

Nithral

Başarılı bir anlatım,konuyu beğendim. +1


LanceX

Aşama IX de GetPlayerSkor yazmışsın.

Eline sağlık.


Leture


Levi

Yorumlarınız için hepinize teşekkür ederim

Alıntı yapılan: SelimBasKaN - 01 Haziran 2017, 16:55:25

Aşama IX de GetPlayerSkor yazmışsın.

Eline sağlık.


Sağolasın düzelttim  :)

"I'm the best damn thing that your eyes have ever seen."

FelleR



QrzR


ace