DoAfter Refactor (#13225)
Co-authored-by: DrSmugleaf <drsmugleaf@gmail.com>
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user