/
dieoska
/
ddnet
Обзор
Документация
Войти
/
dieoska
/
ddnet
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/game/client/components/broadcast.cpp
107 строк
3 KB
Robert Müller
Add important moderator and server alert messages
29 окт 2025, 22:52
29 окт 2025, 22:52
2ef4a13
Код
Авторство
О чём код?
/* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */ /* If you are missing that file, acquire a complete release at teeworlds.com. */ #include "broadcast.h" #include <engine/graphics.h> #include <engine/shared/config.h> #include <engine/textrender.h> #include <generated/protocol.h> #include <game/client/components/important_alert.h> #include <game/client/components/motd.h> #include <game/client/components/scoreboard.h> #include <game/client/gameclient.h> void CBroadcast::OnReset() { m_BroadcastTick = 0; m_BroadcastRenderOffset = -1.0f; TextRender()->DeleteTextContainer(m_TextContainerIndex); } void CBroadcast::OnWindowResize() { m_BroadcastRenderOffset = -1.0f; TextRender()->DeleteTextContainer(m_TextContainerIndex); } void CBroadcast::OnRender() { if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) return; RenderServerBroadcast(); } void CBroadcast::RenderServerBroadcast() { if(GameClient()->m_Scoreboard.IsActive() || GameClient()->m_Motd.IsActive() || GameClient()->m_ImportantAlert.IsActive() || !g_Config.m_ClShowBroadcasts) { return; } const float SecondsRemaining = (m_BroadcastTick - Client()->GameTick(g_Config.m_ClDummy)) / (float)Client()->GameTickSpeed(); if(SecondsRemaining <= 0.0f) { TextRender()->DeleteTextContainer(m_TextContainerIndex); return; } const float Height = 300.0f; const float Width = Height * Graphics()->ScreenAspect(); Graphics()->MapScreen(0.0f, 0.0f, Width, Height); if(m_BroadcastRenderOffset < 0.0f) m_BroadcastRenderOffset = Width / 2.0f - TextRender()->TextWidth(12.0f, m_aBroadcastText, -1, Width) / 2.0f; if(!m_TextContainerIndex.Valid()) { CTextCursor Cursor; Cursor.SetPosition(vec2(m_BroadcastRenderOffset, 40.0f)); Cursor.m_FontSize = 12.0f; Cursor.m_LineWidth = Width; TextRender()->CreateTextContainer(m_TextContainerIndex, &Cursor, m_aBroadcastText); } if(m_TextContainerIndex.Valid()) { const float Alpha = SecondsRemaining >= 1.0f ? 1.0f : SecondsRemaining; ColorRGBA TextColor = TextRender()->DefaultTextColor(); TextColor.a *= Alpha; ColorRGBA OutlineColor = TextRender()->DefaultTextOutlineColor(); OutlineColor.a *= Alpha; TextRender()->RenderTextContainer(m_TextContainerIndex, TextColor, OutlineColor); } } void CBroadcast::OnMessage(int MsgType, void *pRawMsg) { if(MsgType == NETMSGTYPE_SV_BROADCAST) { const CNetMsg_Sv_Broadcast *pMsg = (CNetMsg_Sv_Broadcast *)pRawMsg; DoBroadcast(pMsg->m_pMessage); } } void CBroadcast::DoBroadcast(const char *pText) { str_copy(m_aBroadcastText, pText); m_BroadcastTick = Client()->GameTick(g_Config.m_ClDummy) + Client()->GameTickSpeed() * 10; m_BroadcastRenderOffset = -1.0f; TextRender()->DeleteTextContainer(m_TextContainerIndex); if(g_Config.m_ClPrintBroadcasts) { char aLine[sizeof(m_aBroadcastText)]; while((pText = str_next_token(pText, "\n", aLine, sizeof(aLine)))) { if(aLine[0] != '\0') { GameClient()->Console()->Print(IConsole::OUTPUT_LEVEL_STANDARD, "broadcast", aLine, color_cast<ColorRGBA>(ColorHSLA(g_Config.m_ClMessageHighlightColor))); } } } }