1
0

EyesSystem.cs 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // SPDX-FileCopyrightText: 2024 Piras314 <p1r4s@proton.me>
  2. // SPDX-FileCopyrightText: 2024 gluesniffler <159397573+gluesniffler@users.noreply.github.com>
  3. // SPDX-FileCopyrightText: 2025 Aiden <28298836+Aidenkrz@users.noreply.github.com>
  4. //
  5. // SPDX-License-Identifier: AGPL-3.0-or-later
  6. using Content.Shared.Body.Components;
  7. using Content.Shared._Shitmed.Body.Organ;
  8. using Content.Shared.Eye.Blinding.Components;
  9. using Content.Shared.Eye.Blinding.Systems;
  10. namespace Content.Server.Body.Systems
  11. {
  12. public sealed class EyesSystem : EntitySystem
  13. {
  14. [Dependency] private readonly IEntityManager _entityManager = default!;
  15. [Dependency] private readonly BlindableSystem _blindableSystem = default!;
  16. [Dependency] private readonly BodySystem _bodySystem = default!;
  17. public override void Initialize()
  18. {
  19. base.Initialize();
  20. SubscribeLocalEvent<EyesComponent, OrganEnabledEvent>(OnOrganEnabled);
  21. SubscribeLocalEvent<EyesComponent, OrganDisabledEvent>(OnOrganDisabled);
  22. }
  23. private void HandleSight(EntityUid newEntity, EntityUid oldEntity)
  24. {
  25. if (TerminatingOrDeleted(newEntity) || TerminatingOrDeleted(oldEntity))
  26. return;
  27. BlindableComponent? newSight;
  28. BlindableComponent? oldSight;
  29. //transfer existing component to organ
  30. if (!TryComp(newEntity, out newSight))
  31. newSight = EnsureComp<BlindableComponent>(newEntity);
  32. if (!TryComp(oldEntity, out oldSight))
  33. oldSight = EnsureComp<BlindableComponent>(oldEntity);
  34. //give new sight all values of old sight
  35. _blindableSystem.TransferBlindness(newSight, oldSight, newEntity);
  36. var hasOtherEyes = false;
  37. //check for other eye components on owning body and owning body organs (if old entity has a body)
  38. if (TryComp<BodyComponent>(oldEntity, out var body))
  39. {
  40. if (TryComp<EyesComponent>(oldEntity, out var bodyEyes)) //some bodies see through their skin!!! (slimes)
  41. hasOtherEyes = true;
  42. else
  43. {
  44. foreach (var (organ, _) in _bodySystem.GetBodyOrgans(oldEntity, body))
  45. {
  46. if (TryComp<EyesComponent>(organ, out var eyes))
  47. {
  48. hasOtherEyes = true;
  49. break;
  50. }
  51. }
  52. //TODO (MS14): Should we do this for body parts too? might be a little overpowered but could be funny/interesting
  53. }
  54. }
  55. //if there are no existing eye components for the old entity - set old sight to be blind otherwise leave it as is
  56. if (!hasOtherEyes && !TryComp<EyesComponent>(oldEntity, out var self))
  57. _blindableSystem.AdjustEyeDamage((oldEntity, oldSight), oldSight.MaxDamage);
  58. }
  59. private void OnOrganEnabled(EntityUid uid, EyesComponent component, OrganEnabledEvent args)
  60. {
  61. if (TerminatingOrDeleted(uid)
  62. || args.Organ.Comp.Body is not { Valid: true } body)
  63. return;
  64. RemComp<TemporaryBlindnessComponent>(body);
  65. HandleSight(uid, body);
  66. }
  67. private void OnOrganDisabled(EntityUid uid, EyesComponent component, OrganDisabledEvent args)
  68. {
  69. if (TerminatingOrDeleted(uid)
  70. || args.Organ.Comp.Body is not { Valid: true } body)
  71. return;
  72. EnsureComp<TemporaryBlindnessComponent>(body);
  73. HandleSight(body, uid);
  74. }
  75. }
  76. }