CInventoryItemPtr CInventory::ValidateWeapon(idEntity* ent, const bool gotFromShop) // grayman (#2376) { // Sanity check if (ent == NULL) return CInventoryItemPtr(); idStr weaponName = ent->spawnArgs.GetString("inv_weapon_name"); if (weaponName.IsEmpty()) { // Not a weapon item return CInventoryItemPtr(); } // Entity has a weapon name set, check for match in our inventory // Find the weapon category CInventoryCategoryPtr weaponCategory = GetCategory(TDM_PLAYER_WEAPON_CATEGORY); if (weaponCategory == NULL) { DM_LOG(LC_INVENTORY, LT_ERROR)LOGSTRING("Could not find weapon category in inventory.\r"); return CInventoryItemPtr(); } // Look for the weapon with the given name for (int i = 0; i < weaponCategory->GetNumItems(); i++) { CInventoryWeaponItemPtr weaponItem = boost::dynamic_pointer_cast<CInventoryWeaponItem>(weaponCategory->GetItem(i)); // Is this the right weapon? (must be a melee weapon, allowed empty) if (weaponItem != NULL && weaponItem->IsAllowedEmpty() && weaponItem->GetWeaponName() == weaponName) { DM_LOG(LC_INVENTORY, LT_DEBUG)LOGSTRING("Entity %s is matching the melee weapon %s.\r", ent->name.c_str(), weaponName.c_str()); // Enable this weapon if (!gotFromShop) // grayman (#2376) { weaponItem->SetEnabled(true); } if (!ent->spawnArgs.GetBool("inv_map_start", "0") && !ent->spawnArgs.GetBool("inv_no_pickup_message", "0")) { NotifyOwnerAboutPickup( common->Translate( ent->spawnArgs.GetString("inv_name") ), weaponItem); } // We're done return weaponItem; } } DM_LOG(LC_INVENTORY, LT_DEBUG)LOGSTRING("Couldn't find a match for weapon name: %s.\r", weaponName.c_str()); return CInventoryItemPtr(); }
void CShop::AddPersistentStartingEquipment() { const CInventory &sourceInventory = *gameLocal.persistentPlayerInventory; // 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_MAINMENU, LT_DEBUG )LOGSTRING( "Item %s is not marked as persistent, won't add to shop.\r", item->GetName().c_str() ); continue; // not marked as persistent } const idDict *itemDict = item->GetSavedItemEntityDict(); if( itemDict == NULL ) { DM_LOG( LC_MAINMENU, LT_WARNING )LOGSTRING( "Item %s is marked as persistent, but has no saved item dictionary.\r", item->GetName().c_str() ); continue; } idStr className = itemDict->GetString( "classname" ); // Try to look up the corresponding shop item definition for this item's classname CShopItemPtr found = FindShopItemDefByClassName( className ); if( found == NULL ) { DM_LOG( LC_MAINMENU, LT_DEBUG )LOGSTRING( "Can't find shopitem definition for classname %s, skipping.\r", className.c_str() ); continue; } int quantity = GetQuantityForItem( item ); // Don't attempt to merge if we don't have anything to merge in the first place if( quantity == 0 ) { DM_LOG( LC_MAINMENU, LT_DEBUG )LOGSTRING( "Persistent weapon doesn't have ammo, skipping.\r", className.c_str() ); continue; } // Check if this is a weapon CInventoryWeaponItemPtr weaponItem = boost::dynamic_pointer_cast<CInventoryWeaponItem>( item ); bool isWeapon = ( weaponItem != NULL ); bool weaponIsAllowedEmpty = weaponItem ? weaponItem->IsAllowedEmpty() : false; bool itemMerged = MergeIntoStartingEquipment( className, quantity, isWeapon, weaponIsAllowedEmpty ); // Append the item to the list if it didn't contribute quantity to // an existing list item. if( !itemMerged ) { CShopItemPtr anItem( new CShopItem( *found, quantity, 0, false ) ); bool canDrop = itemDict->GetBool( "inv_droppable", "1" ); anItem->SetCanDrop( canDrop ); _startingItems.Append( anItem ); } } } }