diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/client/hud_basechat.h | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/client/hud_basechat.h')
| -rw-r--r-- | game/client/hud_basechat.h | 439 |
1 files changed, 439 insertions, 0 deletions
diff --git a/game/client/hud_basechat.h b/game/client/hud_basechat.h new file mode 100644 index 0000000..cf5c3f1 --- /dev/null +++ b/game/client/hud_basechat.h @@ -0,0 +1,439 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef HUD_BASECHAT_H +#define HUD_BASECHAT_H +#ifdef _WIN32 +#pragma once +#endif + +#include "hudelement.h" +#include <vgui_controls/Panel.h> +#include "vgui_basepanel.h" +#include "vgui_controls/Frame.h" +#include <vgui_controls/TextEntry.h> +#include <vgui_controls/RichText.h> +#include <vgui_controls/Button.h> +#include <vgui_controls/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, + //============================================================================= + // HPE_BEGIN: + // [tj]Added a filter for achievement announce + //============================================================================= + + CHAT_FILTER_ACHIEVEMENT = 0x000020, + + //============================================================================= + // HPE_END + //============================================================================= +}; + + +//----------------------------------------------------------------------------- +enum TextColor +{ + COLOR_NORMAL = 1, + COLOR_USEOLDCOLORS = 2, + COLOR_PLAYERNAME = 3, + COLOR_LOCATION = 4, + COLOR_ACHIEVEMENT = 5, + COLOR_CUSTOM = 6, // Will use the most recently SetCustomColor() + COLOR_HEXCODE = 7, // Reads the color from the next six characters + COLOR_HEXCODE_ALPHA = 8,// Reads the color and alpha from the next eight characters + 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 ); + +//-------------------------------------------------------------------------------------------------------- +/** + * Simple utility function to allocate memory and duplicate a wide string + */ +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; +} + +//----------------------------------------------------------------------------- +// Purpose: An output/display line of the chat interface +//----------------------------------------------------------------------------- +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 ); ///< Re-inserts the text in the appropriate colors at the given alpha + + + 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 & ); // not defined, not accessible +}; + + +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; +}; + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +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 ); + + // IGameEventListener interface: + 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") ); + } + } + + // End message mode. + if ( m_pHudChat ) + { + PostMessage( m_pHudChat, new KeyValues("ChatEntryStopMessageMode") ); + } + } + else if ( code == KEY_TAB ) + { + // Ignore tab, otherwise vgui will screw up the focus. + return; + } + else + { + BaseClass::OnKeyCodeTyped( code ); + } + } + +private: + vgui::Panel *m_pHudChat; +}; + +//----------------------------------------------------------------------------- +// Purpose: The prompt and text entry area for chat messages +//----------------------------------------------------------------------------- +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 // HUD_BASECHAT_H |