private void PlayHitSound(MyStringHash materialType, IMyEntity entity, Vector3D position) { if ((OwnerEntity == null) || !(OwnerEntity is MyWarhead)) // do not play bullet sound when coming from warheads { var emitter = MyAudioComponent.TryGetSoundEmitter(); if (emitter == null) { return; } ProfilerShort.Begin("Play projectile sound"); emitter.SetPosition(m_position); emitter.SetVelocity(Vector3.Zero); MyAutomaticRifleGun rifleGun = m_weapon as MyAutomaticRifleGun; MySoundPair cueEnum = null; MyStringHash thisType; if (m_projectileAmmoDefinition.IsExplosive) { thisType = MyMaterialType.EXPBULLET; } else if (rifleGun != null && rifleGun.GunBase.IsAmmoProjectile && m_projectileAmmoDefinition.ProjectileType == MyProjectileType.Bullet) { thisType = MyMaterialType.RIFLEBULLET; } else if (m_projectileAmmoDefinition.ProjectileType == MyProjectileType.Bolt) { thisType = MyMaterialType.BOLT; } else { thisType = MyMaterialType.GUNBULLET; } cueEnum = MyMaterialPropertiesHelper.Static.GetCollisionCue(MyMaterialPropertiesHelper.CollisionType.Start, thisType, materialType); if (cueEnum.SoundId.IsNull && entity is MyVoxelBase) // Play rock sounds if we have a voxel material that doesn't have an assigned sound for thisType { materialType = MyMaterialType.ROCK; cueEnum = MyMaterialPropertiesHelper.Static.GetCollisionCue(MyMaterialPropertiesHelper.CollisionType.Start, thisType, materialType); } if (MySession.Static != null && MySession.Static.Settings.RealisticSound) { Func <bool> canHear = () => MySession.ControlledEntity != null && MySession.ControlledEntity.Entity == entity; emitter.StoppedPlaying += (e) => { e.EmitterMethods[MyEntity3DSoundEmitter.MethodsEnum.CanHear].Remove(canHear); }; emitter.EmitterMethods[MyEntity3DSoundEmitter.MethodsEnum.CanHear].Add(canHear); } emitter.PlaySound(cueEnum, false); ProfilerShort.End(); } }
private void PlayHitSound(MyStringHash materialType, IMyEntity entity, Vector3D position, MyStringHash thisType) { if ((OwnerEntity == null) || !(OwnerEntity is MyWarhead)) // do not play bullet sound when coming from warheads { ProfilerShort.Begin("Play projectile sound"); MyAutomaticRifleGun rifleGun = m_weapon as MyAutomaticRifleGun; MySoundPair cueEnum = null; cueEnum = MyMaterialPropertiesHelper.Static.GetCollisionCue(MyMaterialPropertiesHelper.CollisionType.Hit, thisType, materialType); if (cueEnum == null || cueEnum == MySoundPair.Empty) { cueEnum = MyMaterialPropertiesHelper.Static.GetCollisionCue(MyMaterialPropertiesHelper.CollisionType.Start, thisType, materialType); } if (cueEnum.SoundId.IsNull && entity is MyVoxelBase) // Play rock sounds if we have a voxel material that doesn't have an assigned sound for thisType { materialType = MyMaterialType.ROCK; cueEnum = MyMaterialPropertiesHelper.Static.GetCollisionCue(MyMaterialPropertiesHelper.CollisionType.Start, thisType, materialType); } if (cueEnum == null || cueEnum == MySoundPair.Empty) { ProfilerShort.End(); return; } var emitter = MyAudioComponent.TryGetSoundEmitter(); if (emitter == null) { ProfilerShort.End(); return; } emitter.Entity = (MyEntity)entity; emitter.SetPosition(m_position); emitter.SetVelocity(Vector3.Zero); if (MySession.Static != null && MyFakes.ENABLE_NEW_SOUNDS && MySession.Static.Settings.RealisticSound) { Func <bool> canHear = () => MySession.Static.ControlledEntity != null && MySession.Static.ControlledEntity.Entity == entity; emitter.StoppedPlaying += (e) => { e.EmitterMethods[MyEntity3DSoundEmitter.MethodsEnum.CanHear].Remove(canHear); }; emitter.EmitterMethods[MyEntity3DSoundEmitter.MethodsEnum.CanHear].Add(canHear); } emitter.PlaySound(cueEnum, false); ProfilerShort.End(); } }