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.
306 lines
7.2 KiB
306 lines
7.2 KiB
![]()
4 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose: Implements the big scary boom-boom machine Antlions fear.
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
|
||
|
#include "cbase.h"
|
||
|
#include "EnvMessage.h"
|
||
|
#include "fmtstr.h"
|
||
|
#include "vguiscreen.h"
|
||
|
#include "filesystem.h"
|
||
|
|
||
|
|
||
|
struct SlideKeywordList_t
|
||
|
{
|
||
|
char szSlideKeyword[64];
|
||
|
};
|
||
|
|
||
|
|
||
|
class CNeurotoxinCountdown : public CBaseEntity
|
||
|
{
|
||
|
public:
|
||
|
|
||
|
DECLARE_CLASS( CNeurotoxinCountdown, CBaseEntity );
|
||
|
DECLARE_DATADESC();
|
||
|
DECLARE_SERVERCLASS();
|
||
|
|
||
|
virtual ~CNeurotoxinCountdown();
|
||
|
|
||
|
virtual bool KeyValue( const char *szKeyName, const char *szValue );
|
||
|
|
||
|
virtual int UpdateTransmitState();
|
||
|
virtual void SetTransmit( CCheckTransmitInfo *pInfo, bool bAlways );
|
||
|
|
||
|
virtual void Spawn( void );
|
||
|
virtual void Precache( void );
|
||
|
virtual void OnRestore( void );
|
||
|
|
||
|
void ScreenVisible( bool bVisible );
|
||
|
|
||
|
void Disable( void );
|
||
|
void Enable( void );
|
||
|
|
||
|
void InputDisable( inputdata_t &inputdata );
|
||
|
void InputEnable( inputdata_t &inputdata );
|
||
|
|
||
|
private:
|
||
|
|
||
|
// Control panel
|
||
|
void GetControlPanelInfo( int nPanelIndex, const char *&pPanelName );
|
||
|
void GetControlPanelClassName( int nPanelIndex, const char *&pPanelName );
|
||
|
void SpawnControlPanels( void );
|
||
|
void RestoreControlPanels( void );
|
||
|
|
||
|
private:
|
||
|
|
||
|
CNetworkVar( bool, m_bEnabled );
|
||
|
|
||
|
int m_iScreenWidth;
|
||
|
int m_iScreenHeight;
|
||
|
|
||
|
typedef CHandle<CVGuiScreen> ScreenHandle_t;
|
||
|
CUtlVector<ScreenHandle_t> m_hScreens;
|
||
|
};
|
||
|
|
||
|
|
||
|
LINK_ENTITY_TO_CLASS( vgui_neurotoxin_countdown, CNeurotoxinCountdown );
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Save/load
|
||
|
//-----------------------------------------------------------------------------
|
||
|
BEGIN_DATADESC( CNeurotoxinCountdown )
|
||
|
DEFINE_FIELD( m_bEnabled, FIELD_BOOLEAN ),
|
||
|
|
||
|
DEFINE_KEYFIELD( m_iScreenWidth, FIELD_INTEGER, "width" ),
|
||
|
DEFINE_KEYFIELD( m_iScreenHeight, FIELD_INTEGER, "height" ),
|
||
|
|
||
|
//DEFINE_UTLVECTOR( m_hScreens, FIELD_EHANDLE ),
|
||
|
|
||
|
DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ),
|
||
|
DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ),
|
||
|
|
||
|
END_DATADESC()
|
||
|
|
||
|
IMPLEMENT_SERVERCLASS_ST( CNeurotoxinCountdown, DT_NeurotoxinCountdown )
|
||
|
SendPropBool( SENDINFO(m_bEnabled) ),
|
||
|
END_SEND_TABLE()
|
||
|
|
||
|
|
||
|
CNeurotoxinCountdown::~CNeurotoxinCountdown()
|
||
|
{
|
||
|
int i;
|
||
|
// Kill the control panels
|
||
|
for ( i = m_hScreens.Count(); --i >= 0; )
|
||
|
{
|
||
|
DestroyVGuiScreen( m_hScreens[i].Get() );
|
||
|
}
|
||
|
m_hScreens.RemoveAll();
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Read in worldcraft data...
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CNeurotoxinCountdown::KeyValue( const char *szKeyName, const char *szValue )
|
||
|
{
|
||
|
//!! temp hack, until worldcraft is fixed
|
||
|
// strip the # tokens from (duplicate) key names
|
||
|
char *s = (char *)strchr( szKeyName, '#' );
|
||
|
if ( s )
|
||
|
{
|
||
|
*s = '\0';
|
||
|
}
|
||
|
|
||
|
// NOTE: Have to do these separate because they set two values instead of one
|
||
|
if( FStrEq( szKeyName, "angles" ) )
|
||
|
{
|
||
|
Assert( GetMoveParent() == NULL );
|
||
|
QAngle angles;
|
||
|
UTIL_StringToVector( angles.Base(), szValue );
|
||
|
|
||
|
// Because the vgui screen basis is strange (z is front, y is up, x is right)
|
||
|
// we need to rotate the typical basis before applying it
|
||
|
VMatrix mat, rotation, tmp;
|
||
|
MatrixFromAngles( angles, mat );
|
||
|
MatrixBuildRotationAboutAxis( rotation, Vector( 0, 1, 0 ), 90 );
|
||
|
MatrixMultiply( mat, rotation, tmp );
|
||
|
MatrixBuildRotateZ( rotation, 90 );
|
||
|
MatrixMultiply( tmp, rotation, mat );
|
||
|
MatrixToAngles( mat, angles );
|
||
|
SetAbsAngles( angles );
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return BaseClass::KeyValue( szKeyName, szValue );
|
||
|
}
|
||
|
|
||
|
int CNeurotoxinCountdown::UpdateTransmitState()
|
||
|
{
|
||
|
return SetTransmitState( FL_EDICT_FULLCHECK );
|
||
|
}
|
||
|
|
||
|
void CNeurotoxinCountdown::SetTransmit( CCheckTransmitInfo *pInfo, bool bAlways )
|
||
|
{
|
||
|
// Are we already marked for transmission?
|
||
|
if ( pInfo->m_pTransmitEdict->Get( entindex() ) )
|
||
|
return;
|
||
|
|
||
|
BaseClass::SetTransmit( pInfo, bAlways );
|
||
|
|
||
|
// Force our screens to be sent too.
|
||
|
for ( int i=0; i < m_hScreens.Count(); i++ )
|
||
|
{
|
||
|
CVGuiScreen *pScreen = m_hScreens[i].Get();
|
||
|
pScreen->SetTransmit( pInfo, bAlways );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CNeurotoxinCountdown::Spawn( void )
|
||
|
{
|
||
|
Precache();
|
||
|
|
||
|
BaseClass::Spawn();
|
||
|
|
||
|
m_bEnabled = false;
|
||
|
|
||
|
SpawnControlPanels();
|
||
|
|
||
|
ScreenVisible( m_bEnabled );
|
||
|
}
|
||
|
|
||
|
void CNeurotoxinCountdown::Precache( void )
|
||
|
{
|
||
|
BaseClass::Precache();
|
||
|
|
||
|
PrecacheVGuiScreen( "neurotoxin_countdown_screen" );
|
||
|
}
|
||
|
|
||
|
void CNeurotoxinCountdown::OnRestore( void )
|
||
|
{
|
||
|
BaseClass::OnRestore();
|
||
|
|
||
|
RestoreControlPanels();
|
||
|
|
||
|
ScreenVisible( m_bEnabled );
|
||
|
}
|
||
|
|
||
|
void CNeurotoxinCountdown::ScreenVisible( bool bVisible )
|
||
|
{
|
||
|
for ( int iScreen = 0; iScreen < m_hScreens.Count(); ++iScreen )
|
||
|
{
|
||
|
CVGuiScreen *pScreen = m_hScreens[ iScreen ].Get();
|
||
|
if ( bVisible )
|
||
|
pScreen->RemoveEffects( EF_NODRAW );
|
||
|
else
|
||
|
pScreen->AddEffects( EF_NODRAW );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CNeurotoxinCountdown::Disable( void )
|
||
|
{
|
||
|
if ( !m_bEnabled )
|
||
|
return;
|
||
|
|
||
|
m_bEnabled = false;
|
||
|
|
||
|
ScreenVisible( false );
|
||
|
}
|
||
|
|
||
|
void CNeurotoxinCountdown::Enable( void )
|
||
|
{
|
||
|
if ( m_bEnabled )
|
||
|
return;
|
||
|
|
||
|
m_bEnabled = true;
|
||
|
|
||
|
ScreenVisible( true );
|
||
|
}
|
||
|
|
||
|
|
||
|
void CNeurotoxinCountdown::InputDisable( inputdata_t &inputdata )
|
||
|
{
|
||
|
Disable();
|
||
|
}
|
||
|
|
||
|
void CNeurotoxinCountdown::InputEnable( inputdata_t &inputdata )
|
||
|
{
|
||
|
Enable();
|
||
|
}
|
||
|
|
||
|
void CNeurotoxinCountdown::GetControlPanelInfo( int nPanelIndex, const char *&pPanelName )
|
||
|
{
|
||
|
pPanelName = "neurotoxin_countdown_screen";
|
||
|
}
|
||
|
|
||
|
void CNeurotoxinCountdown::GetControlPanelClassName( int nPanelIndex, const char *&pPanelName )
|
||
|
{
|
||
|
pPanelName = "vgui_screen";
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// This is called by the base object when it's time to spawn the control panels
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CNeurotoxinCountdown::SpawnControlPanels()
|
||
|
{
|
||
|
int nPanel;
|
||
|
for ( nPanel = 0; true; ++nPanel )
|
||
|
{
|
||
|
const char *pScreenName;
|
||
|
GetControlPanelInfo( nPanel, pScreenName );
|
||
|
if (!pScreenName)
|
||
|
continue;
|
||
|
|
||
|
const char *pScreenClassname;
|
||
|
GetControlPanelClassName( nPanel, pScreenClassname );
|
||
|
if ( !pScreenClassname )
|
||
|
continue;
|
||
|
|
||
|
float flWidth = m_iScreenWidth;
|
||
|
float flHeight = m_iScreenHeight;
|
||
|
|
||
|
CVGuiScreen *pScreen = CreateVGuiScreen( pScreenClassname, pScreenName, this, this, -1 );
|
||
|
pScreen->ChangeTeam( GetTeamNumber() );
|
||
|
pScreen->SetActualSize( flWidth, flHeight );
|
||
|
pScreen->SetActive( true );
|
||
|
pScreen->MakeVisibleOnlyToTeammates( false );
|
||
|
pScreen->SetTransparency( true );
|
||
|
int nScreen = m_hScreens.AddToTail( );
|
||
|
m_hScreens[nScreen].Set( pScreen );
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void CNeurotoxinCountdown::RestoreControlPanels( void )
|
||
|
{
|
||
|
int nPanel;
|
||
|
for ( nPanel = 0; true; ++nPanel )
|
||
|
{
|
||
|
const char *pScreenName;
|
||
|
GetControlPanelInfo( nPanel, pScreenName );
|
||
|
if (!pScreenName)
|
||
|
continue;
|
||
|
|
||
|
const char *pScreenClassname;
|
||
|
GetControlPanelClassName( nPanel, pScreenClassname );
|
||
|
if ( !pScreenClassname )
|
||
|
continue;
|
||
|
|
||
|
CVGuiScreen *pScreen = (CVGuiScreen *)gEntList.FindEntityByClassname( NULL, pScreenClassname );
|
||
|
|
||
|
while ( ( pScreen && pScreen->GetOwnerEntity() != this ) || Q_strcmp( pScreen->GetPanelName(), pScreenName ) != 0 )
|
||
|
{
|
||
|
pScreen = (CVGuiScreen *)gEntList.FindEntityByClassname( pScreen, pScreenClassname );
|
||
|
}
|
||
|
|
||
|
if ( pScreen )
|
||
|
{
|
||
|
int nScreen = m_hScreens.AddToTail( );
|
||
|
m_hScreens[nScreen].Set( pScreen );
|
||
|
pScreen->SetActive( true );
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
}
|