using Content.Shared._DV.Psionics.Components; using Content.Shared._DV.Psionics.Events; using Content.Shared.Eye; namespace Content.Shared._DV.Psionics.Systems; public abstract partial class SharedPsionicSystem { [Dependency] private readonly SharedEyeSystem _eye = default!; [Dependency] private readonly SharedVisibilitySystem _visibility = default!; private void InitializeInvisibility() { SubscribeLocalEvent(OnInvisInit); SubscribeLocalEvent(OnInvisShutdown); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnSuppression); SubscribeLocalEvent(OnSuppressionStop); SubscribeLocalEvent(OnShielded); SubscribeLocalEvent(OnShieldedStop); } private void OnInvisInit(Entity invisible, ref MapInitEvent args) { if (!CanUsePsionicAbility(invisible)) invisible.Comp.Active = false; SetPsionicInvisibility(invisible.Owner, invisible.Comp.Active); } private void OnInvisShutdown(Entity invisible, ref ComponentShutdown args) { SetPsionicInvisibility(invisible.Owner, false); } private void OnInit(Entity potPsionic, ref MapInitEvent args) { SetCanSeePsionicInvisiblity(potPsionic, false); } private void OnSuppression(Entity invisible, ref PsionicSuppressedEvent args) { invisible.Comp.Active = false; SetPsionicInvisibility(invisible.Owner, invisible.Comp.Active); } private void OnSuppressionStop(Entity invisible, ref PsionicStoppedSuppressedEvent args) { // This event only raises when they can use psionic abilities again, so no need for a check. invisible.Comp.Active = true; SetPsionicInvisibility(invisible.Owner, invisible.Comp.Active); } private void OnShielded(Entity potPsionic, ref PsionicShieldedEvent args) { SetCanSeePsionicInvisiblity(potPsionic, true); } private void OnShieldedStop(Entity potPsionic, ref PsionicStoppedShieldedEvent args) { //This only gets raised when they are no longer shielded, so no need for a check. SetCanSeePsionicInvisiblity(potPsionic, false); } /// /// Enables or disables an entity to see a psionically invisible entity. /// /// The entity whose ability to see psionically invisible entities is being changed. /// Whether they can see psionically invisible entities. public void SetCanSeePsionicInvisiblity(EntityUid potPsionic, bool canSee) { if (!TryComp(potPsionic, out var eye)) return; if (canSee) _eye.SetVisibilityMask(potPsionic, eye.VisibilityMask | (int) VisibilityFlags.PsionicInvisibility, eye); else _eye.SetVisibilityMask(potPsionic, eye.VisibilityMask & ~ (int) VisibilityFlags.PsionicInvisibility, eye); } /// /// Set their psionic invisibility. /// /// The entity that attempts to toggle their psionic invisibility. /// Whether they're visible or invisible. public void SetPsionicInvisibility(Entity visible, bool invisible) { if (invisible) { // Remove them from the normal layer and add them to the psionic layer. _visibility.AddLayer(visible, (int) VisibilityFlags.PsionicInvisibility, false); _visibility.RemoveLayer(visible, (int) VisibilityFlags.Normal); } else { // Remove them from the psionic layer and add them to the normal layer. _visibility.RemoveLayer(visible, (int) VisibilityFlags.PsionicInvisibility, false); _visibility.AddLayer(visible, (int) VisibilityFlags.Normal); } } }