示例#1
0
void CL_Track_f(void) {	
	int slot;
	char *arg;

	if (cls.state < ca_connected) {
		Com_Printf("You must be connected to track\n");
		return;
	}
	if (!cl.spectator) {
		Com_Printf("You can only track in spectator mode\n");
		return;
	}
	if (Cmd_Argc() != 2) {
		Com_Printf("Usage: %s <name | userid>\n", Cmd_Argv(0));
		return;
	}

	slot = Player_GetSlot(arg = Cmd_Argv(1));

	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;
	}

	if (cl.players[slot].spectator) {
		Com_Printf("You cannot track a spectator\n");
	} else if (Cam_TrackNum() != slot) {
		autocam = CAM_TRACK;
		Cam_Lock(slot);
		ideal_track = slot;
		locked = true;
	}
}
示例#2
0
//
// 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();
		}
	}
}