Browse Source

Improve spectator.

halloween
Night Owl 7 years ago
parent
commit
4150b464a0
  1. 14
      dlls/client.cpp
  2. 23
      dlls/observer.cpp
  3. 1
      dlls/player.h

14
dlls/client.cpp

@ -555,12 +555,13 @@ void ClientCommand( edict_t *pEntity )
GetClassPtr( (CBasePlayer *)pev )->SelectLastItem(); GetClassPtr( (CBasePlayer *)pev )->SelectLastItem();
} }
else if( FStrEq( pcmd, "spectate" ) ) // clients wants to become a spectator else if( FStrEq( pcmd, "spectate" ) ) // clients wants to become a spectator
{
CBasePlayer *pPlayer = GetClassPtr( (CBasePlayer *)pev );
if( !pPlayer->IsObserver() )
{ {
// always allow proxies to become a spectator // always allow proxies to become a spectator
if( ( pev->flags & FL_PROXY ) || allow_spectators.value ) if( ( pev->flags & FL_PROXY ) || allow_spectators.value )
{ {
CBasePlayer *pPlayer = GetClassPtr( (CBasePlayer *)pev );
edict_t *pentSpawnSpot = g_pGameRules->GetPlayerSpawnSpot( pPlayer ); edict_t *pentSpawnSpot = g_pGameRules->GetPlayerSpawnSpot( pPlayer );
pPlayer->StartObserver( pev->origin, VARS( pentSpawnSpot )->angles ); pPlayer->StartObserver( pev->origin, VARS( pentSpawnSpot )->angles );
@ -571,6 +572,15 @@ void ClientCommand( edict_t *pEntity )
else else
ClientPrint( pev, HUD_PRINTCONSOLE, "Spectator mode is disabled.\n" ); ClientPrint( pev, HUD_PRINTCONSOLE, "Spectator mode is disabled.\n" );
} }
else
{
pPlayer->StopObserver();
// notify other clients of player left spectators
UTIL_ClientPrintAll( HUD_PRINTNOTIFY, UTIL_VarArgs( "%s has left spectator mode\n",
( pev->netname && ( STRING( pev->netname ) )[0] != 0 ) ? STRING( pev->netname ) : "unconnected" ) );
}
}
else if( FStrEq( pcmd, "specmode" ) ) // new spectator mode else if( FStrEq( pcmd, "specmode" ) ) // new spectator mode
{ {
CBasePlayer *pPlayer = GetClassPtr( (CBasePlayer *)pev ); CBasePlayer *pPlayer = GetClassPtr( (CBasePlayer *)pev );

23
dlls/observer.cpp

@ -24,6 +24,10 @@
extern int gmsgCurWeapon; extern int gmsgCurWeapon;
extern int gmsgSetFOV; extern int gmsgSetFOV;
extern int gmsgTeamInfo;
extern int g_teamplay;
// Find the next client in the game for this player to spectate // Find the next client in the game for this player to spectate
void CBasePlayer::Observer_FindNextPlayer( bool bReverse ) void CBasePlayer::Observer_FindNextPlayer( bool bReverse )
{ {
@ -266,3 +270,22 @@ void CBasePlayer::Observer_SetMode( int iMode )
m_iObserverLastMode = iMode; m_iObserverLastMode = iMode;
} }
void CBasePlayer::StopObserver()
{
// Turn off spectator
pev->iuser1 = pev->iuser2 = 0;
m_iHideHUD = 0;
GetClassPtr( (CBasePlayer *)pev )->Spawn();
pev->nextthink = -1;
// Update Team Status
MESSAGE_BEGIN( MSG_ALL, gmsgTeamInfo );
WRITE_BYTE( ENTINDEX( edict() ) ); // index number of primary entity
if( g_teamplay )
WRITE_STRING( TeamID() );
else
WRITE_STRING( "Players" );
MESSAGE_END();
}

1
dlls/player.h

@ -255,6 +255,7 @@ public:
void StartDeathCam( void ); void StartDeathCam( void );
void StartObserver( Vector vecPosition, Vector vecViewAngle ); void StartObserver( Vector vecPosition, Vector vecViewAngle );
void StopObserver();
void AddPoints( int score, BOOL bAllowNegativeScore ); void AddPoints( int score, BOOL bAllowNegativeScore );
void AddPointsToTeam( int score, BOOL bAllowNegativeScore ); void AddPointsToTeam( int score, BOOL bAllowNegativeScore );

Loading…
Cancel
Save