/* * Cmd_Spec_f */ void Cmd_Spec_f( edict_t *ent ) { if( ent->s.team == TEAM_SPECTATOR && !ent->r.client->queueTimeStamp ) { G_PrintMsg( ent, "You are already a spectator.\n" ); return; } G_SpectatorMode( ent ); G_Teams_LeaveChallengersQueue( ent ); }
/* * Cmd_SwitchChaseCamMode_f */ void Cmd_SwitchChaseCamMode_f( edict_t *ent ) { if( ent->s.team == TEAM_SPECTATOR ) { if( ent->r.client->resp.chase.active ) { G_SpectatorMode( ent ); } else { G_Chase_SetChaseActive( ent, true ); G_ChaseStep( ent, 0 ); } } }
/* * Cmd_Position_f */ static void Cmd_Position_f( edict_t *ent ) { char *action; if( !sv_cheats->integer && GS_MatchState() > MATCH_STATE_WARMUP && ent->r.client->ps.pmove.pm_type != PM_SPECTATOR ) { G_PrintMsg( ent, "Position command is only available in warmup and in spectator mode.\n" ); return; } // flood protect if( ent->r.client->teamstate.position_lastcmd + 500 > game.realtime ) return; ent->r.client->teamstate.position_lastcmd = game.realtime; action = trap_Cmd_Argv( 1 ); if( !Q_stricmp( action, "save" ) ) { ent->r.client->teamstate.position_saved = true; VectorCopy( ent->s.origin, ent->r.client->teamstate.position_origin ); VectorCopy( ent->s.angles, ent->r.client->teamstate.position_angles ); G_PrintMsg( ent, "Position saved.\n" ); } else if( !Q_stricmp( action, "load" ) ) { if( !ent->r.client->teamstate.position_saved ) { G_PrintMsg( ent, "No position saved.\n" ); } else { if( ent->r.client->resp.chase.active ) G_SpectatorMode( ent ); if( G_Teleport( ent, ent->r.client->teamstate.position_origin, ent->r.client->teamstate.position_angles ) ) G_PrintMsg( ent, "Position loaded.\n" ); else G_PrintMsg( ent, "Position not available.\n" ); } } else if( !Q_stricmp( action, "set" ) && trap_Cmd_Argc() == 7 ) { vec3_t origin, angles; int i, argnumber = 2; for( i = 0; i < 3; i++ ) origin[i] = atof( trap_Cmd_Argv( argnumber++ ) ); for( i = 0; i < 2; i++ ) angles[i] = atof( trap_Cmd_Argv( argnumber++ ) ); angles[2] = 0; if( ent->r.client->resp.chase.active ) G_SpectatorMode( ent ); if( G_Teleport( ent, origin, angles ) ) G_PrintMsg( ent, "Position not available.\n" ); else G_PrintMsg( ent, "Position set.\n" ); } else { char msg[MAX_STRING_CHARS]; msg[0] = 0; Q_strncatz( msg, "Usage:\nposition save - Save current position\n", sizeof( msg ) ); Q_strncatz( msg, "position load - Teleport to saved position\n", sizeof( msg ) ); Q_strncatz( msg, "position set <x> <y> <z> <pitch> <yaw> - Teleport to specified position\n", sizeof( msg ) ); Q_strncatz( msg, va( "Current position: %.4f %.4f %.4f %.4f %.4f\n", ent->s.origin[0], ent->s.origin[1], ent->s.origin[2], ent->s.angles[0], ent->s.angles[1] ), sizeof( msg ) ); G_PrintMsg( ent, msg ); } }