using Content.Shared.Eye.Blinding.Components; using Content.Shared.Inventory.Events; using Content.Shared.Inventory; namespace Content.Shared.Eye.Blinding.Systems; public sealed class BlurryVisionSystem : EntitySystem { [Dependency] private readonly IEntityManager _entityManager = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnGlassesEquipped); SubscribeLocalEvent(OnGlassesUnequipped); SubscribeLocalEvent>(OnGetBlur); } private void OnGetBlur(Entity glasses, ref InventoryRelayedEvent args) { args.Args.Blur += glasses.Comp.VisionBonus; args.Args.CorrectionPower *= glasses.Comp.CorrectionPower; } public void UpdateBlurMagnitude(Entity ent) { if (!Resolve(ent.Owner, ref ent.Comp, false)) return; var ev = new GetBlurEvent(ent.Comp.EyeDamage); RaiseLocalEvent(ent, ev); var blur = Math.Clamp(ev.Blur, 0, BlurryVisionComponent.MaxMagnitude); if (blur <= 0) { RemCompDeferred(ent); return; } var blurry = EnsureComp(ent); blurry.Magnitude = blur; blurry.CorrectionPower = ev.CorrectionPower; Dirty(ent, blurry); } private void OnGlassesEquipped(Entity glasses, ref GotEquippedEvent args) { UpdateBlurMagnitude(args.Equipee); } private void OnGlassesUnequipped(Entity glasses, ref GotUnequippedEvent args) { UpdateBlurMagnitude(args.Equipee); } } public sealed class GetBlurEvent : EntityEventArgs, IInventoryRelayEvent { public readonly float BaseBlur; public float Blur; public float CorrectionPower = BlurryVisionComponent.DefaultCorrectionPower; public GetBlurEvent(float blur) { Blur = blur; BaseBlur = blur; } public SlotFlags TargetSlots => SlotFlags.HEAD | SlotFlags.MASK | SlotFlags.EYES; }