summaryrefslogtreecommitdiff
path: root/src/cgame
diff options
context:
space:
mode:
authorBen Millwood <thebenmachine@gmail.com>2009-10-07 18:15:07 +0000
committerTim Angus <tim@ngus.net>2013-01-03 00:16:42 +0000
commita4d08a353df06cfc5e638369ed639e4aedf54ad0 (patch)
tree3226bf0033cbf5ab37acb19445b5e20b496443ec /src/cgame
parentd68a029e908b1989a3af7788e04009368da9f85d (diff)
* Parse "team" in cl_voipSendTarget using a new cgame vmcall
Diffstat (limited to 'src/cgame')
-rw-r--r--src/cgame/cg_main.c55
-rw-r--r--src/cgame/cg_public.h6
2 files changed, 60 insertions, 1 deletions
diff --git a/src/cgame/cg_main.c b/src/cgame/cg_main.c
index a440bf7f..68a34159 100644
--- a/src/cgame/cg_main.c
+++ b/src/cgame/cg_main.c
@@ -32,6 +32,7 @@ displayContextDef_t cgDC;
void CG_Init( int serverMessageNum, int serverCommandSequence, int clientNum );
void CG_Shutdown( void );
+static char *CG_VoIPString( void );
/*
================
@@ -84,6 +85,9 @@ Q_EXPORT intptr_t vmMain( int command, int arg0, int arg1, int arg2, int arg3,
CG_EventHandling( arg0 );
return 0;
+ case CG_VOIP_STRING:
+ return (intptr_t)CG_VoIPString( );
+
default:
CG_Error( "vmMain: unknown command %i", command );
break;
@@ -1836,3 +1840,54 @@ void CG_Shutdown( void )
// some mods may need to do cleanup work here,
// like closing files or archiving session data
}
+
+/*
+================
+CG_VoIPString
+================
+*/
+static char *CG_VoIPString( void )
+{
+ // a generous overestimate of the space needed for 0,1,2...61,62,63
+ static char voipString[ MAX_CLIENTS * 4 ];
+ char voipSendTarget[ MAX_CVAR_VALUE_STRING ];
+
+ trap_Cvar_VariableStringBuffer( "cl_voipSendTarget", voipSendTarget,
+ sizeof( voipSendTarget ) );
+
+ if( Q_stricmp( voipSendTarget, "team" ) == 0 )
+ {
+ int i, slen, nlen;
+ for( slen = i = 0; i < cgs.maxclients; i++ )
+ {
+ if( !cgs.clientinfo[ i ].infoValid || i == cg.clientNum )
+ continue;
+ if( cgs.clientinfo[ i ].team != cgs.clientinfo[ cg.clientNum ].team )
+ continue;
+
+ nlen = Q_snprintf( &voipString[ slen ], sizeof( voipString ) - slen,
+ "%s%d", ( slen > 0 ) ? "," : "", i );
+ if( slen + nlen + 1 >= sizeof( voipString ) )
+ {
+ CG_Printf( S_COLOR_YELLOW "WARNING: voipString overflowed\n" );
+ break;
+ }
+
+ slen += nlen;
+ }
+
+ // Notice that if the snprintf was truncated, slen was not updated
+ // so this will remove any trailing commas or partially-completed numbers
+ voipString[ slen ] = '\0';
+ }
+ else if( Q_stricmp( voipSendTarget, "crosshair" ) == 0 )
+ Com_sprintf( voipString, sizeof( voipString ), "%d",
+ CG_CrosshairPlayer( ) );
+ else if( Q_stricmp( voipSendTarget, "attacker" ) == 0 )
+ Com_sprintf( voipString, sizeof( voipString ), "%d",
+ CG_LastAttacker( ) );
+ else
+ return NULL;
+
+ return voipString;
+}
diff --git a/src/cgame/cg_public.h b/src/cgame/cg_public.h
index 3f4b13f3..98ffb00a 100644
--- a/src/cgame/cg_public.h
+++ b/src/cgame/cg_public.h
@@ -248,10 +248,14 @@ typedef enum
CG_EVENT_HANDLING,
// void (*CG_EventHandling)(int type);
- CG_CONSOLE_TEXT
+ CG_CONSOLE_TEXT,
// void (*CG_ConsoleText)( void );
// pass text that has been printed to the console to cgame
// use Cmd_Argc() / Cmd_Argv() to read it
+
+ CG_VOIP_STRING
+ // char *(*CG_VoIPString)( void );
+ // returns a string of comma-delimited clientnums based on cl_voipSendTarget
} cgameExport_t;
//----------------------------------------------