ThiefUndeterminedBackpackSystem.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. using Content.Server.Thief.Components;
  2. using Content.Shared.Item;
  3. using Content.Shared.Thief;
  4. using Robust.Server.GameObjects;
  5. using Robust.Server.Audio;
  6. using Robust.Shared.Prototypes;
  7. namespace Content.Server.Thief.Systems;
  8. /// <summary>
  9. /// <see cref="ThiefUndeterminedBackpackComponent"/>
  10. /// this system links the interface to the logic, and will output to the player a set of items selected by him in the interface
  11. /// </summary>
  12. public sealed class ThiefUndeterminedBackpackSystem : EntitySystem
  13. {
  14. [Dependency] private readonly AudioSystem _audio = default!;
  15. [Dependency] private readonly IPrototypeManager _proto = default!;
  16. [Dependency] private readonly SharedTransformSystem _transform = default!;
  17. [Dependency] private readonly UserInterfaceSystem _ui = default!;
  18. public override void Initialize()
  19. {
  20. base.Initialize();
  21. SubscribeLocalEvent<ThiefUndeterminedBackpackComponent, BoundUIOpenedEvent>(OnUIOpened);
  22. SubscribeLocalEvent<ThiefUndeterminedBackpackComponent, ThiefBackpackApproveMessage>(OnApprove);
  23. SubscribeLocalEvent<ThiefUndeterminedBackpackComponent, ThiefBackpackChangeSetMessage>(OnChangeSet);
  24. }
  25. private void OnUIOpened(Entity<ThiefUndeterminedBackpackComponent> backpack, ref BoundUIOpenedEvent args)
  26. {
  27. UpdateUI(backpack.Owner, backpack.Comp);
  28. }
  29. private void OnApprove(Entity<ThiefUndeterminedBackpackComponent> backpack, ref ThiefBackpackApproveMessage args)
  30. {
  31. if (backpack.Comp.SelectedSets.Count != backpack.Comp.MaxSelectedSets)
  32. return;
  33. foreach (var i in backpack.Comp.SelectedSets)
  34. {
  35. var set = _proto.Index(backpack.Comp.PossibleSets[i]);
  36. foreach (var item in set.Content)
  37. {
  38. var ent = Spawn(item, _transform.GetMapCoordinates(backpack.Owner));
  39. if (TryComp<ItemComponent>(ent, out var itemComponent))
  40. _transform.DropNextTo(ent, backpack.Owner);
  41. }
  42. }
  43. _audio.PlayPvs(backpack.Comp.ApproveSound, backpack.Owner);
  44. QueueDel(backpack);
  45. }
  46. private void OnChangeSet(Entity<ThiefUndeterminedBackpackComponent> backpack, ref ThiefBackpackChangeSetMessage args)
  47. {
  48. //Swith selecting set
  49. if (!backpack.Comp.SelectedSets.Remove(args.SetNumber))
  50. backpack.Comp.SelectedSets.Add(args.SetNumber);
  51. UpdateUI(backpack.Owner, backpack.Comp);
  52. }
  53. private void UpdateUI(EntityUid uid, ThiefUndeterminedBackpackComponent? component = null)
  54. {
  55. if (!Resolve(uid, ref component))
  56. return;
  57. Dictionary<int, ThiefBackpackSetInfo> data = new();
  58. for (int i = 0; i < component.PossibleSets.Count; i++)
  59. {
  60. var set = _proto.Index(component.PossibleSets[i]);
  61. var selected = component.SelectedSets.Contains(i);
  62. var info = new ThiefBackpackSetInfo(
  63. set.Name,
  64. set.Description,
  65. set.Sprite,
  66. selected);
  67. data.Add(i, info);
  68. }
  69. _ui.SetUiState(uid, ThiefBackpackUIKey.Key, new ThiefBackpackBoundUserInterfaceState(data, component.MaxSelectedSets));
  70. }
  71. }