// Handle buttons in observer mode void CBasePlayer::Observer_HandleButtons() { // Slow down mouse clicks if ( m_flNextObserverInput > gpGlobals->time ) return; // Jump changes from modes: Chase to Roaming if ( m_afButtonPressed & IN_JUMP ) { if ( pev->iuser1 == OBS_ROAMING ) Observer_SetMode( OBS_CHASE_LOCKED ); else if ( pev->iuser1 == OBS_CHASE_LOCKED ) Observer_SetMode( OBS_CHASE_FREE ); else Observer_SetMode( OBS_ROAMING ); m_flNextObserverInput = gpGlobals->time + 0.2; } // Attack moves to the next player if ( m_afButtonPressed & IN_ATTACK && pev->iuser1 != OBS_ROAMING ) { Observer_FindNextPlayer( false ); m_flNextObserverInput = gpGlobals->time + 0.2; } // Attack2 moves to the prev player if ( m_afButtonPressed & IN_ATTACK2 && pev->iuser1 != OBS_ROAMING ) { Observer_FindNextPlayer( true ); m_flNextObserverInput = gpGlobals->time + 0.2; } }
/* <11c9d3> ../cstrike/dlls/observer.cpp:304 */ void CBasePlayer::Observer_CheckTarget() { if (pev->iuser1 == OBS_ROAMING && !m_bWasFollowing) return; if (m_bWasFollowing) { Observer_FindNextPlayer(false); if (m_hObserverTarget) Observer_SetMode(m_iObserverLastMode); } else { int lastMode; // try to find a traget if we have no current one if (!m_hObserverTarget) Observer_FindNextPlayer(false); if (m_hObserverTarget) { int iPlayerIndex = ENTINDEX(m_hObserverTarget->edict()); CBasePlayer *target = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(iPlayerIndex)); // check taget if (!target || target->pev->deadflag == DEAD_RESPAWNABLE || (target->pev->effects & EF_NODRAW)) Observer_FindNextPlayer(false); else if (target->pev->deadflag == DEAD_DEAD && gpGlobals->time > target->m_fDeadTime + 2.0f) { // 3 secs after death change target Observer_FindNextPlayer(false); if (!m_hObserverTarget) { lastMode = pev->iuser1; Observer_SetMode(OBS_ROAMING); m_iObserverLastMode = lastMode; m_bWasFollowing = true; } } } // no target found at all else { lastMode = pev->iuser1; Observer_SetMode(OBS_ROAMING); // don't overwrite users lastmode m_iObserverLastMode = lastMode; } } }
/* <11c9ac> ../cstrike/dlls/observer.cpp:254 */ void CBasePlayer::Observer_HandleButtons() { // Slow down mouse clicks if (m_flNextObserverInput > gpGlobals->time) return; // Jump changes from modes: Chase to Roaming if (m_afButtonPressed & IN_JUMP) { switch (pev->iuser1) { case OBS_CHASE_LOCKED: Observer_SetMode(OBS_IN_EYE); break; case OBS_CHASE_FREE: Observer_SetMode(OBS_IN_EYE); break; case OBS_IN_EYE: Observer_SetMode(OBS_ROAMING); break; case OBS_ROAMING: Observer_SetMode(OBS_MAP_FREE); break; case OBS_MAP_FREE: Observer_SetMode(OBS_MAP_CHASE); break; default: Observer_SetMode(m_bObserverAutoDirector ? OBS_CHASE_LOCKED : OBS_CHASE_FREE); break; } m_flNextObserverInput = gpGlobals->time + 0.2f; } // Attack moves to the next player if (m_afButtonPressed & IN_ATTACK) { Observer_FindNextPlayer(false); m_flNextObserverInput = gpGlobals->time + 0.2f; } // Attack2 moves to the prev player if (m_afButtonPressed & IN_ATTACK2) { Observer_FindNextPlayer(true); m_flNextObserverInput = gpGlobals->time + 0.2f; } }
void CBasePlayer::Observer_CheckTarget() { if( pev->iuser1 == OBS_ROAMING ) return; // try to find a traget if we have no current one if ( m_hObserverTarget == NULL) { Observer_FindNextPlayer( false ); if (m_hObserverTarget == NULL) { // no target found at all int lastMode = pev->iuser1; Observer_SetMode( OBS_ROAMING ); m_iObserverLastMode = lastMode; // don't overwrite users lastmode return; // we still have np target return } } CBasePlayer* target = (CBasePlayer*)(UTIL_PlayerByIndex( ENTINDEX(m_hObserverTarget->edict()))); if ( !target ) { Observer_FindNextPlayer( false ); return; } // check taget if (target->pev->deadflag == DEAD_DEAD) { if ( (target->m_fDeadTime + 2.0f ) < gpGlobals->time ) { // 3 secs after death change target Observer_FindNextPlayer( false ); return; } } }
// Attempt to change the observer mode void CBasePlayer::Observer_SetMode( int iMode ) { // Just abort if we're changing to the mode we're already in if ( iMode == pev->iuser1 ) return; // is valid mode ? if ( iMode < OBS_CHASE_LOCKED || iMode > OBS_MAP_CHASE ) iMode = OBS_IN_EYE; // now it is // verify observer target again if ( m_hObserverTarget != NULL) { CBaseEntity *pEnt = m_hObserverTarget; if ( (pEnt == this) || (pEnt == NULL) ) m_hObserverTarget = NULL; else if ( ((CBasePlayer*)pEnt)->IsObserver() || (pEnt->pev->effects & EF_NODRAW) ) m_hObserverTarget = NULL; } // set spectator mode pev->iuser1 = iMode; // if we are not roaming, we need a valid target to track if ( (iMode != OBS_ROAMING) && (m_hObserverTarget == NULL) ) { Observer_FindNextPlayer( false ); // if we didn't find a valid target switch to roaming if (m_hObserverTarget == NULL) { ClientPrint( pev, HUD_PRINTCENTER, "#Spec_NoTarget" ); pev->iuser1 = OBS_ROAMING; } } // set target if not roaming if (pev->iuser1 == OBS_ROAMING) { pev->iuser2 = 0; } else pev->iuser2 = ENTINDEX( m_hObserverTarget->edict() ); pev->iuser3 = 0; // clear second target from death cam // print spepctaor mode on client screen char modemsg[16]; sprintf(modemsg,"#Spec_Mode%i", pev->iuser1 ); ClientPrint( pev, HUD_PRINTCENTER, modemsg ); m_iObserverLastMode = iMode; }
// Attempt to change the observer mode void CBasePlayer::Observer_SetMode( int iMode ) { // Just abort if we're changing to the mode we're already in if ( iMode == pev->iuser1 ) return; // is valid mode ? if ( iMode < OBS_CHASE_LOCKED || iMode > OBS_MAP_CHASE ) iMode = OBS_IN_EYE; // now it is // if we are not roaming, we need a valid target to track if ( (iMode != OBS_ROAMING) && (m_hObserverTarget == NULL) ) { Observer_FindNextPlayer(); // if we didn't find a valid target switch to roaming if (m_hObserverTarget == NULL) { ClientPrint( pev, HUD_PRINTCENTER, "#Spec_NoTarget" ); iMode = OBS_ROAMING; } } // set spectator mode pev->iuser1 = iMode; // set target if not roaming if (iMode == OBS_ROAMING) pev->iuser2 = 0; else pev->iuser2 = ENTINDEX( m_hObserverTarget->edict() ); // print spepctaor mode on client screen char modemsg[16]; sprintf(modemsg,"#Spec_Mode%i", iMode); ClientPrint( pev, HUD_PRINTCENTER, modemsg ); }
// Attempt to change the observer mode void CBasePlayer::Observer_SetMode( int iMode ) { // Just abort if we're changing to the mode we're already in if ( iMode == pev->iuser1 ) return; // Changing to Roaming? if ( iMode == OBS_ROAMING ) { // MOD AUTHORS: If you don't want to allow roaming observers at all in your mod, just abort here. pev->iuser1 = OBS_ROAMING; pev->iuser2 = 0; ClientPrint( pev, HUD_PRINTCENTER, "#Spec_Mode3" ); pev->maxspeed = 320; return; } // Changing to Chase Lock? if ( iMode == OBS_CHASE_LOCKED ) { // If changing from Roaming, or starting observing, make sure there is a target if ( m_hObserverTarget == NULL ) Observer_FindNextPlayer( false ); if (m_hObserverTarget) { pev->iuser1 = OBS_CHASE_LOCKED; pev->iuser2 = ENTINDEX( m_hObserverTarget->edict() ); ClientPrint( pev, HUD_PRINTCENTER, "#Spec_Mode1" ); pev->maxspeed = 0; } else { ClientPrint( pev, HUD_PRINTCENTER, "#Spec_NoTarget" ); Observer_SetMode(OBS_ROAMING); } return; } // Changing to Chase Freelook? if ( iMode == OBS_CHASE_FREE ) { // If changing from Roaming, or starting observing, make sure there is a target if ( m_hObserverTarget == NULL ) Observer_FindNextPlayer( false ); if (m_hObserverTarget) { pev->iuser1 = OBS_CHASE_FREE; pev->iuser2 = ENTINDEX( m_hObserverTarget->edict() ); ClientPrint( pev, HUD_PRINTCENTER, "#Spec_Mode2" ); pev->maxspeed = 0; } else { ClientPrint( pev, HUD_PRINTCENTER, "#Spec_NoTarget" ); Observer_SetMode(OBS_ROAMING); } return; } }
/* <11c6db> ../cstrike/dlls/observer.cpp:506 */ void CBasePlayer::Observer_SetMode(int iMode) { int _forcecamera; int oldMode; // Just abort if we're changing to the mode we're already in if (iMode == pev->iuser1) return; _forcecamera = GetForceCamera(this); // is valid mode ? if (iMode < OBS_CHASE_LOCKED || iMode > OBS_MAP_CHASE) iMode = OBS_IN_EYE; oldMode = pev->iuser1; if (m_iTeam != SPECTATOR) { if (_forcecamera == CAMERA_MODE_SPEC_ONLY_TEAM) { if (iMode == OBS_ROAMING) iMode = OBS_MAP_FREE; } else if (_forcecamera == CAMERA_MODE_SPEC_ONLY_FRIST_PERSON) iMode = OBS_IN_EYE; } // verify observer target again if (m_hObserverTarget != NULL) { CBaseEntity *pEnt = m_hObserverTarget; if (pEnt == this || !pEnt || pEnt->has_disconnected || ((CBasePlayer *)pEnt)->IsObserver() || (pEnt->pev->effects & EF_NODRAW) || (_forcecamera != CAMERA_MODE_SPEC_ANYONE && ((CBasePlayer *)pEnt)->m_iTeam != m_iTeam)) m_hObserverTarget = NULL; } // set spectator mode pev->iuser1 = iMode; // if we are not roaming, we need a valid target to track if (iMode != OBS_ROAMING && m_hObserverTarget == NULL) { Observer_FindNextPlayer(false); // if we didn't find a valid target switch to roaming if (m_hObserverTarget == NULL) { ClientPrint(pev, HUD_PRINTCENTER, "#Spec_NoTarget"); pev->iuser1 = OBS_ROAMING; } } // set target if not roaming if (pev->iuser1 == OBS_ROAMING) pev->iuser2 = 0; else pev->iuser2 = ENTINDEX(m_hObserverTarget->edict()); // clear second target from death cam pev->iuser3 = 0; if (m_hObserverTarget != NULL) UTIL_SetOrigin(pev, m_hObserverTarget->pev->origin); MESSAGE_BEGIN(MSG_ONE, gmsgCrosshair, NULL, pev); WRITE_BYTE((iMode == OBS_ROAMING) != 0); MESSAGE_END(); UpdateClientEffects(this, oldMode); // print spepctaor mode on client screen char modemsg[16]; Q_sprintf(modemsg, "#Spec_Mode%i", pev->iuser1); ClientPrint(pev, HUD_PRINTCENTER, modemsg); m_iObserverLastMode = iMode; m_bWasFollowing = false; }