Exemple #1
0
void CInventory::Update()
{
    bool bActiveSlotVisible;

    if(m_iActiveSlot == NO_ACTIVE_SLOT ||
            !m_slots[m_iActiveSlot].m_pIItem ||
            m_slots[m_iActiveSlot].m_pIItem->IsHidden())
    {
        bActiveSlotVisible = false;
    }
    else
    {
        bActiveSlotVisible = true;
    }

    if(m_iNextActiveSlot != m_iActiveSlot && !bActiveSlotVisible)
    {
        if(m_iNextActiveSlot != NO_ACTIVE_SLOT &&
                m_slots[m_iNextActiveSlot].m_pIItem)
            m_slots[m_iNextActiveSlot].m_pIItem->Activate();

        m_iActiveSlot = m_iNextActiveSlot;
    }

    //проверить рюкзак и пояс, есть ли вещи, которые нужно выкинуть
    u32		drop_count = 0;
    for		(int i = 0; i < 2; ++i)	{
        TIItemContainer &list = i?m_ruck:m_belt;
        TIItemContainer::iterator it = list.begin();

        while(list.end() != it)
        {
            PIItem pIItem = *it;
//			Msg("-- %s [%d]", pIItem->Name(), pIItem->object().ID());
            R_ASSERT(pIItem);
            if( pIItem->GetDrop() )
            {
                pIItem->SetDrop(FALSE);
                if(pIItem->object().H_Parent())	{
                    NET_Packet P;
                    pIItem->object().u_EventGen(P, GE_OWNERSHIP_REJECT,
                                                pIItem->object().H_Parent()->ID());
                    P.w_u16(u16(pIItem->object().ID()));
                    if (OnServer()) pIItem->object().u_EventSend(P);
                }
                else
                    m_drop_tasks.push_back(pIItem);
            }
            ++it;
        }
    }

    //проверить слоты
    for(u32 i=0; i<(int)m_slots.size(); ++i)	{
        PIItem pIItem = m_slots[i].m_pIItem;

        if(pIItem && pIItem->GetDrop())	{
            pIItem->SetDrop		(FALSE);

            if(pIItem->object().H_Parent())
            {
                NET_Packet P;
                pIItem->object().u_EventGen(P, GE_OWNERSHIP_REJECT,
                                            pIItem->object().H_Parent()->ID());
                P.w_u16(u16(pIItem->object().ID()));
                if (OnServer()) pIItem->object().u_EventSend(P);
            }
            else
                m_drop_tasks.push_back	(pIItem);
        }
    }
    while	(m_drop_tasks.size())	{
        drop_count			= Drop(&m_drop_tasks.back()->object()) ? drop_count + 1 : drop_count;
        m_drop_tasks.pop_back	();
    }

    if (m_drop_last_frame)
    {
        m_drop_last_frame = false;
        m_pOwner->OnItemDropUpdate	();
    }
}