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; }
void CPlayer::OnDirectInput(CNetObj_PlayerInput *NewInput) { if(GameServer()->m_World.m_Paused) { m_PlayerFlags = NewInput->m_PlayerFlags; return; } if(NewInput->m_PlayerFlags&PLAYERFLAG_CHATTING) { // skip the input if chat is active if(m_PlayerFlags&PLAYERFLAG_CHATTING) return; // reset input if(m_pCharacter) m_pCharacter->ResetInput(); m_PlayerFlags = NewInput->m_PlayerFlags; return; } m_PlayerFlags = NewInput->m_PlayerFlags; if(m_pCharacter) m_pCharacter->OnDirectInput(NewInput); if(!m_pCharacter && m_Team != TEAM_SPECTATORS && (NewInput->m_Fire&1)) Respawn(); if(!m_pCharacter && m_Team == TEAM_SPECTATORS && (NewInput->m_Fire&1)) { if(!m_ActiveSpecSwitch) { m_ActiveSpecSwitch = true; if(m_SpecMode == SPEC_FREEVIEW) { CCharacter *pChar = (CCharacter *)GameServer()->m_World.ClosestEntity(m_ViewPos, 6.0f*32, CGameWorld::ENTTYPE_CHARACTER, 0); CFlag *pFlag = (CFlag *)GameServer()->m_World.ClosestEntity(m_ViewPos, 6.0f*32, CGameWorld::ENTTYPE_FLAG, 0); if(pChar || pFlag) { if(!pChar || (pFlag && pChar && distance(m_ViewPos, pFlag->GetPos()) < distance(m_ViewPos, pChar->GetPos()))) { m_SpecMode = pFlag->GetTeam() == TEAM_RED ? SPEC_FLAGRED : SPEC_FLAGBLUE; m_pSpecFlag = pFlag; m_SpectatorID = -1; } else { m_SpecMode = SPEC_PLAYER; m_pSpecFlag = 0; m_SpectatorID = pChar->GetPlayer()->GetCID(); } } } else { m_SpecMode = SPEC_FREEVIEW; m_pSpecFlag = 0; m_SpectatorID = -1; } } } else if(m_ActiveSpecSwitch) m_ActiveSpecSwitch = false; // check for activity if(NewInput->m_Direction || m_LatestActivity.m_TargetX != NewInput->m_TargetX || m_LatestActivity.m_TargetY != NewInput->m_TargetY || NewInput->m_Jump || NewInput->m_Fire&1 || NewInput->m_Hook) { m_LatestActivity.m_TargetX = NewInput->m_TargetX; m_LatestActivity.m_TargetY = NewInput->m_TargetY; m_LastActionTick = Server()->Tick(); m_InactivityTickCounter = 0; } }