using Content.Server._DV.CosmicCult.Components; using Content.Server.Actions; using Content.Server.Atmos.Components; using Content.Server.Bible.Components; using Content.Server.Popups; using Content.Shared._DV.CosmicCult; using Content.Shared._DV.CosmicCult.Components; using Content.Shared.DoAfter; using Content.Shared.IdentityManagement; using Content.Shared.Interaction; using Content.Shared.Popups; using Robust.Shared.Audio.Systems; namespace Content.Server._DV.CosmicCult.EntitySystems; public sealed class CosmicRiftSystem : EntitySystem { [Dependency] private readonly ActionsSystem _actions = default!; [Dependency] private readonly SharedAudioSystem _audio = default!; [Dependency] private readonly SharedDoAfterSystem _doAfter = default!; [Dependency] private readonly PopupSystem _popup = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnInteract); SubscribeLocalEvent(OnInteractUsing); SubscribeLocalEvent(OnAbsorbDoAfter); SubscribeLocalEvent(OnPurgeDoAfter); } private void OnInteract(Entity uid, ref InteractHandEvent args) { if (args.Handled || uid.Comp.Occupied) { _popup.PopupEntity(Loc.GetString("cosmiccult-rift-inuse"), args.User, args.User); return; } if (HasComp(args.User)) { _popup.PopupEntity(Loc.GetString("cosmiccult-rift-chaplainoops"), args.User, args.User); return; } if (!TryComp(args.User, out var cultist)) { _popup.PopupEntity(Loc.GetString("cosmiccult-rift-invaliduser"), args.User, args.User); return; } if (cultist.CosmicEmpowered) { _popup.PopupEntity(Loc.GetString("cosmiccult-rift-alreadyempowered"), args.User, args.User); return; } if (cultist.WasEmpowered) { _popup.PopupEntity(Loc.GetString("cosmiccult-rift-wasempowered"), args.User, args.User); return; } args.Handled = true; uid.Comp.Occupied = true; _popup.PopupEntity(Loc.GetString("cosmiccult-rift-beginabsorb"), args.User, args.User); var doargs = new DoAfterArgs(EntityManager, args.User, uid.Comp.AbsorbTime, new EventAbsorbRiftDoAfter(), args.User, uid) { DistanceThreshold = 1.5f, Hidden = true, BreakOnDamage = true, BreakOnHandChange = true, BreakOnMove = true, MovementThreshold = 0.5f, }; _doAfter.TryStartDoAfter(doargs); } private void OnInteractUsing(Entity uid, ref InteractUsingEvent args) { if (args.Handled || uid.Comp.Occupied) { _popup.PopupEntity(Loc.GetString("cosmiccult-rift-inuse"), args.User, args.User); return; } if (HasComp(args.Used)) { uid.Comp.Occupied = true; _popup.PopupEntity(Loc.GetString("cosmiccult-rift-beginpurge"), args.User, args.User); var doargs = new DoAfterArgs(EntityManager, args.User, uid.Comp.BibleTime, new EventPurgeRiftDoAfter(), uid, uid) { DistanceThreshold = 1.5f, Hidden = false, BreakOnDamage = true, BreakOnDropItem = true, BreakOnMove = true, MovementThreshold = 2f, }; _doAfter.TryStartDoAfter(doargs); } else if (TryComp(args.Used, out var comp) && comp.CanPurge) { uid.Comp.Occupied = true; _popup.PopupEntity(Loc.GetString("cosmiccult-rift-beginpurge"), args.User, args.User); var doargs = new DoAfterArgs(EntityManager, args.User, uid.Comp.ChaplainTime, new EventPurgeRiftDoAfter(), uid, uid) { DistanceThreshold = 1.5f, Hidden = false, BreakOnDamage = true, BreakOnDropItem = true, BreakOnMove = true, MovementThreshold = 2f, }; _doAfter.TryStartDoAfter(doargs); } } private void OnAbsorbDoAfter(Entity uid, ref EventAbsorbRiftDoAfter args) { var comp = uid.Comp; if (args.Args.Target is not { } target || args.Cancelled || args.Handled) { if (TryComp(args.Args.Target, out var rift)) rift.Occupied = false; return; } args.Handled = true; var tgtpos = Transform(target).Coordinates; var actionEnt = _actions.AddAction(uid, uid.Comp.CosmicFragmentationAction); Spawn(uid.Comp.AbsorbVFX, tgtpos); comp.ActionEntities.Add(actionEnt); comp.WasEmpowered = true; comp.CosmicEmpowered = true; comp.CosmicSiphonQuantity = 2; comp.CosmicGlareRange = 10; comp.CosmicGlareDuration = TimeSpan.FromSeconds(6); comp.CosmicGlareStun = TimeSpan.FromSeconds(1); comp.CosmicImpositionDuration = TimeSpan.FromSeconds(7.4); comp.CosmicBlankDuration = TimeSpan.FromSeconds(26); comp.CosmicBlankDelay = TimeSpan.FromSeconds(0.4); comp.Respiration = false; EnsureComp(args.User); EnsureComp(args.User); _popup.PopupCoordinates( Loc.GetString("cosmiccult-rift-absorb", ("NAME", Identity.Entity(args.Args.User, EntityManager))), Transform(args.Args.User).Coordinates, PopupType.MediumCaution); QueueDel(target); } private void OnPurgeDoAfter(Entity uid, ref EventPurgeRiftDoAfter args) { if (args.Args.Target == null || args.Cancelled || args.Handled) { uid.Comp.Occupied = false; return; } args.Handled = true; var tgtpos = Transform(uid).Coordinates; Spawn(uid.Comp.PurgeVFX, tgtpos); _audio.PlayPvs(uid.Comp.PurgeSound, args.User); _popup.PopupCoordinates( Loc.GetString("cosmiccult-rift-purge", ("NAME", Identity.Entity(args.Args.User, EntityManager))), Transform(args.Args.User).Coordinates, PopupType.Medium); QueueDel(uid); } }