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.
220 lines
6.4 KiB
220 lines
6.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $Workfile: $ |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#include "cbase.h" |
|
#include "CommanderOverlay.h" |
|
#include "utlsymbol.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Singleton class responsible for managing overlay elements |
|
//----------------------------------------------------------------------------- |
|
|
|
class CHudCommanderOverlayMgrImp : public IHudCommanderOverlayMgr |
|
{ |
|
public: |
|
// constructor, destructor |
|
CHudCommanderOverlayMgrImp(); |
|
virtual ~CHudCommanderOverlayMgrImp(); |
|
|
|
// Call this when the game starts up + shuts down |
|
virtual void GameInit(); |
|
virtual void GameShutdown(); |
|
|
|
// Call this when the level starts up + shuts down |
|
virtual void LevelInit( ); |
|
virtual void LevelShutdown(); |
|
|
|
// add an overlay element to the commander mode |
|
virtual OverlayHandle_t AddOverlay( char const* pOverlayName, C_BaseEntity* pEntity, vgui::Panel *pParent ); |
|
|
|
// removes a particular overlay |
|
virtual void RemoveOverlay( OverlayHandle_t handle ); |
|
|
|
// Call this once a frame... |
|
virtual void Tick( ); |
|
|
|
// Call this when commander mode is enabled or disabled |
|
virtual void Enable( bool enable ); |
|
|
|
private: |
|
struct OverlayPanel_t |
|
{ |
|
unsigned short m_Team; |
|
CUtlSymbol m_Name; |
|
vgui::Panel *m_pPanel; |
|
vgui::Panel *m_pParentPanel; |
|
EHANDLE m_hEntity; |
|
}; |
|
|
|
// Create, destroy panels |
|
void CreatePanel( int overlay ); |
|
void DestroyPanel( int overlay ); |
|
|
|
// No copy constructor |
|
CHudCommanderOverlayMgrImp( const CHudCommanderOverlayMgrImp& ); |
|
|
|
// List of actual overlays currently in service |
|
// Linked list used so handle ids don't change |
|
CUtlLinkedList< OverlayPanel_t, unsigned short > m_Overlays; |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Returns the singleton commander overlay interface |
|
//----------------------------------------------------------------------------- |
|
IHudCommanderOverlayMgr* HudCommanderOverlayMgr() |
|
{ |
|
static CHudCommanderOverlayMgrImp s_OverlayImp; |
|
return &s_OverlayImp; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// constructor, destructor |
|
//----------------------------------------------------------------------------- |
|
CHudCommanderOverlayMgrImp::CHudCommanderOverlayMgrImp() |
|
{ |
|
} |
|
|
|
CHudCommanderOverlayMgrImp::~CHudCommanderOverlayMgrImp() |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Call this when the game starts up or shuts down... |
|
//----------------------------------------------------------------------------- |
|
#define OVERLAY_FILE "scripts/commander_overlays.txt" |
|
|
|
void CHudCommanderOverlayMgrImp::GameInit() |
|
{ |
|
// Read in all overlay metaclasses... |
|
PanelMetaClassMgr()->LoadMetaClassDefinitionFile( OVERLAY_FILE ); |
|
} |
|
|
|
void CHudCommanderOverlayMgrImp::GameShutdown() |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Call this when the level starts up + shuts down |
|
//----------------------------------------------------------------------------- |
|
void CHudCommanderOverlayMgrImp::LevelInit( ) |
|
{ |
|
} |
|
|
|
|
|
void CHudCommanderOverlayMgrImp::LevelShutdown() |
|
{ |
|
// Remove all panels.... |
|
for( unsigned short i = m_Overlays.Head(); i != m_Overlays.InvalidIndex(); i = m_Overlays.Next(i) ) |
|
{ |
|
DestroyPanel(i); |
|
} |
|
m_Overlays.RemoveAll(); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Create, destroy panel... |
|
//----------------------------------------------------------------------------- |
|
void CHudCommanderOverlayMgrImp::CreatePanel( int overlay ) |
|
{ |
|
Assert( m_Overlays.IsValidIndex(overlay) ); |
|
OverlayPanel_t& panel = m_Overlays[overlay]; |
|
|
|
// Chain keyvalues with name Team# |
|
char pTeamName[6] = "Team "; |
|
pTeamName[4] = '0' + panel.m_Team; |
|
|
|
vgui::Panel *pPanel = PanelMetaClassMgr()->CreatePanelMetaClass( |
|
panel.m_Name.String(), 0, panel.m_hEntity.Get(), panel.m_pParentPanel, pTeamName ); |
|
m_Overlays[overlay].m_pPanel = pPanel; |
|
} |
|
|
|
void CHudCommanderOverlayMgrImp::DestroyPanel( int overlay ) |
|
{ |
|
Assert( m_Overlays.IsValidIndex(overlay) ); |
|
OverlayPanel_t& panel = m_Overlays[overlay]; |
|
if (panel.m_pPanel) |
|
{ |
|
PanelMetaClassMgr()->DestroyPanelMetaClass( panel.m_pPanel ); |
|
m_Overlays[overlay].m_pPanel = NULL; |
|
} |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// add an overlay element to the commander mode |
|
//----------------------------------------------------------------------------- |
|
OverlayHandle_t CHudCommanderOverlayMgrImp::AddOverlay( |
|
char const* pOverlayInstance, C_BaseEntity* pEntity, vgui::Panel *pParent ) |
|
{ |
|
OverlayPanel_t newPanel; |
|
newPanel.m_Name = pOverlayInstance; |
|
newPanel.m_pPanel = NULL; |
|
newPanel.m_Team = (unsigned short)~0; |
|
newPanel.m_hEntity = pEntity; |
|
newPanel.m_pParentPanel = pParent; |
|
return m_Overlays.AddToTail( newPanel ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// removes a particular overlay |
|
//----------------------------------------------------------------------------- |
|
void CHudCommanderOverlayMgrImp::RemoveOverlay( OverlayHandle_t handle ) |
|
{ |
|
if ((handle == OVERLAY_HANDLE_INVALID) || (!m_Overlays.IsValidIndex(handle)) ) |
|
return; |
|
|
|
// Deallocate the panel |
|
DestroyPanel( handle ); |
|
|
|
// Remove it from our list |
|
m_Overlays.Remove( handle ); |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// make our sprites visible when we are enabled |
|
//----------------------------------------------------------------------------- |
|
void CHudCommanderOverlayMgrImp::Enable( bool enable ) |
|
{ |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Call this once a frame... |
|
//----------------------------------------------------------------------------- |
|
void CHudCommanderOverlayMgrImp::Tick( ) |
|
{ |
|
if ( !engine->IsInGame() ) |
|
return; |
|
|
|
// Iterate through all overlays |
|
for( unsigned short i = m_Overlays.Head(); i != m_Overlays.InvalidIndex(); i = m_Overlays.Next(i) ) |
|
{ |
|
// Kill panels attached to dead entities... |
|
if (!m_Overlays[i].m_hEntity) |
|
{ |
|
DestroyPanel( i ); |
|
continue; |
|
} |
|
|
|
// make sure the panels are up-to-date based on current entity team |
|
if (m_Overlays[i].m_Team != m_Overlays[i].m_hEntity->GetTeamNumber()) |
|
{ |
|
// Destroy the old team panel, create the new team panel |
|
DestroyPanel( i ); |
|
m_Overlays[i].m_Team = m_Overlays[i].m_hEntity->GetTeamNumber(); |
|
CreatePanel( i ); |
|
} |
|
} |
|
} |
|
|
|
|