Çözüldü game core

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ı.

enes turan

MT Üye
MT Üye
Mesaj
270
Çözümler
11
Beğeni
89
Puan
464
Ticaret Puanı
0
coreyi pet çağırılı iken oyunan çıkıs yapılırsa veriyor bilgisi olan veya başına gelen varmı daha önce ?


Adsız.png
 

Dosya Eklentileri

  • item_manager.rar
    12 KB · Gösterim: 10
Son düzenleme:
Çözüm
DestroyItem fonksiyonu

C++:
#ifndef DEBUG_ALLOC
void ITEM_MANAGER::DestroyItem(LPITEM item)
#else
void ITEM_MANAGER::DestroyItem(LPITEM item, const char* file, size_t line)
#endif
{

    if (item->GetSectree())
        item->RemoveFromGround();

    DWORD dwID = item->GetID();
    DWORD dwOwnerID = item->GetLastOwnerPID();
    LPCHARACTER o;
    TPlayerItem t;
    t.window = item->GetWindow();
    t.count = item->GetCount();
    t.vnum = item->GetOriginalVnum();
    t.pos = t.window == EQUIPMENT ? item->GetCell() - INVENTORY_MAX_NUM : item->GetCell();
    if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX || item->GetWindow() == INVENTORY_MAX_NUM)
    {
        // 20050613.ipkn.�� �������� ������ ���� ��� ����� ������...
item.cpp, char.cpp ve event.cpp yükler misin ve kullandığın pet sisteminin define ismini verirsen bir bakabilirim
 
DestroyItem fonksiyonu

C++:
#ifndef DEBUG_ALLOC
void ITEM_MANAGER::DestroyItem(LPITEM item)
#else
void ITEM_MANAGER::DestroyItem(LPITEM item, const char* file, size_t line)
#endif
{

    if (item->GetSectree())
        item->RemoveFromGround();

    DWORD dwID = item->GetID();
    DWORD dwOwnerID = item->GetLastOwnerPID();
    LPCHARACTER o;
    TPlayerItem t;
    t.window = item->GetWindow();
    t.count = item->GetCount();
    t.vnum = item->GetOriginalVnum();
    t.pos = t.window == EQUIPMENT ? item->GetCell() - INVENTORY_MAX_NUM : item->GetCell();
    if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX || item->GetWindow() == INVENTORY_MAX_NUM)
    {
        // 20050613.ipkn.�ð��� �������� ������ ���� ��� �ð������ ������ �ٿ�ȴ�.
        /*
        CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox();
        if (pSafebox)
        {
            pSafebox->Remove(item->GetCell());
        }
        if (!item->GetSkipSave() && dwID)
        {
            TR1_NS::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.find(item);
            if (it != m_set_pkItemForDelayedSave.end())
                m_set_pkItemForDelayedSave.erase(it);
        }
        */
    }

    if (item->GetOwner())
    {
        if (CHARACTER_MANAGER::instance().Find(item->GetOwner()->GetPlayerID()) != NULL)
        {
            sys_err("DestroyItem: GetOwner %s %s!!", item->GetName(), item->GetOwner()->GetName());
            item->RemoveFromCharacter();
        }
        else
        {
            sys_err ("WTH! Invalid item owner. owner pointer : %p", item->GetOwner());
        }
    }
    if (dwID)
    {

        db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_DESTROY, 0, sizeof(DWORD) + sizeof(DWORD));
        db_clientdesc->Packet(&dwID, sizeof(DWORD));
        db_clientdesc->Packet(&dwOwnerID, sizeof(DWORD));
    }
    /*
    else{
        return;
    }
    */

}

Bu şekilde dene eğer core alırsan yine altta bulunan satırı aç ve build alıp öyle dene.
 
Son düzenleme:
Çözüm
DestroyItem fonksiyonu

C++:
#ifndef DEBUG_ALLOC
void ITEM_MANAGER::DestroyItem(LPITEM item)
#else
void ITEM_MANAGER::DestroyItem(LPITEM item, const char* file, size_t line)
#endif
{

    if (item->GetSectree())
        item->RemoveFromGround();

    DWORD dwID = item->GetID();
    DWORD dwOwnerID = item->GetLastOwnerPID();
    LPCHARACTER o;
    TPlayerItem t;
    t.window = item->GetWindow();
    t.count = item->GetCount();
    t.vnum = item->GetOriginalVnum();
    t.pos = t.window == EQUIPMENT ? item->GetCell() - INVENTORY_MAX_NUM : item->GetCell();
    if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX || item->GetWindow() == INVENTORY_MAX_NUM)
    {
        // 20050613.ipkn.�ð��� �������� ������ ���� ��� �ð������ ������ �ٿ�ȴ�.
        CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox();
        if (pSafebox)
        {
            pSafebox->Remove(item->GetCell());
        }
        if (!item->GetSkipSave() && dwID)
        {
            TR1_NS::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.find(item);

            if (it != m_set_pkItemForDelayedSave.end())
                m_set_pkItemForDelayedSave.erase(it);
        }
    }

    if (item->GetOwner())
    {
        if (CHARACTER_MANAGER::instance().Find(item->GetOwner()->GetPlayerID()) != NULL)
        {
            sys_err("DestroyItem: GetOwner %s %s!!", item->GetName(), item->GetOwner()->GetName());
            item->RemoveFromCharacter();
        }
        else
        {
            sys_err ("WTH! Invalid item owner. owner pointer : %p", item->GetOwner());
        }
    }
    if (dwID)
    {

        db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_DESTROY, 0, sizeof(DWORD) + sizeof(DWORD));
        db_clientdesc->Packet(&dwID, sizeof(DWORD));
        db_clientdesc->Packet(&dwOwnerID, sizeof(DWORD));
    }
    /*
    else{
        return;
    }
    */

}

Bu şekilde dene eğer core alırsan yine altta bulunan satırı aç ve build alıp öyle dene.
direk bu halini denedim core vermedi ama cıkış yaptığında itemler envanterden yine gidiyor

/* kaldırıp öyle deneyeyim
 
merhaba
buyrun dosyalar

#define ENABLE_NEW_PET_SYSTEM
Bu dosyalarda bir sorun göremedim, ancak sorunun DestroyItem fonksiyonuyla bir alakası olduğunu sanmıyorum. Çünkü kendisi varsayılan bir fonksiyondur ve kendi başına core verecek bir potansiyele sahip değildir.
DestroyItem fonksiyonundan core vermesinin başlıca sebepleri şunlar olabilir:
- (Herhangi bir sebeple) zaten var olmayan bir şeyi yok etmeye(destroy) çalışmak
- Var olan ancak hatalı/eksik bağlamlar sebebiyle yok edilemeyen nesneleri yok etmeye çalışmak
- Yok edilmeye çalışılan nesnenin kendini yok etme özelliğinin olmaması(ancak bu konudaki durumda böyle bir şey söz konusu değil)
- Yok etme işlemlerinin mantık dışı bir senaryoda gerçekleşmesi.

Yani naçizane tavsiyem, DestroyItem fonksiyonuna dokunmadan sorunun ana kaynağını tespit etmen olacaktır. Aksi takdirde DestroyItem fonksiyonuna bilinçsizce veya farkında olmadan yapılan bir müdahele oyundaki bütün itemlere olumsuz şekilde yansıyacaktır. Ve beraberinde core hatasına sebep olan sorun hala bir yerlerde varlığını sürdürecektir. Dolayısıyla NEW_PET_SYSTEM ile alakalı olarak eklemelerini dikkatlice (defineli ve definesiz) kontrol etmen daha doğru olacaktır.
 
Bu dosyalarda bir sorun göremedim, ancak sorunun DestroyItem fonksiyonuyla bir alakası olduğunu sanmıyorum. Çünkü kendisi varsayılan bir fonksiyondur ve kendi başına core verecek bir potansiyele sahip değildir.
DestroyItem fonksiyonundan core vermesinin başlıca sebepleri şunlar olabilir:
- (Herhangi bir sebeple) zaten var olmayan bir şeyi yok etmeye(destroy) çalışmak
- Var olan ancak hatalı/eksik bağlamlar sebebiyle yok edilemeyen nesneleri yok etmeye çalışmak
- Yok edilmeye çalışılan nesnenin kendini yok etme özelliğinin olmaması(ancak bu konudaki durumda böyle bir şey söz konusu değil)
- Yok etme işlemlerinin mantık dışı bir senaryoda gerçekleşmesi.

Yani naçizane tavsiyem, DestroyItem fonksiyonuna dokunmadan sorunun ana kaynağını tespit etmen olacaktır. Aksi takdirde DestroyItem fonksiyonuna bilinçsizce veya farkında olmadan yapılan bir müdahele oyundaki bütün itemlere olumsuz şekilde yansıyacaktır. Ve beraberinde core hatasına sebep olan sorun hala bir yerlerde varlığını sürdürecektir. Dolayısıyla NEW_PET_SYSTEM ile alakalı olarak eklemelerini dikkatlice (defineli ve definesiz) kontrol etmen daha doğru olacaktır.
söktüğüm fileste zaten DestroyItem fonksiyonunda bir değişiklik yapılmamış
C++:
#ifndef DEBUG_ALLOC
void ITEM_MANAGER::DestroyItem(LPITEM item)
#else
void ITEM_MANAGER::DestroyItem(LPITEM item, const char* file, size_t line)
#endif
{
    if (item->GetSectree())
        item->RemoveFromGround();

    if (item->GetOwner())
    {
        if (CHARACTER_MANAGER::instance().Find(item->GetOwner()->GetPlayerID()) != NULL)
        {
            sys_err("DestroyItem: GetOwner %s %s!!", item->GetName(), item->GetOwner()->GetName());
            item->RemoveFromCharacter();
        }
        else
        {
            sys_err ("WTH! Invalid item owner. owner pointer : %p", item->GetOwner());
        }
    }

    TR1_NS::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.find(item);

    if (it != m_set_pkItemForDelayedSave.end())
        m_set_pkItemForDelayedSave.erase(it);

    DWORD dwID = item->GetID();
    sys_log(2, "ITEM_DESTROY %s:%u", item->GetName(), dwID);

    if (!item->GetSkipSave() && dwID)
    {
        DWORD dwOwnerID = item->GetLastOwnerPID();

        db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_DESTROY, 0, sizeof(DWORD) + sizeof(DWORD));
        db_clientdesc->Packet(&dwID, sizeof(DWORD));
        db_clientdesc->Packet(&dwOwnerID, sizeof(DWORD));
    }
    else
    {
        sys_log(2, "ITEM_DESTROY_SKIP %s:%u (skip=%d)", item->GetName(), dwID, item->GetSkipSave());
    }

    if (dwID)
        m_map_pkItemByID.erase(dwID);

    m_VIDMap.erase(item->GetVID());

#ifdef M2_USE_POOL
    pool_.Destroy(item);
#else
#ifndef DEBUG_ALLOC
    M2_DELETE(item);
#else
    M2_DELETE_EX(item, file, line);
#endif
#endif
}

yaptığım eklemelerin üzerinden geçtim fakat bir kez daha kontrol etsem iyi olacak gibi sonuçta söktüğümüz fileste DestroyItem fonksiyonunda bir değişiklik yapılmamış peki mantık yürüyürsek DestroyItem foksiyonunu kullanımı herhangi bir cpp dosyasında yapılabilirmi yada belli cpp dosyalarımı var en azından tarama alanını küçültmüş olurum
 
söktüğüm fileste zaten DestroyItem fonksiyonunda bir değişiklik yapılmamış
C++:
#ifndef DEBUG_ALLOC
void ITEM_MANAGER::DestroyItem(LPITEM item)
#else
void ITEM_MANAGER::DestroyItem(LPITEM item, const char* file, size_t line)
#endif
{
    if (item->GetSectree())
        item->RemoveFromGround();

    if (item->GetOwner())
    {
        if (CHARACTER_MANAGER::instance().Find(item->GetOwner()->GetPlayerID()) != NULL)
        {
            sys_err("DestroyItem: GetOwner %s %s!!", item->GetName(), item->GetOwner()->GetName());
            item->RemoveFromCharacter();
        }
        else
        {
            sys_err ("WTH! Invalid item owner. owner pointer : %p", item->GetOwner());
        }
    }

    TR1_NS::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.find(item);

    if (it != m_set_pkItemForDelayedSave.end())
        m_set_pkItemForDelayedSave.erase(it);

    DWORD dwID = item->GetID();
    sys_log(2, "ITEM_DESTROY %s:%u", item->GetName(), dwID);

    if (!item->GetSkipSave() && dwID)
    {
        DWORD dwOwnerID = item->GetLastOwnerPID();

        db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_DESTROY, 0, sizeof(DWORD) + sizeof(DWORD));
        db_clientdesc->Packet(&dwID, sizeof(DWORD));
        db_clientdesc->Packet(&dwOwnerID, sizeof(DWORD));
    }
    else
    {
        sys_log(2, "ITEM_DESTROY_SKIP %s:%u (skip=%d)", item->GetName(), dwID, item->GetSkipSave());
    }

    if (dwID)
        m_map_pkItemByID.erase(dwID);

    m_VIDMap.erase(item->GetVID());

#ifdef M2_USE_POOL
    pool_.Destroy(item);
#else
#ifndef DEBUG_ALLOC
    M2_DELETE(item);
#else
    M2_DELETE_EX(item, file, line);
#endif
#endif
}

yaptığım eklemelerin üzerinden geçtim fakat bir kez daha kontrol etsem iyi olacak gibi sonuçta söktüğümüz fileste DestroyItem fonksiyonunda bir değişiklik yapılmamış peki mantık yürüyürsek DestroyItem foksiyonunu kullanımı herhangi bir cpp dosyasında yapılabilirmi yada belli cpp dosyalarımı var en azından tarama alanını küçültmüş olurum
DestroyItem fonksiyonu çoğu zaman dinamik olarak çalışır ve manuel olarak pek çağrı yapılmaz. Mesela yere atılan veya düşen bir itemin bir süre sonra otomatik yok olması, süresi veya işi biten itemlerin otomatik yok olması gibi olayları kontrol eder ve yürütür. Dolayısıyla src içinde de DestroyItem diye arama yaptığında elle yapılan bir çağrıyı pek göremezsin.
 
DestroyItem fonksiyonu çoğu zaman dinamik olarak çalışır ve manuel olarak pek çağrı yapılmaz. Mesela yere atılan veya düşen bir itemin bir süre sonra otomatik yok olması, süresi veya işi biten itemlerin otomatik yok olması gibi olayları kontrol eder ve yürütür. Dolayısıyla src içinde de DestroyItem diye arama yaptığında elle yapılan bir çağrıyı pek göremezsin.
biraz ugraştıracak gibi
 
hacım sql tarafında eksiğin vardır srcden bağımsız itemlerin silinmesi. sql kontrol etmedin mi hiç
 
DestroyItem:
#ifndef DEBUG_ALLOC
void ITEM_MANAGER::DestroyItem(LPITEM item)
#else
void ITEM_MANAGER::DestroyItem(LPITEM item, const char* file, size_t line)
#endif
{

    if (item->GetSectree())
        item->RemoveFromGround();

    DWORD dwID = item->GetID();
    DWORD dwOwnerID = item->GetLastOwnerPID();
    LPCHARACTER o;
    TPlayerItem t;
    t.window = item->GetWindow();
    t.count = item->GetCount();
    t.vnum = item->GetOriginalVnum();
    t.pos = t.window == EQUIPMENT ? item->GetCell() - INVENTORY_MAX_NUM : item->GetCell();
    if (item->GetWindow() == MALL || item->GetWindow() == SAFEBOX || item->GetWindow() == INVENTORY_MAX_NUM)
    {
        // 20050613.ipkn.�ð��� �������� ������ ���� ��� �ð������ ������ �ٿ�ȴ�.

        CSafebox* pSafebox = item->GetWindow() == MALL ? o->GetMall() : o->GetSafebox();
        if (pSafebox)
        {
            pSafebox->Remove(item->GetCell());
        }
        /*
        if (!item->GetSkipSave() && dwID)
        {
            TR1_NS::unordered_set<LPITEM>::iterator it = m_set_pkItemForDelayedSave.find(item);

            if (it != m_set_pkItemForDelayedSave.end())
                m_set_pkItemForDelayedSave.erase(it);
        }
        */
 
    }

    if (item->GetOwner())
    {
        if (CHARACTER_MANAGER::instance().Find(item->GetOwner()->GetPlayerID()) != NULL)
        {
            sys_err("DestroyItem: GetOwner %s %s!!", item->GetName(), item->GetOwner()->GetName());
            item->RemoveFromCharacter();
        }
        else
        {
            sys_err ("WTH! Invalid item owner. owner pointer : %p", item->GetOwner());
        }
    }
    if (!item->GetSkipSave() && dwID)
    {
        db_clientdesc->DBPacketHeader(HEADER_GD_ITEM_DESTROY, 0, sizeof(DWORD) + sizeof(DWORD));
        db_clientdesc->Packet(&dwID, sizeof(DWORD));
        db_clientdesc->Packet(&dwOwnerID, sizeof(DWORD));
    }
    if (dwID)
    {
        m_map_pkItemByID.erase(dwID);
        m_VIDMap.erase(item->GetVID());
    }
    /*
    else{
        return;
    }
    */

}

bunu da dene eğer işe yaramazsa sql tarafında bir sorun olabilir aklıma başka bir şey gelmiyo artık :D
 
hacım sql tarafında eksiğin vardır srcden bağımsız itemlerin silinmesi. sql kontrol etmedin mi hiç
defineli olarak src/db kısmında hiçbir eklenti yok. definesiz pet olarak normal arattığımda da bir eklenti yok pet sistemi ile ilgili
mysql player kısmına gerekli tabloları oluşturdum itemlerin silinmesi zaten yoktu pet çağırılı iken oyunda cıkış yapınca core veriyordu @Dr Livesey
item_manager.cpp/DestroyItem fonksiyonunda bir kaç değişiklik yaptı core olayı çözüldü ama çıkış yapınca envanterde ne varsa silme sorunu çıktı ortaya
 
defineli olarak src/db kısmında hiçbir eklenti yok. definesiz pet olarak normal arattığımda da bir eklenti yok pet sistemi ile ilgili
mysql player kısmına gerekli tabloları oluşturdum itemlerin silinmesi zaten yoktu pet çağırılı iken oyunda cıkış yapınca core veriyordu @Dr Livesey
item_manager.cpp/DestroyItem fonksiyonunda bir kaç değişiklik yaptı core olayı çözüldü ama çıkış yapınca envanterde ne varsa silme sorunu çıktı ortaya
bende işte onu ayarlamaya çalışıyorum fena tilt etti :D
 
Durum
İçerik kilitlendiği için mesaj gönderimine kapatıldı.
Geri
Üst