BySadoTR60 1
BySadoTR60
VictoryasHD 1
VictoryasHD
noisiv 1
noisiv
Manwe Work 1
Manwe Work
Best Studio 1
Best Studio
romegames 1
romegames
mavzermete 1
mavzermete
Bodyguardd 1
Bodyguardd
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
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

Türkiye'nin ilk Cross-Platform OldSchool MOBİL & PC 1-99 Sunucusu Lamira2 6 Kasım'da Açılıyor! Büyük Açılışı Kaçırma HEMEN TIKLA!

[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