]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add MovementSound (#31313)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Fri, 20 Dec 2024 11:51:17 +0000 (22:51 +1100)
committerGitHub <noreply@github.com>
Fri, 20 Dec 2024 11:51:17 +0000 (14:51 +0300)
Mainly useful for medicalborg so you can get a looping sound and not footsteps playing over and over.

Didn't actually update medborg because footsteps need updating.

Not needed for AI.

Content.Shared/Movement/Components/MovementSoundComponent.cs [new file with mode: 0644]
Content.Shared/Movement/Systems/MovementSoundSystem.cs [new file with mode: 0644]

diff --git a/Content.Shared/Movement/Components/MovementSoundComponent.cs b/Content.Shared/Movement/Components/MovementSoundComponent.cs
new file mode 100644 (file)
index 0000000..92a6974
--- /dev/null
@@ -0,0 +1,20 @@
+using Robust.Shared.Audio;
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Movement.Components;
+
+/// <summary>
+/// Plays a sound whenever InputMover is running.
+/// </summary>
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class MovementSoundComponent : Component
+{
+    /// <summary>
+    /// Sound to play when InputMover has inputs.
+    /// </summary>
+    [DataField(required: true), AutoNetworkedField]
+    public SoundSpecifier? Sound;
+
+    [DataField, AutoNetworkedField]
+    public EntityUid? SoundEntity;
+}
diff --git a/Content.Shared/Movement/Systems/MovementSoundSystem.cs b/Content.Shared/Movement/Systems/MovementSoundSystem.cs
new file mode 100644 (file)
index 0000000..9a11467
--- /dev/null
@@ -0,0 +1,44 @@
+using Content.Shared.Movement.Components;
+using Content.Shared.Movement.Events;
+using Robust.Shared.Audio.Systems;
+using Robust.Shared.Timing;
+using Robust.Shared.Utility;
+
+namespace Content.Shared.Movement.Systems;
+
+/// <summary>
+/// Plays a sound on MoveInputEvent.
+/// </summary>
+public sealed class MovementSoundSystem : EntitySystem
+{
+    [Dependency] private readonly IGameTiming _timing = default!;
+    [Dependency] private readonly SharedAudioSystem _audio = default!;
+
+    public override void Initialize()
+    {
+        base.Initialize();
+        SubscribeLocalEvent<MovementSoundComponent, MoveInputEvent>(OnMoveInput);
+    }
+
+    private void OnMoveInput(Entity<MovementSoundComponent> ent, ref MoveInputEvent args)
+    {
+        if (!_timing.IsFirstTimePredicted)
+            return;
+
+        var oldMoving = (SharedMoverController.GetNormalizedMovement(args.OldMovement) & MoveButtons.AnyDirection) != MoveButtons.None;
+        var moving = (SharedMoverController.GetNormalizedMovement(args.Entity.Comp.HeldMoveButtons) & MoveButtons.AnyDirection) != MoveButtons.None;
+
+        if (oldMoving == moving)
+            return;
+
+        if (moving)
+        {
+            DebugTools.Assert(ent.Comp.SoundEntity == null);
+            ent.Comp.SoundEntity = _audio.PlayPredicted(ent.Comp.Sound, ent.Owner, ent.Owner)?.Entity;
+        }
+        else
+        {
+            ent.Comp.SoundEntity = _audio.Stop(ent.Comp.SoundEntity);
+        }
+    }
+}