void idMultiplayerGame::ReceiveAndPlayVoiceData( const idBitMsg &inMsg ) { int clientNum; if( !gameLocal.serverInfo.GetBool( "si_voiceChat" ) ) { return; } clientNum = inMsg.ReadByte(); soundSystem->PlayVoiceData( clientNum, inMsg.GetReadData(), inMsg.GetRemainingData() ); if( g_voiceChatDebug.GetInteger() & 4 ) { common->Printf( "VC: Playing %d bytes\n", inMsg.GetRemainingData() ); } }
/* =============== idCommonLocal::NetReceiveReliable =============== */ void idCommonLocal::NetReceiveReliable( int peer, int type, idBitMsg & msg ) { int clientNum = Game()->MapPeerToClient( peer ); // Only servers care about the client num. Band-aid for problems related to the host's peerIndex being -1 on clients. if ( common->IsServer() && clientNum == -1 ) { idLib::Warning( "NetReceiveReliable: Could not find client for peer %d", peer ); return; } const byte * msgData = msg.GetReadData() + msg.GetReadCount(); int msgSize = msg.GetRemainingData(); reliableMsg_t & reliable = reliableQueue.Alloc(); reliable.client = clientNum; reliable.type = type; reliable.dataSize = msgSize; reliable.data = (byte *)Mem_Alloc( msgSize, TAG_NETWORKING ); memcpy( reliable.data, msgData, msgSize ); }
void idMultiplayerGame::ReceiveAndForwardVoiceData( int clientNum, const idBitMsg &inMsg, int messageType ) { assert( clientNum >= 0 && clientNum < MAX_CLIENTS ); idBitMsg outMsg; int i; byte msgBuf[MAX_VOICE_PACKET_SIZE + 2]; idPlayer * from; from = ( idPlayer * )gameLocal.entities[clientNum]; if( !gameLocal.serverInfo.GetBool( "si_voiceChat" ) || !from ) { return; } // Create a new packet with forwarded data outMsg.Init( msgBuf, sizeof( msgBuf ) ); outMsg.WriteByte( GAME_UNRELIABLE_MESSAGE_VOICEDATA_SERVER ); outMsg.WriteByte( clientNum ); outMsg.WriteData( inMsg.GetReadData(), inMsg.GetRemainingData() ); if( g_voiceChatDebug.GetInteger() & 2 ) { common->Printf( "VC: Received %d bytes, forwarding...\n", inMsg.GetRemainingData() ); } // Forward to appropriate parties for( i = 0; i < gameLocal.numClients; i++ ) { idPlayer* to = ( idPlayer * )gameLocal.entities[i]; if( to && to->GetUserInfo() && to->GetUserInfo()->GetBool( "s_voiceChatReceive" ) ) { if( i != gameLocal.localClientNum && CanTalk( from, to, !!( messageType & 1 ) ) ) { if( messageType & 2 ) { // If "from" is testing - then only send back to him if( from == to ) { gameLocal.SendUnreliableMessage( outMsg, to->entityNumber ); } } else { if( to->AllowedVoiceDest( from->entityNumber ) ) { gameLocal.SendUnreliableMessage( outMsg, to->entityNumber ); if( g_voiceChatDebug.GetInteger() & 2 ) { common->Printf( " ... to client %d\n", to->entityNumber ); } } else { if( g_voiceChatDebug.GetInteger() ) { common->Printf( " ... suppressed packet to client %d\n", to->entityNumber ); } } } } } } #ifdef _USE_VOICECHAT // Listen servers need to manually call the receive function if ( gameLocal.isListenServer ) { // Skip over control byte outMsg.ReadByte(); idPlayer* to = gameLocal.GetLocalPlayer(); if( to->GetUserInfo()->GetBool( "s_voiceChatReceive" ) ) { if( CanTalk( from, to, !!( messageType & 1 ) ) ) { if( messageType & 2 ) { // If "from" is testing - then only send back to him if( from == to ) { ReceiveAndPlayVoiceData( outMsg ); } } else { if( to->AllowedVoiceDest( from->entityNumber ) ) { if( g_voiceChatDebug.GetInteger() & 2 ) { common->Printf( " ... to local client %d\n", gameLocal.localClientNum ); } ReceiveAndPlayVoiceData( outMsg ); } } } } } #endif }