diff options
| author | oy <Tom_Adams@web.de> | 2011-03-10 10:08:14 +0100 |
|---|---|---|
| committer | oy <Tom_Adams@web.de> | 2011-03-10 10:08:14 +0100 |
| commit | ee2f625754ca9f01be6732550f16098c5afa704a (patch) | |
| tree | 9776edf90fac02d1bf03606dbc8b79fd071ed917 /src/game/client/gameclient.cpp | |
| parent | 6205583d6411e300edd1ebf2eb170fbc8e7119e8 (diff) | |
| download | zcatch-ee2f625754ca9f01be6732550f16098c5afa704a.tar.gz zcatch-ee2f625754ca9f01be6732550f16098c5afa704a.zip | |
added extended spectator mode. Closes #28
Diffstat (limited to 'src/game/client/gameclient.cpp')
| -rw-r--r-- | src/game/client/gameclient.cpp | 28 |
1 files changed, 24 insertions, 4 deletions
diff --git a/src/game/client/gameclient.cpp b/src/game/client/gameclient.cpp index f80d0266..0d847162 100644 --- a/src/game/client/gameclient.cpp +++ b/src/game/client/gameclient.cpp @@ -44,6 +44,7 @@ #include "components/scoreboard.h" #include "components/skins.h" #include "components/sounds.h" +#include "components/spectator.h" #include "components/voting.h" CGameClient g_GameClient; @@ -69,6 +70,7 @@ static CSounds gs_Sounds; static CEmoticon gs_Emoticon; static CDamageInd gsDamageInd; static CVoting gs_Voting; +static CSpectator gs_Spectator; static CPlayers gs_Players; static CNamePlates gs_NamePlates; @@ -139,6 +141,7 @@ void CGameClient::OnConsoleInit() m_All.Add(&m_pParticles->m_RenderGeneral); m_All.Add(m_pDamageind); m_All.Add(&gs_Hud); + m_All.Add(&gs_Spectator); m_All.Add(&gs_Emoticon); m_All.Add(&gs_KillMessages); m_All.Add(m_pChat); @@ -156,6 +159,7 @@ void CGameClient::OnConsoleInit() m_Input.Add(m_pChat); // chat has higher prio due to tha you can quit it by pressing esc m_Input.Add(m_pMotd); // for pressing esc to remove it m_Input.Add(m_pMenus); + m_Input.Add(&gs_Spectator); m_Input.Add(&gs_Emoticon); m_Input.Add(m_pControls); m_Input.Add(m_pBinds); @@ -336,8 +340,9 @@ void CGameClient::OnReset() } -void CGameClient::UpdateLocalCharacterPos() +void CGameClient::UpdatePositions() { + // local character position if(g_Config.m_ClPredict && Client()->State() != IClient::STATE_DEMOPLAYBACK) { if(!m_Snap.m_pLocalCharacter || (m_Snap.m_pGameInfoObj && m_Snap.m_pGameInfoObj->m_GameStateFlags&GAMESTATEFLAG_GAMEOVER)) @@ -353,6 +358,16 @@ void CGameClient::UpdateLocalCharacterPos() vec2(m_Snap.m_pLocalPrevCharacter->m_X, m_Snap.m_pLocalPrevCharacter->m_Y), vec2(m_Snap.m_pLocalCharacter->m_X, m_Snap.m_pLocalCharacter->m_Y), Client()->IntraGameTick()); } + + // spectator position + if(m_Snap.m_Spectate && m_Snap.m_pSpectatorInfo) + { + 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); + } } @@ -393,8 +408,8 @@ void CGameClient::OnRender() return;*/ - // update the local character position - UpdateLocalCharacterPos(); + // update the local character and spectate position + UpdatePositions(); // dispatch all input to systems DispatchInput(); @@ -716,11 +731,11 @@ void CGameClient::OnNewSnapshot() else if(Item.m_Type == NETOBJTYPE_CHARACTER) { const void *pOld = Client()->SnapFindItem(IClient::SNAP_PREV, NETOBJTYPE_CHARACTER, Item.m_ID); + m_Snap.m_aCharacters[Item.m_ID].m_Cur = *((const CNetObj_Character *)pData); if(pOld) { m_Snap.m_aCharacters[Item.m_ID].m_Active = true; m_Snap.m_aCharacters[Item.m_ID].m_Prev = *((const CNetObj_Character *)pOld); - m_Snap.m_aCharacters[Item.m_ID].m_Cur = *((const CNetObj_Character *)pData); if(m_Snap.m_aCharacters[Item.m_ID].m_Prev.m_Tick) Evolve(&m_Snap.m_aCharacters[Item.m_ID].m_Prev, Client()->PrevGameTick()); @@ -728,6 +743,11 @@ void CGameClient::OnNewSnapshot() Evolve(&m_Snap.m_aCharacters[Item.m_ID].m_Cur, Client()->GameTick()); } } + else if(Item.m_Type == NETOBJTYPE_SPECTATORINFO) + { + 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); + } else if(Item.m_Type == NETOBJTYPE_GAMEINFO) { static bool s_GameOver = 0; |