diff options
Diffstat (limited to 'game/shared/hintsystem.h')
| -rw-r--r-- | game/shared/hintsystem.h | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/game/shared/hintsystem.h b/game/shared/hintsystem.h new file mode 100644 index 0000000..813fc8b --- /dev/null +++ b/game/shared/hintsystem.h @@ -0,0 +1,116 @@ +//========= 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<onresethints_t> 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 |