+/*
+=============
+PRVM_GameCommand_f
+
+Console command to send a string to QC function GameCommand of the
+indicated progs
+
+Usage:
+ sv_cmd adminmsg 3 "do not teamkill"
+ cl_cmd someclientcommand
+ menu_cmd somemenucommand
+
+All progs can support this extension; sg calls it in server QC, cg in client
+QC, mg in menu QC.
+=============
+*/
+void PRVM_GameCommand(const char *whichprogs, const char *whichcmd)
+{
+ if(Cmd_Argc() < 1)
+ {
+ Con_Printf("%s text...\n", whichcmd);
+ return;
+ }
+
+ PRVM_Begin;
+ if(!PRVM_SetProgFromString(whichprogs))
+ // note: this is not PRVM_SetProg because that one aborts "hard" using PRVM_Error
+ // also, it makes printing error messages easier!
+ {
+ Con_Printf("%s program not loaded.\n", whichprogs);
+ return;
+ }
+
+ if(!prog->funcoffsets.GameCommand)
+ {
+ Con_Printf("%s program do not support GameCommand!\n", whichprogs);
+ }
+ else
+ {
+ int restorevm_tempstringsbuf_cursize;
+ const char *s;
+
+ s = Cmd_Args();
+
+ restorevm_tempstringsbuf_cursize = vm_tempstringsbuf.cursize;
+ PRVM_G_INT(OFS_PARM0) = PRVM_SetTempString(s ? s : "");
+ PRVM_ExecuteProgram (prog->funcoffsets.GameCommand, "QC function GameCommand is missing");
+ vm_tempstringsbuf.cursize = restorevm_tempstringsbuf_cursize;
+ }
+
+ PRVM_End;
+}
+void PRVM_GameCommand_Server_f(void)
+{
+ PRVM_GameCommand("server", "sv_cmd");
+}
+void PRVM_GameCommand_Client_f(void)
+{
+ PRVM_GameCommand("client", "cl_cmd");
+}
+void PRVM_GameCommand_Menu_f(void)
+{
+ PRVM_GameCommand("menu", "menu_cmd");
+}
+