//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "item_slot_panel.h" #include "tf_item_inventory.h" #include "item_selection_panel.h" #include "tf_gcmessages.h" #include "gc_clientsystem.h" #define NUM_MAX_SLOTS 1 //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CItemSlotPanel::CItemSlotPanel( vgui::Panel *parent ) : CBaseLoadoutPanel( parent, "item_slot_panel" ) { m_pItem = NULL; m_pSelectionPanel = NULL; m_iCurrentSlotIndex = 0; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CItemSlotPanel::~CItemSlotPanel() { } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CItemSlotPanel::ApplySchemeSettings( vgui::IScheme *pScheme ) { LoadControlSettings( "Resource/UI/ItemSlotPanel.res" ); BaseClass::ApplySchemeSettings( pScheme ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CItemSlotPanel::PerformLayout( void ) { BaseClass::PerformLayout(); for ( int i = 0; i < m_pItemModelPanels.Count(); i++ ) { if ( !m_itemSlots[i].m_bHasSlot ) { m_pItemModelPanels[i]->SetVisible( false ); continue; } int iCenter = GetWide() * 0.5; int iButtonX = (i % GetNumColumns()); int iButtonY = (i / GetNumColumns()); int iXPos = (iCenter + m_iItemBackpackOffcenterX) + (iButtonX * m_pItemModelPanels[i]->GetWide()) + (m_iItemBackpackXDelta * iButtonX); int iYPos = m_iItemYPos + (iButtonY * m_pItemModelPanels[i]->GetTall() ) + (m_iItemBackpackYDelta * iButtonY); m_pItemModelPanels[i]->SetPos( iXPos, iYPos ); m_pItemModelPanels[i]->SetVisible( true ); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CItemSlotPanel::OnItemPanelMouseReleased( vgui::Panel *panel ) { CItemModelPanel *pItemPanel = dynamic_cast < CItemModelPanel * > ( panel ); if ( pItemPanel && IsVisible() ) { for ( int i = 0; i < m_pItemModelPanels.Count(); i++ ) { if ( m_pItemModelPanels[i] == pItemPanel ) { OnCommand( VarArgs("change%d", i) ); return; } } } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CItemSlotPanel::OnSelectionReturned( KeyValues *data ) { if ( data ) { uint64 ulIndex = data->GetUint64( "itemindex", INVALID_ITEM_ID ); if ( ulIndex != INVALID_ITEM_ID ) { CEconItemView *pItemData = TFInventoryManager()->GetLocalTFInventory()->GetInventoryItemByItemID( ulIndex ); if ( pItemData ) { m_pItemModelPanels[ m_iCurrentSlotIndex ]->SetItem( pItemData ); itemid_t ulOriginalID = pItemData->GetSOCData()->GetOriginalID(); m_itemSlots[ m_iCurrentSlotIndex ].m_ulOriginalID = ulOriginalID; // tell GC to update the slot attribute GCSDK::CProtoBufMsg msg( k_EMsgGC_ClientSetItemSlotAttribute ); msg.Body().set_item_id( m_pItem->GetItemID() ); msg.Body().set_slot_item_original_id( ulOriginalID ); msg.Body().set_slot_index( m_iCurrentSlotIndex + 1 ); //EconUI()->Gamestats_ItemTransaction( IE_ITEM_USED_TOOL, m_pToolModelPanel->GetItem(), "applied_upgrade_card", m_pToolModelPanel->GetItem()->GetItemDefIndex() ); GCClientSystem()->BSendMessage( msg ); } } } PostMessage( GetParent(), new KeyValues("SelectionEnded") ); // It'll have deleted itself, so we don't need to clean it up m_pSelectionPanel = NULL; OnCancelSelection(); // find the selected item and give it the focus CItemModelPanel *pSelection = GetFirstSelectedItemModelPanel( true ); if( !pSelection ) { m_pItemModelPanels[0]->SetSelected( true ); pSelection = m_pItemModelPanels[0]; } pSelection->RequestFocus(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CItemSlotPanel::OnCancelSelection( void ) { if ( m_pSelectionPanel ) { m_pSelectionPanel->SetVisible( false ); m_pSelectionPanel->MarkForDeletion(); m_pSelectionPanel = NULL; } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CItemSlotPanel::OnCommand( const char *command ) { if ( !V_stricmp( command, "ok" ) ) { SetVisible( false ); return; } else if ( V_stristr( command, "change" ) ) { const char *pszNum = command+6; if ( pszNum && pszNum[0] ) { int iSlot = atoi(pszNum); if ( iSlot >= 0 && iSlot < m_itemSlots.Count() ) { if ( m_iCurrentSlotIndex != iSlot ) { m_iCurrentSlotIndex = iSlot; } m_selectionCriteria = CItemSelectionCriteria(); m_selectionCriteria.SetTags( m_itemSlots[m_iCurrentSlotIndex].m_slotCriteriaAttribute.tags().c_str() ); m_selectionCriteria.SetIgnoreEnabledFlag( true ); // Create the selection screen. It removes itself on close. m_pSelectionPanel = new CItemCriteriaSelectionPanel( this, &m_selectionCriteria ); m_pSelectionPanel->InvalidateLayout( false, true ); // need to ApplySchemeSettings now so it doesn't override our SetDialogVariable below later m_pSelectionPanel->ShowPanel( 0, true ); m_pSelectionPanel->SetDialogVariable( "loadoutclass", g_pVGuiLocalize->Find( "#EditSlots_SelectItemPanel" ) ); PostMessage( GetParent(), new KeyValues("SelectionStarted") ); } } return; } BaseClass::OnCommand( command ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CItemSlotPanel::UpdateModelPanels( void ) { // For now, fill them out with the local player's currently wielded items for ( int i = 0; i < m_pItemModelPanels.Count(); i++ ) { CEconItemView *pItemData = TFInventoryManager()->GetLocalTFInventory()->GetInventoryItemByOriginalID( m_itemSlots[i].m_ulOriginalID ); m_pItemModelPanels[i]->SetItem( pItemData ); m_pItemModelPanels[i]->SetShowQuantity( true ); m_pItemModelPanels[i]->SetSelected( false ); SetBorderForItem( m_pItemModelPanels[i], false ); } // Now layout again to position our item buttons InvalidateLayout(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- int CItemSlotPanel::GetNumItemPanels( void ) { return NUM_MAX_SLOTS; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CItemSlotPanel::OnShowPanel( bool bVisible, bool bReturningFromArmory ) { if ( bVisible ) { if ( m_pSelectionPanel ) { m_pSelectionPanel->SetVisible( false ); m_pSelectionPanel->MarkForDeletion(); m_pSelectionPanel = NULL; } } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CItemSlotPanel::AddNewItemPanel( int iPanelIndex ) { BaseClass::AddNewItemPanel( iPanelIndex ); m_itemSlots.AddToTail(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CItemSlotPanel::SetItem( CEconItem* pItem ) { if ( !pItem ) { SetVisible( false ); return; } OnCancelSelection(); m_pItem = pItem; static CSchemaAttributeDefHandle s_itemSlotCriteriaAttributes[] = { CSchemaAttributeDefHandle( "item slot criteria 1" ), }; COMPILE_TIME_ASSERT( ARRAYSIZE( s_itemSlotCriteriaAttributes ) == NUM_MAX_SLOTS ); static CSchemaAttributeDefHandle s_itemInSlotAttributes[] = { CSchemaAttributeDefHandle( "item in slot 1" ), }; COMPILE_TIME_ASSERT( ARRAYSIZE( s_itemInSlotAttributes ) == NUM_MAX_SLOTS ); for ( int i=0; iFindAttribute( s_itemSlotCriteriaAttributes[i], &m_itemSlots[i].m_slotCriteriaAttribute ) ) { m_itemSlots[i].m_bHasSlot = true; m_itemSlots[i].m_ulOriginalID = INVALID_ITEM_ID; m_pItem->FindAttribute( s_itemInSlotAttributes[i], &m_itemSlots[i].m_ulOriginalID ); } } UpdateModelPanels(); }