diff options
Diffstat (limited to 'game/server/NextBot/Player/NextBotPlayerBody.h')
| -rw-r--r-- | game/server/NextBot/Player/NextBotPlayerBody.h | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/game/server/NextBot/Player/NextBotPlayerBody.h b/game/server/NextBot/Player/NextBotPlayerBody.h new file mode 100644 index 0000000..eda3643 --- /dev/null +++ b/game/server/NextBot/Player/NextBotPlayerBody.h @@ -0,0 +1,153 @@ +// NextBotPlayerBody.h +// Control and information about the bot's body state (posture, animation state, etc) +// Author: Michael Booth, October 2006 +//========= Copyright Valve Corporation, All rights reserved. ============// + +#ifndef _NEXT_BOT_PLAYER_BODY_H_ +#define _NEXT_BOT_PLAYER_BODY_H_ + +#include "NextBotBodyInterface.h" + + +//---------------------------------------------------------------------------------------------------------------- +/** + * A useful reply for IBody::AimHeadTowards. When the + * head is aiming on target, press the fire button. + */ +class PressFireButtonReply : public INextBotReply +{ +public: + virtual void OnSuccess( INextBot *bot ); // invoked when process completed successfully +}; + + +//---------------------------------------------------------------------------------------------------------------- +/** + * A useful reply for IBody::AimHeadTowards. When the + * head is aiming on target, press the alt-fire button. + */ +class PressAltFireButtonReply : public INextBotReply +{ +public: + virtual void OnSuccess( INextBot *bot ); // invoked when process completed successfully +}; + + +//---------------------------------------------------------------------------------------------------------------- +/** + * A useful reply for IBody::AimHeadTowards. When the + * head is aiming on target, press the jump button. + */ +class PressJumpButtonReply : public INextBotReply +{ +public: + virtual void OnSuccess( INextBot *bot ); // invoked when process completed successfully +}; + + +//---------------------------------------------------------------------------------------------------------------- +/** + * The interface for control and information about the bot's body state (posture, animation state, etc) + */ +class PlayerBody : public IBody +{ +public: + PlayerBody( INextBot *bot ); + virtual ~PlayerBody(); + + virtual void Reset( void ); // reset to initial state + virtual void Upkeep( void ); // lightweight update guaranteed to occur every server tick + + virtual bool SetPosition( const Vector &pos ); + + virtual const Vector &GetEyePosition( void ) const; // return the eye position of the bot in world coordinates + virtual const Vector &GetViewVector( void ) const; // return the view unit direction vector in world coordinates + + virtual void AimHeadTowards( const Vector &lookAtPos, + LookAtPriorityType priority = BORING, + float duration = 0.0f, + INextBotReply *replyWhenAimed = NULL, + const char *reason = NULL ); // aim the bot's head towards the given goal + + virtual void AimHeadTowards( CBaseEntity *subject, + LookAtPriorityType priority = BORING, + float duration = 0.0f, + INextBotReply *replyWhenAimed = NULL, + const char *reason = NULL ); // continually aim the bot's head towards the given subject + + virtual bool IsHeadAimingOnTarget( void ) const; // return true if the bot's head has achieved its most recent lookat target + virtual bool IsHeadSteady( void ) const; // return true if head is not rapidly turning to look somewhere else + virtual float GetHeadSteadyDuration( void ) const; // return the duration that the bot's head has been on-target + virtual void ClearPendingAimReply( void ); // clear out currently pending replyWhenAimed callback + + virtual float GetMaxHeadAngularVelocity( void ) const; // return max turn rate of head in degrees/second + + virtual bool StartActivity( Activity act, unsigned int flags ); + virtual Activity GetActivity( void ) const; // return currently animating activity + virtual bool IsActivity( Activity act ) const; // return true if currently animating activity matches the given one + virtual bool HasActivityType( unsigned int flags ) const; // return true if currently animating activity has any of the given flags + + virtual void SetDesiredPosture( PostureType posture ); // request a posture change + virtual PostureType GetDesiredPosture( void ) const; // get posture body is trying to assume + virtual bool IsDesiredPosture( PostureType posture ) const; // return true if body is trying to assume this posture + virtual bool IsInDesiredPosture( void ) const; // return true if body's actual posture matches its desired posture + + virtual PostureType GetActualPosture( void ) const; // return body's current actual posture + virtual bool IsActualPosture( PostureType posture ) const; // return true if body is actually in the given posture + + virtual bool IsPostureMobile( void ) const; // return true if body's current posture allows it to move around the world + virtual bool IsPostureChanging( void ) const; // return true if body's posture is in the process of changing to new posture + + virtual void SetArousal( ArousalType arousal ); // arousal level change + virtual ArousalType GetArousal( void ) const; // get arousal level + virtual bool IsArousal( ArousalType arousal ) const; // return true if body is at this arousal level + + virtual float GetHullWidth( void ) const; // width of bot's collision hull in XY plane + virtual float GetHullHeight( void ) const; // height of bot's current collision hull based on posture + virtual float GetStandHullHeight( void ) const; // height of bot's collision hull when standing + virtual float GetCrouchHullHeight( void ) const; // height of bot's collision hull when crouched + virtual const Vector &GetHullMins( void ) const; // return current collision hull minimums based on actual body posture + virtual const Vector &GetHullMaxs( void ) const; // return current collision hull maximums based on actual body posture + + virtual unsigned int GetSolidMask( void ) const; // return the bot's collision mask (hack until we get a general hull trace abstraction here or in the locomotion interface) + + virtual CBaseEntity *GetEntity( void ); // get the entity +private: + CBasePlayer *m_player; + + PostureType m_posture; + ArousalType m_arousal; + + mutable Vector m_eyePos; // for use with GetEyePosition() ONLY + mutable Vector m_viewVector; // for use with GetViewVector() ONLY + mutable Vector m_hullMins; // for use with GetHullMins() ONLY + mutable Vector m_hullMaxs; // for use with GetHullMaxs() ONLY + + Vector m_lookAtPos; // if m_lookAtSubject is non-NULL, it continually overwrites this position with its own + EHANDLE m_lookAtSubject; + Vector m_lookAtVelocity; // world velocity of lookat point, for tracking moving subjects + CountdownTimer m_lookAtTrackingTimer; + + LookAtPriorityType m_lookAtPriority; + CountdownTimer m_lookAtExpireTimer; // how long until this lookat expired + IntervalTimer m_lookAtDurationTimer; // how long have we been looking at this target + INextBotReply *m_lookAtReplyWhenAimed; + bool m_isSightedIn; // true if we are looking at our last lookat target + bool m_hasBeenSightedIn; // true if we have hit the current lookat target + + IntervalTimer m_headSteadyTimer; + QAngle m_priorAngles; // last update's head angles + QAngle m_desiredAngles; + + CountdownTimer m_anchorRepositionTimer; // the time is takes us to recenter our virtual mouse + Vector m_anchorForward; +}; + +inline bool PlayerBody::IsHeadAimingOnTarget( void ) const +{ + // TODO: Calling this immediately after AimHeadTowards will always return false until next Upkeep() (MSB) + return m_isSightedIn; +} + + +#endif // _NEXT_BOT_PLAYER_BODY_H_ |