int CShop::GetQuantityForItem(const CInventoryItemPtr& item) { int quantity = item->GetPersistentCount(); // Check if this is a weapon CInventoryWeaponItemPtr weaponItem = boost::dynamic_pointer_cast<CInventoryWeaponItem>(item); bool isWeapon = (weaponItem != NULL); if (isWeapon) { // Use the ammonition for weapon items if (weaponItem->NeedsAmmo()) { quantity = weaponItem->GetAmmo(); } else { // Non-ammo weapons need to be enabled to be added quantity = weaponItem->IsEnabled() ? 1 : 0; } } return quantity; }
void CInventory::CopyPersistentItemsFrom(const CInventory& sourceInventory, idEntity* newOwner) { // Obtain the weapon category for this inventory CInventoryCategoryPtr weaponCategory = GetCategory(TDM_PLAYER_WEAPON_CATEGORY); // Cycle through all categories to add them for ( int c = 0 ; c < sourceInventory.GetNumCategories() ; ++c ) { const CInventoryCategoryPtr& category = sourceInventory.GetCategory(c); for ( int itemIdx = 0 ; itemIdx < category->GetNumItems() ; ++itemIdx ) { const CInventoryItemPtr& item = category->GetItem(itemIdx); if (item->GetPersistentCount() <= 0) { DM_LOG(LC_INVENTORY, LT_DEBUG)LOGSTRING( "Item %s is not marked as persistent, won't add to player inventory.\r", common->Translate(item->GetName().c_str())); continue; // not marked as persistent } // Check if the shop handled that item already const idDict* itemDict = item->GetSavedItemEntityDict(); if (itemDict != NULL) { CShopItemPtr shopItem = gameLocal.m_Shop->FindShopItemDefByClassName(itemDict->GetString("classname")); if ( (shopItem != NULL) && (CShop::GetQuantityForItem(item) > 0) ) { // grayman #3723 - if there's no shop in this mission, // then we can't rely on it to process this inventory item. if ( gameLocal.m_Shop->ShopExists() ) { DM_LOG(LC_INVENTORY, LT_DEBUG)LOGSTRING( "Item %s would be handled by the shop, won't add that to player inventory.\r", common->Translate(item->GetName().c_str())); continue; } } } // Is set to true if we should add this item. // For weapon items with ammo this will be set to false to prevent double-additions bool addItem = true; // Handle weapons separately, otherwise we might end up with duplicate weapon items CInventoryWeaponItemPtr weaponItem = boost::dynamic_pointer_cast<CInventoryWeaponItem>(item); if (weaponItem && weaponCategory) { // Weapon items need special consideration. For arrow-based weapons try to merge the ammo. for ( int w = 0 ; w < weaponCategory->GetNumItems() ; ++w ) { CInventoryWeaponItemPtr thisWeapon = boost::dynamic_pointer_cast<CInventoryWeaponItem>(weaponCategory->GetItem(w)); if (!thisWeapon) { continue; } if (thisWeapon->GetWeaponName() == weaponItem->GetWeaponName()) { // Prevent adding this item, we already have one addItem = false; // Found a matching weapon, does it use ammo? if (thisWeapon->NeedsAmmo()) { DM_LOG(LC_INVENTORY, LT_DEBUG)LOGSTRING( "Adding persistent ammo %d to player weapon %s.\r", weaponItem->GetAmmo(), thisWeapon->GetWeaponName().c_str()); // Add the persistent ammo count to this item thisWeapon->SetAmmo(thisWeapon->GetAmmo() + weaponItem->GetAmmo()); } else { // Doesn't need ammo, check enabled state if (weaponItem->IsEnabled() && !thisWeapon->IsEnabled()) { DM_LOG(LC_INVENTORY, LT_DEBUG)LOGSTRING( "Enabling weapon item %s as the persistent inventory contains an enabled one.\r", thisWeapon->GetWeaponName().c_str()); thisWeapon->SetEnabled(true); } } break; } } } if (addItem) { DM_LOG(LC_INVENTORY, LT_DEBUG)LOGSTRING( "Adding persistent item %s to player inventory, quantity: %d.\r", common->Translate(item->GetName().c_str()), item->GetPersistentCount()); item->SetOwner(newOwner); // Add this item to our inventory PutItem(item, item->Category()->GetName()); // If we didn't have a weapon category at this point, we should be able to get one now if (weaponItem && !weaponCategory) { weaponCategory = GetCategory(TDM_PLAYER_WEAPON_CATEGORY); } } } } }