void CLocalNetworkBackdoor::EntityDormant( int iEnt, int iSerialNum ) { CCachedEntState *pCached = &m_CachedEntState[iEnt]; IClientNetworkable *pNet = pCached->m_pNetworkable; Assert( pNet == entitylist->GetClientNetworkable( iEnt ) ); if ( pNet ) { Assert( pCached->m_iSerialNumber == pNet->GetIClientUnknown()->GetRefEHandle().GetSerialNumber() ); if ( pCached->m_iSerialNumber == iSerialNum ) { m_EntsAlive.Set( iEnt ); // Tell the game code that this guy is now dormant. Assert( pCached->m_bDormant == pNet->IsDormant() ); if ( !pCached->m_bDormant ) { pNet->NotifyShouldTransmit( SHOULDTRANSMIT_END ); pCached->m_bDormant = true; } } else { pNet->Release(); pCached->m_pNetworkable = NULL; m_PrevEntsAlive.Clear( iEnt ); } } }
void CEngineTraceClient::HandleEntityToCollideable( IHandleEntity *pHandleEntity, ICollideable **ppCollide, const char **ppDebugName ) { *ppCollide = StaticPropMgr()->GetStaticProp( pHandleEntity ); if ( *ppCollide ) { *ppDebugName = "static prop"; return; } IClientUnknown *pUnk = static_cast<IClientUnknown*>(pHandleEntity); if ( !pUnk ) { *ppCollide = NULL; *ppDebugName = "<null>"; return; } *ppCollide = pUnk->GetClientCollideable(); *ppDebugName = "client entity"; IClientNetworkable *pNetwork = pUnk->GetClientNetworkable(); if (pNetwork) { if (pNetwork->GetClientClass()) { *ppDebugName = pNetwork->GetClientClass()->m_pNetworkName; } } }
//----------------------------------------------------------------------------- // Purpose: Clears all entity lists and releases entities //----------------------------------------------------------------------------- void CClientEntityList::Release( void ) { // Free all the entities. ClientEntityHandle_t iter = FirstHandle(); ClientEntityHandle_t next; while( iter != InvalidHandle() ) { next = NextHandle( iter ); // Try to call release on anything we can. IClientNetworkable *pNet = GetClientNetworkableFromHandle( iter ); if ( pNet ) { pNet->Release(); } else { // Try to call release on anything we can. IClientThinkable *pThinkable = GetClientThinkableFromHandle( iter ); if ( pThinkable ) { pThinkable->Release(); } } RemoveEntity( iter ); iter = next; } m_iNumServerEnts = 0; m_iMaxServerEnts = 0; m_iMaxUsedServerIndex = -1; }
FOR_EACH_LL( g_DataChangedEvents, i ) { CDataChangedEvent *pEvent = &g_DataChangedEvents[i]; // Reset their stored event identifier. *pEvent->m_pStoredEvent = -1; // Send the event. IClientNetworkable *pNetworkable = pEvent->m_pEntity; pNetworkable->OnDataChanged( pEvent->m_UpdateType ); }
bool CClientState::ProcessEntityMessage(SVC_EntityMessage *msg) { // Look up entity IClientNetworkable *entity = entitylist->GetClientNetworkable( msg->m_nEntityIndex ); if ( !entity ) { // message was send to use, even we don't have this entity TODO change that on server side return true; } // route to entity MDLCACHE_CRITICAL_SECTION_( g_pMDLCache ); // buffer for incoming user message byte entityData[ MAX_ENTITY_MSG_DATA ] = { 0 }; bf_read entMsg( "EntityMessage(read)", entityData, sizeof( entityData ) ); msg->m_DataIn.ReadBits( entityData, msg->m_nLength ); entMsg.StartReading( entityData, Bits2Bytes( msg->m_nLength ) ); entity->ReceiveMessage( msg->m_nClassID, entMsg ); return true; }
void CVoiceStatus::DrawHeadLabels() { if ( m_bHeadLabelsDisabled ) return; if( !m_pHeadLabelMaterial ) return; CMatRenderContextPtr pRenderContext( materials ); for(int i=0; i < VOICE_MAX_PLAYERS; i++) { if ( !m_VoicePlayers[i] ) continue; IClientNetworkable *pClient = cl_entitylist->GetClientEntity( i+1 ); // Don't show an icon if the player is not in our PVS. if ( !pClient || pClient->IsDormant() ) continue; C_BasePlayer *pPlayer = dynamic_cast<C_BasePlayer*>(pClient); if( !pPlayer ) continue; // Don't show an icon for dead or spectating players (ie: invisible entities). if( pPlayer->IsPlayerDead() ) continue; // Place it 20 units above his head. Vector vOrigin = pPlayer->WorldSpaceCenter(); vOrigin.z += g_flHeadOffset; // Align it so it never points up or down. Vector vUp( 0, 0, 1 ); Vector vRight = CurrentViewRight(); if ( fabs( vRight.z ) > 0.95 ) // don't draw it edge-on continue; vRight.z = 0; VectorNormalize( vRight ); float flSize = g_flHeadIconSize; pRenderContext->Bind( pPlayer->GetHeadLabelMaterial() ); IMesh *pMesh = pRenderContext->GetDynamicMesh(); CMeshBuilder meshBuilder; meshBuilder.Begin( pMesh, MATERIAL_QUADS, 1 ); meshBuilder.Color3f( 1.0, 1.0, 1.0 ); meshBuilder.TexCoord2f( 0,0,0 ); meshBuilder.Position3fv( (vOrigin + (vRight * -flSize) + (vUp * flSize)).Base() ); meshBuilder.AdvanceVertex(); meshBuilder.Color3f( 1.0, 1.0, 1.0 ); meshBuilder.TexCoord2f( 0,1,0 ); meshBuilder.Position3fv( (vOrigin + (vRight * flSize) + (vUp * flSize)).Base() ); meshBuilder.AdvanceVertex(); meshBuilder.Color3f( 1.0, 1.0, 1.0 ); meshBuilder.TexCoord2f( 0,1,1 ); meshBuilder.Position3fv( (vOrigin + (vRight * flSize) + (vUp * -flSize)).Base() ); meshBuilder.AdvanceVertex(); meshBuilder.Color3f( 1.0, 1.0, 1.0 ); meshBuilder.TexCoord2f( 0,0,1 ); meshBuilder.Position3fv( (vOrigin + (vRight * -flSize) + (vUp * -flSize)).Base() ); meshBuilder.AdvanceVertex(); meshBuilder.End(); pMesh->Draw(); } }
void CLocalNetworkBackdoor::EndEntityStateUpdate() { ClientDLL_FrameStageNotify( FRAME_NET_UPDATE_POSTDATAUPDATE_START ); // Handle entities created. int i; for ( i=0; i < m_nEntsCreated; i++ ) { MDLCACHE_CRITICAL_SECTION_( g_pMDLCache ); int iEdict = m_EntsCreatedIndices[i]; CCachedEntState *pCached = &m_CachedEntState[iEdict]; IClientNetworkable *pNet = pCached->m_pNetworkable; pNet->PostDataUpdate( DATA_UPDATE_CREATED ); pNet->NotifyShouldTransmit( SHOULDTRANSMIT_START ); pCached->m_bDormant = false; } // Handle entities changed. for ( i=0; i < m_nEntsChanged; i++ ) { MDLCACHE_CRITICAL_SECTION_( g_pMDLCache ); int iEdict = m_EntsChangedIndices[i]; m_CachedEntState[iEdict].m_pNetworkable->PostDataUpdate( DATA_UPDATE_DATATABLE_CHANGED ); } ClientDLL_FrameStageNotify( FRAME_NET_UPDATE_POSTDATAUPDATE_END ); // Handle entities removed (= SV_WriteDeletions() in normal mode) int nDWords = m_PrevEntsAlive.GetNumDWords(); // Handle entities removed. for ( i=0; i < nDWords; i++ ) { unsigned long prevEntsAlive = m_PrevEntsAlive.GetDWord( i ); unsigned long entsAlive = m_EntsAlive.GetDWord( i ); unsigned long toDelete = (prevEntsAlive ^ entsAlive) & prevEntsAlive; if ( toDelete ) { for ( int iBit=0; iBit < 32; iBit++ ) { if ( toDelete & (1 << iBit) ) { int iEdict = (i<<5) + iBit; if ( iEdict < MAX_EDICTS ) { if ( m_CachedEntState[iEdict].m_pNetworkable ) { m_CachedEntState[iEdict].m_pNetworkable->Release(); m_CachedEntState[iEdict].m_pNetworkable = NULL; } else { AssertOnce( !"EndEntityStateUpdate: Would have crashed with NULL m_pNetworkable\n" ); } } else { AssertOnce( !"EndEntityStateUpdate: Would have crashed with entity out of range\n" ); } } } } } // Remember the previous state of which entities were around. m_PrevEntsAlive = m_EntsAlive; // end of all entity update activity ClientDLL_FrameStageNotify( FRAME_NET_UPDATE_END ); /* #ifdef _DEBUG for ( i=0; i <= highest_index; i++ ) { if ( !( m_EntsAlive[i>>5] & (1 << (i & 31)) ) ) Assert( !m_CachedEntState[i].m_pNetworkable ); if ( ( m_EntsAlive[i>>5] & (1 << (i & 31)) ) && ( m_EntsCreated[i>>5] & (1 << (i & 31)) ) ) { Assert( FindInList( m_EntsCreatedIndices, m_nEntsCreated, i ) ); } if ( (m_EntsAlive[i>>5] & (1 << (i & 31))) && !(m_EntsCreated[i>>5] & (1 << (i & 31))) && (m_EntsChanged[i>>5] & (1 << (i & 31))) ) { Assert( FindInList( m_EntsChangedIndices, m_nEntsChanged, i ) ); } } #endif */ }