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 geliyoruzSL::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 (https://pastebin.com/6TzCBGTv) 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.
Yararlı konu.
Yararlı :helal:
Başarılı bir konu olmuş, eline sağlık.
+1 yararlı
Eline sağlık kardeşim.
Ayrıca GirisDurum değişkenini boolen yapıda kullanırsan daha sağlıklı olur.
Başarılı bir anlatım,konuyu beğendim. +1
Aşama IX de GetPlayerSkor yazmışsın.
Eline sağlık.
Ellerine sağlık.
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 :)
Yararlı.
Teşekkürler.