diff options
Diffstat (limited to 'game/server/ai_networkmanager.h')
| -rw-r--r-- | game/server/ai_networkmanager.h | 199 |
1 files changed, 199 insertions, 0 deletions
diff --git a/game/server/ai_networkmanager.h b/game/server/ai_networkmanager.h new file mode 100644 index 0000000..e8e6130 --- /dev/null +++ b/game/server/ai_networkmanager.h @@ -0,0 +1,199 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#ifndef AI_NETWORKMANAGER_H +#define AI_NETWORKMANAGER_H + +#include "utlvector.h" +#include "bitstring.h" + +#if defined( _WIN32 ) +#pragma once +#endif + +class CAI_NetworkEditTools; +class CAI_Network; +class CAI_Node; +class CAI_Link; +class CAI_TestHull; + +//----------------------------------------------------------------------------- +// CAI_NetworkManager +// +// Purpose: The entity in the level responsible for building the network if it +// isn't there, saving & loading of the network, and holding the +// CAI_Network instance. +// +//----------------------------------------------------------------------------- + +class CAI_NetworkManager : public CPointEntity +{ +public: + static void InitializeAINetworks(); + + DECLARE_DATADESC(); + + DECLARE_CLASS( CAI_NetworkManager, CPointEntity ); + +public: + CAI_NetworkManager(void); + virtual ~CAI_NetworkManager(void); + + void Spawn (); + virtual int ObjectCaps( void ) { return BaseClass::ObjectCaps() | FCAP_DONT_SAVE; } + void RebuildNetworkGraph(); // Used in WC edit mode + void StartRebuild(); // Used in WC edit mode + void LoadNetworkGraph(); + + static bool NetworksLoaded() { return gm_fNetworksLoaded; } + bool IsInitialized() { return m_fInitalized; } + + void BuildNetworkGraph(); + + static void DeleteAllAINetworks(); + + void FixupHints(); + void MarkDontSaveGraph(); + +public: + CAI_NetworkEditTools * GetEditOps() { return m_pEditOps; } + CAI_Network * GetNetwork() { return m_pNetwork; } + +private: + + void DelayedInit(); + void RebuildThink(); + void SaveNetworkGraph( void) ; + static bool IsAIFileCurrent( const char *szMapName ); + + static bool gm_fNetworksLoaded; // Have AINetworks been loaded + + bool m_bNeedGraphRebuild; + CAI_NetworkEditTools * m_pEditOps; + CAI_Network * m_pNetwork; + + + bool m_fInitalized; + bool m_bDontSaveGraph; +}; + +//----------------------------------------------------------------------------- + +abstract_class CAI_NetworkBuildHelper : public CLogicalEntity +{ + DECLARE_CLASS( CAI_NetworkBuildHelper, CLogicalEntity ); + +public: + virtual void PostInitNodePosition( CAI_Network *pNetwork, CAI_Node *pNode ) = 0; +}; + +//----------------------------------------------------------------------------- + +class CAI_NetworkBuilder +{ +public: + void Build( CAI_Network *pNetwork ); + void Rebuild( CAI_Network *pNetwork ); + + void InitNodePosition( CAI_Network *pNetwork, CAI_Node *pNode ); + + void InitZones( CAI_Network *pNetwork ); + +private: + void InitVisibility( CAI_Network *pNetwork, CAI_Node *pNode ); + void InitNeighbors( CAI_Network *pNetwork, CAI_Node *pNode ); + void InitClimbNodePosition( CAI_Network *pNetwork, CAI_Node *pNode ); + void InitGroundNodePosition( CAI_Network *pNetwork, CAI_Node *pNode ); + void InitLinks( CAI_Network *pNetwork, CAI_Node *pNode ); + void ForceDynamicLinkNeighbors(); + + void FloodFillZone( CAI_Node **ppNodes, CAI_Node *pNode, int zone ); + + int ComputeConnection( CAI_Node *pSrcNode, CAI_Node *pDestNode, Hull_t hull ); + + void BeginBuild(); + void EndBuild(); + + CUtlVector<CVarBitVec> m_NeighborsTable; + CVarBitVec m_DidSetNeighborsTable; + CAI_TestHull * m_pTestHull; +}; + +extern CAI_NetworkBuilder g_AINetworkBuilder; + +//----------------------------------------------------------------------------- +// CAI_NetworkEditTools +// +// Purpose: Bridge class to Hammer node editing functionality +// +//----------------------------------------------------------------------------- + +class CAI_NetworkEditTools +{ +public: + CAI_NetworkEditTools(CAI_NetworkManager *); + ~CAI_NetworkEditTools(); + // ---------------------- + // Debug & Edit fields + // ---------------------- + static CAI_Node * m_pLastDeletedNode; // For undo in wc edit mode + static int m_iHullDrawNum; // Which hulls to draw + static int m_iVisibilityNode; // Node I'm showing visibility for + static int m_iGConnectivityNode; // Node I'm showing graph connectivity for + static bool m_bAirEditMode; // Editing Air Nodes + static bool m_bLinkEditMode; // Editing Links + static float m_flAirEditDistance; // Distance editing Air Nodes + + static void DrawHull(Hull_t eHull); + static void DrawNextHull(const char *ainet_name); // Draws next hull set for the named ai network + static void SetDebugBits(const char *ainet_name,int debug_bit); + + static CAI_Node * FindAINodeNearestFacing( const Vector &origin, const Vector &facing, float threshold, int nNodeType); + static CAI_Link * FindAILinkNearestFacing( const Vector &origin, const Vector &facing, float threshold); + + //--------------- + // WC Editing + //--------------- + int m_nNextWCIndex; // Next unused index used by WC + Vector * m_pWCPosition; // Array of vectors only used in wc edit mode + + //----------------- + // Debugging Tools + //----------------- + int m_debugNetOverlays; // Which network debug overlays to draw + void DrawAINetworkOverlay(void); // Draw network on the client + + void RecalcUsableNodesForHull(void); // Used only for debug drawing + + //----------------- + void OnInit(); + + int GetNodeIdFromWCId( int nWCId ); + int GetWCIdFromNodeId( int nNodeId ); + int * m_pNodeIndexTable; // Table of WC Id's to Engine Id's + + void ClearRebuildFlags(); + void SetRebuildFlags(); + void DrawEditInfoOverlay(); + +#ifdef AI_PERF_MON + //---------------------- + // Performance stats + //---------------------- + static int m_nPerfStatNN; + static int m_nPerfStatPB; + static float m_fNextPerfStatTime; +#endif + + CAI_NetworkManager *m_pManager; + CAI_Network * m_pNetwork; + + +}; + +//----------------------------------------------------------------------------- + +#endif // AI_NETWORKMANAGER_H |