diff --git a/src/game/server/tf/bot/tf_bot.cpp b/src/game/server/tf/bot/tf_bot.cpp index 240941a8bf0..02b04aa3b89 100644 --- a/src/game/server/tf/bot/tf_bot.cpp +++ b/src/game/server/tf/bot/tf_bot.cpp @@ -4898,9 +4898,8 @@ void CTFBot::AddItem( const char* pszItemName ) { CItemSelectionCriteria criteria; criteria.SetQuality( AE_USE_SCRIPT_VALUE ); - criteria.BAddCondition( "name", k_EOperator_String_EQ, pszItemName, true ); - CBaseEntity *pItem = ItemGeneration()->GenerateRandomItem( &criteria, WorldSpaceCenter(), vec3_angle ); + CBaseEntity *pItem = ItemGeneration()->GenerateItem( &criteria, pszItemName, WorldSpaceCenter(), vec3_angle ); if ( pItem ) { CEconItemView *pScriptItem = static_cast< CBaseCombatWeapon * >( pItem )->GetAttributeContainer()->GetItem(); diff --git a/src/game/server/tf/tf_bot_temp.cpp b/src/game/server/tf/tf_bot_temp.cpp index a058968bcd5..669bcc5aa21 100644 --- a/src/game/server/tf/tf_bot_temp.cpp +++ b/src/game/server/tf/tf_bot_temp.cpp @@ -1391,9 +1391,8 @@ void BotGenerateAndWearItem( CTFPlayer *pBot, const char *itemName ) CItemSelectionCriteria criteria; criteria.SetItemLevel( AE_USE_SCRIPT_VALUE ); criteria.SetQuality( AE_USE_SCRIPT_VALUE ); - criteria.BAddCondition( "name", k_EOperator_String_EQ, itemName, true ); - CBaseEntity *pItem = ItemGeneration()->GenerateRandomItem( &criteria, pBot->GetAbsOrigin(), vec3_angle ); + CBaseEntity *pItem = ItemGeneration()->GenerateItem( &criteria, itemName, pBot->GetAbsOrigin(), vec3_angle ); if ( pItem ) { // If it's a weapon, remove the current one, and give us this one. diff --git a/src/game/server/tf/tf_player.cpp b/src/game/server/tf/tf_player.cpp index fa944e35611..70aa9d884f6 100644 --- a/src/game/server/tf/tf_player.cpp +++ b/src/game/server/tf/tf_player.cpp @@ -5565,8 +5565,7 @@ CBaseEntity *CTFPlayer::GiveNamedItem( const char *pszName, int iSubType, const // Generate a base item of the specified type CItemSelectionCriteria criteria; criteria.SetQuality( AE_NORMAL ); - criteria.BAddCondition( "name", k_EOperator_String_EQ, pszName, true ); - pItem = ItemGeneration()->GenerateRandomItem( &criteria, GetAbsOrigin(), vec3_angle, pszName ); + pItem = ItemGeneration()->GenerateItem( &criteria, pszName, GetAbsOrigin(), vec3_angle, pszName ); } if ( pItem == NULL ) diff --git a/src/game/shared/econ/econ_entity_creation.cpp b/src/game/shared/econ/econ_entity_creation.cpp index 5b31ce645af..6b7f04128d7 100644 --- a/src/game/shared/econ/econ_entity_creation.cpp +++ b/src/game/shared/econ/econ_entity_creation.cpp @@ -56,6 +56,19 @@ CBaseEntity *CItemGeneration::GenerateItemFromDefIndex( int iDefIndex, const Vec return SpawnItem( iDefIndex, vecOrigin, vecAngles, 1, AE_UNIQUE, NULL ); } +//----------------------------------------------------------------------------- +// Purpose: Generate a item matching the specified definition index +//----------------------------------------------------------------------------- +CBaseEntity *CItemGeneration::GenerateItem( CItemSelectionCriteria *pCriteria, const char *pszItemName, const Vector &vecOrigin, const QAngle &vecAngles, const char* pszOverrideClassName ) +{ + entityquality_t iQuality; + int iChosenItem = ItemSystem()->GenerateItem( pCriteria, pszItemName, &iQuality ); + if ( iChosenItem == INVALID_ITEM_DEF_INDEX ) + return NULL; + + return SpawnItem( iChosenItem, vecOrigin, vecAngles, pCriteria->GetItemLevel(), iQuality, pszOverrideClassName ); +} + //----------------------------------------------------------------------------- // Purpose: Generate an item from the specified item data //----------------------------------------------------------------------------- diff --git a/src/game/shared/econ/econ_entity_creation.h b/src/game/shared/econ/econ_entity_creation.h index 635b0f52e7c..68bda53a102 100644 --- a/src/game/shared/econ/econ_entity_creation.h +++ b/src/game/shared/econ/econ_entity_creation.h @@ -32,6 +32,9 @@ class CItemGeneration : public CAutoGameSystem // Generate a random item matching the specified definition index CBaseEntity *GenerateItemFromDefIndex( int iDefIndex, const Vector &vecOrigin, const QAngle &vecAngles ); + // Generate a item matching the specified definition index + CBaseEntity* GenerateItem( CItemSelectionCriteria* pCriteria, const char *pszItemName, const Vector& vecOrigin, const QAngle& vecAngles, const char* pszOverrideClassName = NULL ); + // Generate an item from the specified item data CBaseEntity *GenerateItemFromScriptData( const CEconItemView *pData, const Vector &vecOrigin, const QAngle &vecAngles, const char *pszOverrideClassName ); diff --git a/src/game/shared/econ/econ_item_system.cpp b/src/game/shared/econ/econ_item_system.cpp index 91c5801f2c4..9000e4bf8e7 100644 --- a/src/game/shared/econ/econ_item_system.cpp +++ b/src/game/shared/econ/econ_item_system.cpp @@ -365,6 +365,47 @@ item_definition_index_t CEconItemSystem::GenerateRandomItem( CItemSelectionCrite return iChosenItem; } +//----------------------------------------------------------------------------- +// Purpose: Generate a item matching the specified criteria +//----------------------------------------------------------------------------- +item_definition_index_t CEconItemSystem::GenerateItem( CItemSelectionCriteria *pCriteria, const char *pszItemName, entityquality_t *outEntityQuality ) +{ + VPROF_BUDGET("CEconItemSystem::GenerateItem", "Econ"); + // First, pick a random item quality (use the one passed in first) + if ( !pCriteria->BQualitySet() ) + { + pCriteria->SetQuality( GetRandomQualityForItem() ); + } + + pCriteria->SetIgnoreEnabledFlag( true ); + + const CEconItemDefinition* pItemDef = GetItemSchema()->GetItemDefinitionByName( pszItemName ); + if ( !pItemDef ) + { + DevMsg( "CEconItemSystem::GenerateItem: Invalid item %s\n", pszItemName ); + return INVALID_ITEM_DEF_INDEX; + } + + // If we haven't specified an entity quality, we want to use the item's specified one + if ( pCriteria->GetQuality() == AE_USE_SCRIPT_VALUE ) + { + int32 iScriptQuality = pItemDef->GetQuality(); + pCriteria->SetQuality( iScriptQuality == AE_UNDEFINED ? GetRandomQualityForItem( true ) : iScriptQuality ); + } + + // If we haven't specified an item level, we want to use the item's specified one. + if ( !pCriteria->BItemLevelSet() ) + { + pCriteria->SetItemLevel( RandomInt( pItemDef->GetMinLevel(), pItemDef->GetMaxLevel() ) ); + } + + if ( outEntityQuality ) + { + *outEntityQuality = pCriteria->GetQuality(); + } + return pItemDef->GetDefinitionIndex(); +} + //----------------------------------------------------------------------------- // Purpose: Return a random quality for the item specified //----------------------------------------------------------------------------- diff --git a/src/game/shared/econ/econ_item_system.h b/src/game/shared/econ/econ_item_system.h index bb11728a87e..635ea4d7d7b 100644 --- a/src/game/shared/econ/econ_item_system.h +++ b/src/game/shared/econ/econ_item_system.h @@ -54,6 +54,9 @@ class CEconItemSystem // Select and return a random item's definition index matching the specified criteria item_definition_index_t GenerateRandomItem( CItemSelectionCriteria *pCriteria, entityquality_t *outEntityQuality ); + // Select and return a item's definition index matching the specified criteria + item_definition_index_t GenerateItem( CItemSelectionCriteria *pCriteria, const char *pszItemName, entityquality_t *outEntityQuality ); + // Select and return the base item definition index for a class's load-out slot // Note: baseitemcriteria_t is game-specific and/or may not exist! virtual item_definition_index_t GenerateBaseItem( struct baseitemcriteria_t *pCriteria ) { return INVALID_ITEM_DEF_INDEX; }