IterationRetval_t CRagdollEnumerator::EnumElement( IHandleEntity *pHandleEntity ) { C_BaseEntity *pEnt = ClientEntityList().GetBaseEntityFromHandle( pHandleEntity->GetRefEHandle() ); if ( pEnt == NULL ) return ITERATION_CONTINUE; C_BaseAnimating *pModel = static_cast< C_BaseAnimating * >( pEnt ); // If the ragdoll was created on this tick, then the forces were already applied on the server if ( pModel == NULL || WasRagdollCreatedOnCurrentTick( pEnt ) ) return ITERATION_CONTINUE; IPhysicsObject *pPhysicsObject = pModel->VPhysicsGetObject(); if ( pPhysicsObject == NULL ) return ITERATION_CONTINUE; trace_t tr; enginetrace->ClipRayToEntity( m_rayShot, MASK_SHOT, pModel, &tr ); if ( tr.fraction < 1.0 ) { pModel->ImpactTrace( &tr, m_iDamageType, NULL ); m_bHit = true; //FIXME: Yes? No? return ITERATION_STOP; } return ITERATION_CONTINUE; }
// Actual work code IterationRetval_t CRagdollExplosionEnumerator::EnumElement( IHandleEntity *pHandleEntity ) { C_BaseEntity *pEnt = ClientEntityList().GetBaseEntityFromHandle( pHandleEntity->GetRefEHandle() ); if ( pEnt == NULL ) return ITERATION_CONTINUE; C_BaseAnimating *pModel = static_cast< C_BaseAnimating * >( pEnt ); // If the ragdoll was created on this tick, then the forces were already applied on the server if ( pModel == NULL || WasRagdollCreatedOnCurrentTick( pEnt ) ) return ITERATION_CONTINUE; m_Entities.AddToTail( pEnt ); return ITERATION_CONTINUE; }