/* ================ SetupVisibility A client can have a separate "view entity" indicating that his/her view should depend on the origin of that view entity. If that's the case, then pViewEntity will be non-NULL and will be used. Otherwise, the current entity's origin is used. Either is offset by the view_ofs to get the eye position. From the eye position, we set up the PAS and PVS to use for filtering network messages to the client. At this point, we could override the actual PAS or PVS values, or use a different origin. NOTE: Do not cache the values of pas and pvs, as they depend on reusable memory in the engine, they are only good for this one frame ================ */ void SetupVisibility( edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas ) { Vector org; edict_t *pView = pClient; // Find the client's PVS if ( pViewEntity ) { pView = pViewEntity; } // Tracking Spectators use the visibility of their target CBasePlayer *pPlayer = (CBasePlayer *)CBaseEntity::Instance( pClient ); if ( (pPlayer->pev->iuser2 != 0) && (pPlayer->m_hObserverTarget != NULL) ) { pView = pPlayer->m_hObserverTarget->edict(); } org = pView->v.origin + pView->v.view_ofs; if ( pView->v.flags & FL_DUCKING ) { org = org + ( VEC_HULL_MIN - VEC_DUCK_HULL_MIN ); } *pvs = ENGINE_SET_PVS ( (float *)&org ); *pas = ENGINE_SET_PAS ( (float *)&org ); }
/* ================ SetupVisibility A client can have a separate "view entity" indicating that his/her view should depend on the origin of that view entity. If that's the case, then pViewEntity will be non-NULL and will be used. Otherwise, the current entity's origin is used. Either is offset by the view_ofs to get the eye position. From the eye position, we set up the PAS and PVS to use for filtering network messages to the client. At this point, we could override the actual PAS or PVS values, or use a different origin. NOTE: Do not cache the values of pas and pvs, as they depend on reusable memory in the engine, they are only good for this one frame ================ */ void SetupVisibility( edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas ) { Vector org; edict_t *pView = pClient; // Find the client's PVS if ( pViewEntity ) { pView = pViewEntity; } // modif de Julien // camera du tank CBaseEntity *pEnt = CBaseEntity::Instance(pClient); if ( pEnt->IsPlayer() ) { CBasePlayer *pPlayer = (CBasePlayer*)pEnt; if( pPlayer->m_iDrivingTank == TRUE ) { // origine de la camera et non pas du joueur pView = UTIL_FindEntityByClassname(NULL, "info_tank_camera" )->edict(); } } org = pView->v.origin + pView->v.view_ofs; if ( pView->v.flags & FL_DUCKING ) { org = org + ( VEC_HULL_MIN - VEC_DUCK_HULL_MIN ); } *pvs = ENGINE_SET_PVS ( (float *)&org ); *pas = ENGINE_SET_PAS ( (float *)&org ); }
/* ================ SetupVisibility A client can have a separate "view entity" indicating that his/her view should depend on the origin of that view entity. If that's the case, then pViewEntity will be non-NULL and will be used. Otherwise, the current entity's origin is used. Either is offset by the view_ofs to get the eye position. From the eye position, we set up the PAS and PVS to use for filtering network messages to the client. At this point, we could override the actual PAS or PVS values, or use a different origin. NOTE: Do not cache the values of pas and pvs, as they depend on reusable memory in the engine, they are only good for this one frame ================ */ void SetupVisibility( edict_t *pViewEntity, edict_t *pClient, unsigned char **pvs, unsigned char **pas ) { Vector org; edict_t *pView = pClient; // Find the client's PVS if ( pViewEntity ) { pView = pViewEntity; } if ( pClient->v.flags & FL_PROXY ) { *pvs = NULL; // the spectator proxy sees *pas = NULL; // and hears everything return; } if( pView->v.effects & EF_MERGE_VISIBILITY ) { if( FClassnameIs( pView, "env_sky" )) { org = pView->v.origin; } else return; // don't merge pvs } else { org = pView->v.origin + pView->v.view_ofs; if ( pView->v.flags & FL_DUCKING ) { org = org + ( VEC_HULL_MIN - VEC_DUCK_HULL_MIN ); } } *pvs = ENGINE_SET_PVS ( (float *)&org ); *pas = ENGINE_SET_PAS ( (float *)&org ); }