diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/server/tf2/order_heal.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/server/tf2/order_heal.cpp')
| -rw-r--r-- | game/server/tf2/order_heal.cpp | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/game/server/tf2/order_heal.cpp b/game/server/tf2/order_heal.cpp new file mode 100644 index 0000000..2e6631b --- /dev/null +++ b/game/server/tf2/order_heal.cpp @@ -0,0 +1,111 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include "cbase.h" +#include "order_heal.h" +#include "tf_team.h" +#include "tf_playerclass.h" +#include "order_helpers.h" + + +#define MAX_HEAL_DIST 1500 + +IMPLEMENT_SERVERCLASS_ST( COrderHeal, DT_OrderHeal ) +END_SEND_TABLE() + + +bool IsValidFn_Heal( void *pUserData, int a ) +{ + // Can't heal dead players. + CSortBase *p = (CSortBase*)pUserData; + CBasePlayer *pPlayer = p->m_pPlayer->GetTeam()->GetPlayer( a ); + + // Can't heal yourself... + if (p->m_pPlayer == pPlayer) + return false; + + // Don't heal players that are too far away... + const Vector &vPlayer = p->m_pPlayer->GetAbsOrigin(); + if (vPlayer.DistToSqr(pPlayer->GetAbsOrigin()) > MAX_HEAL_DIST * MAX_HEAL_DIST ) + return false; + + return pPlayer->IsAlive() && pPlayer->m_iHealth < pPlayer->m_iMaxHealth; +} + + +int SortFn_Heal( void *pUserData, int a, int b ) +{ + CSortBase *p = (CSortBase*)pUserData; + + const Vector &vPlayer = p->m_pPlayer->GetAbsOrigin(); + const Vector &va = p->m_pPlayer->GetTeam()->GetPlayer( a )->GetAbsOrigin(); + const Vector &vb = p->m_pPlayer->GetTeam()->GetPlayer( b )->GetAbsOrigin(); + + return vPlayer.DistToSqr( va ) < vPlayer.DistToSqr( vb ); +} + + +bool COrderHeal::CreateOrder( CPlayerClass *pClass ) +{ + CTFTeam *pTeam = pClass->GetTeam(); + + CSortBase info; + info.m_pPlayer = pClass->GetPlayer(); + + int sorted[MAX_PLAYERS]; + int nSorted = BuildSortedActiveList( + sorted, + MAX_PLAYERS, + SortFn_Heal, + IsValidFn_Heal, + &info, + pTeam->GetNumPlayers() + ); + + if ( nSorted ) + { + COrderHeal *pOrder = new COrderHeal; + + pClass->GetTeam()->AddOrder( + ORDER_HEAL, + pTeam->GetPlayer( sorted[0] ), + pClass->GetPlayer(), + 1e24, + 60, + pOrder ); + + return true; + } + else + { + return false; + } +} + + +bool COrderHeal::Update() +{ + CBaseEntity *pTarget = GetTargetEntity(); + if ( !pTarget || pTarget->m_iHealth >= pTarget->m_iMaxHealth ) + return true; + + return false; +} + + +bool COrderHeal::UpdateOnEvent( COrderEvent_Base *pEvent ) +{ + if ( pEvent->GetType() == ORDER_EVENT_PLAYER_KILLED ) + { + COrderEvent_PlayerKilled *pKilled = (COrderEvent_PlayerKilled*)pEvent; + if ( pKilled->m_pPlayer == GetTargetEntity() ) + return true; + } + + return BaseClass::UpdateOnEvent( pEvent ); +} + |