diff --git a/Content.Client/DoAfter/DoAfterSystem.cs b/Content.Client/DoAfter/DoAfterSystem.cs
index 31315ab86c..c28b79a664 100644
--- a/Content.Client/DoAfter/DoAfterSystem.cs
+++ b/Content.Client/DoAfter/DoAfterSystem.cs
@@ -175,9 +175,7 @@ namespace Content.Client.DoAfter
/// Mark a DoAfter as cancelled and show a cancellation graphic.
///
/// Actual removal is handled by DoAfterEntitySystem.
- ///
- ///
- public void Cancel(DoAfterComponent component, byte id, TimeSpan? currentTime = null)
+ public void Cancel(DoAfterComponent component, byte id)
{
foreach (var (_, cancelled) in component.CancelledDoAfters)
{
@@ -204,7 +202,7 @@ namespace Content.Client.DoAfter
return;
// ReSharper disable once ConvertToLocalFunction
- var predicate = (EntityUid uid, (EntityUid compOwner, EntityUid? attachedEntity) data)
+ var predicate = static (EntityUid uid, (EntityUid compOwner, EntityUid? attachedEntity) data)
=> uid == data.compOwner || uid == data.attachedEntity;
var viewbox = _eyeManager.GetWorldViewport().Enlarged(2.0f);
@@ -213,7 +211,7 @@ namespace Content.Client.DoAfter
foreach (var (comp, xform) in EntityManager.EntityQuery(true))
{
- var doAfters = comp.DoAfters.ToList();
+ var doAfters = comp.DoAfters;
var compPos = xform.MapPosition;
if (doAfters.Count == 0 ||
@@ -239,6 +237,7 @@ namespace Content.Client.DoAfter
Enable(comp);
var userGrid = xform.Coordinates;
+ var toRemove = new RemQueue();
// Check cancellations / finishes
foreach (var (id, doAfter) in doAfters)
@@ -248,7 +247,7 @@ namespace Content.Client.DoAfter
// If we've passed the final time (after the excess to show completion graphic) then remove.
if (elapsedTime > doAfter.Delay + ExcessTime)
{
- Remove(comp, doAfter);
+ toRemove.Add(doAfter);
continue;
}
@@ -261,7 +260,7 @@ namespace Content.Client.DoAfter
{
if (!userGrid.InRange(EntityManager, doAfter.UserGrid, doAfter.MovementThreshold))
{
- Cancel(comp, id, currentTime);
+ Cancel(comp, id);
continue;
}
}
@@ -272,12 +271,17 @@ namespace Content.Client.DoAfter
!Transform(doAfter.Target.Value).Coordinates.InRange(EntityManager, doAfter.TargetGrid,
doAfter.MovementThreshold))
{
- Cancel(comp, id, currentTime);
+ Cancel(comp, id);
continue;
}
}
}
+ foreach (var doAfter in toRemove)
+ {
+ Remove(comp, doAfter);
+ }
+
var count = comp.CancelledDoAfters.Count;
// Remove cancelled DoAfters after ExcessTime has elapsed
for (var i = count - 1; i >= 0; i--)