/* ================= CG_ServerCommand The string has been tokenized and can be retrieved with Cmd_Argc() / Cmd_Argv() ================= */ static void CG_ServerCommand( void ) { const char *cmd; char text[MAX_SAY_TEXT]; cmd = CG_Argv(0); if ( !cmd[0] ) { // server claimed the command return; } if ( !strcmp( cmd, "spd" ) ) { const char *ID; int holdInt,count,i; char string[1204]; count = trap_Argc(); ID = CG_Argv(1); holdInt = atoi(ID); memset( &string, 0, sizeof( string ) ); Com_sprintf( string,sizeof(string)," \"%s\"", (const char *) CG_Argv(2)); for (i=3;i<count;i++) { Com_sprintf( string,sizeof(string)," %s \"%s\"", string, (const char *) CG_Argv(i)); } trap_SP_Print(holdInt, (byte *)string); return; } if ( !strcmp( cmd, "nfr" ) ) { //"nfr" == "new force rank" (want a short string) int doMenu = 0; int setTeam = 0; int newRank = 0; if (trap_Argc() < 3) { #ifdef _DEBUG Com_Printf("WARNING: Invalid newForceRank string\n"); #endif return; } newRank = atoi(CG_Argv(1)); doMenu = atoi(CG_Argv(2)); setTeam = atoi(CG_Argv(3)); trap_Cvar_Set("ui_rankChange", va("%i", newRank)); trap_Cvar_Set("ui_myteam", va("%i", setTeam)); if (!( trap_Key_GetCatcher() & KEYCATCH_UI ) && doMenu) { trap_OpenUIMenu(3); } return; } if ( !strcmp( cmd, "kg2" ) ) { //Kill a ghoul2 instance in this slot. //If it has been occupied since this message was sent somehow, the worst that can (should) happen //is the instance will have to reinit with its current info. int indexNum = 0; int argNum = trap_Argc(); int i = 1; if (argNum < 1) { return; } while (i < argNum) { indexNum = atoi(CG_Argv(i)); if (cg_entities[indexNum].ghoul2 && trap_G2_HaveWeGhoul2Models(cg_entities[indexNum].ghoul2)) { if (indexNum < MAX_CLIENTS) { //You try to do very bad thing! #ifdef _DEBUG Com_Printf("WARNING: Tried to kill a client ghoul2 instance with a kg2 command!\n"); #endif return; } trap_G2API_CleanGhoul2Models(&(cg_entities[indexNum].ghoul2)); } i++; } return; } if ( !strcmp( cmd, "cp" ) ) { char strEd[MAX_STRIPED_SV_STRING]; CG_CheckSVStripEdRef(strEd, CG_Argv(1)); CG_CenterPrint( strEd, SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); return; } if ( !strcmp( cmd, "cs" ) ) { CG_ConfigStringModified(); return; } if ( !strcmp( cmd, "print" ) ) { char strEd[MAX_STRIPED_SV_STRING]; CG_CheckSVStripEdRef(strEd, CG_Argv(1)); CG_Printf( "%s", strEd ); return; } if ( !strcmp( cmd, "chat" ) ) { if ( !cg_teamChatsOnly.integer ) { trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); Q_strncpyz( text, CG_Argv(1), MAX_SAY_TEXT ); CG_RemoveChatEscapeChar( text ); CG_Printf( "%s\n", text ); } return; } if ( !strcmp( cmd, "tchat" ) ) { trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); Q_strncpyz( text, CG_Argv(1), MAX_SAY_TEXT ); CG_RemoveChatEscapeChar( text ); CG_AddToTeamChat( text ); CG_Printf( "%s\n", text ); return; } if ( !strcmp( cmd, "vchat" ) ) { CG_VoiceChat( SAY_ALL ); return; } if ( !strcmp( cmd, "vtchat" ) ) { CG_VoiceChat( SAY_TEAM ); return; } if ( !strcmp( cmd, "vtell" ) ) { CG_VoiceChat( SAY_TELL ); return; } if ( !strcmp( cmd, "scores" ) ) { CG_ParseScores(); return; } if ( !strcmp( cmd, "tinfo" ) ) { CG_ParseTeamInfo(); return; } if ( !strcmp( cmd, "map_restart" ) ) { CG_MapRestart(); return; } if ( Q_stricmp (cmd, "remapShader") == 0 ) { if (trap_Argc() == 4) { trap_R_RemapShader(CG_Argv(1), CG_Argv(2), CG_Argv(3)); } } // loaddeferred can be both a servercmd and a consolecmd if ( !strcmp( cmd, "loaddefered" ) ) { // FIXME: spelled wrong, but not changing for demo CG_LoadDeferredPlayers(); return; } // clientLevelShot is sent before taking a special screenshot for // the menu system during development if ( !strcmp( cmd, "clientLevelShot" ) ) { cg.levelShot = qtrue; return; } CG_Printf( "Unknown client game command: %s\n", cmd ); }
static void CG_ServerCommand( void ) { const char *cmd; char text[MAX_SAY_TEXT]; qboolean IRCG = qfalse; cmd = CG_Argv(0); if ( !cmd[0] ) { // server claimed the command return; } #if 0 // never seems to get used -Ste if ( !strcmp( cmd, "spd" ) ) { const char *ID; int holdInt,count,i; char string[1204]; count = trap_Argc(); ID = CG_Argv(1); holdInt = atoi(ID); memset( &string, 0, sizeof( string ) ); Com_sprintf( string,sizeof(string)," \"%s\"", (const char *) CG_Argv(2)); for (i=3;i<count;i++) { Com_sprintf( string,sizeof(string)," %s \"%s\"", string, (const char *) CG_Argv(i)); } trap_SP_Print(holdInt, (byte *)string); return; } #endif if (!strcmp(cmd, "sxd")) { //siege extended data, contains extra info certain classes may want to know about other clients CG_ParseSiegeExtendedData(); return; } if (!strcmp(cmd, "sb")) { //siege briefing display CG_SiegeBriefingDisplay(atoi(CG_Argv(1)), 0); return; } if ( !strcmp( cmd, "scl" ) ) { //if (!( trap_Key_GetCatcher() & KEYCATCH_UI )) //Well, I want it to come up even if the briefing display is up. { trap_OpenUIMenu(UIMENU_CLASSSEL); //UIMENU_CLASSSEL } return; } if ( !strcmp( cmd, "spc" ) ) { trap_Cvar_Set("ui_myteam", "3"); trap_OpenUIMenu(UIMENU_PLAYERCONFIG); //UIMENU_CLASSSEL return; } if ( !strcmp( cmd, "nfr" ) ) { //"nfr" == "new force rank" (want a short string) int doMenu = 0; int setTeam = 0; int newRank = 0; if (trap_Argc() < 3) { #ifdef _DEBUG Com_Printf("WARNING: Invalid newForceRank string\n"); #endif return; } newRank = atoi(CG_Argv(1)); doMenu = atoi(CG_Argv(2)); setTeam = atoi(CG_Argv(3)); trap_Cvar_Set("ui_rankChange", va("%i", newRank)); trap_Cvar_Set("ui_myteam", va("%i", setTeam)); if (!( trap_Key_GetCatcher() & KEYCATCH_UI ) && doMenu) { trap_OpenUIMenu(UIMENU_PLAYERCONFIG); } return; } if ( !strcmp( cmd, "kg2" ) ) { //Kill a ghoul2 instance in this slot. //If it has been occupied since this message was sent somehow, the worst that can (should) happen //is the instance will have to reinit with its current info. int indexNum = 0; int argNum = trap_Argc(); int i = 1; if (argNum < 1) { return; } while (i < argNum) { indexNum = atoi(CG_Argv(i)); if (cg_entities[indexNum].ghoul2 && trap_G2_HaveWeGhoul2Models(cg_entities[indexNum].ghoul2)) { if (indexNum < MAX_CLIENTS) { //You try to do very bad thing! #ifdef _DEBUG Com_Printf("WARNING: Tried to kill a client ghoul2 instance with a kg2 command!\n"); #endif return; } CG_KillCEntityG2(indexNum); } i++; } return; } if (!strcmp(cmd, "kls")) { //kill looping sounds int indexNum = 0; int argNum = trap_Argc(); centity_t *clent = NULL; centity_t *trackerent = NULL; if (argNum < 1) { assert(0); return; } indexNum = atoi(CG_Argv(1)); if (indexNum != -1) { clent = &cg_entities[indexNum]; } if (argNum >= 2) { indexNum = atoi(CG_Argv(2)); if (indexNum != -1) { trackerent = &cg_entities[indexNum]; } } if (clent) { CG_S_StopLoopingSound(clent->currentState.number, -1); } if (trackerent) { CG_S_StopLoopingSound(trackerent->currentState.number, -1); } return; } if (!strcmp(cmd, "ircg")) { //this means param 2 is the body index and we want to copy to bodyqueue on it IRCG = qtrue; } if (!strcmp(cmd, "rcg") || IRCG) { //rcg - Restore Client Ghoul (make sure limbs are reattached and ragdoll state is reset - this must be done reliably) int indexNum = 0; int argNum = trap_Argc(); centity_t *clent; if (argNum < 1) { assert(0); return; } indexNum = atoi(CG_Argv(1)); if (indexNum < 0 || indexNum >= MAX_CLIENTS) { assert(0); return; } clent = &cg_entities[indexNum]; //assert(clent->ghoul2); if (!clent->ghoul2) { //this can happen while connecting as a client return; } #ifdef _DEBUG if (!trap_G2_HaveWeGhoul2Models(clent->ghoul2)) { assert(!"Tried to reset state on a bad instance. Crash is inevitable."); } #endif if (IRCG) { int bodyIndex = 0; int weaponIndex = 0; int side = 0; centity_t *body; assert(argNum >= 3); bodyIndex = atoi(CG_Argv(2)); weaponIndex = atoi(CG_Argv(3)); side = atoi(CG_Argv(4)); body = &cg_entities[bodyIndex]; if (side) { body->teamPowerType = qtrue; //light side } else { body->teamPowerType = qfalse; //dark side } CG_BodyQueueCopy(body, clent->currentState.number, weaponIndex); } //reattach any missing limbs if (clent->torsoBolt) { CG_ReattachLimb(clent); } //make sure ragdoll state is reset if (clent->isRagging) { clent->isRagging = qfalse; trap_G2API_SetRagDoll(clent->ghoul2, NULL); //calling with null parms resets to no ragdoll. } //clear all the decals as well trap_G2API_ClearSkinGore(clent->ghoul2); clent->weapon = 0; clent->ghoul2weapon = NULL; //force a weapon reinit return; } if ( !strcmp( cmd, "cp" ) ) { char strEd[MAX_STRINGED_SV_STRING]; CG_CheckSVStringEdRef(strEd, CG_Argv(1)); CG_CenterPrint( strEd, SCREEN_HEIGHT * 0.30, BIGCHAR_WIDTH ); return; } if ( !strcmp( cmd, "cps" ) ) { char strEd[MAX_STRINGED_SV_STRING]; char *x = (char *)CG_Argv(1); if (x[0] == '@') { x++; } trap_SP_GetStringTextString(x, strEd, MAX_STRINGED_SV_STRING); CG_CenterPrint( strEd, SCREEN_HEIGHT * 0.20, BIGCHAR_WIDTH ); return; } if ( !strcmp( cmd, "cs" ) ) { CG_ConfigStringModified(); return; } if ( !strcmp( cmd, "print" ) ) { char strEd[MAX_STRINGED_SV_STRING]; CG_CheckSVStringEdRef(strEd, CG_Argv(1)); CG_Printf( "%s", strEd ); return; } if ( !strcmp( cmd, "chat" ) ) { if ( !cg_teamChatsOnly.integer ) { trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); Q_strncpyz( text, CG_Argv(1), MAX_SAY_TEXT ); CG_RemoveChatEscapeChar( text ); CG_ChatBox_AddString(text); CG_Printf( "*%s\n", text ); } return; } if ( !strcmp( cmd, "tchat" ) ) { trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); Q_strncpyz( text, CG_Argv(1), MAX_SAY_TEXT ); CG_RemoveChatEscapeChar( text ); CG_ChatBox_AddString(text); CG_Printf( "*%s\n", text ); return; } //chat with location, possibly localized. if ( !strcmp( cmd, "lchat" ) ) { if ( !cg_teamChatsOnly.integer ) { char name[MAX_STRING_CHARS]; char loc[MAX_STRING_CHARS]; char color[8]; char message[MAX_STRING_CHARS]; if (trap_Argc() < 4) { return; } strcpy(name, CG_Argv(1)); strcpy(loc, CG_Argv(2)); strcpy(color, CG_Argv(3)); strcpy(message, CG_Argv(4)); if (loc[0] == '@') { //get localized text trap_SP_GetStringTextString(loc+1, loc, MAX_STRING_CHARS); } trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); //Q_strncpyz( text, CG_Argv(1), MAX_SAY_TEXT ); Com_sprintf(text, MAX_SAY_TEXT, "%s<%s>^%s%s", name, loc, color, message); CG_RemoveChatEscapeChar( text ); CG_ChatBox_AddString(text); CG_Printf( "*%s\n", text ); } return; } if ( !strcmp( cmd, "ltchat" ) ) { char name[MAX_STRING_CHARS]; char loc[MAX_STRING_CHARS]; char color[8]; char message[MAX_STRING_CHARS]; if (trap_Argc() < 4) { return; } strcpy(name, CG_Argv(1)); strcpy(loc, CG_Argv(2)); strcpy(color, CG_Argv(3)); strcpy(message, CG_Argv(4)); if (loc[0] == '@') { //get localized text trap_SP_GetStringTextString(loc+1, loc, MAX_STRING_CHARS); } trap_S_StartLocalSound( cgs.media.talkSound, CHAN_LOCAL_SOUND ); //Q_strncpyz( text, CG_Argv(1), MAX_SAY_TEXT ); Com_sprintf(text, MAX_SAY_TEXT, "%s<%s> ^%s%s", name, loc, color, message); CG_RemoveChatEscapeChar( text ); CG_ChatBox_AddString(text); CG_Printf( "*%s\n", text ); return; } if ( !strcmp( cmd, "scores" ) ) { CG_ParseScores(); return; } if ( !strcmp( cmd, "tinfo" ) ) { CG_ParseTeamInfo(); return; } if ( !strcmp( cmd, "map_restart" ) ) { CG_MapRestart(); return; } if ( Q_stricmp (cmd, "remapShader") == 0 ) { if (trap_Argc() == 4) { trap_R_RemapShader(CG_Argv(1), CG_Argv(2), CG_Argv(3)); } } // loaddeferred can be both a servercmd and a consolecmd if ( !strcmp( cmd, "loaddefered" ) ) { // FIXME: spelled wrong, but not changing for demo CG_LoadDeferredPlayers(); return; } // clientLevelShot is sent before taking a special screenshot for // the menu system during development if ( !strcmp( cmd, "clientLevelShot" ) ) { cg.levelShot = qtrue; return; } CG_Printf( "Unknown client game command: %s\n", cmd ); }