noisiv 1
noisiv
Manwe Work 1
Manwe Work
mavzermete 1
mavzermete
Mt2Hizmet 1
Mt2Hizmet
Reklam vermek için turkmmo@gmail.com

Fix AutoGiveItem

  • Konuyu başlatan Konuyu başlatan durda
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 23
  • Görüntüleme Görüntüleme 4K
[CODE title="s" highlight="s"] if (inv_item->GetSocket(0) == item->GetSocket(0) &&
inv_item->GetSocket(1) == item->GetSocket(1) &&
inv_item->GetSocket(2) == item->GetSocket(2) &&
inv_item->GetCount() < g_bItemCountLimit)


[/CODE]
bazı fileslerde bu sekilde ve bende de bu sekilde
 
Bu blog autogiveitem, count ile birlikte kullanıldığında, blend olma ön koşuluyla çalışıyor. Autogiveitem genellikle ödüllendirme de çalışıyor.(yere düşürmeden direkt envantere ekleme.)
Blend(şebnem) ise oyunda genellikle cube yada başlangıç ödülü yoluyla alınıyor. Çözüm doğru ancak bu hatanın gerçekleşmesini olası görmedim.
 
inv_item->SetCount(inv_item->GetCount() + item->GetCount());

arat

altına ekle

M2_DESTROY_ITEM(item);

memory leak fix

Silinen birşeyi tekrar silmeye çalışıyorsun. Bunu Eklersen Null Değer Döndürürsün. Setcount fonksiyonunu attım gördüğün gibi zaten siliyor.

C++:
bool CItem::SetCount(DWORD count)
{
    if (GetType() == ITEM_ELK)
    {
        m_dwCount = std::min<DWORD>(count, INT_MAX);
    }
    else
    {
        m_dwCount = std::min<DWORD>(count, ITEM_MAX_COUNT);
    }

    if (count == 0 && m_pOwner)
    {
        if (GetSubType() == USE_ABILITY_UP || GetSubType() == USE_POTION || GetVnum() == 70020)
        {
            LPCHARACTER pOwner = GetOwner();
            WORD wCell = GetCell();

            RemoveFromCharacter();

            if (!IsDragonSoul())
            {
                LPITEM pItem = pOwner->FindSpecifyItem(GetVnum());

                if (NULL != pItem)
                {
                    pOwner->ChainQuickslotItem(pItem, QUICKSLOT_TYPE_ITEM, wCell);
#ifdef __ENABLE_NEW_QUICK_SLOT_SYSTEM__
                    pOwner->ChainNewQuickslotItem(pItem, QUICKSLOT_TYPE_ITEM, wCell);
#endif   
                }
                else
                {
                    pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, wCell, 1000);
                }
            }

            M2_DESTROY_ITEM(this);// burda
        }
        else
        {
            if (!IsDragonSoul())
            {
                m_pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, m_wCell, 1000);
            }
            M2_DESTROY_ITEM(RemoveFromCharacter());//burda
        }

        return false;
    }

    UpdatePacket();

    Save();
    return true;
}
 
Silinen birşeyi tekrar silmeye çalışıyorsun. Bunu Eklersen Null Değer Döndürürsün. Setcount fonksiyonunu attım gördüğün gibi zaten siliyor.

C++:
bool CItem::SetCount(DWORD count)
{
    if (GetType() == ITEM_ELK)
    {
        m_dwCount = std::min<DWORD>(count, INT_MAX);
    }
    else
    {
        m_dwCount = std::min<DWORD>(count, ITEM_MAX_COUNT);
    }

    if (count == 0 && m_pOwner)
    {
        if (GetSubType() == USE_ABILITY_UP || GetSubType() == USE_POTION || GetVnum() == 70020)
        {
            LPCHARACTER pOwner = GetOwner();
            WORD wCell = GetCell();

            RemoveFromCharacter();

            if (!IsDragonSoul())
            {
                LPITEM pItem = pOwner->FindSpecifyItem(GetVnum());

                if (NULL != pItem)
                {
                    pOwner->ChainQuickslotItem(pItem, QUICKSLOT_TYPE_ITEM, wCell);
#ifdef __ENABLE_NEW_QUICK_SLOT_SYSTEM__
                    pOwner->ChainNewQuickslotItem(pItem, QUICKSLOT_TYPE_ITEM, wCell);
#endif  
                }
                else
                {
                    pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, wCell, 1000);
                }
            }

            M2_DESTROY_ITEM(this);// burda
        }
        else
        {
            if (!IsDragonSoul())
            {
                m_pOwner->SyncQuickslot(QUICKSLOT_TYPE_ITEM, m_wCell, 1000);
            }
            M2_DESTROY_ITEM(RemoveFromCharacter());//burda
        }

        return false;
    }

    UpdatePacket();

    Save();
    return true;
}
Setcount un çağırıldığı obje, inv_item objesi.
Dolayısıyla item objesi bellekte durmaya devam eder.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst