bool CInventory::Ruck(PIItem pIItem, bool strict_placement) { if(!strict_placement && !CanPutInRuck(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 ruck not own item [%d], that has parent [%d]", GetOwner()->object_id(), pIItem->object_id(), real_parent); return false; } } bool in_slot = InSlot(pIItem); //вещь была в слоте if(in_slot) { if(GetActiveSlot() == pIItem->CurrSlot()) Activate(NO_ACTIVE_SLOT); m_slots[pIItem->CurrSlot()].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); if (!IsGameTypeSingle()) { u16 item_parent_id = pIItem->object().H_Parent() ? pIItem->object().H_Parent()->ID() : u16(-1) ; u16 inventory_owner_id = GetOwner()->object_id(); R_ASSERT2(item_parent_id == inventory_owner_id, make_string("! ERROR: CL: Actor[%d] tries to place to ruck not own item [%d], real item owner is [%d]", inventory_owner_id, pIItem->object_id(), item_parent_id).c_str() ); #ifdef MP_LOGGING Msg("--- Actor [%d] place to ruck item [%d]", inventory_owner_id, pIItem->object_id()); #endif } } m_ruck.insert (m_ruck.end(), pIItem); CalcTotalWeight (); InvalidateState (); m_pOwner->OnItemRuck (pIItem, pIItem->m_ItemCurrPlace); SInvItemPlace prev_place = pIItem->m_ItemCurrPlace; pIItem->m_ItemCurrPlace.type = eItemPlaceRuck; pIItem->OnMoveToRuck (prev_place); if(in_slot) pIItem->object().processing_deactivate(); return true; }
bool CInventory::Belt(PIItem pIItem, bool strict_placement) { if(!strict_placement && !CanPutInBelt(pIItem)) return false; //вещь была в слоте bool in_slot = InSlot(pIItem); if(in_slot) { if(GetActiveSlot() == pIItem->CurrSlot()) Activate(NO_ACTIVE_SLOT); m_slots[pIItem->CurrSlot()].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 (); SInvItemPlace p = pIItem->m_ItemCurrPlace; pIItem->m_ItemCurrPlace.type = eItemPlaceBelt; m_pOwner->OnItemBelt (pIItem, p); pIItem->OnMoveToBelt (p); if(in_slot) pIItem->object().processing_deactivate(); 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; }