//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // //=============================================================================// #include "cbase.h" #include "collection_crafting_panel.h" #include "cdll_client_int.h" #include "ienginevgui.h" #include "econ_item_tools.h" #include "econ_ui.h" #include #include "clientmode_tf.h" #include "softline.h" #include "drawing_panel.h" #include "tf_item_inventory.h" // memdbgon must be the last include file in a .cpp file!!! #include //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CCollectionCraftingPanel::CCollectionCraftingPanel( vgui::Panel *parent, CItemModelPanelToolTip* pTooltip ) : BaseClass( parent, "CollectionCraftingPanel" ) , m_pKVItemPanels( NULL ) , m_pModelPanel( NULL ) , m_bWaitingForGCResponse( false ) , m_bEnvelopeReadyToSend( false ) , m_pMouseOverTooltip( pTooltip ) , m_bShowing( false ) , m_bShowImmediately( false ) { ListenForGameEvent( "gameui_hidden" ); m_pSelectingItemModelPanel = NULL; m_pTradeUpContainer = new EditablePanel( this, "TradeUpContainer" ); m_pInspectPanel = new CTFItemInspectionPanel( this, "NewItemPanel" ); m_pCosmeticResultItemModelPanel = new CItemModelPanel( m_pInspectPanel, "CosmeticResultItemModelPanel" ); m_pStampPanel = new ImagePanel( this, "Stamp" ); m_pStampButton = new CExButton( this, "ApplyStampButton", "" ); EditablePanel* pPaperContainer = new EditablePanel( m_pTradeUpContainer, "PaperContainer" ); m_pOKButton = new CExButton( pPaperContainer, "OkButton", "" ); m_pNextItemButton = new CExButton( this, "NextItemButton", "" ); m_pDrawingPanel = new CDrawingPanel( this, "drawingpanel" ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CCollectionCraftingPanel::~CCollectionCraftingPanel( void ) { if ( m_hSelectionPanel ) { m_hSelectionPanel->MarkForDeletion(); } if ( m_pKVItemPanels ) { m_pKVItemPanels->deleteThis(); } } //----------------------------------------------------------------------------- void CCollectionCraftingPanel::SetItemPanelCount( ) { // only do this once if ( m_vecItemContainers.Count() != 0 ) return; const int nNumItems = GetInputItemCount(); const int nNumOutput = GetOutputItemCount(); EditablePanel* pPaperContainer = dynamic_cast( m_pTradeUpContainer->FindChildByName( "PaperContainer" ) ); if ( pPaperContainer ) { m_vecItemContainers.SetCount( nNumItems ); FOR_EACH_VEC( m_vecItemContainers, i ) { m_vecItemContainers[i] = new EditablePanel( pPaperContainer, "itemcontainer" ); } m_vecOutputItemContainers.SetCount( nNumOutput ); FOR_EACH_VEC( m_vecOutputItemContainers, i ) { m_vecOutputItemContainers[i] = new EditablePanel( pPaperContainer, "itemcontainer" ); } } } //----------------------------------------------------------------------------- void CCollectionCraftingPanel::CreateSelectionPanel() { m_hSelectionPanel = new CCollectionCraftingSelectionPanel( this ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::ApplySchemeSettings( vgui::IScheme *pScheme ) { BaseClass::ApplySchemeSettings( pScheme ); LoadControlSettings( GetResFile() ); m_pModelPanel = FindControl< CBaseModelPanel >( "ReturnModel" ); if ( m_pModelPanel ) { m_pModelPanel->SetLookAtCamera( false ); } if ( m_pDrawingPanel ) { m_pDrawingPanel->SetType( DRAWING_PANEL_TYPE_CRAFTING ); } m_pItemNamePanel = m_pInspectPanel->FindControl< CItemModelPanel >( "ItemName" ); Assert( m_pItemNamePanel ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::ApplySettings( KeyValues *inResourceData ) { BaseClass::ApplySettings( inResourceData ); KeyValues *pItemKV = inResourceData->FindKey( "ItemContainerKV" ); if ( pItemKV ) { if ( m_pKVItemPanels ) { m_pKVItemPanels->deleteThis(); } m_pKVItemPanels = new KeyValues("ItemContainerKV"); pItemKV->CopySubkeys( m_pKVItemPanels ); } m_vecImagePanels.Purge(); m_vecItemPanels.Purge(); KeyValues *pBoxTopsKV = inResourceData->FindKey( "BoxTops" ); if ( pBoxTopsKV ) { m_vecBoxTopNames.Purge(); FOR_EACH_VALUE( pBoxTopsKV, pValue ) { m_vecBoxTopNames.AddToTail( pValue->GetString() ); } } Assert( m_vecBoxTopNames.Count() ); KeyValues *pStampNames = inResourceData->FindKey( "stampimages" ); if ( pStampNames ) { m_vecStampNames.Purge(); FOR_EACH_VALUE( pStampNames, pValue ) { m_vecStampNames.AddToTail( pValue->GetString() ); } } Assert( m_vecStampNames.Count() ); KeyValues *pResulStrings = inResourceData->FindKey( "resultstring" ); if ( pResulStrings ) { m_vecResultStrings.Purge(); FOR_EACH_VALUE( pResulStrings, pValue ) { m_vecResultStrings.AddToTail( pValue->GetString() ); } } Assert( m_vecResultStrings.Count() ); KeyValues *pLocalizedPanelNames = inResourceData->FindKey( "localizedpanels" ); if ( pLocalizedPanelNames ) { m_vecLocalizedPanels.Purge(); FOR_EACH_TRUE_SUBKEY( pLocalizedPanelNames, pValue ) { m_vecLocalizedPanels.AddToTail( { pValue->GetString( "panelname" ), pValue->GetBool( "show_for_english", false ) } ); } } CreateItemPanels(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::PerformLayout() { BaseClass::PerformLayout(); if ( m_pModelPanel ) { m_pModelPanel->SetMDL( "models/player/items/crafting/mannco_crate_tradeup.mdl" ); } FOR_EACH_VEC( m_vecItemContainers, i ) { m_vecItemContainers[ i ]->SetPos( m_iButtonsStartX + m_iButtonsStepX * ( i % 5 ) , m_iButtonsStartY + m_iButtonsStepY * ( i / 5 ) ); } FOR_EACH_VEC( m_vecOutputItemContainers, i ) { m_vecOutputItemContainers[i]->SetPos( m_iOutputItemStartX + m_iOutputItemStepX * ( i % 5 ) , m_iOutputItemStartY + m_iOutputItemStepY * ( i / 5 ) ); } if ( steamapicontext && steamapicontext->SteamApps() ) { char uilanguage[ 64 ]; uilanguage[0] = 0; engine->GetUILanguage( uilanguage, sizeof( uilanguage ) ); ELanguage language = PchLanguageToELanguage( uilanguage ); FOR_EACH_VEC( m_vecLocalizedPanels, i ) { bool bShow = language == k_Lang_English && m_vecLocalizedPanels[ i ].m_bShowForEnglish; Panel* pPanel = m_pTradeUpContainer->FindChildByName( m_vecLocalizedPanels[ i ].m_strPanel, true ); if ( pPanel ) { pPanel->SetVisible( bShow ); } } } UpdateOKButton(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::CreateItemPanels() { SetItemPanelCount(); m_vecImagePanels.SetCount( m_vecItemContainers.Count() ); m_vecItemPanels.SetCount( m_vecItemContainers.Count() ); FOR_EACH_VEC( m_vecItemContainers, i ) { m_vecItemContainers[ i ]->ApplySettings( m_pKVItemPanels ); m_vecImagePanels[ i ] = m_vecItemContainers[ i ]->FindControl< ImagePanel >( "imagepanel" ); m_vecItemPanels[ i ] = m_vecItemContainers[ i ]->FindControl< CItemModelPanel >( "itempanel" ); m_vecItemPanels[ i ]->SetActAsButton( true, true ); m_vecItemPanels[ i ]->SetTooltip( m_pMouseOverTooltip, "" ); CExButton* pButton = m_vecItemContainers[ i ]->FindControl< CExButton >( "BackgroundButton" ); if ( pButton ) { pButton->SetCommand( CFmtStr( "select%d", i ) ); pButton->AddActionSignalTarget( this ); } } m_vecOutputImagePanels.SetCount( m_vecOutputItemContainers.Count() ); m_vecOutputItemPanels.SetCount( m_vecOutputItemContainers.Count() ); FOR_EACH_VEC( m_vecOutputItemContainers, i ) { m_vecOutputItemContainers[i]->ApplySettings( m_pKVItemPanels ); m_vecOutputImagePanels[i] = m_vecOutputItemContainers[i]->FindControl< ImagePanel >( "imagepanel" ); m_vecOutputItemPanels[i] = m_vecOutputItemContainers[i]->FindControl< CItemModelPanel >( "itempanel" ); m_vecOutputItemPanels[i]->SetTooltip( m_pMouseOverTooltip, "" ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::OnCommand( const char *command ) { if ( !Q_stricmp( command, "reloadscheme" ) ) { InvalidateLayout( false, true ); return; } if ( FStrEq( "doneselectingitems", command ) ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "CollectionCrafting_LetterStart" ); m_bEnvelopeReadyToSend = false; if ( m_vecStampNames.Count() ) { m_pStampPanel->SetImage( m_vecStampNames[ RandomInt( 0, m_vecStampNames.Count() - 1 ) ] ); } return; } else if ( FStrEq( "cancel", command ) ) { SetVisible( false ); return; } else if ( Q_strnicmp( "select", command, 6 ) == 0 ) { SelectPanel( atoi( command + 6 ) ); return; } else if ( FStrEq( "envelopesend", command ) ) { GCSDK::CProtoBufMsg msg( k_EMsgGCCraftCollectionUpgrade ); // Construct message FOR_EACH_VEC( m_vecItemPanels, i ) { if ( m_vecItemPanels[ i ]->GetItem() == NULL ) return; msg.Body().add_item_id( m_vecItemPanels[ i ]->GetItem()->GetItemID() ); } // Send if off GCClientSystem()->BSendMessage( msg ); m_bWaitingForGCResponse = true; m_nFoundItemID.Purge(); m_timerResponse.Start( 5.f ); g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "CollectionCrafting_LetterSend" ); return; } else if ( FStrEq( "placestamp", command ) ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "CollectionCrafting_PlaceStamp" ); return; } else if( Q_strnicmp( "playcratesequence", command, 17 ) == 0 ) { m_pModelPanel->SetSequence( atoi( command + 17 ), true ); return; } else if( FStrEq( "itemget", command ) ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "CollectionCrafting_ItemRecieved" ); wchar_t *pszLocalized = NULL; // if ( m_eEconItemOrigin == kEconItemOrigin_FoundInCrate ) { pszLocalized = g_pVGuiLocalize->Find( "#NewItemMethod_FoundInCrate" ); } else if ( m_vecResultStrings.Count() ) { pszLocalized = g_pVGuiLocalize->Find( m_vecResultStrings[ RandomInt( 0, m_vecResultStrings.Count() - 1 ) ] ); } m_pInspectPanel->SetDialogVariable( "resultstring", pszLocalized ); return; } else if( Q_strnicmp( "playsound", command, 9 ) == 0 ) { vgui::surface()->PlaySound( command + 10 ); return; } else if( FStrEq( "startexplanation1", command ) ) { CExplanationPopup *pPopup = dynamic_cast( FindChildByName("StartExplanation") ); if ( pPopup ) { pPopup->Popup(); } return; } else if( FStrEq( "startexplanation2", command ) ) { CExplanationPopup *pPopup = dynamic_cast( FindChildByName("SigningExplanation") ); if ( pPopup ) { pPopup->Popup(); } return; } else if ( FStrEq( "nextitem", command ) ) { if ( m_nFoundItemID.Count() > 1 ) { // Remove head, reset timer to drop next item m_nFoundItemID.Remove( 0 ); m_timerResponse.Start( 5.f ); m_bShowImmediately = true; } } else if( FStrEq( "reload", command ) ) { g_pVGuiLocalize->ReloadLocalizationFiles(); InvalidateLayout( false, true ); SetVisible( true ); return; } BaseClass::OnCommand( command ); } void CCollectionCraftingPanel::SelectPanel( int nPanel ) { m_pSelectingItemModelPanel = m_vecItemPanels[ nPanel ]; CCopyableUtlVector< const CEconItemView* > vecCurrentItems; FOR_EACH_VEC( m_vecItemPanels, i ) { if ( m_vecItemPanels[ i ]->GetItem() ) { vecCurrentItems.AddToTail( m_vecItemPanels[ i ]->GetItem() ); } } if ( !m_hSelectionPanel ) { CreateSelectionPanel(); m_hSelectionPanel->SetAutoDelete( false ); } if ( m_hSelectionPanel ) { // Clicked on an item in the crafting area. Open up the selection panel. m_hSelectionPanel->SetCorrespondingItems( vecCurrentItems ); m_hSelectionPanel->ShowDuplicateCounts( true ); m_hSelectionPanel->ShowPanel( 0, true ); m_hSelectionPanel->SetCaller( this ); m_hSelectionPanel->SetZPos( GetZPos() + 1 ); } } void CCollectionCraftingPanel::FireGameEvent( IGameEvent *event ) { if ( FStrEq( event->GetName(), "gameui_hidden" ) ) { SetVisible( false ); return; } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::OnItemPanelMousePressed( vgui::Panel *panel ) { CItemModelPanel *pItemPanel = dynamic_cast < CItemModelPanel * > ( panel ); if ( pItemPanel && IsVisible() && !pItemPanel->IsGreyedOut() ) { auto idx = m_vecItemPanels.Find( pItemPanel ); if ( idx != m_vecItemPanels.InvalidIndex() ) { OnCommand( CFmtStr( "select%d", idx ) ); } } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::OnSelectionReturned( KeyValues *data ) { Assert( m_pSelectingItemModelPanel ); m_hSelectionPanel->SetVisible( false ); if ( data && m_pSelectingItemModelPanel ) { uint64 ulIndex = data->GetUint64( "itemindex", INVALID_ITEM_ID ); CEconItemView* pSelectedItem = InventoryManager()->GetLocalInventory()->GetInventoryItemByItemID( ulIndex ); if ( pSelectedItem ) { vgui::surface()->PlaySound( "ui/trade_up_apply_sticker.wav" ); } auto idx = m_vecItemPanels.Find( m_pSelectingItemModelPanel ); SetItem( pSelectedItem, idx ); } m_pSelectingItemModelPanel = NULL; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::UpdateOKButton() { bool bOKEnabled = true; FOR_EACH_VEC( m_vecItemPanels, i ) { bOKEnabled &= m_vecItemPanels[ i ]->GetItem() != NULL; } m_pOKButton->SetEnabled( bOKEnabled ); if ( bOKEnabled ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( m_pOKButton->GetParent(), "CollectionCrafting_OKBlink" ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::SetVisible( bool bVisible ) { BaseClass::SetVisible( bVisible ); if ( bVisible ) { m_pInspectPanel->SetVisible( false ); EditablePanel* pDimmer = FindControl< EditablePanel >( "Dimmer" ); if ( pDimmer ) { pDimmer->SetAlpha( 0 ); } EditablePanel* pBG = FindControl< EditablePanel >( "BG" ); if ( pBG ) { pBG->SetPos( pBG->GetXPos(), GetTall() ); } m_pTradeUpContainer->SetVisible( true ); m_pTradeUpContainer->SetPos( m_pTradeUpContainer->GetXPos(), -700 ); g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "CollectionCrafting_Intro" ); vgui::surface()->PlaySound( "ui/trade_up_panel_slide.wav" ); m_pDrawingPanel->ClearLines( GetLocalPlayerIndex() ); } else { if ( m_hSelectionPanel ) { m_hSelectionPanel->SetVisible( false ); } if ( m_bShowing ) { EconUI()->SetPreventClosure( false ); } m_bShowing = false; } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::SOCreated( const CSteamID & steamIDOwner, const GCSDK::CSharedObject *pObject, GCSDK::ESOCacheEvent eEvent ) { tmZone( TELEMETRY_LEVEL0, TMZF_NONE, "%s", __FUNCTION__ ); if ( m_bWaitingForGCResponse ) { if( pObject->GetTypeID() != CEconItem::k_nTypeID ) return; CEconItem *pItem = (CEconItem *)pObject; if ( IsUnacknowledged( pItem->GetInventoryToken() ) && ( pItem->GetOrigin() == m_eEconItemOrigin ) ) { //Assert( m_nFoundItemID == INVALID_ITEM_ID ); //m_bWaitingForGCResponse = false; m_nFoundItemID.AddToTail( pItem->GetItemID() ); CEconItemView* pNewEconItemView = InventoryManager()->GetLocalInventory()->GetInventoryItemByItemID( pItem->GetItemID() ); if ( pNewEconItemView ) { // Acknowledge the item InventoryManager()->AcknowledgeItem( pNewEconItemView, true ); InventoryManager()->SaveAckFile(); } } } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::Show( CUtlVector< const CEconItemView* >& vecStartingItems ) { FOR_EACH_VEC( m_vecItemPanels, i ) { const CEconItemView* pItem = i < vecStartingItems.Count() ? vecStartingItems[ i ] : NULL; SetItem( pItem, i ); } m_bShowing = true; EconUI()->SetPreventClosure( true ); SetVisible( true ); m_eEconItemOrigin = kEconItemOrigin_TradeUp; } //----------------------------------------------------------------------------- void CCollectionCraftingPanel::SetWaitingForItem( eEconItemOrigin eOrigin ) { // Clear Panels FOR_EACH_VEC( m_vecItemPanels, i ) { SetItem( NULL, i ); } m_bShowing = true; EconUI()->SetPreventClosure( true ); m_pInspectPanel->SetVisible( false ); EditablePanel* pDimmer = FindControl< EditablePanel >( "Dimmer" ); if ( pDimmer ) { pDimmer->SetAlpha( 0 ); } EditablePanel* pBG = FindControl< EditablePanel >( "BG" ); if ( pBG ) { pBG->SetPos( pBG->GetXPos(), GetTall() ); } m_pTradeUpContainer->SetVisible( false ); // reset m_pInspectPanel->SetItemCopy( NULL ); m_pCosmeticResultItemModelPanel->SetItem( NULL ); // Do not use Derived SetVisible since it does extra animations we do not want here BaseClass::SetVisible( true ); m_eEconItemOrigin = eOrigin; m_bWaitingForGCResponse = true; m_nFoundItemID.Purge(); m_timerResponse.Start( 5.f ); g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "CollectionCrafting_WaitForItemsOnly" ); return; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::SetItem( const CEconItemView* pItem, int nIndex ) { if ( nIndex != m_vecItemPanels.InvalidIndex() ) { m_vecImagePanels[ nIndex ]->SetVisible( pItem != NULL ); m_vecItemPanels[ nIndex ]->SetVisible( pItem != NULL ); m_vecItemPanels[ nIndex ]->SetItem( pItem ); if ( pItem && m_vecBoxTopNames.Count() ) { CUniformRandomStream randomStream; randomStream.SetSeed( pItem->GetItemID() ); m_vecImagePanels[ nIndex ]->SetImage( m_vecBoxTopNames[ randomStream.RandomInt( 0, m_vecBoxTopNames.Count() - 1 ) ] ); } } UpdateOKButton(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCollectionCraftingPanel::OnThink() { BaseClass::OnThink(); const float flSoonestAirDropTime = 2.f; if ( m_timerResponse.HasStarted() ) { // Elapsed is bad. This means the item server didnt get back to us if ( m_timerResponse.IsElapsed() ) { m_nFoundItemID.Purge(); m_bWaitingForGCResponse = false; m_timerResponse.Invalidate(); g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "CollectionCrafting_HideWaiting" ); g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "CollectionCrafting_ShowFailure" ); } else if ( m_timerResponse.GetElapsedTime() > flSoonestAirDropTime || m_bShowImmediately ) { m_bShowImmediately = false; // At 2 seconds we want to either show that we're still waiting, or show the item if ( m_nFoundItemID.Count() > 0 ) { OnCommand( "itemget" ); m_timerResponse.Invalidate(); g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "CollectionCrafting_HideWaiting" ); // Setup the item in the panel CEconItemView* pNewEconItemView = InventoryManager()->GetLocalInventory()->GetInventoryItemByItemID( m_nFoundItemID[0] ); if ( pNewEconItemView ) { static CSchemaAttributeDefHandle pAttrib_WeaponAllowInspect( "weapon_allow_inspect" ); if ( pNewEconItemView->FindAttribute( pAttrib_WeaponAllowInspect ) ) { m_pInspectPanel->SetItemCopy( pNewEconItemView ); m_pInspectPanel->SetSpecialAttributesOnly( true ); m_pCosmeticResultItemModelPanel->SetItem( NULL ); } else //( IsMiscSlot( pNewEconItemView->GetStaticData()->GetDefaultLoadoutSlot() ) ) { m_pCosmeticResultItemModelPanel->SetItem( pNewEconItemView ); m_pCosmeticResultItemModelPanel->SetNameOnly( false ); m_pInspectPanel->SetSpecialAttributesOnly( true ); m_pInspectPanel->SetItemCopy( NULL ); } // Acknowledge the item InventoryManager()->AcknowledgeItem( pNewEconItemView, true ); InventoryManager()->SaveAckFile(); if ( m_pItemNamePanel ) { m_pItemNamePanel->SetItem( pNewEconItemView ); } } m_bWaitingForGCResponse = false; // only show if more then 1 item in queue m_pNextItemButton->SetVisible( m_nFoundItemID.Count() > 1 ); } else { // Say that we're waiting g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "CollectionCrafting_ShowWaiting" ); } } } bool bEnvelopReadyToSendThisFrame = true; // They need to have drawn a little bit bEnvelopReadyToSendThisFrame &= m_pDrawingPanel->GetLines( GetLocalPlayerIndex() ).Count() > 10; // And placed a stamp bEnvelopReadyToSendThisFrame &= m_pStampPanel->IsVisible(); // Show the send button? if ( bEnvelopReadyToSendThisFrame && !m_bEnvelopeReadyToSend ) { g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "CollectionCrafting_ShowSendButton" ); } m_bEnvelopeReadyToSend = bEnvelopReadyToSendThisFrame; } //* ************************************************************************************************************************************** // Stat Clock Crafting //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CCraftCommonStatClockPanel::CCraftCommonStatClockPanel( vgui::Panel *parent, CItemModelPanelToolTip* pTooltip ) : BaseClass( parent, pTooltip ) { } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CCraftCommonStatClockPanel::~CCraftCommonStatClockPanel( void ) { } //----------------------------------------------------------------------------- void CCraftCommonStatClockPanel::Show( CUtlVector< const CEconItemView* >& vecStartingItems ) { BaseClass::Show( vecStartingItems ); // Create output static CSchemaItemDefHandle pItemDef_CommonStatClock( "Common Stat Clock" ); m_outputItem.SetItemDefIndex( pItemDef_CommonStatClock->GetDefinitionIndex() ); m_outputItem.SetItemQuality( AE_UNIQUE ); // Unique by default m_outputItem.SetItemLevel( 0 ); // Hide this? m_outputItem.SetItemID( 0 ); m_outputItem.SetInitialized( true ); m_vecOutputImagePanels[0]->SetVisible( true ); m_vecOutputItemPanels[0]->SetVisible( true ); m_vecOutputItemPanels[0]->SetItem( &m_outputItem ); if ( m_vecBoxTopNames.Count() ) { CUniformRandomStream randomStream; randomStream.SetSeed( 0 ); m_vecOutputImagePanels[0]->SetImage( m_vecBoxTopNames[randomStream.RandomInt( 0, m_vecBoxTopNames.Count() - 1 )] ); } } //----------------------------------------------------------------------------- void CCraftCommonStatClockPanel::CreateSelectionPanel() { CStatClockCraftingSelectionPanel *pSelectionPanel = new CStatClockCraftingSelectionPanel( this ); m_hSelectionPanel = (CCollectionCraftingSelectionPanel*)pSelectionPanel; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CCraftCommonStatClockPanel::OnCommand( const char *command ) { if ( FStrEq( "envelopesend", command ) ) { GCSDK::CProtoBufMsg msg( k_EMsgGCCraftCommonStatClock ); // Find out if the user owns this item or not and place in the proper bucket CPlayerInventory *pLocalInv = TFInventoryManager()->GetLocalInventory(); if ( !pLocalInv ) return; FOR_EACH_VEC( m_vecItemPanels, i ) { if ( m_vecItemPanels[i]->GetItem() == NULL ) return; msg.Body().add_item_id( m_vecItemPanels[i]->GetItem()->GetItemID() ); } // Send if off GCClientSystem()->BSendMessage( msg ); m_bWaitingForGCResponse = true; m_nFoundItemID.Purge(); m_timerResponse.Start( 5.f ); g_pClientMode->GetViewportAnimationController()->StartAnimationSequence( this, "CollectionCrafting_LetterSend" ); return; } BaseClass::OnCommand( command ); }