From b33180ae77f933c2be25af226b934185988b08a8 Mon Sep 17 00:00:00 2001 From: Edgar Date: Wed, 24 Jun 2020 19:01:01 +0200 Subject: [PATCH] fix /spec rendering --- datasrc/network.py | 5 +++++ src/game/client/components/nameplates.cpp | 6 ++++++ src/game/client/components/players.cpp | 7 +++++++ src/game/client/gameclient.cpp | 10 ++++++++++ src/game/client/gameclient.h | 6 ++++++ src/game/server/player.cpp | 7 +++++++ 6 files changed, 41 insertions(+) diff --git a/datasrc/network.py b/datasrc/network.py index 29783f207..6ed2a8395 100644 --- a/datasrc/network.py +++ b/datasrc/network.py @@ -269,6 +269,11 @@ Objects = [ NetObjectEx("MyOwnEvent", "my-own-event@heinrich5991.de", [ NetIntAny("m_Test"), ]), + + NetObjectEx("SpecChar", "spec-char@netobj.ddnet.tw", [ + NetIntAny("m_X"), + NetIntAny("m_Y"), + ]), ] Messages = [ diff --git a/src/game/client/components/nameplates.cpp b/src/game/client/components/nameplates.cpp index 873d60755..a73e2dc6b 100644 --- a/src/game/client/components/nameplates.cpp +++ b/src/game/client/components/nameplates.cpp @@ -35,6 +35,12 @@ void CNamePlates::RenderNameplate( else Position = mix(vec2(pPrevChar->m_X, pPrevChar->m_Y), vec2(pPlayerChar->m_X, pPlayerChar->m_Y), Client()->IntraGameTick(g_Config.m_ClDummy)); + if(m_pClient->m_aClients[ClientID].m_Spec) + { + Position.x = m_pClient->m_aClients[ClientID].m_SpecChar.m_X; + Position.y = m_pClient->m_aClients[ClientID].m_SpecChar.m_Y; + } + bool OtherTeam = m_pClient->IsOtherTeam(ClientID); float FontSize = 18.0f + 20.0f * g_Config.m_ClNameplatesSize / 100.0f; diff --git a/src/game/client/components/players.cpp b/src/game/client/components/players.cpp index 7f65e3675..30956d33e 100644 --- a/src/game/client/components/players.cpp +++ b/src/game/client/components/players.cpp @@ -234,6 +234,13 @@ void CPlayers::RenderPlayer( Position = m_pClient->m_aClients[ClientID].m_RenderPos; else Position = mix(vec2(Prev.m_X, Prev.m_Y), vec2(Player.m_X, Player.m_Y), IntraTick); + + if(Spec) + { + Position.x = m_pClient->m_aClients[ClientID].m_SpecChar.m_X; + Position.y = m_pClient->m_aClients[ClientID].m_SpecChar.m_Y; + } + vec2 Vel = mix(vec2(Prev.m_VelX/256.0f, Prev.m_VelY/256.0f), vec2(Player.m_VelX/256.0f, Player.m_VelY/256.0f), IntraTick); m_pClient->m_pFlow->Add(Position, Vel*100.0f, 10.0f); diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index d76be8d6e..04d589dcb 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -1284,6 +1284,13 @@ void CGameClient::OnNewSnapshot() m_aClients[Item.m_ID].m_Predicted.ReadDDNet(pCharacterData); } + else if(Item.m_Type == NETOBJTYPE_SPECCHAR) + { + const CNetObj_SpecChar *pSpecCharData = (const CNetObj_SpecChar *)pData; + + m_aClients[Item.m_ID].m_SpecChar.m_X = pSpecCharData->m_X; + m_aClients[Item.m_ID].m_SpecChar.m_Y = pSpecCharData->m_Y; + } else if(Item.m_Type == NETOBJTYPE_SPECTATORINFO) { m_Snap.m_pSpectatorInfo = (const CNetObj_SpectatorInfo *)pData; @@ -1853,6 +1860,9 @@ void CGameClient::CClientData::Reset() m_Evolved.m_Tick = -1; + m_SpecChar.m_X = 0; + m_SpecChar.m_Y = 0; + UpdateRenderInfo(); } diff --git a/src/game/client/gameclient.h b/src/game/client/gameclient.h index 6b4ebd13f..0ca490a71 100644 --- a/src/game/client/gameclient.h +++ b/src/game/client/gameclient.h @@ -290,6 +290,12 @@ public: int64 m_SmoothLen[2]; vec2 m_PredPos[200]; int m_PredTick[200]; + + struct SpecChar + { + int m_X; + int m_Y; + } m_SpecChar; }; CClientData m_aClients[MAX_CLIENTS]; diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp index 81309dd4e..c76887dee 100644 --- a/src/game/server/player.cpp +++ b/src/game/server/player.cpp @@ -411,6 +411,13 @@ void CPlayer::Snap(int SnappingClient) protocol7::CNetObj_PlayerInfoRace *pRaceInfo = static_cast(Server()->SnapNewItem(-protocol7::NETOBJTYPE_PLAYERINFORACE, id, sizeof(protocol7::CNetObj_PlayerInfoRace))); pRaceInfo->m_RaceStartTick = m_pCharacter->m_StartTime; } + + if(m_Paused == PAUSE_SPEC && m_pCharacter && m_pCharacter->Core()) + { + CNetObj_SpecChar *pSpecChar = static_cast(Server()->SnapNewItem(NETOBJTYPE_SPECCHAR, id, sizeof(CNetObj_SpecChar))); + pSpecChar->m_X = m_pCharacter->Core()->m_Pos.x; + pSpecChar->m_Y = m_pCharacter->Core()->m_Pos.y; + } } void CPlayer::FakeSnap()