diff options
Diffstat (limited to 'game/server/tf2/tf_obj_explosives.cpp')
| -rw-r--r-- | game/server/tf2/tf_obj_explosives.cpp | 119 |
1 files changed, 119 insertions, 0 deletions
diff --git a/game/server/tf2/tf_obj_explosives.cpp b/game/server/tf2/tf_obj_explosives.cpp new file mode 100644 index 0000000..eea913a --- /dev/null +++ b/game/server/tf2/tf_obj_explosives.cpp @@ -0,0 +1,119 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Upgrade that explodes when it's object dies, injuring nearby enemies +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include "tf_player.h" +#include "tf_team.h" +#include "tf_gamerules.h" +#include "tf_obj.h" +#include "ndebugoverlay.h" +#include "tf_obj_baseupgrade_shared.h" +#include "hierarchy.h" + +// ------------------------------------------------------------------------ // +// Explosives defines +#define EXPLOSIVE_MINS Vector(-10, -10, 0) +#define EXPLOSIVE_MAXS Vector( 10, 10, 10) +#define EXPLOSIVE_MODEL "models/objects/obj_explosives.mdl" + +// ------------------------------------------------------------------------ // +// Explosives upgrade +// ------------------------------------------------------------------------ // +class CObjectExplosives : public CBaseObjectUpgrade +{ + DECLARE_CLASS( CObjectExplosives, CBaseObjectUpgrade ); +public: + DECLARE_DATADESC(); + DECLARE_SERVERCLASS(); + + CObjectExplosives(); + + virtual void Spawn(); + virtual void Precache(); + virtual void Killed( void ); + + // Explosivo + void ExplodeThink( void ); +}; + +BEGIN_DATADESC( CObjectExplosives ) + + DEFINE_THINKFUNC( ExplodeThink ), + +END_DATADESC() + +IMPLEMENT_SERVERCLASS_ST(CObjectExplosives, DT_ObjectExplosives) +END_SEND_TABLE(); + +LINK_ENTITY_TO_CLASS(obj_explosives, CObjectExplosives); +PRECACHE_REGISTER(obj_explosives); + +ConVar obj_explosives_health( "obj_explosives_health","1", FCVAR_NONE, "Explosives health" ); +ConVar obj_explosives_damage( "obj_explosives_damage","100", FCVAR_NONE, "Explosives damage" ); +ConVar obj_explosives_radius( "obj_explosives_radius","256", FCVAR_NONE, "Explosives damage" ); + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CObjectExplosives::CObjectExplosives() +{ + UseClientSideAnimation(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectExplosives::Spawn() +{ + Precache(); + SetModel( EXPLOSIVE_MODEL ); + SetCollisionGroup( TFCOLLISION_GROUP_COMBATOBJECT ); + + UTIL_SetSize(this, EXPLOSIVE_MINS, EXPLOSIVE_MAXS); + m_takedamage = DAMAGE_YES; + m_iHealth = obj_explosives_health.GetInt(); + + SetType( OBJ_EXPLOSIVES ); + m_fObjectFlags |= OF_SUPPRESS_NOTIFY_UNDER_ATTACK | OF_SUPPRESS_TECH_ANALYZER | OF_DONT_AUTO_REPAIR | OF_MUST_BE_BUILT_ON_ATTACHMENT; + + BaseClass::Spawn(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectExplosives::Precache() +{ + PrecacheModel( EXPLOSIVE_MODEL ); +} + +//----------------------------------------------------------------------------- +// Purpose: Explosivo! +//----------------------------------------------------------------------------- +void CObjectExplosives::Killed( void ) +{ + // Tell 'em I'm dying now + m_bDying = true; + + // Remove myself from the entity I was built on so it can die + DetachObjectFromObject(); + + // Delay the explosion & death so that it's not blocked by the entity we were built on + SetThink( ExplodeThink ); + SetNextThink( gpGlobals->curtime + 0.3 ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectExplosives::ExplodeThink( void ) +{ + // Do radius damage + RadiusDamage( CTakeDamageInfo( this, GetBuilder(), obj_explosives_damage.GetFloat(), DMG_BLAST ), GetAbsOrigin(), obj_explosives_radius.GetFloat(), CLASS_NONE, NULL ); + + // Kill myself + BaseClass::Killed(); +}
\ No newline at end of file |