Skip to content

Commit

Permalink
Add MovementSound (space-wizards#31313)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
metalgearsloth authored Dec 20, 2024
1 parent 864c225 commit a2912e3
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 0 deletions.
20 changes: 20 additions & 0 deletions Content.Shared/Movement/Components/MovementSoundComponent.cs
Original file line number Diff line number Diff line change
@@ -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;
}
44 changes: 44 additions & 0 deletions Content.Shared/Movement/Systems/MovementSoundSystem.cs
Original file line number Diff line number Diff line change
@@ -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);
}
}
}

0 comments on commit a2912e3

Please sign in to comment.