//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $Workfile: $ // $Date: $ // $NoKeywords: $ //=============================================================================// #if !defined(GAMEMOVEMENT_H) #define GAMEMOVEMENT_H #ifdef _WIN32 #pragma once #endif #include "cmodel.h" #include "igamemovement.h" #include "tier0/vprof.h" #define CTEXTURESMAX 512 // max number of textures loaded #define CBTEXTURENAMEMAX 13 // only load first n chars of name #define GAMEMOVEMENT_DUCK_TIME 1000.0f // ms #define GAMEMOVEMENT_JUMP_TIME \ 510.0f // ms approx - based on the 21 unit height jump #define GAMEMOVEMENT_JUMP_HEIGHT 21.0f // units #define GAMEMOVEMENT_TIME_TO_UNDUCK (TIME_TO_UNDUCK * 1000.0f) // ms #define GAMEMOVEMENT_TIME_TO_UNDUCK_INV \ (GAMEMOVEMENT_DUCK_TIME - GAMEMOVEMENT_TIME_TO_UNDUCK) enum { SPEED_CROPPED_RESET = 0, SPEED_CROPPED_DUCK = 1, SPEED_CROPPED_WEAPON = 2, }; struct surfacedata_t; class CBasePlayer; class CGameMovement : public IGameMovement { public: DECLARE_CLASS_NOBASE(CGameMovement); CGameMovement(void); virtual ~CGameMovement(void); virtual void ProcessMovement(CBasePlayer *pPlayer, CMoveData *pMove); virtual void StartTrackPredictionErrors(CBasePlayer *pPlayer); virtual void FinishTrackPredictionErrors(CBasePlayer *pPlayer); virtual void DiffPrint(PRINTF_FORMAT_STRING char const *fmt, ...); virtual Vector GetPlayerMins(bool ducked) const; virtual Vector GetPlayerMaxs(bool ducked) const; virtual Vector GetPlayerViewOffset(bool ducked) const; // For sanity checking getting stuck on CMoveData::SetAbsOrigin virtual void TracePlayerBBox(const Vector &start, const Vector &end, unsigned int fMask, int collisionGroup, trace_t &pm); // allows derived classes to exclude entities from trace virtual void TryTouchGround(const Vector &start, const Vector &end, const Vector &mins, const Vector &maxs, unsigned int fMask, int collisionGroup, trace_t &pm); #define BRUSH_ONLY true virtual unsigned int PlayerSolidMask( bool brushOnly = false); ///< returns the solid mask for the given player, so bots ///< can have a more-restrictive set CBasePlayer *player; CMoveData *GetMoveData() { return mv; } protected: // Input/Output for this movement CMoveData *mv; int m_nOldWaterLevel; float m_flWaterEntryTime; int m_nOnLadder; Vector m_vecForward; Vector m_vecRight; Vector m_vecUp; // Does most of the player movement logic. // Returns with origin, angles, and velocity modified in place. // were contacted during the move. virtual void PlayerMove(void); // Set ground data, etc. void FinishMove(void); virtual float CalcRoll(const QAngle &angles, const Vector &velocity, float rollangle, float rollspeed); virtual void DecayPunchAngle(void); virtual void CheckWaterJump(void); virtual void WaterMove(void); void WaterJump(void); // Handles both ground friction and water friction void Friction(void); virtual void AirAccelerate(Vector &wishdir, float wishspeed, float accel); virtual void AirMove(void); virtual float GetAirSpeedCap(void) { return 30.f; } virtual bool CanAccelerate(); virtual void Accelerate(Vector &wishdir, float wishspeed, float accel); // Only used by players. Moves along the ground when player is a // MOVETYPE_WALK. virtual void WalkMove(void); // Try to keep a walking player on the ground when running down slopes etc void StayOnGround(void); // Handle MOVETYPE_WALK. virtual void FullWalkMove(); // allow overridden versions to respond to jumping virtual void OnJump(float fImpulse) {} virtual void OnLand(float fVelocity) {} // Implement this if you want to know when the player collides during // OnPlayerMove virtual void OnTryPlayerMoveCollision(trace_t &tr) {} virtual Vector GetPlayerMins(void) const; // uses local player virtual Vector GetPlayerMaxs(void) const; // uses local player typedef enum { GROUND = 0, STUCK, LADDER } IntervalType_t; virtual int GetCheckInterval(IntervalType_t type); // Useful for things that happen periodically. This lets things happen on // the specified interval, but spaces the events onto different frames for // different players so they don't all hit their spikes simultaneously. bool CheckInterval(IntervalType_t type); // Decompoosed gravity void StartGravity(void); void FinishGravity(void); // Apply normal ( undecomposed ) gravity void AddGravity(void); // Handle movement in noclip mode. void FullNoClipMove(float factor, float maxacceleration); // Returns true if he started a jump (ie: should he play the jump // animation)? virtual bool CheckJumpButton(void); // Overridden by each game. // Dead player flying through air., e.g. virtual void FullTossMove(void); // Player is a Observer chasing another player void FullObserverMove(void); // Handle movement when in MOVETYPE_LADDER mode. virtual void FullLadderMove(); // The basic solid body movement clip that slides along multiple planes virtual int TryPlayerMove(Vector *pFirstDest = NULL, trace_t *pFirstTrace = NULL); virtual bool LadderMove(void); virtual bool OnLadder(trace_t &trace); virtual float LadderDistance(void) const { return 2.0f; } ///< Returns the distance a player can be from a ladder and still attach ///< to it virtual unsigned int LadderMask(void) const { return MASK_PLAYERSOLID; } virtual float ClimbSpeed(void) const { return MAX_CLIMB_SPEED; } virtual float LadderLateralMultiplier(void) const { return 1.0f; } // See if the player has a bogus velocity value. void CheckVelocity(void); // Does not change the entities velocity at all void PushEntity(Vector &push, trace_t *pTrace); // Slide off of the impacting object // returns the blocked flags: // 0x01 == floor // 0x02 == step / wall int ClipVelocity(Vector &in, Vector &normal, Vector &out, float overbounce); // If pmove.origin is in a solid position, // try nudging slightly on all axis to // allow for the cut precision of the net coordinates virtual int CheckStuck(void); // Check if the point is in water. // Sets refWaterLevel and refWaterType appropriately. // If in water, applies current to baseVelocity, and returns true. virtual bool CheckWater(void); // Determine if player is in water, on ground, etc. virtual void CategorizePosition(void); virtual void CheckParameters(void); virtual void ReduceTimers(void); virtual void CheckFalling(void); virtual void PlayerRoughLandingEffects(float fvol); void PlayerWaterSounds(void); void ResetGetPointContentsCache(); int GetPointContentsCached(const Vector &point, int slot); // Ducking virtual void Duck(void); virtual void HandleDuckingSpeedCrop(); virtual void FinishUnDuck(void); virtual void FinishDuck(void); virtual bool CanUnduck(); void UpdateDuckJumpEyeOffset(void); bool CanUnDuckJump(trace_t &trace); void StartUnDuckJump(void); void FinishUnDuckJump(trace_t &trace); void SetDuckedEyeOffset(float duckFraction); void FixPlayerCrouchStuck(bool moveup); float SplineFraction(float value, float scale); void CategorizeGroundSurface(trace_t &pm); bool InWater(void); // Commander view movement void IsometricMove(void); // Traces the player bbox as it is swept from start to end virtual CBaseHandle TestPlayerPosition(const Vector &pos, int collisionGroup, trace_t &pm); // Checks to see if we should actually jump void PlaySwimSound(); bool IsDead(void) const; // Figures out how the constraint should slow us down float ComputeConstraintSpeedFactor(void); virtual void SetGroundEntity(trace_t *pm); virtual void StepMove(Vector &vecDestination, trace_t &trace); // when we step on ground that's too steep, search to see if there's any // ground nearby that isn't too steep void TryTouchGroundInQuadrants(const Vector &start, const Vector &end, unsigned int fMask, int collisionGroup, trace_t &pm); protected: // Performs the collision resolution for fliers. void PerformFlyCollisionResolution(trace_t &pm, Vector &move); virtual bool GameHasLadders() const; enum { // eyes, waist, feet points (since they are all deterministic MAX_PC_CACHE_SLOTS = 3, }; // Cache used to remove redundant calls to GetPointContents(). int m_CachedGetPointContents[MAX_PLAYERS][MAX_PC_CACHE_SLOTS]; Vector m_CachedGetPointContentsPoint[MAX_PLAYERS][MAX_PC_CACHE_SLOTS]; Vector m_vecProximityMins; // Used to be globals in sv_user.cpp. Vector m_vecProximityMaxs; float m_fFrameTime; // private: int m_iSpeedCropped; float m_flStuckCheckTime[MAX_PLAYERS + 1] [2]; // Last time we did a full test // special function for teleport-with-duck for episodic #ifdef HL2_EPISODIC public: void ForceDuck(void); #endif }; #endif // GAMEMOVEMENT_H