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.
150 lines
5.1 KiB
150 lines
5.1 KiB
// chicken.h
|
|
// An interactive, shootable chicken
|
|
|
|
#ifndef CHICKEN_H
|
|
#define CHICKEN_H
|
|
|
|
#include "props.h"
|
|
#include "GameEventListener.h"
|
|
#include "nav_mesh.h"
|
|
#include "cs_nav_path.h"
|
|
#include "cs_nav_pathfind.h"
|
|
#include "improv_locomotor.h"
|
|
|
|
class CCSPlayer;
|
|
|
|
class CChicken : public CDynamicProp, public CGameEventListener, public CImprovLocomotor
|
|
{
|
|
public:
|
|
DECLARE_CLASS( CChicken, CDynamicProp );
|
|
DECLARE_SERVERCLASS();
|
|
DECLARE_DATADESC();
|
|
|
|
CChicken();
|
|
virtual ~CChicken();
|
|
|
|
virtual void Precache( void );
|
|
virtual void Spawn( void );
|
|
virtual void ChickenTouch( CBaseEntity *pOther );
|
|
|
|
virtual int OnTakeDamage( const CTakeDamageInfo &info );
|
|
virtual void Event_Killed( const CTakeDamageInfo &info );
|
|
|
|
virtual void FireGameEvent( IGameEvent *event );
|
|
|
|
virtual bool IsAlive( void ) { return true; }
|
|
|
|
void ChickenThink( void );
|
|
|
|
bool IsZombie( void ) { return m_flWhenZombified > 0; }
|
|
void Zombify( void ) { m_flWhenZombified = gpGlobals->curtime; }
|
|
|
|
bool IsFollowingSomeone( void );
|
|
bool IsFollowing( const CBaseEntity *entity );
|
|
bool IsOnGround( void ) const;
|
|
|
|
void Follow( CCSPlayer *leader ); // begin following "leader"
|
|
CCSPlayer *GetLeader( void ) const; // return our leader, or NULL
|
|
|
|
void FaceTowards( const Vector &target, float deltaT ); // rotate body to face towards "target"
|
|
|
|
int ObjectCaps( void ) { return ( BaseClass::ObjectCaps( ) | FCAP_IMPULSE_USE ); }
|
|
|
|
public:
|
|
// begin CImprovLocomotor -----------------------------------------------------------------------------------------------------------------
|
|
virtual const Vector &GetCentroid( void ) const;
|
|
virtual const Vector &GetFeet( void ) const; // return position of "feet" - point below centroid of improv at feet level
|
|
virtual const Vector &GetEyes( void ) const;
|
|
virtual float GetMoveAngle( void ) const; // return direction of movement
|
|
|
|
virtual CNavArea *GetLastKnownArea( void ) const;
|
|
virtual bool GetSimpleGroundHeightWithFloor( const Vector &pos, float *height, Vector *normal = NULL ); // find "simple" ground height, treating current nav area as part of the floor
|
|
|
|
virtual void Crouch( void );
|
|
virtual void StandUp( void ); // "un-crouch"
|
|
virtual bool IsCrouching( void ) const;
|
|
|
|
virtual void Jump( void ); // initiate a jump
|
|
virtual bool IsJumping( void ) const;
|
|
|
|
bool CanJump( void ) const;
|
|
void Jump( float flVelocity );
|
|
|
|
virtual void Run( void ); // set movement speed to running
|
|
virtual void Walk( void ); // set movement speed to walking
|
|
virtual bool IsRunning( void ) const;
|
|
|
|
virtual void StartLadder( const CNavLadder *ladder, NavTraverseType how, const Vector &approachPos, const Vector &departPos ); // invoked when a ladder is encountered while following a path
|
|
virtual bool TraverseLadder( const CNavLadder *ladder, NavTraverseType how, const Vector &approachPos, const Vector &departPos, float deltaT ); // traverse given ladder
|
|
virtual bool IsUsingLadder( void ) const;
|
|
|
|
virtual void TrackPath( const Vector &pathGoal, float deltaT ); // move along path by following "pathGoal"
|
|
virtual void OnMoveToSuccess( const Vector &goal ); // invoked when an improv reaches its MoveTo goal
|
|
virtual void OnMoveToFailure( const Vector &goal, MoveToFailureType reason ); // invoked when an improv fails to reach a MoveTo goal
|
|
// end CImprovLocomotor -------------------------------------------------------------------------------------------------------------------
|
|
|
|
protected:
|
|
virtual void ChickenUse( CBaseEntity *pActivator, CBaseEntity *pCaller, USE_TYPE useType, float value );
|
|
void SetChickenStartFollowingPlayer( CCSPlayer *pPlayer );
|
|
|
|
private:
|
|
void Idle();
|
|
// void Walk();
|
|
void Flee( CBaseEntity *fleeFrom, float duration );
|
|
void Fly();
|
|
void Land();
|
|
|
|
void Update( void );
|
|
CountdownTimer m_updateTimer;
|
|
|
|
float AvoidObstacles( void );
|
|
Vector m_stuckAnchor;
|
|
CountdownTimer m_stuckTimer;
|
|
|
|
void ResolveCollisions( const Vector &desiredPosition, float deltaT );
|
|
bool m_isOnGround;
|
|
|
|
Activity m_activity;
|
|
CountdownTimer m_activityTimer;
|
|
float m_turnRate;
|
|
CHandle< CBaseEntity > m_fleeFrom;
|
|
CountdownTimer m_moveRateThrottleTimer;
|
|
|
|
CountdownTimer m_startleTimer;
|
|
|
|
CountdownTimer m_vocalizeTimer;
|
|
|
|
float m_flWhenZombified;
|
|
|
|
CNetworkVar( bool, m_jumpedThisFrame );
|
|
CNetworkVar( EHANDLE, m_leader ); // the player we are following
|
|
|
|
|
|
void UpdateFollowing( float deltaT ); // do following behavior
|
|
int m_lastLeaderID;
|
|
|
|
CountdownTimer m_reuseTimer; // to throttle how often hostage can be used
|
|
bool m_hasBeenUsed;
|
|
|
|
CountdownTimer m_jumpTimer; // if zero, we can jump
|
|
float m_flLastJumpTime;
|
|
bool m_bInJump;
|
|
|
|
bool m_isWaitingForLeader; // true if we are waiting for our rescuer to move
|
|
|
|
CCSNavPath m_path; // current path to follow
|
|
CountdownTimer m_repathTimer; // throttle pathfinder
|
|
|
|
CountdownTimer m_inhibitDoorTimer;
|
|
|
|
CNavPathFollower m_pathFollower; // path tracking mechanism
|
|
CountdownTimer m_inhibitObstacleAvoidanceTimer; // when active, turn off path following feelers
|
|
|
|
CNavArea *m_lastKnownArea; // last area we were in
|
|
Vector m_vecPathGoal;
|
|
|
|
float m_flActiveFollowStartTime; // when the current follow started
|
|
};
|
|
|
|
|
|
#endif // CHICKEN_H
|