|
|
//========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "basecombatweapon.h"
#include "explode.h"
#include "eventqueue.h"
#include "gamerules.h"
#include "ammodef.h"
#include "in_buttons.h"
#include "soundent.h"
#include "ndebugoverlay.h"
#include "vstdlib/random.h"
#include "engine/IEngineSound.h"
#include "game.h"
#include "player.h"
#include "entitylist.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
// Spawnflags
#define SF_MESSAGE_DISABLED 1
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
class CMessageEntity : public CPointEntity { DECLARE_CLASS( CMessageEntity, CPointEntity );
public: void Spawn( void ); void Activate( void ); void Think( void ); void DrawOverlays(void);
virtual void UpdateOnRemove();
void InputEnable( inputdata_t &inputdata ); void InputDisable( inputdata_t &inputdata );
DECLARE_DATADESC();
protected: int m_radius; string_t m_messageText; bool m_drawText; bool m_bDeveloperOnly; bool m_bEnabled; };
LINK_ENTITY_TO_CLASS( point_message, CMessageEntity );
BEGIN_DATADESC( CMessageEntity )
DEFINE_KEYFIELD( m_radius, FIELD_INTEGER, "radius" ), DEFINE_KEYFIELD( m_messageText, FIELD_STRING, "message" ), DEFINE_KEYFIELD( m_bDeveloperOnly, FIELD_BOOLEAN, "developeronly" ), DEFINE_FIELD( m_drawText, FIELD_BOOLEAN ), DEFINE_FIELD( m_bEnabled, FIELD_BOOLEAN ),
// Inputs
DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ), DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ),
END_DATADESC()
static CUtlVector< CHandle< CMessageEntity > > g_MessageEntities;
//-----------------------------------------
// Spawn
//-----------------------------------------
void CMessageEntity::Spawn( void ) { SetNextThink( gpGlobals->curtime + 0.1f ); m_drawText = false; m_bDeveloperOnly = false; m_bEnabled = !HasSpawnFlags( SF_MESSAGE_DISABLED ); //m_debugOverlays |= OVERLAY_TEXT_BIT; // make sure we always show the text
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CMessageEntity::Activate( void ) { BaseClass::Activate();
CHandle< CMessageEntity > h; h = this; g_MessageEntities.AddToTail( h ); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CMessageEntity::UpdateOnRemove() { BaseClass::UpdateOnRemove();
CHandle< CMessageEntity > h; h = this; g_MessageEntities.FindAndRemove( h );
BaseClass::UpdateOnRemove(); }
//-----------------------------------------
// Think
//-----------------------------------------
void CMessageEntity::Think( void ) { SetNextThink( gpGlobals->curtime + 0.1f );
// check for player distance
CBasePlayer *pPlayer = UTIL_GetLocalPlayer();
if ( !pPlayer || ( pPlayer->GetFlags() & FL_NOTARGET ) ) return;
Vector worldTargetPosition = pPlayer->EyePosition();
// bail if player is too far away
if ( (worldTargetPosition - GetAbsOrigin()).Length() > m_radius ) { m_drawText = false; return; }
// turn on text
m_drawText = true; } //-------------------------------------------
//-------------------------------------------
void CMessageEntity::DrawOverlays(void) { if ( !m_drawText ) return;
if ( m_bDeveloperOnly && !g_pDeveloper->GetInt() ) return;
if ( !m_bEnabled ) return;
// display text if they are within range
char tempstr[512]; Q_snprintf( tempstr, sizeof(tempstr), "%s", STRING(m_messageText) ); EntityText( 0, tempstr, 0); }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CMessageEntity::InputEnable( inputdata_t &inputdata ) { m_bEnabled = true; }
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CMessageEntity::InputDisable( inputdata_t &inputdata ) { m_bEnabled = false; }
// This is a hack to make point_message stuff appear in developer 0 release builds
// for now
void DrawMessageEntities() { int c = g_MessageEntities.Count(); for ( int i = c - 1; i >= 0; i-- ) { CMessageEntity *me = g_MessageEntities[ i ]; if ( !me ) { g_MessageEntities.Remove( i ); continue; }
me->DrawOverlays(); } }
|