using Content.Shared.Drugs; using Content.Shared.StatusEffectNew; using Robust.Client.Graphics; using Robust.Client.Player; using Robust.Shared.Player; using Robust.Shared.Random; namespace Content.Client.Drugs; /// /// System to handle drug related overlays. /// public sealed class DrugOverlaySystem : EntitySystem { [Dependency] private readonly IPlayerManager _player = default!; [Dependency] private readonly IOverlayManager _overlayMan = default!; [Dependency] private readonly IRobustRandom _random = default!; private RainbowOverlay _overlay = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnApplied); SubscribeLocalEvent(OnRemoved); SubscribeLocalEvent>(OnPlayerAttached); SubscribeLocalEvent>(OnPlayerDetached); _overlay = new(); } private void OnRemoved(Entity ent, ref StatusEffectRemovedEvent args) { if (_player.LocalEntity != args.Target) return; _overlay.Intoxication = 0; _overlay.TimeTicker = 0; _overlayMan.RemoveOverlay(_overlay); } private void OnApplied(Entity ent, ref StatusEffectAppliedEvent args) { if (_player.LocalEntity != args.Target) return; _overlay.Phase = _random.NextFloat(MathF.Tau); // random starting phase for movement effect _overlayMan.AddOverlay(_overlay); } private void OnPlayerAttached(Entity ent, ref StatusEffectRelayedEvent args) { _overlayMan.AddOverlay(_overlay); } private void OnPlayerDetached(Entity ent, ref StatusEffectRelayedEvent args) { _overlay.Intoxication = 0; _overlay.TimeTicker = 0; _overlayMan.RemoveOverlay(_overlay); } }