void Cam_Unlock(void) { if (Cmd_FindAlias("f_freeflyspectate")) { Cbuf_AddTextEx (&cbuf_main, "f_freeflyspectate\n"); } if (!autocam) { return; } if (cls.mvdplayback == QTV_PLAYBACK) { // its not setinfo extension, but adding new extension just for this is stupid IMO QTV_Cmd_Printf(QTV_EZQUAKE_EXT_SETINFO, "ptrack"); } else { MSG_WriteByte (&cls.netchan.message, clc_stringcmd); MSG_WriteString (&cls.netchan.message, "ptrack"); } autocam = CAM_NONE; locked = false; Sbar_Changed(); if (cls.mvdplayback && cl.teamfortress) { V_TF_ClearGrenadeEffects (); } if (TP_NeedRefreshSkins()) { TP_RefreshSkins(); } }
// // Change what player we are tracking. // // trackview: // - Should be < 0 if we're in normal mode. // - Between 0-3 if we're in multiview. // void CL_Track (int trackview) { int slot; char *arg; if (cls.state < ca_connected) { Com_Printf("You must be connected to track\n", Cmd_Argv(0)); return; } if (!cl.spectator) { Com_Printf("You can only track in spectator mode\n", Cmd_Argv(0)); return; } // Don't go outside of the mv_trackslots array bounds. trackview = min(trackview, 3); // Allow resetting to default tracking for multiview. if (trackview >= 0 && !strcmp(Cmd_Args(), "off")) { Com_Printf("Track %d resetting to default\n", trackview); mv_trackslots[trackview] = -1; return; } if (Cmd_Argc() != 2) { if (trackview < 0) { // Normal track. Com_Printf("Usage: %s <name | userid>\n", Cmd_Argv(0)); } else { // Multiview track. Com_Printf("Usage: %s <name | userid | off>\n", Cmd_Argv(0)); } return; } slot = Player_GetSlot(arg = Cmd_Argv(1)); // // The specified player wasn't found. // if (slot == PLAYER_NAME_NOMATCH) { Com_Printf("%s : no such player %s\n", Cmd_Argv(0), arg); return; } else if (slot == PLAYER_ID_NOMATCH) { Com_Printf("%s : no player with userid %d\n", Cmd_Argv(0), Q_atoi(arg)); return; } else if (slot < 0 || slot >= MAX_CLIENTS) { // PLAYER_NUM_MISMATCH covered by this Com_Printf("%s : no such player\n", Cmd_Argv(0)); return; } // A player has been found that we want to track. if (cl.players[slot].spectator) { Com_Printf("You cannot track a spectator\n", Cmd_Argv(0)); } else if (Cam_TrackNum() != slot || trackview >= 0) { // If we're not already tracking the found slot // set the camera to track mode and lock it to the selected slot. // (Locked as in "not free flying", not "cannot change tracked player") autocam = CAM_TRACK; Cam_Lock(slot); ideal_track = slot; // Multiview tracking: // Set the specified track view to track the specified player. if(trackview >= 0) { mv_trackslots[trackview] = slot; } locked = true; if (cls.mvdplayback && cl.teamfortress) { V_TF_ClearGrenadeEffects(); } } }
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; }
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; }