using Content.Shared._DV.Psionics.Components; using Content.Shared._DV.Psionics.Components.PsionicPowers; using Content.Shared._DV.Psionics.Events; using Content.Shared._DV.Psionics.Events.PowerActionEvents; using Content.Shared.CombatMode.Pacification; using Content.Shared.Damage.Systems; using Content.Shared.Stealth; using Content.Shared.Stealth.Components; using Content.Shared.Stunnable; using Robust.Shared.Audio.Systems; namespace Content.Shared._DV.Psionics.Systems.PsionicPowers; public sealed class PsionicInvisibilityPowerSystem : BasePsionicPowerSystem { [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedStealthSystem _stealth = default!; [Dependency] private readonly SharedStunSystem _stunSystem = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnShutdown); SubscribeLocalEvent(OnDamageChanged); SubscribeLocalEvent(OnDispelled); } protected override void OnPowerUsed(Entity psionic, ref PsionicInvisibilityPowerActionEvent args) { ToggleInvisibility(args.Performer); AfterPowerUsed(psionic, args.Performer); } private void OnInit(Entity invisible, ref MapInitEvent args) { EnsureComp(invisible); EnsureComp(invisible); var stealth = EnsureComp(invisible); _stealth.SetVisibility(invisible, invisible.Comp.InvisibilityStrength, stealth); _audio.PlayPredicted(invisible.Comp.Sound, invisible, invisible); Psionic.SetCanSeePsionicInvisiblity(invisible, true); } private void OnShutdown(Entity invisible, ref ComponentShutdown args) { if (Terminating(invisible)) return; RemComp(invisible); RemComp(invisible); RemComp(invisible); _audio.PlayPredicted(invisible.Comp.Sound, invisible, invisible); Psionic.SetCanSeePsionicInvisiblity(invisible, false); _stunSystem.TryAddParalyzeDuration(invisible, invisible.Comp.StunDuration); } private void OnDamageChanged(Entity invisible, ref DamageChangedEvent args) { if (!args.DamageIncreased) return; ToggleInvisibility(invisible); } protected override void OnMindBroken(Entity psionic, ref PsionicMindBrokenEvent args) { base.OnMindBroken(psionic, ref args); // If the mindbreak was successful, remove the invisibility component too. if (!psionic.Comp.Deleted) return; RemComp(psionic); } private void OnDispelled(Entity invisible, ref DispelledEvent args) { ToggleInvisibility(invisible); } public void ToggleInvisibility(EntityUid invisible) { if (!RemComp(invisible)) EnsureComp(invisible); } }