Jump to content
Araştır
  • Diğer seçenekler ...
Sonuçları bul ...
Sonuçları bul ...

PENTAGRAM

Uzaklaştırılmış
  • İçerik sayısı

    451
  • Katılım

  • Son ziyaret

  • Günün Kazananı

    57
  • Puan

    287 [ Bağış Yap ]

İletiler : PENTAGRAM


  1. Alıntı
    Verdiğin gerekçe doğru değil.

    Alıntı
    void func1(std::string str);
    void func1(std::string &str);
    Bu iki fonksiyonun amaçları farklı. Ancak eğer heapte olmayan bir değişkeni bu fonksiyonlara gönderirsen, stl sınıfların move constructorları olduğu için bu fonksiyonlara verilen değişkenler zaten taşınır hiç bir farkları yok.


    Söylediğin senaryo "copy ellision" olarak geçer, eğer func1 fonksiyon çağrısından sonra str kısmına verdiğin parametreye refer etmiyorsan geçerli. Copy ellision c++17 standardına kadar mandatory bir olay değil. Hatta c++17 standardında dahi bazı caseler dışında mandatory değil. Dolayısıyla derleyicinin optimizasyon ayarlarına ve derleyicinin yazdığın pattern'i ne kadar iyi algılayabildiğine kalıyor olay. Özetle; Overload 1'e gelen her stack değişkeni move edilerek geliyor diye bir kaide yok. Bunun yerine rvalue overloadını yazıp değişkeni explicit move ile almak daha mantıklı, eğer ki istenen buysa.


    Alıntı
    Yine aynı şekilde,
    std::string func1(std::string str);
    std::string& func1(std::string &str);

    Bu iki fonksiyondan referance dönen hatalı kullanım zaten. Eğer ki fonksiyon içinde stackte yarratığın değişkenin referansını dönersen explicit olarak move etmezsen zaten undefined behaviour sonucuyla karşılaşırsın.


    Burada en doğru kullanım birincisi eğer ki stackte trim yapılmış obje dönülecekse. Çünkü birincisinde stl sınıfın move constructor ı kopyalama yapmaz, stackteki değişkeni move eder.


    Burada da 2. overloadda referans, alınan parametreye ise bir sıkıntı yok. Builder pattern'ında sıkça kullanılan bir durum. Diğer senaryolarda ise function-local olan variable thread_local veya static olarak declare edilmediyse "reference to temporary" durumuyla karşılaşırsın.

  2. Alıntı

    1299 versionda civciv olan arkadaşın race i değişiyordu sanırım. konu hakkında çok bir bilgim olmasa da 1299 versionundaki race kodunu bulup kendi versionundaki adamın race ini o race e çevirirsen (exede o race için ismin sarı olması sembolün gelmesi gibi şeylerin olduğunu varsayarsak) olur herhalde.
    iyi çalışmalar.

     


    Race değişikliği yok. Civciv olayı sadece player'in sahip olduğu bir flag değerine bakıyor. (bkz. myinfo ve userinfo) Üst versiyonda da hala mevcut bu flag değeri, true olarak gönderdiğiniz vakit karakterin nicki beyazlaşır ve civciv ikonu gözükür. Karakterden beginner(civciv) durumu kaldırılmak istendiğinde de
    state change paketi atılıyor. O state change paketi ile beraber firecracker efekti de otomatik tetikleniyor (civciv patlaması).

     


  3. Alıntı
    Uzun süre sonra gelen bir güncelleme:
    Arkadaşlar bilindiği üzere Knight Online, yaptığı satışlarda (PUS) herhangi bir fatura kesimi yapmıyor ve vergi ödemiyor. Ek olarak nerden baksanız 5-6 yıldır açık olan ve binlerce oyuncusu olan sunucular var ve bu sunucular tekrar tekrar kuruluyor, binlerce telefon numarasına reklam mesajları atıyor. Knight Online clienti ücretsiz kullanımda olduğu için ve sunucu kaynak kodları açık olduğu için bir yaptırım uygulayabileceklerini sanmıyorum ki buna girişirlerse kendileri zarara uğrayacaklardır. Milyonlar cukkalayan bir firma böyle bir ekonomik sıkıntı içersinde devlete nasıl vergi vermez :)


    Mevzubahis firma artık Türkiye tabanlı çalıştığı ve burada resmi olarak bir şirketleri olduğu için yaptıkları satışları vergilendirmek durumundalar, aksi taktirde maliye tepelerine biner. Client ücretsiz, fakat atladığın bir nokta var o da EULA, yani son kullanıcı lisans sözleşmesi. Accept deyip geçtiğiniz bu sözleşmede, istemci üzerine herhangi bir tersine mühendislik tekniği uygulamayacağınıza dair sözleşme imzalıyorsunuz bir nevi. Türkiye'de bilişime dair sözleşmelerin tam anlamıyla anlaşılamamasından ötürü gereği yerine getirilemiyor hukuki merciler tarafından. Sunucu kaynak kodları da açık değil bu arada, mgame'ye ait leak edilen 1098 kaynak kodları, malezya ko'dan ve sohu'dan leak edilen server dosyaları ve veritabanı üzerinde mgame hak sahibi olduğundan ötürü bu dosyaları kullanan, reverse engineer edip paylaşan, üzerine anti hile sistemi yazan, hatta bunu pazarlayan (bkz: soacs) aslen hukuki olarak suç içerisinde. İşin özeti, Türkiye'deki bilişim hukukunun yeterince olgunlaşmamış olmasından ötürü herkes bu kadar rahat at koşturabiliyor. Aksi taktirde işler şuan olduğundan daha zor olurdu.
    • Beğen 1

  4. Alıntı

    İyi akşamlar herkese, kütük savaşını başlattıktan bir şey dışında her şey normal çalışıyor o da savaşa almıyor beni zonechange komutuyla gidince her şey akışında işliyor close komutuda çalışıyor ama bir türlü normal giriş sağlayamıyorum çözüm önerilerinizi bekliyorum.

     


    İçeri almıyordan kastın, lunar gate'den giremiyorsan EVENT tablosunu kontrol et. Alakalı savaş zone'si için teleport eventi tanımlanmamış olabilir.

     


  5. Alıntı

    Merhabalar arkadaşlar ufak bir sorunum var.
    Party içerisinde bulunan adama townda dahi olsa kutudan item aldığında gidiyor.
    Bu mesafe olayını nasıl ayarlayabiliriz?

     


    CUser::GetLootUser fonksiyonuna mesafe kontrolünü ekleyebilirsin. Düşen kutunun koordinatları _LOOT_BUNDLE içerisine aktarılıyor.

     

     

    
    struct _LOOT_BUNDLE
    {
    	uint32 nBundleID;
    	std::vector<_LOOT_ITEM> Items;
    	float x, z, y;// kutunun düştüğü konum
    	time_t tDropTime;
    };
    



    Fonksiyonun imzası şu şekilde;

     

     

     

    CUser * CUser::GetLootUser(_LOOT_BUNDLE * pBundle, _LOOT_ITEM * pItem)
    

     



    İlerleyen kısımlarda isInParty ile başlayan kısıma şöyle bir düzeltme yapabilirsin;

     

     

     

     

    // If we're dealing with items:
    	//	- if we're in a party: 
    	//		distribute the item to the next player in the party in round-robin fashion, 
    	//		whilst ensuring that user can actually hold the item.
    	//  - if not in a party: 
    	//		simply ensure that we can hold the item.
    	if (isInParty())
    	{
    
             for(int i = 0; i < 8; i++){
             auto pMember = GetItemRoutingUser(pItem->nItemID, pItem->sCount);
             if(pMember == nullptr || !pMember->isInRange(pBundle->x, pBundle->z, RANGE_50M))
                   continue;
    		// This ensures the user can hold the item.
    		return pMember;
             }
             return nullptr; // herkes uzakta, veya yakında olanların envanterleri dolu.
    	}
    
    
    
    
    

     



    Yukarıdaki kodu kafadan taslak olarak yazdım, daha optimize bir şekilde yazılabilir.
    Buradaki GetItemRoutingUser, partideki sıradan çekilen, eşyanın gideceği kullanıcı.

    Kolay gelsin.

     

    • Teşekkür 2

  6. Alıntı

    Bos vaktim oldukca c++ ogreniyorum

    Simdi calsslarda biraz takildim kitaptan ilerliyorum
    Set , get ve kurucu fonksioynu sade bir dille acikliyacak varmi acaba
    Birde explicit kurucu fonksiyonunu ekleyince isler karisiyor sade bi sekilde anlata bilcek varmi
    Simdiden tesekkurler

     


    Farz edelim ki şu şekilde farazi bir class'ımız olsun.

     

     

     

     

    class musteri{
    public:
    musteri(std::string isim, std::string soyisim, int yas){
    	_isim = isim;
    	_soyisim = soyisim;
    	_yas = yas;
    }
    private:
    	std::string _isim;
    	std::string _soyisim;
    	int _yas;	
    };
    

     



    3 adet private, yani dışarıdan erişilemez değişkene sahip (_isim, _soyisim, _yas). Bu değişkenleri private yapmamızın sebebi, encapsulation, yani kapsülleme'dir. Sınıfın kendi içerisinde kullanacağı, dışarıdan kontrolsüz müdahale edilmesini istemediğimiz değişkenleri bu şekilde private olarak tanımlarız. Fakat biz, bu değişkenlere kısmi olarak erişim sağlamak isteyebiliriz, örneğin dışarıdan okunabilmesini, fakat değiştirilememesini isteyebiliriz. Değişkenimizi public yaparsak, hem okumaya hem yazmaya müsade etmiş oluruz, private yaparsak da dışarıdan okumayı da yazmayı da engellemiş oluruz. Get ve set methodları tam bu noktada devreye giriyor. _isim, _soyisim, _yas değişkenlerine sadece okuma erişimi sağlamak istiyorsak;

     

     

     

     

    class musteri{
    public:
    musteri(std::string isim, std::string soyisim, int yas){
    	_isim = isim;
    	_soyisim = soyisim;
    	_yas = yas;
    }
    
    
    	std::string & getIsim() { return _isim; }
    	std::string & getSoyisim(){ return _soyisim;}
    	int getYas() { return _yas;}
     private:
    	std::string _isim;
    	std::string _soyisim;
    	int _yas;	
    };
    
    

     



    public olarak 3 tane yeni fonksiyon tanımladık. Bu fonksiyonlar, private olan değişkenlerin değerlerini döndürüyor. Bu sayede ben müşteri sınıfından bir obje yarattığımda;

     

     

     

     

    int main(void){
    musteri ahmet("ahmet", "zurnaoglu", 45);
    
    printf("musteri : %s, %s, %d
    ", ahmet.getIsim().c_str(), ahmet.getSoyisim().c_str(), ahmet.getYas()); // derlenir, fonksiyonlar public.
    // ekrana musteri : ahmet zurnaoglu 45 yazar.
    
    
    ahmet._isim = "mehmett"; // derlenmez, değişken private.
    std::string si = ahmet._soyisim; // derlenmez, değişken private.
    }
    
    

     



    Aynı mantık ile, set fonksiyonları da, private olan değişkenleri dışarıdan değiştirebilmemize olanak tanıyor, ve ayrıca atanacak olan değerlere göre işlem yapabilmemize de olanak sağlıyor. Örneğin, müşteri'nin yaş değeri minimum 18, maksimum 70 olsun istiyoruz. Başka bir değer atanamasın istiyoruz. Veya, müşteri adı mehmet olamasın istiyoruz. O halde şu şekilde bir set methodu yazabiliriz;

     

     

     

     

    class musteri{
    public:
    musteri(std::string isim, std::string soyisim, int yas){
    	_isim = isim;
    	_soyisim = soyisim;
    	_yas = yas;
    }
    
            bool setIsim(std::string deger){
            if(deger.compare("mehmet") == 0)
            	return false;
            _isim = deger;
            return true;
            }
    
    
            bool setYas(int deger) {
            if(deger < 18 || deger > 70)
                return false;
             _yas = deger;
             return true;
            }
    	std::string & getIsim() { return _isim; }
    	std::string & getSoyisim(){ return _soyisim;}
    	int getYas() { return _yas;}
     private:
    	std::string _isim;
    	std::string _soyisim;
    	int _yas;	
    };
    
    

     



    Örneklendirecek olursak;

     

     

     

     

     

     

    int main(void){
    musteri ahmet("ahmet", "zurnaoglu", 45);
    
    printf("musteri : %s, %s, %d
    ", ahmet.getIsim().c_str(), ahmet.getSoyisim().c_str(), ahmet.getYas()); // derlenir, fonksiyonlar public.
    // ekrana musteri : ahmet zurnaoglu 45 yazar.
    
    ahmet.setIsim("mehmet");
    ahmet.setYas(71);
    printf("musteri : %s, %s, %d
    ", ahmet.getIsim().c_str(), ahmet.getSoyisim().c_str(), ahmet.getYas()); // derlenir, fonksiyonlar public.
    // ekrana musteri : ahmet zurnaoglu 45 yazar.
    
    ahmet.setIsim("fevzi");
    ahmet.setYas(55);
    
    printf("musteri : %s, %s, %d
    ", ahmet.getIsim().c_str(), ahmet.getSoyisim().c_str(), ahmet.getYas()); // derlenir, fonksiyonlar public.
    // ekrana musteri : fevzi zurnaoglu 55 yazar.
    
    }
    
    

     

     



    Son olarak, 'explicit' mevzusuna gelelim. Elimizde şöyle bir sınıf olduğunu varsayalım;

     

     

     

     

     

    class deneme {
    public:
        deneme(int n); 
        deneme(const char *p); 
    };

     



    İlk yaratıcı fonksiyon, deneme objesi için n kadar yer ayırmaya yarıyor, 2. yaratıcı fonksiyon ise deneme objesini p değeri ile hazırlıyor.

     

     

     

     

    int main(void){
    deneme z = 'c';
    }
    

     



    Yukarıdaki kod bloğunda amacımız 2. yaratıcı fonksiyonu çağırıp objeye 'c' değerini atamak. Fakat derleyici, girmiş olduğumuz char değerini derleme esnasında int'e implicit olarak cast ederek 1. yaratıcı fonksiyonu çağırır. Böyle durumları engellemek adına, derleyicinin 1. yaratıcı fonksiyonu için cast etmemesini sağlamak için;

     

     

     

     

    class deneme {
    public:
        explicit deneme(int n); 
        deneme(const char *p); 
    };

     



    'explicit' etiketini ekliyoruz. Bu sayede derleyiciye : 'bu yaratıcı fonksiyon yalnızca ve yalnızca int alabilir. int'e dönüşebilecek türleri, otomatik olarak dönüştürme.' demiş oluruz. Yukarıdaki örneği tekrarlayacak olursak, bu sefer 2. yaratıcı fonksiyonun çağrıldığını gözlemleyebiliriz.


    Umarım yardımcı olabilmişimdir, kolay gelsin.

     

    • Teşekkür 4

  7. Selam dostlar tekrardan, ilginiz çok memnun etti beni. Böyle donanımlı arkadaşlarla karşılaşacağımı umuyor ama pek tahmin etmiyordum :) Bu yüzden biraz yüzeysel bir mesaj yazmıştım ama su an heyecanlandım gerçekten.



    Öncelikle Game Server, AI, Ebenezer ve Login server'ın aynı thread üzerinden çalışmasını kastetmemiştim, ayrı assemblyler halinde ama aynı process tarafından yürütülen, dolayısıyla memory'i paylaşan -ve bu sayede serialization, deserialization kayıplarını/gecikmelerini yok eden- bir sistem düşünmüştüm. Tabii ki login server'ı ayırabiliriz gibi duruyor, sonuçta sürekli bir iletişimi yok diğerleri ile.

    ORM'den bahsetmemin sebebi tamamen hızlı ilerlemek idi, sürekli db işlemleri yapmayız diye düşündüğüm için böyle bir öneri sundum. Ancak belirtmem lazım, oturup leak olan source'u detaylı incelemedim. Dolayısı ile farazi konuşuyorum yani.

    Micro service mimarisi ile ilerlemek de mantıklı ancak bence günümüzdeki cihazlarla bu proje için ayrı sunucular ve bunlar arasında iletişim kurmak çok da gerekli değil. Tek sunucu üzerinde çok rahat koşturulabilir diye düşünüyorum. Tabii ki docker ile deploy etmek falan işin fantezisi ama mükemmel olur tabii ki :)

    Zaten oturup grup halinde kod yazacaksak baya git kullanarak branching ve PR ile falan çalışmamız lazım. Birbirimizin kodunu review etmemiz lazım. Bunları bol bol tartışırız tabii ki, beni çok memnun eder :)

    NetCore'un socket performansı hakkında bir makale: https://www.ageofascent.com/2016/02/18/asp-net-core-exeeds-1-15-million-requests-12-6-gbps/

    Hakikaten native yazılmış bir C++ performansı beklememek gerekir, sonuçta bazı overheadler var ancak ben göz ardı edilebileceğini düşünüyorum. Maintain etmesi çok çok kolay olacağından ve .net core'un sınırlarını zorlamak istediğimden ötürü böyle bir düşünce oluşmuştu bende :)

    @ PENTAGRAM, tarafından da böyle bir bilgi gelmiş. Dostum sıfırdan mı girişmiştiniz sunucu tarafına, yoksa twostars'ın paylaştığının üzerine mi kurdunuz? Client için geliştirme yapmak da çok güzel olur ama şu an arkadaşların gazı ile ben sunucu yazma olayına bayağı bir kanım kaynadı. Ona da destek verebiliriz, en azından şahsi olarak destek verebilirim.

    Bu arada sizi mi kıracağız Open Source yapmayız bu kadar ağız yandıysa :)

    Projenin tabanı twostars'ın open source paylaşmış olduğu proje, fakat şu anki halinin uzaktan yakından alakası yok diyebilirim, üzerine çok fazla kod girişi oldu. Bu kaynak kodlarından branchleyip 1299'a uyarlamıştım. Sonrasında 1453 ve 1534 takip etti geliştirme sürecini. Şu an v22xx desteği üzerinde çalışıyorum, diğer versiyonlara tam destek hala devam ediyor. Hatta şu anki altyapı, runtime esnasında versiyon değiştirmeye ve aynı anda farklı sürüm istemcilerin bir arada oynayabilmesine olanak tanıyor. Gameserver/aiserver performans açısından birleşik vaziyette.

    Loginserver / Gameserver olayına gelecek olursak, aralarında çok fazla irtibat gereken bir durum yok (oyundaki oyuncuyu disconnect etme özelliği hariç). Bizim projemizde de şu anda ayrı durumdalar.

    Sunucu tarafı ile alakalı bir proje benim için tekerleği baştan icat etmek olacağından çok sıcak bakmıyorum, fakat destek verebilirim vaktim oldukça.

  8. Open source olmamak kaydıyla böyle bir oluşumu desteklerim. Şu anda @ OzkanOzdemir ile beraber hali hazırda yürüttüğümüz bir proje mevcut. Sunucu tarafı bitti sayılır, üzerine çalışılacak çok bir kısmı kaldığını düşünmüyorum. Dosyalar 4 yıllık aktif geliştirme geçmişi olan, stabilitesi ve performansı yüksek dosyalar. Anlatılacak çok şeyi var, planlama aşamasında izah ederim yeri geldiğinde. 2013'ten beri geliştirmesini ben üstleniyorum. Veritabanı motorunu postgresql'e geçirmek gibi planlarım var fakat henüz öncelik sıralamamda alt sıralarda. Amaç günün sonunda cross-platform desteği de sağlamak.

    Projenin istemci tarafına başlamayı düşünüyoruz, eğer isterseniz istemci üzerinde beraber çalışabiliriz.

    Projeyi bootstrap etmek adına yazdığım homegrown kütüphaneler ile hızlı bir development sürecine başlayabiliriz. İstemci tarafında gerçekleştirmek istediğim, high-level design'ı kafamda oturmuş bir çok konsept var. Bunları hep beraber tartışıp faz 1 için hedeflerimizi belirleyip işe koyulabiliriz.

    Şahsi fikrim, .net core veya diğer high-level geliştirme ortamları, real time performans gerektiren bu tür uygulamalarda optimizasyona çok müsait değil. Mesele bir uygulamanın 7-8k bağlantıyı kabul edebilmesi değil. Bu bağlantılardan gelen trafiğin boyutu, sıklığı ve verileri handle eden fonksiyonların kompleksiteleri, harcadıkları cpu cycle'ları önemli. Low level detayları programcıdan soyutlayan .net,java ailesi dillerde native performansı yakalamak çok mümkün değil.

    İstemci tarafında bu açıdan biraz daha rahat olacağımızı düşünüyorum, "right tool for the job" konsepti ile rahatlıkla ilerleyebiliriz.

    @ sharkdeed, @ trcod3r

    Skype adresim imzamda mevcut. Eklerseniz daha detaylı tartışabiliriz.


  9. Alıntı
    Merhaba Değerli Arkadaşlar Aşağıdaki premium servisine Disconnect(); ekledikten sonra gemserver donmaya başladı yardımcı olabilirseniz sevinirim teşekkürler

    void CUser::GivePremium(uint8 bPremiumType, uint16 sPremiumTime)
    {

    m_bAccountStatus = 1;
    _PREMIUM_TYPE * pPremium = new _PREMIUM_TYPE;
    _PREMIUM_TYPE * nPremium = PremiumList.GetData(bPremiumType);

    pPremium->PremiumTime = sPremiumTime * 24;
    pPremium->PremiumType = bPremiumType;

    if (nPremium == nullptr)
    PremiumList.PutData(pPremium->PremiumType,pPremium);
    else
    nPremium->PremiumTime += sPremiumTime * 24;

    if (PremiumID == 0)
    PremiumID = bPremiumType;

    g_DBAgent.SavePremiumServiceUser(this, pPremium);
    SendPremiumInfo();
    Disconnect();

    }


    Oyuncuyu disconnect etmene gerek yok. Premium paketini yeniden göndermen yeterli şu koşulda.

  10. Alıntı
    Merhaba arkadaslar, forum icin bi önerim olucak.
    Mesela Genel paylaşımlar kategorisi adı altinda dünya kadar alt kategori var;
    -1298 paylaşım
    -1300+ paylaşım
    -1453 paylaşım
    -1534 paylaşım
    -170p paylaşım
    -1800-1900 paylaşım
    -2000 paylaşım
    Her versiyonu kolaylık olsun diye ayırmışsıniz ama bazi kullanicilar icin gercekten cok karisik geliyor. Şu sekilde bisi yapilabilir diye düşündüm;
    1453 ve alti paylasim
    1453+ paylasim gibi daha az alt kategori ve bu kategorilerin icinde konu başlıklarının yaninda versiyon ismi yazilabilir. (konu açarken hangi versiyon ise onu zorunlu olarak secilecek) ornek göstermek isterdim ama suan telden yaziyorum.
    Bu tamamen benim düşüncem siz nasil uygun gorureniz ona kabuluz :)


    Merhabalar,

    Forumları yeniden kategorize etmek planlarımız arasında var, şu anda 'Client paylaşımları' forumunu benzer şekilde kategorize ettik. Aynı uygulamayı diğer forumlar için de sağlayacağız, fakat arama motorları tarafından endekslenen sayfaların, kategori değişikliğine adaptasyonunu sağlamak adına bunu zamana yayarak yapıyoruz.

    İlginiz, alakanız ve öneriniz için KODevelopers yönetimi olarak teşekkür eder, iyi forumlar dileriz.
    • Teşekkür 1

  11. Alıntı
    Merhaba,
    Foruma üye olduktan sonra gösterilen şablona uygun olarak yazmıştım fakat üyeliğim yetersiz bilgi olduğundan dolayı onaylanmamış düzenleme işlemi de yapamiyorum o yüzden buradan yazıyorum. Düzenleme ya da yeni bir konu hakkı elde ettiğimde konuyu da bu doğrultuda düzenleyeceğim.

    Adım Sefa Kılıç. 94 Temmuz doğumluyum. Doğma büyüme Ankaralıyım. Üniversite öğrencisiyim Bilgisayar Mühendisliği okuyorum. Üniversite hayatıma Ankara'da Yazılım Mühendisliği bölümünde başladım fakat bazı nedenlerden dolayı şuan Karabük'de Bilgisayar Mühendisliği bölümünde eğitim hayatıma devam ediyorum. 2005 yazında Knight Online serüvenim başladı yaklaşık 2010 yılına kadar aktif olarak usko oyuncusu olarak devam ettirdim. 2010 yılında private server dünyasına girdim. O zamanki bilgilerimle bir kaç yıl server adminliği tecrübem oldu. Daha sonra ara verip ara ara bu zamana kadar uskoya girip upgrade yöntemleri denedim. Yaklaşık bir aydır tekrar private serverlarda oynamaya başladım fakat hem kendimi programlama dillerinde geliştirmek hem de zevk almak amacıyla bir kaç şey ararken bu siteye rastladım ve üye olmak istedim. Umarım hedeflerime ulaşabilirim burdaki tecrübelerden faydalanarak.


    @ darknesshero, tekrardan sağlamış olduğunuz bilgiler doğrultusunda üyeliğiniz onaylanmıştır.
×
×
  • Yeni Oluştur...