134 lines
5.6 KiB
C#
134 lines
5.6 KiB
C#
using System.Collections.Immutable;
|
|
using Content.Server._DV.CosmicCult.Components;
|
|
using Content.Server.Bible.Components;
|
|
using Content.Server.Popups;
|
|
using Content.Shared._DV.CosmicCult;
|
|
using Content.Shared._DV.CosmicCult.Components;
|
|
using Content.Shared._DV.CosmicCult.Components.Examine;
|
|
using Content.Shared.DoAfter;
|
|
using Content.Shared.Effects;
|
|
using Content.Shared.IdentityManagement;
|
|
using Content.Shared.Mind;
|
|
using Content.Shared.Mind.Components;
|
|
using Content.Shared.NPC;
|
|
using Content.Shared.Stunnable;
|
|
using Robust.Shared.Audio;
|
|
using Robust.Shared.Audio.Systems;
|
|
using Robust.Shared.Player;
|
|
using Robust.Shared.Random;
|
|
using Robust.Shared.Timing;
|
|
|
|
namespace Content.Server._DV.CosmicCult.Abilities;
|
|
|
|
public sealed class CosmicBlankSystem : EntitySystem
|
|
{
|
|
[Dependency] private readonly CosmicCultSystem _cult = default!;
|
|
[Dependency] private readonly IGameTiming _timing = default!;
|
|
[Dependency] private readonly IRobustRandom _random = default!;
|
|
[Dependency] private readonly PopupSystem _popup = default!;
|
|
[Dependency] private readonly SharedAudioSystem _audio = default!;
|
|
[Dependency] private readonly SharedColorFlashEffectSystem _color = default!;
|
|
[Dependency] private readonly SharedCosmicCultSystem _cosmicCult = default!;
|
|
[Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
|
|
[Dependency] private readonly SharedMindSystem _mind = default!;
|
|
[Dependency] private readonly SharedStunSystem _stun = default!;
|
|
|
|
public override void Initialize()
|
|
{
|
|
base.Initialize();
|
|
|
|
SubscribeLocalEvent<CosmicCultComponent, EventCosmicBlank>(OnCosmicBlank);
|
|
SubscribeLocalEvent<CosmicCultComponent, EventCosmicBlankDoAfter>(OnCosmicBlankDoAfter);
|
|
}
|
|
|
|
private void OnCosmicBlank(Entity<CosmicCultComponent> uid, ref EventCosmicBlank args)
|
|
{
|
|
if (_cosmicCult.EntityIsCultist(args.Target) || HasComp<CosmicBlankComponent>(args.Target) || HasComp<BibleUserComponent>(args.Target) || HasComp<ActiveNPCComponent>(args.Target))
|
|
{
|
|
_popup.PopupEntity(Loc.GetString("cosmicability-generic-fail"), uid, uid);
|
|
return;
|
|
}
|
|
if (args.Handled)
|
|
return;
|
|
|
|
var doargs = new DoAfterArgs(EntityManager, uid, uid.Comp.CosmicBlankDelay, new EventCosmicBlankDoAfter(), uid, args.Target)
|
|
{
|
|
DistanceThreshold = 1.5f,
|
|
Hidden = false,
|
|
BreakOnDamage = true,
|
|
BreakOnMove = true,
|
|
BreakOnDropItem = true,
|
|
};
|
|
args.Handled = true;
|
|
_doAfter.TryStartDoAfter(doargs);
|
|
_popup.PopupEntity(Loc.GetString("cosmicability-blank-begin", ("target", Identity.Entity(uid, EntityManager))), uid, args.Target);
|
|
}
|
|
|
|
public override void Update(float frameTime)
|
|
{
|
|
base.Update(frameTime);
|
|
|
|
var shuntQuery = EntityQueryEnumerator<InVoidComponent>();
|
|
while (shuntQuery.MoveNext(out var uid, out var comp))
|
|
{
|
|
if (_timing.CurTime >= comp.ExitVoidTime)
|
|
{
|
|
if (!_mind.TryGetMind(uid, out var mindEnt, out var mind))
|
|
continue;
|
|
mind.PreventGhosting = false;
|
|
_mind.TransferTo(mindEnt, comp.OriginalBody);
|
|
RemComp<CosmicBlankComponent>(comp.OriginalBody);
|
|
RemComp<CosmicCultExamineComponent>(comp.OriginalBody);
|
|
_popup.PopupEntity(Loc.GetString("cosmicability-blank-return"), comp.OriginalBody, comp.OriginalBody);
|
|
QueueDel(uid);
|
|
}
|
|
}
|
|
}
|
|
|
|
private void OnCosmicBlankDoAfter(Entity<CosmicCultComponent> uid, ref EventCosmicBlankDoAfter args)
|
|
{
|
|
if (args.Args.Target is not { } target)
|
|
return;
|
|
if (args.Cancelled || args.Handled)
|
|
return;
|
|
args.Handled = true;
|
|
|
|
if (!TryComp<MindContainerComponent>(target, out var mindContainer) || !mindContainer.HasMind)
|
|
{
|
|
return;
|
|
}
|
|
|
|
EnsureComp<CosmicBlankComponent>(target);
|
|
var examine = EnsureComp<CosmicCultExamineComponent>(target);
|
|
examine.CultistText = "cosmic-examine-text-abilityblank";
|
|
|
|
_popup.PopupEntity(Loc.GetString("cosmicability-blank-success", ("target", Identity.Entity(target, EntityManager))), uid, uid);
|
|
var tgtpos = Transform(target).Coordinates;
|
|
var mindEnt = mindContainer.Mind.Value;
|
|
var mind = Comp<MindComponent>(mindEnt);
|
|
var comp = uid.Comp;
|
|
mind.PreventGhosting = true;
|
|
|
|
var spawnPoints = EntityManager.GetAllComponents(typeof(CosmicVoidSpawnComponent)).ToImmutableList();
|
|
if (spawnPoints.IsEmpty)
|
|
{
|
|
return;
|
|
}
|
|
_audio.PlayPvs(comp.BlankSFX, uid, AudioParams.Default.WithVolume(6f));
|
|
Spawn(comp.BlankVFX, tgtpos);
|
|
var newSpawn = _random.Pick(spawnPoints);
|
|
var spawnTgt = Transform(newSpawn.Uid).Coordinates;
|
|
var mobUid = Spawn(comp.SpawnWisp, spawnTgt);
|
|
EnsureComp<InVoidComponent>(mobUid, out var inVoid);
|
|
inVoid.OriginalBody = target;
|
|
inVoid.ExitVoidTime = _timing.CurTime + comp.CosmicBlankDuration;
|
|
_mind.TransferTo(mindEnt, mobUid);
|
|
_stun.TryKnockdown(target, comp.CosmicBlankDuration + TimeSpan.FromSeconds(2), true);
|
|
_popup.PopupEntity(Loc.GetString("cosmicability-blank-transfer"), mobUid, mobUid);
|
|
_audio.PlayPvs(comp.BlankSFX, spawnTgt, AudioParams.Default.WithVolume(6f));
|
|
_color.RaiseEffect(Color.CadetBlue, new List<EntityUid>() { target }, Filter.Pvs(target, entityManager: EntityManager));
|
|
Spawn(comp.BlankVFX, spawnTgt);
|
|
_cult.MalignEcho(uid);
|
|
}
|
|
}
|