diff options
| author | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
|---|---|---|
| committer | Joe Ludwig <[email protected]> | 2013-06-26 15:22:04 -0700 |
| commit | 39ed87570bdb2f86969d4be821c94b722dc71179 (patch) | |
| tree | abc53757f75f40c80278e87650ea92808274aa59 /sp/src/game/server/message_entity.cpp | |
| download | source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip | |
First version of the SOurce SDK 2013
Diffstat (limited to 'sp/src/game/server/message_entity.cpp')
| -rw-r--r-- | sp/src/game/server/message_entity.cpp | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/sp/src/game/server/message_entity.cpp b/sp/src/game/server/message_entity.cpp new file mode 100644 index 00000000..be0428dc --- /dev/null +++ b/sp/src/game/server/message_entity.cpp @@ -0,0 +1,191 @@ +//========= Copyright 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();
+ }
+}
|