static void Cam_CheckHighTarget(void) { int i, j, maxfrags; player_info_t *s; j = -1; for (i = 0, maxfrags = -9999; i < MAX_CLIENTS; i++) { s = &cl.players[i]; if (s->name[0] && !s->spectator && s->frags > maxfrags) { maxfrags = s->frags; j = i; } } if (j >= 0) { if (!locked || cl.players[j].frags > cl.players[spec_track].frags) Cam_Lock(j); } else { Cam_Unlock(); } }
void Cam_FinishMove(usercmd_t *cmd) { int i, end, inc; player_info_t *s; if (cls.state != ca_active) return; if (!cl.spectator) // only in spectator mode return; if (cmd->buttons & BUTTON_ATTACK) { if (!(oldbuttons & BUTTON_ATTACK)) { oldbuttons |= BUTTON_ATTACK; autocam++; if (autocam > CAM_TRACK) { Cam_Unlock(); VectorCopy(cl.viewangles, cmd->angles); return; } } else return; } else { oldbuttons &= ~BUTTON_ATTACK; if (!autocam) return; } // cl_hightrack if (autocam && cl_hightrack.value) { Cam_CheckHighTarget(); if (Cam_JumpCheck(cmd)) { Com_Printf_State(PRINT_FAIL,"cl_hightrack enabled. Unable to switch POV.\n"); } return; } if (Cam_MoveDownCheck(cmd)) { inc = -1; } else { inc = 1; } if (locked) { if (!Cam_JumpCheck(cmd) && inc == 1) { return; } // Swap the Multiview mvinset/main view pov when jump button is pressed. nSwapPov = inc; } if (locked && autocam) end = (ideal_track + MAX_CLIENTS + inc) % MAX_CLIENTS; else end = ideal_track; i = end; do { s = &cl.players[i]; if (s->name[0] && !s->spectator) { if (cls.mvdplayback && cl.teamfortress) V_TF_ClearGrenadeEffects(); // BorisU Cam_Lock(i); ideal_track = i; return; } i = (i + MAX_CLIENTS + inc) % MAX_CLIENTS; } while (i != end); // stay on same guy? i = ideal_track; s = &cl.players[i]; if (s->name[0] && !s->spectator) { Cam_Lock(i); return; } Com_Printf ("No target found ...\n"); autocam = locked = false; }
// Take over the user controls and track a player. // We find a nice position to watch the player and move there void Cam_Track(usercmd_t *cmd) { player_state_t *player, *self; frame_t *frame; vec3_t vec; if (!cl.spectator) { return; } // hack: save +movedown command cmddown = cmd->upmove < 0; // cl_hightrack if (cl_hightrack.value && !locked) { Cam_CheckHighTarget(); } if (!autocam || cls.state != ca_active) { return; } if (locked && (!cl.players[spec_track].name[0] || cl.players[spec_track].spectator)) { locked = false; // cl_hightrack if (cl_hightrack.value) { Cam_CheckHighTarget(); } else { Cam_Unlock(); } return; } frame = &cl.frames[cl.validsequence & UPDATE_MASK]; if (autocam && cls.mvdplayback) { if (ideal_track != spec_track && cls.realtime - last_lock > 0.1 && frame->playerstate[ideal_track].messagenum == cl.parsecount) { Cam_Lock(ideal_track); } if (frame->playerstate[spec_track].messagenum != cl.parsecount) { int i; for (i = 0; i < MAX_CLIENTS; i++) { if (frame->playerstate[i].messagenum == cl.parsecount) break; } if (i < MAX_CLIENTS) { Cam_Lock(i); } } } player = frame->playerstate + spec_track; self = frame->playerstate + cl.playernum; if (!locked || !Cam_IsVisible(player, desired_position)) { if (!locked || cls.realtime - cam_lastviewtime > 0.1) { if (!InitFlyby(self, player, true)) InitFlyby(self, player, false); cam_lastviewtime = cls.realtime; } } else { cam_lastviewtime = cls.realtime; } // couldn't track for some reason if (!locked || !autocam) return; if (cl_chasecam.value) { cmd->forwardmove = cmd->sidemove = cmd->upmove = 0; #ifdef JSS_CAM if (!Cvar_Value ("cam_thirdperson")) #endif { VectorCopy(player->viewangles, cl.viewangles); } VectorCopy(player->origin, desired_position); if (memcmp(&desired_position, &self->origin, sizeof(desired_position)) != 0) { MSG_WriteByte (&cls.netchan.message, clc_tmove); MSG_WriteCoord (&cls.netchan.message, desired_position[0]); MSG_WriteCoord (&cls.netchan.message, desired_position[1]); MSG_WriteCoord (&cls.netchan.message, desired_position[2]); // move there locally immediately VectorCopy(desired_position, self->origin); } } else { // Ok, move to our desired position and set our angles to view // the player VectorSubtract(desired_position, self->origin, vec); cmd->forwardmove = cmd->sidemove = cmd->upmove = 0; if (VectorLength(vec) > 16) { // close enough? MSG_WriteByte (&cls.netchan.message, clc_tmove); MSG_WriteCoord (&cls.netchan.message, desired_position[0]); MSG_WriteCoord (&cls.netchan.message, desired_position[1]); MSG_WriteCoord (&cls.netchan.message, desired_position[2]); } // move there locally immediately VectorCopy(desired_position, self->origin); VectorSubtract(player->origin, desired_position, vec); vectoangles(vec, cl.viewangles); cl.viewangles[0] = -cl.viewangles[0]; } }
void Cam_FinishMove(usercmd_t *cmd) { int i; player_info_t *s; int end; if (cls.state != ca_active) return; if (!cl.spectator) // only in spectator mode return; #if 0 if (autocam && locked) { frame = &cl.frames[cls.netchan.incoming_sequence & UPDATE_MASK]; player = frame->playerstate + spec_track; self = frame->playerstate + cl.playernum; VectorSubtract(player->origin, self->origin, vec); if (cam_forceview) { cam_forceview = false; vectoangles(vec, cam_viewangles); cam_viewangles[0] = -cam_viewangles[0]; } else { vectoangles(vec, vec2); vec2[PITCH] = -vec2[PITCH]; cam_viewangles[PITCH] = adjustang(cam_viewangles[PITCH], vec2[PITCH], cl_camera_maxpitch.value); cam_viewangles[YAW] = adjustang(cam_viewangles[YAW], vec2[YAW], cl_camera_maxyaw.value); } VectorCopy(cam_viewangles, cl.viewangles); } #endif if (cmd->buttons & BUTTON_ATTACK) { if (!(oldbuttons & BUTTON_ATTACK)) { oldbuttons |= BUTTON_ATTACK; autocam++; if (autocam > CAM_TRACK) { Cam_Unlock(); VectorCopy(cl.viewangles, cmd->angles); return; } } else return; } else { oldbuttons &= ~BUTTON_ATTACK; if (!autocam) return; } if (autocam && cl_hightrack.value) { Cam_CheckHighTarget(); return; } if (locked) { if ((cmd->buttons & BUTTON_JUMP) && (oldbuttons & BUTTON_JUMP)) return; // don't pogo stick if (!(cmd->buttons & BUTTON_JUMP)) { oldbuttons &= ~BUTTON_JUMP; return; } oldbuttons |= BUTTON_JUMP; // don't jump again until released } // Con_Printf("Selecting track target...\n"); if (locked && autocam) end = (spec_track + 1) % MAX_CLIENTS; else end = spec_track; i = end; do { s = &cl.players[i]; if (s->name[0] && !s->spectator) { Cam_Lock(i); return; } i = (i + 1) % MAX_CLIENTS; } while (i != end); // stay on same guy? i = spec_track; s = &cl.players[i]; if (s->name[0] && !s->spectator) { Cam_Lock(i); return; } Con_Printf("No target found ...\n"); autocam = locked = false; }
// ZOID // // Take over the user controls and track a player. // We find a nice position to watch the player and move there void Cam_Track(usercmd_t *cmd) { player_state_t *player, *self; frame_t *frame; vec3_t vec; float len; if (!cl.spectator) return; if (cl_hightrack.value && !locked) Cam_CheckHighTarget(); if (!autocam || cls.state != ca_active) return; if (locked && (!cl.players[spec_track].name[0] || cl.players[spec_track].spectator)) { locked = false; if (cl_hightrack.value) Cam_CheckHighTarget(); else Cam_Unlock(); return; } frame = &cl.frames[cls.netchan.incoming_sequence & UPDATE_MASK]; player = frame->playerstate + spec_track; self = frame->playerstate + cl.playernum; if (!locked || !Cam_IsVisible(player, desired_position)) { if (!locked || realtime - cam_lastviewtime > 0.1) { if (!InitFlyby(self, player, true)) InitFlyby(self, player, false); cam_lastviewtime = realtime; } } else cam_lastviewtime = realtime; // couldn't track for some reason if (!locked || !autocam) return; if (cl_chasecam.value) { cmd->forwardmove = cmd->sidemove = cmd->upmove = 0; VectorCopy(player->viewangles, cl.viewangles); VectorCopy(player->origin, desired_position); if (memcmp(&desired_position, &self->origin, sizeof(desired_position)) != 0) { MSG_WriteByte (&cls.netchan.message, clc_tmove); MSG_WriteCoord (&cls.netchan.message, desired_position[0]); MSG_WriteCoord (&cls.netchan.message, desired_position[1]); MSG_WriteCoord (&cls.netchan.message, desired_position[2]); // move there locally immediately VectorCopy(desired_position, self->origin); } self->weaponframe = player->weaponframe; } else { // Ok, move to our desired position and set our angles to view // the player VectorSubtract(desired_position, self->origin, vec); len = vlen(vec); cmd->forwardmove = cmd->sidemove = cmd->upmove = 0; if (len > 16) { // close enough? MSG_WriteByte (&cls.netchan.message, clc_tmove); MSG_WriteCoord (&cls.netchan.message, desired_position[0]); MSG_WriteCoord (&cls.netchan.message, desired_position[1]); MSG_WriteCoord (&cls.netchan.message, desired_position[2]); } // move there locally immediately VectorCopy(desired_position, self->origin); VectorSubtract(player->origin, desired_position, vec); vectoangles(vec, cl.viewangles); cl.viewangles[0] = -cl.viewangles[0]; } }
void Cam_FinishMove(usercmd_t *cmd) { int i, end; player_info_t *s; if (cls.state != ca_active) return; if (!cl.spectator) // only in spectator mode return; if (cmd->buttons & BUTTON_ATTACK) { if (!(oldbuttons & BUTTON_ATTACK)) { oldbuttons |= BUTTON_ATTACK; autocam++; if (autocam > CAM_TRACK) { Cam_Unlock(); VectorCopy(cl.viewangles, cmd->angles); return; } } else return; } else { oldbuttons &= ~BUTTON_ATTACK; if (!autocam) return; } // cl_hightrack if (autocam && cl_hightrack.value) { Cam_CheckHighTarget(); return; } if (locked) { if ((cmd->buttons & BUTTON_JUMP) && (oldbuttons & BUTTON_JUMP)) return; // don't pogo stick if (!(cmd->buttons & BUTTON_JUMP)) { oldbuttons &= ~BUTTON_JUMP; return; } oldbuttons |= BUTTON_JUMP; // don't jump again until released // Swap the Multiview mvinset/main view pov when jump button is pressed. if (!nSwapPov) { nSwapPov = true; } } if (locked && autocam) end = (ideal_track + 1) % MAX_CLIENTS; else end = ideal_track; i = end; do { s = &cl.players[i]; if (s->name[0] && !s->spectator) { if (cls.mvdplayback && cl.teamfortress) V_TF_ClearGrenadeEffects(); // BorisU Cam_Lock(i); ideal_track = i; return; } i = (i + 1) % MAX_CLIENTS; } while (i != end); // stay on same guy? i = ideal_track; s = &cl.players[i]; if (s->name[0] && !s->spectator) { Cam_Lock(i); return; } Com_Printf ("No target found ...\n"); autocam = locked = false; }
// ZOID // // Take over the user controls and track a player. // We find a nice position to watch the player and move there void Cam_Track (usercmd_t *cmd) { float len; frame_t *frame; player_state_t *player, *self; vec3_t vec; if (!cl.spectator) return; if (cl_hightrack->int_val && !locked) Cam_CheckHighTarget (); if (!autocam || cls.state != ca_active) return; if (locked && (!cl.players[spec_track].name->value[0] || cl.players[spec_track].spectator)) { locked = false; if (cl_hightrack->int_val) Cam_CheckHighTarget (); else Cam_Unlock (); return; } frame = &cl.frames[cls.netchan.incoming_sequence & UPDATE_MASK]; if (autocam && cls.demoplayback2 && 0) { if (ideal_track != spec_track && realtime - last_lock > 1 && frame->playerstate[ideal_track].messagenum == cl.parsecount) Cam_Lock (ideal_track); if (frame->playerstate[spec_track].messagenum != cl.parsecount) { int i; for (i = 0; i < MAX_CLIENTS; i++) { if (frame->playerstate[i].messagenum == cl.parsecount) break; } if (i < MAX_CLIENTS) Cam_Lock (i); } } player = frame->playerstate + spec_track; self = frame->playerstate + cl.playernum; if (!locked || !Cam_IsVisible (player, desired_position)) { if (!locked || realtime - cam_lastviewtime > 0.1) { if (!InitFlyby (self, player, true)) InitFlyby (self, player, false); cam_lastviewtime = realtime; } } else cam_lastviewtime = realtime; // couldn't track for some reason if (!locked || !autocam) return; if (cl_chasecam->int_val) { cmd->forwardmove = cmd->sidemove = cmd->upmove = 0; VectorCopy (player->viewangles, cl.viewangles); VectorCopy (player->pls.origin, desired_position); if (memcmp (&desired_position, &self->pls.origin, sizeof (desired_position)) != 0) { if (!cls.demoplayback) { MSG_WriteByte (&cls.netchan.message, clc_tmove); MSG_WriteCoordV (&cls.netchan.message, desired_position); } // move there locally immediately VectorCopy (desired_position, self->pls.origin); } self->pls.weaponframe = player->pls.weaponframe; } else { // Ok, move to our desired position and set our angles to view // the player VectorSubtract (desired_position, self->pls.origin, vec); len = VectorLength (vec); cmd->forwardmove = cmd->sidemove = cmd->upmove = 0; if (len > 16) { // close enough? if (!cls.demoplayback) { MSG_WriteByte (&cls.netchan.message, clc_tmove); MSG_WriteCoordV (&cls.netchan.message, desired_position); } } // move there locally immediately VectorCopy (desired_position, self->pls.origin); VectorSubtract (player->pls.origin, desired_position, vec); vectoangles (vec, cl.viewangles); cl.viewangles[0] = -cl.viewangles[0]; } }
void Cam_FinishMove(usercmd_t *cmd) { int i, end; player_info_t *s; if (cls.state != ca_active) return; if (!cl.spectator) // only in spectator mode return; if (cmd->buttons & BUTTON_ATTACK) { if (!(oldbuttons & BUTTON_ATTACK)) { oldbuttons |= BUTTON_ATTACK; autocam++; if (autocam > CAM_TRACK) { Cam_Unlock(); VectorCopy(cl.viewangles, cmd->angles); return; } } else return; } else { oldbuttons &= ~BUTTON_ATTACK; if (!autocam) return; } if (locked) { if ((cmd->buttons & BUTTON_JUMP) && (oldbuttons & BUTTON_JUMP)) return; // don't pogo stick if (!(cmd->buttons & BUTTON_JUMP)) { oldbuttons &= ~BUTTON_JUMP; return; } oldbuttons |= BUTTON_JUMP; // don't jump again until released } if (locked && autocam) end = (ideal_track + 1) % MAX_CLIENTS; else end = ideal_track; i = end; do { s = &cl.players[i]; if (s->name[0] && !s->spectator) { Cam_Lock(i); ideal_track = i; return; } i = (i + 1) % MAX_CLIENTS; } while (i != end); // stay on same guy? i = ideal_track; s = &cl.players[i]; if (s->name[0] && !s->spectator) { Cam_Lock(i); return; } Com_Printf ("No target found ...\n"); autocam = locked = false; }
// Take over the user controls and track a player. // We find a nice position to watch the player and move there void Cam_Track(usercmd_t *cmd) { player_state_t *player, *self; frame_t *frame; vec3_t vec; int do_tmove; if (!cl.spectator) return; if (!autocam || cls.state != ca_active) return; if (locked && (!cl.players[spec_track].name[0] || cl.players[spec_track].spectator)) { locked = false; Cam_Unlock(); return; } frame = &cl.frames[cl.validsequence & UPDATE_MASK]; if (autocam && cls.mvdplayback) { if (ideal_track != spec_track && cls.realtime - last_lock > 0.1 && frame->playerstate[ideal_track].messagenum == cl.parsecount) Cam_Lock(ideal_track); if (frame->playerstate[spec_track].messagenum != cl.parsecount) { int i; for (i = 0; i < MAX_CLIENTS; i++) { if (frame->playerstate[i].messagenum == cl.parsecount) break; } if (i < MAX_CLIENTS) Cam_Lock(i); } } player = frame->playerstate + spec_track; self = frame->playerstate + cl.playernum; if (!locked || !Cam_IsVisible(player, desired_position)) { if (!locked || cls.realtime - cam_lastviewtime > 0.1) { if (!InitFlyby(self, player, true)) InitFlyby(self, player, false); cam_lastviewtime = cls.realtime; } } else { cam_lastviewtime = cls.realtime; } // couldn't track for some reason if (!locked || !autocam) return; do_tmove = 0; if (cl_chasecam.value) { cmd->forwardmove = cmd->sidemove = cmd->upmove = 0; VectorCopy(player->viewangles, cl.viewangles); VectorCopy(player->origin, desired_position); if (memcmp(&desired_position, &self->origin, sizeof(desired_position)) != 0) { do_tmove = 1; // move there locally immediately VectorCopy(desired_position, self->origin); } } else { // Ok, move to our desired position and set our angles to view // the player VectorSubtract(desired_position, self->origin, vec); cmd->forwardmove = cmd->sidemove = cmd->upmove = 0; if (VectorLength(vec) > 16) { // close enough? do_tmove = 1; } // move there locally immediately VectorCopy(desired_position, self->origin); VectorSubtract(player->origin, desired_position, vec); vectoangles(vec, cl.viewangles); cl.viewangles[0] = -cl.viewangles[0]; if (cl.viewangles[0] < 0) cl.viewangles[0] += 360; } Mouse_SetViewAngles(cl.viewangles); #ifdef NETQW if (do_tmove && cls.netqw) NetQW_SetTeleport(cls.netqw, desired_position); #else MSG_WriteByte (&cls.netchan.message, clc_tmove); MSG_WriteCoord (&cls.netchan.message, desired_position[0]); MSG_WriteCoord (&cls.netchan.message, desired_position[1]); MSG_WriteCoord (&cls.netchan.message, desired_position[2]); #endif }