From 4e2b94199ed9791ad9a8ddc504c147d8b6e0c510 Mon Sep 17 00:00:00 2001 From: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> Date: Sat, 21 May 2022 18:04:47 +1000 Subject: [PATCH] Bullet flyby sounds (#8317) --- .../Weapons/Ranged/FlyBySoundSystem.cs | 37 +++++++++ ...ileSystem.cs => SharedProjectileSystem.cs} | 7 +- .../Components/StunOnCollideComponent.cs | 5 ++ .../Stunnable/StunOnCollideSystem.cs | 2 + .../Weapon/Ranged/FlyBySoundSystem.cs | 5 ++ ...ileSystem.cs => SharedProjectileSystem.cs} | 4 +- .../Weapons/Ranged/FlyBySoundComponent.cs | 26 ++++++ .../Weapons/Ranged/SharedFlyBySoundSystem.cs | 75 ++++++++++++++++++ .../Audio/Weapons/Guns/Miss/bullet_miss1.ogg | Bin 0 -> 5683 bytes .../Audio/Weapons/Guns/Miss/bullet_miss2.ogg | Bin 0 -> 6735 bytes .../Audio/Weapons/Guns/Miss/bullet_miss3.ogg | Bin 0 -> 6523 bytes .../Audio/Weapons/Guns/Miss/bullet_miss4.ogg | Bin 0 -> 6625 bytes .../Audio/Weapons/Guns/Miss/energy_miss1.ogg | Bin 0 -> 8878 bytes .../Audio/Weapons/Guns/Miss/licenses.txt | 2 + .../Weapons/Guns/Projectiles/projectiles.yml | 10 +++ .../SoundCollections/gun_sounds.yml | 12 +++ 16 files changed, 181 insertions(+), 4 deletions(-) create mode 100644 Content.Client/Weapons/Ranged/FlyBySoundSystem.cs rename Content.Server/Projectiles/{ProjectileSystem.cs => SharedProjectileSystem.cs} (92%) create mode 100644 Content.Server/Weapon/Ranged/FlyBySoundSystem.cs rename Content.Shared/Projectiles/{ProjectileSystem.cs => SharedProjectileSystem.cs} (82%) create mode 100644 Content.Shared/Weapons/Ranged/FlyBySoundComponent.cs create mode 100644 Content.Shared/Weapons/Ranged/SharedFlyBySoundSystem.cs create mode 100644 Resources/Audio/Weapons/Guns/Miss/bullet_miss1.ogg create mode 100644 Resources/Audio/Weapons/Guns/Miss/bullet_miss2.ogg create mode 100644 Resources/Audio/Weapons/Guns/Miss/bullet_miss3.ogg create mode 100644 Resources/Audio/Weapons/Guns/Miss/bullet_miss4.ogg create mode 100644 Resources/Audio/Weapons/Guns/Miss/energy_miss1.ogg create mode 100644 Resources/Audio/Weapons/Guns/Miss/licenses.txt create mode 100644 Resources/Prototypes/SoundCollections/gun_sounds.yml diff --git a/Content.Client/Weapons/Ranged/FlyBySoundSystem.cs b/Content.Client/Weapons/Ranged/FlyBySoundSystem.cs new file mode 100644 index 0000000000..0a0beb08a8 --- /dev/null +++ b/Content.Client/Weapons/Ranged/FlyBySoundSystem.cs @@ -0,0 +1,37 @@ +using Content.Client.Projectiles; +using Content.Shared.Weapons.Ranged; +using Robust.Client.Player; +using Robust.Shared.Audio; +using Robust.Shared.Physics.Dynamics; +using Robust.Shared.Player; +using Robust.Shared.Random; + +namespace Content.Client.Weapons.Ranged; + +public sealed class FlyBySoundSystem : SharedFlyBySoundSystem +{ + [Dependency] private readonly IPlayerManager _player = default!; + [Dependency] private readonly IRobustRandom _random = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnCollide); + } + + private void OnCollide(EntityUid uid, FlyBySoundComponent component, StartCollideEvent args) + { + var attachedEnt = _player.LocalPlayer?.ControlledEntity; + + // If it's not our ent or we shot it. + if (attachedEnt == null || + args.OtherFixture.Body.Owner != attachedEnt || + TryComp(args.OurFixture.Body.Owner, out var projectile) && + projectile.Shooter == attachedEnt) return; + + if (args.OurFixture.ID != FlyByFixture || + !_random.Prob(component.Prob)) return; + + SoundSystem.Play(Filter.Local(), component.Sound.GetSound(), uid, component.Sound.Params); + } +} diff --git a/Content.Server/Projectiles/ProjectileSystem.cs b/Content.Server/Projectiles/SharedProjectileSystem.cs similarity index 92% rename from Content.Server/Projectiles/ProjectileSystem.cs rename to Content.Server/Projectiles/SharedProjectileSystem.cs index 9227ab939b..f1da327f5a 100644 --- a/Content.Server/Projectiles/ProjectileSystem.cs +++ b/Content.Server/Projectiles/SharedProjectileSystem.cs @@ -4,6 +4,7 @@ using Content.Shared.Body.Components; using Content.Shared.Camera; using Content.Shared.Damage; using Content.Shared.Database; +using Content.Shared.Projectiles; using JetBrains.Annotations; using Robust.Server.GameObjects; using Robust.Shared.Audio; @@ -13,7 +14,7 @@ using Robust.Shared.Player; namespace Content.Server.Projectiles { [UsedImplicitly] - internal sealed class ProjectileSystem : EntitySystem + public sealed class ProjectileSystem : SharedProjectileSystem { [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly AdminLogSystem _adminLogSystem = default!; @@ -28,7 +29,7 @@ namespace Content.Server.Projectiles private void HandleCollide(EntityUid uid, ProjectileComponent component, StartCollideEvent args) { // This is so entities that shouldn't get a collision are ignored. - if (!args.OtherFixture.Hard || component.DamagedEntity) + if (args.OurFixture.ID != ProjectileFixture || !args.OtherFixture.Hard || component.DamagedEntity) { return; } @@ -36,7 +37,7 @@ namespace Content.Server.Projectiles var otherEntity = args.OtherFixture.Body.Owner; var coordinates = EntityManager.GetComponent(args.OtherFixture.Body.Owner).Coordinates; - var playerFilter = Filter.Pvs(coordinates); + var playerFilter = Filter.Pvs(coordinates, entityMan: EntityManager); if (!EntityManager.GetComponent(otherEntity).EntityDeleted && component.SoundHitSpecies != null && EntityManager.HasComponent(otherEntity)) diff --git a/Content.Server/Stunnable/Components/StunOnCollideComponent.cs b/Content.Server/Stunnable/Components/StunOnCollideComponent.cs index 447b030e9b..c12f9e269e 100644 --- a/Content.Server/Stunnable/Components/StunOnCollideComponent.cs +++ b/Content.Server/Stunnable/Components/StunOnCollideComponent.cs @@ -23,5 +23,10 @@ namespace Content.Server.Stunnable.Components [DataField("runSpeedMultiplier")] public float RunSpeedMultiplier = 1f; + + /// + /// Fixture we track for the collision. + /// + [ViewVariables, DataField("fixture")] public string FixtureID = "projectile"; } } diff --git a/Content.Server/Stunnable/StunOnCollideSystem.cs b/Content.Server/Stunnable/StunOnCollideSystem.cs index f0c095f7d7..d078156abd 100644 --- a/Content.Server/Stunnable/StunOnCollideSystem.cs +++ b/Content.Server/Stunnable/StunOnCollideSystem.cs @@ -41,6 +41,8 @@ namespace Content.Server.Stunnable } private void HandleCollide(EntityUid uid, StunOnCollideComponent component, StartCollideEvent args) { + if (args.OurFixture.ID != component.FixtureID) return; + TryDoCollideStun(uid, component, args.OtherFixture.Body.Owner); } diff --git a/Content.Server/Weapon/Ranged/FlyBySoundSystem.cs b/Content.Server/Weapon/Ranged/FlyBySoundSystem.cs new file mode 100644 index 0000000000..79e425e2e4 --- /dev/null +++ b/Content.Server/Weapon/Ranged/FlyBySoundSystem.cs @@ -0,0 +1,5 @@ +using Content.Shared.Weapons.Ranged; + +namespace Content.Server.Weapon.Ranged; + +public sealed class FlyBySoundSystem : SharedFlyBySoundSystem {} diff --git a/Content.Shared/Projectiles/ProjectileSystem.cs b/Content.Shared/Projectiles/SharedProjectileSystem.cs similarity index 82% rename from Content.Shared/Projectiles/ProjectileSystem.cs rename to Content.Shared/Projectiles/SharedProjectileSystem.cs index 8b29a471cf..52b322302e 100644 --- a/Content.Shared/Projectiles/ProjectileSystem.cs +++ b/Content.Shared/Projectiles/SharedProjectileSystem.cs @@ -2,8 +2,10 @@ using Robust.Shared.Physics.Dynamics; namespace Content.Shared.Projectiles { - public sealed class ProjectileSystem : EntitySystem + public abstract class SharedProjectileSystem : EntitySystem { + public const string ProjectileFixture = "projectile"; + public override void Initialize() { base.Initialize(); diff --git a/Content.Shared/Weapons/Ranged/FlyBySoundComponent.cs b/Content.Shared/Weapons/Ranged/FlyBySoundComponent.cs new file mode 100644 index 0000000000..4d10fbc817 --- /dev/null +++ b/Content.Shared/Weapons/Ranged/FlyBySoundComponent.cs @@ -0,0 +1,26 @@ +using Content.Shared.Sound; +using Robust.Shared.Audio; +using Robust.Shared.GameStates; + +namespace Content.Shared.Weapons.Ranged; + +/// +/// Plays a sound when its non-hard fixture collides with a player. +/// +[RegisterComponent, NetworkedComponent] +public sealed class FlyBySoundComponent : Component +{ + /// + /// Probability that the sound plays + /// + [ViewVariables(VVAccess.ReadWrite), DataField("prob")] + public float Prob = 0.75f; + + [ViewVariables(VVAccess.ReadWrite), DataField("sound")] + public SoundSpecifier Sound = new SoundCollectionSpecifier("BulletMiss") + { + Params = AudioParams.Default.WithVolume(5f), + }; + + [ViewVariables, DataField("range")] public float Range = 1.5f; +} diff --git a/Content.Shared/Weapons/Ranged/SharedFlyBySoundSystem.cs b/Content.Shared/Weapons/Ranged/SharedFlyBySoundSystem.cs new file mode 100644 index 0000000000..eefc23f314 --- /dev/null +++ b/Content.Shared/Weapons/Ranged/SharedFlyBySoundSystem.cs @@ -0,0 +1,75 @@ +using Content.Shared.Physics; +using Content.Shared.Sound; +using Robust.Shared.GameStates; +using Robust.Shared.Physics; +using Robust.Shared.Physics.Collision.Shapes; +using Robust.Shared.Physics.Dynamics; +using Robust.Shared.Serialization; + +namespace Content.Shared.Weapons.Ranged; + +public abstract class SharedFlyBySoundSystem : EntitySystem +{ + [Dependency] private readonly FixtureSystem _fixtures = default!; + + public const string FlyByFixture = "fly-by"; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnGetState); + SubscribeLocalEvent(OnHandleState); + SubscribeLocalEvent(OnStartup); + SubscribeLocalEvent(OnShutdown); + } + + private void OnStartup(EntityUid uid, FlyBySoundComponent component, ComponentStartup args) + { + if (!TryComp(uid, out var body)) return; + + var shape = new PhysShapeCircle() + { + Radius = component.Range, + }; + + var fixture = new Fixture(body, shape) + { + Hard = false, + ID = FlyByFixture, + CollisionLayer = (int) CollisionGroup.MobMask, + }; + + _fixtures.TryCreateFixture(body, fixture); + } + + private void OnShutdown(EntityUid uid, FlyBySoundComponent component, ComponentShutdown args) + { + if (!TryComp(uid, out var body)) return; + + _fixtures.DestroyFixture(body, FlyByFixture); + } + + private void OnHandleState(EntityUid uid, FlyBySoundComponent component, ref ComponentHandleState args) + { + if (args.Current is not FlyBySoundComponentState state) return; + + component.Sound = state.Sound; + component.Range = state.Range; + } + + private void OnGetState(EntityUid uid, FlyBySoundComponent component, ref ComponentGetState args) + { + args.State = new FlyBySoundComponentState() + { + Sound = component.Sound, + Range = component.Range, + }; + } + + [Serializable, NetSerializable] + private sealed class FlyBySoundComponentState : ComponentState + { + public SoundSpecifier Sound = default!; + public float Range; + } +} diff --git a/Resources/Audio/Weapons/Guns/Miss/bullet_miss1.ogg b/Resources/Audio/Weapons/Guns/Miss/bullet_miss1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ae3e7a4b665da3074278178c4a320dc8e9430d8f GIT binary patch literal 5683 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

`NvJDhmm4e5o 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 HxPku%xCRHp literal 0 HcmV?d00001 diff --git a/Resources/Audio/Weapons/Guns/Miss/licenses.txt b/Resources/Audio/Weapons/Guns/Miss/licenses.txt new file mode 100644 index 0000000000..1f6cdc1735 --- /dev/null +++ b/Resources/Audio/Weapons/Guns/Miss/licenses.txt @@ -0,0 +1,2 @@ +bullet_miss oggs taken from https://github.com/cmss13-devs/cmss13/tree/0535055a7abcd3016123f2be2cd3db428c122dac/sound/bullets under CC BY-SA 3.0 +energy_miss ogg taken from https://github.com/cmss13-devs/cmss13/tree/0535055a7abcd3016123f2be2cd3db428c122dac/sound/bullets under CC BY-SA 3.0 \ No newline at end of file diff --git a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml index fc11e2d2ac..927bd14281 100644 --- a/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml +++ b/Resources/Prototypes/Entities/Objects/Weapons/Guns/Projectiles/projectiles.yml @@ -5,6 +5,7 @@ description: If you can see this you're probably dead! abstract: true components: + - type: FlyBySound - type: Clickable - type: Sprite netsync: false @@ -21,6 +22,7 @@ !type:PhysShapeAabb bounds: "-0.1,-0.1,0.1,0.1" hard: false + id: projectile mask: - Impassable - BulletImpassable @@ -47,6 +49,7 @@ !type:PhysShapeAabb bounds: "-0.15,-0.45,0.15,0.15" hard: false + id: projectile mask: - Impassable - BulletImpassable @@ -111,6 +114,11 @@ parent: BulletBase noSpawn: true components: + - type: FlyBySound + sound: + collection: EnergyMiss + params: + volume: 5 - type: Sprite noRot: true sprite: Objects/Weapons/Guns/Projectiles/spark.rsi @@ -125,6 +133,7 @@ !type:PhysShapeAabb bounds: "-0.2,-0.2,0.2,0.2" hard: false + id: projectile mask: - Impassable - BulletImpassable @@ -159,6 +168,7 @@ !type:PhysShapeAabb bounds: "-0.2,-0.2,0.2,0.2" hard: false + id: projectile mask: - Impassable - Opaque diff --git a/Resources/Prototypes/SoundCollections/gun_sounds.yml b/Resources/Prototypes/SoundCollections/gun_sounds.yml new file mode 100644 index 0000000000..2225f809a9 --- /dev/null +++ b/Resources/Prototypes/SoundCollections/gun_sounds.yml @@ -0,0 +1,12 @@ +- type: soundCollection + id: BulletMiss + files: + - /Audio/Weapons/Guns/Miss/bullet_miss1.ogg + - /Audio/Weapons/Guns/Miss/bullet_miss2.ogg + - /Audio/Weapons/Guns/Miss/bullet_miss3.ogg + - /Audio/Weapons/Guns/Miss/bullet_miss4.ogg + +- type: soundCollection + id: EnergyMiss + files: + - /Audio/Weapons/Guns/Miss/energy_miss1.ogg