diff --git a/src/game/client/components/damageind.cpp b/src/game/client/components/damageind.cpp index 96a1358b2..0ac462da0 100644 --- a/src/game/client/components/damageind.cpp +++ b/src/game/client/components/damageind.cpp @@ -12,39 +12,21 @@ CDamageInd::CDamageInd() { - m_Lastupdate = 0; m_NumItems = 0; } -CDamageInd::CItem *CDamageInd::CreateI() -{ - if(m_NumItems < MAX_ITEMS) - { - CItem *p = &m_aItems[m_NumItems]; - m_NumItems++; - return p; - } - return 0; -} - -void CDamageInd::DestroyI(CDamageInd::CItem *pItem) -{ - m_NumItems--; - *pItem = m_aItems[m_NumItems]; -} - void CDamageInd::Create(vec2 Pos, vec2 Dir, float Alpha) { - CItem *pItem = CreateI(); - if(pItem) - { - pItem->m_Pos = Pos; - pItem->m_StartTime = LocalTime(); - pItem->m_Dir = -Dir; - pItem->m_StartAngle = -random_angle(); - pItem->m_Color = ColorRGBA(1.0f, 1.0f, 1.0f, Alpha); - pItem->m_StartAlpha = Alpha; - } + if(m_NumItems >= MAX_ITEMS) + return; + + CItem *pItem = &m_aItems[m_NumItems]; + pItem->m_Pos = Pos; + pItem->m_Dir = -Dir; + pItem->m_RemainingLife = 0.75f; + pItem->m_StartAngle = -random_angle(); + pItem->m_Color = ColorRGBA(1.0f, 1.0f, 1.0f, Alpha); + ++m_NumItems; } void CDamageInd::OnRender() @@ -52,41 +34,45 @@ void CDamageInd::OnRender() if(Client()->State() != IClient::STATE_ONLINE && Client()->State() != IClient::STATE_DEMOPLAYBACK) return; - Graphics()->TextureSet(GameClient()->m_GameSkin.m_aSpriteStars[0]); static float s_LastLocalTime = LocalTime(); + float LifeAdjustment; + if(Client()->State() == IClient::STATE_DEMOPLAYBACK) + { + const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); + if(pInfo->m_Paused) + LifeAdjustment = 0.0f; + else + LifeAdjustment = (LocalTime() - s_LastLocalTime) * pInfo->m_Speed; + } + else + { + const auto &pGameInfoObj = GameClient()->m_Snap.m_pGameInfoObj; + if(pGameInfoObj && pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED) + LifeAdjustment = 0.0f; + else + LifeAdjustment = LocalTime() - s_LastLocalTime; + } + s_LastLocalTime = LocalTime(); + + Graphics()->TextureSet(GameClient()->m_GameSkin.m_aSpriteStars[0]); for(int i = 0; i < m_NumItems;) { - if(Client()->State() == IClient::STATE_DEMOPLAYBACK) + m_aItems[i].m_RemainingLife -= LifeAdjustment; + if(m_aItems[i].m_RemainingLife < 0.0f) { - const IDemoPlayer::CInfo *pInfo = DemoPlayer()->BaseInfo(); - if(pInfo->m_Paused) - m_aItems[i].m_StartTime += LocalTime() - s_LastLocalTime; - else - m_aItems[i].m_StartTime += (LocalTime() - s_LastLocalTime) * (1.0f - pInfo->m_Speed); + --m_NumItems; + m_aItems[i] = m_aItems[m_NumItems]; } else { - if(m_pClient->m_Snap.m_pGameInfoObj && m_pClient->m_Snap.m_pGameInfoObj->m_GameStateFlags & GAMESTATEFLAG_PAUSED) - m_aItems[i].m_StartTime += LocalTime() - s_LastLocalTime; - } - - float Life = 0.75f - (LocalTime() - m_aItems[i].m_StartTime); - if(Life < 0.0f) - DestroyI(&m_aItems[i]); - else - { - vec2 Pos = mix(m_aItems[i].m_Pos + m_aItems[i].m_Dir * 75.0f, m_aItems[i].m_Pos, clamp((Life - 0.60f) / 0.15f, 0.0f, 1.0f)); - ColorRGBA Color = m_aItems[i].m_Color; - - float LifeAlpha = Life / 0.1f; - Color.a = m_aItems[i].m_StartAlpha * LifeAlpha; - Graphics()->SetColor(Color); - Graphics()->QuadsSetRotation(m_aItems[i].m_StartAngle + Life * 2.0f); + vec2 Pos = mix(m_aItems[i].m_Pos + m_aItems[i].m_Dir * 75.0f, m_aItems[i].m_Pos, clamp((m_aItems[i].m_RemainingLife - 0.60f) / 0.15f, 0.0f, 1.0f)); + const float LifeAlpha = m_aItems[i].m_RemainingLife / 0.1f; + Graphics()->SetColor(m_aItems[i].m_Color.WithMultipliedAlpha(LifeAlpha)); + Graphics()->QuadsSetRotation(m_aItems[i].m_StartAngle + m_aItems[i].m_RemainingLife * 2.0f); Graphics()->RenderQuadContainerAsSprite(m_DmgIndQuadContainerIndex, 0, Pos.x, Pos.y); i++; } } - s_LastLocalTime = LocalTime(); Graphics()->QuadsSetRotation(0); Graphics()->SetColor(1.f, 1.f, 1.f, 1.f); @@ -105,10 +91,7 @@ void CDamageInd::OnInit() Graphics()->QuadContainerUpload(m_DmgIndQuadContainerIndex); } -void CDamageInd::Reset() +void CDamageInd::OnReset() { - for(int i = 0; i < m_NumItems;) - { - DestroyI(&m_aItems[i]); - } + m_NumItems = 0; } diff --git a/src/game/client/components/damageind.h b/src/game/client/components/damageind.h index 4944010ef..8b45acc8b 100644 --- a/src/game/client/components/damageind.h +++ b/src/game/client/components/damageind.h @@ -8,15 +8,13 @@ class CDamageInd : public CComponent { - int64_t m_Lastupdate; struct CItem { vec2 m_Pos; vec2 m_Dir; - float m_StartTime; + float m_RemainingLife; float m_StartAngle; ColorRGBA m_Color; - float m_StartAlpha; }; enum @@ -27,9 +25,6 @@ class CDamageInd : public CComponent CItem m_aItems[MAX_ITEMS]; int m_NumItems; - CItem *CreateI(); - void DestroyI(CItem *pItem); - int m_DmgIndQuadContainerIndex; public: @@ -37,7 +32,7 @@ public: virtual int Sizeof() const override { return sizeof(*this); } void Create(vec2 Pos, vec2 Dir, float Alpha); - void Reset(); + virtual void OnReset() override; virtual void OnRender() override; virtual void OnInit() override; }; diff --git a/src/game/client/components/effects.cpp b/src/game/client/components/effects.cpp index f6389e924..1d6000baf 100644 --- a/src/game/client/components/effects.cpp +++ b/src/game/client/components/effects.cpp @@ -53,11 +53,6 @@ void CEffects::DamageIndicator(vec2 Pos, vec2 Dir, float Alpha) m_pClient->m_DamageInd.Create(Pos, Dir, Alpha); } -void CEffects::ResetDamageIndicator() -{ - m_pClient->m_DamageInd.Reset(); -} - void CEffects::PowerupShine(vec2 Pos, vec2 Size, float Alpha) { if(!m_Add50hz) diff --git a/src/game/client/components/effects.h b/src/game/client/components/effects.h index c88b691ef..f86c27cce 100644 --- a/src/game/client/components/effects.h +++ b/src/game/client/components/effects.h @@ -26,7 +26,6 @@ public: void HammerHit(vec2 Pos, float Alpha = 1.0f); void AirJump(vec2 Pos, float Alpha = 1.0f); void DamageIndicator(vec2 Pos, vec2 Dir, float Alpha = 1.0f); - void ResetDamageIndicator(); void PlayerSpawn(vec2 Pos, float Alpha = 1.0f); void PlayerDeath(vec2 Pos, int ClientId, float Alpha = 1.0f); void PowerupShine(vec2 Pos, vec2 Size, float Alpha = 1.0f); diff --git a/src/game/client/components/menus_demo.cpp b/src/game/client/components/menus_demo.cpp index 4f61a7b83..8612e10f7 100644 --- a/src/game/client/components/menus_demo.cpp +++ b/src/game/client/components/menus_demo.cpp @@ -78,6 +78,7 @@ void CMenus::HandleDemoSeeking(float PositionToSeek, float TimeToSeek) if((PositionToSeek >= 0.0f && PositionToSeek <= 1.0f) || TimeToSeek != 0.0f) { m_pClient->m_Chat.Reset(); + m_pClient->m_DamageInd.OnReset(); m_pClient->m_InfoMessages.OnReset(); m_pClient->m_Particles.OnReset(); m_pClient->m_Sounds.OnReset(); diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 2b542ed6e..fdd6b5161 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -1010,7 +1010,6 @@ void CGameClient::OnShutdown() void CGameClient::OnEnterGame() { - m_Effects.ResetDamageIndicator(); } void CGameClient::OnGameOver()