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.

302 lines
8.9 KiB

5 years ago
//========= 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<CMsgSetItemSlotAttribute> 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; i<ARRAYSIZE( s_itemSlotCriteriaAttributes ); ++i )
{
m_itemSlots[i].m_bHasSlot = false;
if ( m_pItem->FindAttribute( 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();
}