From 7d5d80073b375802d2fabdf9ee761bbbfb89bbd8 Mon Sep 17 00:00:00 2001 From: Tercio Jose Date: Fri, 23 Dec 2022 20:33:29 -0300 Subject: [PATCH] More progress on caching stuff; journal links; cooltip hotfixes; code cleanups --- Details.toc | 1 + Libs/DF/cooltip.lua | 10 ++- Libs/DF/fw.lua | 9 +- boot.lua | 81 +++++++++++++++++ core/meta.lua | 110 +++++++++++------------ core/parser.lua | 177 ++++++++++++++++++++------------------ functions/boss.lua | 19 +++- functions/journal.lua | 141 ++++++++++++++++++++++++++++++ functions/playerclass.lua | 24 +++--- startup.lua | 5 +- 10 files changed, 416 insertions(+), 161 deletions(-) create mode 100644 functions/journal.lua diff --git a/Details.toc b/Details.toc index f93a2a15..d739c0e9 100644 --- a/Details.toc +++ b/Details.toc @@ -62,6 +62,7 @@ functions\testbars.lua functions\editmode.lua functions\warcraftlogs.lua functions\textures.lua +functions\journal.lua core\timemachine.lua diff --git a/Libs/DF/cooltip.lua b/Libs/DF/cooltip.lua index 36fc756f..2f25a847 100644 --- a/Libs/DF/cooltip.lua +++ b/Libs/DF/cooltip.lua @@ -15,7 +15,7 @@ local max = math.max --api locals local PixelUtil = PixelUtil or DFPixelUtil -local version = 11 +local version = 12 local CONST_MENU_TYPE_MAINMENU = "main" local CONST_MENU_TYPE_SUBMENU = "sub" @@ -2649,10 +2649,12 @@ function DF:CreateCoolTip() if (anchor and index == 1) then local myAnchor, hisAnchor, x, y = unpack(anchor) + fontstring:ClearAllPoints() fontstring:SetPoint(myAnchor, frame.upperImage, hisAnchor or myAnchor, x or 0, y or 0) elseif (anchor and index == 2) then local myAnchor, hisAnchor, x, y = unpack(anchor) + fontstring:ClearAllPoints() fontstring:SetPoint(myAnchor, frame, hisAnchor or myAnchor, x or 0, y or 0) end @@ -2725,10 +2727,12 @@ function DF:CreateCoolTip() if (type(anchor[1]) == "table") then for anchorIndex, anchorPoints in ipairs(anchor) do local myAnchor, hisAnchor, x, y = unpack(anchorPoints) + texture:ClearAllPoints() texture:SetPoint(myAnchor, frame, hisAnchor or myAnchor, x or 0, y or 0) end else local myAnchor, hisAnchor, x, y = unpack(anchor) + texture:ClearAllPoints() texture:SetPoint(myAnchor, frame, hisAnchor or myAnchor, x or 0, y or 0) end end @@ -2737,8 +2741,10 @@ function DF:CreateCoolTip() local leftCoord, rightCoord, topCoord, bottomCoord = unpack(texCoord) texture:SetTexCoord(leftCoord, rightCoord, topCoord, bottomCoord) end + if (overlay) then - texture:SetVertexColor(unpack(overlay)) + local red, green, blue, alpha = DF:ParseColors(overlay) + texture:SetVertexColor(red, green, blue, alpha) end gameCooltip.Banner[index] = true diff --git a/Libs/DF/fw.lua b/Libs/DF/fw.lua index 84cbf1df..6c7e9dd4 100644 --- a/Libs/DF/fw.lua +++ b/Libs/DF/fw.lua @@ -1,6 +1,6 @@ -local dversion = 406 +local dversion = 407 local major, minor = "DetailsFramework-1.0", dversion local DF, oldminor = LibStub:NewLibrary(major, minor) @@ -775,6 +775,13 @@ function DF:AddClassColorToText(text, className) return text end +function DF:MakeStringFromSpellId(spellId) + local spellName, _, spellIcon = GetSpellInfo(spellId) + if (spellName) then + return "|T" .. spellIcon .. ":16:16:0:0:64:64:4:60:4:60|t " .. spellName + end +end + function DF:GetClassTCoordsAndTexture(class) local l, r, t, b = unpack(CLASS_ICON_TCOORDS[class]) return l, r, t, b, [[Interface\WORLDSTATEFRAME\Icons-Classes]] diff --git a/boot.lua b/boot.lua index 7169a686..0d2dfc31 100644 --- a/boot.lua +++ b/boot.lua @@ -72,6 +72,7 @@ Details222.Pets = {} Details222.MythicPlus = {} Details222.EJCache = {} + Details222.Segments = {} ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --initialization stuff @@ -994,3 +995,83 @@ if (select(4, GetBuildInfo()) >= 100000) then end end) end + +Details222.ClassCache = {} +Details222.ClassCache.ByName = {} +Details222.ClassCache.ByGUID = {} + +function Details222.ClassCache.GetClass(value) + local className = Details222.ClassCache.ByName[value] or Details222.ClassCache.ByGUID[value] + if (className) then + return className + end + + local _, unitClass = UnitClass(value) + return unitClass +end + +function Details222.ClassCache.MakeCache() + --iterage among all segments in the container history, get the damage container and get the actor list, check if the actor is a player and if it is, get the class and store it in the cache + for _, combatObject in ipairs(Details.tabela_historico.tabelas) do + for _, actorObject in combatObject:GetContainer(DETAILS_ATTRIBUTE_DAMAGE):ListActors() do + if (actorObject:IsPlayer()) then + local actorName = actorObject.nome + local actorClass = actorObject.classe + local actorGUID = actorObject.serial + Details222.ClassCache.ByName[actorName] = actorClass + Details222.ClassCache.ByGUID[actorGUID] = actorClass + end + end + end +end + +Details222.UnitIdCache = {} +Details222.UnitIdCache.Raid = { + [1] = "raid1", + [2] = "raid2", + [3] = "raid3", + [4] = "raid4", + [5] = "raid5", + [6] = "raid6", + [7] = "raid7", + [8] = "raid8", + [9] = "raid9", + [10] = "raid10", + [11] = "raid11", + [12] = "raid12", + [13] = "raid13", + [14] = "raid14", + [15] = "raid15", + [16] = "raid16", + [17] = "raid17", + [18] = "raid18", + [19] = "raid19", + [20] = "raid20", + [21] = "raid21", + [22] = "raid22", + [23] = "raid23", + [24] = "raid24", + [25] = "raid25", + [26] = "raid26", + [27] = "raid27", + [28] = "raid28", + [29] = "raid29", + [30] = "raid30", + [31] = "raid31", + [32] = "raid32", + [33] = "raid33", + [34] = "raid34", + [35] = "raid35", + [36] = "raid36", + [37] = "raid37", + [38] = "raid38", + [39] = "raid39", + [40] = "raid40", +} + +Details222.UnitIdCache.Party = { + [1] = "party1", + [2] = "party2", + [3] = "party3", + [4] = "party4", +} \ No newline at end of file diff --git a/core/meta.lua b/core/meta.lua index eed7d402..c33b5e02 100644 --- a/core/meta.lua +++ b/core/meta.lua @@ -17,10 +17,10 @@ local _InCombatLockdown = InCombatLockdown --wow api local - local atributo_damage = _detalhes.atributo_damage --details local - local atributo_heal = _detalhes.atributo_heal --details local - local atributo_energy = _detalhes.atributo_energy --details local - local atributo_misc = _detalhes.atributo_misc --details local + local classDamage = _detalhes.atributo_damage --details local + local classHeal = _detalhes.atributo_heal --details local + local classEnergy = _detalhes.atributo_energy --details local + local classUtility = _detalhes.atributo_misc --details local local alvo_da_habilidade = _detalhes.alvo_da_habilidade --details local local habilidade_dano = _detalhes.habilidade_dano --details local local habilidade_cura = _detalhes.habilidade_cura --details local @@ -216,30 +216,30 @@ if (class_type == class_type_dano) then if (combate.overall_added and not overall_saved) then - shadow = atributo_damage:r_connect_shadow (esta_classe) + shadow = classDamage:r_connect_shadow (esta_classe) else - shadow = atributo_damage:r_onlyrefresh_shadow (esta_classe) + shadow = classDamage:r_onlyrefresh_shadow (esta_classe) end elseif (class_type == class_type_cura) then if (combate.overall_added and not overall_saved) then - shadow = atributo_heal:r_connect_shadow (esta_classe) + shadow = classHeal:r_connect_shadow (esta_classe) else - shadow = atributo_heal:r_onlyrefresh_shadow (esta_classe) + shadow = classHeal:r_onlyrefresh_shadow (esta_classe) end elseif (class_type == class_type_e_energy) then if (combate.overall_added and not overall_saved) then - shadow = atributo_energy:r_connect_shadow (esta_classe) + shadow = classEnergy:r_connect_shadow (esta_classe) else - shadow = atributo_energy:r_onlyrefresh_shadow (esta_classe) + shadow = classEnergy:r_onlyrefresh_shadow (esta_classe) end elseif (class_type == class_type_misc) then if (combate.overall_added and not overall_saved) then - shadow = atributo_misc:r_connect_shadow (esta_classe) + shadow = classUtility:r_connect_shadow (esta_classe) else - shadow = atributo_misc:r_onlyrefresh_shadow (esta_classe) + shadow = classUtility:r_onlyrefresh_shadow (esta_classe) end end @@ -262,14 +262,14 @@ --restaura last_events_table local primeiro_combate = tabelas_do_historico [1] --primeiro combate if (primeiro_combate) then - primeiro_combate [1]:ActorCallFunction (atributo_damage.r_last_events_table) - primeiro_combate [2]:ActorCallFunction (atributo_heal.r_last_events_table) + primeiro_combate [1]:ActorCallFunction (classDamage.r_last_events_table) + primeiro_combate [2]:ActorCallFunction (classHeal.r_last_events_table) end local segundo_combate = tabelas_do_historico [2] --segundo combate if (segundo_combate) then - segundo_combate [1]:ActorCallFunction (atributo_damage.r_last_events_table) - segundo_combate [2]:ActorCallFunction (atributo_heal.r_last_events_table) + segundo_combate [1]:ActorCallFunction (classDamage.r_last_events_table) + segundo_combate [2]:ActorCallFunction (classHeal.r_last_events_table) end end @@ -748,7 +748,7 @@ UpdateAddOnMemoryUsage() local memory = GetAddOnMemoryUsage ("Details") if (memory > _detalhes.memory_ram) then - _detalhes:IniciarColetaDeLixo (true, 60) --sending true doesn't check anythink + _detalhes:RestartInternalGarbageCollector (true, 60) --sending true doesn't check anythink end end end @@ -762,25 +762,25 @@ _detalhes:Msg("(debug) checking memory periodically. Using: ",math.floor(memory)) end if (memory > _detalhes.memory_ram * 1000) then - _detalhes:IniciarColetaDeLixo (1, 60) --sending 1 only check for combat and ignore garbage collect cooldown + _detalhes:RestartInternalGarbageCollector (1, 60) --sending 1 only check for combat and ignore garbage collect cooldown end end end - function _detalhes:IniciarColetaDeLixo (forcar, lastevent) - - if (not forcar) then + function _detalhes:RestartInternalGarbageCollector(bShouldForceCollect, lastEvent) + if (not bShouldForceCollect) then if (_detalhes.ultima_coleta + _detalhes.intervalo_coleta > _detalhes._tempo + 1) then return + elseif (_detalhes.in_combat or _InCombatLockdown() or _detalhes:IsInInstance()) then - _detalhes:ScheduleTimer("IniciarColetaDeLixo", 5) + _detalhes:ScheduleTimer("RestartInternalGarbageCollector", 5) return end else - if (type(forcar) ~= "boolean") then - if (forcar == 1) then + if (type(bShouldForceCollect) ~= "boolean") then + if (bShouldForceCollect == 1) then if (_detalhes.in_combat or _InCombatLockdown()) then - _detalhes:ScheduleTimer("IniciarColetaDeLixo", 5, forcar) + _detalhes:ScheduleTimer("RestartInternalGarbageCollector", 5, bShouldForceCollect) return end end @@ -788,70 +788,62 @@ end if (_detalhes.debug) then - if (forcar) then - _detalhes:Msg("(debug) collecting garbage with forced state: ", forcar) + if (bShouldForceCollect) then + _detalhes:Msg("(debug) collecting garbage with forced state:", bShouldForceCollect) else _detalhes:Msg("(debug) collecting garbage.") end end - local memory = GetAddOnMemoryUsage ("Details") + --cleanup all the parser caches + Details:ClearParserCache() - --reseta o cache do parser - _detalhes:ClearParserCache() - - --limpa barras que n�o est�o sendo usadas nas inst�ncias. - for index, instancia in ipairs(_detalhes.tabela_instancias) do - if (instancia.barras and instancia.barras [1]) then - for i, barra in ipairs(instancia.barras) do - if (not barra:IsShown()) then - barra.minha_tabela = nil + --cleanup all the window lines (bars) which isn't in use + for index, instanceObject in ipairs(Details.tabela_instancias) do + if (instanceObject.barras and instanceObject.barras[1]) then + for i, lineRow in ipairs(instanceObject.barras) do + if (not lineRow:IsShown()) then + lineRow.minha_tabela = nil end end end end - --faz a coleta nos 4 atributos - local damage = atributo_damage:ColetarLixo (lastevent) - local heal = atributo_heal:ColetarLixo (lastevent) - local energy = atributo_energy:ColetarLixo (lastevent) - local misc = atributo_misc:ColetarLixo (lastevent) + --do garbage collection on the handler for each actor class + local damage = classDamage:ColetarLixo(lastEvent) + local heal = classHeal:ColetarLixo(lastEvent) + local energy = classEnergy:ColetarLixo(lastEvent) + local misc = classUtility:ColetarLixo(lastEvent) local limpados = damage + heal + energy + misc --refresh nas janelas if (limpados > 0) then - _detalhes:InstanciaCallFunction(_detalhes.reset_window) + Details:InstanciaCallFunction(_detalhes.reset_window) end - _detalhes:ManutencaoTimeMachine() + Details:ManutencaoTimeMachine() - --print cache states - --if (_detalhes.debug) then - -- _detalhes:Msg("(debug) removed: damage "..damage.." heal "..heal.." energy "..energy.." misc "..misc) - --end - - --elimina pets antigos + --cleanup backlisted pets within the handler of actor containers _detalhes:LimparPets() if (not _detalhes.in_combat) then - _detalhes:ClearCCPetsBlackList() + Details:ClearCCPetsBlackList() end - --reseta cache de specs - _detalhes:ResetSpecCache() + --cleanup spec cache + Details:ResetSpecCache() - --wipa container de escudos - wipe(_detalhes.escudos) + --cleanup the shield cache + wipe(Details.escudos) - _detalhes.ultima_coleta = _detalhes._tempo + --set the time of the latest internal garbage collect + Details.ultima_coleta = _detalhes._tempo if (_detalhes.debug) then + Details:Msg("(debug) executing: collectgarbage().") collectgarbage() UpdateAddOnMemoryUsage() - --local memory2 = GetAddOnMemoryUsage ("Details") - --_detalhes:Msg("(debug) memory before: "..memory.." memory after: "..memory2) end - end --combates Normais diff --git a/core/parser.lua b/core/parser.lua index 1f658437..033eb76d 100755 --- a/core/parser.lua +++ b/core/parser.lua @@ -12,7 +12,6 @@ local UnitHealthMax = UnitHealthMax local UnitGUID = UnitGUID local IsInGroup = IsInGroup - --local GetNumGroupMembers = GetNumGroupMembers local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo local GetTime = GetTime local tonumber = tonumber @@ -5583,7 +5582,8 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 end --in case the player left the raid during the encounter - local check_for_encounter_end = function() + --this function clear the encounter_id from the cache + local checkIfEncounterIsDone = function() if (not _current_encounter_id) then return end @@ -5623,8 +5623,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 --this function is guaranteed to run after a combat is done --can also run when the player leaves combat state (regen enabled) - function _detalhes:RunScheduledEventsAfterCombat (OnRegenEnabled) - + function _detalhes:RunScheduledEventsAfterCombat(OnRegenEnabled) if (_detalhes.debug) then _detalhes:Msg("(debug) running scheduled events after combat end.") end @@ -5777,13 +5776,13 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 if (_detalhes.debug) then _detalhes:Msg("(debug) |cFFFFFF00PLAYER_REGEN_ENABLED|r event triggered.") - print("combat lockdown:", InCombatLockdown()) - print("affecting combat:", UnitAffectingCombat("player")) + --print("combat lockdown:", InCombatLockdown()) + --print("affecting combat:", UnitAffectingCombat("player")) - if (_current_encounter_id and IsInInstance()) then - print("has a encounter ID") - print("player is dead:", UnitHealth ("player") < 1) - end + --if (_current_encounter_id and IsInInstance()) then + --print("has a encounter ID") + --print("player is dead:", UnitHealth ("player") < 1) + --end end if (Details.auto_swap_to_dynamic_overall) then @@ -5791,23 +5790,22 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 end --elapsed combat time - _detalhes.LatestCombatDone = GetTime() - _detalhes.tabela_vigente.CombatEndedAt = GetTime() - _detalhes.tabela_vigente.TotalElapsedCombatTime = _detalhes.tabela_vigente.CombatEndedAt - (_detalhes.tabela_vigente.CombatStartedAt or 0) + Details.LatestCombatDone = GetTime() - C_Timer.After(10, check_for_encounter_end) + local currentCombat = Details:GetCurrentCombat() + currentCombat.CombatEndedAt = GetTime() + currentCombat.TotalElapsedCombatTime = currentCombat.CombatEndedAt - (currentCombat.CombatStartedAt or 0) + + C_Timer.After(10, checkIfEncounterIsDone) --playing alone, just finish the combat right now if (not IsInGroup() and not IsInRaid()) then - _detalhes.tabela_vigente.playing_solo = true - _detalhes:SairDoCombate() - + currentCombat.playing_solo = true + Details:SairDoCombate() else --is in a raid or party group C_Timer.After(1, function() - local inCombat if (IsInRaid()) then - --raid local inCombat = false for i = 1, GetNumGroupMembers() do if (UnitAffectingCombat("raid" .. i)) then @@ -5817,11 +5815,10 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 end if (not inCombat) then - _detalhes:RunScheduledEventsAfterCombat (true) + Details:RunScheduledEventsAfterCombat(true) end elseif (IsInGroup()) then - --party (dungeon) local inCombat = false for i = 1, GetNumGroupMembers() -1 do if (UnitAffectingCombat("party" .. i)) then @@ -5831,7 +5828,7 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 end if (not inCombat) then - _detalhes:RunScheduledEventsAfterCombat (true) + Details:RunScheduledEventsAfterCombat(true) end end end) @@ -5952,41 +5949,38 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 _detalhes.in_group = IsInGroup() or IsInRaid() if (_detalhes.in_group) then - --entrou num grupo - _detalhes:IniciarColetaDeLixo (true) - _detalhes:WipePets() - _detalhes:SchedulePetUpdate(1) - _detalhes:InstanceCall(_detalhes.AdjustAlphaByContext) + --player entered in a group, cleanup and set the new enviromnent + Details:RestartInternalGarbageCollector(true) + Details:WipePets() + Details:SchedulePetUpdate(1) + Details:InstanceCall(Details.AdjustAlphaByContext) - _detalhes:CheckSwitchOnLogon() - _detalhes:CheckVersion() - _detalhes:SendEvent("GROUP_ONENTER") + Details:CheckSwitchOnLogon() + Details:CheckVersion() + Details:SendEvent("GROUP_ONENTER") - _detalhes:DispatchAutoRunCode("on_groupchange") + Details:DispatchAutoRunCode("on_groupchange") - wipe (_detalhes.trusted_characters) - C_Timer.After(5, _detalhes.ScheduleSyncPlayerActorData) + wipe (Details.trusted_characters) + C_Timer.After(5, Details.ScheduleSyncPlayerActorData) end else _detalhes.in_group = IsInGroup() or IsInRaid() if (not _detalhes.in_group) then - --saiu do grupo - _detalhes:IniciarColetaDeLixo(true) - _detalhes:WipePets() - _detalhes:SchedulePetUpdate(1) - wipe(_detalhes.details_users) - _detalhes:InstanceCall(_detalhes.AdjustAlphaByContext) - _detalhes:CheckSwitchOnLogon() - _detalhes:SendEvent("GROUP_ONLEAVE") - - _detalhes:DispatchAutoRunCode("on_groupchange") - - wipe (_detalhes.trusted_characters) - + --player left the group, run routines to cleanup the environment + Details:RestartInternalGarbageCollector(true) + Details:WipePets() + Details:SchedulePetUpdate(1) + wipe(Details.details_users) + Details:InstanceCall(Details.AdjustAlphaByContext) + Details:CheckSwitchOnLogon() + Details:SendEvent("GROUP_ONLEAVE") + Details:DispatchAutoRunCode("on_groupchange") + wipe(Details.trusted_characters) else - --ainda esta no grupo + --player is still in a group _detalhes:SchedulePetUpdate(2) --send char data @@ -6415,34 +6409,43 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 wipe(bitfield_swap_cache) wipe(empower_cache) - local roster = _detalhes.tabela_vigente.raid_roster + local groupRoster = _detalhes.tabela_vigente.raid_roster if (IsInRaid()) then + local unitIdCache = Details222.UnitIdCache.Raid + for i = 1, GetNumGroupMembers() do - local name = GetUnitName("raid"..i, true) + local unitId = unitIdCache[i] + local unitName = GetUnitName(unitId, true) + local unitGUID = UnitGUID(unitId) - local guid = UnitGUID("raid"..i) - raid_members_cache[guid] = name - roster[name] = guid + local _, unitClass = UnitClass(unitId) + Details222.ClassCache.ByName[unitName] = unitClass + Details222.ClassCache.ByGUID[unitGUID] = unitClass - local role = _UnitGroupRolesAssigned(name) + raid_members_cache[unitGUID] = unitName + groupRoster[unitName] = unitGUID + + local role = _UnitGroupRolesAssigned(unitName) if (role == "TANK") then - tanks_members_cache[UnitGUID("raid"..i)] = true + tanks_members_cache[unitGUID] = true end - if (auto_regen_power_specs[_detalhes.cached_specs[UnitGUID("raid" .. i)]]) then - auto_regen_cache[name] = auto_regen_power_specs[_detalhes.cached_specs[UnitGUID("raid" .. i)]] + if (auto_regen_power_specs[_detalhes.cached_specs[unitGUID]]) then + auto_regen_cache[unitName] = auto_regen_power_specs[_detalhes.cached_specs[unitGUID]] end end elseif (IsInGroup()) then - --party + local unitIdCache = Details222.UnitIdCache.Party for i = 1, GetNumGroupMembers()-1 do - local name = GetUnitName("party"..i, true) + local unitId = unitIdCache[i] - local guid = UnitGUID("party"..i) + local name = GetUnitName(unitId, true) + + local guid = UnitGUID(unitId) raid_members_cache[guid] = name - roster[name] = guid + groupRoster[name] = guid local role = _UnitGroupRolesAssigned(name) if (role == "TANK") then @@ -6455,44 +6458,46 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 end --player - local name = GetUnitName("player", true) + local playerName = GetUnitName("player", true) + local playerGUID = UnitGUID("player") - raid_members_cache[UnitGUID("player")] = name - roster[name] = UnitGUID("player") + raid_members_cache[playerGUID] = playerName + groupRoster[playerName] = playerGUID - local role = _UnitGroupRolesAssigned(name) + local role = _UnitGroupRolesAssigned(playerName) if (role == "TANK") then - tanks_members_cache[UnitGUID("player")] = true + tanks_members_cache[playerGUID] = true end - if (auto_regen_power_specs[_detalhes.cached_specs[UnitGUID("player")]]) then - auto_regen_cache[name] = auto_regen_power_specs[_detalhes.cached_specs[UnitGUID("player")]] + if (auto_regen_power_specs[_detalhes.cached_specs[playerGUID]]) then + auto_regen_cache[playerName] = auto_regen_power_specs[_detalhes.cached_specs[playerGUID]] end else - local name = GetUnitName("player", true) + local playerName = GetUnitName("player", true) + local playerGUID = UnitGUID("player") - raid_members_cache[UnitGUID("player")] = name - roster[name] = UnitGUID("player") + raid_members_cache[playerGUID] = playerName + groupRoster[playerName] = playerGUID - local role = _UnitGroupRolesAssigned(name) + local role = _UnitGroupRolesAssigned(playerName) if (role == "TANK") then - tanks_members_cache[UnitGUID("player")] = true + tanks_members_cache[playerGUID] = true else local spec = DetailsFramework.GetSpecialization() if (spec and spec ~= 0) then if (DetailsFramework.GetSpecializationRole (spec) == "TANK") then - tanks_members_cache[UnitGUID("player")] = true + tanks_members_cache[playerGUID] = true end end end - if (auto_regen_power_specs[_detalhes.cached_specs[UnitGUID("player")]]) then - auto_regen_cache[name] = auto_regen_power_specs[_detalhes.cached_specs[UnitGUID("player")]] + if (auto_regen_power_specs[_detalhes.cached_specs[playerGUID]]) then + auto_regen_cache[playerName] = auto_regen_power_specs[_detalhes.cached_specs[playerGUID]] end end local orderNames = {} - for playerName in pairs(roster) do + for playerName in pairs(groupRoster) do orderNames[#orderNames+1] = playerName end table.sort(orderNames, function(name1, name2) @@ -6500,20 +6505,28 @@ local SPELL_POWER_PAIN = SPELL_POWER_PAIN or (PowerEnum and PowerEnum.Pain) or 1 end) _detalhes.tabela_vigente.raid_roster_indexed = orderNames - if (_detalhes.iam_a_tank) then tanks_members_cache[UnitGUID("player")] = true end end - function _detalhes:IsATank(playerguid) - return tanks_members_cache[playerguid] + ---return true or false + ---@param unitGUID string + ---@return boolean + function Details:IsATank(unitGUID) + return tanks_members_cache[unitGUID] or false end - function _detalhes:IsInCache(playerguid) - return raid_members_cache[playerguid] + ---returns the unit name + ---@param unitGUID string + ---@return string + function Details:IsInCache(unitGUID) + return raid_members_cache[unitGUID] end - function _detalhes:GetParserPlayerCache() + + ---return the internal raid members cache, containing the unitGUID as key and the unitName as value + ---@return table + function Details:GetParserPlayerCache() return raid_members_cache end diff --git a/functions/boss.lua b/functions/boss.lua index d3f6e099..edad9c97 100644 --- a/functions/boss.lua +++ b/functions/boss.lua @@ -547,6 +547,8 @@ do EncounterJournal_LoadUI() end + hooksecurefunc("EncounterJournal_OpenJournalLink", Details222.EJCache.OnClickEncounterJournalLink) + do --iterate among all raid instances, by passing true in the second argument of EJ_GetInstanceByIndex, indicates to the API we want to get raid instances local bGetRaidInstances = true @@ -770,9 +772,20 @@ do end --reset the dungeon journal to the default state - if (EncounterJournalSuggestTab) then - EncounterJournalSuggestTab:Click() - end + C_Timer.After(0.5, function() + EncounterJournal_ResetDisplay(nil, "none") + end) + C_Timer.After(1, function() + if (EncounterJournalSuggestTab) then + EncounterJournalSuggestTab:Click() + end + end) + + --EncounterJournal_OpenJournalLink(tag, jtype, id, difficultyID) + --EncounterJournal_OpenJournal(difficultyID, instanceID, encounterID, sectionID, creatureID, itemID, tierIndex) + + --local tooltipInfo = CreateBaseTooltipInfo("GetHyperlink", link, classID, specID); + end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- diff --git a/functions/journal.lua b/functions/journal.lua new file mode 100644 index 00000000..806a82c3 --- /dev/null +++ b/functions/journal.lua @@ -0,0 +1,141 @@ + +local Details = _G.Details +local DF = _G.DetailsFramework +local C_Timer = _G.C_Timer +local addonName, Details222 = ... + +--get the sectionInfo and try to extract the spellID from it +--sectionInfo is always a valid table +local parseSectionInfoForSpellID = function(sectionInfo) + local spellId = sectionInfo.spellID + if (spellId) then + spellId = tonumber(spellId) + if (spellId) then + local spellName = GetSpellInfo(spellId) + if (spellName) then + return spellId + end + end + end +end + + +--this function is called when the player clicks on a link in the chat window to open a section in the encounter journal +function Details222.EJCache.OnClickEncounterJournalLink(tag, journalType, id, difficultyId) + journalType = tonumber(journalType) + id = tonumber(id) + difficultyId = tonumber(difficultyId) + + local instanceId, encounterId, sectionId, tierIndex = EJ_HandleLinkPath(journalType, id) + if (sectionId) then + local sectionInfo = C_EncounterJournal.GetSectionInfo(sectionId) + if (sectionInfo and type(sectionInfo) == "table") then + local spellId = parseSectionInfoForSpellID(sectionInfo) + --spellId is guaranteed to be a valid spellId or nil + if (spellId) then + local damageDoneTable = Details222.DamageSpells.GetDamageDoneToPlayersBySpell(spellId) + local topDamage = damageDoneTable[1] and damageDoneTable[1][2] + + if (topDamage and topDamage > 0) then + --build a cooltip with the damage done to players by the spellId + local gameCooltip = GameCooltip + gameCooltip:Preset(2) + gameCooltip:SetType("tooltip") + gameCooltip:SetOption("LeftPadding", -5) + gameCooltip:SetOption("RightPadding", 5) + gameCooltip:SetOption("LinePadding", 1) + gameCooltip:SetOption("StatusBarTexture", [[Interface\AddOns\Details\images\bar_hyanda]]) + + for i = 1, #damageDoneTable do + local targetName, damageDone = unpack(damageDoneTable[i]) + local nameWithoutRealm = DF:RemoveRealmName(targetName) + local formattedDamage = Details:ToK2(damageDone) + local className = Details222.ClassCache.GetClass(targetName) + local classTexture, left, right, top, bottom = Details:GetClassIcon(className) + gameCooltip:AddLine(nameWithoutRealm, formattedDamage) + gameCooltip:AddIcon(classTexture, 1, 1, 14, 14, left, right, top, bottom) + + gameCooltip:AddStatusBar(damageDone / topDamage * 100, 1, .5, .5, .5, 1, false, {value = 100, color = {.2, .2, .2, 0.9}, texture = [[Interface\AddOns\Details\images\bar_hyanda]]}) + end + + local abilityString = DF:MakeStringFromSpellId(spellId) + if (abilityString) then + abilityString = abilityString .. " (damage to)" + end + + local anchor = {"bottom", "top", 0, 0} + gameCooltip:SetBannerImage(1, 2, [[Interface\PetBattles\Weather-Blizzard]], 220, 55, anchor, {0.85, 0.189609375, 1, 0}, {0, 0, 0, 1}) + gameCooltip:SetBannerText(1, 2, abilityString or "Ability Damage Done", {"bottomleft", "topleft", 0, 2}, "white", 14) + gameCooltip:SetOwner(EncounterJournal, "topleft", "topright", 50, -10) + gameCooltip:Show() + end + end + end + end + + if (not Details222.EJCache.HasJournalOnHideHooked) then + Details222.EJCache.HasJournalOnHideHooked = true + EncounterJournal:HookScript("OnHide", function() + GameCooltip:Hide() + end) + end +end + + +--search the damage container within the combatObject index[1] for actor that used the spellId passed and inflicted damage to players +---@param spellId number +---@param combatId any +---@return table +function Details222.DamageSpells.GetDamageDoneToPlayersBySpell(spellId, combatId) + local combatObject = Details:GetCombat(combatId) + if (not combatObject) then + return {} + end + + local damageContainer = combatObject:GetContainer(DETAILS_ATTRIBUTE_DAMAGE) + if (not damageContainer) then + return {} + end + + local damageDoneTable = {} + + for index, actorObject in damageContainer:ListActors() do + if (actorObject:IsNeutralOrEnemy()) then + local spellTable = actorObject:GetSpell(spellId) + if (spellTable) then + for targetName, damageDone in pairs(spellTable.targets) do + damageDoneTable[targetName] = (damageDoneTable[targetName] or 0) + damageDone + end + end + end + end + + local sortedResult = {} + for targetName, damageDone in pairs(damageDoneTable) do + local className = Details222.ClassCache.GetClass(targetName) + sortedResult[#sortedResult + 1] = {targetName, damageDone, className} + end + table.sort(sortedResult, function(a, b) return a[2] > b[2] end) + + return sortedResult +end + + --[=[ +["description"] = "Eranog wreathes several players in flames. Upon expiration a Flamerift forms at each player's location, inflicting 144,550 Fire damage to players within 4 yards. + +A Flamescale Tarasek spills forth from each Flamerift, leaving behind a Lava Flow. + +On Mythic difficulty, Eranog also opens a Greater Flamerift that creates a Flamescale Captain.", +["link"] = "[Flamerift]", +["siblingSectionID"] = 26037, +["startsOpen"] = false, +["creatureDisplayID"] = 0, +["headerType"] = 2, +["title"] = "Flamerift", +["firstChildSectionID"] = 26036, +["uiModelSceneID"] = 0, +["filteredByDifficulty"] = false, +["abilityIcon"] = 134153, +["spellID"] = 390715, + +--]=] diff --git a/functions/playerclass.lua b/functions/playerclass.lua index 4131a5d3..efb11ddc 100644 --- a/functions/playerclass.lua +++ b/functions/playerclass.lua @@ -72,28 +72,28 @@ do return [[Interface\AddOns\Details\images\icons2]], unpack(roles [role]) end - function _detalhes:GetClassIcon (class) - - local c - + function _detalhes:GetClassIcon(class) if (self.classe) then - c = self.classe + class = self.classe elseif (type(class) == "table" and class.classe) then - c = class.classe + class = class.classe elseif (type(class) == "string") then - c = class + class = class else - c = "UNKNOW" + class = "UNKNOW" end - if (c == "UNKNOW") then + if (class == "UNKNOW") then return [[Interface\LFGFRAME\LFGROLE_BW]], 0.25, 0.5, 0, 1 - elseif (c == "UNGROUPPLAYER") then + + elseif (class == "UNGROUPPLAYER") then return [[Interface\ICONS\Achievement_Character_Orc_Male]], 0, 1, 0, 1 - elseif (c == "PET") then + + elseif (class == "PET") then return [[Interface\AddOns\Details\images\classes_small]], 0.25, 0.49609375, 0.75, 1 + else - return [[Interface\AddOns\Details\images\classes_small]], unpack(_detalhes.class_coords [c]) + return [[Interface\AddOns\Details\images\classes_small]], unpack(_detalhes.class_coords[class]) end end diff --git a/startup.lua b/startup.lua index 032a9087..2e09f15f 100644 --- a/startup.lua +++ b/startup.lua @@ -223,7 +223,7 @@ function Details:StartMeUp() --I'll never stop! self.ultima_coleta = 0 self.intervalo_coleta = 720 self.intervalo_memoria = 180 - self.garbagecollect = Details.Schedules.NewTicker(self.intervalo_coleta, Details.IniciarColetaDeLixo, Details) + self.garbagecollect = Details.Schedules.NewTicker(self.intervalo_coleta, Details.RestartInternalGarbageCollector, Details) self.next_memory_check = _G.time() + self.intervalo_memoria --player role @@ -579,9 +579,10 @@ function Details:StartMeUp() --I'll never stop! _G["UpdateAddOnMemoryUsage"] = Details.UpdateAddOnMemoryUsage_Custom end - pcall(Details222.EJCache.MakeCache) + pcall(Details222.ClassCache.MakeCache) + function Details:InstallOkey() return true end