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.
221 lines
6.4 KiB
221 lines
6.4 KiB
5 years ago
|
//========= 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 );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|