DoAfter support for Actions (#38253)

* Adds Action DoAfter Events

* Adds DoAfterArgs fields to DoAfterComp

* Adds a base doafter action

* Adds Attempt action doafter logic

* Adds doafter logic to actions

* Changes Action Attempt Doafter and action doafter to take in Performer and the original use delay. Use delay now triggers when a repeated action  is cancelled.

* Readds the TryPerformAction method and readds request perform action into the action doafter events

* Adds a force skip to DoAfter Cancel so we can skip the complete check

* Adds a Delay Reduction field to the comp and to the comp state

* Fixes doafter mispredict, changes doafter comp check to a guard clause, sets delay reduction if it exists.

* Cancels ActionDoAfter if charges is 0

* Serializes Attempt Frequency

* Comment for rework

* Changes todo into a comment

* Moves doafterargs to doafterargscomp

* Adds DoAfterArgs comp to BaseDoAfterAction

* Removes unused trycomp with actionDoAfter

* Replaces DoAfterRepateUseDelay const with timespan.zero

* Removes unused usings

* Makes SharedActionsSystem partial, adds DoAfter partial class to ActionSystem, moves ActionDoAfter logic to the SharedActionsSystem.DoAfter class

* Cleanup and prediction

* Renames OnActionDoAfterAttempt to OnActionDoAfter, moves both to Shared Action DoAfter

* Removes ActionAttemptDoAfterEvent and moves its summaries to ActionDoAfterEvent. Converts OnActionDoAfterAttempt into TryStartActionDoAfter

* Removes Extra check for charges and actiondoafters

* Sloptimization

* Cleanup

* Cleanup

* Adds param descs

---------

Co-authored-by: Princess Cheeseballs <66055347+Pronana@users.noreply.github.com>
This commit is contained in:
keronshb
2025-09-08 05:55:13 -04:00
committed by GitHub
parent 88e927f10a
commit f885075d2e
8 changed files with 294 additions and 24 deletions

View File

@@ -29,6 +29,7 @@ public abstract partial class SharedDoAfterSystem : EntitySystem
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<DoAfterComponent, DamageChangedEvent>(OnDamage);
SubscribeLocalEvent<DoAfterComponent, EntityUnpausedEvent>(OnUnpaused);
SubscribeLocalEvent<DoAfterComponent, ComponentGetState>(OnDoAfterGetState);
@@ -313,16 +314,16 @@ public abstract partial class SharedDoAfterSystem : EntitySystem
/// <summary>
/// Cancels an active DoAfter.
/// </summary>
public void Cancel(DoAfterId? id, DoAfterComponent? comp = null)
public void Cancel(DoAfterId? id, DoAfterComponent? comp = null, bool force = false)
{
if (id != null)
Cancel(id.Value.Uid, id.Value.Index, comp);
Cancel(id.Value.Uid, id.Value.Index, comp, force);
}
/// <summary>
/// Cancels an active DoAfter.
/// </summary>
public void Cancel(EntityUid entity, ushort id, DoAfterComponent? comp = null)
public void Cancel(EntityUid entity, ushort id, DoAfterComponent? comp = null, bool force = false)
{
if (!Resolve(entity, ref comp, false))
return;
@@ -333,13 +334,13 @@ public abstract partial class SharedDoAfterSystem : EntitySystem
return;
}
InternalCancel(doAfter, comp);
InternalCancel(doAfter, comp, force: force);
Dirty(entity, comp);
}
private void InternalCancel(DoAfter doAfter, DoAfterComponent component)
private void InternalCancel(DoAfter doAfter, DoAfterComponent component, bool force = false)
{
if (doAfter.Cancelled || doAfter.Completed)
if (doAfter.Cancelled || (doAfter.Completed && !force))
return;
// Caller is responsible for dirtying the component.