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.
279 lines
8.3 KiB
279 lines
8.3 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose: Order window
|
||
|
//
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
#include "cbase.h"
|
||
|
#include "hud_orders.h"
|
||
|
#include "hud.h"
|
||
|
#include "c_basetfplayer.h"
|
||
|
#include "clientmode_tfnormal.h"
|
||
|
#include "VGUI_BasePanel.h"
|
||
|
#include <vgui/IScheme.h>
|
||
|
|
||
|
// memdbgon must be the last include file in a .cpp file!!!
|
||
|
#include "tier0/memdbgon.h"
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudLabel::SetSelected( bool bSelected )
|
||
|
{
|
||
|
m_bSelected = bSelected;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CHudOrderList *GetHudOrderList( void )
|
||
|
{
|
||
|
return GET_HUDELEMENT( CHudOrderList );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CHudOrder::CHudOrder( int x,int y,int wide,int tall ) : vgui::Panel( NULL, "CHudOrder")
|
||
|
{
|
||
|
SetBounds( x, y, wide, tall );
|
||
|
SetAutoDelete( false );
|
||
|
m_pOrder = NULL;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CHudOrder::~CHudOrder( void )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudOrder::Init( void )
|
||
|
{
|
||
|
SetSize( ORDERS_ELEMENT_WIDTH, ORDERS_ELEMENT_HEIGHT );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Called every frame
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudOrder::Paint( void )
|
||
|
{
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudOrder::SetOrder( C_Order *pOrder )
|
||
|
{
|
||
|
// If we had an order, tell it to clean up
|
||
|
if ( m_pOrder )
|
||
|
{
|
||
|
m_pOrder->DestroyStatus();
|
||
|
}
|
||
|
|
||
|
m_pOrder = pOrder;
|
||
|
|
||
|
// Tell the order to create it's elements
|
||
|
if ( m_pOrder )
|
||
|
{
|
||
|
m_pOrder->CreateStatus( this );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
C_Order *CHudOrder::GetOrder( void )
|
||
|
{
|
||
|
return m_pOrder;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudOrder::UpdateOrder( void )
|
||
|
{
|
||
|
if ( m_pOrder == NULL )
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Our order has been deleted.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudOrder::OrderRemoved( void )
|
||
|
{
|
||
|
m_pOrder = NULL;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudOrder::ApplySchemeSettings(vgui::IScheme *pScheme)
|
||
|
{
|
||
|
Panel::ApplySchemeSettings(pScheme);
|
||
|
|
||
|
if ( m_pOrder && m_pOrder->IsPersonalOrder() )
|
||
|
{
|
||
|
SetBgColor( GetSchemeColor("HudStatusSelectedBgColor", pScheme) );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
SetBgColor( GetSchemeColor("HudStatusBgColor", pScheme) );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//================================================================================================================
|
||
|
// LARGE STATUS PANEL.
|
||
|
//================================================================================================================
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CHudOrderList::CHudOrderList( const char *pElementName ) :
|
||
|
CHudElement( pElementName ), vgui::Panel( NULL, "HudOrderList" )
|
||
|
{
|
||
|
vgui::Panel *pParent = g_pClientMode->GetViewport();
|
||
|
SetParent( pParent );
|
||
|
|
||
|
SetPaintBackgroundEnabled( false );
|
||
|
for (int i = 0; i < MAX_HUD_ORDERS; i++)
|
||
|
{
|
||
|
m_pOrderPanels[i] = NULL;
|
||
|
m_pOrderLabels[i] = NULL;
|
||
|
}
|
||
|
|
||
|
SetHiddenBits( HIDEHUD_MISCSTATUS | HIDEHUD_PLAYERDEAD );
|
||
|
}
|
||
|
|
||
|
DECLARE_HUDELEMENT( CHudOrderList );
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CHudOrderList::~CHudOrderList( void )
|
||
|
{
|
||
|
for (int i = 0; i < MAX_HUD_ORDERS; i++)
|
||
|
{
|
||
|
if ( m_pOrderPanels[i] )
|
||
|
{
|
||
|
delete m_pOrderPanels[i];
|
||
|
delete m_pOrderLabels[i];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudOrderList::LevelInit( void )
|
||
|
{
|
||
|
SetPos( ORDERS_LEFT, ORDERS_TOP );
|
||
|
SetSize( ORDERS_WIDTH, ORDERS_HEIGHT );
|
||
|
|
||
|
for ( int i = 0; i < MAX_HUD_ORDERS; i++ )
|
||
|
{
|
||
|
m_pOrderPanels[i] = new CHudOrder( ORDERS_ELEMENT_LEFT - ORDERS_LEFT, ORDERS_ELEMENT_HEIGHT * i, ORDERS_ELEMENT_WIDTH, ORDERS_ELEMENT_HEIGHT );
|
||
|
m_pOrderPanels[i]->Init();
|
||
|
|
||
|
m_pOrderLabels[i] = new CHudLabel( NULL, "orderlabels", " " );
|
||
|
m_pOrderLabels[i]->SetBounds( 0, ORDERS_ELEMENT_HEIGHT * i, ORDERS_ELEMENT_LEFT - ORDERS_LEFT, ORDERS_ELEMENT_HEIGHT );
|
||
|
m_pOrderLabels[i]->SetContentAlignment( vgui::Label::a_northwest );
|
||
|
m_pOrderLabels[i]->SetTextInset( 4, 0 );
|
||
|
|
||
|
// Start all of them hidden
|
||
|
m_pOrderPanels[i]->SetParent( (vgui::Panel *)NULL );
|
||
|
m_pOrderLabels[i]->SetParent( (vgui::Panel *)NULL );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudOrderList::LevelShutdown( void )
|
||
|
{
|
||
|
for ( int i = 0; i < MAX_HUD_ORDERS; i++ )
|
||
|
{
|
||
|
delete m_pOrderPanels[i];
|
||
|
m_pOrderPanels[i] = NULL;
|
||
|
delete m_pOrderLabels[i];
|
||
|
m_pOrderLabels[i] = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudOrderList::OnThink( void )
|
||
|
{
|
||
|
// Call update for all active objects
|
||
|
for (int i = 0; i < MAX_HUD_ORDERS; i++)
|
||
|
{
|
||
|
if ( m_pOrderPanels[i] && m_pOrderPanels[i]->GetOrder() )
|
||
|
{
|
||
|
m_pOrderPanels[i]->UpdateOrder();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudOrderList::Paint( void )
|
||
|
{
|
||
|
// vgui::surface()->DrawSetColor( 255,0,0, 64 );
|
||
|
// vgui::surface()->DrawOutlinedRect( 0,0, GetWide(), GetTall() );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Insert the specified order into the slot
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudOrderList::InsertOrder( C_Order *pOrder, int iSlot )
|
||
|
{
|
||
|
// Personal Orders don't have selection keys
|
||
|
if ( pOrder->IsPersonalOrder() )
|
||
|
{
|
||
|
m_pOrderLabels[iSlot]->SetText("");
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Check the key binding
|
||
|
char binding[64];
|
||
|
Q_snprintf(binding, sizeof( binding ), "order %d", iSlot+1);
|
||
|
const char *pBinding = engine->Key_LookupBinding( binding );
|
||
|
if ( pBinding && strcmp(pBinding,"") )
|
||
|
{
|
||
|
m_pOrderLabels[iSlot]->SetText( pBinding );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Only insert it if it's not there already
|
||
|
if ( m_pOrderPanels[iSlot]->GetOrder() != pOrder )
|
||
|
{
|
||
|
m_pOrderPanels[iSlot]->SetOrder( pOrder );
|
||
|
m_pOrderPanels[iSlot]->SetParent( this );
|
||
|
m_pOrderLabels[iSlot]->SetParent( this );
|
||
|
m_pOrderLabels[iSlot]->SetSelected( pOrder->IsPersonalOrder() );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: We've received a new order, or a modified old one. Figure out what to do.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CHudOrderList::RecalculateOrderList( void )
|
||
|
{
|
||
|
C_BaseTFPlayer *pPlayer = C_BaseTFPlayer::GetLocalPlayer();
|
||
|
|
||
|
// Does this player have a personal order?
|
||
|
C_Order *pOrder = pPlayer->PersonalOrder();
|
||
|
if( pOrder )
|
||
|
{
|
||
|
// Highlight the selected order (and the personal order always)
|
||
|
m_pOrderPanels[0]->SetBgColor( Color( 0,0,0, 192) );
|
||
|
m_pOrderLabels[0]->SetBgColor( Color( 0,0,0, 192) );
|
||
|
}
|
||
|
}
|
||
|
|