diff --git a/Plugins/CaptionMod/SubtitlePanel.cpp b/Plugins/CaptionMod/SubtitlePanel.cpp index 9d9dedf3..b4046fbb 100644 --- a/Plugins/CaptionMod/SubtitlePanel.cpp +++ b/Plugins/CaptionMod/SubtitlePanel.cpp @@ -11,8 +11,6 @@ #include "SubtitlePanel.h" #include "privatefuncs.h" -client_textmessage_t* GetCurrentTextMessage(); - extern cvar_t* cap_subtitle_prefix; extern cvar_t* cap_subtitle_waitplay; extern cvar_t* cap_subtitle_antispam; @@ -304,14 +302,14 @@ void CSubLine::Draw(int x, int w, int align) surface()->DrawFlushText(); } -void SubtitlePanel::StartNextSubtitle(CDictionary *pDict) +void SubtitlePanel::StartNextSubtitle(CDictionary *pDict, const CStartSubtitleContext* pStartSubtitleContext) { //Check if there is a next dict to be played auto pNextDict = pDict->m_pNext; - if(pNextDict) + if (pNextDict) { - StartSubtitle(pNextDict, pDict->m_flDuration, g_pViewPort->GetCurTime() + pDict->m_flNextDelay); + StartSubtitle(pNextDict, pDict->m_flDuration, g_pViewPort->GetCurTime() + pDict->m_flNextDelay, pStartSubtitleContext); } } @@ -382,10 +380,18 @@ void SubtitlePanel::StartLine(CSubLine *Line) //Fade it now Line->AlphaFade(255, cap_subtitle_fadein->value); - StartNextSubtitle(Line->m_Dict); + //Do we really need sender name here? + CStartSubtitleContext StartSubtitleContext; + + if (Line->m_bHasSenderName) + { + StartSubtitleContext.m_pszSenderName = Line->m_SenderName.c_str(); + } + + StartNextSubtitle(Line->m_Dict, &StartSubtitleContext); } -CSubLine* SubtitlePanel::AddLine(CDictionary *Dict, wchar_t *wszSentence, int nLength, float flStartTime, float flDuration, int nTextWide) +CSubLine* SubtitlePanel::AddLine(CDictionary *Dict, const CStartSubtitleContext* pStartSubtitleContext, const wchar_t *wszSentence, int nLength, float flStartTime, float flDuration, int nTextWide) { CSubLine *Line = new CSubLine(this, Dict); m_BackLines[m_BackLines.AddToTail()] = Line; @@ -398,9 +404,13 @@ CSubLine* SubtitlePanel::AddLine(CDictionary *Dict, wchar_t *wszSentence, int nL Line->m_Duration = flDuration; Line->m_Color = Dict->m_Color; - if (Dict->m_bDefaultColor && GetCurrentTextMessage()) + if (Dict->m_bDefaultColor && pStartSubtitleContext->m_pCurrentTextMessage) { - Line->m_Color = Color(GetCurrentTextMessage()->r1, GetCurrentTextMessage()->g1, GetCurrentTextMessage()->b1, GetCurrentTextMessage()->a1); + Line->m_Color = Color( + pStartSubtitleContext->m_pCurrentTextMessage->r1, + pStartSubtitleContext->m_pCurrentTextMessage->g1, + pStartSubtitleContext->m_pCurrentTextMessage->b1, + pStartSubtitleContext->m_pCurrentTextMessage->a1); } Line->m_Alpha = 0; @@ -409,6 +419,12 @@ CSubLine* SubtitlePanel::AddLine(CDictionary *Dict, wchar_t *wszSentence, int nL Line->m_FadeOut = cap_subtitle_fadeout->value; Line->m_TextAlign = Dict->m_iTextAlign ? Dict->m_iTextAlign : m_iTextAlign; + if (pStartSubtitleContext->m_pszSenderName) + { + Line->m_bHasSenderName = true; + Line->m_SenderName = pStartSubtitleContext->m_pszSenderName; + } + return Line; } @@ -418,7 +434,7 @@ static bool IsNonBreakableCharacter(wchar_t ch) } //2015-11-26 added htimescale for SubtitlePanel -void SubtitlePanel::StartSubtitle(CDictionary * pDict, float flDurationTime, float flStartTime) +void SubtitlePanel::StartSubtitle(CDictionary * pDict, float flDurationTime, float flStartTime, const CStartSubtitleContext* pStartSubtitleContext) { //Delay the current line till the last backline plays float flLatestStart = 0; @@ -449,15 +465,23 @@ void SubtitlePanel::StartSubtitle(CDictionary * pDict, float flDurationTime, flo } } - std::wstring sentence; + std::wstring speakerName; + std::wstring fullSentence; + + pDict->ProcessString(pDict->m_szSentence, pStartSubtitleContext, fullSentence); - pDict->FinalizeString(sentence, (cap_subtitle_prefix->value >= 1.0f) ? true : false); + if (cap_subtitle_prefix->value >= 1.0f) + { + pDict->ProcessString(pDict->m_szSpeaker, pStartSubtitleContext, speakerName); + + fullSentence = speakerName + fullSentence; + } int iPanelWidth = GetWide(); int iMaxTextWidth = iPanelWidth - (m_iScaledXSpace << 1); wchar_t szBuf[4096]; - wchar_t *pStart = &sentence[0]; + wchar_t *pStart = &fullSentence[0]; wchar_t *p = pStart; if(!pStart[0]) @@ -491,15 +515,19 @@ void SubtitlePanel::StartSubtitle(CDictionary * pDict, float flDurationTime, flo if(flDuration <= 0) flDuration = 4.0f; - if (!pDict->m_bOverrideDuration && GetCurrentTextMessage()) + if (!pDict->m_bOverrideDuration && pStartSubtitleContext->m_pCurrentTextMessage) { - if (GetCurrentTextMessage()->effect == 2 && GetCurrentTextMessage()->pMessage) + if (pStartSubtitleContext->m_pCurrentTextMessage->effect == 2 && + pStartSubtitleContext->m_pCurrentTextMessage->pMessage) { - flDuration = (GetCurrentTextMessage()->fadein * sentence.length() ) + GetCurrentTextMessage()->fadeout + GetCurrentTextMessage()->holdtime; + flDuration = (pStartSubtitleContext->m_pCurrentTextMessage->fadein * fullSentence.length() ) + + pStartSubtitleContext->m_pCurrentTextMessage->fadeout + pStartSubtitleContext->m_pCurrentTextMessage->holdtime; } else { - flDuration = GetCurrentTextMessage()->holdtime + GetCurrentTextMessage()->fadein + GetCurrentTextMessage()->fadeout; + flDuration = pStartSubtitleContext->m_pCurrentTextMessage->holdtime + + pStartSubtitleContext->m_pCurrentTextMessage->fadein + + pStartSubtitleContext->m_pCurrentTextMessage->fadeout; } } @@ -600,7 +628,7 @@ void SubtitlePanel::StartSubtitle(CDictionary * pDict, float flDurationTime, flo else//real duration = original starttime - real starttime + original duration flRealDuration = max(flStartTime + flCalcStartTime - flRealStartTime, 0) + flCalcDuration; - pAddedLine = AddLine(pDict, pStart, nCharNum, flRealStartTime, flRealDuration, nWide); + pAddedLine = AddLine(pDict, pStartSubtitleContext, pStart, nCharNum, flRealStartTime, flRealDuration, nWide); //Skip CRLF while (*p == L'\r' || *p == L'\n') diff --git a/Plugins/CaptionMod/SubtitlePanel.h b/Plugins/CaptionMod/SubtitlePanel.h index f1462f8e..0dd7b958 100644 --- a/Plugins/CaptionMod/SubtitlePanel.h +++ b/Plugins/CaptionMod/SubtitlePanel.h @@ -99,6 +99,7 @@ class CSubLine m_Dict = Dict; m_TextWide = 0; m_TextAlign = ALIGN_DEFAULT; + m_bHasSenderName = false; } virtual ~CSubLine() { @@ -130,6 +131,8 @@ class CSubLine CDictionary *m_Dict;//Linked dictionary int m_TextWide; textalign_t m_TextAlign; + bool m_bHasSenderName; + std::string m_SenderName; }; class SubtitlePanel : public vgui::EditablePanel @@ -143,16 +146,20 @@ class SubtitlePanel : public vgui::EditablePanel void VidInit(void); void ConnectToServer(const char* game, int IP, int port); void AdjustClock(double flAdjustment); + public://Subtitle interface - void StartSubtitle(CDictionary * pDict, float flDurationTime, float flStartTime); - void StartNextSubtitle(CDictionary *pDict); - CSubLine* AddLine(CDictionary *Dict, wchar_t *wszSentence, int nLength, float flStartTime, float flDuration, int nTextLength); + + void StartSubtitle(CDictionary * pDict, float flDurationTime, float flStartTime, const CStartSubtitleContext * pStartSubtitleContext); + void StartNextSubtitle(CDictionary *pDict, const CStartSubtitleContext* pStartSubtitleContext); + + CSubLine* AddLine(CDictionary *Dict, const CStartSubtitleContext* pStartSubtitleContext, const wchar_t *wszSentence, int nLength, float flStartTime, float flDuration, int nTextLength); void StartLine(CSubLine *Line); void ClearSubtitle(void); #if 0 void QuerySubtitlePanelVars(SubtitlePanelVars_t *vars); void UpdateSubtitlePanelVars(SubtitlePanelVars_t *vars); #endif + protected: virtual void ApplySchemeSettings(vgui::IScheme *pScheme); virtual void PaintBackground(void); diff --git a/Plugins/CaptionMod/Viewport.cpp b/Plugins/CaptionMod/Viewport.cpp index 3db8199b..5b9a3e6a 100644 --- a/Plugins/CaptionMod/Viewport.cpp +++ b/Plugins/CaptionMod/Viewport.cpp @@ -759,19 +759,19 @@ void CViewport::LoadBaseDictionary(void) gEngfuncs.Con_Printf("LoadBaseDictionary: %d lines are loaded.\n", nRowCount - 1); } -const char* GetSenderName(); +//const char* GetSenderName(); //KeyBinding Name(jump) -> Key Name(SPACE) -const char *PrimaryKey_ForBinding(const char *binding) +const char *PrimaryKey_ForBinding(const CStartSubtitleContext* pStartSubtitleContext, const char *binding) { - if(binding[0] == '+') - binding ++; - - if (!strcmp(binding, "sender") && GetSenderName()) + if (!strcmp(binding, "sender") && pStartSubtitleContext->m_pszSenderName) { - return GetSenderName(); + return pStartSubtitleContext->m_pszSenderName; } + if(binding[0] == '+') + binding ++; + for (int i = 255; i >= 0; --i) { const char *found = gameuifuncs->Key_BindingForKey(i); @@ -793,9 +793,9 @@ const char *PrimaryKey_ForBinding(const char *binding) return ""; } -void CDictionary::FinalizeString(std::wstring &output, bool bPrefix) +void CDictionary::ProcessString(const std::wstring& input, const CStartSubtitleContext* pStartSubtitleContext, std::wstring& output) { - auto finalize = m_szSentence; + auto finalize = input; static std::wregex pattern(L"(<([A-Za-z_]+)>)"); std::wsmatch result; @@ -813,8 +813,8 @@ void CDictionary::FinalizeString(std::wstring &output, bool bPrefix) auto wkeybind = result[2].str(); char akeybind[256] = {0}; - g_pVGuiLocalize->ConvertUnicodeToANSI(wkeybind.c_str(), akeybind, sizeof(akeybind) - 1); - const char *pszBinding = PrimaryKey_ForBinding(akeybind); + localize()->ConvertUnicodeToANSI(wkeybind.c_str(), akeybind, sizeof(akeybind) - 1); + const char *pszBinding = PrimaryKey_ForBinding(pStartSubtitleContext, akeybind); if (pszBinding) { @@ -842,11 +842,6 @@ void CDictionary::FinalizeString(std::wstring &output, bool bPrefix) searchStart = result.suffix().first; } - - if(bPrefix) - output = m_szSpeaker + finalize; - else - output = finalize; } void CViewport::Start(void) @@ -899,17 +894,17 @@ void CViewport::Init(void) m_HudMenu.Init(); } -void CViewport::StartSubtitle(CDictionary *dict, float flDurationTime) +void CViewport::StartSubtitle(CDictionary *dict, float flDurationTime, const CStartSubtitleContext* pStartSubtitleContext) { if (cap_enabled && cap_enabled->value) { - m_pSubtitlePanel->StartSubtitle(dict, flDurationTime, g_pViewPort->GetCurTime()); + m_pSubtitlePanel->StartSubtitle(dict, flDurationTime, g_pViewPort->GetCurTime(), pStartSubtitleContext); } } -void CViewport::StartNextSubtitle(CDictionary* dict) +void CViewport::StartNextSubtitle(CDictionary* dict, const CStartSubtitleContext* pStartSubtitleContext) { if (cap_enabled && cap_enabled->value) { - m_pSubtitlePanel->StartNextSubtitle(dict); + m_pSubtitlePanel->StartNextSubtitle(dict, pStartSubtitleContext); } } diff --git a/Plugins/CaptionMod/Viewport.h b/Plugins/CaptionMod/Viewport.h index 1f895e5c..3af1cf44 100644 --- a/Plugins/CaptionMod/Viewport.h +++ b/Plugins/CaptionMod/Viewport.h @@ -57,6 +57,20 @@ typedef struct QuerySubtitlePanelVars_s float m_flHoldTimeScale; }SubtitlePanelVars_t; +class CStartSubtitleContext +{ +public: + CStartSubtitleContext() + { + m_pszSenderName = nullptr; + m_pCurrentTextMessage = nullptr; + } + + + const char* m_pszSenderName; + client_textmessage_t* m_pCurrentTextMessage; +}; + class CDictionary { public: @@ -64,7 +78,7 @@ class CDictionary virtual ~CDictionary(); void Load(CSV::CSVDocument::row_type &row, Color &defaultColor, vgui::IScheme *ischeme); - void FinalizeString(std::wstring &output, bool iPrefix); + void ProcessString(const std::wstring& input, const CStartSubtitleContext* pStartSubtitleContext, std::wstring& output); dict_t m_Type; std::string m_szTitle; @@ -121,8 +135,8 @@ class CViewport : public vgui::Panel void LinkDictionary(void); //Subtitle Interface - void StartSubtitle(CDictionary *dict, float flDurationTime); - void StartNextSubtitle(CDictionary *dict); + void StartSubtitle(CDictionary *dict, float flDurationTime, const CStartSubtitleContext* pStartSubtitleContext); + void StartNextSubtitle(CDictionary *dict, const CStartSubtitleContext* pStartSubtitleContext); //Dictionary Hashtable CDictionary *FindDictionary(const char *szValue); diff --git a/Plugins/CaptionMod/exportfuncs.cpp b/Plugins/CaptionMod/exportfuncs.cpp index fd511cbd..aa81bd81 100644 --- a/Plugins/CaptionMod/exportfuncs.cpp +++ b/Plugins/CaptionMod/exportfuncs.cpp @@ -316,7 +316,9 @@ void S_StartWave(sfx_t *sfx, float distance, float avol) duration = S_GetDuration(sfx); } - g_pViewPort->StartSubtitle(pDict, duration); + CStartSubtitleContext StartSubtitleContext; + + g_pViewPort->StartSubtitle(pDict, duration, &StartSubtitleContext); } static char szsentences[] = "sound/sentences.txt"; @@ -653,7 +655,9 @@ bool S_StartSentence(const char *name, float distance, float avol) }); } - g_pViewPort->StartSubtitle(pDict, duration); + CStartSubtitleContext StartSubtitleContext; + + g_pViewPort->StartSubtitle(pDict, duration, &StartSubtitleContext); return true; } @@ -798,7 +802,9 @@ bool ScClient_StartSentence(const char* name, float distance, float avol) #endif } - g_pViewPort->StartSubtitle(pDict, duration); + CStartSubtitleContext StartSubtitleContext; + + g_pViewPort->StartSubtitle(pDict, duration, &StartSubtitleContext); return true; } @@ -853,7 +859,9 @@ void ScClient_StartWave(const char* name, float distance, float avol, int ms_dur duration = ms_duration / 1000.0f; } - g_pViewPort->StartSubtitle(pDict, duration); + CStartSubtitleContext StartSubtitleContext; + + g_pViewPort->StartSubtitle(pDict, duration, &StartSubtitleContext); } void __fastcall ScClient_SoundEngine_PlayFMODSound(void* pSoundEngine, int, int flags, int entindex, float* origin, int channel, const char* name, float fvol, float attenuation, int extraflags, int pitch, int sentenceIndex, float soundLength) diff --git a/Plugins/CaptionMod/message.cpp b/Plugins/CaptionMod/message.cpp index 0b6815ad..6d91a638 100644 --- a/Plugins/CaptionMod/message.cpp +++ b/Plugins/CaptionMod/message.cpp @@ -16,11 +16,11 @@ extern cvar_t *hud_saytext; extern cvar_t *hud_saytext_time; extern cvar_t *cap_newchat; -static char *m_pSenderName = NULL; +//static char *m_pSenderName = NULL; -static client_textmessage_t *g_pCurrentTextMessage = NULL; +//static client_textmessage_t *g_pCurrentTextMessage = NULL; -const char *GetSenderName() +/*const char* GetSenderName() { return m_pSenderName; } @@ -28,7 +28,7 @@ const char *GetSenderName() client_textmessage_t* GetCurrentTextMessage() { return g_pCurrentTextMessage; -} +}*/ CHudMessage m_HudMessage; CHudMenu m_HudMenu; @@ -92,8 +92,6 @@ int __MsgFunc_SendAudio(const char* pszName, int iSize, void* pbuf) int result = m_pfnSendAudio(pszName, iSize, pbuf); - m_pSenderName = NULL; - return result; } @@ -784,11 +782,13 @@ int CHudMessage::MsgFunc_HudText(const char *pszName, int iSize, void *pbuf) int slotNum = MessageAdd(pMsg, (*cl_time), hintMessage, useSlot, m_hFont, true); - g_pCurrentTextMessage = pMsg; + //g_pCurrentTextMessage = pMsg; + CStartSubtitleContext StartSubtitleContext; + StartSubtitleContext.m_pCurrentTextMessage = pMsg; - g_pViewPort->StartNextSubtitle(dict); + g_pViewPort->StartNextSubtitle(dict, &StartSubtitleContext); - g_pCurrentTextMessage = NULL; + //g_pCurrentTextMessage = NULL; if (slotNum == -1) { @@ -834,11 +834,13 @@ int CHudMessage::MsgFunc_HudText(const char *pszName, int iSize, void *pbuf) int slotNum = MessageAdd(pMsg, (*cl_time), hintMessage, useSlot, m_hFont, true); - g_pCurrentTextMessage = pMsg; + //g_pCurrentTextMessage = pMsg; + CStartSubtitleContext StartSubtitleContext; + StartSubtitleContext.m_pCurrentTextMessage = pMsg; - g_pViewPort->StartNextSubtitle(dict); + g_pViewPort->StartNextSubtitle(dict, &StartSubtitleContext); - g_pCurrentTextMessage = NULL; + //g_pCurrentTextMessage = NULL; if (slotNum == -1) { @@ -917,11 +919,13 @@ int CHudMessage::MsgFunc_HudText(const char *pszName, int iSize, void *pbuf) int slotNum = MessageAdd(pMsg, (*cl_time), hintMessage, -1, m_hFont, true); - g_pCurrentTextMessage = pMsg; + //g_pCurrentTextMessage = pMsg; + CStartSubtitleContext StartSubtitleContext; + StartSubtitleContext.m_pCurrentTextMessage = pMsg; - g_pViewPort->StartNextSubtitle(dict); + g_pViewPort->StartNextSubtitle(dict, &StartSubtitleContext); - g_pCurrentTextMessage = NULL; + //g_pCurrentTextMessage = NULL; if (slotNum == -1) { @@ -1015,11 +1019,13 @@ int CHudMessage::MsgFunc_HudTextArgs(const char *pszName, int iSize, void *pbuf) } } - g_pCurrentTextMessage = pMsg; + //g_pCurrentTextMessage = pMsg; + CStartSubtitleContext StartSubtitleContext; + StartSubtitleContext.m_pCurrentTextMessage = pMsg; - g_pViewPort->StartNextSubtitle(dict); + g_pViewPort->StartNextSubtitle(dict, &StartSubtitleContext); - g_pCurrentTextMessage = NULL; + //g_pCurrentTextMessage = NULL; if (slotNum == -1) { @@ -1050,8 +1056,6 @@ int CHudMessage::MsgFunc_SendAudio(const char* pszName, int iSize, void* pbuf) hud_player_info_t info = {0}; gEngfuncs.pfnGetPlayerInfo(entIndex, &info); - m_pSenderName = info.name; - auto pDict = g_pViewPort->FindDictionary(pString, DICT_SENDAUDIO); if (cap_debug && cap_debug->value) @@ -1061,7 +1065,11 @@ int CHudMessage::MsgFunc_SendAudio(const char* pszName, int iSize, void* pbuf) if (pDict) { - g_pViewPort->StartSubtitle(pDict, pDict->m_flDuration); + CStartSubtitleContext StartSubtitleContext; + + StartSubtitleContext.m_pszSenderName = info.name; + + g_pViewPort->StartSubtitle(pDict, pDict->m_flDuration, &StartSubtitleContext); } return 0;