diff --git a/src/game/client/components/hud.cpp b/src/game/client/components/hud.cpp
index 9ebb7afca..903443d67 100644
--- a/src/game/client/components/hud.cpp
+++ b/src/game/client/components/hud.cpp
@@ -1,5 +1,6 @@
/* (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
#include
#include
#include
@@ -7,6 +8,7 @@
#include
#include
#include
+#include
#include
#include
#include
@@ -1364,15 +1366,21 @@ void CHud::RenderMovementInformation(const int ClientId)
TextRender()->Text(xl, y, Fontsize, Localize("Speed:"), -1.0f);
y += MOVEMENT_INFORMATION_LINE_HEIGHT;
- TextRender()->Text(xl, y, Fontsize, "X:", -1.0f);
- UpdateMovementInformationTextContainer(m_aPlayerSpeedTextContainers[0], Fontsize, DisplaySpeedX, m_aaPlayerSpeedText[0], sizeof(m_aaPlayerSpeedText[0]));
- RenderMovementInformationTextContainer(m_aPlayerSpeedTextContainers[0], xr, y);
- y += MOVEMENT_INFORMATION_LINE_HEIGHT;
+ const char aaCoordinates[][4] = {"X:", "Y:"};
+ for(int i = 0; i < 2; i++)
+ {
+ TextRender()->TextColor(ColorRGBA(1, 1, 1, 1));
+ if(m_aLastPlayerSpeedChange[i] == ESpeedChange::INCREASE)
+ TextRender()->TextColor(ColorRGBA(0, 1, 0, 1));
+ if(m_aLastPlayerSpeedChange[i] == ESpeedChange::DECREASE)
+ TextRender()->TextColor(ColorRGBA(1, 0.5f, 0.5f, 1));
+ TextRender()->Text(xl, y, Fontsize, aaCoordinates[i], -1.0f);
+ UpdateMovementInformationTextContainer(m_aPlayerSpeedTextContainers[i], Fontsize, i == 0 ? DisplaySpeedX : DisplaySpeedY, m_aaPlayerSpeedText[i], sizeof(m_aaPlayerSpeedText[i]));
+ RenderMovementInformationTextContainer(m_aPlayerSpeedTextContainers[i], xr, y);
+ y += MOVEMENT_INFORMATION_LINE_HEIGHT;
+ }
- TextRender()->Text(xl, y, Fontsize, "Y:", -1.0f);
- UpdateMovementInformationTextContainer(m_aPlayerSpeedTextContainers[1], Fontsize, DisplaySpeedY, m_aaPlayerSpeedText[1], sizeof(m_aaPlayerSpeedText[1]));
- RenderMovementInformationTextContainer(m_aPlayerSpeedTextContainers[1], xr, y);
- y += MOVEMENT_INFORMATION_LINE_HEIGHT;
+ TextRender()->TextColor(1, 1, 1, 1);
}
if(g_Config.m_ClShowhudPlayerAngle)
@@ -1421,6 +1429,52 @@ void CHud::RenderLocalTime(float x)
TextRender()->Text(x - 25.0f, (12.5f - 5.f) / 2.f, 5.0f, aTimeStr, -1.0f);
}
+void CHud::OnNewSnapshot()
+{
+ if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK)
+ return;
+ if(!m_pClient->m_Snap.m_pGameInfoObj)
+ return;
+
+ int ClientId = -1;
+ if(m_pClient->m_Snap.m_pLocalCharacter && !m_pClient->m_Snap.m_SpecInfo.m_Active && !(m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_GAMEOVER))
+ ClientId = m_pClient->m_Snap.m_LocalClientId;
+ else if(m_pClient->m_Snap.m_SpecInfo.m_Active)
+ ClientId = m_pClient->m_Snap.m_SpecInfo.m_SpectatorId;
+
+ if(ClientId == -1)
+ return;
+
+ const CNetObj_Character *pPrevChar = &m_pClient->m_Snap.m_aCharacters[ClientId].m_Prev;
+ const CNetObj_Character *pCurChar = &m_pClient->m_Snap.m_aCharacters[ClientId].m_Cur;
+ const float IntraTick = Client()->IntraGameTick(g_Config.m_ClDummy);
+ ivec2 Vel = mix(ivec2(pPrevChar->m_VelX, pPrevChar->m_VelY), ivec2(pCurChar->m_VelX, pCurChar->m_VelY), IntraTick);
+
+ CCharacter *pChar = m_pClient->m_PredictedWorld.GetCharacterById(ClientId);
+ if(pChar && pChar->IsGrounded())
+ Vel.y = 0;
+
+ int aVels[2] = {Vel.x, Vel.y};
+
+ for(int i = 0; i < 2; i++)
+ {
+ int AbsVel = abs(aVels[i]);
+ if(AbsVel > m_aPlayerSpeed[i])
+ {
+ m_aLastPlayerSpeedChange[i] = ESpeedChange::INCREASE;
+ }
+ if(AbsVel < m_aPlayerSpeed[i])
+ {
+ m_aLastPlayerSpeedChange[i] = ESpeedChange::DECREASE;
+ }
+ if(AbsVel < 2)
+ {
+ m_aLastPlayerSpeedChange[i] = ESpeedChange::NONE;
+ }
+ m_aPlayerSpeed[i] = AbsVel;
+ }
+}
+
void CHud::OnRender()
{
if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK)
diff --git a/src/game/client/components/hud.h b/src/game/client/components/hud.h
index 47734328c..70798471a 100644
--- a/src/game/client/components/hud.h
+++ b/src/game/client/components/hud.h
@@ -53,6 +53,14 @@ class CHud : public CComponent
char m_aPlayerAngleText[128];
STextContainerIndex m_aPlayerSpeedTextContainers[2];
char m_aaPlayerSpeedText[2][128];
+ int m_aPlayerSpeed[2];
+ enum class ESpeedChange
+ {
+ NONE,
+ INCREASE,
+ DECREASE
+ };
+ ESpeedChange m_aLastPlayerSpeedChange[2];
STextContainerIndex m_aPlayerPositionContainers[2];
char m_aaPlayerPositionText[2][128];
@@ -96,6 +104,7 @@ public:
virtual void OnReset() override;
virtual void OnRender() override;
virtual void OnInit() override;
+ virtual void OnNewSnapshot() override;
// DDRace