Çözüldü Zehir Core Hk.

  • Konuyu açan Konuyu açan nyami
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 8
  • Gösterim Gösterim 157
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
Usta Üye
Mesaj
720
Çözümler
50
Beğeni
1.217
Puan
1.130
Ticaret Puanı
1
Herhangi bir şekilde oyuncu veya moblar zehirlenince aşağıdaki coreyi alıyorum bir kaç files ile veri akışını ve zehir damage hesaplamalarını kontrol ettim ama bir sonuca ulaşamadım. Belki karşılaşmışsınızdır veya benim gözden kaçırdığım bir olay vardır. Herhangi bir dosya veya kod parçası lazımsa belirtin konuya eklerim.

Teşekkürler...


Zehir Core:
Genişlet Daralt Kopyala
Type "apropos word" to search for commands related to "word".
(gdb) file core1
Reading symbols from core1...
(gdb) core usage_game.core
[New LWP 100141]
[New LWP 101087]
[New LWP 101088]
[New LWP 101092]
Core was generated by `./core1'.
Program terminated with signal SIGSEGV, Segmentation fault.
Address not mapped to object.
#0  0x080b68c3 in CHARACTER::Damage (this=<optimized out>, pAttacker=<optimized out>, dam=1119,
    type=DAMAGE_TYPE_POISON) at entity.h:54
54                      long                    GetMapIndex() const     { return m_lMapIndex; }
[Current thread is 1 (LWP 100141)]
(gdb) bt full
#0  0x080b68c3 in CHARACTER::Damage (this=<optimized out>, pAttacker=<optimized out>, dam=1119,
    type=DAMAGE_TYPE_POISON) at entity.h:54
        iCurHP = <optimized out>
        iCurSP = <optimized out>
        IsCritical = <optimized out>
        IsPenetrate = <optimized out>
        IsDeathBlow = <optimized out>
#1  0x080e51f5 in poison_event (event=..., processing_time=1) at char_resist.cpp:62
        info = 0x377cb360
        __FUNCTION__ = "poison_event"
        ch = 0x48bfa800
        pkAttacker = 0x0
        dam = <optimized out>
#2  0x0812cb06 in event_process (pulse=<optimized out>) at event.cpp:140
        pElem = 0x486a7f60
        the_event = {px = 0x377cb420}
        processing_time = 1
        new_time = <optimized out>
        num_events = 0
#3  0x0823195e in heartbeat (ht=0x28de8020, pulse=222491) at main.cpp:229
        t = 8900061
#4  0x08232864 in idle () at main.cpp:758
        now = <optimized out>
        passed_pulses = 0
        t = <optimized out>
        pta = {tv_sec = 1752097548, tv_usec = 22791}
        process_time_count = 0
#5  0x08065bd5 in main (argc=<optimized out>, argv=<optimized out>) at main.cpp:471
        sectree_manager = {<singleton<SECTREE_MANAGER>> = {_vptr.singleton = 0x85009f8 <vtable for SECTREE_MANAGER+8>,
--Type <RET> for more, q to quit, c to continue without paging--

1752087606089.webp
 
Çözüm
Kod:
Genişlet Daralt Kopyala
#ifdef ENABLE_GUILD_WAR_FENCE_SYSTEM
    if (CWarMapManager::instance().GetWIsStart() != 1 && CWarMapManager::instance().IsWarMap(pAttacker->GetMapIndex()))
        return false;
#endif

kısmını

Kod:
Genişlet Daralt Kopyala
#ifdef ENABLE_GUILD_WAR_FENCE_SYSTEM
    if (pAttacker && CWarMapManager::instance().GetWIsStart() != 1 && CWarMapManager::instance().IsWarMap(pAttacker->GetMapIndex()))
        return false;
#endif

olarak değiştirip deneyin
İlk dikkatimi çeken şey pkAttacker = 0x0 (Null) bölümü, tetiklenen eventin kim sebebiyle tetiklendiği belli değil yani saldırgan yok (GM komutuyla zehirlemediyseniz mutlaka bir saldırgan olmalı) poison_event bir nullptr tarafından çağrılıyor veya devam ettiriliyor bu durum başlı başına core sebebi olabilir, ilk çözüm önerim;

C++:
Genişlet Daralt Kopyala
EVENTFUNC(poison_event)
{
    TPoisonEventInfo * info = dynamic_cast<TPoisonEventInfo *>( event->info );
    if ( info == NULL )
    {
        sys_err( "poison_event> <Factor> Null pointer" );
        return 0;
    }

    LPCHARACTER ch = info->ch;
    if (ch == NULL)
    { // <Factor>
        return 0;
    }
    
    int dam = ch->GetMaxHP() * GetPoisonDamageRate(ch) / 1000;
    if (test_server)
    {
        ch->ChatPacket(CHAT_TYPE_NOTICE, "Poison Damage %d", dam);
    }

    LPCHARACTER pkAttacker = CHARACTER_MANAGER::instance().FindByPID(info->attacker_pid);
    if (!pkAttacker) // pkAttacker bos ise tetiklenmesini engelleyerek bir deneme yapin
    {
        sys_err ("Poison_event: pkAttacker NULL ???");
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }
    
    if (ch->Damage(pkAttacker, dam, DAMAGE_TYPE_POISON))
    {
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }

    --info->count;

    if (info->count)
        return PASSES_PER_SEC(3);
    else
    {
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }
}

Bir deneyin bakalım, devamına bakarız.
 
Corenin sebebi belli, mobu zehirliyorsun o öldüğü sırada ya oyunda olmuyorsun ya da başka bir haritaya ışınlanıyorsun(bulunduğun core değişiyor yani).

Aşağıdaki şekilde değiştir sorun düzelecektir.


C++:
Genişlet Daralt Kopyala
EVENTFUNC(poison_event)
{
    TPoisonEventInfo * info = dynamic_cast<TPoisonEventInfo *>( event->info );

    if ( info == NULL )
    {
        sys_err( "poison_event> <Factor> Null pointer" );
        return 0;
    }

    LPCHARACTER ch = info->ch;

    if (ch == NULL) { // <Factor>
        return 0;
    }
    LPCHARACTER pkAttacker = CHARACTER_MANAGER::instance().FindByPID(info->attacker_pid);

    int dam = ch->GetMaxHP() * GetPoisonDamageRate(ch) / 1000;
    if (test_server) ch->ChatPacket(CHAT_TYPE_NOTICE, "Poison Damage %d", dam);

    if (!pkAttacker)
    {
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }

    if (ch->Damage(pkAttacker, dam, DAMAGE_TYPE_POISON))
    {
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }

    --info->count;

    if (info->count)
        return PASSES_PER_SEC(3);
    else
    {
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }
}
 
char_battle.cpp yükleyin bakalım
Dosya ekte.

İlk dikkatimi çeken şey pkAttacker = 0x0 (Null) bölümü, tetiklenen eventin kim sebebiyle tetiklendiği belli değil yani saldırgan yok (GM komutuyla zehirlemediyseniz mutlaka bir saldırgan olmalı) poison_event bir nullptr tarafından çağrılıyor veya devam ettiriliyor bu durum başlı başına core sebebi olabilir, ilk çözüm önerim;

C++:
Genişlet Daralt Kopyala
EVENTFUNC(poison_event)
{
    TPoisonEventInfo * info = dynamic_cast<TPoisonEventInfo *>( event->info );
    if ( info == NULL )
    {
        sys_err( "poison_event> <Factor> Null pointer" );
        return 0;
    }

    LPCHARACTER ch = info->ch;
    if (ch == NULL)
    { // <Factor>
        return 0;
    }
  
    int dam = ch->GetMaxHP() * GetPoisonDamageRate(ch) / 1000;
    if (test_server)
    {
        ch->ChatPacket(CHAT_TYPE_NOTICE, "Poison Damage %d", dam);
    }

    LPCHARACTER pkAttacker = CHARACTER_MANAGER::instance().FindByPID(info->attacker_pid);
    if (!pkAttacker) // pkAttacker bos ise tetiklenmesini engelleyerek bir deneme yapin
    {
        sys_err ("Poison_event: pkAttacker NULL ???");
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }
  
    if (ch->Damage(pkAttacker, dam, DAMAGE_TYPE_POISON))
    {
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }

    --info->count;

    if (info->count)
        return PASSES_PER_SEC(3);
    else
    {
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }
}

Bir deneyin bakalım, devamına bakarız.

Evet silah ile zehirlemeyi beklerken uzun sürdüğü için kendimi gm komutu ile zehirledim. Kodu deneyip geri dönüş yapacağım. Teşekkürler.



Corenin sebebi belli, mobu zehirliyorsun o öldüğü sırada ya oyunda olmuyorsun ya da başka bir haritaya ışınlanıyorsun(bulunduğun core değişiyor yani).

Aşağıdaki şekilde değiştir sorun düzelecektir.


C++:
Genişlet Daralt Kopyala
EVENTFUNC(poison_event)
{
    TPoisonEventInfo * info = dynamic_cast<TPoisonEventInfo *>( event->info );

    if ( info == NULL )
    {
        sys_err( "poison_event> <Factor> Null pointer" );
        return 0;
    }

    LPCHARACTER ch = info->ch;

    if (ch == NULL) { // <Factor>
        return 0;
    }
    LPCHARACTER pkAttacker = CHARACTER_MANAGER::instance().FindByPID(info->attacker_pid);

    int dam = ch->GetMaxHP() * GetPoisonDamageRate(ch) / 1000;
    if (test_server) ch->ChatPacket(CHAT_TYPE_NOTICE, "Poison Damage %d", dam);

    if (!pkAttacker)
    {
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }

    if (ch->Damage(pkAttacker, dam, DAMAGE_TYPE_POISON))
    {
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }

    --info->count;

    if (info->count)
        return PASSES_PER_SEC(3);
    else
    {
        ch->m_pkPoisonEvent = NULL;
        return 0;
    }
}

Aslında hiç bir yere gitmiyorum olduğum yerdeyim. Yaklaşık 3 aydır aynı şey oluyordu, bu sabah tekrar karşılaşınca üstünde durmak istedim ama sonuç alamadım. Herhangi bir zehir olan item ile canavarlara vurmam veya kendime zehir göndermem olayı tetikliyor. Kod için teşekkür ederim deneyip geri dönüş yapcağım.
 
Son düzenleme:
Kod:
Genişlet Daralt Kopyala
#ifdef ENABLE_GUILD_WAR_FENCE_SYSTEM
    if (CWarMapManager::instance().GetWIsStart() != 1 && CWarMapManager::instance().IsWarMap(pAttacker->GetMapIndex()))
        return false;
#endif

kısmını

Kod:
Genişlet Daralt Kopyala
#ifdef ENABLE_GUILD_WAR_FENCE_SYSTEM
    if (pAttacker && CWarMapManager::instance().GetWIsStart() != 1 && CWarMapManager::instance().IsWarMap(pAttacker->GetMapIndex()))
        return false;
#endif

olarak değiştirip deneyin
 
Çözüm
Kod:
Genişlet Daralt Kopyala
#ifdef ENABLE_GUILD_WAR_FENCE_SYSTEM
    if (CWarMapManager::instance().GetWIsStart() != 1 && CWarMapManager::instance().IsWarMap(pAttacker->GetMapIndex()))
        return false;
#endif

kısmını

Kod:
Genişlet Daralt Kopyala
#ifdef ENABLE_GUILD_WAR_FENCE_SYSTEM
    if (pAttacker && CWarMapManager::instance().GetWIsStart() != 1 && CWarMapManager::instance().IsWarMap(pAttacker->GetMapIndex()))
        return false;
#endif

olarak değiştirip deneyin
Evet sorun yaşatan kod burasıymış. Bu şekilde düzenleyince core olayı kalktı ve aşağıdaki bahsettim gm kodu ile zehirleme olayında ki çalışmama durumunu yaşamadım. Teşekkür ederim. Sadece anlamadığım neden saldıranın burada belirtmek zorunda olduğum.


@MT2Dev
@Luigina
Denedim ama şöyle bir şey ile karşılaştım, gm kodu ile zehirleme olayı çalışmama ya başladı ama core olayı ortadan kalktı.
 
Evet sorun yaşatan kod burasıymış. Bu şekilde düzenleyince core olayı kalktı ve aşağıdaki bahsettim gm kodu ile zehirleme olayında ki çalışmama durumunu yaşamadım. Teşekkür ederim. Sadece anlamadığım neden saldıranın burada belirtmek zorunda olduğum.


@MT2Dev
@Luigina
Denedim ama şöyle bir şey ile karşılaştım, gm kodu ile zehirleme olayı çalışmama ya başladı ama core olayı ortadan kalktı.

saldıran karakter oyundan çıkarsada zehir etkisi süresince hedef hasar almaya devam edecek, normalde bunun için diğer kısımlarda kontrol var ancak sonradan eklenen o kısımda eksik kalmış o yüzden oradan sorun çıkıyor.

sadece yukarıdaki arkadaşların dediği gibi direkt zehir eventine kontrol eklerseniz saldıran oyundan çıktığında hasar almayıda durduracaktır, ek olarak kanama ve yanma gibi benzer event üzerinden çalışan şeylerde yine aynı sorunu yaşarsınız
 
saldıran karakter oyundan çıkarsada zehir etkisi süresince hedef hasar almaya devam edecek, normalde bunun için diğer kısımlarda kontrol var ancak sonradan eklenen o kısımda eksik kalmış o yüzden oradan sorun çıkıyor.

sadece yukarıdaki arkadaşların dediği gibi direkt zehir eventine kontrol eklerseniz saldıran oyundan çıktığında hasar almayıda durduracaktır, ek olarak kanama ve yanma gibi benzer event üzerinden çalışan şeylerde yine aynı sorunu yaşarsınız
Tekrar teşekkür ederim.
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst