117 lines
3.6 KiB
C++
117 lines
3.6 KiB
C++
//====== Copyright © 1996-2005, 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
|