diff --git a/Content.Client/Audio/BackgroundAudioSystem.cs b/Content.Client/Audio/BackgroundAudioSystem.cs index c09a684236..9aff666ebf 100644 --- a/Content.Client/Audio/BackgroundAudioSystem.cs +++ b/Content.Client/Audio/BackgroundAudioSystem.cs @@ -18,6 +18,7 @@ using Robust.Shared.Map; using Robust.Shared.Player; using Robust.Shared.Prototypes; using Robust.Shared.Random; +using Robust.Shared.Timing; using Timer = Robust.Shared.Timing.Timer; namespace Content.Client.Audio @@ -25,15 +26,15 @@ namespace Content.Client.Audio [UsedImplicitly] public sealed class BackgroundAudioSystem : EntitySystem { + [Dependency] private readonly IBaseClient _client = default!; + [Dependency] private readonly IConfigurationManager _configManager = default!; + [Dependency] private readonly IGameTiming _timing = default!; + [Dependency] private readonly IMapManager _mapManager = default!; + [Dependency] private readonly IPlayerManager _playMan = default!; [Dependency] private readonly IPrototypeManager _prototypeManager = default!; [Dependency] private readonly IRobustRandom _robustRandom = default!; - [Dependency] private readonly IConfigurationManager _configManager = default!; [Dependency] private readonly IStateManager _stateManager = default!; - [Dependency] private readonly IBaseClient _client = default!; [Dependency] private readonly ClientGameTicker _gameTicker = default!; - [Dependency] private readonly IMapManager _mapManager = default!; - [Dependency] private readonly ITileDefinitionManager _tileDefMan = default!; - [Dependency] private readonly IPlayerManager _playMan = default!; private readonly AudioParams _ambientParams = new(-10f, 1, "Master", 0, 0, 0, true, 0f); private readonly AudioParams _lobbyParams = new(-5f, 1, "Master", 0, 0, 0, true, 0f); @@ -41,6 +42,14 @@ namespace Content.Client.Audio private IPlayingAudioStream? _ambientStream; private IPlayingAudioStream? _lobbyStream; + /// + /// What is currently playing. + /// + private SoundCollectionPrototype? _playingCollection; + + /// + /// What the ambience has been set to. + /// private SoundCollectionPrototype _currentCollection = default!; private CancellationTokenSource _timerCancelTokenSource = new(); @@ -87,32 +96,36 @@ namespace Content.Client.Audio private void EntParentChanged(ref EntParentChangedMessage message) { - if(_playMan.LocalPlayer is null || _playMan.LocalPlayer.ControlledEntity != message.Entity) return; - if (!TryComp(message.Entity, out var xform) || - !_mapManager.TryGetGrid(xform.GridUid, out var grid)) return; + if(_playMan.LocalPlayer is null || _playMan.LocalPlayer.ControlledEntity != message.Entity || + !_timing.IsFirstTimePredicted) return; - var tileDef = (ContentTileDefinition) _tileDefMan[grid.GetTileRef(xform.Coordinates).Tile.TypeId]; + if (!TryComp(message.Entity, out var xform)) return; - if(_currentCollection.ID == _spaceAmbience.ID) + // Check if we traversed to grid. + if (_mapManager.TryGetGrid(xform.GridUid, out var grid)) { - if (!tileDef.Sturdy) return; + if (_currentCollection == _stationAmbience) return; ChangeAmbience(_stationAmbience); - } - else // currently station + else { - if (tileDef.Sturdy) return; ChangeAmbience(_spaceAmbience); } } private void ChangeAmbience(SoundCollectionPrototype newAmbience) { - EndAmbience(); - _currentCollection = newAmbience; + if (_currentCollection == newAmbience) return; _timerCancelTokenSource.Cancel(); + _currentCollection = newAmbience; _timerCancelTokenSource = new(); - Timer.Spawn(1500, StartAmbience, _timerCancelTokenSource.Token); + Timer.Spawn(1500, () => + { + // If we traverse a few times then don't interrupt an existing song. + if (_playingCollection == _currentCollection) return; + EndAmbience(); + StartAmbience(); + }, _timerCancelTokenSource.Token); } private void StateManagerOnStateChanged(StateChangedEventArgs args) @@ -168,12 +181,14 @@ namespace Content.Client.Audio { EndAmbience(); if (!CanPlayCollection(_currentCollection)) return; + _playingCollection = _currentCollection; var file = _robustRandom.Pick(_currentCollection.PickFiles).ToString(); _ambientStream = SoundSystem.Play(file, Filter.Local(), _ambientParams.WithVolume(_ambientParams.Volume + _configManager.GetCVar(CCVars.AmbienceVolume))); } private void EndAmbience() { + _playingCollection = null; _ambientStream?.Stop(); _ambientStream = null; }