diff options
Diffstat (limited to 'game/server/tf/nav_mesh/tf_nav_mesh.h')
| -rw-r--r-- | game/server/tf/nav_mesh/tf_nav_mesh.h | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/game/server/tf/nav_mesh/tf_nav_mesh.h b/game/server/tf/nav_mesh/tf_nav_mesh.h new file mode 100644 index 0000000..19ae078 --- /dev/null +++ b/game/server/tf/nav_mesh/tf_nav_mesh.h @@ -0,0 +1,235 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// tf_nav_mesh.h +// TF specific nav mesh +// Michael Booth, February 2009 + +#ifndef TF_NAV_MESH_H +#define TF_NAV_MESH_H + +#include "nav_mesh.h" +#include "tf_nav_area.h" +#include "tf_obj_teleporter.h" + +#define TF_PLAYER_JUMP_HEIGHT 45.0f // non crouch-jumping + +class CBaseObject; +class CObjectTeleporter; +class CTFPlayer; + +//------------------------------------------------------------------------- +// General purpose collector class for ForAllArea-style functor methods +class CTFAreaCollector +{ +public: + bool operator() ( CNavArea *area ) + { + m_vector.AddToTail( (CTFNavArea *)area ); + return true; + } + + CUtlVector< CTFNavArea * > m_vector; +}; + + +//------------------------------------------------------------------------- +class CTFNavMesh : public CNavMesh +{ +public: + CTFNavMesh( void ); + + virtual CTFNavArea *CreateArea( void ) const; // CNavArea factory + + virtual void Update( void ); // invoked on each game frame + + virtual unsigned int GetSubVersionNumber( void ) const; // returns sub-version number of data format used by derived classes + virtual void SaveCustomData( CUtlBuffer &fileBuffer ) const; // store custom mesh data for derived classes + virtual void LoadCustomData( CUtlBuffer &fileBuffer, unsigned int subVersion ); // load custom mesh data for derived classes + + virtual void OnServerActivate( void ); // (EXTEND) invoked when server loads a new map + virtual void OnRoundRestart( void ); // invoked when a game round restarts + + virtual void FireGameEvent( IGameEvent *event ); + + /** + * Return true if nav mesh can be trusted for all climbing/jumping decisions because game environment is fairly simple. + * Authoritative meshes mean path followers can skip CPU intesive realtime scanning of unpredictable geometry. + */ + virtual bool IsAuthoritative( void ) const { return true; } // TF2 has nice clean environments + + virtual unsigned int GetGenerationTraceMask( void ) const; // return the mask used by traces when generating the mesh + + void OnObjectChanged(); + bool IsSentryGunHere( CTFNavArea *area ) const; // return true if a Sentry Gun has been built in the given area + + void CollectBuiltObjects( CUtlVector< CBaseObject * > *collectionVector, int team = TEAM_ANY ); // fill given vector will all objects on the given team + + struct BallisticLaunchInfo + { + Vector m_launchSpot; // where to stand + float m_aimYaw; // how to aim + float m_aimPitch; // how to aim + float m_chargeTime; // how long to charge weapon + }; + + // populate the given vector with ways to launch grenades to hit the given building + void CollectBallisticAttackInfo( CBaseObject *building, CUtlVector< BallisticLaunchInfo > *infoVector ) const; + + void ResetMeshAttributes( bool bScheduleRecomputation ); + + void CollectControlPointAreas( void ); + + void DecorateMesh( void ); + void DecorateMeshTacticalHints( void ); + void RemoveAllMeshDecoration( void ); + + // populate the given "ambushVector" with good areas to lurk in ambush for the invading enemy team + void CollectAmbushAreas( CUtlVector< CTFNavArea * > *ambushVector, CTFNavArea *startArea, int teamToAmbush, float searchRadius, float incursionTolerance = 300.0f ) const; + + // populate the given vector with areas that are just outside of the given team's spawn room(s) + void CollectSpawnRoomThresholdAreas( CUtlVector< CTFNavArea * > *spawnExitAreaVector, int team ) const; + + // populate the given vector with areas that have a bomb travel distance within the given range + void CollectAreaWithinBombTravelRange( CUtlVector< CTFNavArea * > *spawnExitAreaVector, float minTravel, float maxTravel ) const; + + const CUtlVector< CTFNavArea * > *GetSetupGateDefenseAreas( void ) const; // return vector of areas that are good for defending enemies coming out of the blue setup gates + const CUtlVector< CTFNavArea * > *GetControlPointAreas( int pointIndex ) const; // return vector of areas overlapping the given control point + CTFNavArea *GetControlPointCenterArea( int pointIndex ) const; // return area overlapping the center of the given control point + const CUtlVector< CTFNavArea * > *GetSpawnRoomAreas( int team ) const; // return vector of areas within the given team spawn room(s) + const CUtlVector< CTFNavArea * > *GetSpawnRoomExitAreas( int team ) const; // return vector of areas where the given team exits their spawn room(s) + + enum RecomputeReasonType + { + RESET, + SETUP_FINISHED, + POINT_CAPTURED, + POINT_UNLOCKED, + BLOCKED_STATUS_CHANGED, + MAP_LOGIC + }; + void ScheduleRecomputationOfInternalData( RecomputeReasonType reason, int whichPoint ); + + +protected: + virtual void BeginCustomAnalysis( bool bIncremental ); + virtual void PostCustomAnalysis( void ); // invoked when custom analysis step is complete + virtual void EndCustomAnalysis(); + +private: + void ComputeIncursionDistances( void ); // recompute travel distance from each team's spawn room for each nav area + void ComputeIncursionDistances( CTFNavArea *spawnArea, int team ); + void ComputeInvasionAreas( void ); + void ComputeLegalBombDropAreas( void ); + void ComputeBombTargetDistance(); + + void UpdateDebugDisplay( void ) const; + + void OnBlockedAreasChanged( void ); + + void ComputeBlockedAreas( void ); + + CountdownTimer m_recomputeInternalDataTimer; // if started, when counts down recompute internal data to give various map logic time to complete + RecomputeReasonType m_recomputeReason; + int m_recomputeReasonWhichPoint; + void RecomputeInternalData( void ); + + // Array of areas with sentry danger attributes set. + CUtlVector< CTFNavArea * > m_sentryAreas; + + CUtlVector< CTFNavArea * > m_setupGateDefenseAreaVector; + + CUtlVector< CTFNavArea * > m_controlPointAreaVector[ MAX_CONTROL_POINTS ]; + CTFNavArea *m_controlPointCenterAreaVector[ MAX_CONTROL_POINTS ]; + + CUtlVector< CTFNavArea * > m_redSpawnRoomAreaVector; + CUtlVector< CTFNavArea * > m_blueSpawnRoomAreaVector; + + CUtlVector< CTFNavArea * > m_redSpawnRoomExitAreaVector; + CUtlVector< CTFNavArea * > m_blueSpawnRoomExitAreaVector; + void CollectAndMarkSpawnRoomExits( CTFNavArea *area, CUtlVector< CTFNavArea * > *exitAreaVector ); + + CountdownTimer m_watchCartTimer; + + int m_priorBotCount; +}; + + +inline void CTFNavMesh::ScheduleRecomputationOfInternalData( CTFNavMesh::RecomputeReasonType reason, int whichPoint = 0 ) +{ + m_recomputeInternalDataTimer.Start( 2.0f ); + m_recomputeReason = reason; + m_recomputeReasonWhichPoint = whichPoint; +} + + +inline const CUtlVector< CTFNavArea * > *CTFNavMesh::GetSpawnRoomAreas( int team ) const +{ + if ( team == TF_TEAM_RED ) + { + return &m_redSpawnRoomAreaVector; + } + + if ( team == TF_TEAM_BLUE ) + { + return &m_blueSpawnRoomAreaVector; + } + + return NULL; +} + +inline const CUtlVector< CTFNavArea * > *CTFNavMesh::GetSpawnRoomExitAreas( int team ) const +{ + if ( team == TF_TEAM_RED ) + { + return &m_redSpawnRoomExitAreaVector; + } + + if ( team == TF_TEAM_BLUE ) + { + return &m_blueSpawnRoomExitAreaVector; + } + + return NULL; +} + +inline const CUtlVector< CTFNavArea * > *CTFNavMesh::GetControlPointAreas( int pointIndex ) const +{ + if ( pointIndex < 0 || pointIndex >= MAX_CONTROL_POINTS ) + { + return NULL; + } + + return &m_controlPointAreaVector[ pointIndex ]; +} + +inline CTFNavArea *CTFNavMesh::GetControlPointCenterArea( int pointIndex ) const +{ + if ( pointIndex < 0 || pointIndex >= MAX_CONTROL_POINTS ) + { + return NULL; + } + + return m_controlPointCenterAreaVector[ pointIndex ]; +} + +inline const CUtlVector< CTFNavArea * > *CTFNavMesh::GetSetupGateDefenseAreas( void ) const +{ + return &m_setupGateDefenseAreaVector; +} + + +inline unsigned int CTFNavMesh::GetGenerationTraceMask( void ) const +{ + return MASK_PLAYERSOLID_BRUSHONLY; +} + + +inline CTFNavMesh *TheTFNavMesh( void ) +{ + return reinterpret_cast< CTFNavMesh * >( TheNavMesh ); +} + + +extern TFNavAttributeType NameToTFAttribute( const char *name ); +extern const char *TFAttributeToName( TFNavAttributeType attribute ); + +#endif // TF_NAV_MESH_H
\ No newline at end of file |