mirror of
https://github.com/WWhiteDreamProject/wwdpublic.git
synced 2026-04-18 22:18:52 +03:00
# Description
This PR fixes, refactors, and reworks the old Psionic Invisibility
Power, in order to make it comply with standards set by Psionic Refactor
V2. It's not at the level of V3, but I honestly don't care to since V3
is also deprecated now anyways. The newly reworked invisibility has
actual casting stat scaling with psionic amplification and dampening,
with a variably set duration and casting cooldown. It also now has new
exit conditions that deprecates the need to make it pacify the caster.
Yes I actually have tested and verified that this power works correctly.
# Changelog
🆑
- add: Reworked and fixed Psionic Invisibility. It now has actual
psychic casting stat scaling.
(cherry picked from commit 6674ec31a1d13be2d7d3ebb7ef452710d85bfe90)
129 lines
5.2 KiB
C#
129 lines
5.2 KiB
C#
using Content.Shared.Abilities.Psionics;
|
|
using Content.Server.Abilities.Psionics;
|
|
using Content.Shared.Eye;
|
|
using Robust.Shared.Containers;
|
|
using Robust.Shared.Player;
|
|
using Robust.Server.GameObjects;
|
|
using Content.Shared.NPC.Systems;
|
|
using Content.Shared.Psionics;
|
|
|
|
namespace Content.Server.Psionics
|
|
{
|
|
public sealed class PsionicInvisibilitySystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly VisibilitySystem _visibilitySystem = default!;
|
|
[Dependency] private readonly PsionicInvisibilityPowerSystem _invisSystem = default!;
|
|
[Dependency] private readonly NpcFactionSystem _npcFactonSystem = default!;
|
|
[Dependency] private readonly SharedEyeSystem _eye = default!;
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
/// Masking
|
|
SubscribeLocalEvent<ActorComponent, ComponentInit>(OnInit);
|
|
SubscribeLocalEvent<PsionicInsulationComponent, ComponentInit>(OnInsulInit);
|
|
SubscribeLocalEvent<PsionicInsulationComponent, ComponentShutdown>(OnInsulShutdown);
|
|
|
|
/// Layer
|
|
SubscribeLocalEvent<PsionicallyInvisibleComponent, ComponentStartup>(OnInvisInit);
|
|
SubscribeLocalEvent<PsionicallyInvisibleComponent, ComponentShutdown>(OnInvisShutdown);
|
|
|
|
// PVS Stuff
|
|
SubscribeLocalEvent<PsionicallyInvisibleComponent, EntInsertedIntoContainerMessage>(OnEntInserted);
|
|
SubscribeLocalEvent<PsionicallyInvisibleComponent, EntRemovedFromContainerMessage>(OnEntRemoved);
|
|
}
|
|
|
|
private void OnInit(EntityUid uid, ActorComponent component, ComponentInit args)
|
|
{
|
|
if (!HasComp<PsionicInsulationComponent>(uid))
|
|
SetCanSeePsionicInvisiblity(uid, false);
|
|
}
|
|
|
|
private void OnInsulInit(EntityUid uid, PsionicInsulationComponent component, ComponentInit args)
|
|
{
|
|
if (HasComp<PsionicInvisibilityUsedComponent>(uid))
|
|
_invisSystem.ToggleInvisibility(uid);
|
|
|
|
if (_npcFactonSystem.ContainsFaction(uid, "PsionicInterloper"))
|
|
{
|
|
component.SuppressedFactions.Add("PsionicInterloper");
|
|
_npcFactonSystem.RemoveFaction(uid, "PsionicInterloper");
|
|
}
|
|
|
|
if (_npcFactonSystem.ContainsFaction(uid, "GlimmerMonster"))
|
|
{
|
|
component.SuppressedFactions.Add("GlimmerMonster");
|
|
_npcFactonSystem.RemoveFaction(uid, "GlimmerMonster");
|
|
}
|
|
|
|
SetCanSeePsionicInvisiblity(uid, true);
|
|
}
|
|
|
|
private void OnInsulShutdown(EntityUid uid, PsionicInsulationComponent component, ComponentShutdown args)
|
|
{
|
|
SetCanSeePsionicInvisiblity(uid, false);
|
|
|
|
if (!HasComp<PsionicComponent>(uid))
|
|
{
|
|
component.SuppressedFactions.Clear();
|
|
return;
|
|
}
|
|
|
|
foreach (var faction in component.SuppressedFactions)
|
|
{
|
|
_npcFactonSystem.AddFaction(uid, faction);
|
|
}
|
|
component.SuppressedFactions.Clear();
|
|
}
|
|
|
|
private void OnInvisInit(EntityUid uid, PsionicallyInvisibleComponent component, ComponentStartup args)
|
|
{
|
|
var visibility = EntityManager.EnsureComponent<VisibilityComponent>(uid);
|
|
|
|
_visibilitySystem.AddLayer((uid, visibility), (int) VisibilityFlags.PsionicInvisibility, false);
|
|
_visibilitySystem.RemoveLayer((uid, visibility), (int) VisibilityFlags.Normal, false);
|
|
_visibilitySystem.RefreshVisibility(uid, visibility);
|
|
SetCanSeePsionicInvisiblity(uid, true);
|
|
}
|
|
|
|
|
|
private void OnInvisShutdown(EntityUid uid, PsionicallyInvisibleComponent component, ComponentShutdown args)
|
|
{
|
|
if (TryComp<VisibilityComponent>(uid, out var visibility))
|
|
{
|
|
_visibilitySystem.RemoveLayer((uid, visibility), (int) VisibilityFlags.PsionicInvisibility, false);
|
|
_visibilitySystem.AddLayer((uid, visibility), (int) VisibilityFlags.Normal, false);
|
|
_visibilitySystem.RefreshVisibility(uid, visibility);
|
|
SetCanSeePsionicInvisiblity(uid, false);
|
|
}
|
|
}
|
|
|
|
private void OnEntInserted(EntityUid uid, PsionicallyInvisibleComponent component, EntInsertedIntoContainerMessage args)
|
|
{
|
|
DirtyEntity(args.Entity);
|
|
}
|
|
|
|
private void OnEntRemoved(EntityUid uid, PsionicallyInvisibleComponent component, EntRemovedFromContainerMessage args)
|
|
{
|
|
DirtyEntity(args.Entity);
|
|
}
|
|
|
|
public void SetCanSeePsionicInvisiblity(EntityUid uid, bool set)
|
|
{
|
|
if (set == true)
|
|
{
|
|
if (EntityManager.TryGetComponent(uid, out EyeComponent? eye))
|
|
{
|
|
_eye.SetVisibilityMask(uid, eye.VisibilityMask | (int) VisibilityFlags.PsionicInvisibility, eye);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (EntityManager.TryGetComponent(uid, out EyeComponent? eye))
|
|
{
|
|
_eye.SetVisibilityMask(uid, eye.VisibilityMask & ~(int) VisibilityFlags.PsionicInvisibility, eye);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|