Files
coa-details/classes/class_heal.lua
T
Tercio Jose 8be58e717b v9213
Fixed an issue where after reloading, overall data won't show the players nickname.
Fixed overkill damage on death log tooltip.
Fixed the percent bars for the healing done target on the player breakdown window.
Fixed an issue with resource tooltips.
And more...
2021-12-10 16:57:26 -03:00

2931 lines
102 KiB
Lua

--lua locals
local _cstr = string.format
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 _table_insert = table.insert
local _bit_band = bit.band
local _math_min = math.min
local _math_ceil = math.ceil
--api locals
local GetSpellInfo = GetSpellInfo
local _GetSpellInfo = _detalhes.getspellinfo
local _IsInRaid = IsInRaid
local _IsInGroup = IsInGroup
local _UnitName = UnitName
local _GetNumGroupMembers = GetNumGroupMembers
local _string_replace = _detalhes.string.replace --details api
local _detalhes = _G._detalhes
local _
local AceLocale = LibStub ("AceLocale-3.0")
local Loc = AceLocale:GetLocale ( "Details" )
local Translit = LibStub ("LibTranslit-1.0")
local gump = _detalhes.gump
local alvo_da_habilidade = _detalhes.alvo_da_habilidade
local container_habilidades = _detalhes.container_habilidades
local container_combatentes = _detalhes.container_combatentes
local atributo_heal = _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 info = _detalhes.playerDetailWindow
local keyName
function atributo_heal:NovaTabela (serial, nome, link)
local alphabetical = _detalhes:GetOrderNumber (nome)
--> constructor
local _new_healActor = {
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 <owner 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 = {}
}
_setmetatable (_new_healActor, atributo_heal)
return _new_healActor
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 function RefreshNpcHealingTakenBar(tabela, barra, instancia)
atributo_damage:UpdateNpcHealingTaken(tabela, tabela.minha_barra, barra.colocacao, instancia)
end
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 trs pra frente
if (container[i][keyName] < 1) then
amount = amount-1
else
break
end
end
return amount
end
end
function atributo_heal:ContainerRefreshHps (container, combat_time)
local total = 0
if (_detalhes.time_type == 2 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 atributo_heal: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 atributo_heal:RefreshWindow (instancia, tabela_do_combate, forcar, exportar)
local showing = tabela_do_combate [class_type] --> o que esta sendo mostrado -> [1] - dano [2] - cura
--> no h barras para mostrar -- not have something to show
if (#showing._ActorTable < 1) then --> no h barras para mostrar
--> colocado isso recentemente para fazer as barras de dano sumirem na troca de atributo
return _detalhes:EsconderBarrasNaoUsadas (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 instncia
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 = atributo_heal: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()
atributo_heal:ContainerRefreshHps (conteudo, combat_time)
end
if (#conteudo < 1) then
return _detalhes:EsconderBarrasNaoUsadas (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()
atributo_heal: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? no 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 no precisa remapear
showing:remapear()
if (exportar) then
return total, keyName, instancia.top, amount
end
if (amount < 1) then --> no 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 ento posso seguir o padro correto? primeiro, atualiza a scroll bar...
instancia:RefreshScrollBar (amount)
--depois faz a atualizao normal dele atravs dos iterators
local whichRowLine = 1
local barras_container = instancia.barras --> evita buscar N vezes a key .barras dentro da instncia
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
Details:SetTextsOnLine(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 > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) 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
Details:SetTextsOnLine(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 > 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 = 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 no usadas durante um refresh forado
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
-- showing.need_refresh = false
return _detalhes: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 atributo_heal: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 referncia da barra na janela
if (not thisLine) then
print ("DEBUG: problema com <instancia.thisLine> "..whichRowLine.." "..lugar)
return
end
local tabela_anterior = thisLine.minha_tabela
thisLine.minha_tabela = self --grava uma referncia dessa classe de dano na barra
self.minha_barra = thisLine --> salva uma referncia da barra no objeto do jogador
thisLine.colocacao = lugar --> salva na barra qual a colocao dela.
self.colocacao = lugar --> salva qual a colocao 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 (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 --> no 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
Details:SetTextsOnLine(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
Details:SetTextsOnLine(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
Details:SetTextsOnLine(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
Details:SetTextsOnLine(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
Details:SetTextsOnLine(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
Details:SetTextsOnLine(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
Details:SetTextsOnLine(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
Details:SetTextsOnLine(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 atributo_heal: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 atualizao anterior
if (not tabela_anterior or tabela_anterior ~= thisLine.minha_tabela or forcar) then --> aqui diz se a barra do jogador mudou de posio 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 ento 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 atributo_heal: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)
--> 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)
local escudos = _detalhes.escudos
local container = combat[2]
local time = time()
local parser = _detalhes.parser
local GetSpellInfo = GetSpellInfo --no colocar no cache de spells
for alvo_name, spellid_table in _pairs (escudos) do
local tgt = container:PegarCombatente (_, alvo_name)
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", time, obj.serial, owner, obj.flag_original, tgt.serial, alvo_name, tgt.flag_original, nil, spellid, spellname, nil, 0, _math_ceil (amount), 0, 0, nil, true)
end
end
end
end
end
end
--escudo [alvo_name] [spellid] [who_name]
end
--------------------------------------------- // TOOLTIPS // ---------------------------------------------
---------> TOOLTIPS BIFURCAO ~tooltip
function atributo_heal: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 atributo_heal: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 atributo_heal: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 no 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 atributo_heal: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) 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
_table_insert (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 target_name, 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
target_name = Translit:Transliterate(target_name, "!")
end
_table_insert (ActorHealingTargets, {target_name, 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) 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 // ---------------------------------------------
---------- bifurcao
function atributo_heal:MontaInfo()
if (info.sub_atributo == 1 or info.sub_atributo == 2) then
return self:MontaInfoHealingDone()
elseif (info.sub_atributo == 3) then
return self:MontaInfoOverHealing()
elseif (info.sub_atributo == 4) then
return self:MontaInfoHealTaken()
end
end
function atributo_heal:MontaInfoHealTaken()
local healing_taken = self.healing_taken
local curandeiros = self.healing_from
local instancia = info.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 = info.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 atributo_heal:MontaInfoOverHealing()
--> pegar as habilidade de dar sort no heal
local instancia = info.instancia
local total = self.totalover
local tabela = self.spells._ActorTable
local minhas_curas = {}
local barras = info.barras1
for spellid, tabela in _pairs (tabela) do
local nome, _, icone = _GetSpellInfo (spellid)
_table_insert (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)
_table_insert (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 info.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 no tiver no foco
barra.textura:SetStatusBarColor (129/255, 125/255, 69/255, 1)
barra.on_focus = true
if (not info.mostrando) then
info.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
_table_insert (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 = info.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 atributo_heal:MontaInfoHealingDone()
--> pegar as habilidade de dar sort no heal
local instancia = info.instancia
local total = self.total
local tabela = self.spells._ActorTable
local minhas_curas = {}
local barras = info.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) then
meu_tempo = info.instancia.showing:GetCombatTime()
end
for spellid, tabela in _pairs (tabela) do
local nome, rank, icone = _GetSpellInfo (spellid)
_table_insert (minhas_curas, {
spellid,
tabela.total,
tabela.total/total*100,
nome,
icone,
false, --not a pet
tabela.anti_heal,
})
end
info: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)
_table_insert (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 (info.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
_table_insert (healedTargets, {target_name, amount, amount / total*100})
end
_table_sort(healedTargets, _detalhes.Sort2)
gump:JI_AtualizaContainerAlvos(#healedTargets)
local topHealingDone = healedTargets[1] and healedTargets[1][2]
for index, tabela in _ipairs (healedTargets) do
local barra = info.barras2 [index]
if (not barra) then
barra = gump:CriaNovaBarraInfo2 (instancia, index)
barra.textura:SetStatusBarColor (1, 1, 1, 1)
end
local healingDone = tabela[2]
if (index == 1) then
barra.textura:SetValue(100)
else
barra.textura:SetValue(healingDone / topHealingDone * 100)
end
local target_actor = instancia.showing (2, tabela[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 (tabela[1]))
barra.textura:SetStatusBarColor(1, 1, 1, 1)
if (info.sub_atributo == 2) then
barra.lineText4:SetText (_detalhes:comma_value (_math_floor (healingDone/meu_tempo)) .." (" .. _cstr ("%.1f", tabela[3]) .. "%)")
else
barra.lineText4:SetText (SelectedToKFunction (_, healingDone) .. " (" .. _cstr ("%.1f", tabela[3]) .. "%)")
end
barra.minha_tabela = self
barra.nome_inimigo = tabela [1]
-- no lugar do spell id colocar o que?
barra.spellid = tabela[5]
barra:Show()
end
end
function atributo_heal:MontaTooltipAlvos (thisLine, index, instancia)
local inimigo = thisLine.nome_inimigo
local container = self.spells._ActorTable
local habilidades = {}
local total
local sub_atributo = info.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) then
meu_tempo = info.instancia.showing:GetCombatTime()
end
local is_hps = info.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 atributo_heal:MontaDetalhes (spellid, barra)
--> bifurgaes
if (info.sub_atributo == 1 or info.sub_atributo == 2 or info.sub_atributo == 3) then
return self:MontaDetalhesHealingDone (spellid, barra)
elseif (info.sub_atributo == 4) then
atributo_heal:MontaDetalhesHealingTaken (spellid, barra)
end
end
function atributo_heal:MontaDetalhesHealingTaken (nome, barra)
for _, barra in _ipairs (info.barras3) do
barra:Hide()
end
local barras = info.barras3
local instancia = info.instancia
local tabela_do_combate = info.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 = info.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)
_table_insert (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 barra
for index, tabela in _ipairs (minhas_magias) do
barra = barras [index]
if (not barra) then --> se a barra no existir, criar ela ento
barra = gump:CriaNovaBarraInfo3 (instancia, index)
barra.textura:SetStatusBarColor (1, 1, 1, 1) --> isso aqui a parte da seleo e desceleo
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
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
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 atributo_heal:MontaDetalhesHealingDone (spellid, barra)
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 _, _, icone = _GetSpellInfo (spellid)
info.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) then
meu_tempo = info.instancia.showing:GetCombatTime()
end
local total_hits = esta_magia.counter
local index = 1
local data = data_table
table.wipe (t1)
table.wipe (t2)
table.wipe (t3)
table.wipe (t4)
table.wipe (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 = info.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 / info.instancia.showing:GetCombatTime() * 100) .. "% uptime)|r"
end
local spell_cast = misc_actor.spell_cast and misc_actor.spell_cast [spellid]
if (not spell_cast and misc_actor.spell_cast) then
local spellname = GetSpellInfo (spellid)
for casted_spellid, amount in _pairs (misc_actor.spell_cast) do
local casted_spellname = GetSpellInfo (casted_spellid)
if (casted_spellname == spellname) then
spell_cast = amount .. " (|cFFFFFF00?|r)"
end
end
end
if (not spell_cast) then
spell_cast = "(|cFFFFFF00?|r)"
end
cast_string = cast_string .. spell_cast
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_curado
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/T)
t1[8] = normal_hits .. " / ".. _cstr ("%.1f", normal_hits/total_hits*100) .. "%"
end
--> CRITICO
if (esta_magia.c_amt > 0) then
local media_critico = esta_magia.c_curado/esta_magia.c_amt
local T = (meu_tempo*esta_magia.c_curado)/esta_magia.total
local P = media/media_critico*100
T = P*T/100
local crit_hps = esta_magia.c_curado/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/total_hits*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) .. "%"
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 atributo_heal:Iniciar (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
self:RegistrarNaTimeMachine() --coloca ele da timeMachine
else
self.iniciar_hps = false
self:DesregistrarNaTimeMachine() --retira ele da timeMachine
end
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> core functions
--> atualize a funcao de abreviacao
function atributo_heal: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 atributo_heal: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 atributo_heal: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
--> restaura a tabela de last event
function atributo_heal:r_last_events_table (actor)
if (not actor) then
actor = self
end
--actor.last_events_table = _detalhes:CreateActorLastEventTable()
end
--> restaura e liga o ator com a sua shadow durante a inicializao
function atributo_heal:r_onlyrefresh_shadow (actor)
--> criar uma shadow desse ator se ainda no tiver uma
local overall_cura = _detalhes.tabela_overall [2]
local shadow = overall_cura._ActorTable [overall_cura._NameIndexTable [actor.nome]]
if (not shadow) then
shadow = overall_cura:PegarCombatente (actor.serial, actor.nome, actor.flag_original, true)
shadow.classe = actor.classe
shadow.spec = actor.spec
shadow.grupo = actor.grupo
shadow.pvp = actor.pvp
shadow.isTank = actor.isTank
shadow.boss = actor.boss
shadow.boss_fight_component = actor.boss_fight_component
shadow.fight_component = actor.fight_component
shadow.start_time = time() - 3
shadow.end_time = time()
end
--> restaura a meta e indexes ao ator
_detalhes.refresh:r_atributo_heal (actor, shadow)
--> copia o container de alvos (captura de dados)
for target_name, amount in _pairs (actor.targets) do
shadow.targets [target_name] = 0
end
for target_name, amount in _pairs (actor.targets_overheal) do
shadow.targets_overheal [target_name] = 0
end
for target_name, amount in _pairs (actor.targets_absorbs) do
shadow.targets_absorbs [target_name] = 0
end
--> copia o container de habilidades (captura de dados)
for spellid, habilidade in _pairs (actor.spells._ActorTable) do
--> cria e soma o valor
local habilidade_shadow = shadow.spells:PegaHabilidade (spellid, true, nil, true)
--> refresh e soma os valores dos alvos
for target_name, amount in _pairs (habilidade.targets) do
if (not habilidade_shadow.targets [target_name]) then
habilidade_shadow.targets [target_name] = 0
end
end
for target_name, amount in _pairs (habilidade.targets_overheal) do
if (not habilidade_shadow.targets_overheal [target_name]) then
habilidade_shadow.targets_overheal [target_name] = 0
end
end
for target_name, amount in _pairs (habilidade.targets_absorbs) do
if (not habilidade_shadow.targets_absorbs [target_name]) then
habilidade_shadow.targets_absorbs [target_name] = 0
end
end
--> copia o container de heal negado se ele existir
if (habilidade.heal_denied) then
--> cria o container na shadow de ele no existir
habilidade_shadow.heal_denied = habilidade_shadow.heal_denied or {}
habilidade_shadow.heal_denied_healers = habilidade_shadow.heal_denied_healers or {}
--> copia
for spellID, amount in _pairs (habilidade.heal_denied) do
if (not habilidade_shadow.heal_denied [spellID]) then
habilidade_shadow.heal_denied [spellID] = 0
end
end
for healerName, amount in _pairs (habilidade.heal_denied_healers) do
if (not habilidade_shadow.heal_denied_healers [healerName]) then
habilidade_shadow.heal_denied_healers [healerName] = 0
end
end
end
end
return shadow
end
function atributo_heal:r_connect_shadow (actor, no_refresh, combat_object)
local host_combat = combat_object or _detalhes.tabela_overall
--> criar uma shadow desse ator se ainda no tiver uma
local overall_cura = host_combat [2]
local shadow = overall_cura._ActorTable [overall_cura._NameIndexTable [actor.nome]]
if (not shadow) then
shadow = overall_cura:PegarCombatente (actor.serial, actor.nome, actor.flag_original, true)
shadow.classe = actor.classe
shadow.spec = actor.spec
shadow.grupo = actor.grupo
shadow.pvp = actor.pvp
shadow.isTank = actor.isTank
shadow.boss = actor.boss
shadow.boss_fight_component = actor.boss_fight_component
shadow.fight_component = actor.fight_component
shadow.start_time = time() - 3
shadow.end_time = time()
end
--> restaura a meta e indexes ao ator
if (not no_refresh) then
_detalhes.refresh:r_atributo_heal (actor, shadow)
end
--> tempo decorrido (captura de dados)
local end_time = actor.end_time
if (not actor.end_time) then
end_time = time()
end
local tempo = end_time - actor.start_time
shadow.start_time = shadow.start_time - tempo
--> pets (add unique pet names)
for _, petName in _ipairs (actor.pets) do
DetailsFramework.table.addunique (shadow.pets, petName)
end
--> total de cura (captura de dados)
shadow.total = shadow.total + actor.total
--> total de overheal (captura de dados)
shadow.totalover = shadow.totalover + actor.totalover
--> total de absorbs (captura de dados)
shadow.totalabsorb = shadow.totalabsorb + actor.totalabsorb
--> total de cura feita em inimigos (captura de dados)
shadow.heal_enemy_amt = shadow.heal_enemy_amt + actor.heal_enemy_amt
--> total de heal negado
shadow.totaldenied = shadow.totaldenied + actor.totaldenied
--> total sem pets (captura de dados)
shadow.total_without_pet = shadow.total_without_pet + actor.total_without_pet
shadow.totalover_without_pet = shadow.totalover_without_pet + actor.totalover_without_pet
--> total de cura recebida (captura de dados)
shadow.healing_taken = shadow.healing_taken + actor.healing_taken
--> total no combate overall (captura de dados)
host_combat.totals[2] = host_combat.totals[2] + actor.total
if (actor.grupo) then
host_combat.totals_grupo[2] = host_combat.totals_grupo[2] + actor.total
end
--> copia o healing_from (captura de dados)
for nome, _ in _pairs (actor.healing_from) do
shadow.healing_from [nome] = true
end
--> copia o heal_enemy (captura de dados)
for spellid, amount in _pairs (actor.heal_enemy) do
if (shadow.heal_enemy [spellid]) then
shadow.heal_enemy [spellid] = shadow.heal_enemy [spellid] + amount
else
shadow.heal_enemy [spellid] = amount
end
end
--> copia o container de alvos (captura de dados)
for target_name, amount in _pairs (actor.targets) do
shadow.targets [target_name] = (shadow.targets [target_name] or 0) + amount
end
for target_name, amount in _pairs (actor.targets_overheal) do
shadow.targets_overheal [target_name] = (shadow.targets_overheal [target_name] or 0) + amount
end
for target_name, amount in _pairs (actor.targets_absorbs) do
shadow.targets_absorbs [target_name] = (shadow.targets_absorbs [target_name] or 0) + amount
end
--> copia o container de habilidades (captura de dados)
for spellid, habilidade in _pairs (actor.spells._ActorTable) do
--> cria e soma o valor
local habilidade_shadow = shadow.spells:PegaHabilidade (spellid, true, nil, true)
--> refresh e soma os valores dos alvos
for target_name, amount in _pairs (habilidade.targets) do
habilidade_shadow.targets [target_name] = (habilidade_shadow.targets [target_name] or 0) + amount
end
for target_name, amount in _pairs (habilidade.targets_overheal) do
habilidade_shadow.targets_overheal [target_name] = (habilidade_shadow.targets_overheal [target_name] or 0) + amount
end
for target_name, amount in _pairs (habilidade.targets_absorbs) do
habilidade_shadow.targets_absorbs [target_name] = (habilidade_shadow.targets_absorbs [target_name] or 0) + amount
end
--> copia o container de heal negado se ele existir
if (habilidade.heal_denied) then
--> cria o container na shadow de ele no existir
habilidade_shadow.heal_denied = habilidade_shadow.heal_denied or {}
habilidade_shadow.heal_denied_healers = habilidade_shadow.heal_denied_healers or {}
--> copia
for spellID, amount in _pairs (habilidade.heal_denied) do
habilidade_shadow.heal_denied [spellID] = (habilidade_shadow.heal_denied [spellID] or 0) + amount
end
for healerName, amount in _pairs (habilidade.heal_denied_healers) do
habilidade_shadow.heal_denied_healers [healerName] = (habilidade_shadow.heal_denied_healers [healerName] or 0) + amount
end
end
--> soma todos os demais valores
for key, value in _pairs (habilidade) do
if (_type (value) == "number") then
if (key ~= "id") then
if (not habilidade_shadow [key]) then
habilidade_shadow [key] = 0
end
if (key == "n_min" or key == "c_min") then
if (habilidade_shadow [key] > value) then
habilidade_shadow [key] = value
end
elseif (key == "n_max" or key == "c_max") then
if (habilidade_shadow [key] < value) then
habilidade_shadow [key] = value
end
else
habilidade_shadow [key] = habilidade_shadow [key] + value
end
end
end
end
end
return shadow
end
function atributo_heal:ColetarLixo (lastevent)
return _detalhes:ColetarLixo (class_type, lastevent)
end
atributo_heal.__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
--> cria o container na shadow de ele no existir
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
atributo_heal.__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
--> cria o container na shadow de ele no existir
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 _detalhes.refresh:r_atributo_heal (este_jogador, shadow)
_setmetatable (este_jogador, atributo_heal)
este_jogador.__index = atributo_heal
_detalhes.refresh:r_container_habilidades (este_jogador.spells, shadow and shadow.spells)
end
function _detalhes.clear:c_atributo_heal (este_jogador)
este_jogador.__index = nil
este_jogador.shadow = nil
este_jogador.links = nil
este_jogador.minha_barra = nil
_detalhes.clear:c_container_habilidades (este_jogador.spells)
end