From da6e3d20337367e8cc34bb8fd4089ddc9769ca30 Mon Sep 17 00:00:00 2001 From: speedvoltage <32344549+speedvoltage@users.noreply.github.com> Date: Tue, 11 Mar 2025 12:32:56 +0100 Subject: [PATCH] Spectator observer fixes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ► Fixed an issue where spectators could spectate a player who joined team Spectator. ► Switch to free roaming when joining team spectator. ► Switch to free roaming when player leaves the game. --- src/game/server/player.cpp | 42 ++++++++++++++++++++++- src/game/shared/hl2mp/hl2mp_gamerules.cpp | 35 +++++++++++++++++++ src/game/shared/hl2mp/hl2mp_gamerules.h | 1 + 3 files changed, 77 insertions(+), 1 deletion(-) diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp index b8a0519d2..09f148c56 100644 --- a/src/game/server/player.cpp +++ b/src/game/server/player.cpp @@ -2287,7 +2287,7 @@ bool CBasePlayer::StartObserverMode(int mode) AddSolidFlags( FSOLID_NOT_SOLID ); - SetObserverMode( mode ); + SetObserverMode( OBS_MODE_ROAMING ); if ( gpGlobals->eLoadType != MapLoad_Background ) { @@ -4644,6 +4644,29 @@ void CBasePlayer::PostThink() ClientSettingsChanged(); } + if ( IsObserver() && !IsHLTV() ) + { + if ( m_iObserverMode == OBS_MODE_POI || m_iObserverMode == OBS_MODE_FIXED ) + { + // Remove a pointless second third person view + m_iObserverMode = OBS_MODE_ROAMING; + } + + if ( m_iObserverLastMode == OBS_MODE_ROAMING ) + { + SetMoveType( MOVETYPE_OBSERVER ); + } + + if ( m_iObserverMode != OBS_MODE_IN_EYE ) + { + m_Local.m_iHideHUD = HIDEHUD_CROSSHAIR; + } + else + { + m_Local.m_iHideHUD &= ~HIDEHUD_CROSSHAIR; + } + } + m_vecSmoothedVelocity = m_vecSmoothedVelocity * SMOOTHING_FACTOR + GetAbsVelocity() * ( 1 - SMOOTHING_FACTOR ); if ( !g_fGameOver && !m_iPlayerLocked ) @@ -6607,6 +6630,11 @@ bool CBasePlayer::ClientCommand( const CCommand &args ) else { // switch to next spec mode if no parameter given + CBaseEntity *target = FindNextObserverTarget( false ); + + if ( !target ) + return true; + mode = GetObserverMode() + 1; if ( mode > LAST_PLAYER_OBSERVERMODE ) @@ -6648,6 +6676,10 @@ bool CBasePlayer::ClientCommand( const CCommand &args ) { SetObserverTarget( target ); } + else + { + SetObserverMode( OBS_MODE_ROAMING ); + } } else if ( GetObserverMode() == OBS_MODE_FREEZECAM ) { @@ -6666,6 +6698,10 @@ bool CBasePlayer::ClientCommand( const CCommand &args ) { SetObserverTarget( target ); } + else + { + SetObserverMode( OBS_MODE_ROAMING ); + } } else if ( GetObserverMode() == OBS_MODE_FREEZECAM ) { @@ -6684,6 +6720,10 @@ bool CBasePlayer::ClientCommand( const CCommand &args ) { SetObserverTarget( target ); } + else + { + SetObserverMode( OBS_MODE_ROAMING ); + } } return true; diff --git a/src/game/shared/hl2mp/hl2mp_gamerules.cpp b/src/game/shared/hl2mp/hl2mp_gamerules.cpp index 87a3cf6e3..789eafc93 100644 --- a/src/game/shared/hl2mp/hl2mp_gamerules.cpp +++ b/src/game/shared/hl2mp/hl2mp_gamerules.cpp @@ -294,6 +294,8 @@ void CHL2MPRules::Think( void ) CGameRules::Think(); + ObserverTargetFix(); + if ( g_fGameOver ) // someone else quit the game already { // check to see if we should change levels now @@ -373,6 +375,39 @@ void CHL2MPRules::Think( void ) #endif } +#ifdef GAME_DLL +void CHL2MPRules::ObserverTargetFix() +{ + // Fixes a bug where a specator could spectate another spectator + for ( int i = 1; i <= gpGlobals->maxClients; ++i ) + { + CBasePlayer *pPlayer = UTIL_PlayerByIndex( i ); + + if ( !pPlayer ) + continue; + + if ( pPlayer->GetObserverMode() == OBS_MODE_CHASE || pPlayer->GetObserverMode() == OBS_MODE_IN_EYE ) + { + CBasePlayer *pTarget = ToBasePlayer( pPlayer->GetObserverTarget() ); + + if ( pTarget ) + { + if ( pTarget->GetTeamNumber() == TEAM_SPECTATOR ) + { + pPlayer->SetObserverMode( OBS_MODE_ROAMING ); + pPlayer->SetObserverTarget( NULL ); + } + } + else + { + pPlayer->SetObserverMode( OBS_MODE_ROAMING ); + pPlayer->SetObserverTarget( NULL ); + } + } + } +} +#endif + void CHL2MPRules::GoToIntermission( void ) { #ifndef CLIENT_DLL diff --git a/src/game/shared/hl2mp/hl2mp_gamerules.h b/src/game/shared/hl2mp/hl2mp_gamerules.h index 78da2179d..8efc844cf 100644 --- a/src/game/shared/hl2mp/hl2mp_gamerules.h +++ b/src/game/shared/hl2mp/hl2mp_gamerules.h @@ -152,6 +152,7 @@ public: void CheckAllPlayersReady( void ); virtual bool IsConnectedUserInfoChangeAllowed( CBasePlayer *pPlayer ); + void ObserverTargetFix(); private: