You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fix: emote play-timeout watchdog never fires, stranding emote intents
CharacterEmoteIntent.UpdatePlayTimeout had an operator-precedence bug
(`playTimeout?.ElapsedTime ?? 0 + dt` parses as `?? (0 + dt)`) that froze
ElapsedTime at the first frame's dt, so the #6531 60s unstuck timeout never
fired; the tick was also only reachable on one parked sub-path inside
CharacterEmoteSystem.ConsumeEmoteIntent. A scene emote that parks (breaks
mid-cinematic) and is then evicted from the memory-pressure cache sweep
(frequent on Mac) leaves a permanent CharacterEmoteIntent that silently
blocks every user emote until client restart.
Fixes#9485
Related: #6531
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
// Rarely happens for an unknown reason that emote.AssetResults[bodyShape] is null, provoking the emote intent to never finish,
285
+
// thus props of the previous emote cannot be disposed either.
286
+
// By setting a timeout we force unstuck the process
287
+
if(emoteIntent.UpdatePlayTimeout(dt))
288
+
{
289
+
ReportHub.LogError(GetReportData(),$"Cant play emote {emoteId} timeout reached.");
290
+
World.Remove<CharacterEmoteIntent>(entity);
291
+
return;
292
+
}
293
+
283
294
// we wait until the avatar finishes moving to trigger the emote,
284
295
// avoid the case where: you stop moving, trigger the emote, the emote gets triggered and next frame it gets cancelled because inertia keeps moving the avatar
285
296
// We also avoid triggering the emote while the character is jumping or landing, as the landing animation breaks the emote flow if they have props
0 commit comments