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

[ANLATIM] Kayıt Sistemi Yapmak (Y_INI)

Başlatan Victory, 17 Ocak 2018, 17:35:20

« önceki - sonraki »

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Victory

Alıntı
Kayıt Sistemi Yapmak (Y_INI)



Merhaba arkadaşlar,

Bugün sizlere, Y_INI kullanarak kayıt sistemi yapmayı anlatacağım. Aslında bakarsak, kayıt sistemi yapmak gayet basit. Ben Y_INI olarak kullanmayı anlatacağım, daha dinamik olduğu için. Şimdi başlıyalım.

İlk olarak, Y_INI indiriyoruz. Buraya tıklayarak indirebilirsiniz. İndirdikten sonra, sunucu dosyalarını açıp, pawno/include dosyasının içine arşivin içindeki dosyaları atıyoruz. Dosyaları aktardıktan sonra, yeni bir pawno sayfası açıyoruz ve Y_INI includemizi tanıyoruz.

#include <YSI \ y_ini>

Daha sonra dialoglarımızı tanıtıyoruz,

enum
{
    DIALOG_KAYIT,
    DIALOG_GIRIS
};


Dialogları tanıttıktan sonra, kayıtlar için bir PATH oluşturuyoruz,

#define PATH "/Oyuncular/%s.ini"

Sıra geldi değişkenlere, değişkenleri enum olarak tanıtıyoruz,

enum pInfo
{
    pPass,
    pCash,
    pAdmin,
    pKills,
    pDeaths
}
new PlayerInfo[MAX_PLAYERS][pInfo];


Değişkenleri tanıttıktan sonra, bir public oluşturuyoruz ve boş bir yere yerleştiriyoruz,

forward LoadUser_data(playerid,name[],value[]);
public LoadUser_data(playerid,name[],value[])
{
INI_Int("Password",PlayerInfo[playerid][pPass]);
INI_Int("Cash",PlayerInfo[playerid][pCash]);
INI_Int("Admin",PlayerInfo[playerid][pAdmin]);
INI_Int("Kills",PlayerInfo[playerid][pKills]);
        INI_Int("Deaths",PlayerInfo[playerid][pDeaths]);
return 1;
}


Bir public yarattık ve yerleştirdik, şimdi ise bir stock oluşturuyoruz,

stock UserPath(playerid)
{
new string[128],playername[MAX_PLAYER_NAME];
GetPlayerName(playerid,playername,sizeof(playername));
format(string,sizeof(string),PATH,playername);
return string;
}


Şifremizin doğrudan gözükmemesi için, bir stock daha oluşturuyoruz şifremizi hashlemek için,

/*Credits to Dracoblue*/
stock udb_hash(buf[]) {
new length=strlen(buf);
    new s1 = 1;
    new s2 = 0;
    new n;
    for (n=0; n<length; n++)
    {
       s1 = (s1 + buf[n]) % 65521;
       s2 = (s2 + s1)     % 65521;
    }
    return (s2 << 16) + s1;
}


Evet şifremizi hashledik, şimdi geldi dialogları yerleştirmeye. OnPlayerConnect publicine gidiyoruz ve kayıt sistemimizin girişte çıkması için, dialogları yerleştiriyoruz,

if(fexist(UserPath(playerid)))
{
INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
   ShowPlayerDialog(playerid, DIALOG_GIRIS, DIALOG_STYLE_PASSWORD,"Giriş Yap","Hoşgeldiniz!\nGiriş yapmak için şifrenizi giriniz.","Giriş","Çıkış");
}
else
{
ShowPlayerDialog(playerid, DIALOG_KAYIT, DIALOG_STYLE_PASSWORD,"Kayıt Ol","Hoşgeldiniz!\nKayıt olmak için aşağıdaki kutucuğa şifrenizi giriniz.","Kayıt Ol","Çıkış");
}


Dialogları yerleştirdikten sonra, OnDialogResponse publicine gidip, dialogları işlevleriyle ekliyoruz,

   switch( dialogid )
    {
        case DIALOG_KAYIT:
        {
            if (!response) return Kick(playerid);
            if(response)
            {
                if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DIALOG_KAYIT, DIALOG_STYLE_PASSWORD, "Kayıt Ol",Hoşgeldiniz!nKayıt olmak için aşağıdaki kutucuğa şifrenizi giriniz.","Kayıt Ol","Çıkış");
                new INI:File = INI_Open(UserPath(playerid));
                INI_SetTag(File,"data");
                INI_WriteInt(File,"Password",udb_hash(inputtext));
                INI_WriteInt(File,"Cash",0);
                INI_WriteInt(File,"Admin",0);
                INI_WriteInt(File,"Kills",0);
                INI_WriteInt(File,"Deaths",0);
                INI_Close(File);

                SpawnPlayer(playerid);
             
}
        }

        case DIALOG_GIRIS:
        {
            if ( !response ) return Kick ( playerid );
            if( response )
            {
                if(udb_hash(inputtext) == PlayerInfo[playerid][pPass])
                {
                    INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);
                    GivePlayerMoney(playerid, PlayerInfo[playerid][pCash]);

                }
                else
                {
                    ShowPlayerDialog(playerid, DIALOG_GIRIS, DIALOG_STYLE_PASSWORD,"Giriş Yap","Hatalı şifre girdiniz.\nGiriş yapmak için şifrenizi giriniz.","Giriş","Çıkış");
                }
                return 1;
            }
        }
    }


Daha sonra OnPlayerDisconnect publicine gidiyoruz, oyuncu çıkarken kayıt alınması için fonksiyonları yerleştiriyoruz,

new INI:File = INI_Open(UserPath(playerid));
INI_SetTag(File,"data");
INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));
INI_WriteInt(File,"Admin",PlayerInfo[playerid][pAdmin]);
INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);
INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);
INI_Close(File);


Fonksiyonları yerleştirdikten sonra, OnPlayerDeath publicine gidiyoruz ve ölüm, öldürmenin kaydedilmesi için fonksiyonları yerleştiriyoruz,

PlayerInfo[killerid][pKills]++;
PlayerInfo[playerid][pDeaths]++;


Kayıtlar scriptfiles/Oyuncular klasörüne çıkacak. scriptfiles dosyasına girip, Oyuncular adında bir klasör açıyoruz. Evet, işte bu kadar. Kayıt sistemimizi başarıyla yaptık. Eğer takıldığınız bir yer olursa, konu altından veya özel mesaj atabilirsiniz. Yardımcı olurum, konudaki eksik bir şey varsa söylerseniz sevinirim, anlatımımın bazı kısımları forum SA-MP'tan alıntıdır. Yardımcı olabildiysem, ne mutlu bana. Kolay gelsin!

Ek olarak;
Alıntı yapılan: ManoFire
Eline sağlık, güzel bir anlatım olmuş. Ancak şöyle bir şey var. Bu sistemi hiç bir değişiklik yapmadan kullanırsanız kodlama hatasının kurbanı olursunuz. Bu sistemde herkes, veritabanında kayıtlı olan bir karakterin şifresini bilmiyor olsa bile karakterin bütün kayıtlı bilgilerini sıfırlayabilir. Örneğin veritabanında "Francesco" isimli bir karakter kayıtlı ve bana ait değil başkasına ait. Ben Francesco ismiyle sunucuya girdiğimde bana şifre soracak, şifreyi bilmiyorum ve ESC'ye basarak sunucudan çıkış yapıyorum. Çıkış yaptığım an OnPlayerDisconnect publici devreye giriyor ve karakterin bilgilerinin YÜKLENMEMİŞ HALİNİ, yani "0" olarak kayıt ediyor. Böylece bütün bilgiler sıfırlanmış oluyor. Bunun önüne geçebilmek için;

Karakter girişi yaptıktan sonra bir değer tanıtıp, bu değeri 1 yapabilirsiniz.

// Modun başına boş bi yere;

new GirisYapti[MAX_PLAYERS];


case DIALOG_GIRIS:

       {

           if ( !response ) return Kick ( playerid );

           if( response )

           {

               if(udb_hash(inputtext) == PlayerInfo[playerid][pPass])

               {

                   INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);

                   GivePlayerMoney(playerid, PlayerInfo[playerid][pCash]);

                   GirisYapti[playerid] = 1; // Buraya bu kodu eklerseniz, karakter şifresi doğru girildiğinde girişyaptı = 1 olur.



               }


Onplayerdisconnect publicini ise böyle değiştirmelisiniz;

if(GirisYapti[playerid] == 1)

{

new INI:File = INI_Open(UserPath(playerid));

INI_SetTag(File,"data");

INI_WriteInt(File,"Cash",GetPlayerMoney(playerid));

INI_WriteInt(File,"Admin",PlayerInfo[playerid][pAdmin]);

INI_WriteInt(File,"Kills",PlayerInfo[playerid][pKills]);

INI_WriteInt(File,"Deaths",PlayerInfo[playerid][pDeaths]);

INI_Close(File);

GirisYapti[playerid] = 0;



}
Son düzenlenme: 17 Ocak 2018, 17:43:03 Victory

pag


laéx


Pablo

Alıntı




Pawnotürk Üyesi 2017-2020

FelleR


FrtdnYLDZ