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