TellMeWhen

TellMeWhen

25M Downloads

Race condition when processing multiple combat event at the same time

Kyrios0 opened this issue · 2 comments

commented

WoW Version

Retail

TellMeWhen Version

11.1.4

Describe the bug

I'm a TellMeWhen user and I really appreciate this powerful addon — it's been incredibly useful for tracking various buffs.

I’ve run into an issue that I hope you can help me understand. I'm using Event Icons for Pack Leader BM Hunter to detect when specific buffs are removed via combat log events. Let’s call the buffs X and Y, and their corresponding icons A and B. I also have a Meta Icon that displays whichever of A or B was triggered most recently (based on the largest timer).

This generally works well, but I’ve noticed a problem when both buffs (X and Y) are removed simultaneously — for example, within the same GCD. In those cases, both A and B are triggered in the same moment, yet A consistently shows in the Meta Icon, even though I added a condition to A to ensure it only triggers if B was not triggered within the last 1 second (so I added a timer to B which will reset to 0 for combat event triggered each time, and add condition Timer(B) > 1.0 to A).

From this behavior, it seems like B is processed before A, so by the time A evaluates its condition, B's timer is already running — even though they technically fired at the same time.

Is this expected behavior due to how TMW processes icon updates within a frame? And is there a recommended way to handle simultaneous events like this, where I need one icon to suppress itself if another event occurred in the same moment? Since these icons are cyclic depends on each other, for example: A -> B -> C -> A so I can not easily give them some priority by adjust the timer.

Thanks again for maintaining such a great addon — I’d really appreciate any insight you can offer!

Export Strings

^1^T^SGUID^STMW:group:1eMXFog2YZaW ^SPoint^T ^Sy^F-5746767173779456 ^f-46^Sx ^F8960291232546816^f-46 ^Spoint^STOPLEFT ^SrelativePoint^STOPLEFT ^t^SEnabledSpecs^T ^N254^b ^N255^b ^t^SIcons^T ^N1^T ^SSort^N1 ^SType^Smeta ^SIcons^T ^N1^STMW:icon:1eMY5f743zKE ^N2^STMW:icon:1eMXFog9YF82 ^N3^STMW:icon:1eMY5f7C89G4 ^t^SEnabled^B ^t^N2^T ^SType^Scleu ^SCLEUDur^N21300 ^SGUID^STMW:icon:1eMY5f743zKE ^SName^S471878 ^SShowTimerText^B ^SConditions^T ^N1^T ^SType^STIMER ^SOperator^S>= ^SLevel^F6305039478318695 ^f-52^SName ^Szhu^t ^N2^T ^SType^SCOUNTER ^SAndOr^SOR ^SName^Slong ^t^Sn^N2 ^t^SEnabled^B ^SEvents^T ^N1^T ^STimerOperation^Srestart ^SType^STimer ^SCounter^Slong ^SEvent^SOnCLEUEvent ^t^N2^T ^SType^SCounter ^SCounter^Slong ^SEvent^SOnCLEUEvent ^t^N3^T ^SType^SCounter ^SCounterOperation^S= ^SEvent^SOnFinish ^SCounterAmt^N0 ^SCounter^Slong ^t^N4^T ^SType^SCounter ^SCounter^Slong ^SCounterAmt^N0 ^SCounterOperation^S= ^SEvent^SOnEventsRestored ^t^Sn^N4 ^t^SSettingsPerView^T ^Sicon^T ^STexts^T ^N1^S[Counter("long")] ^N2^S[Timer("long"):TMWFormatDuration] ^t^t^t^SOnlyIfConditions^B ^SCustomTex^S472324 ^SStates^T ^N102^T ^SAlpha^N0.5 ^t^t^SDestUnit^Splayer ^SCLEUEvents^T ^SSPELL_AURA_REMOVED^B ^t^t^N3^T ^SType^Scleu ^SCLEUDur^N21300 ^SGUID^STMW:icon:1eMXFog9YF82 ^SName^S472324 ^SShowTimerText^B ^SConditions^T ^N1^T ^SType^STIMER ^SOperator^S>= ^SLevel^F6305039478318695 ^f-52^SName ^Sxiong^t ^N2^T ^SType^SCOUNTER ^SAndOr^SOR ^SName^Szhu ^t^Sn^N2 ^t^SEnabled^B ^SEvents^T ^N1^T ^STimerOperation^Srestart ^SType^STimer ^SCounter^Szhu ^SEvent^SOnCLEUEvent ^t^N2^T ^SType^SCounter ^SCounter^Szhu ^SEvent^SOnCLEUEvent ^t^N3^T ^SType^SCounter ^SCounterOperation^S= ^SEvent^SOnFinish ^SCounterAmt^N0 ^SCounter^Szhu ^t^N4^T ^SType^SCounter ^SCounter^Szhu ^SCounterAmt^N0 ^SCounterOperation^S= ^SEvent^SOnEventsRestored ^t^Sn^N4 ^t^SSettingsPerView^T ^Sicon^T ^STexts^T ^N1^S[Counter("zhu")] ^N2^S[Timer("zhu"):TMWFormatDuration] ^t^t^t^SDestUnit^Splayer ^SCustomTex^S472325 ^SStates^T ^N102^T ^SAlpha^N0.5 ^t^t^SOnlyIfConditions^B ^SCLEUEvents^T ^SSPELL_AURA_REMOVED^B ^t^t^N4^T ^SType^Scleu ^SConditions^T ^N1^T ^SType^STIMER ^SOperator^S>= ^SLevel^F6305039478318695 ^f-52^SName ^Slong^t ^N2^T ^SType^SCOUNTER ^SAndOr^SOR ^SName^Sxiong ^t^Sn^N2 ^t^SCLEUDur^N21300 ^SShowTimerText^B ^SName^S472325 ^SEvents^T ^N1^T ^STimerOperation^Srestart ^SType^STimer ^SCounter^Sxiong ^SEvent^SOnCLEUEvent ^t^N2^T ^SType^SCounter ^SCounter^Sxiong ^SEvent^SOnCLEUEvent ^t^N3^T ^SType^SCounter ^SCounterOperation^S= ^SEvent^SOnFinish ^SCounterAmt^N0 ^SCounter^Sxiong ^t^N4^T ^SType^SCounter ^SCounter^Sxiong ^SCounterAmt^N0 ^SCounterOperation^S= ^SEvent^SOnEventsRestored ^t^Sn^N4 ^t^SEnabled^B ^SGUID^STMW:icon:1eMY5f7C89G4 ^SSettingsPerView^T ^Sicon^T ^STexts^T ^N1^S[Counter("xiong")] ^N2^S[Timer("xiong"):TMWFormatDuration] ^t^t^t^SOnlyIfConditions^B ^SCustomTex^S471878 ^SStates^T ^N102^T ^SAlpha^N0.5 ^t^t^SDestUnit^Splayer ^SCLEUEvents^T ^SSPELL_AURA_REMOVED^B ^t^t^t^SName^SPL ^t^N11010401^S~`~| ^Sgroup^N10 ^^
commented

I see. Thank you for explaination!

This sounds like an out-of-scope issue. I will close the issue then.

commented

Conditions for the "Only if Conditions Passing" setting on Combat Event icons aren't evaluated eagerly on each combat event. They're only evaluated on the regular TMW update intervals, so they won't pick anything up that happens in the middle of that.