using Content.Shared.FootPrint; using Robust.Client.GameObjects; using Robust.Client.Graphics; using Robust.Shared.GameStates; using Robust.Shared.Random; namespace Content.Client.FootPrint; public sealed class FootPrintsVisualizerSystem : VisualizerSystem { [Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly IRobustRandom _random = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnInitialized); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnHandleState); } private void OnHandleState(Entity ent, ref ComponentHandleState args) { if (args.Current is not FootPrintState state || !TryGetEntity(state.PrintOwner, out var entity)) return; ent.Comp.PrintOwner = entity.Value; } private void OnInitialized(EntityUid uid, FootPrintComponent comp, ComponentInit args) { if (!TryComp(uid, out var sprite)) return; sprite.LayerMapReserveBlank(FootPrintVisualLayers.Print); UpdateAppearance(uid, comp, sprite); } private void OnShutdown(EntityUid uid, FootPrintComponent comp, ComponentShutdown args) { if (TryComp(uid, out var sprite) && sprite.LayerMapTryGet(FootPrintVisualLayers.Print, out var layer)) sprite.RemoveLayer(layer); } private void UpdateAppearance(EntityUid uid, FootPrintComponent component, SpriteComponent sprite) { if (!sprite.LayerMapTryGet(FootPrintVisualLayers.Print, out var layer) || !TryComp(component.PrintOwner, out var printsComponent) || !TryComp(uid, out var appearance) || !_appearance.TryGetData(uid, FootPrintVisualState.State, out var printVisuals, appearance)) return; sprite.LayerSetState(layer, new RSI.StateId(printVisuals switch { FootPrintVisuals.BareFootPrint => printsComponent.RightStep ? printsComponent.RightBarePrint : printsComponent.LeftBarePrint, FootPrintVisuals.ShoesPrint => printsComponent.ShoesPrint, FootPrintVisuals.SuitPrint => printsComponent.SuitPrint, FootPrintVisuals.Dragging => _random.Pick(printsComponent.DraggingPrint), _ => throw new ArgumentOutOfRangeException($"Unknown {printVisuals} parameter.") }), printsComponent.RsiPath); if (_appearance.TryGetData(uid, FootPrintVisualState.Color, out var printColor, appearance)) sprite.LayerSetColor(layer, printColor); } protected override void OnAppearanceChange (EntityUid uid, FootPrintComponent component, ref AppearanceChangeEvent args) { if (args.Sprite is not { } sprite) return; UpdateAppearance(uid, component, sprite); } }