diff options
Diffstat (limited to 'src/client/cl_input.c')
-rw-r--r-- | src/client/cl_input.c | 54 |
1 files changed, 40 insertions, 14 deletions
diff --git a/src/client/cl_input.c b/src/client/cl_input.c index f9ec9d04..736378ba 100644 --- a/src/client/cl_input.c +++ b/src/client/cl_input.c @@ -801,8 +801,46 @@ void CL_WritePacket( void ) { #ifdef USE_VOIP if (clc.voipOutgoingDataSize > 0) { // only send if data. - MSG_WriteByte (&buf, clc_EOF); // placate legacy servers. - MSG_WriteByte (&buf, clc_extension); + // Move cl_voipSendTarget from a string to the bitmasks if needed. + if (cl_voipSendTarget->modified) { + char buffer[32]; + const char *target = cl_voipSendTarget->string; + + if (Q_stricmp(target, "attacker") == 0) { + int player = VM_Call( cgvm, CG_LAST_ATTACKER ); + Com_sprintf(buffer, sizeof (buffer), "%d", player); + target = buffer; + } else if (Q_stricmp(target, "crosshair") == 0) { + int player = VM_Call( cgvm, CG_CROSSHAIR_PLAYER ); + Com_sprintf(buffer, sizeof (buffer), "%d", player); + target = buffer; + } + + if ((*target == '\0') || (Q_stricmp(target, "all") == 0)) { + const int all = 0x7FFFFFFF; + clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = all; + } else if (Q_stricmp(target, "none") == 0) { + clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = 0; + } else { + const char *ptr = target; + clc.voipTarget1 = clc.voipTarget2 = clc.voipTarget3 = 0; + do { + if ((*ptr == ',') || (*ptr == '\0')) { + const int val = atoi(target); + target = ptr + 1; + if ((val >= 0) && (val < 31)) { + clc.voipTarget1 |= (1 << (val-0)); + } else if ((val >= 31) && (val < 62)) { + clc.voipTarget2 |= (1 << (val-31)); + } else if ((val >= 62) && (val < 93)) { + clc.voipTarget3 |= (1 << (val-62)); + } + } + } while (*(ptr++)); + } + cl_voipSendTarget->modified = qfalse; + } + MSG_WriteByte (&buf, clc_voip); MSG_WriteByte (&buf, clc.voipOutgoingGeneration); MSG_WriteLong (&buf, clc.voipOutgoingSequence); @@ -824,8 +862,6 @@ void CL_WritePacket( void ) { MSG_Init (&fakemsg, fakedata, sizeof (fakedata)); MSG_Bitstream (&fakemsg); MSG_WriteLong (&fakemsg, clc.reliableAcknowledge); - MSG_WriteByte (&fakemsg, svc_EOF); - MSG_WriteByte (&fakemsg, svc_extension); MSG_WriteByte (&fakemsg, svc_voip); MSG_WriteShort (&fakemsg, clc.clientNum); MSG_WriteByte (&fakemsg, clc.voipOutgoingGeneration); @@ -889,16 +925,6 @@ void CL_WritePacket( void ) { } CL_Netchan_Transmit (&clc.netchan, &buf); - - // clients never really should have messages large enough - // to fragment, but in case they do, fire them all off - // at once - // TTimo: this causes a packet burst, which is bad karma for winsock - // added a WARNING message, we'll see if there are legit situations where this happens - while ( clc.netchan.unsentFragments ) { - Com_DPrintf( "WARNING: #462 unsent fragments (not supposed to happen!)\n" ); - CL_Netchan_TransmitNextFragment( &clc.netchan ); - } } /* |