TargetingSystem.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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.Systems;
  7. using Content.Shared.Mobs;
  8. using Content.Shared._Shitmed.Targeting;
  9. using Content.Shared._Shitmed.Targeting.Events;
  10. namespace Content.Server._Shitmed.Targeting;
  11. public sealed class TargetingSystem : SharedTargetingSystem
  12. {
  13. [Dependency] private readonly SharedBodySystem _bodySystem = default!;
  14. public override void Initialize()
  15. {
  16. base.Initialize();
  17. SubscribeNetworkEvent<TargetChangeEvent>(OnTargetChange);
  18. SubscribeLocalEvent<TargetingComponent, MobStateChangedEvent>(OnMobStateChange);
  19. }
  20. private void OnTargetChange(TargetChangeEvent message, EntitySessionEventArgs args)
  21. {
  22. if (!TryComp<TargetingComponent>(GetEntity(message.Uid), out var target))
  23. return;
  24. target.Target = message.BodyPart;
  25. Dirty(GetEntity(message.Uid), target);
  26. }
  27. private void OnMobStateChange(EntityUid uid, TargetingComponent component, MobStateChangedEvent args)
  28. {
  29. // Revival is handled by the server, so we're keeping all of this here.
  30. var changed = false;
  31. if (args.NewMobState == MobState.Dead)
  32. {
  33. foreach (var part in GetValidParts())
  34. {
  35. component.BodyStatus[part] = TargetIntegrity.Dead;
  36. changed = true;
  37. }
  38. // I love groin shitcode.
  39. component.BodyStatus[TargetBodyPart.Groin] = TargetIntegrity.Dead;
  40. }
  41. else if (args.OldMobState == MobState.Dead && (args.NewMobState == MobState.Alive || args.NewMobState == MobState.Critical))
  42. {
  43. component.BodyStatus = _bodySystem.GetBodyPartStatus(uid);
  44. changed = true;
  45. }
  46. if (changed)
  47. {
  48. Dirty(uid, component);
  49. RaiseNetworkEvent(new TargetIntegrityChangeEvent(GetNetEntity(uid)), uid);
  50. }
  51. }
  52. }