@@ -29,7 +29,19 @@ CBasePlayer *CBasePlayer::__API_HOOK(Observer_IsValidTarget)(int iPlayerIndex, b
2929 CBasePlayer *pPlayer = UTIL_PlayerByIndex (iPlayerIndex);
3030
3131 // Don't spec observers or players who haven't picked a class yet
32- if (!pPlayer || pPlayer == this || pPlayer->has_disconnected || pPlayer->GetObserverMode () != OBS_NONE || (pPlayer->pev ->effects & EF_NODRAW) || pPlayer->m_iTeam == UNASSIGNED || (bSameTeam && pPlayer->m_iTeam != m_iTeam))
32+ if (!pPlayer || pPlayer == this )
33+ return nullptr ;
34+
35+ if (pPlayer->has_disconnected )
36+ return nullptr ;
37+
38+ if (pPlayer->GetObserverMode () != OBS_NONE)
39+ return nullptr ;
40+
41+ if (pPlayer->pev ->effects & EF_NODRAW)
42+ return nullptr ;
43+
44+ if (pPlayer->m_iTeam == UNASSIGNED || (bSameTeam && pPlayer->m_iTeam != m_iTeam))
3345 return nullptr ;
3446
3547 return pPlayer;
@@ -269,12 +281,21 @@ void CBasePlayer::Observer_CheckTarget()
269281 CBasePlayer *target = UTIL_PlayerByIndex (m_hObserverTarget->entindex ());
270282
271283 // check taget
272- if (!target || target->pev ->deadflag == DEAD_RESPAWNABLE || (target->pev ->effects & EF_NODRAW))
284+ if (!target || target->pev ->deadflag == DEAD_RESPAWNABLE)
285+ {
273286 Observer_FindNextPlayer (false );
274-
287+ }
288+ else if (target->pev ->effects & EF_NODRAW)
289+ {
290+ #ifdef REGAMEDLL_FIXES
291+ bool bStillDying = (target->pev ->deadflag == DEAD_DYING || (target->pev ->deadflag == DEAD_DEAD && (gpGlobals->time <= target->m_fDeadTime + 2 .0f )));
292+ if (!bStillDying || (target->m_afPhysicsFlags & PFLAG_OBSERVER)) // keep observing to victim until dying, even if it is invisible
293+ #endif
294+ Observer_FindNextPlayer (false );
295+ }
275296 else if (target->pev ->deadflag == DEAD_DEAD && gpGlobals->time > target->m_fDeadTime + 2 .0f )
276297 {
277- // 3 secs after death change target
298+ // 2 secs after death change target
278299 Observer_FindNextPlayer (false );
279300
280301 if (!m_hObserverTarget)
0 commit comments