391 lines
9.7 KiB
C
391 lines
9.7 KiB
C
// Copyright (C) 1999-2000 Id Software, Inc.
|
|
//
|
|
// cg_consolecmds.c -- text commands typed in at the local console, or
|
|
// executed by a key binding
|
|
|
|
#include "cg_local.h"
|
|
#include "../ui/ui_shared.h"
|
|
#include "bg_saga.h"
|
|
extern menuDef_t *menuScoreboard;
|
|
|
|
|
|
|
|
void CG_TargetCommand_f( void ) {
|
|
int targetNum;
|
|
char test[4];
|
|
|
|
targetNum = CG_CrosshairPlayer();
|
|
if (!targetNum ) {
|
|
return;
|
|
}
|
|
|
|
trap_Argv( 1, test, 4 );
|
|
trap_SendConsoleCommand( va( "gc %i %i", targetNum, atoi( test ) ) );
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
=================
|
|
CG_SizeUp_f
|
|
|
|
Keybinding command
|
|
=================
|
|
*/
|
|
static void CG_SizeUp_f (void) {
|
|
trap_Cvar_Set("cg_viewsize", va("%i",(int)(cg_viewsize.integer+10)));
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
CG_SizeDown_f
|
|
|
|
Keybinding command
|
|
=================
|
|
*/
|
|
static void CG_SizeDown_f (void) {
|
|
trap_Cvar_Set("cg_viewsize", va("%i",(int)(cg_viewsize.integer-10)));
|
|
}
|
|
|
|
|
|
/*
|
|
=============
|
|
CG_Viewpos_f
|
|
|
|
Debugging command to print the current position
|
|
=============
|
|
*/
|
|
static void CG_Viewpos_f (void) {
|
|
CG_Printf ("%s (%i %i %i) : %i\n", cgs.mapname, (int)cg.refdef.vieworg[0],
|
|
(int)cg.refdef.vieworg[1], (int)cg.refdef.vieworg[2],
|
|
(int)cg.refdef.viewangles[YAW]);
|
|
}
|
|
|
|
|
|
static void CG_ScoresDown_f( void ) {
|
|
|
|
CG_BuildSpectatorString();
|
|
if ( cg.scoresRequestTime + 2000 < cg.time ) {
|
|
// the scores are more than two seconds out of data,
|
|
// so request new ones
|
|
cg.scoresRequestTime = cg.time;
|
|
trap_SendClientCommand( "score" );
|
|
|
|
// leave the current scores up if they were already
|
|
// displayed, but if this is the first hit, clear them out
|
|
if ( !cg.showScores ) {
|
|
cg.showScores = qtrue;
|
|
cg.numScores = 0;
|
|
}
|
|
} else {
|
|
// show the cached contents even if they just pressed if it
|
|
// is within two seconds
|
|
cg.showScores = qtrue;
|
|
}
|
|
}
|
|
|
|
static void CG_ScoresUp_f( void ) {
|
|
if ( cg.showScores ) {
|
|
cg.showScores = qfalse;
|
|
cg.scoreFadeTime = cg.time;
|
|
}
|
|
}
|
|
|
|
extern menuDef_t *menuScoreboard;
|
|
void Menu_Reset(); // FIXME: add to right include file
|
|
|
|
static void CG_scrollScoresDown_f( void) {
|
|
if (menuScoreboard && cg.scoreBoardShowing) {
|
|
Menu_ScrollFeeder(menuScoreboard, FEEDER_SCOREBOARD, qtrue);
|
|
Menu_ScrollFeeder(menuScoreboard, FEEDER_REDTEAM_LIST, qtrue);
|
|
Menu_ScrollFeeder(menuScoreboard, FEEDER_BLUETEAM_LIST, qtrue);
|
|
}
|
|
}
|
|
|
|
|
|
static void CG_scrollScoresUp_f( void) {
|
|
if (menuScoreboard && cg.scoreBoardShowing) {
|
|
Menu_ScrollFeeder(menuScoreboard, FEEDER_SCOREBOARD, qfalse);
|
|
Menu_ScrollFeeder(menuScoreboard, FEEDER_REDTEAM_LIST, qfalse);
|
|
Menu_ScrollFeeder(menuScoreboard, FEEDER_BLUETEAM_LIST, qfalse);
|
|
}
|
|
}
|
|
|
|
|
|
static void CG_spWin_f( void) {
|
|
trap_Cvar_Set("cg_cameraOrbit", "2");
|
|
trap_Cvar_Set("cg_cameraOrbitDelay", "35");
|
|
trap_Cvar_Set("cg_thirdPerson", "1");
|
|
trap_Cvar_Set("cg_thirdPersonAngle", "0");
|
|
trap_Cvar_Set("cg_thirdPersonRange", "100");
|
|
CG_AddBufferedSound(cgs.media.winnerSound);
|
|
//trap_S_StartLocalSound(cgs.media.winnerSound, CHAN_ANNOUNCER);
|
|
CG_CenterPrint(CG_GetStringEdString("MP_INGAME", "YOU_WIN"), SCREEN_HEIGHT * .30, 0);
|
|
}
|
|
|
|
static void CG_spLose_f( void) {
|
|
trap_Cvar_Set("cg_cameraOrbit", "2");
|
|
trap_Cvar_Set("cg_cameraOrbitDelay", "35");
|
|
trap_Cvar_Set("cg_thirdPerson", "1");
|
|
trap_Cvar_Set("cg_thirdPersonAngle", "0");
|
|
trap_Cvar_Set("cg_thirdPersonRange", "100");
|
|
CG_AddBufferedSound(cgs.media.loserSound);
|
|
//trap_S_StartLocalSound(cgs.media.loserSound, CHAN_ANNOUNCER);
|
|
CG_CenterPrint(CG_GetStringEdString("MP_INGAME", "YOU_LOSE"), SCREEN_HEIGHT * .30, 0);
|
|
}
|
|
|
|
|
|
static void CG_TellTarget_f( void ) {
|
|
int clientNum;
|
|
char command[128];
|
|
char message[128];
|
|
|
|
clientNum = CG_CrosshairPlayer();
|
|
if ( clientNum == -1 ) {
|
|
return;
|
|
}
|
|
|
|
trap_Args( message, 128 );
|
|
Com_sprintf( command, 128, "tell %i %s", clientNum, message );
|
|
trap_SendClientCommand( command );
|
|
}
|
|
|
|
static void CG_TellAttacker_f( void ) {
|
|
int clientNum;
|
|
char command[128];
|
|
char message[128];
|
|
|
|
clientNum = CG_LastAttacker();
|
|
if ( clientNum == -1 ) {
|
|
return;
|
|
}
|
|
|
|
trap_Args( message, 128 );
|
|
Com_sprintf( command, 128, "tell %i %s", clientNum, message );
|
|
trap_SendClientCommand( command );
|
|
}
|
|
|
|
|
|
/*
|
|
==================
|
|
CG_StartOrbit_f
|
|
==================
|
|
*/
|
|
|
|
static void CG_StartOrbit_f( void ) {
|
|
char var[MAX_TOKEN_CHARS];
|
|
|
|
trap_Cvar_VariableStringBuffer( "developer", var, sizeof( var ) );
|
|
if ( !atoi(var) ) {
|
|
return;
|
|
}
|
|
if (cg_cameraOrbit.value != 0) {
|
|
trap_Cvar_Set ("cg_cameraOrbit", "0");
|
|
trap_Cvar_Set("cg_thirdPerson", "0");
|
|
} else {
|
|
trap_Cvar_Set("cg_cameraOrbit", "5");
|
|
trap_Cvar_Set("cg_thirdPerson", "1");
|
|
trap_Cvar_Set("cg_thirdPersonAngle", "0");
|
|
trap_Cvar_Set("cg_thirdPersonRange", "100");
|
|
}
|
|
}
|
|
|
|
void CG_SiegeBriefingDisplay(int team, int dontshow);
|
|
static void CG_SiegeBriefing_f(void)
|
|
{
|
|
int team;
|
|
|
|
if (cgs.gametype != GT_SIEGE)
|
|
{ //Cannot be displayed unless in this gametype
|
|
return;
|
|
}
|
|
|
|
team = cg.predictedPlayerState.persistant[PERS_TEAM];
|
|
|
|
if (team != SIEGETEAM_TEAM1 &&
|
|
team != SIEGETEAM_TEAM2)
|
|
{ //cannot be displayed if not on a valid team
|
|
return;
|
|
}
|
|
|
|
CG_SiegeBriefingDisplay(team, 0);
|
|
}
|
|
|
|
static void CG_SiegeCvarUpdate_f(void)
|
|
{
|
|
int team;
|
|
|
|
if (cgs.gametype != GT_SIEGE)
|
|
{ //Cannot be displayed unless in this gametype
|
|
return;
|
|
}
|
|
|
|
team = cg.predictedPlayerState.persistant[PERS_TEAM];
|
|
|
|
if (team != SIEGETEAM_TEAM1 &&
|
|
team != SIEGETEAM_TEAM2)
|
|
{ //cannot be displayed if not on a valid team
|
|
return;
|
|
}
|
|
|
|
CG_SiegeBriefingDisplay(team, 1);
|
|
}
|
|
static void CG_SiegeCompleteCvarUpdate_f(void)
|
|
{
|
|
|
|
if (cgs.gametype != GT_SIEGE)
|
|
{ //Cannot be displayed unless in this gametype
|
|
return;
|
|
}
|
|
|
|
// Set up cvars for both teams
|
|
CG_SiegeBriefingDisplay(SIEGETEAM_TEAM1, 1);
|
|
CG_SiegeBriefingDisplay(SIEGETEAM_TEAM2, 1);
|
|
}
|
|
/*
|
|
static void CG_Camera_f( void ) {
|
|
char name[1024];
|
|
trap_Argv( 1, name, sizeof(name));
|
|
if (trap_loadCamera(name)) {
|
|
cg.cameraMode = qtrue;
|
|
trap_startCamera(cg.time);
|
|
} else {
|
|
CG_Printf ("Unable to load camera %s\n",name);
|
|
}
|
|
}
|
|
*/
|
|
|
|
|
|
typedef struct {
|
|
char *cmd;
|
|
void (*function)(void);
|
|
} consoleCommand_t;
|
|
|
|
static consoleCommand_t commands[] = {
|
|
{ "testgun", CG_TestGun_f },
|
|
{ "testmodel", CG_TestModel_f },
|
|
{ "nextframe", CG_TestModelNextFrame_f },
|
|
{ "prevframe", CG_TestModelPrevFrame_f },
|
|
{ "nextskin", CG_TestModelNextSkin_f },
|
|
{ "prevskin", CG_TestModelPrevSkin_f },
|
|
{ "viewpos", CG_Viewpos_f },
|
|
{ "+scores", CG_ScoresDown_f },
|
|
{ "-scores", CG_ScoresUp_f },
|
|
{ "sizeup", CG_SizeUp_f },
|
|
{ "sizedown", CG_SizeDown_f },
|
|
{ "weapnext", CG_NextWeapon_f },
|
|
{ "weapprev", CG_PrevWeapon_f },
|
|
{ "weapon", CG_Weapon_f },
|
|
{ "weaponclean", CG_WeaponClean_f },
|
|
{ "tell_target", CG_TellTarget_f },
|
|
{ "tell_attacker", CG_TellAttacker_f },
|
|
{ "tcmd", CG_TargetCommand_f },
|
|
{ "spWin", CG_spWin_f },
|
|
{ "spLose", CG_spLose_f },
|
|
{ "scoresDown", CG_scrollScoresDown_f },
|
|
{ "scoresUp", CG_scrollScoresUp_f },
|
|
{ "startOrbit", CG_StartOrbit_f },
|
|
//{ "camera", CG_Camera_f },
|
|
{ "loaddeferred", CG_LoadDeferredPlayers },
|
|
{ "invnext", CG_NextInventory_f },
|
|
{ "invprev", CG_PrevInventory_f },
|
|
{ "forcenext", CG_NextForcePower_f },
|
|
{ "forceprev", CG_PrevForcePower_f },
|
|
{ "briefing", CG_SiegeBriefing_f },
|
|
{ "siegeCvarUpdate", CG_SiegeCvarUpdate_f },
|
|
{ "siegeCompleteCvarUpdate", CG_SiegeCompleteCvarUpdate_f },
|
|
};
|
|
|
|
|
|
/*
|
|
=================
|
|
CG_ConsoleCommand
|
|
|
|
The string has been tokenized and can be retrieved with
|
|
Cmd_Argc() / Cmd_Argv()
|
|
=================
|
|
*/
|
|
qboolean CG_ConsoleCommand( void ) {
|
|
const char *cmd;
|
|
int i;
|
|
|
|
cmd = CG_Argv(0);
|
|
|
|
for ( i = 0 ; i < sizeof( commands ) / sizeof( commands[0] ) ; i++ ) {
|
|
if ( !Q_stricmp( cmd, commands[i].cmd ) ) {
|
|
commands[i].function();
|
|
return qtrue;
|
|
}
|
|
}
|
|
|
|
return qfalse;
|
|
}
|
|
|
|
|
|
/*
|
|
=================
|
|
CG_InitConsoleCommands
|
|
|
|
Let the client system know about all of our commands
|
|
so it can perform tab completion
|
|
=================
|
|
*/
|
|
void CG_InitConsoleCommands( void ) {
|
|
int i;
|
|
|
|
for ( i = 0 ; i < sizeof( commands ) / sizeof( commands[0] ) ; i++ ) {
|
|
trap_AddCommand( commands[i].cmd );
|
|
}
|
|
|
|
//
|
|
// the game server will interpret these commands, which will be automatically
|
|
// forwarded to the server after they are not recognized locally
|
|
//
|
|
trap_AddCommand ("forcechanged");
|
|
trap_AddCommand ("sv_invnext");
|
|
trap_AddCommand ("sv_invprev");
|
|
trap_AddCommand ("sv_forcenext");
|
|
trap_AddCommand ("sv_forceprev");
|
|
trap_AddCommand ("sv_saberswitch");
|
|
trap_AddCommand ("engage_duel");
|
|
trap_AddCommand ("force_heal");
|
|
trap_AddCommand ("force_speed");
|
|
trap_AddCommand ("force_throw");
|
|
trap_AddCommand ("force_pull");
|
|
trap_AddCommand ("force_distract");
|
|
trap_AddCommand ("force_rage");
|
|
trap_AddCommand ("force_protect");
|
|
trap_AddCommand ("force_absorb");
|
|
trap_AddCommand ("force_healother");
|
|
trap_AddCommand ("force_forcepowerother");
|
|
trap_AddCommand ("force_seeing");
|
|
trap_AddCommand ("use_seeker");
|
|
trap_AddCommand ("use_field");
|
|
trap_AddCommand ("use_bacta");
|
|
trap_AddCommand ("use_electrobinoculars");
|
|
trap_AddCommand ("zoom");
|
|
trap_AddCommand ("use_sentry");
|
|
trap_AddCommand ("bot_order");
|
|
trap_AddCommand ("saberAttackCycle");
|
|
trap_AddCommand ("kill");
|
|
trap_AddCommand ("say");
|
|
trap_AddCommand ("say_team");
|
|
trap_AddCommand ("tell");
|
|
trap_AddCommand ("give");
|
|
trap_AddCommand ("god");
|
|
trap_AddCommand ("notarget");
|
|
trap_AddCommand ("noclip");
|
|
trap_AddCommand ("team");
|
|
trap_AddCommand ("follow");
|
|
trap_AddCommand ("levelshot");
|
|
trap_AddCommand ("addbot");
|
|
trap_AddCommand ("setviewpos");
|
|
trap_AddCommand ("callvote");
|
|
trap_AddCommand ("vote");
|
|
trap_AddCommand ("callteamvote");
|
|
trap_AddCommand ("teamvote");
|
|
trap_AddCommand ("stats");
|
|
trap_AddCommand ("teamtask");
|
|
trap_AddCommand ("loaddefered"); // spelled wrong, but not changing for demo
|
|
}
|