DoAfter Refactor (#13225)

Co-authored-by: DrSmugleaf <drsmugleaf@gmail.com>
This commit is contained in:
keronshb
2023-02-24 19:01:25 -05:00
committed by GitHub
parent 7a9baa79c2
commit 9ebb452a3c
129 changed files with 2624 additions and 4132 deletions

View File

@@ -1,6 +1,5 @@
using Content.Shared.Popups;
using Content.Shared.Damage;
using Content.Server.DoAfter;
using Content.Shared.Revenant;
using Robust.Shared.Random;
using Robust.Shared.Map;
@@ -19,6 +18,7 @@ using Content.Shared.Bed.Sleep;
using System.Linq;
using Content.Server.Maps;
using Content.Server.Revenant.Components;
using Content.Shared.DoAfter;
using Content.Shared.Emag.Systems;
using Content.Shared.FixedPoint;
using Content.Shared.Humanoid;
@@ -46,10 +46,8 @@ public sealed partial class RevenantSystem
private void InitializeAbilities()
{
SubscribeLocalEvent<RevenantComponent, InteractNoHandEvent>(OnInteract);
SubscribeLocalEvent<RevenantComponent, SoulSearchDoAfterComplete>(OnSoulSearchComplete);
SubscribeLocalEvent<RevenantComponent, SoulSearchDoAfterCancelled>(OnSoulSearchCancelled);
SubscribeLocalEvent<RevenantComponent, HarvestDoAfterComplete>(OnHarvestComplete);
SubscribeLocalEvent<RevenantComponent, HarvestDoAfterCancelled>(OnHarvestCancelled);
SubscribeLocalEvent<RevenantComponent, DoAfterEvent<SoulEvent>>(OnSoulSearch);
SubscribeLocalEvent<RevenantComponent, DoAfterEvent<HarvestEvent>>(OnHarvest);
SubscribeLocalEvent<RevenantComponent, RevenantDefileActionEvent>(OnDefileAction);
SubscribeLocalEvent<RevenantComponent, RevenantOverloadLightsActionEvent>(OnOverloadLightsAction);
@@ -86,26 +84,23 @@ public sealed partial class RevenantSystem
private void BeginSoulSearchDoAfter(EntityUid uid, EntityUid target, RevenantComponent revenant)
{
if (revenant.SoulSearchCancelToken != null)
return;
_popup.PopupEntity(Loc.GetString("revenant-soul-searching", ("target", target)), uid, uid, PopupType.Medium);
revenant.SoulSearchCancelToken = new();
var searchDoAfter = new DoAfterEventArgs(uid, revenant.SoulSearchDuration, revenant.SoulSearchCancelToken.Token, target)
var soulSearchEvent = new SoulEvent();
var searchDoAfter = new DoAfterEventArgs(uid, revenant.SoulSearchDuration, target:target)
{
BreakOnUserMove = true,
DistanceThreshold = 2,
UserFinishedEvent = new SoulSearchDoAfterComplete(target),
UserCancelledEvent = new SoulSearchDoAfterCancelled(),
DistanceThreshold = 2
};
_doAfter.DoAfter(searchDoAfter);
_doAfter.DoAfter(searchDoAfter, soulSearchEvent);
}
private void OnSoulSearchComplete(EntityUid uid, RevenantComponent component, SoulSearchDoAfterComplete args)
private void OnSoulSearch(EntityUid uid, RevenantComponent component, DoAfterEvent<SoulEvent> args)
{
if (!TryComp<EssenceComponent>(args.Target, out var essence))
if (args.Handled || args.Cancelled)
return;
if (!TryComp<EssenceComponent>(args.Args.Target, out var essence))
return;
component.SoulSearchCancelToken = null;
essence.SearchComplete = true;
string message;
@@ -121,19 +116,13 @@ public sealed partial class RevenantSystem
message = "revenant-soul-yield-average";
break;
}
_popup.PopupEntity(Loc.GetString(message, ("target", args.Target)), args.Target, uid, PopupType.Medium);
}
_popup.PopupEntity(Loc.GetString(message, ("target", args.Args.Target)), args.Args.Target.Value, uid, PopupType.Medium);
private void OnSoulSearchCancelled(EntityUid uid, RevenantComponent component, SoulSearchDoAfterCancelled args)
{
component.SoulSearchCancelToken = null;
args.Handled = true;
}
private void BeginHarvestDoAfter(EntityUid uid, EntityUid target, RevenantComponent revenant, EssenceComponent essence)
{
if (revenant.HarvestCancelToken != null)
return;
if (essence.Harvested)
{
_popup.PopupEntity(Loc.GetString("revenant-soul-harvested"), target, uid, PopupType.SmallCaution);
@@ -146,14 +135,13 @@ public sealed partial class RevenantSystem
return;
}
revenant.HarvestCancelToken = new();
var doAfter = new DoAfterEventArgs(uid, revenant.HarvestDebuffs.X, revenant.HarvestCancelToken.Token, target)
var harvestEvent = new HarvestEvent();
var doAfter = new DoAfterEventArgs(uid, revenant.HarvestDebuffs.X, target:target)
{
DistanceThreshold = 2,
BreakOnUserMove = true,
NeedHand = false,
UserFinishedEvent = new HarvestDoAfterComplete(target),
UserCancelledEvent = new HarvestDoAfterCancelled(),
NeedHand = false
};
_appearance.SetData(uid, RevenantVisuals.Harvesting, true);
@@ -162,29 +150,37 @@ public sealed partial class RevenantSystem
target, PopupType.Large);
TryUseAbility(uid, revenant, 0, revenant.HarvestDebuffs);
_doAfter.DoAfter(doAfter);
_doAfter.DoAfter(doAfter, harvestEvent);
}
private void OnHarvestComplete(EntityUid uid, RevenantComponent component, HarvestDoAfterComplete args)
private void OnHarvest(EntityUid uid, RevenantComponent component, DoAfterEvent<HarvestEvent> args)
{
component.HarvestCancelToken = null;
_appearance.SetData(uid, RevenantVisuals.Harvesting, false);
if (args.Cancelled)
{
_appearance.SetData(uid, RevenantVisuals.Harvesting, false);
return;
}
if (!TryComp<EssenceComponent>(args.Target, out var essence))
if (args.Handled || args.Args.Target == null)
return;
_popup.PopupEntity(Loc.GetString("revenant-soul-finish-harvest", ("target", args.Target)),
args.Target, PopupType.LargeCaution);
_appearance.SetData(uid, RevenantVisuals.Harvesting, false);
if (!TryComp<EssenceComponent>(args.Args.Target, out var essence))
return;
_popup.PopupEntity(Loc.GetString("revenant-soul-finish-harvest", ("target", args.Args.Target)),
args.Args.Target.Value, PopupType.LargeCaution);
essence.Harvested = true;
ChangeEssenceAmount(uid, essence.EssenceAmount, component);
_store.TryAddCurrency(new Dictionary<string, FixedPoint2>
{ {component.StolenEssenceCurrencyPrototype, essence.EssenceAmount} }, uid);
if (!HasComp<MobStateComponent>(args.Target))
if (!HasComp<MobStateComponent>(args.Args.Target))
return;
if (_mobState.IsAlive(args.Target) || _mobState.IsCritical(args.Target))
if (_mobState.IsAlive(args.Args.Target.Value) || _mobState.IsCritical(args.Args.Target.Value))
{
_popup.PopupEntity(Loc.GetString("revenant-max-essence-increased"), uid, uid);
component.EssenceRegenCap += component.MaxEssenceUpgradeAmount;
@@ -192,17 +188,13 @@ public sealed partial class RevenantSystem
//KILL THEMMMM
if (!_mobThresholdSystem.TryGetThresholdForState(args.Target, MobState.Dead, out var damage))
if (!_mobThresholdSystem.TryGetThresholdForState(args.Args.Target.Value, MobState.Dead, out var damage))
return;
DamageSpecifier dspec = new();
dspec.DamageDict.Add("Poison", damage.Value);
_damage.TryChangeDamage(args.Target, dspec, true, origin: uid);
}
_damage.TryChangeDamage(args.Args.Target, dspec, true, origin: uid);
private void OnHarvestCancelled(EntityUid uid, RevenantComponent component, HarvestDoAfterCancelled args)
{
component.HarvestCancelToken = null;
_appearance.SetData(uid, RevenantVisuals.Harvesting, false);
args.Handled = true;
}
private void OnDefileAction(EntityUid uid, RevenantComponent component, RevenantDefileActionEvent args)
@@ -335,4 +327,14 @@ public sealed partial class RevenantSystem
_emag.DoEmagEffect(ent, ent); //it emags itself. spooky.
}
}
private sealed class SoulEvent : EntityEventArgs
{
}
private sealed class HarvestEvent : EntityEventArgs
{
}
}