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