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

İşyeri Sistemi Temeli Yapımı

Başlatan Submarine, 21 Aralık 2019, 20:24:32

« önceki - sonraki »

0 Üye ve 1 Ziyaretçi konuyu incelemekte.

Submarine

    Herkese merhaba GTAMulti ailesi yine ben Submarine .Sizlere daha önce Payday Sistemi'nin temelini anlatmıştım.Şimdi ise anlatacağım sistemi bir tık daha arttırıp işyeri sisteminin  temelinin yapımını sizlere anlatacağım.İyi okumalar dilerim , umarım diğer öğrenecek arkadaşlara bir yararım dokunur.

    İlk olarak kullandığımız kütüphaneleri belirtelim


    PAWN Kodu: Seç
    #include <a_samp>
    #include <zcmd>
    #include <foreach>
    #include <streamer>
    #include <sscanf2>

    Kütüphanelerimizi yazdıktan sonra oluşturabileceğimiz maksimum işyeri için bir define yani tanım yazıyoruz.

    PAWN Kodu: Seç
    #define MAX_ISYERI (50)
    Burada sunucuda oluşturulabilecek maksimum işyeri miktarını 50 olarak belirledik.İsterseniz bunu 100 , 1000 ve 10000 yapabilirsiniz.Ama şuan 50 kafi bizim için.

    Şimdi işyerimizin verilerini tutacak değişkenleri yazalım.İlk olarak işyerimizin sayısını verecek olan Iterator değişkenini yazalım.Iterator yapısını kullanabilmeniz için foreach kütüphanesini edinmelisiniz.Iterator yapısını detaylıca @Radless hocam anlattığı için ben anlatmayacağım, sadece yüzeysel geçeceğim.


    Not : Bir Iterator değişkeni oluşturabilmeniz için Iterator tagını kullanmalısınız yoksa Tag Mismatch hatası alırsınız !

    PAWN Kodu: Seç
    new Iterator:IsyeriSayi<MAX_ISYERI>;
    Şeklinde değişkeni oluşturuyoruz.Daha sonra işyerimizin diğer verilerini tutacak değişkenleri oluşturuyoruz.
    Değişkenleri bir araya toplamak ve MAX_ISYERI üzerinde kullanmak için bir enum oluşturuyoruz


    PAWN Kodu: Seç
    enum IsyeriVeri
    {
    IsyeriAdi[120],
    Float:IsyeriPos[4],
    Text3D:IsyeriLabel,
    IsyeriPickUp,
    IsyeriTur,
    IsyeriFiyat,
    IsyeriSatilikMi
    }

    Normalde daha fazla değişken koymamız lazımdı sahibidir oyuncunun işyeri interiorunda olup olmadığını kontrol ettirmek işyeri ücreti falan fistan bunları siz yapabilirsiniz ben size temelini anlatıyorum.Şimdi koyduğumuz değişkenleri bir anlatalım.IsyeriAdi , işyerinizin adıdır.IsyeriPos ise işyerinizin koordinatlarını içermektedir.Float eklememizin sebebi de koordinatlar üzerinde işlem yapmaktır.Float eklemez isek oyuncunun posunu çekerken Tag Mismatch hatası alırız.Bu yüzden koordinat işlemlerinizde mutlaka Float tagı kullanın başta.İşyerimizin oluşturulmasından sonra eklenecek label yani yazı değişkeni de Text3D tagı ile yapılır.Labelları streamer kütüphanesi ile yapıyoruz çünkü SA:MP ' in bize sunmuş olduğu label sınırından ötürü streamer kütüphanesi bize daha fazla pickup ve label oluşturmamıza olanak sağlayan kütüphanedendir.IsyeriPickUp ise işyerimizi gösterecek pickupı oluşturup sileceğiz.IsyeriTur ise işyerimizin türünün ne olduğunu gösterecek bize.Değişken 1 döndürdüğü zaman Elektronik 2 döndürdüğü zaman Giyim 3 döndürdüğü zaman Restoran tarzında bir yapı oluşturacağız.IsyeriFiyat ise anlaşıldığı gibi de işyerimizin fiyatını tutacaktır.
    IsyeriSatilikMi değişkeni ise bir işyerinin satılık olup olmadığını gösterecek.Eğer 1 döndürüyorsa satılık , 0 döndürüyorsa satılık değildir.

    Şimdi soracaksınız Submarine hocam bu enumdaki değişkenleri nasıl kullanacağız diye.Hemen kullanabileceğimiz enum değişkenini yazalım



    PAWN Kodu: Seç
    new iVeri[MAX_ISYERI][IsyeriVeri];
    Artık enum üzerindeki değişkenleri kullanmaya hazır ve nazırız.

    Bu kadar konuşmak yeter şimdi ilk olarak işyeri oluşturmak için bir komut hazırlayalım.Komut ZCMD veya Pawn.CMD komut istemcisi ile yapıyoruz.Parametre işlemlerimizi ise sscanf kütüphanesi ve plugini ile kolayca yapabiliriz.

    PAWN Kodu: Seç
    CMD:createbiz(playerid,params[])
    {
    new fiyat,tur;
    if(!IsPlayerAdmin(playerid))return SendClientMessage(playerid,-1,"Yetkili değilsiniz  !");
    if (sscanf(params, "dd", fiyat, tur))
    {
      SendClientMessage(playerid,-1, "/isyeriolustur [fiyat] [tur]");
      SendClientMessage(playerid,-1,"[?]: | 1: Market | 2: Bar | 3: Elektronikçi | 4: Restoran | 5: Giyim");
    }
    if (tur < 1 || tur > 5)return SendClientMessage(playerid, -1,"Geçersiz tür belirtilmiş. Tür 1-5 arasında belirlenmelidir..");
    IsyeriOlustur(playerid,fiyat,tur);
    return 1;
    }

    Komutumuzdaki mantık şu bizim komutumuza 2 tane değişken tanımladık.Fiyatını ve türünü girdirdik.Eğer oyuncu parametreleri eksik giriyorsa kullanım şeklini ve hangi rakamı girerse hangi tür işyeri oluşturacağını mesajla bildirdik.Eğer oyuncu 1 - 5 arasında giriş yapmadıysa yani 5 ten büyük 1 den küçük bir veri girdiyse oyuncuya bir mesaj gönderecektir.IsyeriOlustur fonksiyonunun parametrelerini giriyoruz.Playerid parametresi , fiyat parametremizi ve tür parametremizi fonksiyonumuza tanımladık.Komutun kullanımından sonra OnCommandPerformed çalışmaması ve hata mesajı vermemesi için komutu 1 olarak döndürüyoruz.

    Bilgi : Fonksiyonda kullandığımız playerid parametresi oyuncunun posunu çekebilmemiz için kullandık.Kullanmasaydık hata alabiliriz.

    Şimdi geldi sıra fonksiyonumuzu yapmaya.

    PAWN Kodu: Seç
    stock IsyeriOlustur(playerid,ucret,tur)
    {
    New id,str[150],Float:pos[4];
    id = Iter_Free(IsyeriSayi);
    GetPlayerPos(playerid,pos[0],pos[1],pos[2]);
    iVeri[id][IsyeriTur] = tur;
    iVeri[id][IsyeriFiyat] = fiyat;
    iVeri[id][IsyeriSatilikMi] = 1;
    if(tur == 1)
    {
    format(str,sizeof(str),"[ID : %d]\n[Tür : Market]\n[Fiyat : %s]\nBu dükkan satılıktır.Satın almak için /isyerisatinal yazmalısınız !",id,convertNumber(fiyat));
    iVeri[id][IsyeriPickUp] = CreateDynamicPickup(1274, 23,pos[0],pos[1],pos][2]);
    iVeri[id][IsyeriLabel] = CreateDynamic3DTextLabel(str,-1,pos[0],pos[1],pos[2],15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID);
    }
    if(tur == 2)
    {
    format(str,sizeof(str),"[ID : %d]\n[Tür : Bar]\n[Fiyat : %s]\nBu dükkan satılıktır.Satın almak için /isyerisatinal yazmalısınız !",id,convertNumber(fiyat));
    iVeri[id][IsyeriPickUp] = CreateDynamicPickup(1274, 23,pos[0],pos[1],pos][2]);
    iVeri[id][IsyeriLabel] = CreateDynamic3DTextLabel(str,-1,pos[0],pos[1],pos[2],15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID);

    }
    if(tur == 3)
    {
    format(str,sizeof(str),"[ID : %d]\n[Tür : Market]\n[Fiyat : %s]\nBu dükkan satılıktır.Satın almak için /isyerisatinal yazmalısınız !",id,convertNumber(fiyat));
    iVeri[id][IsyeriPickUp] = CreateDynamicPickup(1274, 23,pos[0],pos[1],pos][2]);
    iVeri[id][IsyeriLabel] = CreateDynamic3DTextLabel(str,-1,pos[0],pos[1],pos[2],15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID);

    }
    if(tur == 4)
    {
    format(str,sizeof(str),"[ID : %d]\n[Tür : Elektronikçi]\n[Fiyat : %s]\nBu dükkan satılıktır.Satın almak için /isyerisatinal yazmalısınız !",id,convertNumber(fiyat));
    iVeri[id][IsyeriPickUp] = CreateDynamicPickup(1274, 23,pos[0],pos[1],pos][2]);
    iVeri[id][IsyeriLabel] = CreateDynamic3DTextLabel(str,-1,pos[0],pos[1],pos[2],15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID);
    }
    if(tur == 5)
    {
    format(str,sizeof(str),"[ID : %d]\n[Tür : Giyim]\n[Fiyat : %s]\nBu dükkan satılıktır.Satın almak için /isyerisatinal yazmalısınız !",id,convertNumber(fiyat));
    iVeri[id][IsyeriPickUp] = CreateDynamicPickup(1274, 23,pos[0],pos[1],pos][2]);
    iVeri[id][IsyeriLabel] = CreateDynamic3DTextLabel(str,-1,pos[0],pos[1],pos[2],15.0,INVALID_PLAYER_ID,INVALID_VEHICLE_ID);
    }
    new olusturuldu[120];
    format(olusturuldu,sizeof(olusturuldu),"%d ID'li işyeri oluşturuldu",id);
    SendClientMessage(playerid,-1,olusturuldu);
    Iter_Add(IsyeriSayi,id);
    return 1;
    }
    Fonksiyon üzerindeki mantık fiyatı girdikten sonra tür rakamı parametresine ne yazılırsa 1-5 e kadar olan koşullardan girilen sayıdaki koşul çalışır.Mesela 1 girdik ve bize market olduğunu gösteren bir label ekledi.Siz MySQL veritabanını ayarlayabilirsiniz.Şimdi ben R40  - R41 için yaparım ayrı bir konu ama bazı arkadaşların mysql sürümleri farklı olabilir.Bu yüzden yüklemeyi ve kaydetmeyi yapmayacağım.ID alırken ise iterator değişkenimiz ile boş sayı varmı onu kontrol ettiriyoruz Iter_Free ile daha sonra labeli pickupı ekledikten sorna Iter_Add ile işyerimizi ekliyoruz.

    Ek olarak fiyatlarda sayıyı ayırmak için convertValue fonksiyonunu da ekliyorum ki sistemi eklerken hata almayın.

    PAWN Kodu: Seç
    stock convertNumber(value)
    {
    // https://forum.sa-mp.com/showthread.php?p=843781#post843781
        new string[24];
        format(string, sizeof(string), "%d", value);

        for(new i = (strlen(string) - 3); i > (value < 0 ? 1 : 0) ; i -= 3)
        {
            strins(string[i], ",", 0);
        }

        return string;
    }

    Oluşturma kısmı bu kadarlıktı.Okuduğunuz için teşekkürler , konuya eklemeler yapılacaktır.Hatam veya eksiklerim olur ise aşağıya yazmanız yeterlidir düzeltirim.[/list][/list]
    Son düzenlenme: 22 Aralık 2019, 20:33:29 Submarine

    Endornot

      İf(!IsPlayerAdmin(playerid))return SendClientMessage(playerid,-1,"Yetkili değilsiniz  !");Burada i harfi büyük galiba , bazı kod blokları arasında [/li][/list] tarzında metinler var , strins fonksiyonu tanımlı değil kısaca görevi ve işlevi hakkında bilgi verebilirmisin :S Anlatım için teşekkürler.


      Submarine

      Alıntı yapılan: Endornot - 21 Aralık 2019, 23:08:07
        İf(!IsPlayerAdmin(playerid))return SendClientMessage(playerid,-1,"Yetkili değilsiniz  !");Burada i harfi büyük galiba , bazı kod blokları arasında [/li]
      tarzında metinler var , strins fonksiyonu tanımlı değil kısaca görevi ve işlevi hakkında bilgi verebilirmisin :S Anlatım için teşekkürler.
      Hocam i lerin büyük olma sebebi ben bu konuyu hazırlarken direk buraya yazmıyorum Word sayfası açıyorum oraya yazıyorum buraya atıyorum word baş harfleri büyük yaptığı için öyle.Normalde if her zaman küçük i ile başlar.List kısmı foruma ekleyince oldu.Strins ise bende bir sıkıntı çıkartmıyor.Strins hakkında bir bilgim yok çünkü bendeki convert value alıntı.Yani bende 4 x 4 lük bir pawn coder sayılmam.List yazan kısımlar silindive büyük i küçük i ye çevrildi.Strins bildiğim kadarı ile a_samp ile beraber geliyor.
      Son düzenlenme: 21 Aralık 2019, 23:41:27 Submarine

      Radless

      Alıntı yapılan: Endornot - 21 Aralık 2019, 23:08:07
        İf(!IsPlayerAdmin(playerid))return SendClientMessage(playerid,-1,"Yetkili değilsiniz  !");Burada i harfi büyük galiba , bazı kod blokları arasında [/li][/list] tarzında metinler var , strins fonksiyonu tanımlı değil kısaca görevi ve işlevi hakkında bilgi verebilirmisin :S Anlatım için teşekkürler.
        strins fonksiyonu zaten var default olarak.

        https://wiki.sa-mp.com/wiki/Strins
        Son düzenlenme: 22 Aralık 2019, 00:20:06 Radless
        "Life's too short to hold grudges."

        mortale

        Kodlari tam olarak incelemedim ama gozume
        PAWN Kodu: Seç
        iVeri[id[blabla] hatasi carpti. (tek hata olsa keske)

        Kod duzeni & isleyis & performansi acisindan cok yetersiz. Isyerleri de herhangi bir yere kayit edilmiyor, isyerleri duzenlenemiyor vs cok eksik.

        Konuda Yalikent Instagram hesabina donmus.
        Son düzenlenme: 22 Aralık 2019, 16:32:50 Renard

        Submarine

        Alıntı yapılan: Renard - 22 Aralık 2019, 16:30:49
        Kodlari tam olarak incelemedim ama gozume
        PAWN Kodu: Seç
        iVeri[id[blabla] hatasi carpti. (tek hata olsa keske)

        Kod duzeni & isleyis & performansi acisindan cok yetersiz. Isyerleri de herhangi bir yere kayit edilmiyor, isyerleri duzenlenemiyor vs cok eksik.

        Konuda Yalikent Instagram hesabina donmus.

        Galiba konunun başlığını okumadınız ? Temel diyoruz temel.Temel deyince sizin aklınızda ne uyanıyor acaba ? Ayrıca konuda kayıt etme ve yükleme kısmı geçiyor isterseniz aşağıya atayım.

        Alıntı yapılan: Submarine
        Siz MySQL veritabanını ayarlayabilirsiniz.Şimdi ben R40 - R41 için yaparım ayrı bir konu ama bazı arkadaşların mysql sürümleri farklı olabilir.Bu yüzden yüklemeyi ve kaydetmeyi yapmayacağım.

        Ayrıca biliyorsanız buyrun kendiniz yapın konuya daha fazla çamur atmadan boş yapmadan sayfayı kapatın sistem kasıyor.

        Edit : Eksiklik var demişsiniz ama ben ekleme yapacağımı da konunun sonunda belirttim.Konuyu dikkatli okuyup konuya çamur atmasaydınız belki görürdünüz.

        Alıntı yapılan: Submarine
        Oluşturma kısmı bu kadarlıktı. Okuduğunuz için teşekkürler , konuya eklemeler yapılacaktır.Hatam veya eksiklerim olur ise aşağıya yazmanız yeterlidir düzeltirim.
        Son düzenlenme: 22 Aralık 2019, 20:36:24 Submarine

        Rosnex

        Sistemden anlıyorsun güzel, eline sağlık.


        Submarine

        Alıntı yapılan: #Norpes - 02 Nisan 2020, 14:30:44
        Sistemden anlıyorsun güzel, eline sağlık.
        Teşekkürler işinize yaraması dileği ile :)
        Sistemleri olabildiğince yapmaya çalışıyorum öğrenmeye çabalıyorum.


        kelly

        Detaylıca anlatmışsın, eline sağlık.

        I want everything

        Submarine

        Alıntı yapılan: kelly - 07 Nisan 2020, 19:59:59
        Detaylıca anlatmışsın, eline sağlık.
        Teşekkürler , elimin geldiğince anlatmaya çalıştım baktım herkes x modu kurulumu , y modu mysql bağlantısı yapmayı vip sistemi yapmayı falan anlatmışlar bunu hakaret olarak söylemiyorum sadece benimki farklılık olsun diye böyle birşey kafamda tasarlayıp anlattım.


        sharax


        Gladiator


        Impeccable


        doqu10

        Öncelikle sistem için teşekkürler.
        Ama bu şekilde oluşturduğumda üzerine yazdırdığımız yazı 1 saniyelik gözüküyor ve sonra kayboluyor yazılar. Bunu nasıl çözebilirim?


        beratmethe

        Sistem İçin Teşekkürler Eline Sağlık ;)