void C_HLTVCamera::SpecNextPlayer( bool bInverse ) { int start = 0; if ( m_iTraget1 > 0 && m_iTraget1 <= gpGlobals->maxClients ) start = m_iTraget1; else if (GetBall() && m_iTraget1 == GetBall()->entindex()) start = 0; int index = start; while ( true ) { // got next/prev player if ( bInverse ) index--; else index++; // check bounds if ( index < 0 ) { index = gpGlobals->maxClients; } else if ( index > gpGlobals->maxClients ) { index = 0; } if ( index == start ) break; // couldn't find a new valid player if (index > 0 && index <= gpGlobals->maxClients) { C_BasePlayer *pPlayer = UTIL_PlayerByIndex( index ); if ( !pPlayer ) continue; // only follow living players if ( pPlayer->IsObserver() ) continue; } break; // found a new player } if (index == 0 && GetBall()) index = GetBall()->entindex(); if (index != 0) SetPrimaryTarget( index ); // turn off auto director once user tried to change view settings SetAutoDirector( false ); }
void C_HLTVCamera::SpecNamedPlayer( const char *szPlayerName ) { for ( int index = 1; index <= gpGlobals->maxClients; ++index ) { C_BasePlayer *pPlayer = UTIL_PlayerByIndex( index ); if ( !pPlayer ) continue; if ( !FStrEq( szPlayerName, pPlayer->GetPlayerName() ) ) continue; // only follow living players or dedicated spectators if ( pPlayer->IsObserver() && pPlayer->GetTeamNumber() != TEAM_SPECTATOR ) continue; SetPrimaryTarget( index ); return; } }
void C_HLTVCamera::FireGameEvent( IGameEvent * event) { if ( !g_bEngineIsHLTV ) return; // not in HLTV mode const char *type = event->GetName(); if ( Q_strcmp( "game_newmap", type ) == 0 ) { Reset(); // reset all camera settings // show spectator UI if ( !GetViewPortInterface() ) return; if ( engine->IsPlayingDemo() ) { // for demo playback show full menu GetViewPortInterface()->ShowPanel( PANEL_SPECMENU, true ); SetMode( OBS_MODE_ROAMING ); } else { // during live broadcast only show black bars GetViewPortInterface()->ShowPanel( PANEL_SPECGUI, true ); } return; } if ( Q_strcmp( "hltv_message", type ) == 0 ) { wchar_t outputBuf[1024]; const char *pszText = event->GetString( "text", "" ); char *tmpStr = hudtextmessage->LookupString( pszText ); const wchar_t *pBuf = g_pVGuiLocalize->Find( tmpStr ); if ( pBuf ) { // Copy pBuf into szBuf[i]. int nMaxChars = sizeof( outputBuf ) / sizeof( wchar_t ); wcsncpy( outputBuf, pBuf, nMaxChars ); outputBuf[nMaxChars-1] = 0; } else { g_pVGuiLocalize->ConvertANSIToUnicode( tmpStr, outputBuf, sizeof(outputBuf) ); } GetCenterPrint()->Print( ConvertCRtoNL( outputBuf ) ); return ; } if ( Q_strcmp( "hltv_title", type ) == 0 ) { Q_strncpy( m_szTitleText, event->GetString( "text", "" ), sizeof(m_szTitleText) ); return; } if ( Q_strcmp( "hltv_status", type ) == 0 ) { int nNumProxies = event->GetInt( "proxies" ); m_nNumSpectators = event->GetInt( "clients" ) - nNumProxies; return; } // after this only auto-director commands follow // don't execute them is autodirector is off and PVS is unlocked if ( !spec_autodirector.GetBool() && !IsPVSLocked() ) return; if ( Q_strcmp( "hltv_cameraman", type ) == 0 ) { Reset(); m_nCameraMode = OBS_MODE_ROAMING; m_iCameraMan = event->GetInt( "index" ); return; } if ( Q_strcmp( "hltv_fixed", type ) == 0 ) { m_iCameraMan = 0; m_vCamOrigin.x = event->GetInt( "posx" ); m_vCamOrigin.y = event->GetInt( "posy" ); m_vCamOrigin.z = event->GetInt( "posz" ); QAngle angle; angle.x = event->GetInt( "theta" ); angle.y = event->GetInt( "phi" ); angle.z = 0; // no roll yet if ( m_nCameraMode != OBS_MODE_FIXED ) { SetMode( OBS_MODE_FIXED ); SetCameraAngle( angle ); m_flFOV = event->GetFloat( "fov", 90 ); } SetPrimaryTarget( event->GetInt( "target" ) ); if ( m_iTraget1 == 0 ) { SetCameraAngle( angle ); } return; } if ( Q_strcmp( "hltv_chase", type ) == 0 ) { bool bInEye = event->GetBool( "ineye" ); // check if we are already in a player chase mode bool bIsInChaseMode = (m_nCameraMode==OBS_MODE_IN_EYE)|| (m_nCameraMode==OBS_MODE_CHASE); // if we are in auto director or not in a valid chase mode, set new mode now if ( spec_autodirector.GetBool() || !bIsInChaseMode ) { SetMode( bInEye?OBS_MODE_IN_EYE:OBS_MODE_CHASE ); } m_iCameraMan = 0; m_iTraget2 = event->GetInt( "target2" ); m_flDistance = event->GetFloat( "distance", m_flDistance ); m_flOffset = event->GetFloat( "offset", m_flOffset ); m_flTheta = event->GetFloat( "theta", m_flTheta ); m_flPhi = event->GetFloat( "phi", m_flPhi ); m_flFOV = event->GetFloat( "fov", 90 ); m_flInertia = event->GetFloat( "inertia", 30.f ) / 10.f; // if inertia is not set use standard value if ( m_flInertia <= 0 ) m_flInertia = 3.0f; SetPrimaryTarget( event->GetInt( "target1" ) ); return; } }