diff options
Diffstat (limited to 'game/server/tf2/tf_obj_selfheal.cpp')
| -rw-r--r-- | game/server/tf2/tf_obj_selfheal.cpp | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/game/server/tf2/tf_obj_selfheal.cpp b/game/server/tf2/tf_obj_selfheal.cpp new file mode 100644 index 0000000..f4bcc7e --- /dev/null +++ b/game/server/tf2/tf_obj_selfheal.cpp @@ -0,0 +1,112 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: Upgrade that heals the object over time +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include "tf_player.h" +#include "tf_team.h" +#include "tf_gamerules.h" +#include "tf_obj.h" +#include "tf_obj_selfheal.h" +#include "ndebugoverlay.h" + +// ------------------------------------------------------------------------ // +// Self Heal defines +#define SELFHEAL_MINS Vector(-10, -10, 0) +#define SELFHEAL_MAXS Vector( 10, 10, 10) +#define SELFHEAL_MODEL "models/objects/obj_selfheal.mdl" + +BEGIN_DATADESC( CObjectSelfHeal ) + + DEFINE_THINKFUNC( SelfHealThink ), + +END_DATADESC() + +IMPLEMENT_SERVERCLASS_ST(CObjectSelfHeal, DT_ObjectSelfHeal) +END_SEND_TABLE(); + +LINK_ENTITY_TO_CLASS(obj_selfheal, CObjectSelfHeal); +PRECACHE_REGISTER(obj_selfheal); + +ConVar obj_selfheal_health( "obj_selfheal_health","100", FCVAR_NONE, "Self-Heal health" ); +ConVar obj_selfheal_rate( "obj_selfheal_rate","1.0", FCVAR_NONE, "Rate at which the Self-Heal object repairs it's parent" ); +ConVar obj_selfheal_amount( "obj_selfheal_amount","3", FCVAR_NONE, "Amount of health healed by a Self-Heal object per tick" ); + +#define SELFHEAL_THINK_CONTEXT "SelfHealThink" + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CObjectSelfHeal::CObjectSelfHeal() +{ + UseClientSideAnimation(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectSelfHeal::Spawn() +{ + Precache(); + SetModel( SELFHEAL_MODEL ); + SetCollisionGroup( TFCOLLISION_GROUP_COMBATOBJECT ); + + UTIL_SetSize(this, SELFHEAL_MINS, SELFHEAL_MAXS); + m_takedamage = DAMAGE_YES; + m_iHealth = obj_selfheal_health.GetInt(); + + SetType( OBJ_SELFHEAL ); + 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 CObjectSelfHeal::Precache() +{ + PrecacheModel( SELFHEAL_MODEL ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CObjectSelfHeal::FinishedBuilding( void ) +{ + BaseClass::FinishedBuilding(); + + SetContextThink( SelfHealThink, gpGlobals->curtime + obj_selfheal_rate.GetFloat(), SELFHEAL_THINK_CONTEXT ); +} + +//----------------------------------------------------------------------------- +// Purpose: Heal the object I'm attached to +//----------------------------------------------------------------------------- +void CObjectSelfHeal::SelfHealThink( void ) +{ + if ( !GetTeam() ) + return; + + CBaseObject *pObject = GetParentObject(); + if ( !pObject ) + { + Killed(); + return; + } + + SetNextThink( gpGlobals->curtime + obj_selfheal_rate.GetFloat(), SELFHEAL_THINK_CONTEXT ); + + // Don't heal if we've been EMPed + if ( HasPowerup( POWERUP_EMP ) ) + return; + + // Don't bring objects back from the dead + if ( !pObject->IsAlive() || pObject->IsDying() ) + return; + + // Repair our parent if it's hurt + pObject->Repair( obj_selfheal_amount.GetFloat() ); +} |