Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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.
 
 
 
 
 
 

103 lines
2.6 KiB

// Orders nearby aliens to a named info_target
#include "cbase.h"
#include "asw_gamerules.h"
#include "iasw_spawnable_npc.h"
#include "asw_spawn_manager.h"
// memdbgon must be the last include file in a .cpp file!!!
#include "tier0/memdbgon.h"
class CASW_Order_Nearby_Aliens : public CPointEntity
{
private:
DECLARE_DATADESC();
public:
DECLARE_CLASS( CASW_Order_Nearby_Aliens, CPointEntity );
~CASW_Order_Nearby_Aliens( void );
virtual void Spawn( void );
CBaseEntity* GetOrderTarget();
EHANDLE m_hAlienOrderTarget;
const char* GetAlienClass();
AlienOrder_t m_AlienOrders;
string_t m_AlienOrderTargetName; // name of our moveto target
int m_AlienClassNum;
float m_fRadius;
// Input handlers
void InputOrderAliens( inputdata_t &inputdata );
};
LINK_ENTITY_TO_CLASS( asw_order_nearby_aliens, CASW_Order_Nearby_Aliens );
BEGIN_DATADESC( CASW_Order_Nearby_Aliens )
DEFINE_KEYFIELD( m_fRadius, FIELD_FLOAT, "radius" ),
DEFINE_KEYFIELD( m_AlienClassNum, FIELD_INTEGER, "AlienClass" ),
DEFINE_KEYFIELD( m_AlienOrders, FIELD_INTEGER, "AlienOrders" ),
DEFINE_KEYFIELD( m_AlienOrderTargetName, FIELD_STRING, "AlienOrderTargetName" ),
DEFINE_INPUTFUNC( FIELD_VOID, "SendOrders", InputOrderAliens ),
END_DATADESC()
CASW_Order_Nearby_Aliens::~CASW_Order_Nearby_Aliens( void )
{
}
void CASW_Order_Nearby_Aliens::Spawn( void )
{
SetSolid( SOLID_NONE );
SetMoveType( MOVETYPE_NONE );
}
void CASW_Order_Nearby_Aliens::InputOrderAliens( inputdata_t &inputdata )
{
// find all aliens within our radius
const char* szAlienClass = GetAlienClass();
CBaseEntity* pEntity = NULL;
while ((pEntity = gEntList.FindEntityByClassname( pEntity, szAlienClass )) != NULL)
{
float dist = (GetAbsOrigin() - pEntity->GetAbsOrigin()).Length2D();
if (dist <= m_fRadius)
{
IASW_Spawnable_NPC* pAlien = dynamic_cast<IASW_Spawnable_NPC*>(pEntity);
if (pAlien)
{
// give the orders
pAlien->SetAlienOrders(m_AlienOrders, vec3_origin, GetOrderTarget());
}
}
}
}
const char* CASW_Order_Nearby_Aliens::GetAlienClass()
{
if ( m_AlienClassNum < 0 || m_AlienClassNum >= ASWSpawnManager()->GetNumAlienClasses() )
{
m_AlienClassNum = 0;
}
return ASWSpawnManager()->GetAlienClass( m_AlienClassNum )->m_pszAlienClass;
}
CBaseEntity* CASW_Order_Nearby_Aliens::GetOrderTarget()
{
if (m_hAlienOrderTarget.Get() == NULL &&
(m_AlienOrders == AOT_MoveTo || m_AlienOrders == AOT_MoveToIgnoringMarines )
)
{
m_hAlienOrderTarget = gEntList.FindEntityByName( NULL, m_AlienOrderTargetName, NULL );
if( !m_hAlienOrderTarget.Get() )
{
DevWarning("asw_spawner can't find order object\n", GetDebugName() );
return NULL;
}
}
return m_hAlienOrderTarget.Get();
}