From 1d7eaaf2a0e44357be20aee2329ca48cbeba88bf Mon Sep 17 00:00:00 2001 From: Kelsi Date: Fri, 20 Mar 2026 18:00:57 -0700 Subject: [PATCH] fix: compute aura expirationTime for addon countdown timers The expirationTime field (7th return value of UnitBuff/UnitDebuff/UnitAura) was hardcoded to 0. Now returns GetTime() + remaining seconds, matching WoW's convention where addons compute remaining = expirationTime - GetTime(). Enables buff/debuff timer addons like OmniCC and WeakAuras. --- src/addons/lua_engine.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/addons/lua_engine.cpp b/src/addons/lua_engine.cpp index d13b4333..915dfac9 100644 --- a/src/addons/lua_engine.cpp +++ b/src/addons/lua_engine.cpp @@ -391,7 +391,20 @@ static int lua_UnitAura(lua_State* L, bool wantBuff) { } } lua_pushnumber(L, aura.maxDurationMs > 0 ? aura.maxDurationMs / 1000.0 : 0); // duration - lua_pushnumber(L, 0); // expirationTime (would need absolute time) + // expirationTime: GetTime() + remaining seconds (so addons can compute countdown) + if (aura.durationMs > 0) { + uint64_t auraNowMs = static_cast( + std::chrono::duration_cast( + std::chrono::steady_clock::now().time_since_epoch()).count()); + int32_t remMs = aura.getRemainingMs(auraNowMs); + // GetTime epoch = steady_clock relative to engine start + static auto sStart = std::chrono::steady_clock::now(); + double nowSec = std::chrono::duration( + std::chrono::steady_clock::now() - sStart).count(); + lua_pushnumber(L, nowSec + remMs / 1000.0); + } else { + lua_pushnumber(L, 0); // permanent aura + } // caster: return unit ID string if caster is known if (aura.casterGuid != 0) { if (aura.casterGuid == gh->getPlayerGuid())