/* ================== SpectatorClientEndFrame ================== */ void SpectatorClientEndFrame(gentity_t *ent) { // OSP - specs periodically get score updates for useful demo playback info // if we are doing a chase cam or a remote view, grab the latest info if ((ent->client->sess.spectatorState == SPECTATOR_FOLLOW) || (ent->client->ps.pm_flags & PMF_LIMBO)) { int clientNum; gclient_t *cl; if (ent->client->sess.sessionTeam == TEAM_AXIS || ent->client->sess.sessionTeam == TEAM_ALLIES) { reinforce(ent); return; } // Limbos aren't following while in MV if (ent->client->ps.pm_flags & PMF_LIMBO) { return; } clientNum = ent->client->sess.spectatorClient; // team follow1 and team follow2 go to whatever clients are playing if (clientNum == -1) { clientNum = level.follow1; } else if (clientNum == -2) { clientNum = level.follow2; } if (clientNum >= 0) { cl = &level.clients[clientNum]; if (cl->pers.connected == CON_CONNECTED && cl->sess.sessionTeam != TEAM_SPECTATOR) { int flags = (cl->ps.eFlags & ~(EF_VOTED)) | (ent->client->ps.eFlags & (EF_VOTED)); int ping = ent->client->ps.ping; if (ent->client->sess.sessionTeam != TEAM_SPECTATOR && (ent->client->ps.pm_flags & PMF_LIMBO)) { int savedScore = ent->client->ps.persistant[PERS_SCORE]; int savedClass = ent->client->ps.stats[STAT_PLAYER_CLASS]; ent->client->ps = cl->ps; ent->client->ps.pm_flags |= PMF_FOLLOW; ent->client->ps.pm_flags |= PMF_LIMBO; ent->client->ps.persistant[PERS_SCORE] = savedScore; // put score back ent->client->ps.stats[STAT_PLAYER_CLASS] = savedClass; // NERVE - SMF - put player class back } else { ent->client->ps = cl->ps; ent->client->ps.pm_flags |= PMF_FOLLOW; } // DHM - Nerve :: carry flags over ent->client->ps.eFlags = flags; ent->client->ps.ping = ping; return; } // drop them to free spectators unless they are dedicated camera followers if (ent->client->sess.spectatorClient >= 0) { ent->client->sess.spectatorState = SPECTATOR_FREE; ClientBegin(ent->client - level.clients); } } } }
/* ================== SpectatorClientEndFrame ================== */ void SpectatorClientEndFrame( gentity_t *ent ) { gclient_t *cl; int do_respawn = 0; // JPW NERVE int savedScore; // DHM - Nerve int savedRespawns; // DHM - Nerve int savedClass; // NERVE - SMF int flags; int testtime; // if we are doing a chase cam or a remote view, grab the latest info if ( ( ent->client->sess.spectatorState == SPECTATOR_FOLLOW ) || ( ent->client->ps.pm_flags & PMF_LIMBO ) ) { // JPW NERVE for limbo int clientNum; if ( ent->client->sess.sessionTeam == TEAM_RED ) { testtime = level.time % g_redlimbotime.integer; if ( testtime < ent->client->pers.lastReinforceTime ) { do_respawn = 1; } ent->client->pers.lastReinforceTime = testtime; } else if ( ent->client->sess.sessionTeam == TEAM_BLUE ) { testtime = level.time % g_bluelimbotime.integer; if ( testtime < ent->client->pers.lastReinforceTime ) { do_respawn = 1; } ent->client->pers.lastReinforceTime = testtime; } if ( ( g_maxlives.integer > 0 || g_alliedmaxlives.integer > 0 || g_axismaxlives.integer > 0 ) && ent->client->ps.persistant[PERS_RESPAWNS_LEFT] == 0 ) { do_respawn = 0; } if ( do_respawn ) { reinforce( ent ); return; } clientNum = ent->client->sess.spectatorClient; // team follow1 and team follow2 go to whatever clients are playing if ( clientNum == -1 ) { clientNum = level.follow1; } else if ( clientNum == -2 ) { clientNum = level.follow2; } if ( clientNum >= 0 ) { cl = &level.clients[ clientNum ]; if ( cl->pers.connected == CON_CONNECTED && cl->sess.sessionTeam != TEAM_SPECTATOR ) { // DHM - Nerve :: carry flags over flags = ( cl->ps.eFlags & ~( EF_VOTED ) ) | ( ent->client->ps.eFlags & ( EF_VOTED ) ); // JPW NERVE -- limbo latch if ( ent->client->sess.sessionTeam != TEAM_SPECTATOR && ent->client->ps.pm_flags & PMF_LIMBO ) { // abuse do_respawn var savedScore = ent->client->ps.persistant[PERS_SCORE]; do_respawn = ent->client->ps.pm_time; savedRespawns = ent->client->ps.persistant[PERS_RESPAWNS_LEFT]; savedClass = ent->client->ps.stats[STAT_PLAYER_CLASS]; ent->client->ps = cl->ps; ent->client->ps.pm_flags |= PMF_FOLLOW; ent->client->ps.pm_flags |= PMF_LIMBO; ent->client->ps.persistant[PERS_RESPAWNS_LEFT] = savedRespawns; ent->client->ps.pm_time = do_respawn; // put pm_time back ent->client->ps.persistant[PERS_SCORE] = savedScore; // put score back ent->client->ps.stats[STAT_PLAYER_CLASS] = savedClass; // NERVE - SMF - put player class back } else { ent->client->ps = cl->ps; ent->client->ps.pm_flags |= PMF_FOLLOW; } // jpw // DHM - Nerve :: carry flags over ent->client->ps.eFlags = flags; return; } else { // drop them to free spectators unless they are dedicated camera followers if ( ent->client->sess.spectatorClient >= 0 ) { ent->client->sess.spectatorState = SPECTATOR_FREE; ClientBegin( ent->client - level.clients ); } } } } if ( ent->client->sess.spectatorState == SPECTATOR_SCOREBOARD ) { ent->client->ps.pm_flags |= PMF_SCOREBOARD; } else { ent->client->ps.pm_flags &= ~PMF_SCOREBOARD; } }