summaryrefslogtreecommitdiff
path: root/game/server/NextBot/Player/NextBotPlayerBody.h
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/NextBot/Player/NextBotPlayerBody.h')
-rw-r--r--game/server/NextBot/Player/NextBotPlayerBody.h153
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_