ItemMapperSystem.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System.Linq;
  2. using Content.Shared.Storage.Components;
  3. using Content.Shared.Storage.EntitySystems;
  4. using Robust.Client.GameObjects;
  5. using Robust.Shared.Utility;
  6. namespace Content.Client.Storage.Systems;
  7. public sealed class ItemMapperSystem : SharedItemMapperSystem
  8. {
  9. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  10. public override void Initialize()
  11. {
  12. base.Initialize();
  13. SubscribeLocalEvent<ItemMapperComponent, ComponentStartup>(OnStartup);
  14. SubscribeLocalEvent<ItemMapperComponent, AppearanceChangeEvent>(OnAppearance);
  15. }
  16. private void OnStartup(EntityUid uid, ItemMapperComponent component, ComponentStartup args)
  17. {
  18. if (TryComp<SpriteComponent>(uid, out var sprite))
  19. {
  20. component.RSIPath ??= sprite.BaseRSI!.Path;
  21. }
  22. }
  23. private void OnAppearance(EntityUid uid, ItemMapperComponent component, ref AppearanceChangeEvent args)
  24. {
  25. if (TryComp<SpriteComponent>(uid, out var spriteComponent))
  26. {
  27. if (component.SpriteLayers.Count == 0)
  28. {
  29. InitLayers((uid, component, spriteComponent, args.Component));
  30. }
  31. EnableLayers((uid, component, spriteComponent, args.Component));
  32. }
  33. }
  34. private void InitLayers(Entity<ItemMapperComponent, SpriteComponent, AppearanceComponent> ent)
  35. {
  36. var (owner, component, spriteComponent, appearance) = ent;
  37. if (!_appearance.TryGetData<ShowLayerData>(owner, StorageMapVisuals.InitLayers, out var wrapper, appearance))
  38. return;
  39. component.SpriteLayers.AddRange(wrapper.QueuedEntities);
  40. foreach (var sprite in component.SpriteLayers)
  41. {
  42. spriteComponent.LayerMapReserveBlank(sprite);
  43. spriteComponent.LayerSetSprite(sprite, new SpriteSpecifier.Rsi(component.RSIPath!.Value, sprite));
  44. spriteComponent.LayerSetVisible(sprite, false);
  45. }
  46. }
  47. private void EnableLayers(Entity<ItemMapperComponent, SpriteComponent, AppearanceComponent> ent)
  48. {
  49. var (owner, component, spriteComponent, appearance) = ent;
  50. if (!_appearance.TryGetData<ShowLayerData>(owner, StorageMapVisuals.LayerChanged, out var wrapper, appearance))
  51. return;
  52. foreach (var layerName in component.SpriteLayers)
  53. {
  54. var show = wrapper.QueuedEntities.Contains(layerName);
  55. spriteComponent.LayerSetVisible(layerName, show);
  56. }
  57. }
  58. }