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.
199 lines
4.9 KiB
199 lines
4.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// bot_npc_minion.h |
|
// Minions for the Boss |
|
// Michael Booth, November 2010 |
|
|
|
#ifndef BOT_NPC_MINION_H |
|
#define BOT_NPC_MINION_H |
|
|
|
#ifdef TF_RAID_MODE |
|
|
|
#include "NextBot.h" |
|
#include "NextBotBehavior.h" |
|
#include "Path/NextBotPathFollow.h" |
|
#include "bot_npc.h" |
|
#include "bot_npc_body.h" |
|
|
|
|
|
//---------------------------------------------------------------------------- |
|
// Bypass vision system |
|
class CDisableVision : public IVision |
|
{ |
|
public: |
|
CDisableVision( INextBot *bot ) : IVision( bot ) { } |
|
virtual ~CDisableVision() { } |
|
|
|
virtual void Reset( void ) { } |
|
virtual void Update( void ) { } |
|
}; |
|
|
|
|
|
//---------------------------------------------------------------------------- |
|
class CNextBotFlyingLocomotion : public ILocomotion |
|
{ |
|
public: |
|
CNextBotFlyingLocomotion( INextBot *bot ); |
|
virtual ~CNextBotFlyingLocomotion(); |
|
|
|
virtual void Reset( void ); // (EXTEND) reset to initial state |
|
virtual void Update( void ); // (EXTEND) update internal state |
|
|
|
virtual void Approach( const Vector &goalPos, float goalWeight = 1.0f ); // (EXTEND) move directly towards the given position |
|
|
|
virtual void SetDesiredSpeed( float speed ); // set desired speed for locomotor movement |
|
virtual float GetDesiredSpeed( void ) const; // returns the current desired speed |
|
|
|
virtual void SetDesiredAltitude( float height ); // how high above our Approach goal do we float? |
|
virtual float GetDesiredAltitude( void ) const; |
|
|
|
virtual const Vector &GetGroundNormal( void ) const; // surface normal of the ground we are in contact with |
|
|
|
virtual const Vector &GetVelocity( void ) const; // return current world space velocity |
|
void SetVelocity( const Vector &velocity ); |
|
|
|
void Deflect( CBaseEntity *deflector ); |
|
|
|
protected: |
|
float m_desiredSpeed; |
|
float m_currentSpeed; |
|
Vector m_forward; |
|
|
|
float m_desiredAltitude; |
|
void MaintainAltitude( void ); |
|
|
|
Vector m_velocity; |
|
Vector m_acceleration; |
|
}; |
|
|
|
inline const Vector &CNextBotFlyingLocomotion::GetGroundNormal( void ) const |
|
{ |
|
static Vector up( 0, 0, 1.0f ); |
|
|
|
return up; |
|
} |
|
|
|
inline const Vector &CNextBotFlyingLocomotion::GetVelocity( void ) const |
|
{ |
|
return m_velocity; |
|
} |
|
|
|
inline void CNextBotFlyingLocomotion::SetVelocity( const Vector &velocity ) |
|
{ |
|
m_velocity = velocity; |
|
} |
|
|
|
|
|
//---------------------------------------------------------------------------- |
|
class CBotNPCMinion : public NextBotCombatCharacter |
|
{ |
|
public: |
|
DECLARE_CLASS( CBotNPCMinion, NextBotCombatCharacter ); |
|
DECLARE_SERVERCLASS(); |
|
|
|
CBotNPCMinion(); |
|
virtual ~CBotNPCMinion(); |
|
|
|
virtual void Precache(); |
|
virtual void Spawn( void ); |
|
|
|
virtual int OnTakeDamage_Alive( const CTakeDamageInfo &info ); |
|
|
|
virtual bool IsDeflectable() { return true; } // for flamethrower |
|
virtual void Deflected( CBaseEntity *pDeflectedBy, Vector &vecDir ); |
|
|
|
// INextBot |
|
DECLARE_INTENTION_INTERFACE( CBotNPCMinion ); |
|
virtual CNextBotFlyingLocomotion *GetLocomotionInterface( void ) const { return m_locomotor; } |
|
virtual CBotNPCBody *GetBodyInterface( void ) const { return m_body; } |
|
virtual IVision *GetVisionInterface( void ) const { return m_vision; } |
|
|
|
virtual Vector EyePosition( void ); |
|
|
|
virtual unsigned int PhysicsSolidMaskForEntity( void ) const; |
|
virtual bool ShouldCollide( int collisionGroup, int contentsMask ) const; |
|
|
|
void BecomeAmmoPack( void ); |
|
|
|
CTFPlayer *FindTarget( void ); // Find the closest living player not already being targeted by another minion |
|
|
|
void UpdateTarget( void ); |
|
|
|
void SetTarget( CTFPlayer *target ); |
|
CTFPlayer *GetTarget( void ) const; |
|
bool HasTarget( void ) const; |
|
bool IsTarget( CTFPlayer *target ) const; |
|
|
|
const Vector &GetLastKnownTargetPosition( void ) const; |
|
|
|
void StartStunEffects( CTFPlayer *victim ); |
|
void EndStunEffects( void ); |
|
|
|
bool IsAlert( void ) const; |
|
void BecomeAlert( void ); |
|
|
|
private: |
|
CNextBotFlyingLocomotion *m_locomotor; |
|
CBotNPCBody *m_body; |
|
CDisableVision *m_vision; |
|
|
|
Vector m_eyeOffset; |
|
|
|
CTFPlayer *m_target; |
|
Vector m_lastKnownTargetPosition; |
|
|
|
CountdownTimer m_invulnTimer; |
|
|
|
CNetworkHandle( CBaseEntity, m_stunTarget ); |
|
|
|
bool m_isAlert; |
|
}; |
|
|
|
inline bool CBotNPCMinion::IsAlert( void ) const |
|
{ |
|
return m_isAlert; |
|
} |
|
|
|
inline Vector CBotNPCMinion::EyePosition( void ) |
|
{ |
|
return GetAbsOrigin() + m_eyeOffset; |
|
} |
|
|
|
inline bool CBotNPCMinion::HasTarget( void ) const |
|
{ |
|
return m_target == NULL ? false : true; |
|
} |
|
|
|
inline bool CBotNPCMinion::IsTarget( CTFPlayer *target ) const |
|
{ |
|
return ( m_target == target ) ? true : false; |
|
} |
|
|
|
inline void CBotNPCMinion::SetTarget( CTFPlayer *target ) |
|
{ |
|
m_target = target; |
|
} |
|
|
|
inline CTFPlayer *CBotNPCMinion::GetTarget( void ) const |
|
{ |
|
return m_target; |
|
} |
|
|
|
inline const Vector &CBotNPCMinion::GetLastKnownTargetPosition( void ) const |
|
{ |
|
return m_lastKnownTargetPosition; |
|
} |
|
|
|
inline void CBotNPCMinion::StartStunEffects( CTFPlayer *victim ) |
|
{ |
|
m_stunTarget = victim; |
|
} |
|
|
|
inline void CBotNPCMinion::EndStunEffects( void ) |
|
{ |
|
m_stunTarget = NULL; |
|
} |
|
|
|
|
|
#endif // TF_RAID_MODE |
|
|
|
#endif // BOT_NPC_MINION_H
|
|
|