aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/server/pointhurt.cpp
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/server/pointhurt.cpp
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/server/pointhurt.cpp')
-rw-r--r--mp/src/game/server/pointhurt.cpp182
1 files changed, 182 insertions, 0 deletions
diff --git a/mp/src/game/server/pointhurt.cpp b/mp/src/game/server/pointhurt.cpp
new file mode 100644
index 00000000..304a3f79
--- /dev/null
+++ b/mp/src/game/server/pointhurt.cpp
@@ -0,0 +1,182 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Implements hurting point entity
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "entitylist.h"
+#include "gamerules.h"
+#include "basecombatcharacter.h"
+#include "ammodef.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+const int SF_PHURT_START_ON = 1;
+
+class CPointHurt : public CPointEntity
+{
+ DECLARE_CLASS( CPointHurt, CPointEntity );
+
+public:
+ void Spawn( void );
+ void Precache( void );
+ void HurtThink( void );
+
+ // Input handlers
+ void InputTurnOn(inputdata_t &inputdata);
+ void InputTurnOff(inputdata_t &inputdata);
+ void InputToggle(inputdata_t &inputdata);
+ void InputHurt(inputdata_t &inputdata);
+
+ DECLARE_DATADESC();
+
+ int m_nDamage;
+ int m_bitsDamageType;
+ float m_flRadius;
+ float m_flDelay;
+ string_t m_strTarget;
+ EHANDLE m_pActivator;
+};
+
+BEGIN_DATADESC( CPointHurt )
+
+ DEFINE_KEYFIELD( m_flRadius, FIELD_FLOAT, "DamageRadius" ),
+ DEFINE_KEYFIELD( m_nDamage, FIELD_INTEGER, "Damage" ),
+ DEFINE_KEYFIELD( m_flDelay, FIELD_FLOAT, "DamageDelay" ),
+ DEFINE_KEYFIELD( m_bitsDamageType, FIELD_INTEGER, "DamageType" ),
+ DEFINE_KEYFIELD( m_strTarget, FIELD_STRING, "DamageTarget" ),
+
+ // Function Pointers
+ DEFINE_FUNCTION( HurtThink ),
+
+ // Inputs
+ DEFINE_INPUTFUNC( FIELD_VOID, "TurnOn", InputTurnOn ),
+ DEFINE_INPUTFUNC( FIELD_VOID, "TurnOff", InputTurnOff ),
+ DEFINE_INPUTFUNC( FIELD_VOID, "Toggle", InputToggle ),
+ DEFINE_INPUTFUNC( FIELD_VOID, "Hurt", InputHurt ),
+
+ DEFINE_FIELD( m_pActivator, FIELD_EHANDLE ),
+
+END_DATADESC()
+
+LINK_ENTITY_TO_CLASS( point_hurt, CPointHurt );
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CPointHurt::Spawn(void)
+{
+ SetThink( NULL );
+ SetUse( NULL );
+
+ m_pActivator = NULL;
+
+ if ( HasSpawnFlags( SF_PHURT_START_ON ) )
+ {
+ SetThink( &CPointHurt::HurtThink );
+ }
+
+ SetNextThink( gpGlobals->curtime + 0.1f );
+
+ if ( m_flRadius <= 0.0f )
+ {
+ m_flRadius = 128.0f;
+ }
+
+ if ( m_nDamage <= 0 )
+ {
+ m_nDamage = 2;
+ }
+
+ if ( m_flDelay <= 0 )
+ {
+ m_flDelay = 0.1f;
+ }
+
+ Precache();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CPointHurt::Precache( void )
+{
+ BaseClass::Precache();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CPointHurt::HurtThink( void )
+{
+ if ( m_strTarget != NULL_STRING )
+ {
+ CBaseEntity *pEnt = NULL;
+
+ CTakeDamageInfo info( this, m_pActivator, m_nDamage, m_bitsDamageType );
+ while ( ( pEnt = gEntList.FindEntityByName( pEnt, m_strTarget, NULL, m_pActivator ) ) != NULL )
+ {
+ GuessDamageForce( &info, (pEnt->GetAbsOrigin() - GetAbsOrigin()), pEnt->GetAbsOrigin() );
+ pEnt->TakeDamage( info );
+ }
+ }
+ else
+ {
+ RadiusDamage( CTakeDamageInfo( this, this, m_nDamage, m_bitsDamageType ), GetAbsOrigin(), m_flRadius, CLASS_NONE, NULL );
+ }
+
+ SetNextThink( gpGlobals->curtime + m_flDelay );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Input handler for turning on the point hurt.
+//-----------------------------------------------------------------------------
+void CPointHurt::InputTurnOn( inputdata_t &data )
+{
+ SetThink( &CPointHurt::HurtThink );
+
+ SetNextThink( gpGlobals->curtime + 0.1f );
+
+ m_pActivator = data.pActivator;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Input handler for turning off the point hurt.
+//-----------------------------------------------------------------------------
+void CPointHurt::InputTurnOff( inputdata_t &data )
+{
+ SetThink( NULL );
+
+ m_pActivator = data.pActivator;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Input handler for toggling the on/off state of the point hurt.
+//-----------------------------------------------------------------------------
+void CPointHurt::InputToggle( inputdata_t &data )
+{
+ m_pActivator = data.pActivator;
+
+ if ( m_pfnThink == (void (CBaseEntity::*)())&CPointHurt::HurtThink )
+ {
+ SetThink( NULL );
+ }
+ else
+ {
+ SetThink( &CPointHurt::HurtThink );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Input handler for instantaneously hurting whatever is near us.
+//-----------------------------------------------------------------------------
+void CPointHurt::InputHurt( inputdata_t &data )
+{
+ m_pActivator = data.pActivator;
+
+ HurtThink();
+}
+