//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: A class embedded in players to provide hints to that player // //============================================================================= #ifndef HINTSYSTEM_H #define HINTSYSTEM_H #ifdef _WIN32 #pragma once #endif #ifdef CLIENT_DLL #include "c_baseplayer.h" #else #include "player.h" #endif #include "bitvec.h" class CHintMessageQueue; class CHintMessageTimers; typedef bool (*HintTimerCallback)( CBasePlayer *pOnPlayer ); //----------------------------------------------------------------------------- // Purpose: A class embedded in players to provide hints to that player //----------------------------------------------------------------------------- class CHintSystem { DECLARE_CLASS_NOBASE( CHintSystem ); public: CHintSystem(); ~CHintSystem(); //----------------------------------------------------- // Call this from your player constructor void Init( CBasePlayer *pPlayer, int iMaxHintTypes, const char **pszHintStrings ); //----------------------------------------------------- // CBasePlayer calls these for you, if you fall back to its // versions of Spawn(), Event_Killed(), and PreThink(). // Call this when your player respawns void ResetHints( void ); // Call this when your player dies void ResetHintTimers( void ); // Call this when in your player PreThink() void Update( void ); //----------------------------------------------------- // Hint addition // Call these to add a hint directly onscreen bool HintMessage( int hint, bool bForce = false, bool bOnlyIfClear = false ); void HintMessage( const char *pMessage ); // Call this to add a hint timer. It'll be reset for you automatically // everytime ResetHintTimers() is called. void RegisterHintTimer( int iHintID, float flTimerDuration, bool bOnlyIfClear = false, HintTimerCallback pfnCallback = NULL ); // Call these to start & stop registered hint timers void StartHintTimer( int iHintID ); void StopHintTimer( int iHintID ); void RemoveHintTimer( int iHintID ); bool TimerShouldFire( int iHintID ); // Set whether a player should see any hints at all void SetShowHints( bool bShowHints ) { m_bShowHints = bShowHints; } void SetHintPlayed( int iHintID ); bool ShouldShowHints( void ); // Returns true if the hint has been played already bool HasPlayedHint( int iHintID ); void PlayedAHint( void ); void ClearHintHistory( void ) { m_HintHistory.ClearAll(); } // Not really an optimal solution, but saves us querying the hud element, // which wouldn't be easy with derived versions in different mods. bool HintIsCurrentlyVisible( void ) { return (gpGlobals->curtime - m_flLastHintPlayedAt < 11 ); } private: void ReAddHintTimerIfNotDisplayed( int iHintID, float flTimerDuration ); private: CBasePlayer *m_pPlayer; float m_flLastHintPlayedAt; bool m_bShowHints; CVarBitVec m_HintHistory; const char **m_pszHintMessages; CHintMessageQueue *m_pHintMessageQueue; CHintMessageTimers *m_pHintMessageTimers; struct onresethints_t { int iHintID; float flTimer; bool bOnlyIfClear; HintTimerCallback pfnCallback; }; CUtlVector m_RegisteredResetHints; }; #ifdef CLIENT_DLL // Derive from this if you have an entity that wants to display a hint // when the player waves his target ID over it on the client. abstract_class ITargetIDProvidesHint { public: virtual void DisplayHintTo( C_BasePlayer *pPlayer ) = 0; }; #endif #endif // HINTSYSTEM_H