Beispiel #1
0
bool CInventory::Ruck(PIItem pIItem)
{
    if(!CanPutInRuck(pIItem)) return false;

    bool in_slot = InSlot(pIItem);
    //вещь была в слоте
    if(in_slot)
    {
        if(m_iActiveSlot == pIItem->GetSlot()) Activate(NO_ACTIVE_SLOT);
        m_slots[pIItem->GetSlot()].m_pIItem = NULL;
    }
    else
    {
        //вещь была на поясе или вообще только поднята с земли
        TIItemContainer::iterator it = std::find(m_belt.begin(), m_belt.end(), pIItem);
        if(m_belt.end() != it) m_belt.erase(it);
    }

    m_ruck.insert									(m_ruck.end(), pIItem);

    CalcTotalWeight									();
    InvalidateState									();

    m_pOwner->OnItemRuck							(pIItem, pIItem->m_eItemPlace);
    pIItem->m_eItemPlace							= eItemPlaceRuck;
    pIItem->OnMoveToRuck							();

    if(in_slot)
        pIItem->object().processing_deactivate();

    return true;
}
Beispiel #2
0
bool CInventory::InSlot(PIItem pIItem) const
{
    if(pIItem->GetSlot() < m_slots.size() &&
            m_slots[pIItem->GetSlot()].m_pIItem == pIItem)
        return true;
    return false;
}
Beispiel #3
0
bool CInventory::Belt(PIItem pIItem)
{
    if(!CanPutInBelt(pIItem))	return false;

    //вещь была в слоте
    bool in_slot = InSlot(pIItem);
    if(in_slot)
    {
        if(m_iActiveSlot == pIItem->GetSlot()) Activate(NO_ACTIVE_SLOT);
        m_slots[pIItem->GetSlot()].m_pIItem = NULL;
    }

    m_belt.insert(m_belt.end(), pIItem);

    if(!in_slot)
    {
        TIItemContainer::iterator it = std::find(m_ruck.begin(), m_ruck.end(), pIItem);
        if(m_ruck.end() != it) m_ruck.erase(it);
    }

    CalcTotalWeight();
    InvalidateState						();

    EItemPlace p = pIItem->m_eItemPlace;
    pIItem->m_eItemPlace = eItemPlaceBelt;
    m_pOwner->OnItemBelt(pIItem, p);
    pIItem->OnMoveToBelt();

    if(in_slot)
        pIItem->object().processing_deactivate();

    pIItem->object().processing_activate();

    return true;
}
Beispiel #4
0
bool CInventory::CanPutInSlot(PIItem pIItem) const
{
    if(!m_bSlotsUseful) return false;

    if( !GetOwner()->CanPutInSlot(pIItem, pIItem->GetSlot() ) ) return false;

    if(pIItem->GetSlot() < m_slots.size() &&
            m_slots[pIItem->GetSlot()].m_pIItem == NULL )
        return true;

    return false;
}
Beispiel #5
0
bool CInventory::CanPutInSlot(PIItem pIItem) const
{
	if(!m_bSlotsUseful) return false;

	if( !GetOwner()->CanPutInSlot(pIItem, pIItem->GetSlot() ) ) return false;

	if(pIItem->GetSlot() < m_slots.size() && 
	  ( m_slots[pIItem->GetSlot()].m_pIItem == NULL || 
	    m_slots[pIItem->GetSlot()].m_pIItem == pIItem ) ) // alpet: бывает странная ситуация, когда предмет сразу и в слоте, и в инвентаре
		return true;
	
	return false;
}
Beispiel #6
0
void	CUIInventoryWnd::SendEvent_ActivateSlot	(PIItem	pItem)
{
	NET_Packet						P;
	pItem->object().u_EventGen		(P, GEG_PLAYER_ACTIVATE_SLOT, pItem->object().H_Parent()->ID());
	P.w_u32							(pItem->GetSlot());
	pItem->object().u_EventSend		(P);
}
Beispiel #7
0
//ищем на поясе вещь для слота
PIItem CInventory::SameSlot(const PIItem pIItem, bool bSearchRuck) const
{
    u32 slot = pIItem->GetSlot();
    if(slot == NO_ACTIVE_SLOT) 	return NULL;

    const TIItemContainer &list = bSearchRuck ? m_ruck : m_belt;

    for(TIItemContainer::const_iterator it = list.begin(); list.end() != it; ++it)
    {
        PIItem _pIItem = *it;
        if(_pIItem != pIItem && _pIItem->GetSlot() == slot) return _pIItem;
    }

    return NULL;
}
Beispiel #8
0
//положить вещь в слот
bool CInventory::Slot(PIItem pIItem, bool bNotActivate)
{
    VERIFY(pIItem);
//	Msg("To Slot %s[%d]", *pIItem->object().cName(), pIItem->object().ID());

    if(!CanPutInSlot(pIItem))
    {
#if 0//def _DEBUG
        Msg("there is item %s[%d,%x] in slot %d[%d,%x]",
            *m_slots[pIItem->GetSlot()].m_pIItem->object().cName(),
            m_slots[pIItem->GetSlot()].m_pIItem->object().ID(),
            m_slots[pIItem->GetSlot()].m_pIItem,
            pIItem->GetSlot(),
            pIItem->object().ID(),
            pIItem);
#endif
        if(m_slots[pIItem->GetSlot()].m_pIItem == pIItem && !bNotActivate )
            Activate(pIItem->GetSlot());

        return false;
    }


    m_slots[pIItem->GetSlot()].m_pIItem = pIItem;

    //удалить из рюкзака или пояса
    TIItemContainer::iterator it = std::find(m_ruck.begin(), m_ruck.end(), pIItem);
    if(m_ruck.end() != it) m_ruck.erase(it);
    it = std::find(m_belt.begin(), m_belt.end(), pIItem);
    if(m_belt.end() != it) m_belt.erase(it);



    if (( (m_iActiveSlot==pIItem->GetSlot())||(m_iActiveSlot==NO_ACTIVE_SLOT) && m_iNextActiveSlot==NO_ACTIVE_SLOT) && (!bNotActivate))
        Activate				(pIItem->GetSlot());


    m_pOwner->OnItemSlot		(pIItem, pIItem->m_eItemPlace);
    pIItem->m_eItemPlace		= eItemPlaceSlot;
    pIItem->OnMoveToSlot		();

    pIItem->object().processing_activate();

    return						true;
}
Beispiel #9
0
//положить вещь в слот
bool CInventory::Slot(u16 slot_id, PIItem pIItem, bool bNotActivate, bool strict_placement) 
{
	VERIFY(pIItem);
	
	if(ItemFromSlot(slot_id) == pIItem)
		return false;

	if (!IsGameTypeSingle())
	{
		u16 real_parent = pIItem->object().H_Parent() ? pIItem->object().H_Parent()->ID() : u16(-1);
		if (GetOwner()->object_id() != real_parent)
		{
			Msg("! WARNING: CL: actor [%d] tries to place to slot not own item [%d], that has parent [%d]",
				GetOwner()->object_id(), pIItem->object_id(), real_parent);
			return false;
		}
	}


//.	Msg("To Slot %s[%d]", *pIItem->object().cName(), pIItem->object().ID());

	if(!strict_placement && !CanPutInSlot(pIItem,slot_id)) 
	{
#ifdef _DEBUG
		Msg("there is item %s[%d,%x] in slot %d[%d,%x]", 
				ItemFromSlot(pIItem->GetSlot())->object().cName().c_str(), 
				ItemFromSlot(pIItem->GetSlot())->object().ID(), 
				ItemFromSlot(pIItem->GetSlot()), 
				pIItem->GetSlot(), 
				pIItem->object().ID(),
				pIItem);
#endif
//.		if(m_slots[pIItem->GetSlot()].m_pIItem == pIItem && !bNotActivate )
//.			Activate(pIItem->GetSlot());

		return false;
	}

	m_slots[slot_id].m_pIItem = pIItem;
	
	//удалить из рюкзака или пояса
	TIItemContainer::iterator it_ruck = std::find(m_ruck.begin(), m_ruck.end(), pIItem);
	TIItemContainer::iterator it_belt = std::find(m_belt.begin(), m_belt.end(), pIItem);
	if (!IsGameTypeSingle())
	{
		if (it_ruck != m_ruck.end())
		{
			m_ruck.erase(it_ruck);
			R_ASSERT(it_belt == m_belt.end());
		} else if(it_belt != m_belt.end())
		{
			m_belt.erase(it_belt);
			R_ASSERT(it_ruck == m_ruck.end());
		} else
		{
			u16 real_parent = pIItem->object().H_Parent() ? pIItem->object().H_Parent()->ID() : u16(-1);
			R_ASSERT2(GetOwner()->object_id() == real_parent,
				make_string("! ERROR: CL: actor [%d] doesn't contain [%d], real parent is [%d]", 
					GetOwner()->object_id(), pIItem->object_id(), real_parent).c_str()
			);
		}
#ifdef MP_LOGGING
		Msg("--- Actor [%d] places to slot item [%d]", GetOwner()->object_id(), pIItem->object_id());
#endif //#ifdef MP_LOGGING
	} else
	{
		if (it_ruck != m_ruck.end())
			m_ruck.erase(it_ruck);
		if (it_belt != m_belt.end())
			m_belt.erase(it_belt);
	}

	bool in_slot = InSlot(pIItem);
	if(in_slot && (pIItem->CurrSlot()!=slot_id)) 
	{
		if(GetActiveSlot() == pIItem->CurrSlot()) 
			Activate(NO_ACTIVE_SLOT);

		m_slots[pIItem->CurrSlot()].m_pIItem = NULL;
	}

	if (((m_iActiveSlot==slot_id) ||(m_iActiveSlot==NO_ACTIVE_SLOT) && m_iNextActiveSlot==NO_ACTIVE_SLOT) && (!bNotActivate))
	{
#ifdef DEBUG
		Msg("---To Slot: activating slot [%d], Frame[%d]", slot_id, Device.dwFrame);
#endif // #ifdef DEBUG
		Activate				(slot_id);
	}
	SInvItemPlace p					= pIItem->m_ItemCurrPlace;
	m_pOwner->OnItemSlot			(pIItem, pIItem->m_ItemCurrPlace);
	pIItem->m_ItemCurrPlace.type	= eItemPlaceSlot;
	pIItem->m_ItemCurrPlace.slot_id = slot_id;
	pIItem->OnMoveToSlot			(p);
	
	pIItem->object().processing_activate();

	return						true;
}
Beispiel #10
0
//положить вещь в слот
bool CInventory::Slot(PIItem pIItem, bool bNotActivate) 
{
	VERIFY(pIItem);
#ifdef DEBUG
	Msg("To Slot %s[%d]", *pIItem->object().cName(), pIItem->object().ID());
#endif
	if(!CanPutInSlot(pIItem)) 
	{
#ifdef DEBUG
		Msg("there is item %s[%d,%x] in slot %d[%d,%x]", 
				*m_slots[pIItem->GetSlot()].m_pIItem->object().cName(), 
				m_slots[pIItem->GetSlot()].m_pIItem->object().ID(), 
				m_slots[pIItem->GetSlot()].m_pIItem, 
				pIItem->GetSlot(), 
				pIItem->object().ID(),
				pIItem);
#endif
		if(m_slots[pIItem->GetSlot()].m_pIItem == pIItem && !bNotActivate )
		#if defined(INV_NO_ACTIVATE_APPARATUS_SLOT)
			if (activate_slot(pIItem->GetSlot()))
		#endif
			Activate(pIItem->GetSlot());

		return false;
	}

	#if defined(INV_NEW_SLOTS_SYSTEM)
	/*
		Вещь была в слоте. Да, такое может быть :).
		Тут необходимо проверять именно так, потому что
		GetSlot вернет новый слот, а не старый. Real Wolf.

	*/
	for (u32 i = 0; i < m_slots.size(); i++)
		if (m_slots[i].m_pIItem == pIItem)
		{
			if(i == m_iActiveSlot) 
				Activate(NO_ACTIVE_SLOT);
			m_slots[i].m_pIItem = NULL;
			break;
		}
	#endif

	m_slots[pIItem->GetSlot()].m_pIItem = pIItem;
	//удалить из рюкзака или пояса
	TIItemContainer::iterator it = std::find(m_ruck.begin(), m_ruck.end(), pIItem);
	if(m_ruck.end() != it) m_ruck.erase(it);
	it = std::find(m_belt.begin(), m_belt.end(), pIItem);
	if(m_belt.end() != it) m_belt.erase(it);
 
	if (( (m_iActiveSlot==pIItem->GetSlot())||(m_iActiveSlot==NO_ACTIVE_SLOT) && m_iNextActiveSlot==NO_ACTIVE_SLOT) && (!bNotActivate))
		#if defined(INV_NO_ACTIVATE_APPARATUS_SLOT)
		if (activate_slot(pIItem->GetSlot()))
		#endif
			Activate				(pIItem->GetSlot());

	
	m_pOwner->OnItemSlot		(pIItem, pIItem->m_eItemPlace);
	pIItem->m_eItemPlace		= eItemPlaceSlot;
	pIItem->OnMoveToSlot		();
	
	pIItem->object().processing_activate();

	return						true;
}