mirror of
https://github.com/0TheSpy/Seaside.git
synced 2025-01-11 11:33:01 +08:00
405 lines
9.5 KiB
C++
405 lines
9.5 KiB
C++
#ifndef HUD_BASECHAT_H
|
|
#define HUD_BASECHAT_H
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
#include "hudelement.h"
|
|
#include "Panel.h"
|
|
#include "vgui_basepanel.h"
|
|
#include "Frame.h"
|
|
#include "TextEntry.h"
|
|
#include "RichText.h"
|
|
#include "Button.h"
|
|
#include "CheckButton.h"
|
|
|
|
class CBaseHudChatInputLine;
|
|
class CBaseHudChatEntry;
|
|
class CHudChatFilterPanel;
|
|
|
|
namespace vgui
|
|
{
|
|
class IScheme;
|
|
};
|
|
|
|
#define CHATLINE_NUM_FLASHES 8.0f
|
|
#define CHATLINE_FLASH_TIME 5.0f
|
|
#define CHATLINE_FADE_TIME 1.0f
|
|
|
|
#define CHAT_HISTORY_FADE_TIME 0.25f
|
|
#define CHAT_HISTORY_IDLE_TIME 15.0f
|
|
#define CHAT_HISTORY_IDLE_FADE_TIME 2.5f
|
|
#define CHAT_HISTORY_ALPHA 127
|
|
|
|
extern Color g_ColorBlue;
|
|
extern Color g_ColorRed;
|
|
extern Color g_ColorGreen;
|
|
extern Color g_ColorDarkGreen;
|
|
extern Color g_ColorYellow;
|
|
extern Color g_ColorGrey;
|
|
|
|
extern ConVar cl_showtextmsg;
|
|
|
|
enum ChatFilters
|
|
{
|
|
CHAT_FILTER_NONE = 0,
|
|
CHAT_FILTER_JOINLEAVE = 0x000001,
|
|
CHAT_FILTER_NAMECHANGE = 0x000002,
|
|
CHAT_FILTER_PUBLICCHAT = 0x000004,
|
|
CHAT_FILTER_SERVERMSG = 0x000008,
|
|
CHAT_FILTER_TEAMCHANGE = 0x000010,
|
|
CHAT_FILTER_ACHIEVEMENT = 0x000020,
|
|
|
|
};
|
|
|
|
|
|
enum TextColor
|
|
{
|
|
COLOR_NORMAL = 1,
|
|
COLOR_USEOLDCOLORS = 2,
|
|
COLOR_PLAYERNAME = 3,
|
|
COLOR_LOCATION = 4,
|
|
COLOR_ACHIEVEMENT = 5,
|
|
COLOR_CUSTOM = 6,
|
|
COLOR_HEXCODE = 7,
|
|
COLOR_HEXCODE_ALPHA = 8,
|
|
COLOR_MAX
|
|
};
|
|
|
|
struct TextRange
|
|
{
|
|
TextRange() { preserveAlpha = false; }
|
|
int start;
|
|
int end;
|
|
Color color;
|
|
bool preserveAlpha;
|
|
};
|
|
|
|
void StripEndNewlineFromString(char* str);
|
|
void StripEndNewlineFromString(wchar_t* str);
|
|
|
|
char* ConvertCRtoNL(char* str);
|
|
wchar_t* ConvertCRtoNL(wchar_t* str);
|
|
wchar_t* ReadLocalizedString(bf_read& msg, OUT_Z_BYTECAP(outSizeInBytes) wchar_t* pOut, int outSizeInBytes, bool bStripNewline, OUT_Z_CAP(originalSize) char* originalString = NULL, int originalSize = 0);
|
|
wchar_t* ReadChatTextString(bf_read& msg, OUT_Z_BYTECAP(outSizeInBytes) wchar_t* pOut, int outSizeInBytes);
|
|
char* RemoveColorMarkup(char* str);
|
|
|
|
inline wchar_t* CloneWString(const wchar_t* str)
|
|
{
|
|
const int nLen = V_wcslen(str) + 1;
|
|
wchar_t* cloneStr = new wchar_t[nLen];
|
|
const int nSize = nLen * sizeof(wchar_t);
|
|
V_wcsncpy(cloneStr, str, nSize);
|
|
return cloneStr;
|
|
}
|
|
|
|
class CBaseHudChatLine : public vgui::RichText
|
|
{
|
|
typedef vgui::RichText BaseClass;
|
|
|
|
public:
|
|
CBaseHudChatLine(vgui::Panel* parent, const char* panelName);
|
|
~CBaseHudChatLine();
|
|
|
|
void SetExpireTime(void);
|
|
|
|
bool IsReadyToExpire(void);
|
|
|
|
void Expire(void);
|
|
|
|
float GetStartTime(void);
|
|
|
|
int GetCount(void);
|
|
|
|
virtual void ApplySchemeSettings(vgui::IScheme* pScheme);
|
|
|
|
vgui::HFont GetFont() { return m_hFont; }
|
|
|
|
Color GetTextColor(void) { return m_clrText; }
|
|
void SetNameLength(int iLength) { m_iNameLength = iLength; }
|
|
void SetNameColor(Color cColor) { m_clrNameColor = cColor; }
|
|
|
|
virtual void PerformFadeout(void);
|
|
virtual void InsertAndColorizeText(wchar_t* buf, int clientIndex);
|
|
virtual void Colorize(int alpha = 255);
|
|
|
|
|
|
void SetNameStart(int iStart) { m_iNameStart = iStart; }
|
|
|
|
protected:
|
|
int m_iNameLength;
|
|
vgui::HFont m_hFont;
|
|
|
|
Color m_clrText;
|
|
Color m_clrNameColor;
|
|
|
|
float m_flExpireTime;
|
|
|
|
CUtlVector< TextRange > m_textRanges;
|
|
wchar_t* m_text;
|
|
|
|
int m_iNameStart;
|
|
|
|
private:
|
|
float m_flStartTime;
|
|
int m_nCount;
|
|
|
|
vgui::HFont m_hFontMarlett;
|
|
|
|
|
|
private:
|
|
CBaseHudChatLine(const CBaseHudChatLine&);
|
|
};
|
|
|
|
|
|
class CHudChatHistory : public vgui::RichText
|
|
{
|
|
DECLARE_CLASS_SIMPLE(CHudChatHistory, vgui::RichText);
|
|
public:
|
|
|
|
CHudChatHistory(vgui::Panel* pParent, const char* panelName);
|
|
|
|
virtual void ApplySchemeSettings(vgui::IScheme* pScheme);
|
|
};
|
|
|
|
class CHudChatFilterButton : public vgui::Button
|
|
{
|
|
DECLARE_CLASS_SIMPLE(CHudChatFilterButton, vgui::Button);
|
|
|
|
public:
|
|
|
|
CHudChatFilterButton(vgui::Panel* pParent, const char* pName, const char* pText);
|
|
|
|
virtual void DoClick(void);
|
|
};
|
|
|
|
class CHudChatFilterCheckButton : public vgui::CheckButton
|
|
{
|
|
DECLARE_CLASS_SIMPLE(CHudChatFilterCheckButton, vgui::CheckButton);
|
|
|
|
public:
|
|
|
|
CHudChatFilterCheckButton(vgui::Panel* pParent, const char* pName, const char* pText, int iFlag);
|
|
|
|
int GetFilterFlag(void) { return m_iFlag; }
|
|
|
|
private:
|
|
|
|
int m_iFlag;
|
|
};
|
|
|
|
|
|
class CBaseHudChat : public CHudElement, public vgui::EditablePanel
|
|
{
|
|
DECLARE_CLASS_SIMPLE(CBaseHudChat, vgui::EditablePanel);
|
|
public:
|
|
DECLARE_MULTIPLY_INHERITED();
|
|
|
|
enum
|
|
{
|
|
CHAT_INTERFACE_LINES = 6,
|
|
MAX_CHARS_PER_LINE = 128
|
|
};
|
|
|
|
CBaseHudChat(const char* pElementName);
|
|
|
|
virtual void CreateChatInputLine(void);
|
|
virtual void CreateChatLines(void);
|
|
|
|
virtual void Init(void);
|
|
|
|
void LevelInit(const char* newmap);
|
|
void LevelShutdown(void);
|
|
|
|
void MsgFunc_TextMsg(const char* pszName, int iSize, void* pbuf);
|
|
|
|
virtual void Printf(int iFilter, PRINTF_FORMAT_STRING const char* fmt, ...);
|
|
virtual void ChatPrintf(int iPlayerIndex, int iFilter, PRINTF_FORMAT_STRING const char* fmt, ...) FMTFUNCTION(4, 5);
|
|
|
|
virtual void StartMessageMode(int iMessageModeType);
|
|
virtual void StopMessageMode(void);
|
|
void Send(void);
|
|
|
|
MESSAGE_FUNC(OnChatEntrySend, "ChatEntrySend");
|
|
MESSAGE_FUNC(OnChatEntryStopMessageMode, "ChatEntryStopMessageMode");
|
|
|
|
virtual void ApplySchemeSettings(vgui::IScheme* pScheme);
|
|
virtual void Paint(void);
|
|
virtual void OnTick(void);
|
|
virtual void Reset();
|
|
#ifdef _XBOX
|
|
virtual bool ShouldDraw();
|
|
#endif
|
|
vgui::Panel* GetInputPanel(void);
|
|
|
|
static int m_nLineCounter;
|
|
|
|
virtual int GetChatInputOffset(void);
|
|
|
|
virtual void FireGameEvent(IGameEvent* event);
|
|
|
|
CHudChatHistory* GetChatHistory();
|
|
|
|
void FadeChatHistory();
|
|
float m_flHistoryFadeTime;
|
|
float m_flHistoryIdleTime;
|
|
|
|
virtual void MsgFunc_SayText(bf_read& msg);
|
|
virtual void MsgFunc_SayText2(bf_read& msg);
|
|
virtual void MsgFunc_TextMsg(bf_read& msg);
|
|
virtual void MsgFunc_VoiceSubtitle(bf_read& msg);
|
|
|
|
|
|
CBaseHudChatInputLine* GetChatInput(void) { return m_pChatInput; }
|
|
CHudChatFilterPanel* GetChatFilterPanel(void);
|
|
|
|
virtual int GetFilterFlags(void) { return m_iFilterFlags; }
|
|
void SetFilterFlag(int iFilter);
|
|
|
|
virtual Color GetDefaultTextColor(void);
|
|
virtual Color GetTextColorForClient(TextColor colorNum, int clientIndex);
|
|
virtual Color GetClientColor(int clientIndex);
|
|
|
|
virtual int GetFilterForString(const char* pString);
|
|
|
|
virtual const char* GetDisplayedSubtitlePlayerName(int clientIndex);
|
|
|
|
bool IsVoiceSubtitle(void) { return m_bEnteringVoice; }
|
|
void SetVoiceSubtitleState(bool bState) { m_bEnteringVoice = bState; }
|
|
int GetMessageMode(void) { return m_nMessageMode; }
|
|
|
|
void SetCustomColor(Color colNew) { m_ColorCustom = colNew; }
|
|
void SetCustomColor(const char* pszColorName);
|
|
|
|
protected:
|
|
CBaseHudChatLine* FindUnusedChatLine(void);
|
|
|
|
CBaseHudChatInputLine* m_pChatInput;
|
|
CBaseHudChatLine* m_ChatLine;
|
|
int m_iFontHeight;
|
|
|
|
CHudChatHistory* m_pChatHistory;
|
|
|
|
CHudChatFilterButton* m_pFiltersButton;
|
|
CHudChatFilterPanel* m_pFilterPanel;
|
|
|
|
Color m_ColorCustom;
|
|
|
|
private:
|
|
void Clear(void);
|
|
|
|
int ComputeBreakChar(int width, const char* text, int textlen);
|
|
|
|
int m_nMessageMode;
|
|
|
|
int m_nVisibleHeight;
|
|
|
|
vgui::HFont m_hChatFont;
|
|
|
|
int m_iFilterFlags;
|
|
bool m_bEnteringVoice;
|
|
|
|
};
|
|
|
|
class CBaseHudChatEntry : public vgui::TextEntry
|
|
{
|
|
typedef vgui::TextEntry BaseClass;
|
|
public:
|
|
CBaseHudChatEntry(vgui::Panel* parent, char const* panelName, vgui::Panel* pChat)
|
|
: BaseClass(parent, panelName)
|
|
{
|
|
SetCatchEnterKey(true);
|
|
SetAllowNonAsciiCharacters(true);
|
|
SetDrawLanguageIDAtLeft(true);
|
|
m_pHudChat = pChat;
|
|
}
|
|
|
|
virtual void ApplySchemeSettings(vgui::IScheme* pScheme)
|
|
{
|
|
BaseClass::ApplySchemeSettings(pScheme);
|
|
|
|
SetPaintBorderEnabled(false);
|
|
}
|
|
|
|
virtual void OnKeyCodeTyped(vgui::KeyCode code)
|
|
{
|
|
if (code == KEY_ENTER || code == KEY_PAD_ENTER || code == KEY_ESCAPE)
|
|
{
|
|
if (code != KEY_ESCAPE)
|
|
{
|
|
if (m_pHudChat)
|
|
{
|
|
PostMessage(m_pHudChat, new KeyValues("ChatEntrySend"));
|
|
}
|
|
}
|
|
|
|
if (m_pHudChat)
|
|
{
|
|
PostMessage(m_pHudChat, new KeyValues("ChatEntryStopMessageMode"));
|
|
}
|
|
}
|
|
else if (code == KEY_TAB)
|
|
{
|
|
return;
|
|
}
|
|
else
|
|
{
|
|
BaseClass::OnKeyCodeTyped(code);
|
|
}
|
|
}
|
|
|
|
private:
|
|
vgui::Panel* m_pHudChat;
|
|
};
|
|
|
|
class CBaseHudChatInputLine : public vgui::Panel
|
|
{
|
|
typedef vgui::Panel BaseClass;
|
|
|
|
public:
|
|
CBaseHudChatInputLine(vgui::Panel* parent, char const* panelName);
|
|
|
|
void SetPrompt(const wchar_t* prompt);
|
|
void ClearEntry(void);
|
|
void SetEntry(const wchar_t* entry);
|
|
void GetMessageText(OUT_Z_BYTECAP(buffersizebytes) wchar_t* buffer, int buffersizebytes);
|
|
|
|
virtual void PerformLayout();
|
|
virtual void ApplySchemeSettings(vgui::IScheme* pScheme);
|
|
|
|
vgui::Panel* GetInputPanel(void);
|
|
virtual vgui::VPANEL GetCurrentKeyFocus() { return m_pInput->GetVPanel(); }
|
|
|
|
virtual void Paint()
|
|
{
|
|
BaseClass::Paint();
|
|
}
|
|
|
|
vgui::Label* GetPrompt(void) { return m_pPrompt; }
|
|
|
|
protected:
|
|
vgui::Label* m_pPrompt;
|
|
CBaseHudChatEntry* m_pInput;
|
|
};
|
|
|
|
|
|
class CHudChatFilterPanel : public vgui::EditablePanel
|
|
{
|
|
DECLARE_CLASS_SIMPLE(CHudChatFilterPanel, vgui::EditablePanel);
|
|
|
|
public:
|
|
|
|
CHudChatFilterPanel(vgui::Panel* pParent, const char* pName);
|
|
|
|
virtual void ApplySchemeSettings(vgui::IScheme* pScheme);
|
|
MESSAGE_FUNC_PTR(OnFilterButtonChecked, "CheckButtonChecked", panel);
|
|
|
|
CBaseHudChat* GetChatParent(void) { return dynamic_cast <CBaseHudChat*> (GetParent()); }
|
|
|
|
virtual void SetVisible(bool state);
|
|
|
|
private:
|
|
|
|
};
|
|
|
|
#endif |