Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

278 lines
8.8 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#include "cbase.h"
#include "store/tf_store_page_base.h"
//#include "store/v1/tf_store_preview_item.h"
#include "econ_item_inventory.h"
#include "store/store_viewcart.h"
#include "c_tf_freeaccount.h"
#include "rtime.h"
#include "econ_ui.h"
// memdbgon must be the last include file in a .cpp file!!!
#include <tier0/memdbgon.h>
extern const char *g_aPlayerClassNames[TF_CLASS_MENU_BUTTONS];
const char *g_szClassFilterStrings[] =
{
"", // Undefined
"#Store_Items_Scout",
"#Store_Items_Sniper",
"#Store_Items_Soldier",
"#Store_Items_Demoman",
"#Store_Items_Medic",
"#Store_Items_HWGuy",
"#Store_Items_Pyro",
"#Store_Items_Spy",
"#Store_Items_Engineer"
};
DECLARE_BUILD_FACTORY( CStorePreviewClassIcon );
ConVar tf_explanations_store( "tf_explanations_store", "0", FCVAR_ARCHIVE, "Whether the user has seen explanations for this panel." );
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CTFStorePageBase::CTFStorePageBase(Panel *parent, const CEconStoreCategoryManager::StoreCategory_t *pPageData, const char *pPreviewItemResFile ) : CStorePage(parent, pPageData, pPreviewItemResFile)
{
m_flStartExplanationsAt = 0;
// TF has an option for each class, all class items, all items, and an unowned item option. Let's make sure they all fit.
if ( m_pFilterComboBox )
{
m_pFilterComboBox->SetNumberOfEditLines( 12 );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFStorePageBase::OnPageShow( void )
{
BaseClass::OnPageShow();
// If this is the first time we've opened the store, start the armory explanations
if ( !tf_explanations_store.GetBool() && m_pPageData )
{
m_flStartExplanationsAt = engine->Time() + 0.5;
vgui::ivgui()->AddTickSignal( GetVPanel() );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFStorePageBase::OnCommand( const char *command )
{
if ( !Q_stricmp( command, "show_explanations" ) )
{
if ( !m_flStartExplanationsAt )
{
m_flStartExplanationsAt = engine->Time();
vgui::ivgui()->AddTickSignal( GetVPanel() );
}
RequestFocus();
}
else
{
BaseClass::OnCommand( command );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFStorePageBase::GetFiltersForDef( GameItemDefinition_t *pDef, CUtlVector<int> *pVecFilters )
{
pVecFilters->AddToTail( FILTER_ALL_ITEMS );
// Add item to unowned filter only if it doesn't belong to these categories.
const econ_store_entry_t *pEntry = EconUI()->GetStorePanel()->GetPriceSheet()->GetEntry( pDef->GetDefinitionIndex() );
if( !pEntry->IsListedInCategory( CEconStoreCategoryManager::k_CategoryID_Tools ) &&
!pEntry->IsListedInCategory( CEconStoreCategoryManager::k_CategoryID_Maps ) &&
!pEntry->IsListedInCategory( CEconStoreCategoryManager::k_CategoryID_Bundles ) &&
!pEntry->IsListedInCategory( CEconStoreCategoryManager::k_CategoryID_Collections ) )
{
bool bItemOwned = false;
int iCount = InventoryManager()->GetLocalInventory()->GetItemCount();
for ( int i = 0; i < iCount; i++ )
{
if ( InventoryManager()->GetLocalInventory()->GetItem( i )->GetItemDefIndex() == pDef->GetDefinitionIndex() )
{
bItemOwned = true;
break;
}
}
if ( !bItemOwned )
{
pVecFilters->AddToTail( FILTER_UNOWNED_ITEMS );
}
}
if ( pDef->CanBeUsedByAllClasses() )
pVecFilters->AddToTail( FILTER_ALLCLASS_ITEMS );
for ( int iClass = TF_FIRST_NORMAL_CLASS; iClass < TF_LAST_NORMAL_CLASS; iClass++ )
{
if ( pDef->CanBeUsedByClass( iClass ) )
pVecFilters->AddToTail( iClass );
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFStorePageBase::OnItemDetails( vgui::Panel *panel )
{
CStoreItemControlsPanel *pControlsPanel = dynamic_cast< CStoreItemControlsPanel * >( panel );
if ( pControlsPanel )
{
const econ_store_entry_t *pEntry = pControlsPanel->GetItem();
if ( pEntry )
{
SelectItemPanel( pControlsPanel->GetItemModelPanel() );
PostMessage( EconUI()->GetStorePanel(), new KeyValues("ArmoryOpened", "itemdef", pEntry->GetItemDefinitionIndex() ) );
}
}
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFStorePageBase::ShowPreview( int iClass, const econ_store_entry_t* pEntry )
{
if ( iClass < TF_FIRST_NORMAL_CLASS || iClass >= TF_LAST_NORMAL_CLASS )
{
iClass = TF_CLASS_SCOUT;
}
BaseClass::ShowPreview( iClass, pEntry );
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFStorePageBase::UpdateFilterComboBox( void )
{
if ( !m_pFilterComboBox )
return;
wchar_t wzLocalized[256];
wchar_t wszCount[16];
m_pFilterComboBox->RemoveAll();
// All items
KeyValues *pKeyValues = new KeyValues( "data" );
pKeyValues->SetInt( "filter", FILTER_ALL_ITEMS );
m_pFilterComboBox->AddItem( "#Store_ClassFilter_None", pKeyValues );
#if NEWFILTER
// All classes
int nCount = m_pPrimaryFilter->GetCountForFilterItem( FILTER_ALLCLASS_ITEMS );
if ( nCount )
{
pKeyValues->SetInt( "filter", FILTER_ALLCLASS_ITEMS );
_snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", nCount );
g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( "#Store_ClassFilter_AllClasses" ), 1, wszCount );
m_pFilterComboBox->AddItem( wzLocalized, pKeyValues );
}
// Individual classes
for ( int iClass = TF_FIRST_NORMAL_CLASS; iClass < TF_LAST_NORMAL_CLASS; iClass++ )
{
nCount = m_pPrimaryFilter->GetCountForFilterItem( iClass );
if ( !nCount )
continue;
pKeyValues->SetInt( "filter", iClass );
_snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", nCount );
g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( g_szClassFilterStrings[iClass] ), 1, wszCount );
m_pFilterComboBox->AddItem( wzLocalized, pKeyValues );
}
// Unowned item filter
nCount = m_pPrimaryFilter->GetCountForFilterItem( FILTER_UNOWNED_ITEMS );
if ( nCount )
{
pKeyValues->SetInt( "filter", FILTER_UNOWNED_ITEMS );
_snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", nCount );
g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( "#Store_Items_Unowned" ), 1, wszCount );
m_pFilterComboBox->AddItem( wzLocalized, pKeyValues );
}
#else
// All classes
if ( m_vecFilterCounts[FILTER_ALLCLASS_ITEMS] )
{
pKeyValues->SetInt( "filter", FILTER_ALLCLASS_ITEMS );
_snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", m_vecFilterCounts[FILTER_ALLCLASS_ITEMS] );
g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( "#Store_ClassFilter_AllClasses" ), 1, wszCount );
m_pFilterComboBox->AddItem( wzLocalized, pKeyValues );
}
// Individual classes
for ( int iClass = TF_FIRST_NORMAL_CLASS; iClass < TF_LAST_NORMAL_CLASS; iClass++ )
{
if ( m_vecFilterCounts[iClass] == 0 )
continue;
pKeyValues->SetInt( "filter", iClass );
_snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", m_vecFilterCounts[iClass] );
g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( g_szClassFilterStrings[iClass] ), 1, wszCount );
m_pFilterComboBox->AddItem( wzLocalized, pKeyValues );
}
// Unowned item filter
if ( m_vecFilterCounts[FILTER_UNOWNED_ITEMS] )
{
pKeyValues->SetInt( "filter", FILTER_UNOWNED_ITEMS );
_snwprintf( wszCount, ARRAYSIZE( wszCount ), L"%d", m_vecFilterCounts[FILTER_UNOWNED_ITEMS] );
g_pVGuiLocalize->ConstructString_safe( wzLocalized, g_pVGuiLocalize->Find( "#Store_Items_Unowned" ), 1, wszCount );
m_pFilterComboBox->AddItem( wzLocalized, pKeyValues );
}
#endif
pKeyValues->deleteThis();
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFStorePageBase::OnTick( void )
{
BaseClass::OnTick();
if ( m_flStartExplanationsAt && m_flStartExplanationsAt < engine->Time() )
{
m_flStartExplanationsAt = 0;
tf_explanations_store.SetValue( 1 );
CExplanationPopup *pPopup = dynamic_cast<CExplanationPopup*>( FindChildByName("StartExplanation") );
if ( pPopup )
{
pPopup->Popup();
}
}
if ( !m_flStartExplanationsAt )
{
vgui::ivgui()->RemoveTickSignal( GetVPanel() );
}
}