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.

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 );
}
}
}