summaryrefslogtreecommitdiff
path: root/game/server/tf/bot_npc/bot_npc_minion.h
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf/bot_npc/bot_npc_minion.h')
-rw-r--r--game/server/tf/bot_npc/bot_npc_minion.h199
1 files changed, 199 insertions, 0 deletions
diff --git a/game/server/tf/bot_npc/bot_npc_minion.h b/game/server/tf/bot_npc/bot_npc_minion.h
new file mode 100644
index 0000000..6d2deee
--- /dev/null
+++ b/game/server/tf/bot_npc/bot_npc_minion.h
@@ -0,0 +1,199 @@
+//========= 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