BorgSystem.MMI.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. using Content.Server.Roles;
  2. using Content.Shared.Containers.ItemSlots;
  3. using Content.Shared.Mind.Components;
  4. using Content.Shared.Roles;
  5. using Content.Shared.Silicons.Borgs.Components;
  6. using Robust.Shared.Containers;
  7. namespace Content.Server.Silicons.Borgs;
  8. /// <inheritdoc/>
  9. public sealed partial class BorgSystem
  10. {
  11. [Dependency] private readonly SharedRoleSystem _roles = default!;
  12. public void InitializeMMI()
  13. {
  14. SubscribeLocalEvent<MMIComponent, ComponentInit>(OnMMIInit);
  15. SubscribeLocalEvent<MMIComponent, EntInsertedIntoContainerMessage>(OnMMIEntityInserted);
  16. SubscribeLocalEvent<MMIComponent, MindAddedMessage>(OnMMIMindAdded);
  17. SubscribeLocalEvent<MMIComponent, MindRemovedMessage>(OnMMIMindRemoved);
  18. SubscribeLocalEvent<MMILinkedComponent, MindAddedMessage>(OnMMILinkedMindAdded);
  19. SubscribeLocalEvent<MMILinkedComponent, EntGotRemovedFromContainerMessage>(OnMMILinkedRemoved);
  20. }
  21. private void OnMMIInit(EntityUid uid, MMIComponent component, ComponentInit args)
  22. {
  23. if (!TryComp<ItemSlotsComponent>(uid, out var itemSlots))
  24. return;
  25. if (ItemSlots.TryGetSlot(uid, component.BrainSlotId, out var slot, itemSlots))
  26. component.BrainSlot = slot;
  27. else
  28. ItemSlots.AddItemSlot(uid, component.BrainSlotId, component.BrainSlot, itemSlots);
  29. }
  30. private void OnMMIEntityInserted(EntityUid uid, MMIComponent component, EntInsertedIntoContainerMessage args)
  31. {
  32. if (args.Container.ID != component.BrainSlotId)
  33. return;
  34. var ent = args.Entity;
  35. var linked = EnsureComp<MMILinkedComponent>(ent);
  36. linked.LinkedMMI = uid;
  37. Dirty(uid, component);
  38. if (_mind.TryGetMind(ent, out var mindId, out var mind))
  39. {
  40. _mind.TransferTo(mindId, uid, true, mind: mind);
  41. if (!_roles.MindHasRole<SiliconBrainRoleComponent>(mindId))
  42. _roles.MindAddRole(mindId, "MindRoleSiliconBrain", silent: true);
  43. }
  44. _appearance.SetData(uid, MMIVisuals.BrainPresent, true);
  45. }
  46. private void OnMMIMindAdded(EntityUid uid, MMIComponent component, MindAddedMessage args)
  47. {
  48. _appearance.SetData(uid, MMIVisuals.HasMind, true);
  49. }
  50. private void OnMMIMindRemoved(EntityUid uid, MMIComponent component, MindRemovedMessage args)
  51. {
  52. _appearance.SetData(uid, MMIVisuals.HasMind, false);
  53. }
  54. private void OnMMILinkedMindAdded(EntityUid uid, MMILinkedComponent component, MindAddedMessage args)
  55. {
  56. if (!_mind.TryGetMind(uid, out var mindId, out var mind) ||
  57. component.LinkedMMI == null)
  58. return;
  59. _mind.TransferTo(mindId, component.LinkedMMI, true, mind: mind);
  60. }
  61. private void OnMMILinkedRemoved(EntityUid uid, MMILinkedComponent component, EntGotRemovedFromContainerMessage args)
  62. {
  63. if (Terminating(uid))
  64. return;
  65. if (component.LinkedMMI is not { } linked)
  66. return;
  67. RemComp(uid, component);
  68. if (_mind.TryGetMind(linked, out var mindId, out var mind))
  69. {
  70. if (_roles.MindHasRole<SiliconBrainRoleComponent>(mindId))
  71. _roles.MindRemoveRole<SiliconBrainRoleComponent>(mindId);
  72. _mind.TransferTo(mindId, uid, true, mind: mind);
  73. }
  74. _appearance.SetData(linked, MMIVisuals.BrainPresent, false);
  75. }
  76. }