Çözüldü İtem giyerken GetType kaynaklı core

  • Konuyu açan Konuyu açan nyami
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 18
  • Gösterim Gösterim 257
Bu konu çözüme ulaştırılmıştır. Çözüm için konuya yazılan tüm yorumları okumayı unutmayın. Eğer konudaki yorumlar sorununuzu çözmediyse yeni bir konu açabilirsiniz.
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.

nyami

ZeRo
Premium Üye
Geliştirici
Yardımsever Üye
MT Üye
Mesaj
572
Çözümler
38
Beğeni
894
Puan
929
Ticaret Puanı
0
Bazen bu şekilde item giyerken core veriyor sebebini bulamadım bilen var mı?

1722883105337.webp


Kod:
Genişlet Daralt Kopyala
#0  CItem::GetType (this=0x0) at ./item.h:128
128                             return m_pProto ? m_pProto->bType : 0;
[Current thread is 1 (LWP 100468)]
(gdb) bt full
#0  CItem::GetType (this=0x0) at ./item.h:128
No locals.
#1  CHARACTER::CanEquipNow (this=0x37cc5000, item=0x30eb2c40, srcCell=..., destCell=...) at char_item.cpp:8293
        weapon = 0x0
        itemTable = <optimized out>
#2  0x008c0c5c in CHARACTER::EquipItem (this=0x37cc5000, item=0x30eb2c40, iCandidateCell=-1) at char_item.cpp:6688
        iWearCell = <optimized out>
        dwCurTime = <optimized out>
#3  0x008ba08e in CHARACTER::UseItemEx (this=0x37cc5000, item=0x30eb2c40, DestCell=...) at char_item.cpp:1866
        luckybag = {{count = 1000, prob = 302, vnum = 1}, {count = 10, prob = 150, vnum = 27002}, {count = 10,
            prob = 75, vnum = 27003}, {count = 10, prob = 100, vnum = 27005}, {count = 10, prob = 50, vnum = 27006}, {
            count = 10, prob = 80, vnum = 27001}, {count = 10, prob = 50, vnum = 27002}, {count = 10, prob = 80,
            vnum = 27004}, {count = 10, prob = 50, vnum = 27005}, {count = 1, prob = 10, vnum = 50300}, {count = 1,
            prob = 6, vnum = 92}, {count = 1, prob = 2, vnum = 132}, {count = 1, prob = 6, vnum = 1052}, {count = 1,
            prob = 2, vnum = 1092}, {count = 1, prob = 6, vnum = 2082}, {count = 1, prob = 2, vnum = 2122}, {
            count = 1, prob = 6, vnum = 3082}, {count = 1, prob = 2, vnum = 3122}, {count = 1, prob = 6, vnum = 5052},
          {count = 1, prob = 2, vnum = 5082}, {count = 1, prob = 6, vnum = 7082}, {count = 1, prob = 2, vnum = 7122}, {
            count = 1, prob = 1, vnum = 11282}, {count = 1, prob = 1, vnum = 11482}, {count = 1, prob = 1,
            vnum = 11682}, {count = 1, prob = 1, vnum = 11882}}
        iLimitTimerBasedOnWearFlagIndex = -1
        iLimitRealtimeStartFirstUseFlagIndex = <optimized out>
        wDestCell = <optimized out>
        bDestInven = <optimized out>
#4  0x008c23aa in CHARACTER::UseItem (this=0x37cc5000, Cell=..., DestCell=...) at char_item.cpp:5747
        item = <optimized out>
        wCell = <optimized out>
        window_type = <optimized out>
#5  0x0092a7dc in CInputMain::Analyze (this=0x228cb878, d=0x228cb800, bHeader=11 '\v', c_pData=0x6307cf80 "\v\001\002")
    at input_main.cpp:896
--Type <RET> for more, q to quit, c to continue without paging--q
 
Çözüm
weapon kısmına uyguladığınız gibi nullptr kontrolü konulması gereken yüzlerce yer var src içerisinde, hem bunları hem de yeni bir sistem eklerken dikkat etmenizi öneririm ayrıca bir ufak önerim var, nullptr kontrollerinin içerisine eğer bunu sadece test sunucusunda aktif etmeyecekseniz sadece normal chat infoları koymayın, syserr de koyun. Şuan ki haliyle kullanırsanız normalde null olmaması gereken weapon null olduğu zaman bunu sadece yapan kullanıcı görecek ve sunucu sahibinin konu hakkında bilgisi olmayacak, bu hatalı bir uygulama olur, sevgiler.
o kadar eksik kısmı var ki günlük olarak temizliyorum gene de başa çıkılmıyor, keşke sadece nullptr ile keşke. chat_info ile takip etmek imkansız olur dediğiniz gibi syserr de...
item giymezsen çözülür kardeşim.

şaka bir yana mainlinede böyle bir sorun yok marty kullanıyorsan mainlineye bak. marty kullanmıyorsan oraya bak ordan karşılaştır.
 
GDB çıktısına göre sorun "bool CHARACTER::CanEquipNow" fonksiyonunda, yanılmıyorsam item nullptr olarak döndüğü zaman GetType fonksiyonu işlemi tamamlayamayıp core düşürüyor, basit bir çözüm deneyelim, çözüleceğini düşünüyorum eğer çözülmezse tekrar bakarım;

char_item.cpp:
Genişlet Daralt Kopyala
// BUL

bool CHARACTER::CanEquipNow

// Fonksiyonun içine en üste ekle

    if (!item)  // DevFix 111
    {
        sys_err ("<CHARACTER::CanEquipNow> ITEM is a NULL!");
        return false;
    }

Yani böyle gözükmeli;

Screenshot_1.webp



EK NOT; Normalde bu fonksiyonda item'in asla nullptr olmaması lazım bunun nedenini bulmakta önemli, verdiğim çözüm core düşmesini engeller ama sorunu kökten çözmeyebilir, bilginize.
 
GDB çıktısına göre sorun "bool CHARACTER::CanEquipNow" fonksiyonunda, yanılmıyorsam item nullptr olarak döndüğü zaman GetType fonksiyonu işlemi tamamlayamayıp core düşürüyor, basit bir çözüm deneyelim, çözüleceğini düşünüyorum eğer çözülmezse tekrar bakarım;

char_item.cpp:
Genişlet Daralt Kopyala
// BUL

bool CHARACTER::CanEquipNow

// Fonksiyonun içine en üste ekle

    if (!item)  // DevFix 111
    {
        sys_err ("<CHARACTER::CanEquipNow> ITEM is a NULL!");
        return false;
    }

Yani böyle gözükmeli;

18159 eklentisini görüntüle



EK NOT; Normalde bu fonksiyonda item'in asla nullptr olmaması lazım bunun nedenini bulmakta önemli, verdiğim çözüm core düşmesini engeller ama sorunu kökten çözmeyebilir, bilginize.
nöbetim var 22 den sonra deneyip geri dönüş sağlarım

nullptr olan item değil weapon değişkeni
ben de işte orada takılıyorum çünkü ayakkabı giyerken de yapıyor silah giyerkende, her charda yapmıyor garip bir şey
 
En son bir moderatör tarafından düzenlenmiş:
nullptr olan item değil weapon değişkeni
O kısmı fark ettim ama fonksiyona bakınca veya işaret ettiği diğer fonksiyonlara bakınca, en azından kendi dosyalarımda item harici pointer göremedim, tahmin ediyorum farklı zamanlarda düşen core senaryolarının hepsinde weapon kısmını işaret etmiyordur, oranın biraz rastgele denk geldiğini düşündüm tabii neyin tetiklediğini de bilmiyoruz, normalde böyle bir core almaması lazım, bu genel bir sorun değil çünkü. Sonrada eklenip bu fonksiyonları kullanarak kontroller yapan yeni bir sistem buna sebep oluyor olabilir, kaynağını bulmak lazım.

ben de işte orada takılıyorum çünkü ayakkabı giyerken de yapıyor silah giyerkende, her charda yapmıyor garip bir şey
Verdiğim çözümün core düşürme kısmını engelleyeceğini düşünüyorum fakat sorunu çözmeyecek mesela şuan nullptr algıladığında core düşürüyor, fixten sonra core düşmeyecek ama oraya eklediğim syserr düşecek ve fonksiyon false dönecek yani itemi yine giyemeyeceksin tek fark core düşmemesi olacak, tahminim bu yönde bu yüzden kaynağını bulmak önemli bu ancak geçici çözüm sağlar.
 
O kısmı fark ettim ama fonksiyona bakınca veya işaret ettiği diğer fonksiyonlara bakınca, en azından kendi dosyalarımda item harici pointer göremedim, tahmin ediyorum farklı zamanlarda düşen core senaryolarının hepsinde weapon kısmını işaret etmiyordur, oranın biraz rastgele denk geldiğini düşündüm tabii neyin tetiklediğini de bilmiyoruz, normalde böyle bir core almaması lazım, bu genel bir sorun değil çünkü. Sonrada eklenip bu fonksiyonları kullanarak kontroller yapan yeni bir sistem buna sebep oluyor olabilir, kaynağını bulmak lazım.


Verdiğim çözümün core düşürme kısmını engelleyeceğini düşünüyorum fakat sorunu çözmeyecek mesela şuan nullptr algıladığında core düşürüyor, fixten sonra core düşmeyecek ama oraya eklediğim syserr düşecek ve fonksiyon false dönecek yani itemi yine giyemeyeceksin tek fark core düşmemesi olacak, tahminim bu yönde bu yüzden kaynağını bulmak önemli bu ancak geçici çözüm sağlar.
null poninter sorgusunu bende ekledim dediğin gibi kesin bir çözüm olmadığı için ve takip edebileceğim kapasiteyi geçtiği için açtım konuyu. mesala pasa37 demiş ya weapon diye bu attığım core de ki karakter weapon gösterdiği halde ayakkabı giyince yapıyor bu olayı :rolleyes:. core weapon diyor ama başka birşey çıkıyor. ayakkabı diyor weapon çıkıyor. olay örgüsünü bir türlü kıramadım. bunu sürekli ve her karakterde yapsa sistem kapatarak adım adım takip ediyim diyecem öyle bir şey de olmuyor.
 
char_item.cpp, cmd_general.cpp ve questlua_pc.cpp dosyalarını atar mısın?
 
Fark ettiğim şey şu oldu: marty'nin fixini yanlış çekmişsin.
C++:
Genişlet Daralt Kopyala
if (TItemPos (EQUIPMENT, item2->GetCell()).IsEquipPosition())
    {
        BYTE bEquipCell = item2->GetCell() - INVENTORY_MAX_NUM;
        BYTE bInvenCell = item1->GetCell();
        
        // 1 -> MARTY ZATEN BU if SORGUSUNU AYRI BİR if İÇİNE ÇEKMİŞ.
        if (item2->IsDragonSoul() || item2->GetType() == ITEM_BELT) // @fixme117
            if (!CanUnequipNow(item2) || !CanEquipNow(item1)) // AYNI
                return false;
        // 1 SON

        // 2 BU SORGUNUN OLMAMASI LAZIM.
        if (!CanUnequipNow(item2) || !CanEquipNow(item1)) // AYNI
            return false;
        // 2 SON

Bunun doğrudan core ile alakası olup olmadığından emin değilim ancak yinede belirtmek istedim.
Ayrıca core hatalarında Analyze hariç, diğer tüm fonksiyonların en başına gelen item argümanını syserr olarak yazdır. Syserr nerede kesiliyorsa o fonksiyondan bir önceki fonksiyonda sorun var demektir.
 
Fark ettiğim şey şu oldu: marty'nin fixini yanlış çekmişsin.
C++:
Genişlet Daralt Kopyala
if (TItemPos (EQUIPMENT, item2->GetCell()).IsEquipPosition())
    {
        BYTE bEquipCell = item2->GetCell() - INVENTORY_MAX_NUM;
        BYTE bInvenCell = item1->GetCell();
       
        // 1 -> MARTY ZATEN BU if SORGUSUNU AYRI BİR if İÇİNE ÇEKMİŞ.
        if (item2->IsDragonSoul() || item2->GetType() == ITEM_BELT) // @fixme117
            if (!CanUnequipNow(item2) || !CanEquipNow(item1)) // AYNI
                return false;
        // 1 SON

        // 2 BU SORGUNUN OLMAMASI LAZIM.
        if (!CanUnequipNow(item2) || !CanEquipNow(item1)) // AYNI
            return false;
        // 2 SON

Bunun doğrudan core ile alakası olup olmadığından emin değilim ancak yinede belirtmek istedim.
Ayrıca core hatalarında Analyze hariç, diğer tüm fonksiyonların en başına gelen item argümanını syserr olarak yazdır. Syserr nerede kesiliyorsa o fonksiyondan bir önceki fonksiyonda sorun var demektir.
bu fix olayını dün bende fark ettim neden 2 kere kontrole soktum diye düşündüm ama neyse önce şu core yi halledip bakarım diye sallamadım :D. evet en mantılı çözüm olayı dediğin gibi syserr ile takip etmek gibi duruyor şuanda.
 
Fark ettiğim şey şu oldu: marty'nin fixini yanlış çekmişsin.
C++:
Genişlet Daralt Kopyala
if (TItemPos (EQUIPMENT, item2->GetCell()).IsEquipPosition())
    {
        BYTE bEquipCell = item2->GetCell() - INVENTORY_MAX_NUM;
        BYTE bInvenCell = item1->GetCell();
       
        // 1 -> MARTY ZATEN BU if SORGUSUNU AYRI BİR if İÇİNE ÇEKMİŞ.
        if (item2->IsDragonSoul() || item2->GetType() == ITEM_BELT) // @fixme117
            if (!CanUnequipNow(item2) || !CanEquipNow(item1)) // AYNI
                return false;
        // 1 SON

        // 2 BU SORGUNUN OLMAMASI LAZIM.
        if (!CanUnequipNow(item2) || !CanEquipNow(item1)) // AYNI
            return false;
        // 2 SON

Bunun doğrudan core ile alakası olup olmadığından emin değilim ancak yinede belirtmek istedim.
Ayrıca core hatalarında Analyze hariç, diğer tüm fonksiyonların en başına gelen item argümanını syserr olarak yazdır. Syserr nerede kesiliyorsa o fonksiyondan bir önceki fonksiyonda sorun var demektir.
bu fix olayını dün bende fark ettim neden 2 kere kontrole soktum diye düşündüm ama neyse önce şu core yi halledip bakarım diye sallamadım :D. evet en mantılı çözüm olayı dediğin gibi syserr ile takip etmek gibi duruyor şuanda.

Bu fix hatası önemli eğer sadece iç itemleri giymeye çalışırken bu core olayını yaşadıysanız bununla alakalı olabilir, ekstra olarak bir de chat packet eklemişsiniz çok güzel olmuş, bu şekilde kullanıp tekrar core verirse hangi eşyayı giyerken olduğunu da öğrenmiş olursunuz, kolay gelsin. :coffee:
 
Bu fix hatası önemli eğer sadece iç itemleri giymeye çalışırken bu core olayını yaşadıysanız bununla alakalı olabilir, ekstra olarak bir de chat packet eklemişsiniz çok güzel olmuş, bu şekilde kullanıp tekrar core verirse hangi eşyayı giyerken olduğunu da öğrenmiş olursunuz, kolay gelsin. :coffee:
kaiser iyi bir noktayı işaret etti benim aklıma gelmemişti en güzel takip yöntemi bu olabilir. aynen sadece syserr e gönderirse fark etmeye bilirim chat e de düşerse görme ihtimalim yüksek.
 
raw


silah kostümü giymeye çalıştığında takılı silah yoksa patlar

evet dün oraları düzelttim. sanırım gene acele etmeye başladım o yüzden saçma hatalar yapıyorum. uyardığın için teşekkür ederim. gece 4 e kadar test yaptım 1 tane düşme olmadı gene kayıplara karıştı benim core :D
1723045577979.webp


bu arada bu olta veya kazma varken silah kostüm giymeyi engellemek içindir. temel silah kostüm kodlarında yok. bu fix i atmayan varsa eklesin.
1723045978907.webp
 
evet dün oraları düzelttim. sanırım gene acele etmeye başladım o yüzden saçma hatalar yapıyorum. uyardığın için teşekkür ederim. gece 4 e kadar test yaptım 1 tane düşme olmadı gene kayıplara karıştı benim core :D
18175 eklentisini görüntüle

bu arada bu olta veya kazma varken silah kostüm giymeyi engellemek içindir. temel silah kostüm kodlarında yok. bu fix i atmayan varsa eklesin.
18176 eklentisini görüntüle
weapon kısmına uyguladığınız gibi nullptr kontrolü konulması gereken yüzlerce yer var src içerisinde, hem bunları hem de yeni bir sistem eklerken dikkat etmenizi öneririm ayrıca bir ufak önerim var, nullptr kontrollerinin içerisine eğer bunu sadece test sunucusunda aktif etmeyecekseniz sadece normal chat infoları koymayın, syserr de koyun. Şuan ki haliyle kullanırsanız normalde null olmaması gereken weapon null olduğu zaman bunu sadece yapan kullanıcı görecek ve sunucu sahibinin konu hakkında bilgisi olmayacak, bu hatalı bir uygulama olur, sevgiler.
 
weapon kısmına uyguladığınız gibi nullptr kontrolü konulması gereken yüzlerce yer var src içerisinde, hem bunları hem de yeni bir sistem eklerken dikkat etmenizi öneririm ayrıca bir ufak önerim var, nullptr kontrollerinin içerisine eğer bunu sadece test sunucusunda aktif etmeyecekseniz sadece normal chat infoları koymayın, syserr de koyun. Şuan ki haliyle kullanırsanız normalde null olmaması gereken weapon null olduğu zaman bunu sadece yapan kullanıcı görecek ve sunucu sahibinin konu hakkında bilgisi olmayacak, bu hatalı bir uygulama olur, sevgiler.
o kadar eksik kısmı var ki günlük olarak temizliyorum gene de başa çıkılmıyor, keşke sadece nullptr ile keşke. chat_info ile takip etmek imkansız olur dediğiniz gibi syserr de eklemek gerekiyor. öneriniz için teşekkür ederim. önerinizi dikkate alacağımdan emin olabilirsiniz, sevgiler ve saygılar.


//EDİT

Coreyi costume weapondan yakaladım. Önceki eklediğim tüm costume weapon fixlerimi temizledim. Daha sonra vatan2 den gerekli fixleri çektim ve olay düzeldi. Konu kapanabilir. @hasanmacit
 
Son düzenleme:
Çözüm
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Üst