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

infiltrate

Çalışkan Üye
  • İçerik sayısı

    215
  • Katılım

  • Son ziyaret

  • Günün Kazananı

    1
  • Puan

    9,952 [ Bağış Yap ]

İletiler : infiltrate


  1. İtem/Skill ikonlarını ve TBL dosyalarını okuyabilmem için gerekli olan şifreleri çözme algoritmalarını paylaşabilecek var mıdır?( Kafamda Kingofknigt gibi fakat daha yenilikçi bir proje fikri var. Bu yüzden her patch'de oyun dosyalarını otomatik okumam gerekli.)

    - Ücretli veya proje bazlı ortak olabiliriz.
    - Hayrına paylaşabilirsiniz :)

    Teşekkürler.


  2. Alıntı
    /visible yaptığı zaman StateChange atmak yerine UserInOut olarak Out atmayı dene böylelikle tamamen kaybolur.
    StateChange olarak attığın zaman Client taraflı KO.exe hafızada senin karakterini tutuyor.
    Yani arka planda aslında varsın ama sadece Render etmiyor.
    UserInOut atarsan tamamen hafızadan siler böylelikle karakterin üstündeki effectleri de hafızdan temizleyecektir.

    Ayrıca sistemi bu şekilde yazman gerekiyor ki illegal programlar ile GM karakterinin oyunda olduğunu ve orada olduğunu anlayamasınlar.
    Sen hile yapan kişiyi kontrol etmek için yanına gittiğinde direk illegal programlar ile hile yapan kişi senin aslında orada olduğunu bilir. Dediğim gibi yaparsan bunu da engellemiş olursun.


    Teşekkürler, mantıklı bir yaklaşım.Aslında bu tür ufak tefek sunucu taraflı kontroller ile hileleri önlemek mümkün :) Fakat uzun zamandır düşündüğüm R ile el düşürmeye sunucu taraflı bir çözüm bulamadım:) Bunun hakkındada bir öneriniz var mıdır?:)(Yanlış anlaşılmasın, bu bilgileri kullanarak bir server geliştirmiyorum sadece bu tür fikirer zihnimi açıyor) teşekkürler

  3. Alıntı

    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.

     

     


    explicit keywordunu bilmiyordum 🙂 Teşekkürler

     


  4. şuan gördüğüm kadarıyla problem şu;



    if(command == WIZ_VERSION_CHECK){
    VersionCheck(pkt);
    return true;
    }else{
    .....
    }else if(m_strAccountID.empty())


    bu kısımda else if'den önce else kontrolü var.Bu bir mantık hatası hata vermesi normal:D

    else if ile else nin sırasını değiştirmen gerekli.else if kontrolü daha önce olmalı.

  5. Alıntı
    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.


    OpenGL/DirectX gibi grafik kütüphaneleri hakkında ve oyun programlama süreçleri hakkında hiç bir bilgim yok.Ancak size ayak bağı olurum :D

  6. uint8 nRet = g_DBAgent.NationTransfer(GetAccountName(),nRace[0],nRace[1],nRace[2],nRace[3]);


    büyük ihtimal bu functionun içinde çağırılan sp ACCOUNT_NATION_TRANSFER nRet olarak 1'den farklı bir değer döndürüp

    if (nRet != 1)
    {
    result Send(&result);
    return;
    }

    Buraya sokuyor işlemi.Database içerisindeki ACCOUNT_NATION_TRANSFER'e bakman gerek.Eğer programlama bilgin varsa
    uint8 nRet = g_DBAgent.NationTransfer(GetAccountName(),nRace[0],nRace[1],nRace[2],nRace[3]);

    bu kısıma breakpoint koyarak,step into ile program akışını takip ederek sorunu çözebilirsin.

  7. Transfer edilebilecek karakter yok diyor.Eğer ortalıkdaki sourceleri kullanıyorsan büyük ihtimal fonksiyonun imzası şu şekildedir.

    void CUser::NationChange(Packet & pkt)

    Birde büyük ihtimal SQL SP'si çağırıyordur arkaplanda.
    onunda imzası şu şekildedir.
    int8 CDBAgent::NationTransfer(std::string strAccountID, uint16 Race1, uint16 Race2, uint16 Race3, uint16 Race4)


    if (!dbCommand->Execute(string_format(_T("{? = CALL ACCOUNT_NATION_TRANSFER(?,%d,%d,%d,%d)}"),Race1,Race2,Race3,Race4)))
    ReportSQLError(m_GameDB->GetError());


    Bu kısımdaki ACCOUNT_NATION_TRANSFER Stored Procedure'u ile
    void CUser::NationChange(Packet & pkt)

    Bu fonksiyonu görmeden bir şey demek zor

  8. .net core ile değilde benim kendi yapmak istediğim bir proje vardı.

    Clang-formatter/C++CoreChecker/CMake kullanarak projeyi, işletim sistemi/compiler/build-system bağımsız geliştirmek.

    Bağımlı kütüphane olarak pek bilmesemde sadece BOOST kütüphanesini kullanmak isterim(Threading,Test vs..)

    Yazılan bütün kodların test'inin yazılması, ve gerekirse CI(Continus Integration) ile testlerin otomatik koşturulmasını sağlamak.

    Login sunucusu, Game sunucusu, AI sunucusu ayrı olmasını isterim.Microservis mantığı ile bakacak olursak scale etmemiz daha düzgün olur.

    Projeyi dockerize edip otomatik scale edilmesini sağlarsak daha iyi olur.Örneğin; kullanıcı girişlerinin yoğun olduğu zaman login serveri scale eder.CSW olduğu zaman game serveri vs..

    Clang-formatter kullanırsak eğer kodların yazımında belli bir standart oturtmuş oluruz.

    Proje sadece USKO'daki packetleri/dinleyip sunucuya implemente etme olayından daha çok, optimizasyon/performans, yapay zeka uygulaması, istatistikleri kullanıp bdw,jr,chaos gibi eventlerde match-making, yani kısacası bilgisayar bilimlerinin her alanını kullanmak :)

    Veri tabanı olarak ise PostgreSQL kullanmak isterim.Bu konuda pek tecrübem yok.Sadece CRUD işlemlerini biliyorum :)

    Güvenlik önlemi olarak ise sunucu tarafında hiç bir zaman cliente güvenmeyerek her kontrolü sağlamak.

    Bir çok client/server toolu yazmak.Örnek vermek gerekirse; bir görev eklediğimizde bunun hem server/hemde client tarafını tek bir tool ile yapabilmek.Bunun gibi bir çok şey..

    Tabii bunları yazdığım için bunların hepsini %100 biliyorum demiyorum,fakat bir ekip çıkarsa elimden geleni yaparım:) @ OzkanOzdemir ve @ PENTAGRAM ın dediği gibi zor olsada communitynin oluşması için elimden geleni yaparım.

×
×
  • Yeni Oluştur...