void CInventory::PutItem(const CInventoryItemPtr& item, const idStr& categoryName) { if (item == NULL) return; CInventoryCategoryPtr category; // Check if it is the default group or not. if (categoryName.IsEmpty()) { // category is empty, assign the item to the default group category = m_Category[0]; } else { // Try to find the category with the given name category = GetCategory(categoryName); // If not found, create it if (category == NULL) { category = CreateCategory(categoryName); } } // Pack the item into the category category->PutItemFront(item); // Objective callback for non-loot items: // non-loot item passes in inv_name and individual item count, SuperGroupVal of 1 gameLocal.m_MissionData->InventoryCallback( item->GetItemEntity(), item->GetName(), item->GetCount(), 1, true ); }
bool CFrobLock::UseBy(EImpulseState impulseState, const CInventoryItemPtr& item) { if (item == NULL) return false; // Pass the call on to the master, if we have one if (GetFrobMaster() != NULL) { return GetFrobMaster()->UseBy(impulseState, item); } assert(item->Category() != NULL); // Retrieve the entity behind that item and reject NULL entities idEntity* itemEntity = item->GetItemEntity(); if (itemEntity == NULL) return false; // Get the name of this inventory category const idStr& categoryName = item->Category()->GetName(); if (categoryName == "#str_02392" && impulseState == EPressed ) // Keys { // Keys can be used on button PRESS event, let's see if the key matches if (m_UsedByName.FindIndex(itemEntity->name) != -1) { // just toggle the lock. ToggleLock(); return true; } else { FrobLockStartSound("snd_wrong_key"); return false; } } else if (categoryName == "#str_02389" ) // Lockpicks { if (!m_Lock->IsPickable()) { // Lock is not pickable DM_LOG(LC_LOCKPICK, LT_DEBUG)LOGSTRING("FrobLock %s is not pickable\r", name.c_str()); return false; } // First we check if this item is a lockpick. It has to be of correct type idStr str = itemEntity->spawnArgs.GetString("lockpick_type", ""); if (str.Length() == 1) { // greebo: Check if the item owner is a player, and if yes, // update the immobilization flags. idEntity* itemOwner = item->GetOwner(); if (itemOwner->IsType(idPlayer::Type)) { idPlayer* playerOwner = static_cast<idPlayer*>(itemOwner); playerOwner->SetImmobilization("Lockpicking", EIM_ATTACK); // Schedule an event 1/3 sec. from now, to enable weapons again after this time CancelEvents(&EV_TDM_FrobLock_ClearPlayerImmobilization); PostEventMS(&EV_TDM_FrobLock_ClearPlayerImmobilization, 300, playerOwner); } // Pass the call to the lockpick routine return m_Lock->ProcessLockpickImpulse(impulseState, static_cast<int>(str[0])); } else { gameLocal.Warning("Wrong 'lockpick_type' spawnarg for lockpicking on item %s, must be a single character.", itemEntity->name.c_str()); return false; } } return false; }