BlurryVisionSystem.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using Content.Shared.Eye.Blinding.Components;
  2. using Content.Shared.Inventory.Events;
  3. using Content.Shared.Inventory;
  4. namespace Content.Shared.Eye.Blinding.Systems;
  5. public sealed class BlurryVisionSystem : EntitySystem
  6. {
  7. public override void Initialize()
  8. {
  9. base.Initialize();
  10. SubscribeLocalEvent<VisionCorrectionComponent, GotEquippedEvent>(OnGlassesEquipped);
  11. SubscribeLocalEvent<VisionCorrectionComponent, GotUnequippedEvent>(OnGlassesUnequipped);
  12. SubscribeLocalEvent<VisionCorrectionComponent, InventoryRelayedEvent<GetBlurEvent>>(OnGetBlur);
  13. }
  14. private void OnGetBlur(Entity<VisionCorrectionComponent> glasses, ref InventoryRelayedEvent<GetBlurEvent> args)
  15. {
  16. args.Args.Blur += glasses.Comp.VisionBonus;
  17. args.Args.CorrectionPower *= glasses.Comp.CorrectionPower;
  18. }
  19. public void UpdateBlurMagnitude(Entity<BlindableComponent?> ent)
  20. {
  21. if (!Resolve(ent.Owner, ref ent.Comp, false))
  22. return;
  23. var ev = new GetBlurEvent(ent.Comp.EyeDamage);
  24. RaiseLocalEvent(ent, ev);
  25. var blur = Math.Clamp(ev.Blur, 0, BlurryVisionComponent.MaxMagnitude);
  26. if (blur <= 0)
  27. {
  28. RemCompDeferred<BlurryVisionComponent>(ent);
  29. return;
  30. }
  31. var blurry = EnsureComp<BlurryVisionComponent>(ent);
  32. blurry.Magnitude = blur;
  33. blurry.CorrectionPower = ev.CorrectionPower;
  34. Dirty(ent, blurry);
  35. }
  36. private void OnGlassesEquipped(Entity<VisionCorrectionComponent> glasses, ref GotEquippedEvent args)
  37. {
  38. UpdateBlurMagnitude(args.Equipee);
  39. }
  40. private void OnGlassesUnequipped(Entity<VisionCorrectionComponent> glasses, ref GotUnequippedEvent args)
  41. {
  42. UpdateBlurMagnitude(args.Equipee);
  43. }
  44. }
  45. public sealed class GetBlurEvent : EntityEventArgs, IInventoryRelayEvent
  46. {
  47. public readonly float BaseBlur;
  48. public float Blur;
  49. public float CorrectionPower = BlurryVisionComponent.DefaultCorrectionPower;
  50. public GetBlurEvent(float blur)
  51. {
  52. Blur = blur;
  53. BaseBlur = blur;
  54. }
  55. public SlotFlags TargetSlots => SlotFlags.HEAD | SlotFlags.MASK | SlotFlags.EYES;
  56. }