mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-08 17:59:37 +00:00
1
This commit is contained in:
@@ -0,0 +1,220 @@
|
||||
//========= 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 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user