//положить вещь в слот 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; }
//положить вещь в слот 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; }
//положить вещь в слот 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; }