void CCollisionEvent::Friction( IPhysicsObject *pObject, float energy, int surfaceProps, int surfacePropsHit, IPhysicsCollisionData *pData ) { CallbackContext callback(this); if ( energy < 0.05f || surfaceProps < 0 ) return; //Get our friction information Vector vecPos, vecVel; pData->GetContactPoint( vecPos ); pObject->GetVelocityAtPoint( vecPos, &vecVel ); CBaseEntity *pEntity = reinterpret_cast<CBaseEntity *>(pObject->GetGameData()); if ( pEntity ) { friction_t *pFriction = g_Collisions.FindFriction( pEntity ); if ( (gpGlobals->maxClients > 1) && pFriction && pFriction->pObject) { // in MP mode play sound and effects once every 500 msecs, // no ongoing updates, takes too much bandwidth if ( (pFriction->flLastEffectTime + 0.5f) > gpGlobals->curtime) { pFriction->flLastUpdateTime = gpGlobals->curtime; return; } } PhysFrictionSound( pEntity, pObject, energy, surfaceProps, surfacePropsHit ); } PhysFrictionEffect( vecPos, vecVel, energy, surfaceProps, surfacePropsHit ); }
void PhysCleanupFrictionSounds( CBaseEntity *pEntity ) { friction_t *pFriction = g_Collisions.FindFriction( pEntity ); if ( pFriction && pFriction->patch ) { g_Collisions.ShutdownFriction( *pFriction ); } }
void PhysFrictionSound( CBaseEntity *pEntity, IPhysicsObject *pObject, const char *pSoundName, HSOUNDSCRIPTHANDLE& handle, float flVolume ) { if ( !pEntity ) return; // cut out the quiet sounds // UNDONE: Separate threshold for starting a sound vs. continuing? flVolume = clamp( flVolume, 0.0f, 1.0f ); if ( flVolume > (1.0f/128.0f) ) { friction_t *pFriction = g_Collisions.FindFriction( pEntity ); if ( !pFriction ) return; CSoundParameters params; if ( !CBaseEntity::GetParametersForSound( pSoundName, handle, params, NULL ) ) return; if ( !pFriction->pObject ) { // don't create really quiet scrapes if ( params.volume * flVolume <= 0.1f ) return; pFriction->pObject = pEntity; CPASAttenuationFilter filter( pEntity, params.soundlevel ); int entindex = pEntity->entindex(); // clientside created entites doesn't have a valid entindex, let 'world' play the sound for them if ( entindex < 0 ) entindex = 0; pFriction->patch = CSoundEnvelopeController::GetController().SoundCreate( filter, entindex, CHAN_BODY, pSoundName, params.soundlevel ); CSoundEnvelopeController::GetController().Play( pFriction->patch, params.volume * flVolume, params.pitch ); } else { float pitch = (flVolume * (params.pitchhigh - params.pitchlow)) + params.pitchlow; CSoundEnvelopeController::GetController().SoundChangeVolume( pFriction->patch, params.volume * flVolume, 0.1f ); CSoundEnvelopeController::GetController().SoundChangePitch( pFriction->patch, pitch, 0.1f ); } pFriction->flLastUpdateTime = gpGlobals->curtime; pFriction->flLastEffectTime = gpGlobals->curtime; } }