1
0

BrainSystem.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. using Content.Server.Body.Components;
  2. using Content.Server.Ghost.Components;
  3. using Content.Shared.Body.Components;
  4. using Content.Shared.Body.Events;
  5. using Content.Shared.Mind;
  6. using Content.Shared.Mind.Components;
  7. using Content.Shared.Pointing;
  8. // Shitmed Change
  9. using Content.Shared._Shitmed.Body.Organ;
  10. using Content.Shared.Body.Systems;
  11. namespace Content.Server.Body.Systems
  12. {
  13. public sealed class BrainSystem : EntitySystem
  14. {
  15. [Dependency] private readonly SharedMindSystem _mindSystem = default!;
  16. [Dependency] private readonly SharedBodySystem _bodySystem = default!; // Shitmed Change
  17. public override void Initialize()
  18. {
  19. base.Initialize();
  20. SubscribeLocalEvent<BrainComponent, OrganAddedToBodyEvent>((uid, _, args) => HandleMind(args.Body, uid));
  21. // Shitmed Change Start
  22. SubscribeLocalEvent<BrainComponent, OrganRemovedFromBodyEvent>(HandleRemoval);
  23. SubscribeLocalEvent<BrainComponent, PointAttemptEvent>(OnPointAttempt);
  24. }
  25. private void HandleRemoval(EntityUid uid, BrainComponent brain, ref OrganRemovedFromBodyEvent args)
  26. {
  27. if (TerminatingOrDeleted(uid) || TerminatingOrDeleted(args.OldBody))
  28. return;
  29. brain.Active = false;
  30. if (!CheckOtherBrains(args.OldBody))
  31. {
  32. // Prevents revival, should kill the user within a given timespan too.
  33. EnsureComp<DebrainedComponent>(args.OldBody);
  34. HandleMind(uid, args.OldBody);
  35. }
  36. }
  37. private void HandleAddition(EntityUid uid, BrainComponent brain, ref OrganAddedToBodyEvent args)
  38. {
  39. if (TerminatingOrDeleted(uid) || TerminatingOrDeleted(args.Body))
  40. return;
  41. if (!CheckOtherBrains(args.Body))
  42. {
  43. RemComp<DebrainedComponent>(args.Body);
  44. HandleMind(args.Body, uid, brain);
  45. }
  46. }
  47. private void HandleMind(EntityUid newEntity, EntityUid oldEntity, BrainComponent? brain = null)
  48. {
  49. if (TerminatingOrDeleted(newEntity) || TerminatingOrDeleted(oldEntity))
  50. return;
  51. EnsureComp<MindContainerComponent>(newEntity);
  52. EnsureComp<MindContainerComponent>(oldEntity);
  53. var ghostOnMove = EnsureComp<GhostOnMoveComponent>(newEntity);
  54. if (HasComp<BodyComponent>(newEntity))
  55. ghostOnMove.MustBeDead = true;
  56. if (!_mindSystem.TryGetMind(oldEntity, out var mindId, out var mind))
  57. return;
  58. _mindSystem.TransferTo(mindId, newEntity, mind: mind);
  59. if (brain != null)
  60. brain.Active = true;
  61. }
  62. private bool CheckOtherBrains(EntityUid entity)
  63. {
  64. var hasOtherBrains = false;
  65. if (TryComp<BodyComponent>(entity, out var body))
  66. {
  67. if (TryComp<BrainComponent>(entity, out var bodyBrain))
  68. hasOtherBrains = true;
  69. else
  70. {
  71. foreach (var (organ, _) in _bodySystem.GetBodyOrgans(entity, body))
  72. {
  73. if (TryComp<BrainComponent>(organ, out var brain) && brain.Active)
  74. {
  75. hasOtherBrains = true;
  76. break;
  77. }
  78. }
  79. }
  80. }
  81. return hasOtherBrains;
  82. }
  83. // Shitmed Change End
  84. private void OnPointAttempt(Entity<BrainComponent> ent, ref PointAttemptEvent args)
  85. {
  86. args.Cancel();
  87. }
  88. }
  89. }