Ejemplo n.º 1
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;
}
Ejemplo n.º 2
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;
}
Ejemplo n.º 3
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;
}