| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145 |
- using Content.Shared.Audio.Jukebox;
- using Robust.Client.Animations;
- using Robust.Client.GameObjects;
- using Robust.Shared.Prototypes;
- namespace Content.Client.Audio.Jukebox;
- public sealed class JukeboxSystem : SharedJukeboxSystem
- {
- [Dependency] private readonly IPrototypeManager _protoManager = default!;
- [Dependency] private readonly AnimationPlayerSystem _animationPlayer = default!;
- [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!;
- [Dependency] private readonly SharedUserInterfaceSystem _uiSystem = default!;
- public override void Initialize()
- {
- base.Initialize();
- SubscribeLocalEvent<JukeboxComponent, AppearanceChangeEvent>(OnAppearanceChange);
- SubscribeLocalEvent<JukeboxComponent, AnimationCompletedEvent>(OnAnimationCompleted);
- SubscribeLocalEvent<JukeboxComponent, AfterAutoHandleStateEvent>(OnJukeboxAfterState);
- _protoManager.PrototypesReloaded += OnProtoReload;
- }
- public override void Shutdown()
- {
- base.Shutdown();
- _protoManager.PrototypesReloaded -= OnProtoReload;
- }
- private void OnProtoReload(PrototypesReloadedEventArgs obj)
- {
- if (!obj.WasModified<JukeboxPrototype>())
- return;
- var query = AllEntityQuery<JukeboxComponent, UserInterfaceComponent>();
- while (query.MoveNext(out var uid, out _, out var ui))
- {
- if (!_uiSystem.TryGetOpenUi<JukeboxBoundUserInterface>((uid, ui), JukeboxUiKey.Key, out var bui))
- continue;
- bui.PopulateMusic();
- }
- }
- private void OnJukeboxAfterState(Entity<JukeboxComponent> ent, ref AfterAutoHandleStateEvent args)
- {
- if (!_uiSystem.TryGetOpenUi<JukeboxBoundUserInterface>(ent.Owner, JukeboxUiKey.Key, out var bui))
- return;
- bui.Reload();
- }
- private void OnAnimationCompleted(EntityUid uid, JukeboxComponent component, AnimationCompletedEvent args)
- {
- if (!TryComp<SpriteComponent>(uid, out var sprite))
- return;
- if (!TryComp<AppearanceComponent>(uid, out var appearance) ||
- !_appearanceSystem.TryGetData<JukeboxVisualState>(uid, JukeboxVisuals.VisualState, out var visualState, appearance))
- {
- visualState = JukeboxVisualState.On;
- }
- UpdateAppearance(uid, visualState, component, sprite);
- }
- private void OnAppearanceChange(EntityUid uid, JukeboxComponent component, ref AppearanceChangeEvent args)
- {
- if (args.Sprite == null)
- return;
- if (!args.AppearanceData.TryGetValue(JukeboxVisuals.VisualState, out var visualStateObject) ||
- visualStateObject is not JukeboxVisualState visualState)
- {
- visualState = JukeboxVisualState.On;
- }
- UpdateAppearance(uid, visualState, component, args.Sprite);
- }
- private void UpdateAppearance(EntityUid uid, JukeboxVisualState visualState, JukeboxComponent component, SpriteComponent sprite)
- {
- SetLayerState(JukeboxVisualLayers.Base, component.OffState, sprite);
- switch (visualState)
- {
- case JukeboxVisualState.On:
- SetLayerState(JukeboxVisualLayers.Base, component.OnState, sprite);
- break;
- case JukeboxVisualState.Off:
- SetLayerState(JukeboxVisualLayers.Base, component.OffState, sprite);
- break;
- case JukeboxVisualState.Select:
- PlayAnimation(uid, JukeboxVisualLayers.Base, component.SelectState, 1.0f, sprite);
- break;
- }
- }
- private void PlayAnimation(EntityUid uid, JukeboxVisualLayers layer, string? state, float animationTime, SpriteComponent sprite)
- {
- if (string.IsNullOrEmpty(state))
- return;
- if (!_animationPlayer.HasRunningAnimation(uid, state))
- {
- var animation = GetAnimation(layer, state, animationTime);
- sprite.LayerSetVisible(layer, true);
- _animationPlayer.Play(uid, animation, state);
- }
- }
- private static Animation GetAnimation(JukeboxVisualLayers layer, string state, float animationTime)
- {
- return new Animation
- {
- Length = TimeSpan.FromSeconds(animationTime),
- AnimationTracks =
- {
- new AnimationTrackSpriteFlick
- {
- LayerKey = layer,
- KeyFrames =
- {
- new AnimationTrackSpriteFlick.KeyFrame(state, 0f)
- }
- }
- }
- };
- }
- private void SetLayerState(JukeboxVisualLayers layer, string? state, SpriteComponent sprite)
- {
- if (string.IsNullOrEmpty(state))
- return;
- sprite.LayerSetVisible(layer, true);
- sprite.LayerSetAutoAnimated(layer, true);
- sprite.LayerSetState(layer, state);
- }
- }
|