using Content.Server.Doors.Systems; using Content.Shared._DV.CosmicCult; using Content.Shared._DV.CosmicCult.Components; using Content.Shared.DoAfter; using Content.Shared.Doors.Components; using Robust.Shared.Audio.Systems; namespace Content.Server._DV.CosmicCult.Abilities; public sealed class CosmicIngressSystem : EntitySystem { [Dependency] private readonly CosmicCultSystem _cult = default!; [Dependency] private readonly DoorSystem _door = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnCosmicIngress); SubscribeLocalEvent(OnColossusIngress); SubscribeLocalEvent(OnColossusIngressDoAfter); } private void OnCosmicIngress(Entity uid, ref EventCosmicIngress args) { var target = args.Target; if (args.Handled) return; args.Handled = true; if (uid.Comp.CosmicEmpowered && TryComp(target, out var doorBolt)) _door.SetBoltsDown((target, doorBolt), false); _door.StartOpening(target); _audio.PlayPvs(uid.Comp.IngressSFX, uid); Spawn(uid.Comp.AbsorbVFX, Transform(target).Coordinates); _cult.MalignEcho(uid); } private void OnColossusIngress(Entity ent, ref EventCosmicColossusIngress args) { var doargs = new DoAfterArgs(EntityManager, ent, ent.Comp.IngressDoAfter, new EventCosmicColossusIngressDoAfter(), ent, args.Target) { DistanceThreshold = 2f, Hidden = false, BreakOnMove = true, }; args.Handled = true; _audio.PlayPvs(ent.Comp.DoAfterSfx, ent); _doAfter.TryStartDoAfter(doargs); } private void OnColossusIngressDoAfter(Entity ent, ref EventCosmicColossusIngressDoAfter args) { if (args.Args.Target is not { } target) return; if (args.Cancelled || args.Handled) return; args.Handled = true; var comp = ent.Comp; if (TryComp(target, out var doorBolt)) _door.SetBoltsDown((target, doorBolt), false); _door.StartOpening(target); _audio.PlayPvs(comp.IngressSfx, ent); Spawn(comp.CultVfx, Transform(target).Coordinates); } }