This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
2020-08-04 13:13:01 -04:00

112 lines
3.3 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#ifndef HINTMESSAGE_H
#define HINTMESSAGE_H
#ifdef _WIN32
#pragma once
#endif
#include "simtimer.h"
#include "utlvector.h"
#ifdef GAME_DLL
#include "player.h"
#else
#include "c_baseplayer.h"
#endif
class CHintSystem;
//--------------------------------------------------------------------------------------------------------------
class CHintMessage {
public:
CHintMessage(const char *hintString, CUtlVector<const char *> *args,
float duration);
~CHintMessage();
float GetDuration() const { return m_duration; }
void Send(CBasePlayer *client);
bool IsEquivalent(const char *hintString,
CUtlVector<const char *> *args) const;
private:
const char *m_hintString; ///< hintString is a pointer to a string that
///< should never be deleted.
CUtlVector<char *> m_args; ///< list of arguments. The memory for these
///< strings is internal to the CHintMessage.
float m_duration; ///< time until the next message can be displayed
};
//--------------------------------------------------------------------------------------------------------------
class CHintMessageQueue {
public:
CHintMessageQueue(CBasePlayer *pPlayer);
void Reset();
void Update();
bool AddMessage(const char *message, float duration = 6.0f,
CUtlVector<const char *> *args = NULL);
inline bool IsEmpty() { return m_messages.Count() == 0; }
private:
float m_tmMessageEnd;
CUtlVector<CHintMessage *> m_messages;
CBasePlayer *m_pPlayer;
};
//--------------------------------------------------------------------------------------------------------------
//--------------------------------------------------------------------------------------------------------------
// Timers that manage hint messages that should be displayed after some time.
class CHintMessageTimers {
public:
CHintMessageTimers(void);
CHintMessageTimers(CHintSystem *pSystem, CHintMessageQueue *pQueue);
void Reset();
void Update();
// Add / Register timers that will be started/stopped during play
void AddTimer(int iHintID, float timer_duration,
float message_duration = 6.0f,
CUtlVector<const char *> *args = NULL);
void RemoveTimer(int iHintID);
// Start / Stop timers that were previously registered via AddTimer()
void StartTimer(int iHintID);
void StopTimer(int iHintID);
private:
int GetTimerIndex(int iHintID);
private:
struct hintmessagetime_t {
hintmessagetime_t(float flTimerDuration) : timer(flTimerDuration) {
iHintID = 0;
flMessageDuration = 6.0;
}
~hintmessagetime_t() {
for (int i = 0; i < args.Count(); ++i) {
delete[] args[i];
}
args.RemoveAll();
}
int iHintID;
CStopwatch timer;
float flMessageDuration;
CUtlVector<char *> args;
};
CUtlVector<hintmessagetime_t *> m_Timers;
CHintMessageQueue *m_pQueue;
CHintSystem *m_pHintSystem;
};
#endif // HINTMESSAGE_H