diff options
| author | oy <Tom_Adams@web.de> | 2011-03-12 18:07:57 +0100 |
|---|---|---|
| committer | oy <Tom_Adams@web.de> | 2011-03-12 18:07:57 +0100 |
| commit | b834426548107af96c2568af22cbf8604f230965 (patch) | |
| tree | 893a04ec6b37d7b1d92ee66d39707463f48e847c /src/game/client/gameclient.cpp | |
| parent | 7b98b3ddeddd34bf0fa0c84b13d928a9dafe140c (diff) | |
| download | zcatch-b834426548107af96c2568af22cbf8604f230965.tar.gz zcatch-b834426548107af96c2568af22cbf8604f230965.zip | |
fixed several problems with spectator view in game and demo player. Closes #83
Diffstat (limited to 'src/game/client/gameclient.cpp')
| -rw-r--r-- | src/game/client/gameclient.cpp | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index 0d847162..0e2e8056 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -337,6 +337,8 @@ void CGameClient::OnReset() for(int i = 0; i < m_All.m_Num; i++) m_All.m_paComponents[i]->OnReset(); + + m_DemoSpecID = SPEC_FREEVIEW; } @@ -360,13 +362,26 @@ void CGameClient::UpdatePositions() } // spectator position - if(m_Snap.m_Spectate && m_Snap.m_pSpectatorInfo) + if(m_Snap.m_SpecInfo.m_Active) { - if(m_Snap.m_pPrevSpectatorInfo) - m_Snap.m_SpectatorPos = mix(vec2(m_Snap.m_pPrevSpectatorInfo->m_X, m_Snap.m_pPrevSpectatorInfo->m_Y), - vec2(m_Snap.m_pSpectatorInfo->m_X, m_Snap.m_pSpectatorInfo->m_Y), Client()->IntraGameTick()); - else - m_Snap.m_SpectatorPos = vec2(m_Snap.m_pSpectatorInfo->m_X, m_Snap.m_pSpectatorInfo->m_Y); + if(Client()->State() == IClient::STATE_DEMOPLAYBACK && DemoPlayer()->GetDemoType() == IDemoPlayer::DEMOTYPE_SERVER && + m_Snap.m_SpecInfo.m_SpectatorID != SPEC_FREEVIEW) + { + m_Snap.m_SpecInfo.m_Position = mix( + vec2(m_Snap.m_aCharacters[m_Snap.m_SpecInfo.m_SpectatorID].m_Prev.m_X, m_Snap.m_aCharacters[m_Snap.m_SpecInfo.m_SpectatorID].m_Prev.m_Y), + vec2(m_Snap.m_aCharacters[m_Snap.m_SpecInfo.m_SpectatorID].m_Cur.m_X, m_Snap.m_aCharacters[m_Snap.m_SpecInfo.m_SpectatorID].m_Cur.m_Y), + Client()->IntraGameTick()); + m_Snap.m_SpecInfo.m_UsePosition = true; + } + else if(m_Snap.m_pSpectatorInfo && (Client()->State() == IClient::STATE_DEMOPLAYBACK || m_Snap.m_SpecInfo.m_SpectatorID != SPEC_FREEVIEW)) + { + if(m_Snap.m_pPrevSpectatorInfo) + m_Snap.m_SpecInfo.m_Position = mix(vec2(m_Snap.m_pPrevSpectatorInfo->m_X, m_Snap.m_pPrevSpectatorInfo->m_Y), + vec2(m_Snap.m_pSpectatorInfo->m_X, m_Snap.m_pSpectatorInfo->m_Y), Client()->IntraGameTick()); + else + m_Snap.m_SpecInfo.m_Position = vec2(m_Snap.m_pSpectatorInfo->m_X, m_Snap.m_pSpectatorInfo->m_Y); + m_Snap.m_SpecInfo.m_UsePosition = true; + } } } @@ -720,7 +735,10 @@ void CGameClient::OnNewSnapshot() m_Snap.m_pLocalInfo = pInfo; if(pInfo->m_Team == TEAM_SPECTATORS) - m_Snap.m_Spectate = true; + { + m_Snap.m_SpecInfo.m_Active = true; + m_Snap.m_SpecInfo.m_SpectatorID = SPEC_FREEVIEW; + } } // calculate team-balance @@ -747,6 +765,8 @@ void CGameClient::OnNewSnapshot() { m_Snap.m_pSpectatorInfo = (const CNetObj_SpectatorInfo *)pData; m_Snap.m_pPrevSpectatorInfo = (const CNetObj_SpectatorInfo *)Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_SPECTATORINFO, Item.m_ID); + + m_Snap.m_SpecInfo.m_SpectatorID = m_Snap.m_pSpectatorInfo->m_SpectatorID; } else if(Item.m_Type == NETOBJTYPE_GAMEINFO) { @@ -785,7 +805,14 @@ void CGameClient::OnNewSnapshot() } } else - m_Snap.m_Spectate = true; + { + m_Snap.m_SpecInfo.m_Active = true; + if(Client()->State() == IClient::STATE_DEMOPLAYBACK && DemoPlayer()->GetDemoType() == IDemoPlayer::DEMOTYPE_SERVER && + m_DemoSpecID != SPEC_FREEVIEW && m_Snap.m_aCharacters[m_DemoSpecID].m_Active) + m_Snap.m_SpecInfo.m_SpectatorID = m_DemoSpecID; + else + m_Snap.m_SpecInfo.m_SpectatorID = SPEC_FREEVIEW; + } // sort player infos by score mem_copy(m_Snap.m_paInfoByScore, m_Snap.m_paPlayerInfos, sizeof(m_Snap.m_paInfoByScore)); |