Fix buff bar: opcode merge, isBuff flag, and duration countdown

Root cause: OpcodeTable::loadFromJson() cleared all mappings before
loading the expansion JSON, so any WotLK opcode absent from Turtle WoW's
opcodes.json (including SMSG_AURA_UPDATE and SMSG_AURA_UPDATE_ALL) was
permanently lost. Changed loadFromJson to patch/merge on top of existing
defaults so only explicitly listed opcodes are overridden.

Also fix isBuff border color: was testing flag 0x02 (effect 2 active)
instead of 0x80 (negative/debuff flag).

Add client-side duration countdown: AuraSlot.receivedAtMs is stamped
when the packet arrives; getRemainingMs(nowMs) subtracts elapsed time so
buff tooltips show accurate remaining duration instead of stale snapshot.
This commit is contained in:
Kelsi 2026-02-17 15:49:12 -08:00
parent df0bfaea4f
commit 55fd692c1a
4 changed files with 32 additions and 9 deletions

View file

@ -4044,7 +4044,7 @@ void GameScreen::renderBuffBar(game::GameHandler& gameHandler) {
ImGui::PushID(static_cast<int>(i));
bool isBuff = (aura.flags & 0x02) != 0;
bool isBuff = (aura.flags & 0x80) == 0; // 0x80 = negative/debuff flag
ImVec4 borderColor = isBuff ? ImVec4(0.2f, 0.8f, 0.2f, 0.9f) : ImVec4(0.8f, 0.2f, 0.2f, 0.9f);
// Try to get spell icon
@ -4078,12 +4078,16 @@ void GameScreen::renderBuffBar(game::GameHandler& gameHandler) {
}
}
// Tooltip with spell name and duration
// Tooltip with spell name and live countdown
if (ImGui::IsItemHovered()) {
std::string name = spellbookScreen.lookupSpellName(aura.spellId, assetMgr);
if (name.empty()) name = "Spell #" + std::to_string(aura.spellId);
if (aura.durationMs > 0) {
int seconds = aura.durationMs / 1000;
uint64_t nowMs = static_cast<uint64_t>(
std::chrono::duration_cast<std::chrono::milliseconds>(
std::chrono::steady_clock::now().time_since_epoch()).count());
int32_t remaining = aura.getRemainingMs(nowMs);
if (remaining > 0) {
int seconds = remaining / 1000;
if (seconds < 60) {
ImGui::SetTooltip("%s (%ds)", name.c_str(), seconds);
} else {