bool CPlayer::SetSpectatorID(int SpectatorID) { if(m_SpectatorID == SpectatorID || m_ClientID == SpectatorID) return false; if(m_Team == TEAM_SPECTATORS) { // check for freeview or if wanted player is playing if(SpectatorID == SPEC_FREEVIEW || (GameServer()->m_apPlayers[SpectatorID] && GameServer()->m_apPlayers[SpectatorID]->GetTeam() != TEAM_SPECTATORS)) { m_SpectatorID = SpectatorID; return true; } } else if(m_DeadSpecMode) { // check if wanted player can be followed if(GameServer()->m_apPlayers[SpectatorID] && DeadCanFollow(GameServer()->m_apPlayers[SpectatorID])) { m_SpectatorID = SpectatorID; return true; } } return false; }
void CPlayer::UpdateDeadSpecMode() { // check if actual spectator id is valid if(m_SpectatorID != SPEC_FREEVIEW && GameServer()->m_apPlayers[m_SpectatorID] && DeadCanFollow(GameServer()->m_apPlayers[m_SpectatorID])) return; // find player to follow for(int i = 0; i < MAX_CLIENTS; ++i) { if(GameServer()->m_apPlayers[i] && DeadCanFollow(GameServer()->m_apPlayers[i])) { m_SpectatorID = i; return; } } // no one available to follow -> turn spectator mode off m_DeadSpecMode = false; }
bool CPlayer::SetSpectatorID(int SpecMode, int SpectatorID) { if((SpecMode == m_SpecMode && SpecMode != SPEC_PLAYER) || (m_SpecMode == SPEC_PLAYER && SpecMode == SPEC_PLAYER && (SpectatorID == -1 || m_SpectatorID == SpectatorID || m_ClientID == SpectatorID))) { return false; } if(m_Team == TEAM_SPECTATORS) { // check for freeview or if wanted player is playing if(SpecMode != SPEC_PLAYER || (SpecMode == SPEC_PLAYER && GameServer()->m_apPlayers[SpectatorID] && GameServer()->m_apPlayers[SpectatorID]->GetTeam() != TEAM_SPECTATORS)) { if(SpecMode == SPEC_FLAGRED || SpecMode == SPEC_FLAGBLUE) { CFlag *pFlag = (CFlag*)GameServer()->m_World.FindFirst(CGameWorld::ENTTYPE_FLAG); while (pFlag) { if ((pFlag->GetTeam() == TEAM_RED && SpecMode == SPEC_FLAGRED) || (pFlag->GetTeam() == TEAM_BLUE && SpecMode == SPEC_FLAGBLUE)) { m_pSpecFlag = pFlag; if (pFlag->GetCarrier()) m_SpectatorID = pFlag->GetCarrier()->GetPlayer()->GetCID(); else m_SpectatorID = -1; break; } pFlag = (CFlag*)pFlag->TypeNext(); } if (!m_pSpecFlag) return false; m_SpecMode = SpecMode; return true; } m_pSpecFlag = 0; m_SpecMode = SpecMode; m_SpectatorID = SpectatorID; return true; } } else if(m_DeadSpecMode) { // check if wanted player can be followed if(SpecMode == SPEC_PLAYER && GameServer()->m_apPlayers[SpectatorID] && DeadCanFollow(GameServer()->m_apPlayers[SpectatorID])) { m_SpecMode = SpecMode; m_pSpecFlag = 0; m_SpectatorID = SpectatorID; return true; } } return false; }