DoAfter Refactor (#13225)
Co-authored-by: DrSmugleaf <drsmugleaf@gmail.com>
This commit is contained in:
@@ -1,15 +1,13 @@
|
||||
using System.Threading;
|
||||
using Content.Server.DoAfter;
|
||||
using Content.Server.Medical.Components;
|
||||
using Content.Server.Disease;
|
||||
using Content.Server.Popups;
|
||||
using Content.Shared.Damage;
|
||||
using Content.Shared.DoAfter;
|
||||
using Content.Shared.IdentityManagement;
|
||||
using Content.Shared.Interaction;
|
||||
using Content.Shared.Mobs.Components;
|
||||
using Content.Shared.Audio;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Player;
|
||||
using static Content.Shared.MedicalScanner.SharedHealthAnalyzerComponent;
|
||||
|
||||
namespace Content.Server.Medical
|
||||
@@ -20,14 +18,14 @@ namespace Content.Server.Medical
|
||||
[Dependency] private readonly DiseaseSystem _disease = default!;
|
||||
[Dependency] private readonly DoAfterSystem _doAfterSystem = default!;
|
||||
[Dependency] private readonly PopupSystem _popupSystem = default!;
|
||||
[Dependency] private readonly UserInterfaceSystem _uiSystem = default!;
|
||||
|
||||
public override void Initialize()
|
||||
{
|
||||
base.Initialize();
|
||||
SubscribeLocalEvent<HealthAnalyzerComponent, ActivateInWorldEvent>(HandleActivateInWorld);
|
||||
SubscribeLocalEvent<HealthAnalyzerComponent, AfterInteractEvent>(OnAfterInteract);
|
||||
SubscribeLocalEvent<TargetScanSuccessfulEvent>(OnTargetScanSuccessful);
|
||||
SubscribeLocalEvent<ScanCancelledEvent>(OnScanCancelled);
|
||||
SubscribeLocalEvent<HealthAnalyzerComponent, DoAfterEvent>(OnDoAfter);
|
||||
}
|
||||
|
||||
private void HandleActivateInWorld(EntityUid uid, HealthAnalyzerComponent healthAnalyzer, ActivateInWorldEvent args)
|
||||
@@ -37,33 +35,13 @@ namespace Content.Server.Medical
|
||||
|
||||
private void OnAfterInteract(EntityUid uid, HealthAnalyzerComponent healthAnalyzer, AfterInteractEvent args)
|
||||
{
|
||||
if (healthAnalyzer.CancelToken != null)
|
||||
{
|
||||
healthAnalyzer.CancelToken.Cancel();
|
||||
healthAnalyzer.CancelToken = null;
|
||||
if (args.Target == null || !args.CanReach || !HasComp<MobStateComponent>(args.Target))
|
||||
return;
|
||||
}
|
||||
|
||||
if (args.Target == null)
|
||||
return;
|
||||
|
||||
if (!args.CanReach)
|
||||
return;
|
||||
|
||||
if (healthAnalyzer.CancelToken != null)
|
||||
return;
|
||||
|
||||
if (!HasComp<MobStateComponent>(args.Target))
|
||||
return;
|
||||
|
||||
healthAnalyzer.CancelToken = new CancellationTokenSource();
|
||||
|
||||
_audio.PlayPvs(healthAnalyzer.ScanningBeginSound, uid);
|
||||
|
||||
_doAfterSystem.DoAfter(new DoAfterEventArgs(args.User, healthAnalyzer.ScanDelay, healthAnalyzer.CancelToken.Token, target: args.Target)
|
||||
_doAfterSystem.DoAfter(new DoAfterEventArgs(args.User, healthAnalyzer.ScanDelay, target: args.Target, used:uid)
|
||||
{
|
||||
BroadcastFinishedEvent = new TargetScanSuccessfulEvent(args.User, args.Target, healthAnalyzer),
|
||||
BroadcastCancelledEvent = new ScanCancelledEvent(healthAnalyzer),
|
||||
BreakOnTargetMove = true,
|
||||
BreakOnUserMove = true,
|
||||
BreakOnStun = true,
|
||||
@@ -71,37 +49,47 @@ namespace Content.Server.Medical
|
||||
});
|
||||
}
|
||||
|
||||
private void OnTargetScanSuccessful(TargetScanSuccessfulEvent args)
|
||||
private void OnDoAfter(EntityUid uid, HealthAnalyzerComponent component, DoAfterEvent args)
|
||||
{
|
||||
args.Component.CancelToken = null;
|
||||
if (args.Handled || args.Cancelled || args.Args.Target == null)
|
||||
return;
|
||||
|
||||
_audio.PlayPvs(args.Component.ScanningEndSound, args.User);
|
||||
_audio.PlayPvs(component.ScanningEndSound, args.Args.User);
|
||||
|
||||
UpdateScannedUser(args.Component.Owner, args.User, args.Target, args.Component);
|
||||
UpdateScannedUser(uid, args.Args.User, args.Args.Target.Value, component);
|
||||
// Below is for the traitor item
|
||||
// Piggybacking off another component's doafter is complete CBT so I gave up
|
||||
// and put it on the same component
|
||||
if (string.IsNullOrEmpty(args.Component.Disease) || args.Target == null)
|
||||
return;
|
||||
|
||||
_disease.TryAddDisease(args.Target.Value, args.Component.Disease);
|
||||
|
||||
if (args.User == args.Target)
|
||||
if (string.IsNullOrEmpty(component.Disease))
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("disease-scanner-gave-self", ("disease", args.Component.Disease)),
|
||||
args.User, args.User);
|
||||
args.Handled = true;
|
||||
return;
|
||||
}
|
||||
_popupSystem.PopupEntity(Loc.GetString("disease-scanner-gave-other", ("target", Identity.Entity(args.Target.Value, EntityManager)), ("disease", args.Component.Disease)),
|
||||
args.User, args.User);
|
||||
|
||||
_disease.TryAddDisease(args.Args.Target.Value, component.Disease);
|
||||
|
||||
if (args.Args.User == args.Args.Target)
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("disease-scanner-gave-self", ("disease", component.Disease)),
|
||||
args.Args.User, args.Args.User);
|
||||
}
|
||||
|
||||
|
||||
else
|
||||
{
|
||||
_popupSystem.PopupEntity(Loc.GetString("disease-scanner-gave-other", ("target", Identity.Entity(args.Args.Target.Value, EntityManager)),
|
||||
("disease", component.Disease)), args.Args.User, args.Args.User);
|
||||
}
|
||||
|
||||
args.Handled = true;
|
||||
}
|
||||
|
||||
private void OpenUserInterface(EntityUid user, HealthAnalyzerComponent healthAnalyzer)
|
||||
{
|
||||
if (!TryComp<ActorComponent>(user, out var actor))
|
||||
if (!TryComp<ActorComponent>(user, out var actor) || healthAnalyzer.UserInterface == null)
|
||||
return;
|
||||
|
||||
healthAnalyzer.UserInterface?.Open(actor.PlayerSession);
|
||||
_uiSystem.OpenUi(healthAnalyzer.UserInterface ,actor.PlayerSession);
|
||||
}
|
||||
|
||||
public void UpdateScannedUser(EntityUid uid, EntityUid user, EntityUid? target, HealthAnalyzerComponent? healthAnalyzer)
|
||||
@@ -116,35 +104,7 @@ namespace Content.Server.Medical
|
||||
return;
|
||||
|
||||
OpenUserInterface(user, healthAnalyzer);
|
||||
healthAnalyzer.UserInterface?.SendMessage(new HealthAnalyzerScannedUserMessage(target));
|
||||
}
|
||||
|
||||
private static void OnScanCancelled(ScanCancelledEvent args)
|
||||
{
|
||||
args.HealthAnalyzer.CancelToken = null;
|
||||
}
|
||||
|
||||
private sealed class ScanCancelledEvent : EntityEventArgs
|
||||
{
|
||||
public readonly HealthAnalyzerComponent HealthAnalyzer;
|
||||
public ScanCancelledEvent(HealthAnalyzerComponent healthAnalyzer)
|
||||
{
|
||||
HealthAnalyzer = healthAnalyzer;
|
||||
}
|
||||
}
|
||||
|
||||
private sealed class TargetScanSuccessfulEvent : EntityEventArgs
|
||||
{
|
||||
public EntityUid User { get; }
|
||||
public EntityUid? Target { get; }
|
||||
public HealthAnalyzerComponent Component { get; }
|
||||
|
||||
public TargetScanSuccessfulEvent(EntityUid user, EntityUid? target, HealthAnalyzerComponent component)
|
||||
{
|
||||
User = user;
|
||||
Target = target;
|
||||
Component = component;
|
||||
}
|
||||
_uiSystem.SendUiMessage(healthAnalyzer.UserInterface, new HealthAnalyzerScannedUserMessage(target));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user