void CVoiceGameMgr::UpdateMasks() { m_UpdateInterval = 0; bool bAllTalk = !!(sv_alltalk.value); for(int iClient=0; iClient < m_nMaxPlayers; iClient++) { CBaseEntity *pEnt = UTIL_PlayerByIndex(iClient+1); if(!pEnt || !pEnt->IsPlayer()) continue; // Request the state of their "VModEnable" cvar. if(g_bWantModEnable[iClient]) { MESSAGE_BEGIN(MSG_ONE, m_msgRequestState, NULL, pEnt->pev); MESSAGE_END(); } CBasePlayer *pPlayer = (CBasePlayer*)pEnt; CPlayerBitVec gameRulesMask; if( g_PlayerModEnable[iClient] ) { // Build a mask of who they can hear based on the game rules. for(int iOtherClient=0; iOtherClient < m_nMaxPlayers; iOtherClient++) { CBaseEntity *pEnt = UTIL_PlayerByIndex(iOtherClient+1); if(pEnt && (bAllTalk || m_pHelper->CanPlayerHearPlayer(pPlayer, (CBasePlayer*)pEnt)) ) { gameRulesMask[iOtherClient] = true; } } } // If this is different from what the client has, send an update. if(gameRulesMask != g_SentGameRulesMasks[iClient] || g_BanMasks[iClient] != g_SentBanMasks[iClient]) { g_SentGameRulesMasks[iClient] = gameRulesMask; g_SentBanMasks[iClient] = g_BanMasks[iClient]; MESSAGE_BEGIN(MSG_ONE, m_msgPlayerVoiceMask, NULL, pPlayer->pev); int dw; for(dw=0; dw < VOICE_MAX_PLAYERS_DW; dw++) { WRITE_LONG(gameRulesMask.GetDWord(dw)); WRITE_LONG(g_BanMasks[iClient].GetDWord(dw)); } MESSAGE_END(); } // Tell the engine. for(int iOtherClient=0; iOtherClient < m_nMaxPlayers; iOtherClient++) { bool bCanHear = gameRulesMask[iOtherClient] && !g_BanMasks[iClient][iOtherClient]; g_engfuncs.pfnVoice_SetClientListening(iClient+1, iOtherClient+1, bCanHear); } } }
void CBaseNetworkedRagdoll::Spawn() { BaseClass::Spawn(); // Don't broadcast to players who see the death; the player ent handles things for them CPlayerBitVec PvsPlayers; engine->Message_DetermineMulticastRecipients( false, GetAbsOrigin(), PvsPlayers ); for ( int i=0; i < PvsPlayers.GetNumBits(); i++ ) if (PvsPlayers.IsBitSet(i)) SuppressedClients.AddToTail( dynamic_cast<CBasePlayer*>(INDEXENT(i+1)->GetUnknown()) ); // +1 for player index to ent index }
void CRecipientFilter::RemovePlayersFromBitMask( CPlayerBitVec& playerbits ) { int index = playerbits.FindNextSetBit( 0 ); while ( index > -1 ) { CBasePlayer *pPlayer = UTIL_PlayerByIndex( index + 1 ); if ( pPlayer ) { RemoveRecipient( pPlayer ); } index = playerbits.FindNextSetBit( index + 1 ); } }
void CVoiceGameMgr::UpdateMasks() { m_UpdateInterval = 0; bool bAllTalk = !!sv_alltalk.GetInt(); for(int iClient=0; iClient < m_nMaxPlayers; iClient++) { CBaseEntity *pEnt = UTIL_PlayerByIndex(iClient+1); if(!pEnt || !pEnt->IsPlayer()) continue; CBasePlayer *pPlayer = (CBasePlayer*)pEnt; CSingleUserRecipientFilter user( pPlayer ); // Request the state of their "VModEnable" cvar. if(g_bWantModEnable[iClient]) { UserMessageBegin( user, "RequestState" ); MessageEnd(); // Since this is reliable, only send it once g_bWantModEnable[iClient] = false; } CPlayerBitVec gameRulesMask; CPlayerBitVec ProximityMask; bool bProximity = false; if( g_PlayerModEnable[iClient] ) { // Build a mask of who they can hear based on the game rules. for(int iOtherClient=0; iOtherClient < m_nMaxPlayers; iOtherClient++) { CBaseEntity *pEnt = UTIL_PlayerByIndex(iOtherClient+1); if(pEnt && pEnt->IsPlayer() && (bAllTalk || m_pHelper->CanPlayerHearPlayer(pPlayer, (CBasePlayer*)pEnt, bProximity )) ) { gameRulesMask[iOtherClient] = true; ProximityMask[iOtherClient] = bProximity; } } } // If this is different from what the client has, send an update. if(gameRulesMask != g_SentGameRulesMasks[iClient] || g_BanMasks[iClient] != g_SentBanMasks[iClient]) { g_SentGameRulesMasks[iClient] = gameRulesMask; g_SentBanMasks[iClient] = g_BanMasks[iClient]; UserMessageBegin( user, "VoiceMask" ); int dw; for(dw=0; dw < VOICE_MAX_PLAYERS_DW; dw++) { WRITE_LONG(gameRulesMask.GetDWord(dw)); WRITE_LONG(g_BanMasks[iClient].GetDWord(dw)); } WRITE_BYTE( !!g_PlayerModEnable[iClient] ); MessageEnd(); } // Tell the engine. for(int iOtherClient=0; iOtherClient < m_nMaxPlayers; iOtherClient++) { bool bCanHear = gameRulesMask[iOtherClient] && !g_BanMasks[iClient][iOtherClient]; g_pVoiceServer->SetClientListening( iClient+1, iOtherClient+1, bCanHear ); if ( bCanHear ) { g_pVoiceServer->SetClientProximity( iClient+1, iOtherClient+1, !!ProximityMask[iOtherClient] ); } } } }
void CVoiceGameMgr::UpdateMasks() { m_UpdateInterval = 0; bool bAllTalk = !!(sv_alltalk.value); for (int iClient = 0; iClient < m_nMaxPlayers; ++iClient) { CBaseEntity *pEnt = UTIL_PlayerByIndex(iClient + 1); if (!pEnt #ifndef REGAMEDLL_FIXES || !pEnt->IsPlayer() #endif ) continue; CBasePlayer *pPlayer = static_cast<CBasePlayer *>(pEnt); CPlayerBitVec gameRulesMask; // Request the state of their "VModEnable" cvar. if (g_bWantModEnable[ iClient ]) { MESSAGE_BEGIN(MSG_ONE, m_msgRequestState, NULL, pEnt->pev); MESSAGE_END(); } if (g_PlayerModEnable[ iClient ]) { // Build a mask of who they can hear based on the game rules. for (int iOtherClient = 0; iOtherClient < m_nMaxPlayers; ++iOtherClient) { CBaseEntity *pEnt = UTIL_PlayerByIndex(iOtherClient + 1); if (pEnt && (bAllTalk || m_pHelper->CanPlayerHearPlayer(pPlayer, (CBasePlayer *)pEnt))) { gameRulesMask[ iOtherClient ] = true; } } } // If this is different from what the client has, send an update. if (gameRulesMask != g_SentGameRulesMasks[ iClient ] || g_BanMasks[ iClient ] != g_SentBanMasks[ iClient ]) { g_SentGameRulesMasks[ iClient ] = gameRulesMask; g_SentBanMasks[ iClient ] = g_BanMasks[ iClient ]; MESSAGE_BEGIN(MSG_ONE, m_msgPlayerVoiceMask, NULL, pPlayer->pev); for (int dw = 0; dw < VOICE_MAX_PLAYERS_DW; ++dw) { WRITE_LONG(gameRulesMask.GetDWord(dw)); WRITE_LONG(g_BanMasks[ iClient ].GetDWord(dw)); } // ServerModEnable +1 to buffer size // WRITE_BYTE(1); MESSAGE_END(); } // Tell the engine. for (int iOtherClient = 0; iOtherClient < m_nMaxPlayers; ++iOtherClient) { bool bCanHear = gameRulesMask[ iOtherClient ] && !g_BanMasks[ iClient ][ iOtherClient ]; SET_CLIENT_LISTENING(iClient + 1, iOtherClient + 1, bCanHear); } } }