yeni çıkan item kopyalama & crash çözümü

  • Konuyu açan Konuyu açan bosymax
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 19
  • Gösterim Gösterim 2K

bosymax

Development
Geliştirici
MT Üye
Mesaj
260
Çözümler
17
Beğeni
129
Puan
749
Ticaret Puanı
0
cBaran'dan Alıntıdır.
input_main.cpp arat:
input_main.cpp:
Genişlet Daralt Kopyala
int CInputMain::Analyze(LPDESC d, BYTE bHeader, const char * c_pData)
{
    LPCHARACTER ch;

    if (!(ch = d->GetCharacter()))
    {
        sys_err("no character on desc");
        d->SetPhase(PHASE_CLOSE);
        return (0);
    }

    int iExtraLen = 0;

    if (test_server && bHeader != HEADER_CG_MOVE)
        sys_log(0, "CInputMain::Analyze() ==> Header [%d] ", bHeader);

Altıne ekle:
C++:
Genişlet Daralt Kopyala
if (ch->GetDesc()->GetPhase() != PHASE_GAME && ch->GetDesc()->GetPhase() != PHASE_DEAD)
    {
        sys_err("no character in game");
        sys_log(0, "no character in game %u %u %u", ch->GetPlayerID(), ch->GetDesc()->GetPhase(), bHeader);
        d->SetPhase(PHASE_CLOSE);
        return (0);
    }

desc.h arat:
C++:
Genişlet Daralt Kopyala
bool            IsPhase(int phase) const    { return m_iPhase == phase ? true : false; }

altıne ekle:
C++:
Genişlet Daralt Kopyala
int            GetPhase() const    { return m_iPhase; }
 
En son bir moderatör tarafından düzenlenmiş:
nasıl kopyalanıyor muş bir detay verir misin bilmeden paylaşılmış ama nasıl kopyalanıyor bilmeden insanlar direk neden eklesin ki
Dostum esas paylaşan kişi diğer forumda var orada yazmış bişeyler konusuna ama nasıl yapıldığını yazmamış çünkü bu çoğu serverde kullanılabilecek bir açık olabilir ondan anlatmamıştır ama görsel olarak bişeyler eklemiş o konuda.
 
Sanırım safeboxa yang girişi yapılmış. Tıpkı bir item gibi. Bu alışılmışın dışında bir durum bence ve bugüne kadar da hiç duyulmamış bir şey.
Ya da ben duymadım, şahit olmadım. Böyle bir şeye yönelik paylaşılan bir fix de hiç görmedim hiç bir forumda. Bu da sorunun genel olmama ihtimalini bir hayli yükseltiyor. Bazen olaylara sadece "kod" olarak bakmamak gerek.

Yang'ın, bir item olarak safeboxa giriş yapabilmesi normal şartlarda zaten imkansız bir şey. Üstüne bir de sanırım direkt core yemiş, syserr veya sys_log da değil..
Metin2 özünde bir çok buga sahip ve yerli yersiz syserr verebilen bir oyun olsa da, core yeme olayı çoğunlukla geliştirici kaynaklı olur.
Ya bir düzenlemeden dolayı, ya da bir sistemden dolayı yada bellek sızıntısından dolayı. Ki bu da genellikle geliştirici kaynaklı bir problemdir.

Belkide tamamen yanılıyorumdur bu da bir ihtimal. Ama fixin sahibi(yada bir başkası) sorunun tam olarak ne olduğunu net bir şekilde herkese açıklamadığı sürece gereksiz gördüğüm bir fixtir bu benim niyazımda.
Eğer gizliliği ısrarla korunacaksa da, netlik kazanması açısından birçok soruya net cevap verilmesi gerek diye düşünüyorum.

Hoş, ortada bir çözüm var ama sorunun ne olduğu belli değil. Bu da ayrı bir ironi. Genel de tam tersi olurdu..
 
Sanırım safeboxa yang girişi yapılmış. Tıpkı bir item gibi. Bu alışılmışın dışında bir durum bence ve bugüne kadar da hiç duyulmamış bir şey.
Ya da ben duymadım, şahit olmadım. Böyle bir şeye yönelik paylaşılan bir fix de hiç görmedim hiç bir forumda. Bu da sorunun genel olmama ihtimalini bir hayli yükseltiyor. Bazen olaylara sadece "kod" olarak bakmamak gerek.

Yang'ın, bir item olarak safeboxa giriş yapabilmesi normal şartlarda zaten imkansız bir şey. Üstüne bir de sanırım direkt core yemiş, syserr veya sys_log da değil..
Metin2 özünde bir çok buga sahip ve yerli yersiz syserr verebilen bir oyun olsa da, core yeme olayı çoğunlukla geliştirici kaynaklı olur.
Ya bir düzenlemeden dolayı, ya da bir sistemden dolayı yada bellek sızıntısından dolayı. Ki bu da genellikle geliştirici kaynaklı bir problemdir.

Belkide tamamen yanılıyorumdur bu da bir ihtimal. Ama fixin sahibi(yada bir başkası) sorunun tam olarak ne olduğunu net bir şekilde herkese açıklamadığı sürece gereksiz gördüğüm bir fixtir bu benim niyazımda.
Eğer gizliliği ısrarla korunacaksa da, netlik kazanması açısından birçok soruya net cevap verilmesi gerek diye düşünüyorum.

Hoş, ortada bir çözüm var ama sorunun ne olduğu belli değil. Bu da ayrı bir ironi. Genel de tam tersi olurdu..
Üşenmeden hayranlıkla okudum
 
Sanırım safeboxa yang girişi yapılmış. Tıpkı bir item gibi. Bu alışılmışın dışında bir durum bence ve bugüne kadar da hiç duyulmamış bir şey.
Ya da ben duymadım, şahit olmadım. Böyle bir şeye yönelik paylaşılan bir fix de hiç görmedim hiç bir forumda. Bu da sorunun genel olmama ihtimalini bir hayli yükseltiyor. Bazen olaylara sadece "kod" olarak bakmamak gerek.

Yang'ın, bir item olarak safeboxa giriş yapabilmesi normal şartlarda zaten imkansız bir şey. Üstüne bir de sanırım direkt core yemiş, syserr veya sys_log da değil..
Metin2 özünde bir çok buga sahip ve yerli yersiz syserr verebilen bir oyun olsa da, core yeme olayı çoğunlukla geliştirici kaynaklı olur.
Ya bir düzenlemeden dolayı, ya da bir sistemden dolayı yada bellek sızıntısından dolayı. Ki bu da genellikle geliştirici kaynaklı bir problemdir.

Belkide tamamen yanılıyorumdur bu da bir ihtimal. Ama fixin sahibi(yada bir başkası) sorunun tam olarak ne olduğunu net bir şekilde herkese açıklamadığı sürece gereksiz gördüğüm bir fixtir bu benim niyazımda.
Eğer gizliliği ısrarla korunacaksa da, netlik kazanması açısından birçok soruya net cevap verilmesi gerek diye düşünüyorum.

Hoş, ortada bir çözüm var ama sorunun ne olduğu belli değil. Bu da ayrı bir ironi. Genel de tam tersi olurdu..
Paylaşan kişi işte sözde diyor ki son zamanda açılan büyük bütçeli serverler bu açıktan dolayı açıldığı gibi batmış vs. Bilmiyorum.
 
Hikaye gibi geldi.. ama dediğin gibi, bilinmezlikten ibaret.
Bunlar zaten ayrı bir dünya insanları hep bi büyük bütçeli serverlar açılıyor ama şunu eklemek istiyorum. Bu büyük bütçeli dedikleri sürekli açılıp parayı vurup tekrardan kapatıp sonra bir iki bişey değiştirip tekrardan açılan serverler hep belli başlı kişiler açtığından ve bu açılan serverlar hep aynı source üzerinden açıldığından dolayı bu son açılıp bu açık yüzünden battı dediği serverlar aynı sourceyi kullandığından dolayı battı bir çok yeni server demesi bundan kaynaklıdır eminim. Çünkü dediğin gibi depoya item gibi yang eklemek mümkün değil. Bir sourceyi kullanıyorlar ekli sistemleri kapatıp açıp oyun yapısını değiştiriyorlar bunlar farklı farklı source yok zaten genelinde. Atıyorum zodiac eklidir sourcede 1-120 server diye reklam yaparlar sonra o serveri kapatıp 1-99 emek açıyoruz diyip sourceden zodiac deaktif edip işte 1-99 source oldu bitti. :)
 
Bu konuda açık ve net söyleyeyim Türklerden her şeyi beklerim. O yüzden söylediklerine inanmamam için bir sebep yok.
Bu açıktan dolayı olduğu gibi batmış olayı aşırı saçma geldi. Madem büyük bütçeliydi(ler) ve bu sebepten dolayı battı(lar), nasıl oluyor da hiç duyulmuyor bugüne kadar..dediğim gibi ne yerli ne de yabancı hiç bir forumda böyle bir hata için açılmış bir soru yada fix paylaşımı görmedim. Bunca yıllık oyunun geliştirme hayatında illaki bu soruna denk gelinirdi,ve illaki bir forumda adı geçer ve duyulurdu..

Bütün bunlar gereksiz bir gövde gösterisinden başka bir anlam ifade etmiyor benim için.(Yanılmadığım sürece)
Fixin paylaşılma şekli bile dalga geçilir gibi. 0 ciddiyet.
 
Sorun nedir bilmiyorum, sorun çözümü veya fix kavramlarından bağımsız olarak söyleyebilirim ki konudaki kodu incelediğiniz zaman ekstra bir kontrol eklendiğini görebilirsiniz, bu kontrolün ortada her hangi bir sorun yokken de kaynakta ekli olması gerektiğini düşünüyorum o yüzden kullanılabilir, saygılar.
 
@MT2Dev bu konuda fikirlerini merak ediyorum
Bu kontrol oldukça mantıklı ve bana sorarsanız kesinlikle eklenmeli, peki neden ? Oyun içerisinde işlenmesi gereken paketleri henüz oyuna (PHASE_GAME) bağlanmamış bir karakterle işleyebilmek tahmin edilemez sonuçlar doğurabilir, bunu hangi sebeple araştırmaya karar verdiler onu bilmiyorum, ama muhtemelen bundan faydalanan bir oyuncu yüzünden debuglamak zorunda kalmışlardır. Benim önerdiğim kullanım versiyonu;

(C++17 ve üstü için!)

desc.h:
Genişlet Daralt Kopyala
int GetPhase() const
{
    return m_iPhase;
}

input_main.cpp:
Genişlet Daralt Kopyala
    if (const auto Phase = ch->GetDesc()->GetPhase(); Phase != PHASE_GAME && Phase != PHASE_DEAD)
    {
        sys_err ("<CInputMain::Analyze> No Character in Game! ID: %u PHASE: %u HEADER: %u", ch->GetPlayerID(), Phase, bHeader);
        d->SetPhase (PHASE_CLOSE);
        return (0);
    }
 
Bu kontrol oldukça mantıklı ve bana sorarsanız kesinlikle eklenmeli, peki neden ? Oyun içerisinde işlenmesi gereken paketleri henüz oyuna (PHASE_GAME) bağlanmamış bir karakterle işleyebilmek tahmin edilemez sonuçlar doğurabilir, bunu hangi sebeple araştırmaya karar verdiler onu bilmiyorum, ama muhtemelen bundan faydalanan bir oyuncu yüzünden debuglamak zorunda kalmışlardır. Benim önerdiğim kullanım versiyonu;

(C++17 ve üstü için!)

desc.h:
Genişlet Daralt Kopyala
int GetPhase() const
{
    return m_iPhase;
}

input_main.cpp:
Genişlet Daralt Kopyala
    if (const auto Phase = ch->GetDesc()->GetPhase(); Phase != PHASE_GAME && Phase != PHASE_DEAD)
    {
        sys_err ("<CInputMain::Analyze> No Character in Game! ID: %u PHASE: %u HEADER: %u", ch->GetPlayerID(), Phase, bHeader);
        d->SetPhase (PHASE_CLOSE);
        return (0);
    }
Biraz daha detay verme şansın var mı?
Açıkçası bu fixin ne kadar gerekli olduğundan şüpheliyim. Çünkü Analyze fonksiyonu zaten PHASE_GAME aktif olmadığı sürece çalışmayan bir fonksiyon. Ek olarak PHASE_GAME aktif olduğu an itibari ile her 10 saniyede bir otomatik tetiklenen bir fonksiyon.
Yani demek istediğim, PHASE_LOGIN veya PHASE_LOADING vb. gibi diğer fazlarda tamamen kıyıda köşede duran bir işlev. Bu da doğal olarak böyle bir merak uyandırdı.
 
desc'i almak için tekrar ch kullanmanıza gerek yok, fonksiyona zaten desc geliyor. ek olarak returnlarıda düzenlerseniz sıkıntılı paket geldiğinde karakteride atar.

C++:
Genişlet Daralt Kopyala
    int32_t iExtraLen = 0;
    if (d->GetPhase() != PHASE_GAME && d->GetPhase() != PHASE_DEAD)
    {
        if (d->GetPhase() != PHASE_CLOSE)
        {
            sys_err("no character in game pid %u phase %d header %u", ch->GetPlayerID(), d->GetPhase(), bHeader);
            d->SetCloseReason("WRONG_PHASE");
            d->SetPhase(PHASE_CLOSE);
        }

        sys_err("no character in game pid %u phase %d header %u", ch->GetPlayerID(), d->GetPhase(), bHeader);
        return -1;
    }
    else if (d->IsInDelayedDisconnect())
    {
        return -1; // If the character is in delayed disconnect, we should not process any packets.
    }
 
En son bir moderatör tarafından düzenlenmiş:
Biraz daha detay verme şansın var mı?
Açıkçası bu fixin ne kadar gerekli olduğundan şüpheliyim. Çünkü Analyze fonksiyonu zaten PHASE_GAME aktif olmadığı sürece çalışmayan bir fonksiyon. Ek olarak PHASE_GAME aktif olduğu an itibari ile her 10 saniyede bir otomatik tetiklenen bir fonksiyon.
Yani demek istediğim, PHASE_LOGIN veya PHASE_LOADING vb. gibi diğer fazlarda tamamen kıyıda köşede duran bir işlev. Bu da doğal olarak böyle bir merak uyandırdı.
Bazen çok fazla kontrol koyduğum için bunun gereksiz olduğunu düşünen arkadaşlar nedenini soruyor, bu olayda aslında benzer bir durum şöyle örnek verirsem daha iyi anlaşılacaktır; Örneğin XX fonksiyonunun sonunda desc PHASE_GAME içinde ise Analyze çağıralım, buradan çağrılan Analyze fonksiyonu başladığında doğal olarak desci PHASE_GAME olarak bekleyecek çünkü biz sadece bu şartla orayı çağırdık fakat Analyze fonksiyonunun başında bunu kontrol etmezsek ve PHASE paket analyze içinden gönderilmeden değiştirildiyse ne olacak ? Bu nasıl olur, değişmez diye düşünebilirsiniz ama Metin2 tarzı bir paket iletim sistemi kullanan herhangi bir MMORPG'de çeşitli yöntemlerle bunları suistimal etmek mümkün (paketleri interneti yavaşlatarak göndermek, bağlantı kesip açarak bir anda birden fazla göndermek, iletim esnasında içeriğini değiştirmek, sıralamalarını karıştırmak vs), bu durumda da normalde oyunda olması gereken bir karakter kontrol süresinden önce bu paketi bir şekilde göndermeyi başarırsa konu sahibinin başına gelen olay yaşanabilir, bazen koda baktığınızda buradan bir sıkıntı çıkma ihtimali yok diye düşündüğünüz saçma sapan bölümlerden tuhaf sorunlar yaşayabiliyorsunuz, Metin2'de yoğun bir oyuncu kitlesiyle açılış yapan çoğu sunucu buna benzer tuhaf şeylerle karşılaşmıştır, 2014'den beri herkesin elinde olan dosyaların bundan 11 sene sonra bile suistimal edilebilecek bölümlerini keşfedenlerin olduğunu düşününün, kimsenin ihtimal vermediği bulan tek bir kişinin de bunun üstünden insanları mağdur ettiği bir çok örnek yaşandı, bu da sanıyorum onlardan birisi. Paket şifreleme sistemlerinin her zaman çok önemli olduğunu savunmamın sebebi de temelde bunlardır, sevgiler.
 
kağıt üzerinde gereksiz gibi görünsede aktif sunucuda işler öyle gitmiyor malesef... ddos olur, paket spamlayan araçlar olur hatta hile bile olur bir şekilde bu durumu tetikleyebiliyor. hatta yukarıda attığım halindeki log içerisinde phase değeri PHASE_GAME olarak gözükmesine rağmen buraya düştüğünü hatırlıyorum. muhtemelen @MT2Dev bahsettiği gibi Analyze aşamasına gelene kadar çok fazla veri ya da boyutu yüksek veri geldiyse(ki hata almamak için buffer miktarını artırdıysanız gayet olası) tamamını işleyene kadar phase değeri değişmiş olabiliyor.
 
Bu kontrol oldukça mantıklı ve bana sorarsanız kesinlikle eklenmeli, peki neden ? Oyun içerisinde işlenmesi gereken paketleri henüz oyuna (PHASE_GAME) bağlanmamış bir karakterle işleyebilmek tahmin edilemez sonuçlar doğurabilir, bunu hangi sebeple araştırmaya karar verdiler onu bilmiyorum, ama muhtemelen bundan faydalanan bir oyuncu yüzünden debuglamak zorunda kalmışlardır. Benim önerdiğim kullanım versiyonu;

(C++17 ve üstü için!)

desc.h:
Genişlet Daralt Kopyala
int GetPhase() const
{
    return m_iPhase;
}

input_main.cpp:
Genişlet Daralt Kopyala
    if (const auto Phase = ch->GetDesc()->GetPhase(); Phase != PHASE_GAME && Phase != PHASE_DEAD)
    {
        sys_err ("<CInputMain::Analyze> No Character in Game! ID: %u PHASE: %u HEADER: %u", ch->GetPlayerID(), Phase, bHeader);
        d->SetPhase (PHASE_CLOSE);
        return (0);
    }
Kod:
Genişlet Daralt Kopyala
    if (ch && ch->GetDesc()->GetPhase() != PHASE_GAME && ch->GetDesc()->GetPhase() != PHASE_DEAD)
    {
        sys_err("no character in game");
        sys_log(0, "no character in game pid : %u phase : %u header : %u ip address : %s", ch->GetPlayerID(), ch->GetDesc()->GetPhase(), bHeader, ch->GetDesc()->GetHostName());
        d->SetPhase(PHASE_CLOSE);
        return -1;
    }

Benim kaynak dosyalarımda bu şekilde kalsın mı yoksa sizinki gibi değiştireyim mi? @MT2Dev
 
Kod:
Genişlet Daralt Kopyala
    if (ch && ch->GetDesc()->GetPhase() != PHASE_GAME && ch->GetDesc()->GetPhase() != PHASE_DEAD)
    {
        sys_err("no character in game");
        sys_log(0, "no character in game pid : %u phase : %u header : %u ip address : %s", ch->GetPlayerID(), ch->GetDesc()->GetPhase(), bHeader, ch->GetDesc()->GetHostName());
        d->SetPhase(PHASE_CLOSE);
        return -1;
    }

Benim kaynak dosyalarımda bu şekilde kalsın mı yoksa sizinki gibi değiştireyim mi? @MT2Dev
C++17 veya üstünü kullanıyorsanız benimki ile değiştirin, daha iyi performans sağlar ayrıca fonksiyonun başında CH'nin kontrolünü GetCharacter() ile yapıyor yani ch && kontrolü bu durumda gereksiz, sevgiler.
 
Geri
Üst