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; }
bool CInventory::InSlot(PIItem pIItem) const { if(pIItem->GetSlot() < m_slots.size() && m_slots[pIItem->GetSlot()].m_pIItem == pIItem) return true; return false; }
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; }
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; }
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; }
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); }
//ищем на поясе вещь для слота 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; }
//положить вещь в слот 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; }