local _detalhes = _G.Details local _ local addonName, Details222 = ... local AceLocale = LibStub("AceLocale-3.0") local Loc = AceLocale:GetLocale ( "Details" ) local Translit = LibStub("LibTranslit-1.0") --lua locals local _math_floor = math.floor local setmetatable = setmetatable local pairs = pairs local ipairs = ipairs local _unpack = unpack local type = type local _table_sort = table.sort local _cstr = string.format local tinsert = table.insert local _math_min = math.min local _math_ceil = math.ceil --api locals local GetSpellInfo = Details222.GetSpellInfo local _GetSpellInfo = _detalhes.getspellinfo local IsInRaid = IsInRaid local IsInGroup = IsInGroup local _string_replace = _detalhes.string.replace --details api local gump = _detalhes.gump local detailsFramework = DetailsFramework local alvo_da_habilidade = _detalhes.alvo_da_habilidade local container_habilidades = _detalhes.container_habilidades local container_combatentes = _detalhes.container_combatentes local healingClass = _detalhes.atributo_heal local habilidade_cura = _detalhes.habilidade_cura local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC local container_heal = _detalhes.container_type.CONTAINER_HEAL_CLASS local container_heal_target = _detalhes.container_type.CONTAINER_HEALTARGET_CLASS local modo_ALONE = _detalhes.modos.alone local modo_GROUP = _detalhes.modos.group local modo_ALL = _detalhes.modos.all local class_type = _detalhes.atributos.cura local DATA_TYPE_START = _detalhes._detalhes_props.DATA_TYPE_START local DATA_TYPE_END = _detalhes._detalhes_props.DATA_TYPE_END local div_abre = _detalhes.divisores.abre local div_fecha = _detalhes.divisores.fecha local div_lugar = _detalhes.divisores.colocacao local ToKFunctions = _detalhes.ToKFunctions local SelectedToKFunction = ToKFunctions [1] local UsingCustomRightText = false local UsingCustomLeftText = false local FormatTooltipNumber = ToKFunctions [8] local TooltipMaximizedMethod = 1 local headerColor = "yellow" local breakdownWindowFrame = Details.BreakdownWindowFrame local keyName function healingClass:NovaTabela (serial, nome, link) local alphabetical = _detalhes:GetOrderNumber(nome) --constructor local thisActor = { tipo = class_type, --atributo 2 = cura total = alphabetical, totalover = alphabetical, totalabsorb = alphabetical, totaldenied = alphabetical, custom = 0, total_without_pet = alphabetical, totalover_without_pet = alphabetical, healing_taken = alphabetical, --total de cura que este jogador recebeu healing_from = {}, --armazena os nomes que deram cura neste jogador iniciar_hps = false, --dps_started last_event = 0, on_hold = false, delay = 0, last_value = nil, --ultimo valor que este jogador teve, salvo quando a barra dele � atualizada last_hps = 0, --cura por segundo end_time = nil, start_time = 0, pets = {}, --nome j� formatado: pet nome heal_enemy = {}, --quando o jogador cura um inimigo heal_enemy_amt = 0, --container armazenar� os IDs das habilidades usadas por este jogador spells = container_habilidades:NovoContainer (container_heal), --container armazenar� os seriais dos alvos que o player aplicou dano targets = {}, targets_overheal = {}, targets_absorbs = {} } detailsFramework:Mixin(thisActor, Details222.Mixins.ActorMixin) setmetatable(thisActor, healingClass) return thisActor end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --npc healing taken --local npchealingtaken_tooltip_background = {value = 100, color = {0.1960, 0.1960, 0.1960, 0.9097}, texture = [[Interface\AddOns\Details\images\bar_background2]]} --tooltip function local on_switch_NHT_show = function(instance) --npc healing taken instance:TrocaTabela(instance, true, 1, 8) return true end --local NHT_search_code = [[]] function _detalhes.SortGroupHeal (container, keyName2) keyName = keyName2 return _table_sort (container, _detalhes.SortKeyGroupHeal) end function _detalhes.SortKeyGroupHeal (table1, table2) if (table1.grupo and table2.grupo) then return table1 [keyName] > table2 [keyName] elseif (table1.grupo and not table2.grupo) then return true elseif (not table1.grupo and table2.grupo) then return false else return table1 [keyName] > table2 [keyName] end end function _detalhes.SortKeySimpleHeal (table1, table2) return table1 [keyName] > table2 [keyName] end function _detalhes:ContainerSortHeal (container, amount, keyName2) keyName = keyName2 _table_sort (container, _detalhes.SortKeySimpleHeal) if (amount) then for i = amount, 1, -1 do --de tr�s pra frente if (container[i][keyName] < 1) then amount = amount-1 else break end end return amount end end function healingClass:ContainerRefreshHps (container, combat_time) local total = 0 if (_detalhes.time_type == 2 or _detalhes.time_type == 3 or not _detalhes:CaptureGet("heal")) then for _, actor in ipairs(container) do if (actor.grupo) then actor.last_hps = actor.total / combat_time else actor.last_hps = actor.total / actor:Tempo() end total = total + actor.last_hps end else for _, actor in ipairs(container) do actor.last_hps = actor.total / actor:Tempo() total = total + actor.last_hps end end return total end function healingClass:ReportSingleDamagePreventedLine (actor, instancia) local barra = instancia.barras [actor.minha_barra] local reportar = {"Details!: " .. actor.nome .. " - " .. Loc ["STRING_ATTRIBUTE_HEAL_PREVENT"]} for i = 2, GameCooltip:GetNumLines()-2 do local texto_left, texto_right = GameCooltip:GetText (i) if (texto_left and texto_right) then texto_left = texto_left:gsub(("|T(.*)|t "), "") reportar [#reportar+1] = ""..texto_left.." "..texto_right.."" end end return _detalhes:Reportar (reportar, {_no_current = true, _no_inverse = true, _custom = true}) end function healingClass:RefreshWindow (instancia, tabela_do_combate, forcar, exportar) local showing = tabela_do_combate [class_type] --o que esta sendo mostrado -> [1] - dano [2] - cura --n�o h� barras para mostrar -- not have something to show if (#showing._ActorTable < 1) then --n�o h� barras para mostrar --colocado isso recentemente para fazer as barras de dano sumirem na troca de atributo return _detalhes:HideBarsNotInUse(instancia, showing), "", 0, 0 end --total local total = 0 --top actor #1 instancia.top = 0 local using_cache = false local sub_atributo = instancia.sub_atributo --o que esta sendo mostrado nesta inst�ncia local conteudo = showing._ActorTable local amount = #conteudo local modo = instancia.modo --pega qual a sub key que ser� usada if (exportar) then if (type(exportar) == "boolean") then if (sub_atributo == 1) then --healing DONE keyName = "total" elseif (sub_atributo == 2) then --HPS keyName = "last_hps" elseif (sub_atributo == 3) then --overheal keyName = "totalover" elseif (sub_atributo == 4) then --healing take keyName = "healing_taken" elseif (sub_atributo == 5) then --enemy heal keyName = "heal_enemy_amt" elseif (sub_atributo == 6) then --absorbs keyName = "totalabsorb" elseif (sub_atributo == 7) then --heal absorb keyName = "totaldenied" end else keyName = exportar.key modo = exportar.modo end elseif (instancia.atributo == 5) then --custom keyName = "custom" total = tabela_do_combate.totals [instancia.customName] else if (sub_atributo == 1) then --healing DONE keyName = "total" elseif (sub_atributo == 2) then --HPS keyName = "last_hps" elseif (sub_atributo == 3) then --overheal keyName = "totalover" elseif (sub_atributo == 4) then --healing take keyName = "healing_taken" elseif (sub_atributo == 5) then --enemy heal keyName = "heal_enemy_amt" elseif (sub_atributo == 6) then --absorbs keyName = "totalabsorb" elseif (sub_atributo == 7) then --heal absorb keyName = "totaldenied" end end if (instancia.atributo == 5) then --custom --faz o sort da categoria e retorna o amount corrigido amount = _detalhes:ContainerSortHeal (conteudo, amount, keyName) --grava o total instancia.top = conteudo[1][keyName] elseif (instancia.modo == modo_ALL or sub_atributo == 5 or sub_atributo == 7) then --mostrando ALL amount = _detalhes:ContainerSortHeal (conteudo, amount, keyName) if (sub_atributo == 2) then --hps local combat_time = instancia.showing:GetCombatTime() total = healingClass:ContainerRefreshHps (conteudo, combat_time) else --pega o total ja aplicado na tabela do combate total = tabela_do_combate.totals [class_type] end --grava o total instancia.top = conteudo[1][keyName] elseif (instancia.modo == modo_GROUP) then --mostrando GROUP if (_detalhes.in_combat and instancia.segmento == 0 and not exportar) then using_cache = true end if (using_cache) then conteudo = _detalhes.cache_healing_group if (sub_atributo == 2) then --hps local combat_time = instancia.showing:GetCombatTime() healingClass:ContainerRefreshHps (conteudo, combat_time) end if (#conteudo < 1) then return _detalhes:HideBarsNotInUse(instancia, showing), "", 0, 0 end _detalhes:ContainerSortHeal (conteudo, nil, keyName) if (conteudo[1][keyName] < 1) then amount = 0 else instancia.top = conteudo[1][keyName] amount = #conteudo end for i = 1, amount do total = total + conteudo[i][keyName] end else if (sub_atributo == 2) then --hps local combat_time = instancia.showing:GetCombatTime() healingClass:ContainerRefreshHps (conteudo, combat_time) end _detalhes.SortGroupHeal (conteudo, keyName) end -- if (not using_cache) then for index, player in ipairs(conteudo) do if (player.grupo) then --� um player e esta em grupo if (player[keyName] < 1) then --dano menor que 1, interromper o loop amount = index - 1 break elseif (index == 1) then --esse IF aqui, precisa mesmo ser aqui? n�o daria pra pega-lo com uma chave [1] nad grupo == true? instancia.top = conteudo[1][keyName] end total = total + player[keyName] else amount = index-1 break end end end end --refaz o mapa do container --se for cache n�o precisa remapear showing:remapear() if (exportar) then return total, keyName, instancia.top, amount end if (amount < 1) then --n�o h� barras para mostrar instancia:EsconderScrollBar() return _detalhes:EndRefresh (instancia, total, tabela_do_combate, showing) --retorna a tabela que precisa ganhar o refresh end --estra mostrando ALL ent�o posso seguir o padr�o correto? primeiro, atualiza a scroll bar... instancia:RefreshScrollBar (amount) --depois faz a atualiza��o normal dele atrav�s dos iterators local whichRowLine = 1 local barras_container = instancia.barras --evita buscar N vezes a key .barras dentro da inst�ncia local percentage_type = instancia.row_info.percent_type local bars_show_data = instancia.row_info.textR_show_data local bars_brackets = instancia:GetBarBracket() local bars_separator = instancia:GetBarSeparator() local baseframe = instancia.baseframe local use_animations = _detalhes.is_using_row_animations and (not baseframe.isStretching and not forcar and not baseframe.isResizing) if (total == 0) then total = 0.00000001 end local myPos local following = instancia.following.enabled if (following) then if (using_cache) then local pname = _detalhes.playername for i, actor in ipairs(conteudo) do if (actor.nome == pname) then myPos = i break end end else myPos = showing._NameIndexTable [_detalhes.playername] end end local combat_time = instancia.showing:GetCombatTime() UsingCustomLeftText = instancia.row_info.textL_enable_custom_text UsingCustomRightText = instancia.row_info.textR_enable_custom_text local use_total_bar = false if (instancia.total_bar.enabled) then use_total_bar = true if (instancia.total_bar.only_in_group and (not IsInGroup() and not IsInRaid())) then use_total_bar = false end end if (instancia.bars_sort_direction == 1) then --top to bottom if (use_total_bar and instancia.barraS[1] == 1) then whichRowLine = 2 local iter_last = instancia.barraS[2] if (iter_last == instancia.rows_fit_in_window) then iter_last = iter_last - 1 end local row1 = barras_container [1] row1.minha_tabela = nil row1.lineText1:SetText(Loc ["STRING_TOTAL"]) if (instancia.use_multi_fontstrings) then instancia:SetInLineTexts(row1, "", _detalhes:ToK2 (total), _detalhes:ToK (total / combat_time)) else row1.lineText4:SetText(_detalhes:ToK2 (total) .. " (" .. _detalhes:ToK (total / combat_time) .. ")") end row1:SetValue(100) local r, g, b = unpack(instancia.total_bar.color) row1.textura:SetVertexColor(r, g, b) row1.icone_classe:SetTexture(instancia.total_bar.icon) row1.icone_classe:SetTexCoord(0.0625, 0.9375, 0.0625, 0.9375) Details.FadeHandler.Fader(row1, "out") if (following and myPos and myPos+1 > instancia.rows_fit_in_window and instancia.barraS[2] < myPos+1) then for i = instancia.barraS[1], iter_last-1, 1 do --vai atualizar s� o range que esta sendo mostrado if (conteudo[i]) then conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end end conteudo[myPos]:RefreshLine(instancia, barras_container, whichRowLine, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 else for i = instancia.barraS[1], iter_last, 1 do --vai atualizar s� o range que esta sendo mostrado if (conteudo[i]) then conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end end end else if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then for i = instancia.barraS[1], instancia.barraS[2]-1, 1 do --vai atualizar s� o range que esta sendo mostrado if (conteudo[i]) then conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end end conteudo[myPos]:RefreshLine(instancia, barras_container, whichRowLine, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 else for i = instancia.barraS[1], instancia.barraS[2], 1 do --vai atualizar s� o range que esta sendo mostrado if (conteudo[i]) then conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end end end end elseif (instancia.bars_sort_direction == 2) then --bottom to top if (use_total_bar and instancia.barraS[1] == 1) then whichRowLine = 2 local iter_last = instancia.barraS[2] if (iter_last == instancia.rows_fit_in_window) then iter_last = iter_last - 1 end local row1 = barras_container [1] row1.minha_tabela = nil row1.lineText1:SetText(Loc ["STRING_TOTAL"]) -- if (instancia.use_multi_fontstrings) then instancia:SetInLineTexts(row1, "", _detalhes:ToK2(total), _detalhes:ToK(total / combat_time)) else row1.lineText4:SetText(_detalhes:ToK2 (total) .. " (" .. _detalhes:ToK (total / combat_time) .. ")") end row1:SetValue(100) local r, g, b = unpack(instancia.total_bar.color) row1.textura:SetVertexColor(r, g, b) row1.icone_classe:SetTexture(instancia.total_bar.icon) row1.icone_classe:SetTexCoord(0.0625, 0.9375, 0.0625, 0.9375) Details.FadeHandler.Fader(row1, "out") if (following and myPos and myPos+1 > instancia.rows_fit_in_window and instancia.barraS[2] < myPos+1) then conteudo[myPos]:RefreshLine(instancia, barras_container, whichRowLine, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 for i = iter_last-1, instancia.barraS[1], -1 do --vai atualizar s� o range que esta sendo mostrado if (conteudo[i]) then conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end end else for i = iter_last, instancia.barraS[1], -1 do --vai atualizar s� o range que esta sendo mostrado if (conteudo[i]) then conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end end end else if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then conteudo[myPos]:RefreshLine(instancia, barras_container, whichRowLine, myPos, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 for i = instancia.barraS[2]-1, instancia.barraS[1], -1 do --vai atualizar s� o range que esta sendo mostrado if (conteudo[i]) then conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end end else for i = instancia.barraS[2], instancia.barraS[1], -1 do --vai atualizar s� o range que esta sendo mostrado if (conteudo[i]) then conteudo[i]:RefreshLine(instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end end end end end if (use_animations) then instancia:PerformAnimations (whichRowLine - 1) end if (instancia.atributo == 5) then --custom --zerar o .custom dos Actors for index, player in ipairs(conteudo) do if (player.custom > 0) then player.custom = 0 else break end end end --beta, hidar barras n�o usadas durante um refresh for�ado if (forcar) then if (instancia.modo == 2) then --group for i = whichRowLine, instancia.rows_fit_in_window do Details.FadeHandler.Fader(instancia.barras [i], "in", Details.fade_speed) end end end instancia:AutoAlignInLineFontStrings() -- showing.need_refresh = false return Details:EndRefresh (instancia, total, tabela_do_combate, showing) --retorna a tabela que precisa ganhar o refresh end local actor_class_color_r, actor_class_color_g, actor_class_color_b --function atributo_heal:RefreshLine(instancia, whichRowLine, lugar, total, sub_atributo, forcar) function healingClass:RefreshLine(instancia, barras_container, whichRowLine, lugar, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) local thisLine = instancia.barras[whichRowLine] --pega a refer�ncia da barra na janela if (not thisLine) then print("DEBUG: problema com "..whichRowLine.." "..lugar) return end local tabela_anterior = thisLine.minha_tabela thisLine.minha_tabela = self --grava uma refer�ncia dessa classe de dano na barra self.minha_barra = thisLine --salva uma refer�ncia da barra no objeto do jogador thisLine.colocacao = lugar --salva na barra qual a coloca��o dela. self.colocacao = lugar --salva qual a coloca��o do jogador no objeto dele local healing_total = self.total --total de dano que este jogador deu local hps --local porcentagem = self [keyName] / total * 100 local porcentagem local esta_porcentagem if (percentage_type == 1) then porcentagem = _cstr ("%.1f", self [keyName] / total * 100) elseif (percentage_type == 2) then porcentagem = _cstr ("%.1f", self [keyName] / instancia.top * 100) end if ((_detalhes.time_type == 2 and self.grupo) or _detalhes.time_type == 3 or (not _detalhes:CaptureGet("heal") and not _detalhes:CaptureGet("aura")) or instancia.segmento == -1) then if (instancia.segmento == -1 and combat_time == 0) then local p = _detalhes.tabela_vigente(2, self.nome) if (p) then local t = p:Tempo() hps = healing_total / t self.last_hps = hps else hps = healing_total / combat_time self.last_hps = hps end else hps = healing_total / combat_time self.last_hps = hps end else -- /dump _detalhes:GetCombat(2)(1, "Ditador").on_hold if (not self.on_hold) then hps = healing_total/self:Tempo() --calcula o dps deste objeto self.last_hps = hps --salva o dps dele else hps = self.last_hps if (hps == 0) then --n�o calculou o dps dele ainda mas entrou em standby hps = healing_total/self:Tempo() self.last_hps = hps end end end -- >>>>>>>>>>>>>>> texto da direita if (instancia.atributo == 5) then --custom -- if (instancia.use_multi_fontstrings) then instancia:SetInLineTexts(thisLine, "", _detalhes:ToK (self.custom), porcentagem .. "%") else thisLine.lineText4:SetText(_detalhes:ToK (self.custom) .. " (" .. porcentagem .. "%)") end esta_porcentagem = _math_floor((self.custom/instancia.top) * 100) else if (sub_atributo == 1) then --mostrando healing done hps = _math_floor(hps) local formated_heal = SelectedToKFunction (_, healing_total) local formated_hps = SelectedToKFunction (_, hps) thisLine.ps_text = formated_hps if (not bars_show_data [1]) then formated_heal = "" end if (not bars_show_data [2]) then formated_hps = "" end if (not bars_show_data [3]) then porcentagem = "" else porcentagem = porcentagem .. "%" end local rightText = formated_heal .. bars_brackets[1] .. formated_hps .. bars_separator .. porcentagem .. bars_brackets[2] if (UsingCustomRightText) then thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_heal, formated_hps, porcentagem, self, instancia.showing, instancia, rightText)) else if (instancia.use_multi_fontstrings) then instancia:SetInLineTexts(thisLine, formated_heal, formated_hps, porcentagem) else thisLine.lineText4:SetText(rightText) end end esta_porcentagem = _math_floor((healing_total/instancia.top) * 100) elseif (sub_atributo == 2) then --mostrando hps hps = _math_floor(hps) local formated_heal = SelectedToKFunction (_, healing_total) local formated_hps = SelectedToKFunction (_, hps) thisLine.ps_text = formated_hps if (not bars_show_data [1]) then formated_hps = "" end if (not bars_show_data [2]) then formated_heal = "" end if (not bars_show_data [3]) then porcentagem = "" else porcentagem = porcentagem .. "%" end local rightText = formated_hps .. bars_brackets[1] .. formated_heal .. bars_separator .. porcentagem .. bars_brackets[2] if (UsingCustomRightText) then thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_hps, formated_heal, porcentagem, self, instancia.showing, instancia, rightText)) else if (instancia.use_multi_fontstrings) then instancia:SetInLineTexts(thisLine, formated_hps, formated_heal, porcentagem) else thisLine.lineText4:SetText(rightText) end end esta_porcentagem = _math_floor((hps/instancia.top) * 100) elseif (sub_atributo == 3) then --mostrando overall local formated_overheal = SelectedToKFunction (_, self.totalover) local percent = self.totalover / (self.totalover + self.total) * 100 local overheal_percent = _cstr ("%.1f", percent) local rr, gg, bb = _detalhes:percent_color (percent, true) rr, gg, bb = _detalhes:hex (_math_floor(rr*255)), _detalhes:hex (_math_floor(gg*255)), _detalhes:hex (_math_floor(bb*255)) overheal_percent = "|cFF" .. rr .. gg .. bb .. overheal_percent .. "|r" if (not bars_show_data [1]) then formated_overheal = "" end if (not bars_show_data [3]) then overheal_percent = "" else overheal_percent = overheal_percent .. "%" end local rightText = formated_overheal .. bars_brackets[1] .. overheal_percent .. bars_brackets[2] if (UsingCustomRightText) then thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_overheal, "", overheal_percent, self, instancia.showing, instancia, rightText)) else if (instancia.use_multi_fontstrings) then instancia:SetInLineTexts(thisLine, "", formated_overheal, overheal_percent) else thisLine.lineText4:SetText(rightText) end end esta_porcentagem = _math_floor((self.totalover/instancia.top) * 100) elseif (sub_atributo == 4) then --mostrando healing taken local formated_healtaken = SelectedToKFunction (_, self.healing_taken) if (not bars_show_data [1]) then formated_healtaken = "" end if (not bars_show_data [3]) then porcentagem = "" else porcentagem = porcentagem .. "%" end local rightText = formated_healtaken .. bars_brackets[1] .. porcentagem .. bars_brackets[2] if (UsingCustomRightText) then thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_healtaken, "", porcentagem, self, instancia.showing, instancia, rightText)) else if (instancia.use_multi_fontstrings) then instancia:SetInLineTexts(thisLine, "", formated_healtaken, porcentagem) else thisLine.lineText4:SetText(rightText) end end esta_porcentagem = _math_floor((self.healing_taken/instancia.top) * 100) elseif (sub_atributo == 5) then --mostrando enemy heal local formated_enemyheal = SelectedToKFunction (_, self.heal_enemy_amt) if (not bars_show_data [1]) then formated_enemyheal = "" end if (not bars_show_data [3]) then porcentagem = "" else porcentagem = porcentagem .. "%" end local rightText = formated_enemyheal .. bars_brackets[1] .. porcentagem .. bars_brackets[2] if (UsingCustomRightText) then thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_enemyheal, "", porcentagem, self, instancia.showing, instancia, rightText)) else if (instancia.use_multi_fontstrings) then instancia:SetInLineTexts(thisLine, "", formated_enemyheal, porcentagem) else thisLine.lineText4:SetText(rightText) end end esta_porcentagem = _math_floor((self.heal_enemy_amt/instancia.top) * 100) elseif (sub_atributo == 6) then --mostrando damage prevented local formated_absorbs = SelectedToKFunction (_, self.totalabsorb) if (not bars_show_data [1]) then formated_absorbs = "" end if (not bars_show_data [3]) then porcentagem = "" else porcentagem = porcentagem .. "%" end local rightText = formated_absorbs .. bars_brackets[1] .. porcentagem .. bars_brackets[2] if (UsingCustomRightText) then thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_absorbs, "", porcentagem, self, instancia.showing, instancia, rightText)) else if (instancia.use_multi_fontstrings) then instancia:SetInLineTexts(thisLine, "", formated_absorbs, porcentagem) else thisLine.lineText4:SetText(rightText) end end esta_porcentagem = _math_floor((self.totalabsorb/instancia.top) * 100) elseif (sub_atributo == 7) then --mostrando cura negada local formated_absorbs = SelectedToKFunction (_, self.totaldenied) if (not bars_show_data [1]) then formated_absorbs = "" end if (not bars_show_data [3]) then porcentagem = "" else porcentagem = porcentagem .. "%" end local rightText = formated_absorbs .. bars_brackets[1] .. porcentagem .. bars_brackets[2] if (UsingCustomRightText) then thisLine.lineText4:SetText(_string_replace (instancia.row_info.textR_custom_text, formated_absorbs, "", porcentagem, self, instancia.showing, instancia, rightText)) else if (instancia.use_multi_fontstrings) then instancia:SetInLineTexts(thisLine, "", formated_absorbs, porcentagem) else thisLine.lineText4:SetText(rightText) end end esta_porcentagem = _math_floor((self.totaldenied/instancia.top) * 100) end end if (thisLine.mouse_over and not instancia.baseframe.isMoving) then --precisa atualizar o tooltip gump:UpdateTooltip (whichRowLine, thisLine, instancia) end actor_class_color_r, actor_class_color_g, actor_class_color_b = self:GetBarColor() return self:RefreshBarra2 (thisLine, instancia, tabela_anterior, forcar, esta_porcentagem, whichRowLine, barras_container, use_animations) end function healingClass:RefreshBarra2 (thisLine, instancia, tabela_anterior, forcar, esta_porcentagem, whichRowLine, barras_container, use_animations) --primeiro colocado if (thisLine.colocacao == 1) then if (not tabela_anterior or tabela_anterior ~= thisLine.minha_tabela or forcar) then thisLine:SetValue(100) if (thisLine.hidden or thisLine.fading_in or thisLine.faded) then Details.FadeHandler.Fader(thisLine, "out") end return self:RefreshBarra(thisLine, instancia) else return end else if (thisLine.hidden or thisLine.fading_in or thisLine.faded) then thisLine:SetValue(esta_porcentagem) if (use_animations) then thisLine.animacao_fim = esta_porcentagem else thisLine.animacao_ignorar = true end Details.FadeHandler.Fader(thisLine, "out") if (instancia.row_info.texture_class_colors) then thisLine.textura:SetVertexColor(actor_class_color_r, actor_class_color_g, actor_class_color_b) end if (instancia.row_info.texture_background_class_color) then thisLine.background:SetVertexColor(actor_class_color_r, actor_class_color_g, actor_class_color_b) end return self:RefreshBarra(thisLine, instancia) else --agora esta comparando se a tabela da barra � diferente da tabela na atualiza��o anterior if (not tabela_anterior or tabela_anterior ~= thisLine.minha_tabela or forcar) then --aqui diz se a barra do jogador mudou de posi��o ou se ela apenas ser� atualizada if (use_animations) then thisLine.animacao_fim = esta_porcentagem else thisLine:SetValue(esta_porcentagem) thisLine.animacao_ignorar = true end thisLine.last_value = esta_porcentagem --reseta o ultimo valor da barra return self:RefreshBarra(thisLine, instancia) elseif (esta_porcentagem ~= thisLine.last_value) then --continua mostrando a mesma tabela ent�o compara a porcentagem --apenas atualizar if (use_animations) then thisLine.animacao_fim = esta_porcentagem else thisLine:SetValue(esta_porcentagem) end thisLine.last_value = esta_porcentagem return self:RefreshBarra(thisLine, instancia) end end end end function healingClass:RefreshBarra(thisLine, instancia, from_resize) local class, enemy, arena_enemy, arena_ally = self.classe, self.enemy, self.arena_enemy, self.arena_ally if (from_resize) then actor_class_color_r, actor_class_color_g, actor_class_color_b = self:GetBarColor() end --icon self:SetClassIcon (thisLine.icone_classe, instancia, class) if(thisLine.mouse_over) then local classIcon = thisLine:GetClassIcon() thisLine.iconHighlight:SetTexture(classIcon:GetTexture()) thisLine.iconHighlight:SetTexCoord(classIcon:GetTexCoord()) thisLine.iconHighlight:SetVertexColor(classIcon:GetVertexColor()) end --texture color self:SetBarColors(thisLine, instancia, actor_class_color_r, actor_class_color_g, actor_class_color_b) --left text self:SetBarLeftText (thisLine, instancia, enemy, arena_enemy, arena_ally, UsingCustomLeftText) thisLine.lineText1:SetSize(thisLine:GetWidth() - thisLine.lineText4:GetStringWidth() - 20, 15) end function _detalhes:CloseShields(combat) if (not _detalhes.parser_options.shield_overheal) then return end local shieldCache = _detalhes.ShieldCache local container = combat[2] local timeNow = time() local parser = _detalhes.parser local getSpellInfo = GetSpellInfo --does not add the spell into the spell info cache for targetName, spellid_table in pairs(shieldCache) do local tgt = container:PegarCombatente (_, targetName) if (tgt) then for spellid, owner_table in pairs(spellid_table) do local spellname = getSpellInfo(spellid) for owner, amount in pairs(owner_table) do if (amount > 0) then local obj = container:PegarCombatente (_, owner) if (obj) then parser:heal("SPELL_AURA_REMOVED", timeNow, obj.serial, owner, obj.flag_original, tgt.serial, targetName, tgt.flag_original, nil, spellid, spellname, nil, 0, _math_ceil (amount), 0, 0, nil, true) end end end end end end end --------------------------------------------- // TOOLTIPS // --------------------------------------------- ---------TOOLTIPS BIFURCA��O ~tooltip function healingClass:ToolTip (instancia, numero, barra, keydown) --seria possivel aqui colocar o icone da classe dele? if (instancia.atributo == 5) then --custom return self:TooltipForCustom (barra) else --GameTooltip:ClearLines() --GameTooltip:AddLine(barra.colocacao..". "..self.nome) if (instancia.sub_atributo <= 3) then --healing done, HPS or Overheal return self:ToolTip_HealingDone (instancia, numero, barra, keydown) elseif (instancia.sub_atributo == 6) then --healing done, HPS or Overheal return self:ToolTip_HealingDone (instancia, numero, barra, keydown) elseif (instancia.sub_atributo == 4) then --healing taken return self:ToolTip_HealingTaken (instancia, numero, barra, keydown) elseif (instancia.sub_atributo == 7) then --heal denied return self:ToolTip_HealingDenied (instancia, numero, barra, keydown) end end end --tooltip locals local r, g, b local barAlha = .6 ---------HEAL DENIED function healingClass:ToolTip_HealingDenied (instancia, numero, barra, keydown) local owner = self.owner if (owner and owner.classe) then r, g, b = unpack(_detalhes.class_colors [owner.classe]) else r, g, b = unpack(_detalhes.class_colors [self.classe]) end local container = instancia.showing [2] local totalDenied = self.totaldenied local spellList = {} --spells the player used to deny heal local targetList = {} --all players affected local spellsDenied = {} --all spells which had heal denied local healersDenied = {} --heal denied on healers local icon_size = _detalhes.tooltip.icon_size local icon_border = _detalhes.tooltip.icon_border_texcoord for spellID, spell in pairs(self.spells._ActorTable) do if (spell.totaldenied > 0 and spell.heal_denied) then --my spells which denied heal tinsert(spellList, {spell, spell.totaldenied}) --players affected for playerName, amount in pairs(spell.targets) do targetList [playerName] = (targetList [playerName] or 0) + amount end --spells with heal denied for spellID, amount in pairs(spell.heal_denied) do spellsDenied [spellID] = (spellsDenied [spellID] or 0) + amount end --healers denied for healerName, amount in pairs(spell.heal_denied_healers) do healersDenied [healerName] = (healersDenied [healerName] or 0) + amount end end end --Spells table.sort (spellList, _detalhes.Sort2) --_detalhes:AddTooltipSpellHeaderText ("Spells", headerColor, #spellList, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875) --_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) local ismaximized = false if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3) then --GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2) --_detalhes:AddTooltipHeaderStatusbar (r, g, b, 1) ismaximized = true else --GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1) --_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) end local tooltip_max_abilities = _detalhes.tooltip.tooltip_max_abilities if (ismaximized) then tooltip_max_abilities = 99 end for i = 1, _math_min(tooltip_max_abilities, #spellList) do local spellObject, spellTotal = unpack(spellList [i]) if (spellTotal < 1) then break end local spellName, _, spellIcon = _GetSpellInfo(spellObject.id) GameCooltip:AddLine(spellName .. ": ", FormatTooltipNumber (_, spellTotal) .. " (" .. _cstr ("%.1f", spellTotal / totalDenied) .."%)") GameCooltip:AddIcon (spellIcon, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) _detalhes:AddTooltipBackgroundStatusbar() end -- follow esta bugado com este display --Target Players local playerSorted = {} for playerName, amount in pairs(targetList) do tinsert(playerSorted, {playerName, amount}) end table.sort (playerSorted, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText ("Targets", headerColor, #playerSorted, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) local ismaximized = false if (keydown == "ctrl" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 4) then GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2) _detalhes:AddTooltipHeaderStatusbar (r, g, b, 1) ismaximized = true else GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) end local tooltip_max_abilities2 = _detalhes.tooltip.tooltip_max_targets if (ismaximized) then tooltip_max_abilities2 = 99 end for i = 1, _math_min(tooltip_max_abilities2, #playerSorted) do local playerName, amountDenied = unpack(playerSorted [i]) GameCooltip:AddLine(playerName .. ": ", FormatTooltipNumber (_, amountDenied) .." (" .. _cstr ("%.1f", amountDenied / totalDenied * 100) .. "%)") _detalhes:AddTooltipBackgroundStatusbar() local targetActor = container:PegarCombatente (nil, playerName) or instancia.showing [1]:PegarCombatente (nil, playerName) if (targetActor) then local classe = targetActor.classe if (not classe) then classe = "UNKNOW" end if (classe == "UNKNOW") then GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, 14, 14, .25, .5, 0, 1) else GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, 14, 14, _unpack(_detalhes.class_coords [classe])) end end end -- Spells Affected local spellsSorted = {} for spellID, amount in pairs(spellsDenied) do tinsert(spellsSorted, {spellID, amount}) end table.sort (spellsSorted, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText ("Spells Affected", headerColor, #spellsSorted, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) local ismaximized = false local tooltip_max_abilities3 = _detalhes.tooltip.tooltip_max_targets if (keydown == "alt" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 5) then tooltip_max_abilities3 = 99 ismaximized = true end for i = 1, _math_min(tooltip_max_abilities3, #spellsSorted) do local spellID, spellTotal = unpack(spellsSorted [i]) if (spellTotal < 1) then break end local spellName, _, spellIcon = _GetSpellInfo(spellID) GameCooltip:AddLine(spellName .. ": ", FormatTooltipNumber (_, spellTotal) .. " (" .. _cstr ("%.1f", spellTotal / totalDenied) .."%)") GameCooltip:AddIcon (spellIcon, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) _detalhes:AddTooltipBackgroundStatusbar() end --healers denied _detalhes:AddTooltipSpellHeaderText ("Healers", headerColor, #spellsSorted, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) local healersSorted = {} for healerName, amount in pairs(healersDenied) do tinsert(healersSorted, {healerName, amount}) end table.sort (healersSorted, _detalhes.Sort2) for i = 1, #healersSorted do local playerName, amountDenied = unpack(healersSorted [i]) GameCooltip:AddLine(playerName .. ": ", FormatTooltipNumber (_, amountDenied) .." (" .. _cstr ("%.1f", amountDenied / totalDenied * 100) .. "%)") _detalhes:AddTooltipBackgroundStatusbar() local targetActor = container:PegarCombatente (nil, playerName) or instancia.showing [1]:PegarCombatente (nil, playerName) if (targetActor) then local classe = targetActor.classe if (not classe) then classe = "UNKNOW" end if (classe == "UNKNOW") then GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, 14, 14, .25, .5, 0, 1) else GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, 14, 14, _unpack(_detalhes.class_coords [classe])) end end end return true end ---------HEALING TAKEN function healingClass:ToolTip_HealingTaken (instancia, numero, barra, keydown) local owner = self.owner if (owner and owner.classe) then r, g, b = unpack(_detalhes.class_colors [owner.classe]) else r, g, b = unpack(_detalhes.class_colors [self.classe]) end local curadores = self.healing_from local total_curado = self.healing_taken local tabela_do_combate = instancia.showing local showing = tabela_do_combate [class_type] --o que esta sendo mostrado -> [1] - dano [2] - cura --pega o container com ._NameIndexTable ._ActorTable local meus_curadores = {} for nome, _ in pairs(curadores) do --agressores seria a lista de nomes local este_curador = showing._ActorTable[showing._NameIndexTable[nome]] if (este_curador) then --checagem por causa do total e do garbage collector que n�o limpa os nomes que deram dano local alvos = este_curador.targets local este_alvo = alvos [self.nome] if (este_alvo and este_alvo > 0) then meus_curadores [#meus_curadores+1] = {nome, este_alvo, este_curador.classe} end end end --_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_FROM"], headerColor, #meus_curadores, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875) --_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) local ismaximized = false if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3) then --GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2) --_detalhes:AddTooltipHeaderStatusbar (r, g, b, 1) ismaximized = true else --GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1) --_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) end _table_sort (meus_curadores, function(a, b) return a[2] > b[2] end) local max = #meus_curadores if (max > 9) then max = 9 end if (ismaximized) then max = 99 end local lineHeight = _detalhes.tooltip.line_height for i = 1, _math_min(max, #meus_curadores) do local onyName = _detalhes:GetOnlyName(meus_curadores[i][1]) --translate cyrillic alphabet to western alphabet by Vardex (https://github.com/Vardex May 22, 2019) if (instancia.row_info.textL_translit_text) then onyName = Translit:Transliterate(onyName, "!") end GameCooltip:AddLine(onyName, FormatTooltipNumber (_, meus_curadores[i][2]).." (".._cstr ("%.1f", (meus_curadores[i][2]/total_curado) * 100).."%)") local classe = meus_curadores[i][3] if (not classe) then classe = "UNKNOW" end if (classe == "UNKNOW") then GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, lineHeight, lineHeight, .25, .5, 0, 1) else local specID = _detalhes:GetSpec(meus_curadores[i][1]) if (specID) then local texture, l, r, t, b = _detalhes:GetSpecIcon (specID, false) GameCooltip:AddIcon (texture, 1, 1, lineHeight, lineHeight, l, r, t, b) else GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, lineHeight, lineHeight, _unpack(_detalhes.class_coords [classe])) end end _detalhes:AddTooltipBackgroundStatusbar (false, meus_curadores[i][2] / meus_curadores[1][2] * 100) end return true end ---------HEALING DONE / HPS / OVERHEAL local background_heal_vs_absorbs = {value = 100, color = {1, 1, 0, .25}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar4_glass]]} function healingClass:ToolTip_HealingDone (instancia, numero, barra, keydown) local owner = self.owner if (owner and owner.classe) then r, g, b = unpack(_detalhes.class_colors [owner.classe]) else r, g, b = unpack(_detalhes.class_colors [self.classe]) end local ActorHealingTable = {} local ActorHealingTargets = {} local ActorSkillsContainer = self.spells._ActorTable local actor_key, skill_key = "total", "total" if (instancia.sub_atributo == 3) then actor_key, skill_key = "totalover", "overheal" elseif (instancia.sub_atributo == 6) then actor_key, skill_key = "totalabsorb", "totalabsorb" end local meu_tempo if (_detalhes.time_type == 1 or not self.grupo) then meu_tempo = self:Tempo() elseif (_detalhes.time_type == 2 or _detalhes.time_type == 3) then meu_tempo = instancia.showing:GetCombatTime() end local ActorTotal = self [actor_key] --add actor spells for _spellid, _skill in pairs(ActorSkillsContainer) do local SkillName, _, SkillIcon = _GetSpellInfo(_spellid) if (_skill [skill_key] > 0 or _skill.anti_heal) then tinsert(ActorHealingTable, { _spellid, _skill [skill_key], _skill [skill_key]/ActorTotal*100, {SkillName, nil, SkillIcon}, _skill [skill_key]/meu_tempo, _skill.total, false, _skill.anti_heal, }) end end --add actor pets for petIndex, petName in ipairs(self:Pets()) do local petActor = instancia.showing[class_type]:PegarCombatente (nil, petName) if (petActor) then for _spellid, _skill in pairs(petActor:GetActorSpells()) do if (_skill [skill_key] > 0) then local SkillName, _, SkillIcon = _GetSpellInfo(_spellid) local petName = petName:gsub((" <.*"), "") ActorHealingTable [#ActorHealingTable+1] = { _spellid, _skill [skill_key], _skill [skill_key]/ActorTotal*100, {SkillName, nil, SkillIcon}, _skill [skill_key]/meu_tempo, _skill.total, petName } end end end end _table_sort (ActorHealingTable, _detalhes.Sort2) --TOP Curados ActorSkillsContainer = self.targets for targetName, amount in pairs(ActorSkillsContainer) do if (amount > 0) then --translate cyrillic alphabet to western alphabet by Vardex (https://github.com/Vardex May 22, 2019) if (instancia.row_info.textL_translit_text) then targetName = Translit:Transliterate(targetName, "!") end tinsert(ActorHealingTargets, {targetName, amount, amount / ActorTotal * 100}) end end _table_sort (ActorHealingTargets, _detalhes.Sort2) --Mostra as habilidades no tooltip --_detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #ActorHealingTable, [[Interface\RAIDFRAME\Raid-Icon-Rez]], 0.109375, 0.890625, 0.0625, 0.90625) local ismaximized = false if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3) then --GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2) --_detalhes:AddTooltipHeaderStatusbar (r, g, b, 1) ismaximized = true else --GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1) --_detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) end local tooltip_max_abilities = _detalhes.tooltip.tooltip_max_abilities if (instancia.sub_atributo == 3 or instancia.sub_atributo == 2) then tooltip_max_abilities = 9 end if (ismaximized) then tooltip_max_abilities = 99 end local icon_size = _detalhes.tooltip.icon_size local icon_border = _detalhes.tooltip.icon_border_texcoord local topAbility = ActorHealingTable [1] and ActorHealingTable [1][2] or 0 for i = 1, _math_min(tooltip_max_abilities, #ActorHealingTable) do if (ActorHealingTable[i][2] < 1) then local antiHeal = ActorHealingTable[i][8] if (not antiHeal) then break end end local spellName = ActorHealingTable[i][4][1] local petName = ActorHealingTable[i][7] if (petName) then spellName = spellName .. " (|cFFCCBBBB" .. petName .. "|r)" end if (instancia.sub_atributo == 2) then --hps local formatedTotal = FormatTooltipNumber (_, _math_floor(ActorHealingTable[i][5])) local antiHeal = ActorHealingTable[i][8] if (antiHeal) then formatedTotal = formatedTotal .. " [|cFFFF5500" .. FormatTooltipNumber (_, _math_floor(antiHeal)) .." " .. Loc ["STRING_DAMAGE"] .."|r] " end GameCooltip:AddLine(spellName , formatedTotal .. " (".._cstr ("%.1f", ActorHealingTable[i][3]).."%)") elseif (instancia.sub_atributo == 3) then --overheal local overheal = ActorHealingTable[i][2] local total = ActorHealingTable[i][6] local formatedTotal = FormatTooltipNumber (_, _math_floor(ActorHealingTable[i][2])) local antiHeal = ActorHealingTable[i][8] if (antiHeal) then formatedTotal = formatedTotal .. " [|cFFFF5500" .. FormatTooltipNumber (_, _math_floor(antiHeal)) .." " .. Loc ["STRING_DAMAGE"] .."|r] " end GameCooltip:AddLine(spellName .." (|cFFFF3333" .. _math_floor( (overheal / (overheal+total)) *100) .. "%|r)", formatedTotal .. " (".._cstr ("%.1f", ActorHealingTable[i][3]).."%)") else local formatedTotal = FormatTooltipNumber (_, ActorHealingTable[i][2]) local antiHeal = ActorHealingTable[i][8] if (antiHeal) then formatedTotal = formatedTotal .. " [|cFFFF5500" .. FormatTooltipNumber (_, _math_floor(antiHeal)) .." " .. Loc ["STRING_DAMAGE"] .."|r] " end GameCooltip:AddLine(spellName , formatedTotal .. " (" .. _cstr ("%.1f", ActorHealingTable[i][3]) .. "%)") end GameCooltip:AddIcon (ActorHealingTable[i][4][3], nil, nil, icon_size.W+4, icon_size.H+4, icon_border.L, icon_border.R, icon_border.T, icon_border.B) _detalhes:AddTooltipBackgroundStatusbar (false, ActorHealingTable[i][2] / topAbility * 100) end if (instancia.sub_atributo == 6) then GameCooltip:AddLine("") GameCooltip:AddLine(Loc ["STRING_REPORT_LEFTCLICK"], nil, 1, _unpack(self.click_to_report_color)) GameCooltip:AddIcon ([[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]], 1, 1, 12, 16, 0.015625, 0.13671875, 0.4375, 0.59765625) GameCooltip:ShowCooltip() end local container = instancia.showing [2] local topTarget = ActorHealingTargets [1] and ActorHealingTargets [1][2] or 0 if (instancia.sub_atributo == 1) then -- 1 or 2 -> healing done or hps _detalhes:AddTooltipSpellHeaderText ("", headerColor, 1, false, 0.1, 0.9, 0.1, 0.9, true) --add a space _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_TARGETS"], headerColor, #ActorHealingTargets, [[Interface\TUTORIALFRAME\UI-TutorialFrame-LevelUp]], 0.10546875, 0.89453125, 0.05859375, 0.6796875) local ismaximized = false if (keydown == "ctrl" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 4) then GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2) _detalhes:AddTooltipHeaderStatusbar (r, g, b, 1) ismaximized = true else GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) end local tooltip_max_abilities2 = _detalhes.tooltip.tooltip_max_targets if (ismaximized) then tooltip_max_abilities2 = 99 end for i = 1, _math_min(tooltip_max_abilities2, #ActorHealingTargets) do if (ActorHealingTargets[i][2] < 1) then break end if (ismaximized and ActorHealingTargets[i][1]:find(_detalhes.playername)) then GameCooltip:AddLine(ActorHealingTargets[i][1], FormatTooltipNumber (_, ActorHealingTargets[i][2]) .." (".._cstr ("%.1f", ActorHealingTargets[i][3]).."%)", nil, "yellow") GameCooltip:AddStatusBar (100, 1, .5, .5, .5, .7) else GameCooltip:AddLine(ActorHealingTargets[i][1], FormatTooltipNumber (_, ActorHealingTargets[i][2]) .." (".._cstr ("%.1f", ActorHealingTargets[i][3]).."%)") _detalhes:AddTooltipBackgroundStatusbar (false, ActorHealingTargets[i][2] / topTarget * 100) end local targetActor = container:PegarCombatente (nil, ActorHealingTargets[i][1]) if (targetActor) then local classe = targetActor.classe if (not classe) then classe = "UNKNOW" end if (classe == "UNKNOW") then GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, icon_size.W, icon_size.H, .25, .5, 0, 1) else GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, icon_size.W, icon_size.H, _unpack(_detalhes.class_coords [classe])) end end end end --PETS local meus_pets = self.pets if (#meus_pets > 0 and (instancia.sub_atributo == 1 or instancia.sub_atributo == 2 or instancia.sub_atributo == 3)) then --teve ajudantes local quantidade = {} --armazena a quantidade de pets iguais local totais = {} --armazena o dano total de cada objeto for index, nome in ipairs(meus_pets) do if (not quantidade [nome]) then quantidade [nome] = 1 local my_self = instancia.showing [class_type]:PegarCombatente (nil, nome) if (my_self) then local meu_tempo if (_detalhes.time_type == 1 or not self.grupo) then meu_tempo = my_self:Tempo() elseif (_detalhes.time_type == 2 or _detalhes.time_type == 3) then meu_tempo = instancia.showing:GetCombatTime() end if (instancia.sub_atributo == 3) then totais [#totais+1] = {nome, my_self.totalover, my_self.total_without_pet} else totais [#totais+1] = {nome, my_self.total_without_pet, my_self.total_without_pet / meu_tempo} end end else quantidade [nome] = quantidade [nome]+1 end end local added_logo = false _table_sort (totais, _detalhes.Sort2) local ismaximized = false if (keydown == "alt" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 5) then ismaximized = true end for index, _table in ipairs(totais) do if (_table [2] >= 1 and (index < 3 or ismaximized)) then if (not added_logo) then added_logo = true _detalhes:AddTooltipSpellHeaderText ("", headerColor, 1, false, 0.1, 0.9, 0.1, 0.9, true) --add a space _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_PETS"], headerColor, #totais, [[Interface\COMMON\friendship-heart]], 0.21875, 0.78125, 0.09375, 0.6875) if (ismaximized) then GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_alt]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay2) _detalhes:AddTooltipHeaderStatusbar (r, g, b, 1) else GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_alt]], 1, 2, _detalhes.tooltip_key_size_width, _detalhes.tooltip_key_size_height, 0, 1, 0, 0.640625, _detalhes.tooltip_key_overlay1) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) end end local n = _table [1]:gsub(("%s%<.*"), "") if (instancia.sub_atributo == 3) then --overheal GameCooltip:AddLine(n .. " (|cFFFF3333" .. _math_floor( (_table [2] / (_table [2] + _table [3])) * 100) .. "%|r):", FormatTooltipNumber (_, _math_floor(_table [2])) .. " (" .. _math_floor( (_table [2] / (_table [2] + _table [3])) * 100) .. "%)") elseif (instancia.sub_atributo == 2) then --hps GameCooltip:AddLine(n, FormatTooltipNumber (_, _math_floor(_table [3])) .. " (" .. _math_floor(_table [2]/self.total*100) .. "%)") else GameCooltip:AddLine(n, FormatTooltipNumber (_, _table [2]) .. " (" .. _math_floor(_table [2]/self.total*100) .. "%)") end _detalhes:AddTooltipBackgroundStatusbar() GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small]], 1, 1, icon_size.W, icon_size.H, 0.25, 0.49609375, 0.75, 1) end end end --~Phases if (instancia.sub_atributo == 1 or instancia.sub_atributo == 2) then local segment = instancia:GetShowingCombat() if (segment and self.grupo) then local bossInfo = segment:GetBossInfo() local phasesInfo = segment:GetPhases() if (bossInfo and phasesInfo) then if (#phasesInfo > 1) then _detalhes:AddTooltipSpellHeaderText ("", headerColor, 1, false, 0.1, 0.9, 0.1, 0.9, true) --add a space _detalhes:AddTooltipSpellHeaderText ("Healing by Encounter Phase", headerColor, 1, [[Interface\Garrison\orderhall-missions-mechanic8]], 11/64, 53/64, 11/64, 53/64) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) local playerPhases = {} local totalDamage = 0 for phase, playersTable in pairs(phasesInfo.heal) do --each phase local allPlayers = {} --all players for this phase for playerName, amount in pairs(playersTable) do tinsert(allPlayers, {playerName, amount}) totalDamage = totalDamage + amount end table.sort (allPlayers, function(a, b) return a[2] > b[2] end) local myRank = 0 for i = 1, #allPlayers do if (allPlayers [i] [1] == self.nome) then myRank = i break end end tinsert(playerPhases, {phase, playersTable [self.nome] or 0, myRank, (playersTable [self.nome] or 0) / totalDamage * 100}) end table.sort (playerPhases, function(a, b) return a[1] < b[1] end) for i = 1, #playerPhases do --[1] Phase Number [2] Amount Done [3] Rank [4] Percent GameCooltip:AddLine("|cFFF0F0F0Phase|r " .. playerPhases [i][1], FormatTooltipNumber (_, playerPhases [i][2]) .. " (|cFFFFFF00#" .. playerPhases [i][3] .. "|r, " .. _cstr ("%.1f", playerPhases [i][4]) .. "%)") GameCooltip:AddIcon ([[Interface\Garrison\orderhall-missions-mechanic9]], 1, 1, 14, 14, 11/64, 53/64, 11/64, 53/64) _detalhes:AddTooltipBackgroundStatusbar() end end end end end return true end --------------------------------------------- // JANELA DETALHES // --------------------------------------------- ---------- bifurca��o function healingClass:MontaInfo() if (breakdownWindowFrame.sub_atributo == 1 or breakdownWindowFrame.sub_atributo == 2) then self:MontaInfoHealingDone() --[=[ local bNeedUpdateAgain = false --sort by healing done ---@type df_headerframe local spellsHeader = DetailsSpellBreakdownTab.GetSpellScrollFrame().Header local totalHeader = spellsHeader:GetHeaderColumnByName("amount") if (totalHeader and totalHeader:IsShown()) then local columnSelected, order, key, name = spellsHeader:GetSelectedColumn() if (name == "overheal") then totalHeader:Click() bNeedUpdateAgain = true end end ---@type df_headerframe local targetsHeader = DetailsSpellBreakdownTab.GetTargetScrollFrame().Header local totalHeader = targetsHeader:GetHeaderColumnByName("amount") if (totalHeader and totalHeader:IsShown()) then local columnSelected, order, key, name = targetsHeader:GetSelectedColumn() if (name == "overheal") then totalHeader:Click() bNeedUpdateAgain = true end end if (bNeedUpdateAgain) then self:MontaInfoHealingDone() end --]=] elseif (breakdownWindowFrame.sub_atributo == 3) then self:MontaInfoHealingDone() --[=[ local bNeedUpdateAgain = false --sort by overhealing ---@type df_headerframe local spellsHeader = DetailsSpellBreakdownTab.GetSpellScrollFrame().Header local overhealHeader = spellsHeader:GetHeaderColumnByName("overheal") if (overhealHeader and overhealHeader:IsShown()) then local columnSelected, order, key, name = spellsHeader:GetSelectedColumn() if (name ~= "overheal") then overhealHeader:Click() bNeedUpdateAgain = true end end ---@type df_headerframe local targetsHeader = DetailsSpellBreakdownTab.GetTargetScrollFrame().Header local overhealHeader = targetsHeader:GetHeaderColumnByName("overheal") if (overhealHeader and overhealHeader:IsShown()) then local columnSelected, order, key, name = targetsHeader:GetSelectedColumn() if (name ~= "overheal") then overhealHeader:Click() bNeedUpdateAgain = true end end if (bNeedUpdateAgain) then self:MontaInfoHealingDone() end --]=] elseif (breakdownWindowFrame.sub_atributo == 4) then self:MontaInfoHealTaken() end end local healingTakenHeadersAllowed = {icon = true, name = true, rank = true, amount = true, persecond = true, percent = true} function healingClass:MontaInfoHealTaken() ---@type actor local actorObject = self ---@type instance local instance = breakdownWindowFrame.instancia ---@type combat local combatObject = instance:GetCombat() ---@type string local actorName = actorObject:Name() ---@type number local healTakenTotal = actorObject.healing_taken ---@type table local healTakenFrom = actorObject.healing_from ---@type actorcontainer local healContainer = combatObject:GetContainer(class_type) local resultTable = {} ---@type string for healerName in pairs(healTakenFrom) do local sourceActorObject = healContainer:GetActor(healerName) if (sourceActorObject) then ---@type table local targets = sourceActorObject:GetTargets() ---@type number|nil local amountOfHeal = targets[actorName] if (amountOfHeal) then ---@type texturetable local iconTable = Details:GetActorIcon(sourceActorObject) ---@type {name: string, amount: number, icon: texturetable} local healTakenTable = {name = healerName, total = amountOfHeal, icon = iconTable} resultTable[#resultTable+1] = healTakenTable end end end resultTable.totalValue = healTakenTotal resultTable.combatTime = combatObject:GetCombatTime() resultTable.headersAllowed = healingTakenHeadersAllowed Details222.BreakdownWindow.SendGenericData(resultTable, actorObject, combatObject, instance) if true then return end local healing_taken = self.healing_taken local curandeiros = self.healing_from local instancia = breakdownWindowFrame.instancia local tabela_do_combate = instancia.showing local showing = tabela_do_combate [class_type] --o que esta sendo mostrado -> [1] - dano [2] - cura --pega o container com ._NameIndexTable ._ActorTable local barras = breakdownWindowFrame.barras1 local meus_curandeiros = {} local este_curandeiro for nome, _ in pairs(curandeiros) do este_curandeiro = showing._ActorTable[showing._NameIndexTable[nome]] if (este_curandeiro) then local alvos = este_curandeiro.targets local este_alvo = alvos [self.nome] if (este_alvo) then meus_curandeiros [#meus_curandeiros+1] = {nome, este_alvo, este_alvo/healing_taken*100, este_curandeiro.classe} end end end local amt = #meus_curandeiros if (amt < 1) then return true end _table_sort (meus_curandeiros, _detalhes.Sort2) gump:JI_AtualizaContainerBarras (amt) local max_ = meus_curandeiros [1] and meus_curandeiros [1][2] or 0 local barra for index, tabela in ipairs(meus_curandeiros) do barra = barras [index] if (not barra) then barra = gump:CriaNovaBarraInfo1 (instancia, index) end self:FocusLock(barra, tabela[1]) --hes:UpdadeInfoBar(row, index, spellid, name, value, max, percent, icon, detalhes) local texCoords = CLASS_ICON_TCOORDS [tabela[4]] if (not texCoords) then texCoords = _detalhes.class_coords ["UNKNOW"] end local formated_value = SelectedToKFunction (_, _math_floor(tabela[2])) self:UpdadeInfoBar(barra, index, tabela[1], tabela[1], tabela[2], formated_value, max_, tabela[3], "Interface\\AddOns\\Details\\images\\classes_small", true, texCoords) end end function healingClass:MontaInfoOverHealing() --this should be deprecated now --pegar as habilidade de dar sort no heal local instancia = breakdownWindowFrame.instancia local total = self.totalover local tabela = self.spells._ActorTable local minhas_curas = {} local barras = breakdownWindowFrame.barras1 for spellid, tabela in pairs(tabela) do local nome, _, icone = _GetSpellInfo(spellid) tinsert(minhas_curas, {spellid, tabela.overheal, tabela.overheal/total*100, nome, icone}) end --add pets local ActorPets = self.pets local class_color = "FFDDDDDD" for _, PetName in ipairs(ActorPets) do local PetActor = instancia.showing (class_type, PetName) if (PetActor) then local PetSkillsContainer = PetActor.spells._ActorTable for _spellid, _skill in pairs(PetSkillsContainer) do --da foreach em cada spellid do container local nome, _, icone = _GetSpellInfo(_spellid) tinsert(minhas_curas, {_spellid, _skill.overheal, _skill.overheal/total*100, nome .. " (|c" .. class_color .. PetName:gsub((" <.*"), "") .. "|r)", icone, PetActor}) end end end _table_sort (minhas_curas, _detalhes.Sort2) local amt = #minhas_curas gump:JI_AtualizaContainerBarras (amt) local max_ = minhas_curas[1] and minhas_curas[1][2] or 0 for index, tabela in ipairs(minhas_curas) do local barra = barras [index] if (not barra) then barra = gump:CriaNovaBarraInfo1 (instancia, index) barra.textura:SetStatusBarColor(1, 1, 1, 1) barra.on_focus = false end if (not breakdownWindowFrame.mostrando_mouse_over) then if (tabela[1] == self.detalhes) then --tabela [1] = spellid = spellid que esta na caixa da direita if (not barra.on_focus) then --se a barra n�o tiver no foco barra.textura:SetStatusBarColor(129/255, 125/255, 69/255, 1) barra.on_focus = true if (not breakdownWindowFrame.mostrando) then breakdownWindowFrame.mostrando = barra end end else if (barra.on_focus) then barra.textura:SetStatusBarColor(1, 1, 1, 1) --volta a cor antiga barra:SetAlpha(.9) --volta a alfa antiga barra.on_focus = false end end end if (index == 1) then barra.textura:SetValue(100) else barra.textura:SetValue(tabela[2]/max_*100) --muito mais rapido... end barra.lineText1:SetText(index..instancia.divisores.colocacao..tabela[4]) --seta o texto da esqueda local formated_value = SelectedToKFunction (_, _math_floor(tabela[2])) barra.lineText4:SetText(formated_value .." (".. _cstr ("%.1f", tabela[3]) .."%)") barra.icone:SetTexture(tabela[5]) barra.other_actor = tabela [6] barra.minha_tabela = self barra.show = tabela[1] barra:Show() if (self.detalhes and self.detalhes == barra.show) then self:MontaDetalhes (self.detalhes, barra) end end --TOP OVERHEALED local jogadores_overhealed = {} tabela = self.targets_overheal local heal_container = instancia.showing[2] for target_name, amount in pairs(tabela) do local classe = "UNKNOW" local actor_object = heal_container._ActorTable [heal_container._NameIndexTable [tabela.nome]] if (actor_object) then classe = actor_object.classe end tinsert(jogadores_overhealed, {target_name, amount, amount/total*100, classe}) end _table_sort (jogadores_overhealed, _detalhes.Sort2) local amt_alvos = #jogadores_overhealed gump:JI_AtualizaContainerAlvos (amt_alvos) local max_inimigos = jogadores_overhealed[1] and jogadores_overhealed[1][2] or 0 for index, tabela in ipairs(jogadores_overhealed) do local barra = breakdownWindowFrame.barras2 [index] if (not barra) then barra = gump:CriaNovaBarraInfo2 (instancia, index) barra.textura:SetStatusBarColor(1, 1, 1, 1) end if (index == 1) then barra.textura:SetValue(100) else barra.textura:SetValue(tabela[2]/max_*100) end barra.lineText1:SetText(index..instancia.divisores.colocacao..tabela[1]) --seta o texto da esqueda barra.lineText4:SetText(_detalhes:comma_value (tabela[2]) .." ".. instancia.divisores.abre .. _cstr ("%.1f", tabela[3]) .. instancia.divisores.fecha) barra.lineText1:SetWidth(barra:GetWidth() - barra.lineText4:GetStringWidth() - 30) -- icon barra.icone:SetTexture([[Interface\AddOns\Details\images\classes_small]]) local texCoords = _detalhes.class_coords [tabela[4]] if (not texCoords) then texCoords = _detalhes.class_coords ["UNKNOW"] end barra.icone:SetTexCoord(_unpack(texCoords)) barra.minha_tabela = self barra.nome_inimigo = tabela [1] barra:Show() end end function healingClass:MontaInfoHealingDone() ---@type actor local actorObject = self ---@type instance local instance = breakdownWindowFrame.instancia ---@type combat local combatObject = instance:GetCombat() ---@type string local playerName = actorObject:Name() ---@type number local actorTotal = actorObject.total ---@type table local actorSpellsSorted = {} ---@type table local actorSpells = actorObject:GetSpellList() --get time local actorCombatTime if (Details.time_type == 1 or not actorObject.grupo) then actorCombatTime = actorObject:Tempo() elseif (Details.time_type == 2 or Details.use_realtimedps) then actorCombatTime = breakdownWindowFrame.instancia.showing:GetCombatTime() end --actor spells ---@type table local alreadyAdded = {} for spellId, spellTable in pairs(actorSpells) do ---@cast spellId number ---@cast spellTable spelltable spellTable.ChartData = nil ---@type string local spellName = _GetSpellInfo(spellId) if (spellName) then ---@type number in which index the spell with the same name was stored local index = alreadyAdded[spellName] if (index) then ---@type spelltableadv local bkSpellData = actorSpellsSorted[index] bkSpellData.spellTables[#bkSpellData.spellTables+1] = spellTable ---@type bknesteddata local nestedData = {spellId = spellId, spellTable = spellTable, actorName = "", value = 0} bkSpellData.nestedData[#bkSpellData.nestedData+1] = nestedData bkSpellData.bCanExpand = true else ---@type spelltableadv local bkSpellData = { id = spellId, spellschool = spellTable.spellschool, bIsExpanded = Details222.BreakdownWindow.IsSpellExpanded(spellId), bCanExpand = false, spellTables = {spellTable}, nestedData = {{spellId = spellId, spellTable = spellTable, actorName = "", value = 0}}, } detailsFramework:Mixin(bkSpellData, Details.SpellTableMixin) actorSpellsSorted[#actorSpellsSorted+1] = bkSpellData alreadyAdded[spellName] = #actorSpellsSorted end end end --pets spells local actorPets = actorObject:GetPets() for _, petName in ipairs(actorPets) do ---@type actor local petActor = combatObject(DETAILS_ATTRIBUTE_HEAL, petName) if (petActor) then --PET local spells = petActor:GetSpellList() for spellId, spellTable in pairs(spells) do ---@cast spellId number ---@cast spellTable spelltable spellTable.ChartData = nil --PET ---@type string local spellName = _GetSpellInfo(spellId) if (spellName) then ---@type number in which index the spell with the same name was stored local index = alreadyAdded[spellName] if (index) then --PET ---@type spelltableadv local bkSpellData = actorSpellsSorted[index] bkSpellData.spellTables[#bkSpellData.spellTables+1] = spellTable ---@type bknesteddata local nestedData = {spellId = spellId, spellTable = spellTable, actorName = petName, value = 0} bkSpellData.nestedData[#bkSpellData.nestedData+1] = nestedData bkSpellData.bCanExpand = true else --PET ---@type spelltableadv local bkSpellData = { id = spellId, actorName = petName, spellschool = spellTable.spellschool, expanded = Details222.BreakdownWindow.IsSpellExpanded(spellId), bCanExpand = false, spellTables = {spellTable}, nestedData = {{spellId = spellId, spellTable = spellTable, actorName = petName, value = 0}}, } detailsFramework:Mixin(bkSpellData, Details.SpellTableMixin) actorSpellsSorted[#actorSpellsSorted+1] = bkSpellData alreadyAdded[spellName] = #actorSpellsSorted end end end end end for i = 1, #actorSpellsSorted do ---@type spelltableadv local bkSpellData = actorSpellsSorted[i] Details.SpellTableMixin.SumSpellTables(bkSpellData.spellTables, bkSpellData) --Details:Destroy(bkSpellData, "spellTables") end --table.sort(actorSpellsSorted, Details.Sort2) table.sort(actorSpellsSorted, function(t1, t2) return t1.total > t2.total end) actorSpellsSorted.totalValue = actorTotal actorSpellsSorted.combatTime = actorCombatTime --cleanup Details:Destroy(alreadyAdded) --actorSpellsSorted has the spell infomation, need to pass to the summary tab --send to the breakdown window Details222.BreakdownWindow.SendSpellData(actorSpellsSorted, actorObject, combatObject, instance) --targets ---an array of breakdowntargettable ---@type breakdowntargettable[] local targetList = {} --get the targets table: in the class heal, an actor has two targets table, one for normal healing and one for overheal ---@type targettable local normalTargetsTable = self:GetTargets("targets") ---@type targettable local overhealTargetsTable = self:GetTargets("targets_overheal") local targetTotalValue = 0 local targetOverhealTotalValue = 0 --build the data required by the breakdown window for targetName, amount in pairs(normalTargetsTable) do if (amount > 0) then local overhealAmount = overhealTargetsTable[targetName] or 0 ---@type breakdowntargettable local bkTargetData = { name = targetName, total = amount, overheal = overhealAmount, } targetTotalValue = targetTotalValue + amount targetOverhealTotalValue = targetOverhealTotalValue + (overhealAmount) tinsert(targetList, bkTargetData) end end for targetName, amount in pairs(overhealTargetsTable) do if (amount > 0) then if (not normalTargetsTable[targetName]) then ---@type breakdowntargettable local bkTargetData = { name = targetName, total = 0, overheal = amount, } targetOverhealTotalValue = targetOverhealTotalValue + (amount) tinsert(targetList, bkTargetData) end end end targetList.totalValue = targetTotalValue targetList.totalValueOverheal = targetOverhealTotalValue targetList.combatTime = actorCombatTime Details222.BreakdownWindow.SendTargetData(targetList, actorObject, combatObject, instance) if 1 then return end local instancia = breakdownWindowFrame.instancia local total = self.total local tabela = self.spells._ActorTable local minhas_curas = {} local barras = breakdownWindowFrame.barras1 --get time type local meu_tempo if (_detalhes.time_type == 1 or not self.grupo) then meu_tempo = self:Tempo() elseif (_detalhes.time_type == 2 or _detalhes.time_type == 3) then meu_tempo = breakdownWindowFrame.instancia.showing:GetCombatTime() end for spellid, tabela in pairs(tabela) do local nome, rank, icone = _GetSpellInfo(spellid) tinsert(minhas_curas, { spellid, tabela.total, tabela.total/total*100, nome, icone, false, --not a pet tabela.anti_heal, }) end breakdownWindowFrame:SetStatusbarText() --add pets local ActorPets = self.pets --local class_color = RAID_CLASS_COLORS [self.classe] and RAID_CLASS_COLORS [self.classe].colorStr local class_color = "FFDDDDDD" for _, PetName in ipairs(ActorPets) do local PetActor = instancia.showing (class_type, PetName) if (PetActor) then local PetSkillsContainer = PetActor.spells._ActorTable for _spellid, _skill in pairs(PetSkillsContainer) do --da foreach em cada spellid do container local nome, _, icone = _GetSpellInfo(_spellid) tinsert(minhas_curas, { _spellid, _skill.total, _skill.total/total*100, nome .. " (|c" .. class_color .. PetName:gsub((" <.*"), "") .. "|r)", icone, PetActor }) end end end _table_sort (minhas_curas, _detalhes.Sort2) local amt = #minhas_curas gump:JI_AtualizaContainerBarras (amt) local max_ = minhas_curas[1] and minhas_curas[1][2] or 0 local foundSpellDetail = false for index, tabela in ipairs(minhas_curas) do local barra = barras [index] if (not barra) then barra = gump:CriaNovaBarraInfo1 (instancia, index) barra.textura:SetStatusBarColor(1, 1, 1, 1) barra.on_focus = false end self:FocusLock(barra, tabela[1]) barra.other_actor = tabela [6] if (breakdownWindowFrame.sub_atributo == 2) then local formated_value = SelectedToKFunction (_, _math_floor(tabela[2]/meu_tempo)) self:UpdadeInfoBar(barra, index, tabela[1], tabela[4], tabela[2], formated_value, max_, tabela[3], tabela[5], true) else local formated_value = SelectedToKFunction (_, _math_floor(tabela[2])) if (tabela [7]) then formated_value = formated_value .. " [|cFFFF5500" .. SelectedToKFunction (_, _math_floor(tabela [7])) .." " .. Loc ["STRING_DAMAGE"] .."|r] " end self:UpdadeInfoBar(barra, index, tabela[1], tabela[4], tabela[2], formated_value, max_, tabela[3], tabela[5], true) end barra.minha_tabela = self barra.show = tabela[1] barra.spellid = self.nome barra:Show() if (self.detalhes and self.detalhes == barra.show and not foundSpellDetail) then self:MontaDetalhes (self.detalhes, barra) foundSpellDetail = true end end --TOP CURADOS local healedTargets = {} tabela = self.targets for target_name, amount in pairs(tabela) do tinsert(healedTargets, {target_name, amount, amount / total*100}) end _table_sort(healedTargets, _detalhes.Sort2) gump:JI_AtualizaContainerAlvos(#healedTargets) local topHealingDone = max(healedTargets[1] and healedTargets[1][2] or 0, 0.0001) for index, healDataTable in ipairs(healedTargets) do local barra = breakdownWindowFrame.barras2[index] if (not barra) then barra = gump:CriaNovaBarraInfo2(instancia, index) barra.textura:SetStatusBarColor(1, 1, 1, 1) end local healingDone = healDataTable[2] if (index == 1) then barra.textura:SetValue(100) else barra.textura:SetValue(healingDone / topHealingDone * 100) end local target_actor = instancia.showing(2, healDataTable[1]) if (target_actor) then target_actor:SetClassIcon(barra.icone, instancia, target_actor.classe) else barra.icone:SetTexture([[Interface\AddOns\Details\images\classes_small_alpha]]) --CLASSE local texCoords = _detalhes.class_coords ["ENEMY"] barra.icone:SetTexCoord(_unpack(texCoords)) end barra.lineText1:SetText(index .. ". " .. _detalhes:GetOnlyName(healDataTable[1])) barra.textura:SetStatusBarColor(1, 1, 1, 1) if (breakdownWindowFrame.sub_atributo == 2) then barra.lineText4:SetText(_detalhes:comma_value(_math_floor(healingDone/meu_tempo)) .." (" .. _cstr ("%.1f", healDataTable[3]) .. "%)") else barra.lineText4:SetText(SelectedToKFunction(_, healingDone) .. " (" .. _cstr ("%.1f", healDataTable[3]) .. "%)") end barra.minha_tabela = self barra.nome_inimigo = healDataTable[1] -- no lugar do spell id colocar o que? barra.spellid = healDataTable[5] barra:Show() end end function healingClass:MontaTooltipAlvos (thisLine, index, instancia) local inimigo = thisLine.nome_inimigo local container = self.spells._ActorTable local habilidades = {} local total local sub_atributo = breakdownWindowFrame.instancia.sub_atributo local targets_key = "" if (sub_atributo == 3) then --overheal total = self.totalover targets_key = "_overheal" else total = self.total end _detalhes:FormatCooltipForSpells() GameCooltip:SetOwner(thisLine, "bottom", "top", 4, -2) GameCooltip:SetOption("MinWidth", max(230, thisLine:GetWidth()*0.98)) --add spells for spellid, tabela in pairs(container) do for target_name, amount in pairs(tabela ["targets" .. targets_key]) do if (target_name == inimigo) then local nome, _, icone = _GetSpellInfo(spellid) habilidades [#habilidades+1] = {nome, amount, icone} end end end --add pets local ActorPets = self.pets for _, PetName in ipairs(ActorPets) do local PetActor = instancia.showing (class_type, PetName) if (PetActor) then local PetSkillsContainer = PetActor.spells._ActorTable for _spellid, _skill in pairs(PetSkillsContainer) do for target_name, amount in pairs(_skill ["targets" .. targets_key]) do if (target_name == inimigo) then local nome, _, icone = _GetSpellInfo(_spellid) habilidades [#habilidades+1] = {nome, amount, icone} end end end end end _table_sort (habilidades, _detalhes.Sort2) --get time type local meu_tempo if (_detalhes.time_type == 1 or not self.grupo) then meu_tempo = self:Tempo() elseif (_detalhes.time_type == 2 or _detalhes.time_type == 3) then meu_tempo = breakdownWindowFrame.instancia.showing:GetCombatTime() end local is_hps = breakdownWindowFrame.instancia.sub_atributo == 2 if (is_hps) then --GameTooltip:AddLine(index..". "..inimigo) --GameTooltip:AddLine(Loc ["STRING_HEALING_HPS_FROM"] .. ":") --GameTooltip:AddLine(" ") _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_HEALING_HPS_FROM"] .. ":", {1, 0.9, 0.0, 1}, 1, _detalhes.tooltip_spell_icon.file, unpack(_detalhes.tooltip_spell_icon.coords)) _detalhes:AddTooltipHeaderStatusbar (1, 1, 1, 1) else --GameTooltip:AddLine(index..". "..inimigo) --GameTooltip:AddLine(Loc ["STRING_HEALING_FROM"] .. ":") --GameTooltip:AddLine(" ") _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_HEALING_FROM"] .. ":", {1, 0.9, 0.0, 1}, 1, _detalhes.tooltip_spell_icon.file, unpack(_detalhes.tooltip_spell_icon.coords)) _detalhes:AddTooltipHeaderStatusbar (1, 1, 1, 1) end local icon_size = _detalhes.tooltip.icon_size local icon_border = _detalhes.tooltip.icon_border_texcoord local topSpellHeal = habilidades[1] and habilidades[1][2] if (topSpellHeal) then for index, tabela in ipairs(habilidades) do if (tabela [2] < 1) then break end local spellName, spellIcon = tabela[1], tabela [3] if (is_hps) then GameCooltip:AddLine(spellName, _detalhes:comma_value (_math_floor(tabela[2]/meu_tempo)).." (".. _cstr ("%.1f", tabela[2]/total*100).."%)") else GameCooltip:AddLine(spellName, SelectedToKFunction (_, tabela[2]).." (".. _cstr ("%.1f", tabela[2]/total*100).."%)") end GameCooltip:AddIcon (spellIcon, nil, nil, icon_size.W + 4, icon_size.H + 4, icon_border.L, icon_border.R, icon_border.T, icon_border.B) _detalhes:AddTooltipBackgroundStatusbar (false, tabela[2] / topSpellHeal * 100) end end GameCooltip:Show() return true end function healingClass:MontaDetalhes (spellid, barra) --bifurga��es if (breakdownWindowFrame.sub_atributo == 1 or breakdownWindowFrame.sub_atributo == 2 or breakdownWindowFrame.sub_atributo == 3) then return self:MontaDetalhesHealingDone (spellid, barra) elseif (breakdownWindowFrame.sub_atributo == 4) then healingClass:MontaDetalhesHealingTaken (spellid, barra) end end function healingClass:MontaDetalhesHealingTaken (nome, barra) local barras = breakdownWindowFrame.barras3 local instancia = breakdownWindowFrame.instancia local tabela_do_combate = breakdownWindowFrame.instancia.showing local showing = tabela_do_combate [class_type] --o que esta sendo mostrado -> [1] - dano [2] - cura --pega o container com ._NameIndexTable ._ActorTable local este_curandeiro = showing._ActorTable[showing._NameIndexTable[nome]] local conteudo = este_curandeiro.spells._ActorTable --pairs[] com os IDs das magias local actor = breakdownWindowFrame.jogador.nome local total = este_curandeiro.targets [actor] local minhas_magias = {} for spellid, tabela in pairs(conteudo) do --da foreach em cada spellid do container if (tabela.targets [actor]) then local spell_nome, _, icone = _GetSpellInfo(spellid) tinsert(minhas_magias, {spellid, tabela.targets [actor], tabela.targets [actor] / total*100, spell_nome, icone}) end end _table_sort (minhas_magias, _detalhes.Sort2) local max_ = minhas_magias[1] and minhas_magias[1][2] or 0 --dano que a primeiro magia vez local lastIndex = 1 local barra for index, tabela in ipairs(minhas_magias) do lastIndex = index barra = barras [index] if (not barra) then --se a barra n�o existir, criar ela ent�o barra = gump:CriaNovaBarraInfo3 (instancia, index) barra.textura:SetStatusBarColor(1, 1, 1, 1) --isso aqui � a parte da sele��o e descele��o end barra.show = tabela[1] if (index == 1) then barra.textura:SetValue(100) else barra.textura:SetValue(tabela[2]/max_*100) --muito mais rapido... end barra.lineText1:SetText(index..instancia.divisores.colocacao..tabela[4]) --seta o texto da esqueda barra.lineText4:SetText(_detalhes:comma_value (tabela[2]) .." ".. instancia.divisores.abre .._cstr("%.1f", tabela[3]) .."%".. instancia.divisores.fecha) barra.icone:SetTexture(tabela[5]) barra:Show() --mostra a barra if (index == 15) then break end end for i = lastIndex+1, #barras do barras[i]:Hide() end end local absorbed_table = {c = {1, 1, 1, 0.4}, p = 0} local overhealing_table = {c = {0.5, 0.1, 0.1, 0.4}, p = 0} local anti_heal_table = {c = {0.5, 0.1, 0.1, 0.4}, p = 0} local normal_table = {c = {1, 1, 1, 0.4}, p = 0} local critical_table = {c = {1, 1, 1, 0.4}, p = 0} local data_table = {} local t1, t2, t3, t4 = {}, {}, {}, {} function healingClass:MontaDetalhesHealingDone (spellid, barra) --deprecated with the new breakdown window local esta_magia if (barra.other_actor) then esta_magia = barra.other_actor.spells._ActorTable [spellid] else esta_magia = self.spells._ActorTable [spellid] end if (not esta_magia) then return end --icone direito superior local spellName, _, icone = _GetSpellInfo(spellid) breakdownWindowFrame.spell_icone:SetTexture(icone) local total = self.total local overheal = esta_magia.overheal local meu_total = esta_magia.total + overheal local meu_tempo if (_detalhes.time_type == 1 or not self.grupo) then meu_tempo = self:Tempo() elseif (_detalhes.time_type == 2 or _detalhes.time_type == 3) then meu_tempo = breakdownWindowFrame.instancia.showing:GetCombatTime() end local total_hits = esta_magia.counter local index = 1 local data = data_table Details:Destroy(t1) Details:Destroy(t2) Details:Destroy(t3) Details:Destroy(t4) Details:Destroy(data) if (esta_magia.total > 0) then --GERAL local media = esta_magia.total/total_hits local this_hps = nil if (esta_magia.counter > esta_magia.c_amt) then this_hps = Loc ["STRING_HPS"] .. ": " .. _detalhes:comma_value (esta_magia.total/meu_tempo) else this_hps = Loc ["STRING_HPS"] .. ": " .. Loc ["STRING_SEE_BELOW"] end local heal_string if (esta_magia.is_shield) then heal_string = Loc ["STRING_SHIELD_HEAL"] else heal_string = Loc ["STRING_HEAL"] end local hits_string = "" .. total_hits local cast_string = Loc ["STRING_CAST"] .. ": " local misc_actor = breakdownWindowFrame.instancia.showing (4, self:name()) if (misc_actor) then local buff_uptime = misc_actor.buff_uptime_spells and misc_actor.buff_uptime_spells._ActorTable [spellid] and misc_actor.buff_uptime_spells._ActorTable [spellid].uptime if (buff_uptime) then hits_string = hits_string .. " |cFFDDDD44(" .. _math_floor(buff_uptime / breakdownWindowFrame.instancia.showing:GetCombatTime() * 100) .. "% uptime)|r" end local amountOfCasts = breakdownWindowFrame.instancia.showing:GetSpellCastAmount(self:Name(), spellName) if (not amountOfCasts) then amountOfCasts = "(|cFFFFFF00?|r)" end cast_string = cast_string .. amountOfCasts end gump:SetaDetalheInfoTexto( index, 100, --Loc ["STRING_GERAL"], cast_string, heal_string .. ": " .. _detalhes:ToK (esta_magia.total), "", --Loc ["STRING_PERCENTAGE"] .. ": " .. _cstr ("%.1f", esta_magia.total/total*100) .. "%", Loc ["STRING_AVERAGE"] .. ": " .. _detalhes:comma_value (media), this_hps, Loc ["STRING_HITS"] .. ": " .. hits_string) --NORMAL local normal_hits = esta_magia.n_amt if (normal_hits > 0) then local normal_curado = esta_magia.n_total local media_normal = normal_curado/normal_hits media_normal = max(media_normal, 0.000001) local T = (meu_tempo*normal_curado)/esta_magia.total local P = media/media_normal*100 T = P*T/100 data[#data+1] = t1 if (esta_magia.is_shield) then t1[3] = Loc ["STRING_ABSORBED"] normal_table.p = esta_magia.total / (esta_magia.total+esta_magia.overheal) * 100 else t1[3] = heal_string normal_table.p = normal_hits/total_hits*100 end t1[1] = esta_magia.n_amt t1[2] = normal_table t1[4] = Loc ["STRING_MINIMUM_SHORT"] .. ": " .. _detalhes:comma_value (esta_magia.n_min) t1[5] = Loc ["STRING_MAXIMUM_SHORT"] .. ": " .. _detalhes:comma_value (esta_magia.n_max) t1[6] = Loc ["STRING_AVERAGE"] .. ": " .. _detalhes:comma_value (media_normal) t1[7] = Loc ["STRING_HPS"] .. ": " .. _detalhes:comma_value (normal_curado / max(T, 0.001)) t1[8] = normal_hits .. " / ".. _cstr ("%.1f", normal_hits / max(total_hits, 0.001) * 100) .. "%" end --CRITICO if (esta_magia.c_amt > 0) then local media_critico = esta_magia.c_total/esta_magia.c_amt local T = (meu_tempo*esta_magia.c_total)/esta_magia.total local P = media/max(media_critico, 0.0001)*100 T = P*T/100 local crit_hps = esta_magia.c_total/T if (not crit_hps) then crit_hps = 0 end data[#data+1] = t2 critical_table.p = esta_magia.c_amt/total_hits*100 t2[1] = esta_magia.c_amt t2[2] = critical_table t2[3] = Loc ["STRING_HEAL_CRIT"] t2[4] = Loc ["STRING_MINIMUM_SHORT"] .. ": " .. _detalhes:comma_value (esta_magia.c_min) t2[5] = Loc ["STRING_MAXIMUM_SHORT"] .. ": " .. _detalhes:comma_value (esta_magia.c_max) t2[6] = Loc ["STRING_AVERAGE"] .. ": " .. _detalhes:comma_value (media_critico) t2[7] = Loc ["STRING_HPS"] .. ": " .. _detalhes:comma_value (crit_hps) t2[8] = esta_magia.c_amt .. " [|cFFC0C0C0".. _cstr ("%.1f", esta_magia.c_amt / max(total_hits, 0.001) * 100) .. "%|r]" end end _table_sort (data, _detalhes.Sort1) -- for i = #data+1, 2 do --para o antiheal aparecer na penultima barra -- data[i] = nil -- end --anti heal if (esta_magia.anti_heal and esta_magia.anti_heal > 0) then local porcentagem_anti_heal = esta_magia.anti_heal / meu_total * 100 data[3] = t3 anti_heal_table.p = porcentagem_anti_heal t3[1] = esta_magia.anti_heal t3[2] = anti_heal_table t3[3] = "Anti Heal" t3[4] = "" t3[5] = "" t3[6] = "" t3[7] = "" t3[8] = _detalhes:comma_value (esta_magia.anti_heal) .. " / " .. _cstr ("%.1f", porcentagem_anti_heal) .. "%" --empowered elseif (esta_magia.e_total and esta_magia.e_heal) then local empowerLevelSum = esta_magia.e_total --total sum of empower levels local empowerAmount = esta_magia.e_amt --amount of casts with empower local empowerAmountPerLevel = esta_magia.e_lvl --{[1] = 4; [2] = 9; [3] = 15} local empowerHealPerLevel = esta_magia.e_heal --{[1] = 54548745, [2] = 74548745} data[3] = t3 local level1AverageHeal = "0" local level2AverageHeal = "0" local level3AverageHeal = "0" local level4AverageHeal = "0" local level5AverageHeal = "0" if (empowerHealPerLevel[1]) then level1AverageHeal = Details:ToK(empowerHealPerLevel[1] / empowerAmountPerLevel[1]) end if (empowerHealPerLevel[2]) then level2AverageHeal = Details:ToK(empowerHealPerLevel[2] / empowerAmountPerLevel[2]) end if (empowerHealPerLevel[3]) then level3AverageHeal = Details:ToK(empowerHealPerLevel[3] / empowerAmountPerLevel[3]) end if (empowerHealPerLevel[4]) then level4AverageHeal = Details:ToK(empowerHealPerLevel[4] / empowerAmountPerLevel[4]) end if (empowerHealPerLevel[5]) then level5AverageHeal = Details:ToK(empowerHealPerLevel[5] / empowerAmountPerLevel[5]) end t3[1] = 0 t3[2] = {p = 100, c = {0.282353, 0.239216, 0.545098, 0.6}} t3[3] = "Spell Empower Average Level: " .. format("%.2f", empowerLevelSum / empowerAmount) t3[4] = "" t3[5] = "" t3[6] = "" t3[10] = "" t3[11] = "" if (level1AverageHeal ~= "0") then t3[4] = "Level 1 Average: " .. level1AverageHeal .. " (" .. (empowerAmountPerLevel[1] or 0) .. ")" end if (level2AverageHeal ~= "0") then t3[6] = "Level 2 Average: " .. level2AverageHeal .. " (" .. (empowerAmountPerLevel[2] or 0) .. ")" end if (level3AverageHeal ~= "0") then t3[11] = "Level 3 Average: " .. level3AverageHeal .. " (" .. (empowerAmountPerLevel[3] or 0) .. ")" end if (level4AverageHeal ~= "0") then t3[10] = "Level 4 Average: " .. level4AverageHeal .. " (" .. (empowerAmountPerLevel[4] or 0) .. ")" end if (level5AverageHeal ~= "0") then t3[5] = "Level 5 Average: " .. level5AverageHeal .. " (" .. (empowerAmountPerLevel[5] or 0) .. ")" end end -- for i = #data+1, 3 do --para o overheal aparecer na ultima barra -- data[i] = nil -- end --overhealing if (overheal > 0) then local porcentagem_overheal = overheal/meu_total*100 data[4] = t4 overhealing_table.p = porcentagem_overheal t4[1] = overheal t4[2] = overhealing_table if (esta_magia.is_shield) then t4[3] = Loc ["STRING_SHIELD_OVERHEAL"] else t4[3] = Loc ["STRING_OVERHEAL"] end t4[4] = "" t4[5] = "" t4[6] = "" t4[7] = "" t4[8] = _detalhes:comma_value (overheal) .. " / " .. _cstr ("%.1f", porcentagem_overheal) .. "%" end for index = 1, 4 do local tabela = data[index] if (not tabela) then gump:HidaDetalheInfo (index+1) else gump:SetaDetalheInfoTexto(index+1, tabela[2], tabela[3], tabela[4], tabela[5], tabela[6], tabela[7], tabela[8]) end end end --controla se o dps do jogador esta travado ou destravado function healingClass:GetOrChangeActivityStatus (iniciar) if (iniciar == nil) then return self.iniciar_hps --retorna se o dps esta aberto ou fechado para este jogador elseif (iniciar) then self.iniciar_hps = true Details222.TimeMachine.AddActor(self) else self.iniciar_hps = false Details222.TimeMachine.RemoveActor(self) end end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --core functions --atualize a funcao de abreviacao function healingClass:UpdateSelectedToKFunction() SelectedToKFunction = ToKFunctions [_detalhes.ps_abbreviation] FormatTooltipNumber = ToKFunctions [_detalhes.tooltip.abbreviation] TooltipMaximizedMethod = _detalhes.tooltip.maximize_method headerColor = _detalhes.tooltip.header_text_color end --subtract total from a combat table function healingClass:subtract_total (combat_table) combat_table.totals [class_type] = combat_table.totals [class_type] - self.total if (self.grupo) then combat_table.totals_grupo [class_type] = combat_table.totals_grupo [class_type] - self.total end end function healingClass:add_total (combat_table) combat_table.totals [class_type] = combat_table.totals [class_type] + self.total if (self.grupo) then combat_table.totals_grupo [class_type] = combat_table.totals_grupo [class_type] + self.total end end ---sum the passed actor into a combat, if the combat isn't passed, it will use the overall combat ---the function returns the actor that was created of found in the combat passed ---@param actorObject actor ---@param bRefreshActor boolean|nil ---@param combatObject combat|nil ---@return actor function healingClass:AddToCombat(actorObject, bRefreshActor, combatObject) --check if there's a custom combat, if not just use the overall container combatObject = combatObject or _detalhes.tabela_overall --same as Details:GetCombat(DETAILS_SEGMENTID_OVERALL) --check if the combatObject has an actor with the same name, if not, just create one new local actorContainer = combatObject[DETAILS_ATTRIBUTE_HEAL] --same as combatObject:GetContainer(DETAILS_ATTRIBUTE_HEAL) local overallActor = actorContainer._ActorTable[actorContainer._NameIndexTable[actorObject.nome]] --same as actorContainer:GetActor(actorObject:Name()) if (not overallActor) then overallActor = actorContainer:GetOrCreateActor(actorObject.serial, actorObject.nome, actorObject.flag_original, true) overallActor.classe = actorObject.classe overallActor:SetSpecId(actorObject.spec) overallActor.pvp = actorObject.pvp overallActor.isTank = actorObject.isTank overallActor.boss = actorObject.boss overallActor.start_time = time() - 3 overallActor.end_time = time() end overallActor.displayName = actorObject.displayName or actorObject.nome overallActor.boss_fight_component = actorObject.boss_fight_component or overallActor.boss_fight_component overallActor.fight_component = actorObject.fight_component or overallActor.fight_component overallActor.grupo = actorObject.grupo or overallActor.grupo --check if need to restore meta tables and indexes for this actor if (bRefreshActor) then --this call will reenable the metatable, __index and set the metatable on the .spells container Details.refresh:r_atributo_heal(actorObject) end --elapsed time local endTime = actorObject.end_time if (not actorObject.end_time) then endTime = time() end local tempo = endTime - actorObject.start_time overallActor.start_time = overallActor.start_time - tempo --pets (add unique pet names) for _, petName in ipairs(actorObject.pets) do DetailsFramework.table.addunique(overallActor.pets, petName) end ---@cast actorObject actorheal --total healing done and total overheal overallActor.total = overallActor.total + actorObject.total overallActor.totalover = overallActor.totalover + actorObject.totalover --healing done by shields overallActor.totalabsorb = overallActor.totalabsorb + actorObject.totalabsorb --enemy healing done overallActor.heal_enemy_amt = overallActor.heal_enemy_amt + actorObject.heal_enemy_amt --heal denied overallActor.totaldenied = overallActor.totaldenied + actorObject.totaldenied --healing done without pets overallActor.total_without_pet = overallActor.total_without_pet + actorObject.total_without_pet overallActor.totalover_without_pet = overallActor.totalover_without_pet + actorObject.totalover_without_pet --healing taken overallActor.healing_taken = overallActor.healing_taken + actorObject.healing_taken --total no combate overall (captura de dados) combatObject.totals[2] = combatObject.totals[2] + actorObject.total if (actorObject.grupo) then --same as Details:IsGroupPlayer() combatObject.totals_grupo[2] = combatObject.totals_grupo[2] + actorObject.total end --copy healing taken from for healerName, _ in pairs(actorObject.healing_from) do overallActor.healing_from[healerName] = true end --copy enemy healing for spellId, amount in pairs(actorObject.heal_enemy) do overallActor.heal_enemy[spellId] = (overallActor.heal_enemy[spellId] or 0) + amount end --copy target tables for targetName, amount in pairs(actorObject.targets) do overallActor.targets[targetName] = (overallActor.targets[targetName] or 0) + amount end for targetName, amount in pairs(actorObject.targets_overheal) do overallActor.targets_overheal[targetName] = (overallActor.targets_overheal[targetName] or 0) + amount end for targetName, amount in pairs(actorObject.targets_absorbs) do overallActor.targets_absorbs[targetName] = (overallActor.targets_absorbs[targetName] or 0) + amount end ---@type spellcontainer local overallSpellsContainer = overallActor.spells --same as overallActor:GetSpellContainer("spell") --copy spell table for spellId, spellTable in pairs(actorObject.spells._ActorTable) do --same as overallSpellsContainer:GetRawSpellTable() --var name has 'overall' but this function accepts any combat table local overallSpellTable = overallSpellsContainer:GetOrCreateSpell(spellId, true) --sum spell targets for targetName, amount in pairs(spellTable.targets) do overallSpellTable.targets[targetName] = (overallSpellTable.targets[targetName] or 0) + amount end for targetName, amount in pairs(spellTable.targets_overheal) do overallSpellTable.targets_overheal[targetName] = (overallSpellTable.targets_overheal[targetName] or 0) + amount end for targetName, amount in pairs(spellTable.targets_absorbs) do overallSpellTable.targets_absorbs[targetName] = (overallSpellTable.targets_absorbs[targetName] or 0) + amount end --copy heal denied if it exists if (spellTable.heal_denied) then overallSpellTable.heal_denied = overallSpellTable.heal_denied or {} overallSpellTable.heal_denied_healers = overallSpellTable.heal_denied_healers or {} --copy for spellID, amount in pairs(spellTable.heal_denied) do overallSpellTable.heal_denied[spellID] = (overallSpellTable.heal_denied[spellID] or 0) + amount end for healerName, amount in pairs(spellTable.heal_denied_healers) do overallSpellTable.heal_denied_healers[healerName] = (overallSpellTable.heal_denied_healers[healerName] or 0) + amount end end overallSpellTable.spellschool = spellTable.spellschool --sum all values of the spelltable which can be summed for key, value in pairs(spellTable) do if (type(value) == "number") then if (key ~= "id" and key ~= "spellschool") then if (not overallSpellTable[key]) then overallSpellTable[key] = 0 end if (key == "n_min" or key == "c_min") then if (overallSpellTable[key] > value) then overallSpellTable[key] = value end elseif (key == "n_max" or key == "c_max") then if (overallSpellTable[key] < value) then overallSpellTable[key] = value end else overallSpellTable[key] = overallSpellTable[key] + value end end --empowered spells elseif(key == "e_heal" or key == "e_lvl") then if (not overallSpellTable[key]) then overallSpellTable[key] = {} end for empowermentLevel, empowermentValue in pairs(spellTable[key]) do overallSpellTable[key][empowermentLevel] = empowermentValue end end end end return overallActor end healingClass.__add = function(tabela1, tabela2) --tempo decorrido local tempo = (tabela2.end_time or time()) - tabela2.start_time tabela1.start_time = tabela1.start_time - tempo --total de cura tabela1.total = tabela1.total + tabela2.total --total de overheal tabela1.totalover = tabela1.totalover + tabela2.totalover --total de absorbs tabela1.totalabsorb = tabela1.totalabsorb + tabela2.totalabsorb --total de cura feita em inimigos tabela1.heal_enemy_amt = tabela1.heal_enemy_amt + tabela2.heal_enemy_amt --total de cura negada tabela1.totaldenied = tabela1.totaldenied + tabela2.totaldenied --total sem pets tabela1.total_without_pet = tabela1.total_without_pet + tabela2.total_without_pet tabela1.totalover_without_pet = tabela1.totalover_without_pet + tabela2.totalover_without_pet --total de cura recebida tabela1.healing_taken = tabela1.healing_taken + tabela2.healing_taken --soma o healing_from for nome, _ in pairs(tabela2.healing_from) do tabela1.healing_from [nome] = true end --somar o heal_enemy for spellid, amount in pairs(tabela2.heal_enemy) do if (tabela1.heal_enemy [spellid]) then tabela1.heal_enemy [spellid] = tabela1.heal_enemy [spellid] + amount else tabela1.heal_enemy [spellid] = amount end end --somar o container de alvos for target_name, amount in pairs(tabela2.targets) do tabela1.targets[target_name] = (tabela1.targets[target_name] or 0) + amount end for target_name, amount in pairs(tabela2.targets_overheal) do tabela1.targets_overheal[target_name] = (tabela1.targets_overheal[target_name] or 0) + amount end for target_name, amount in pairs(tabela2.targets_absorbs) do tabela1.targets_absorbs[target_name] = (tabela1.targets_absorbs[target_name] or 0) + amount end --soma o container de habilidades for spellid, habilidade in pairs(tabela2.spells._ActorTable) do --pega a habilidade no primeiro ator local habilidade_tabela1 = tabela1.spells:PegaHabilidade (spellid, true, "SPELL_HEAL", false) --soma os alvos for target_name, amount in pairs(habilidade.targets) do habilidade_tabela1.targets = (habilidade_tabela1.targets[target_name] or 0) + amount end for target_name, amount in pairs(habilidade.targets_overheal) do habilidade_tabela1.targets_overheal = (habilidade_tabela1.targets_overheal[target_name] or 0) + amount end for target_name, amount in pairs(habilidade.targets_absorbs) do habilidade_tabela1.targets_absorbs = (habilidade_tabela1.targets_absorbs[target_name] or 0) + amount end --copia o container de heal negado se ele existir if (habilidade.heal_denied) then habilidade_tabela1.heal_denied = habilidade_tabela1.heal_denied or {} habilidade_tabela1.heal_denied_healers = habilidade_tabela1.heal_denied_healers or {} --copia for spellID, amount in pairs(habilidade.heal_denied) do habilidade_tabela1.heal_denied[spellID] = (habilidade_tabela1.heal_denied[spellID] or 0) + amount end for healerName, amount in pairs(habilidade.heal_denied_healers) do habilidade_tabela1.heal_denied_healers[healerName] = (habilidade_tabela1.heal_denied_healers[healerName] or 0) + amount end end --soma os valores da habilidade for key, value in pairs(habilidade) do if (type(value) == "number") then if (key ~= "id") then if (not habilidade_tabela1 [key]) then habilidade_tabela1 [key] = 0 end if (key == "n_min" or key == "c_min") then if (habilidade_tabela1 [key] > value) then habilidade_tabela1 [key] = value end elseif (key == "n_max" or key == "c_max") then if (habilidade_tabela1 [key] < value) then habilidade_tabela1 [key] = value end else habilidade_tabela1 [key] = habilidade_tabela1 [key] + value end end elseif(key == "e_heal" or key == "e_lvl") then if (not habilidade_tabela1[key]) then habilidade_tabela1[key] = {} end for empowermentLevel, empowermentValue in pairs(habilidade[key]) do habilidade_tabela1[key][empowermentLevel] = habilidade_tabela1[key][empowermentValue] or 0 + empowermentValue end end end end return tabela1 end healingClass.__sub = function(tabela1, tabela2) --tempo decorrido local tempo = (tabela2.end_time or time()) - tabela2.start_time tabela1.start_time = tabela1.start_time + tempo --total de cura tabela1.total = tabela1.total - tabela2.total --total de overheal tabela1.totalover = tabela1.totalover - tabela2.totalover --total de absorbs tabela1.totalabsorb = tabela1.totalabsorb - tabela2.totalabsorb --total de cura feita em inimigos tabela1.heal_enemy_amt = tabela1.heal_enemy_amt - tabela2.heal_enemy_amt --total de cura negada tabela1.totaldenied = tabela1.totaldenied - tabela2.totaldenied --total sem pets tabela1.total_without_pet = tabela1.total_without_pet - tabela2.total_without_pet tabela1.totalover_without_pet = tabela1.totalover_without_pet - tabela2.totalover_without_pet --total de cura recebida tabela1.healing_taken = tabela1.healing_taken - tabela2.healing_taken --reduz o heal_enemy for spellid, amount in pairs(tabela2.heal_enemy) do if (tabela1.heal_enemy [spellid]) then tabela1.heal_enemy [spellid] = tabela1.heal_enemy [spellid] - amount else tabela1.heal_enemy [spellid] = amount end end --reduz o container de alvos for target_name, amount in pairs(tabela2.targets) do if (tabela1.targets [target_name]) then tabela1.targets [target_name] = tabela1.targets [target_name] - amount end end for target_name, amount in pairs(tabela2.targets_overheal) do if (tabela1.targets_overheal [target_name]) then tabela1.targets_overheal [target_name] = tabela1.targets_overheal [target_name] - amount end end for target_name, amount in pairs(tabela2.targets_absorbs) do if (tabela1.targets_absorbs [target_name]) then tabela1.targets_absorbs [target_name] = tabela1.targets_absorbs [target_name] - amount end end --reduz o container de habilidades for spellid, habilidade in pairs(tabela2.spells._ActorTable) do --pega a habilidade no primeiro ator local habilidade_tabela1 = tabela1.spells:PegaHabilidade (spellid, true, "SPELL_HEAL", false) --alvos for target_name, amount in pairs(habilidade.targets) do if (habilidade_tabela1.targets [target_name]) then habilidade_tabela1.targets [target_name] = habilidade_tabela1.targets [target_name] - amount end end for target_name, amount in pairs(habilidade.targets_overheal) do if (habilidade_tabela1.targets_overheal [target_name]) then habilidade_tabela1.targets_overheal [target_name] = habilidade_tabela1.targets_overheal [target_name] - amount end end for target_name, amount in pairs(habilidade.targets_absorbs) do if (habilidade_tabela1.targets_absorbs [target_name]) then habilidade_tabela1.targets_absorbs [target_name] = habilidade_tabela1.targets_absorbs [target_name] - amount end end --copia o container de heal negado se ele existir if (habilidade.heal_denied) then habilidade_tabela1.heal_denied = habilidade_tabela1.heal_denied or {} habilidade_tabela1.heal_denied_healers = habilidade_tabela1.heal_denied_healers or {} --copia for spellID, amount in pairs(habilidade.heal_denied) do habilidade_tabela1.heal_denied [spellID] = (habilidade_tabela1.heal_denied [spellID] or 0) - amount end for healerName, amount in pairs(habilidade.heal_denied_healers) do habilidade_tabela1.heal_denied_healers [healerName] = (habilidade_tabela1.heal_denied_healers [healerName] or 0) - amount end end --soma os valores da habilidade for key, value in pairs(habilidade) do if (type(value) == "number") then if (key ~= "id") then if (not habilidade_tabela1 [key]) then habilidade_tabela1 [key] = 0 end if (key == "n_min" or key == "c_min") then if (habilidade_tabela1 [key] > value) then habilidade_tabela1 [key] = value end elseif (key == "n_max" or key == "c_max") then if (habilidade_tabela1 [key] < value) then habilidade_tabela1 [key] = value end else habilidade_tabela1 [key] = habilidade_tabela1 [key] - value end end end end end return tabela1 end function Details.refresh:r_atributo_heal(thisActor) detailsFramework:Mixin(thisActor, Details222.Mixins.ActorMixin) setmetatable(thisActor, healingClass) thisActor.__index = healingClass Details.refresh:r_container_habilidades(thisActor.spells) end function Details.clear:c_atributo_heal (este_jogador) este_jogador.__index = nil este_jogador.links = nil este_jogador.minha_barra = nil Details.clear:c_container_habilidades (este_jogador.spells) end