diff options
Diffstat (limited to 'game/server/tf2/order_mortar_attack.cpp')
| -rw-r--r-- | game/server/tf2/order_mortar_attack.cpp | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/game/server/tf2/order_mortar_attack.cpp b/game/server/tf2/order_mortar_attack.cpp new file mode 100644 index 0000000..1f98da3 --- /dev/null +++ b/game/server/tf2/order_mortar_attack.cpp @@ -0,0 +1,77 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#include "cbase.h" +#include "order_mortar_attack.h" +#include "tf_team.h" +#include "order_helpers.h" +#include "tf_obj.h" + + +// How far away the escort guy will get orders to shell enemy objects. +#define ENEMYOBJ_MORTAR_DIST 3000 + + +IMPLEMENT_SERVERCLASS_ST( COrderMortarAttack, DT_OrderMortarAttack ) +END_SEND_TABLE() + + +static bool IsValidFn_WithinMortarRange( void *pUserData, int a ) +{ + CSortBase *p = (CSortBase*)pUserData; + CBaseObject *pObj = p->GetTeam()->GetObject( a ); + return pObj->GetAbsOrigin().DistTo( p->m_pPlayer->GetAbsOrigin() ) < ENEMYOBJ_MORTAR_DIST; +} + + +bool COrderMortarAttack::CreateOrder( CPlayerClass *pClass ) +{ + // Look for some nearby enemy objects that would be fun to destroy. + CTFTeam *pEnemyTeam; + if ( !pClass->GetTeam() || (pEnemyTeam = pClass->GetTeam()->GetEnemyTeam()) == NULL ) + return false; + + CBaseTFPlayer *pPlayer = pClass->GetPlayer(); + + CSortBase info; + info.m_pPlayer = pPlayer; + info.m_pTeam = pEnemyTeam; + + int sorted[MAX_TEAM_OBJECTS]; + int nSorted = BuildSortedActiveList( + sorted, // the sorted list of objects + MAX_TEAM_OBJECTS, + SortFn_DistanceAndConcentration, // sort on distance and entity concentration + IsValidFn_WithinMortarRange, // filter function + &info, // user data + pEnemyTeam->GetNumObjects() // number of objects to check + ); + + if( nSorted > 0 ) + { + CBaseEntity *pEnt = pEnemyTeam->GetObject( sorted[0] ); + + COrderMortarAttack *pOrder = new COrderMortarAttack; + + pClass->GetTeam()->AddOrder( + ORDER_MORTAR_ATTACK, + pEnt, + pPlayer, + 1e24, + 40, + pOrder + ); + + return true; + } + else + { + return false; + } +} + + |