You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
2.3 KiB
111 lines
2.3 KiB
//========= 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 ); |
|
} |
|
|
|
|