diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.Impact.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.Impact.cs new file mode 100644 index 0000000000..60f948f9db --- /dev/null +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.Impact.cs @@ -0,0 +1,58 @@ +using Content.Server.Shuttles.Components; +using Robust.Shared.Audio; +using Robust.Shared.Map; +using Robust.Shared.Physics.Dynamics; +using Robust.Shared.Physics.Events; +using Robust.Shared.Player; + +namespace Content.Server.Shuttles.Systems; + +public sealed partial class ShuttleSystem +{ + /// + /// Minimum velocity difference between 2 bodies for a shuttle "impact" to occur. + /// + private const int MinimumImpactVelocity = 10; + + private readonly SoundCollectionSpecifier _shuttleImpactSound = new("ShuttleImpactSound"); + + private void InitializeImpact() + { + SubscribeLocalEvent(OnShuttleCollide); + } + + private void OnShuttleCollide(EntityUid uid, ShuttleComponent component, ref StartCollideEvent args) + { + var ourBody = args.OurFixture.Body; + var otherBody = args.OtherFixture.Body; + + if (!HasComp(otherBody.Owner)) + return; + + // TODO: Would also be nice to have a continuous sound for scraping. + var ourXform = Transform(ourBody.Owner); + + if (ourXform.MapUid == null) + return; + + var otherXform = Transform(otherBody.Owner); + + var ourPoint = ourXform.InvWorldMatrix.Transform(args.WorldPoint); + var otherPoint = otherXform.InvWorldMatrix.Transform(args.WorldPoint); + + var ourVelocity = _physics.GetLinearVelocity(ourBody.Owner, ourPoint, ourBody, ourXform); + var otherVelocity = _physics.GetLinearVelocity(otherBody.Owner, otherPoint, otherBody, otherXform); + var jungleDiff = (ourVelocity - otherVelocity).Length; + + if (jungleDiff < MinimumImpactVelocity) + { + return; + } + + var coordinates = new EntityCoordinates(ourXform.MapUid.Value, args.WorldPoint); + var volume = MathF.Min(10f, 1f * MathF.Pow(jungleDiff, 0.5f) - 5f); + var audioParams = AudioParams.Default.WithVariation(0.05f).WithVolume(volume); + + _audio.Play(_shuttleImpactSound, Filter.Pvs(coordinates, rangeMultiplier: 4f, entityMan: EntityManager), coordinates, audioParams); + } +} diff --git a/Content.Server/Shuttles/Systems/ShuttleSystem.cs b/Content.Server/Shuttles/Systems/ShuttleSystem.cs index cf69c7d932..4d8312d852 100644 --- a/Content.Server/Shuttles/Systems/ShuttleSystem.cs +++ b/Content.Server/Shuttles/Systems/ShuttleSystem.cs @@ -17,6 +17,7 @@ namespace Content.Server.Shuttles.Systems { [Dependency] private readonly IMapManager _mapManager = default!; [Dependency] private readonly FixtureSystem _fixtures = default!; + [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; [Dependency] private readonly UserInterfaceSystem _uiSystem = default!; @@ -36,6 +37,7 @@ namespace Content.Server.Shuttles.Systems InitializeEscape(); InitializeFTL(); InitializeIFF(); + InitializeImpact(); SubscribeLocalEvent(OnShuttleAdd); SubscribeLocalEvent(OnShuttleStartup); diff --git a/Resources/Audio/Effects/Shuttle/shuttle_impact1.ogg b/Resources/Audio/Effects/Shuttle/shuttle_impact1.ogg new file mode 100644 index 0000000000..cbfc3ceeeb Binary files /dev/null and b/Resources/Audio/Effects/Shuttle/shuttle_impact1.ogg differ diff --git a/Resources/Audio/Effects/Shuttle/shuttle_impact2.ogg b/Resources/Audio/Effects/Shuttle/shuttle_impact2.ogg new file mode 100644 index 0000000000..d573f6ee18 Binary files /dev/null and b/Resources/Audio/Effects/Shuttle/shuttle_impact2.ogg differ diff --git a/Resources/Audio/Effects/Shuttle/shuttle_impact3.ogg b/Resources/Audio/Effects/Shuttle/shuttle_impact3.ogg new file mode 100644 index 0000000000..9a2d819a2a Binary files /dev/null and b/Resources/Audio/Effects/Shuttle/shuttle_impact3.ogg differ diff --git a/Resources/Prototypes/SoundCollections/shuttle.yml b/Resources/Prototypes/SoundCollections/shuttle.yml new file mode 100644 index 0000000000..b3e2180771 --- /dev/null +++ b/Resources/Prototypes/SoundCollections/shuttle.yml @@ -0,0 +1,6 @@ +- type: soundCollection + id: ShuttleImpactSound + files: + - "/Audio/Effects/Shuttle/shuttle_impact1.ogg" + - "/Audio/Effects/Shuttle/shuttle_impact2.ogg" + - "/Audio/Effects/Shuttle/shuttle_impact3.ogg"