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

5810 lines
192 KiB
Lua

-- damage object
local Details = _G.Details
local Loc = LibStub ("AceLocale-3.0"):GetLocale ( "Details" )
local Translit = LibStub ("LibTranslit-1.0")
local gump = Details.gump
local _
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> local pointers
local _cstr = string.format --lua local
local _math_floor = math.floor --lua local
local _table_sort = table.sort --lua local
local _table_insert = table.insert --lua local
local _table_size = table.getn --lua local
local _setmetatable = setmetatable --lua local
local _getmetatable = getmetatable --lua local
local _ipairs = ipairs --lua local
local _pairs = pairs --lua local
local _rawget= rawget --lua local
local _math_min = math.min --lua local
local _math_max = math.max --lua local
local _math_abs = math.abs --lua local
local _bit_band = bit.band --lua local
local _unpack = unpack --lua local
local _type = type --lua local
local GameTooltip = GameTooltip --api local
local _IsInRaid = IsInRaid --api local
local _IsInGroup = IsInGroup --api local
local GetSpellInfo = GetSpellInfo --api local
local _GetSpellInfo = Details.getspellinfo --details api
local _string_replace = Details.string.replace --details api
--show more information about spells
local debugmode = false
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> constants
local alvo_da_habilidade = Details.alvo_da_habilidade
local container_habilidades = Details.container_habilidades
local container_combatentes = Details.container_combatentes
local atributo_damage = Details.atributo_damage
local atributo_misc = Details.atributo_misc
local habilidade_dano = Details.habilidade_dano
local container_damage_target = Details.container_type.CONTAINER_DAMAGETARGET_CLASS
local container_damage = Details.container_type.CONTAINER_DAMAGE_CLASS
local container_friendlyfire = Details.container_type.CONTAINER_FRIENDLYFIRE
local modo_GROUP = Details.modos.group
local modo_ALL = Details.modos.all
local class_type = Details.atributos.dano
local ToKFunctions = Details.ToKFunctions
local SelectedToKFunction = ToKFunctions [1]
local UsingCustomLeftText = false
local UsingCustomRightText = false
local FormatTooltipNumber = ToKFunctions [8]
local TooltipMaximizedMethod = 1
--local CLASS_ICON_TCOORDS = _G.CLASS_ICON_TCOORDS
local is_player_class = Details.player_class
Details.tooltip_key_overlay1 = {1, 1, 1, .2}
Details.tooltip_key_overlay2 = {1, 1, 1, .5}
Details.tooltip_key_size_width = 24
Details.tooltip_key_size_height = 10
local enemies_background = {value = 100, color = {0.1960, 0.1960, 0.1960, 0.8697}, texture = "Interface\\AddOns\\Details\\images\\bar_background2"}
local headerColor = {1, 0.9, 0.0, 1}
local info = Details.playerDetailWindow
local keyName
local OBJECT_TYPE_PLAYER = 0x00000400
local ntable = {} --temp
local vtable = {} --temp
local tooltip_void_zone_temp = {} --temp
local bs_table = {} --temp
local bs_index_table = {} --temp
local bs_tooltip_table
local frags_tooltip_table
local tooltip_temp_table = {}
local OBJECT_TYPE_FRIENDLY_NPC = 0x00000A18
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> exported functions
--[[exported]] function Details:CreateActorLastEventTable()
local t = { {}, {}, {}, {}, {}, {}, {}, {} }
t.n = 1
return t
end
function atributo_damage:CreateFFTable (target_name)
local new_table = {total = 0, spells = {}}
self.friendlyfire [target_name] = new_table
return new_table
end
--[[exported]] function Details:CreateActorAvoidanceTable (no_overall)
if (no_overall) then
local t = {["ALL"] = 0, ["DODGE"] = 0, ["PARRY"] = 0, ["HITS"] = 0, ["ABSORB"] = 0, --quantas vezes foi dodge, parry, quandos hits tomou, quantos absorbs teve
["FULL_HIT"] = 0, ["FULL_ABSORBED"] = 0, ["PARTIAL_ABSORBED"] = 0, --full hit full absorbed and partial absortion
["FULL_HIT_AMT"] = 0, ["PARTIAL_ABSORB_AMT"] = 0, ["ABSORB_AMT"] = 0, ["FULL_ABSORB_AMT"] = 0, --amounts
["BLOCKED_HITS"] = 0, ["BLOCKED_AMT"] = 0, --amount of hits blocked - amout of damage mitigated
}
return t
else
local t = {
overall = {["ALL"] = 0, ["DODGE"] = 0, ["PARRY"] = 0, ["HITS"] = 0, ["ABSORB"] = 0, --quantas vezes foi dodge, parry, quandos hits tomou, quantos absorbs teve
["FULL_HIT"] = 0, ["FULL_ABSORBED"] = 0, ["PARTIAL_ABSORBED"] = 0, --full hit full absorbed and partial absortion
["FULL_HIT_AMT"] = 0, ["PARTIAL_ABSORB_AMT"] = 0, ["ABSORB_AMT"] = 0, ["FULL_ABSORB_AMT"] = 0, --amounts
["BLOCKED_HITS"] = 0, ["BLOCKED_AMT"] = 0, --amount of hits blocked - amout of damage mitigated
}
}
return t
end
end
--[[exported]] function Details.SortGroup (container, keyName2)
keyName = keyName2
return _table_sort (container, Details.SortKeyGroup)
end
--[[exported]] function Details.SortKeyGroup (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
--[[exported]] function Details.SortKeySimple (table1, table2)
return table1 [keyName] > table2 [keyName]
end
--[[exported]] function Details:ContainerSort (container, amount, keyName2)
keyName = keyName2
_table_sort (container, Details.SortKeySimple)
if (amount) then
for i = amount, 1, -1 do --> de trs pra frente
if (container[i][keyName] < 1) then
amount = amount-1
else
break
end
end
return amount
end
end
--[[ exported]] function Details:IsGroupPlayer()
return self.grupo
end
--[[ exported]] function Details:IsPetOrGuardian()
return self.owner and true or false
end
--[[ exported]] function Details:IsPlayer()
if (self.flag_original) then
if (_bit_band (self.flag_original, OBJECT_TYPE_PLAYER) ~= 0) then
return true
end
end
return false
end
local ignored_enemy_npcs = {
[31216] = true, --mirror image
[53006] = true, --spirit link totem
[63508] = true, --xuen
[73967] = true, --xuen
}
-- Night-Twisted Brute - Creature-0-3024-1228-19402-85241-00001E2097
--[[ exported]] function Details:IsNeutralOrEnemy()
if (self.flag_original) then
if (_bit_band (self.flag_original, 0x00000060) ~= 0) then
local npcid1 = Details:GetNpcIdFromGuid (self.serial)
if (ignored_enemy_npcs [npcid1]) then
return false
end
return true
end
end
return false
end
function Details:IsFriendlyNpc()
local flag = self.flag_original
if (flag) then
if (bit.band(flag, 0x00000008) ~= 0) then
if (bit.band(flag, 0x00000010) ~= 0) then
if (bit.band(flag, 0x00000800) ~= 0) then
return true
end
end
end
end
return false
end
--[[ exported]] function Details:IsEnemy()
if (self.flag_original) then
if (_bit_band (self.flag_original, 0x00000060) ~= 0) then
local npcid1 = Details:GetNpcIdFromGuid (self.serial)
if (ignored_enemy_npcs [npcid1]) then
return false
end
return true
end
end
return false
end
--[[ exported]] function Details:GetSpellList()
return self.spells._ActorTable
end
-- enemies (sort function)
local sortEnemies = function (t1, t2)
local a = _bit_band (t1.flag_original, 0x00000060)
local b = _bit_band (t2.flag_original, 0x00000060)
if (a ~= 0 and b ~= 0) then
local npcid1 = Details:GetNpcIdFromGuid (t1.serial)
local npcid2 = Details:GetNpcIdFromGuid (t2.serial)
if (not ignored_enemy_npcs [npcid1] and not ignored_enemy_npcs [npcid2]) then
return t1.damage_taken > t2.damage_taken
elseif (ignored_enemy_npcs [npcid1] and not ignored_enemy_npcs [npcid2]) then
return false
elseif (not ignored_enemy_npcs [npcid1] and ignored_enemy_npcs [npcid2]) then
return true
else
return t1.damage_taken > t2.damage_taken
end
elseif (a ~= 0 and b == 0) then
return true
elseif (a == 0 and b ~= 0) then
return false
end
return false
end
--[[exported]] function Details:ContainerSortEnemies (container, amount, keyName2)
keyName = keyName2
_table_sort (container, sortEnemies)
local total = 0
for index, player in _ipairs (container) do
local npcid1 = Details:GetNpcIdFromGuid (player.serial)
--p rint (player.nome, npcid1, ignored_enemy_npcs [npcid1])
if (_bit_band (player.flag_original, 0x00000060) ~= 0 and not ignored_enemy_npcs [npcid1]) then --> um inimigo
total = total + player [keyName]
else
amount = index-1
break
end
end
return amount, total
end
--[[Exported]] function Details:TooltipForCustom (barra)
GameCooltip:AddLine (Loc ["STRING_LEFT_CLICK_SHARE"])
return true
end
--[[ Void Zone Sort]]
local void_zone_sort = function (t1, t2)
if (t1.damage == t2.damage) then
return t1.nome <= t2.nome
else
return t1.damage > t2.damage
end
end
--[[exported]] function Details.Sort1 (table1, table2)
return table1 [1] > table2 [1]
end
--[[exported]] function Details.Sort2 (table1, table2)
return table1 [2] > table2 [2]
end
--[[exported]] function Details.Sort3 (table1, table2)
return table1 [3] > table2 [3]
end
--[[exported]] function Details.Sort4 (table1, table2)
return table1 [4] > table2 [4]
end
--[[exported]] function Details.Sort4Reverse (table1, table2)
if (not table2) then
return true
end
return table1 [4] < table2 [4]
end
--[[exported]] function Details:GetBarColor (actor)
actor = actor or self
if (actor.monster) then
return _unpack (Details.class_colors.ENEMY)
elseif (actor.customColor) then
return unpack(actor.customColor)
elseif (actor.spellicon) then
return 0.729, 0.917, 1
elseif (actor.owner) then
return _unpack (Details.class_colors [actor.owner.classe or "UNKNOW"])
elseif (actor.arena_team and Details.color_by_arena_team) then
if (actor.arena_team == 0) then
return _unpack (Details.class_colors.ARENA_GREEN)
else
return _unpack (Details.class_colors.ARENA_YELLOW)
end
--elseif (actor.enemy and not actor.arena_enemy) then
-- return 0.94117, 0.1, 0.1, 1
else
if (not is_player_class [actor.classe] and actor.flag_original and _bit_band (actor.flag_original, 0x00000020) ~= 0) then --> neutral
return _unpack (Details.class_colors.NEUTRAL)
elseif (actor.color) then
return _unpack(actor.color)
else
return _unpack (Details.class_colors [actor.classe or "UNKNOW"])
end
end
end
--[[exported]] function Details:GetSpellLink (spellid)
if (_type (spellid) ~= "number") then
return spellid
end
if (spellid == 1) then --melee
return GetSpellLink (6603)
elseif (spellid == 2) then --autoshot
return GetSpellLink (75)
elseif (spellid > 10) then
return GetSpellLink (spellid)
else
local spellname = _GetSpellInfo (spellid)
return spellname
end
end
--[[exported]] function Details:GameTooltipSetSpellByID (spellid)
if (spellid == 1) then
GameTooltip:SetSpellByID (6603)
elseif (spellid == 2) then
GameTooltip:SetSpellByID (75)
elseif (spellid > 10) then
GameTooltip:SetSpellByID (spellid)
else
GameTooltip:SetSpellByID (spellid)
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> class constructor
function atributo_damage:NovaTabela (serial, nome, link)
local alphabetical = Details:GetOrderNumber (nome)
--> constructor
local _new_damageActor = {
tipo = class_type,
total = alphabetical,
totalabsorbed = alphabetical,
total_without_pet = alphabetical,
custom = 0,
damage_taken = alphabetical,
damage_from = {},
dps_started = false,
last_event = 0,
on_hold = false,
delay = 0,
last_value = nil,
last_dps = 0,
end_time = nil,
start_time = 0,
pets = {},
raid_targets = {},
friendlyfire_total = 0,
friendlyfire = {},
targets = {},
spells = container_habilidades:NovoContainer (container_damage)
}
_setmetatable (_new_damageActor, atributo_damage)
return _new_damageActor
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> special cases
-- dps (calculate dps for actors)
function atributo_damage:ContainerRefreshDps (container, combat_time)
local total = 0
if (Details.time_type == 2 or not Details:CaptureGet ("damage")) then
for _, actor in _ipairs (container) do
if (actor.grupo) then
actor.last_dps = actor.total / combat_time
else
actor.last_dps = actor.total / actor:Tempo()
end
total = total + actor.last_dps
end
else
for _, actor in _ipairs (container) do
actor.last_dps = actor.total / actor:Tempo()
total = total + actor.last_dps
end
end
return total
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> damage taken by spell
local byspell_tooltip_background = {value = 100, color = {0.1960, 0.1960, 0.1960, 0.9097}, texture = [[Interface\AddOns\Details\images\bar_background2]]}
function Details:ToolTipBySpell (instance, tabela, thisLine, keydown)
local GameCooltip = GameCooltip
local combat = instance.showing
local from_spell = tabela [1] --spellid
local from_spellname
if (from_spell) then
from_spellname = select (1, GetSpellInfo (from_spell))
end
--> get a list of all damage actors
local AllDamageCharacters = combat:GetActorList (DETAILS_ATTRIBUTE_DAMAGE)
--> hold the targets
local Targets = {}
local total = 0
local top = 0
local is_custom_spell = false
for _, spellcustom in ipairs (Details.savedCustomSpells) do
if (spellcustom[1] == from_spell) then
is_custom_spell = true
end
end
for index, character in ipairs (AllDamageCharacters) do
if (is_custom_spell) then
for playername, ff_table in pairs (character.friendlyfire) do
if (ff_table.spells [from_spell]) then
local damage_actor = combat (1, playername)
local heal_actor = combat (2, playername)
if ((damage_actor or heal_actor) and ( (damage_actor and damage_actor:IsPlayer()) or (heal_actor and heal_actor:IsPlayer()))) then
local got
for index, t in ipairs (Targets) do
if (t[1] == playername) then
t[2] = t[2] + ff_table.spells [from_spell]
total = total + ff_table.spells [from_spell]
if (t[2] > top) then
top = t[2]
end
got = true
break
end
end
if (not got) then
Targets [#Targets+1] = {playername, ff_table.spells [from_spell]}
total = total + ff_table.spells [from_spell]
if (ff_table.spells [from_spell] > top) then
top = ff_table.spells [from_spell]
end
end
end
end
end
else
for playername, ff_table in pairs (character.friendlyfire) do
for spellid, amount in pairs (ff_table.spells) do
local spellname = select (1, GetSpellInfo (spellid))
if (spellname == from_spellname) then
local damage_actor = combat (1, playername)
local heal_actor = combat (2, playername)
if ((damage_actor or heal_actor) and ( (damage_actor and damage_actor:IsPlayer()) or (heal_actor and heal_actor:IsPlayer()))) then
local got
for index, t in ipairs (Targets) do
if (t[1] == playername) then
t[2] = t[2] + amount
total = total + amount
if (t[2] > top) then
top = t[2]
end
got = true
break
end
end
if (not got) then
Targets [#Targets+1] = {playername, amount}
total = total + amount
if (amount > top) then
top = amount
end
end
end
end
end
end
end
--> search actors which used the spell shown in the bar
local spell = character.spells._ActorTable [from_spell]
if (spell) then
for targetname, amount in pairs (spell.targets) do
local got = false
local damage_actor = combat (1, targetname)
local heal_actor = combat (2, targetname)
if ( (damage_actor or heal_actor) and ( (damage_actor and damage_actor:IsPlayer()) or (heal_actor and heal_actor:IsPlayer()) ) ) then
for index, t in ipairs (Targets) do
if (t[1] == targetname) then
t[2] = t[2] + amount
total = total + amount
if (t[2] > top) then
top = t[2]
end
got = true
break
end
end
if (not got) then
Targets [#Targets+1] = {targetname, amount}
total = total + amount
if (amount > top) then
top = amount
end
end
end
end
end
if (not is_custom_spell) then
for spellid, spell in pairs (character.spells._ActorTable) do
if (spellid ~= from_spell) then
local spellname = select (1, GetSpellInfo (spellid))
if (spellname == from_spellname) then
for targetname, amount in pairs (spell.targets) do
local got = false
local damage_actor = combat (1, targetname)
local heal_actor = combat (2, targetname)
if ( (damage_actor or heal_actor) and ( (damage_actor and damage_actor:IsPlayer()) or (heal_actor and heal_actor:IsPlayer()) ) ) then
for index, t in ipairs (Targets) do
if (t[1] == targetname) then
t[2] = t[2] + amount
total = total + amount
if (t[2] > top) then
top = t[2]
end
got = true
break
end
end
if (not got) then
Targets [#Targets+1] = {targetname, amount}
total = total + amount
if (amount > top) then
top = amount
end
end
end
end
end
end
end
end
end
table.sort (Targets, Details.Sort2)
bs_tooltip_table = Targets
bs_tooltip_table.damage_total = total
GameCooltip:SetOption ("StatusBarTexture", "Interface\\AddOns\\Details\\images\\bar_serenity")
local spellname, _, spellicon = select (1, _GetSpellInfo (from_spell))
GameCooltip:AddLine (spellname .. " " .. Loc ["STRING_CUSTOM_ATTRIBUTE_DAMAGE"], nil, nil, headerColor, nil, 10)
GameCooltip:AddIcon (spellicon, 1, 1, 14, 14, 0.078125, 0.921875, 0.078125, 0.921875)
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2)
Details:AddTooltipHeaderStatusbar (1, 1, 1, 0.5)
local top = Targets[1] and Targets[1][2]
local lineHeight = Details.tooltip.line_height
for index, t in ipairs (Targets) do
GameCooltip:AddLine (Details:GetOnlyName(t[1]), Details:ToK (t[2]) .. " (" .. _cstr ("%.1f", t[2]/total*100) .. "%)")
local class, _, _, _, _, r, g, b = Details:GetClass (t[1])
GameCooltip:AddStatusBar (t[2]/top*100, 1, r, g, b, 0.8, false, byspell_tooltip_background)
if (class) then
local specID = Details:GetSpec (t[1])
if (specID) then
local texture, l, r, t, b = Details:GetSpecIcon (specID, false)
GameCooltip:AddIcon (texture, 1, 1, lineHeight, lineHeight, l, r, t, b)
else
local texture, l, r, t, b = Details:GetClassIcon (class)
GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small_alpha", 1, 1, lineHeight, lineHeight, l, r, t, b)
end
elseif (t[1] == Loc ["STRING_TARGETS_OTHER1"]) then
GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small_alpha", 1, 1, lineHeight, lineHeight, 0.25, 0.49609375, 0.75, 1)
end
end
GameCooltip:AddLine (" ")
Details:AddTooltipReportLineText()
GameCooltip:SetOption ("YSpacingMod", 0)
GameCooltip:SetOwner (thisLine)
GameCooltip:Show()
end
local function RefreshBarraBySpell (tabela, barra, instancia)
atributo_damage:AtualizarBySpell (tabela, tabela.minha_barra, barra.colocacao, instancia)
end
local on_switch_DTBS_show = function (instance)
instance:TrocaTabela (instance, true, 1, 8)
return true
end
local DTBS_search_code = [[
--> get the parameters passed
local combat, instance_container, instance = ...
--> declade the values to return
local total, top, amount = 0, 0, 0
--> hold the targets
local Targets = {}
local from_spell = @SPELLID@
local from_spellname
if (from_spell) then
from_spellname = select (1, GetSpellInfo (from_spell))
end
--> get a list of all damage actors
local AllDamageCharacters = combat:GetActorList (DETAILS_ATTRIBUTE_DAMAGE)
local is_custom_spell = false
for _, spellcustom in ipairs (Details.savedCustomSpells) do
if (spellcustom[1] == from_spell) then
is_custom_spell = true
end
end
for index, character in ipairs (AllDamageCharacters) do
if (is_custom_spell) then
for playername, ff_table in pairs (character.friendlyfire) do
if (ff_table.spells [from_spell]) then
local damage_actor = combat (1, playername)
local heal_actor = combat (2, playername)
if ((damage_actor or heal_actor) and ( (damage_actor and damage_actor:IsPlayer()) or (heal_actor and heal_actor:IsPlayer()))) then
local got
for index, t in ipairs (Targets) do
if (t[1] == playername) then
t[2] = t[2] + ff_table.spells [from_spell]
if (t[2] > top) then
top = t[2]
end
got = true
break
end
end
if (not got) then
Targets [#Targets+1] = {playername, ff_table.spells [from_spell], damage_actor or heal_actor}
if (ff_table.spells [from_spell] > top) then
top = ff_table.spells [from_spell]
end
end
end
end
end
else
for playername, ff_table in pairs (character.friendlyfire) do
for spellid, amount in pairs (ff_table.spells) do
local spellname = select (1, GetSpellInfo (spellid))
if (spellname == from_spellname) then
local damage_actor = combat (1, playername)
local heal_actor = combat (2, playername)
if ((damage_actor or heal_actor) and ( (damage_actor and damage_actor:IsPlayer()) or (heal_actor and heal_actor:IsPlayer()))) then
local got
for index, t in ipairs (Targets) do
if (t[1] == playername) then
t[2] = t[2] + amount
if (t[2] > top) then
top = t[2]
end
got = true
break
end
end
if (not got) then
Targets [#Targets+1] = {playername, amount, damage_actor or heal_actor}
if (amount > top) then
top = amount
end
end
end
end
end
end
end
--> search actors which used the spell shown in the bar
local spell = character.spells._ActorTable [from_spell]
if (spell) then
for targetname, amount in pairs (spell.targets) do
local got = false
local damage_actor = combat (1, targetname)
local heal_actor = combat (2, targetname)
if ( (damage_actor or heal_actor) and ( (damage_actor and damage_actor:IsPlayer()) or (heal_actor and heal_actor:IsPlayer()) ) ) then
for index, t in ipairs (Targets) do
if (t[1] == targetname) then
t[2] = t[2] + amount
if (t[2] > top) then
top = t[2]
end
got = true
break
end
end
if (not got) then
Targets [#Targets+1] = {targetname, amount, damage_actor or heal_actor}
if (amount > top) then
top = amount
end
end
end
end
end
if (not is_custom_spell) then
for spellid, spell in pairs (character.spells._ActorTable) do
if (spellid ~= from_spell) then
local spellname = select (1, GetSpellInfo (spellid))
if (spellname == from_spellname) then
for targetname, amount in pairs (spell.targets) do
local got = false
local damage_actor = combat (1, targetname)
local heal_actor = combat (2, targetname)
if ( (damage_actor or heal_actor) and ( (damage_actor and damage_actor:IsPlayer()) or (heal_actor and heal_actor:IsPlayer()) ) ) then
for index, t in ipairs (Targets) do
if (t[1] == targetname) then
t[2] = t[2] + amount
if (t[2] > top) then
top = t[2]
end
got = true
break
end
end
if (not got) then
Targets [#Targets+1] = {targetname, amount, damage_actor or heal_actor}
if (amount > top) then
top = amount
end
end
end
end
end
end
end
end
end
table.sort (Targets, Details.Sort2)
local amount = 0
for index, t in ipairs (Targets) do
instance_container:AddValue (t[3], t[2])
total = total + t[2]
amount = amount + 1
end
return total, top, amount
]]
local function ShowDTBSInWindow (spell, instance)
local spellname, _, icon = _GetSpellInfo (spell [1])
local custom_name = spellname .. " - " .. Loc ["STRING_CUSTOM_DTBS"] .. ""
--check if already exists
for index, CustomObject in _ipairs (Details.custom) do
if (CustomObject:GetName() == custom_name) then
--> fix for not saving funcs on logout
if (not CustomObject.OnSwitchShow) then
CustomObject.OnSwitchShow = on_switch_DTBS_show
end
return instance:TrocaTabela (instance.segmento, 5, index)
end
end
--create a custom for this spell
local new_custom_object = {
name = custom_name,
icon = icon,
attribute = false,
author = Details.playername,
desc = spellname .. " " .. Loc ["STRING_CUSTOM_DTBS"],
source = false,
target = false,
script = false,
tooltip = false,
temp = true,
notooltip = true,
OnSwitchShow = on_switch_DTBS_show,
}
local new_code = DTBS_search_code
new_code = new_code:gsub ("@SPELLID@", spell [1])
new_custom_object.script = new_code
tinsert (Details.custom, new_custom_object)
setmetatable (new_custom_object, Details.atributo_custom)
new_custom_object.__index = Details.atributo_custom
return instance:TrocaTabela (instance.segmento, 5, #Details.custom)
end
local DTBS_format_name = function (player_name) return Details:GetOnlyName (player_name) end
local DTBS_format_amount = function (amount) return Details:ToK (amount) .. " (" .. _cstr ("%.1f", amount / bs_tooltip_table.damage_total * 100) .. "%)" end
function atributo_damage:ReportSingleDTBSLine (spell, instance, ShiftKeyDown, ControlKeyDown)
if (ControlKeyDown) then
local spellname, _, spellicon = _GetSpellInfo (spell[1])
return Details:OpenAuraPanel (spell[1], spellname, spellicon)
elseif (ShiftKeyDown) then
return ShowDTBSInWindow (spell, instance)
end
local spelllink = Details:GetSpellLink (spell [1])
local report_table = {"Details!: " .. Loc ["STRING_CUSTOM_DTBS"] .. " " .. spelllink}
Details:FormatReportLines (report_table, bs_tooltip_table, DTBS_format_name, DTBS_format_amount)
return Details:Reportar (report_table, {_no_current = true, _no_inverse = true, _custom = true})
end
function atributo_damage:AtualizarBySpell (tabela, whichRowLine, colocacao, instancia)
tabela ["byspell"] = true --> marca que esta tabela uma tabela de frags, usado no controla na hora de montar o tooltip
local thisLine = instancia.barras [whichRowLine] --> pega a referncia da barra na janela
if (not thisLine) then
print ("DEBUG: problema com <instancia.thisLine> "..whichRowLine .. " " .. colocacao)
return
end
thisLine.minha_tabela = tabela
local spellname, _, spellicon = _GetSpellInfo (tabela [1])
tabela.nome = spellname --> evita dar erro ao redimencionar a janela
tabela.minha_barra = whichRowLine
thisLine.colocacao = colocacao
if (not _getmetatable (tabela)) then
_setmetatable (tabela, {__call = RefreshBarraBySpell})
tabela._custom = true
end
local total = instancia.showing.totals.by_spell
local porcentagem
if (instancia.row_info.percent_type == 1) then
porcentagem = _cstr ("%.1f", tabela [2] / total * 100)
elseif (instancia.row_info.percent_type == 2) then
porcentagem = _cstr ("%.1f", tabela [2] / instancia.top * 100)
end
thisLine.lineText1:SetText (colocacao .. ". " .. spellname)
local bars_show_data = instancia.row_info.textR_show_data
local spell_damage = tabela [2] -- spell_damage passar por uma ToK function, precisa ser number
if (not bars_show_data [1]) then
spell_damage = tabela [2] --damage taken by spell no tem PS, ento obrigado a passar o dano total
end
if (not bars_show_data [3]) then
porcentagem = ""
else
porcentagem = porcentagem .. "%"
end
local bars_brackets = instancia:GetBarBracket()
--
if (instancia.use_multi_fontstrings) then
Details:SetTextsOnLine(thisLine, "", (spell_damage and SelectedToKFunction (_, spell_damage) or ""), porcentagem)
else
thisLine.lineText4:SetText ((spell_damage and SelectedToKFunction (_, spell_damage) or "") .. bars_brackets[1] .. porcentagem .. bars_brackets[2])
end
thisLine.lineText1:SetTextColor(1, 1, 1, 1)
thisLine.lineText2:SetTextColor(1, 1, 1, 1)
thisLine.lineText3:SetTextColor(1, 1, 1, 1)
thisLine.lineText4:SetTextColor(1, 1, 1, 1)
thisLine.lineText1:SetSize (thisLine:GetWidth() - thisLine.lineText4:GetStringWidth() - 20, 15)
if (colocacao == 1) then
thisLine:SetValue (100)
else
thisLine:SetValue (tabela [2] / instancia.top * 100)
end
if (thisLine.hidden or thisLine.fading_in or thisLine.faded) then
Details.FadeHandler.Fader (thisLine, "out")
end
if (instancia.row_info.texture_class_colors) then
if (tabela [3] > 1) then
local r, g, b = Details:GetSpellSchoolColor (tabela [3])
thisLine.textura:SetVertexColor (r, g, b)
else
local r, g, b = Details:GetSpellSchoolColor (0)
thisLine.textura:SetVertexColor (r, g, b)
end
end
thisLine.icone_classe:SetTexture (spellicon)
thisLine.icone_classe:SetTexCoord (0.078125, 0.921875, 0.078125, 0.921875)
thisLine.icone_classe:SetVertexColor (1, 1, 1)
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> frags
function Details:ToolTipFrags (instancia, frag, thisLine, keydown)
local name = frag [1]
local GameCooltip = GameCooltip
--> mantendo a funo o mais low level possvel
local damage_container = instancia.showing [1]
local frag_actor = damage_container._ActorTable [damage_container._NameIndexTable [ name ]]
if (frag_actor) then
local damage_taken_table = {}
local took_damage_from = frag_actor.damage_from
local total_damage_taken = frag_actor.damage_taken
local total = 0
for aggressor, _ in _pairs (took_damage_from) do
local damager_actor = damage_container._ActorTable [damage_container._NameIndexTable [ aggressor ]]
if (damager_actor and not damager_actor.owner) then --> checagem por causa do total e do garbage collector que no limpa os names que deram dano
local target_amount = damager_actor.targets [name]
if (target_amount) then
damage_taken_table [#damage_taken_table+1] = {aggressor, target_amount, damager_actor.classe}
total = total + target_amount
end
end
end
_table_sort (damage_taken_table, Details.Sort2)
Details:AddTooltipSpellHeaderText (Loc ["STRING_DAMAGE_FROM"], headerColor, #damage_taken_table, [[Interface\Addons\Details\images\icons]], 0.126953125, 0.1796875, 0, 0.0546875)
Details:AddTooltipHeaderStatusbar (1, 1, 1, 0.5)
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2)
local min = 6
local ismaximized = false
--always maximized
if (true or keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3) then
min = 99
ismaximized = true
end
if (ismaximized) then
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2)
else
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay1)
end
local top = damage_taken_table[1] and damage_taken_table[1][2]
frags_tooltip_table = damage_taken_table
frags_tooltip_table.damage_total = total
local lineHeight = Details.tooltip.line_height
if (#damage_taken_table > 0) then
for i = 1, math.min (min, #damage_taken_table) do
local t = damage_taken_table [i]
GameCooltip:AddLine (Details:GetOnlyName (t[1]), FormatTooltipNumber (_, t[2]) .. " (" .. _cstr ("%.1f", t[2] / total * 100) .. "%)")
local classe = t[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 = Details:GetSpec (t[1])
if (specID) then
local texture, l, r, t, b = Details:GetSpecIcon (specID, false)
GameCooltip:AddIcon (texture, 1, 1, lineHeight, lineHeight, l, r, t, b)
else
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small_alpha]], nil, nil, lineHeight, lineHeight, _unpack (Details.class_coords [classe]))
end
end
local _, _, _, _, _, r, g, b = Details:GetClass (t[1])
GameCooltip:AddStatusBar (t[2] / top * 100, 1, r, g, b, 1, false, enemies_background)
end
else
GameCooltip:AddLine (Loc ["STRING_NO_DATA"], nil, 1, "white")
GameCooltip:AddIcon (instancia.row_info.icon_file, nil, nil, 14, 14, _unpack (Details.class_coords ["UNKNOW"]))
end
GameCooltip:AddLine (" ")
Details:AddTooltipReportLineText()
GameCooltip:SetOption ("StatusBarTexture", "Interface\\AddOns\\Details\\images\\bar_serenity")
GameCooltip:ShowCooltip()
end
end
local function RefreshBarraFrags (tabela, barra, instancia)
atributo_damage:AtualizarFrags (tabela, tabela.minha_barra, barra.colocacao, instancia)
end
function atributo_damage:AtualizarFrags (tabela, whichRowLine, colocacao, instancia)
tabela ["frags"] = true --> marca que esta tabela uma tabela de frags, usado no controla na hora de montar o tooltip
local thisLine = instancia.barras [whichRowLine] --> pega a referncia da barra na janela
if (not thisLine) then
print ("DEBUG: problema com <instancia.thisLine> "..whichRowLine.." "..rank)
return
end
local previousData = thisLine.minha_tabela
thisLine.minha_tabela = tabela
tabela.nome = tabela [1] --> evita dar erro ao redimencionar a janela
tabela.minha_barra = whichRowLine
thisLine.colocacao = colocacao
if (not _getmetatable (tabela)) then
_setmetatable (tabela, {__call = RefreshBarraFrags})
tabela._custom = true
end
local total = instancia.showing.totals.frags_total
local porcentagem
if (instancia.row_info.percent_type == 1) then
porcentagem = _cstr ("%.1f", tabela [2] / total * 100)
elseif (instancia.row_info.percent_type == 2) then
porcentagem = _cstr ("%.1f", tabela [2] / instancia.top * 100)
end
thisLine.lineText1:SetText (colocacao .. ". " .. tabela [1])
local bars_show_data = instancia.row_info.textR_show_data
local bars_brackets = instancia:GetBarBracket()
local total_frags = tabela [2]
if (not bars_show_data [1]) then
total_frags = ""
end
if (not bars_show_data [3]) then
porcentagem = ""
else
porcentagem = porcentagem .. "%"
end
--
if (instancia.use_multi_fontstrings) then
Details:SetTextsOnLine(thisLine, "", total_frags, porcentagem)
else
thisLine.lineText4:SetText (total_frags .. bars_brackets[1] .. porcentagem .. bars_brackets[2])
end
thisLine.lineText1:SetSize (thisLine:GetWidth() - thisLine.lineText4:GetStringWidth() - 20, 15)
if (colocacao == 1) then
thisLine:SetValue (100)
else
thisLine:SetValue (tabela [2] / instancia.top * 100)
end
thisLine.lineText1:SetTextColor (1, 1, 1, 1)
thisLine.lineText4:SetTextColor (1, 1, 1, 1)
if (thisLine.hidden or thisLine.fading_in or thisLine.faded) then
Details.FadeHandler.Fader (thisLine, "out")
end
Details:SetBarColors (thisLine, instancia, _unpack (Details.class_colors [tabela [3]]))
if (tabela [3] == "UNKNOW" or tabela [3] == "UNGROUPPLAYER" or tabela [3] == "ENEMY") then
thisLine.icone_classe:SetTexture ([[Interface\AddOns\Details\images\classes_plus]])
thisLine.icone_classe:SetTexCoord (0.50390625, 0.62890625, 0, 0.125)
thisLine.icone_classe:SetVertexColor (1, 1, 1)
else
thisLine.icone_classe:SetTexture (instancia.row_info.icon_file)
thisLine.icone_classe:SetTexCoord (_unpack (Details.class_coords [tabela [3]]))
thisLine.icone_classe:SetVertexColor (1, 1, 1)
end
if (thisLine.mouse_over and not instancia.baseframe.isMoving) then --> precisa atualizar o tooltip
--gump:UpdateTooltip (whichRowLine, thisLine, instancia)
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> void zones
local on_switch_AVZ_show = function (instance)
instance:TrocaTabela (instance, true, 1, 7)
return true
end
local AVZ_search_code = [[
--> get the parameters passed
local combat, instance_container, instance = ...
--> declade the values to return
local total, top, amount = 0, 0, 0
local actor_name = "@ACTORNAME@"
local actor = combat (4, actor_name)
if (not actor) then
return 0, 0, 0
end
local damage_actor = combat (1, actor.damage_twin)
local habilidade
local alvos
if (damage_actor) then
habilidade = damage_actor.spells._ActorTable [actor.damage_spellid]
end
if (habilidade) then
alvos = habilidade.targets
end
local container = actor.debuff_uptime_targets
local tooltip_void_zone_temp = {}
for target_name, debuff_table in pairs (container) do
if (alvos) then
local damage_alvo = alvos [target_name]
if (damage_alvo) then
debuff_table.damage = damage_alvo
else
debuff_table.damage = 0
end
else
debuff_table.damage = 0
end
end
local i = 1
for target_name, debuff_table in pairs (container) do
local t = tooltip_void_zone_temp [i]
if (not t) then
t = {}
tinsert (tooltip_void_zone_temp, t)
end
local target_actor = combat (1, target_name) or combat (2, target_name) or combat (4, target_name)
t[1] = target_name
t[2] = debuff_table.damage
t[3] = debuff_table
t[4] = target_actor
i = i + 1
end
--> sort no container:
table.sort (tooltip_void_zone_temp, Details.sort_tooltip_void_zones)
for index, t in ipairs (tooltip_void_zone_temp) do
instance_container:AddValue (t[4], t[2])
local custom_actor = instance_container:GetActorTable (t[4])
custom_actor.uptime = t[3].uptime
total = total + t[2]
amount = amount + 1
if (t[2] > top) then
top = t[2]
end
end
return total, top, amount
]]
local AVZ_total_code = [[
local value, top, total, combat, instance, custom_actor = ...
local uptime = custom_actor.uptime or 0
local minutos, segundos = floor (uptime / 60), floor (uptime % 60)
if (minutos > 0) then
uptime = "" .. minutos .. "m " .. segundos .. "s" .. ""
else
uptime = "" .. segundos .. "s" .. ""
end
return Details:ToK2 (value) .. " - " .. uptime .. " "
]]
local function ShowVoidZonesInWindow (actor, instance)
local spellid = tooltip_void_zone_temp.spellid
local spellname, _, icon = _GetSpellInfo (spellid)
local custom_name = spellname .. " - " .. Loc ["STRING_ATTRIBUTE_DAMAGE_DEBUFFS_REPORT"] .. ""
--check if already exists
for index, CustomObject in _ipairs (Details.custom) do
if (CustomObject:GetName() == custom_name) then
--> fix for not saving funcs on logout
if (not CustomObject.OnSwitchShow) then
CustomObject.OnSwitchShow = on_switch_AVZ_show
end
return instance:TrocaTabela (instance.segmento, 5, index)
end
end
--create a custom for this spell
local new_custom_object = {
name = custom_name,
icon = icon,
attribute = false,
author = Details.playername,
desc = spellname .. " " .. Loc ["STRING_ATTRIBUTE_DAMAGE_DEBUFFS_REPORT"],
source = false,
target = false,
script = false,
tooltip = false,
temp = true,
notooltip = true,
OnSwitchShow = on_switch_AVZ_show,
}
local new_code = AVZ_search_code
new_code = new_code:gsub ("@ACTORNAME@", actor.nome)
new_custom_object.script = new_code
local new_total_code = AVZ_total_code
new_total_code = new_total_code:gsub ("@ACTORNAME@", actor.nome)
new_total_code = new_total_code:gsub ("@SPELLID@", spellid)
new_custom_object.total_script = new_total_code
tinsert (Details.custom, new_custom_object)
setmetatable (new_custom_object, Details.atributo_custom)
new_custom_object.__index = Details.atributo_custom
return instance:TrocaTabela (instance.segmento, 5, #Details.custom)
end
function atributo_damage:ReportSingleVoidZoneLine (actor, instance, ShiftKeyDown, ControlKeyDown)
local spellid = tooltip_void_zone_temp.spellid
if (ControlKeyDown) then
local spellname, _, spellicon = _GetSpellInfo (spellid)
return Details:OpenAuraPanel (spellid, spellname, spellicon)
elseif (ShiftKeyDown) then
return ShowVoidZonesInWindow (actor, instance)
end
local spelllink = Details:GetSpellLink (spellid)
local report_table = {"Details!: " .. spelllink .. " " .. Loc ["STRING_ATTRIBUTE_DAMAGE_DEBUFFS_REPORT"]}
local t = {}
for index, void_table in ipairs (tooltip_void_zone_temp) do
--ir reportar dano zero tambm
if (void_table[1] and type (void_table[1]) == "string" and void_table[2] and void_table[3] and type (void_table[3]) == "table") then
local actor_table = {Details:GetOnlyName (void_table[1])}
local m, s = _math_floor (void_table[3].uptime / 60), _math_floor (void_table[3].uptime % 60)
if (m > 0) then
actor_table [2] = FormatTooltipNumber (_, void_table[3].damage) .. " (" .. m .. "m " .. s .. "s" .. ")"
else
actor_table [2] = FormatTooltipNumber (_, void_table[3].damage) .. " (" .. s .. "s" .. ")"
end
t [#t+1] = actor_table
end
end
Details:FormatReportLines (report_table, t)
return Details:Reportar (report_table, {_no_current = true, _no_inverse = true, _custom = true})
end
local sort_tooltip_void_zones = function (tabela1, tabela2)
if (tabela1 [2] > tabela2 [2]) then
return true
elseif (tabela1 [2] == tabela2 [2]) then
if (tabela1[1] ~= "" and tabela2[1] ~= "") then
return tabela1 [3].uptime > tabela2 [3].uptime
elseif (tabela1[1] ~= "") then
return true
elseif (tabela2[1] ~= "") then
return false
end
else
return false
end
end
Details.sort_tooltip_void_zones = sort_tooltip_void_zones
function Details:ToolTipVoidZones (instancia, actor, barra, keydown)
local damage_actor = instancia.showing[1]:PegarCombatente (_, actor.damage_twin)
local habilidade
local alvos
if (damage_actor) then
habilidade = damage_actor.spells._ActorTable [actor.damage_spellid]
end
if (habilidade) then
alvos = habilidade.targets
end
local container = actor.debuff_uptime_targets
for target_name, debuff_table in _pairs (container) do
if (alvos) then
local damage_alvo = alvos [target_name]
if (damage_alvo) then
debuff_table.damage = damage_alvo
else
debuff_table.damage = 0
end
else
debuff_table.damage = 0
end
end
for i = 1, #tooltip_void_zone_temp do
local t = tooltip_void_zone_temp [i]
t[1] = ""
t[2] = 0
t[3] = 0
end
local i = 1
for target_name, debuff_table in _pairs (container) do
local t = tooltip_void_zone_temp [i]
if (not t) then
t = {}
tinsert (tooltip_void_zone_temp, t)
end
t[1] = target_name
t[2] = debuff_table.damage
t[3] = debuff_table
i = i + 1
end
--> sort no container:
_table_sort (tooltip_void_zone_temp, sort_tooltip_void_zones)
--> monta o cooltip
local GameCooltip = GameCooltip
local spellname, _, spellicon = _GetSpellInfo (actor.damage_spellid)
Details:AddTooltipSpellHeaderText (spellname .. " " .. Loc ["STRING_VOIDZONE_TOOLTIP"], headerColor, #tooltip_void_zone_temp, spellicon, 0.078125, 0.921875, 0.078125, 0.921875)
Details:AddTooltipHeaderStatusbar (1, 1, 1, 0.5)
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2)
--for target_name, debuff_table in _pairs (container) do
local first = tooltip_void_zone_temp [1] and tooltip_void_zone_temp [1][3]
if (type (first) == "table") then
first = first.damage
end
tooltip_void_zone_temp.spellid = actor.damage_spellid
tooltip_void_zone_temp.current_actor = actor
local lineHeight = Details.tooltip.line_height
for index, t in _ipairs (tooltip_void_zone_temp) do
if (t[3] == 0) then
break
end
local debuff_table = t[3]
local minutos, segundos = _math_floor (debuff_table.uptime / 60), _math_floor (debuff_table.uptime % 60)
if (minutos > 0) then
GameCooltip:AddLine (Details:GetOnlyName (t[1]), FormatTooltipNumber (_, debuff_table.damage) .. " (" .. minutos .. "m " .. segundos .. "s" .. ")")
else
GameCooltip:AddLine (Details:GetOnlyName (t[1]), FormatTooltipNumber (_, debuff_table.damage) .. " (" .. segundos .. "s" .. ")")
end
local classe = Details:GetClass (t[1])
if (classe) then
local specID = Details:GetSpec (t[1])
if (specID) then
local texture, l, r, t, b = Details:GetSpecIcon (specID, false)
GameCooltip:AddIcon (texture, 1, 1, lineHeight, lineHeight, l, r, t, b)
else
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small_alpha]], nil, nil, lineHeight, lineHeight, unpack (Details.class_coords [classe]))
end
else
GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, lineHeight, lineHeight, .25, .5, 0, 1)
end
local _, _, _, _, _, r, g, b = Details:GetClass (t[1])
if (first == 0) then
first = 0.0000000001
end
GameCooltip:AddStatusBar (debuff_table.damage / first * 100, 1, r, g, b, 1, false, enemies_background)
--Details:AddTooltipBackgroundStatusbar()
end
GameCooltip:AddLine (" ")
Details:AddTooltipReportLineText()
GameCooltip:SetOption ("StatusBarTexture", "Interface\\AddOns\\Details\\images\\bar_serenity")
GameCooltip:ShowCooltip()
end
local function RefreshBarraVoidZone (tabela, barra, instancia)
tabela:AtualizarVoidZone (tabela.minha_barra, barra.colocacao, instancia)
end
function atributo_misc:AtualizarVoidZone (whichRowLine, colocacao, instancia)
--> pega a referncia da barra na janela
local thisLine = instancia.barras [whichRowLine]
if (not thisLine) then
print ("DEBUG: problema com <instancia.thisLine> "..whichRowLine.." "..rank)
return
end
self._refresh_window = RefreshBarraVoidZone
local previousData = thisLine.minha_tabela
thisLine.minha_tabela = self
self.minha_barra = whichRowLine
thisLine.colocacao = colocacao
local total = instancia.showing.totals.voidzone_damage
local combat_time = instancia.showing:GetCombatTime()
local dps = _math_floor (self.damage / combat_time)
local formated_damage = SelectedToKFunction (_, self.damage)
local formated_dps = SelectedToKFunction (_, dps)
local porcentagem
if (instancia.row_info.percent_type == 1) then
total = max (total, 0.0001)
porcentagem = _cstr ("%.1f", self.damage / total * 100)
elseif (instancia.row_info.percent_type == 2) then
local top = max (instancia.top, 0.0001)
porcentagem = _cstr ("%.1f", self.damage / top * 100)
end
local bars_show_data = instancia.row_info.textR_show_data
local bars_brackets = instancia:GetBarBracket()
local bars_separator = instancia:GetBarSeparator()
if (not bars_show_data [1]) then
formated_damage = ""
end
if (not bars_show_data [2]) then
formated_dps = ""
end
if (not bars_show_data [3]) then
porcentagem = ""
else
porcentagem = porcentagem .. "%"
end
local rightText = formated_damage .. bars_brackets[1] .. formated_dps .. bars_separator .. porcentagem .. bars_brackets[2]
if (UsingCustomRightText) then
thisLine.lineText4:SetText (_string_replace (instancia.row_info.textR_custom_text, formated_damage, formated_dps, porcentagem, self, instancia.showing, instancia, rightText))
else
if (instancia.use_multi_fontstrings) then
Details:SetTextsOnLine(thisLine, formated_damage, formated_dps, porcentagem)
else
thisLine.lineText4:SetText (rightText)
end
end
thisLine.lineText1:SetText (colocacao .. ". " .. self.nome)
thisLine.lineText1:SetSize (thisLine:GetWidth() - thisLine.lineText4:GetStringWidth() - 20, 15)
thisLine.lineText1:SetTextColor (1, 1, 1, 1)
thisLine.lineText4:SetTextColor (1, 1, 1, 1)
thisLine:SetValue (100)
if (thisLine.hidden or thisLine.fading_in or thisLine.faded) then
Details.FadeHandler.Fader (thisLine, "out")
end
local _, _, icon = GetSpellInfo (self.damage_spellid)
local school_color = Details.school_colors [self.spellschool]
if (not school_color) then
school_color = Details.school_colors ["unknown"]
end
Details:SetBarColors (thisLine, instancia, _unpack (school_color))
thisLine.icone_classe:SetTexture (icon)
thisLine.icone_classe:SetTexCoord (0.078125, 0.921875, 0.078125, 0.921875)
thisLine.icone_classe:SetVertexColor (1, 1, 1)
if (thisLine.mouse_over and not instancia.baseframe.isMoving) then
--need call a refresh function
end
end
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> main refresh function
function atributo_damage:RefreshWindow (instancia, tabela_do_combate, forcar, exportar, refresh_needed)
local showing = tabela_do_combate [class_type] --> o que esta sendo mostrado -> [1] - dano [2] - cura --> pega o container com ._NameIndexTable ._ActorTable
--> no h barras para mostrar -- not have something to show
if (#showing._ActorTable < 1) then
if (Details.debug and false) then
Details.showing_ActorTable_Timer = Details.showing_ActorTable_Timer or 0
if (time() > Details.showing_ActorTable_Timer) then
Details:Msg ("(debug) nothing to show -> #showing._ActorTable < 1")
Details.showing_ActorTable_Timer = time()+5
end
end
--> colocado isso recentemente para fazer as barras de dano sumirem na troca de atributo
return Details:EsconderBarrasNaoUsadas (instancia, showing), "", 0, 0
end
--> total
local total = 0
--> top actor #1
instancia.top = 0
local using_cache = false
local sub_atributo = instancia.sub_atributo --> o que esta sendo mostrado nesta instncia
local conteudo = showing._ActorTable --> pega a lista de jogadores -- get actors table from container
local amount = #conteudo
local modo = instancia.modo
--> pega qual a sub key que ser usada --sub keys
if (exportar) then
if (_type (exportar) == "boolean") then
if (sub_atributo == 1) then --> DAMAGE DONE
keyName = "total"
elseif (sub_atributo == 2) then --> DPS
keyName = "last_dps"
elseif (sub_atributo == 3) then --> TAMAGE TAKEN
keyName = "damage_taken"
if (Details.damage_taken_everything) then
modo = modo_ALL
end
elseif (sub_atributo == 4) then --> FRIENDLY FIRE
keyName = "friendlyfire_total"
elseif (sub_atributo == 5) then --> FRAGS
keyName = "frags"
elseif (sub_atributo == 6) then --> ENEMIES
keyName = "enemies"
elseif (sub_atributo == 7) then --> AURAS VOIDZONES
keyName = "voidzones"
elseif (sub_atributo == 8) then --> BY SPELL
keyName = "damage_taken_by_spells"
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 --> DAMAGE DONE
keyName = "total"
elseif (sub_atributo == 2) then --> DPS
keyName = "last_dps"
elseif (sub_atributo == 3) then --> TAMAGE TAKEN
keyName = "damage_taken"
if (Details.damage_taken_everything) then
modo = modo_ALL
end
elseif (sub_atributo == 4) then --> FRIENDLY FIRE
keyName = "friendlyfire_total"
elseif (sub_atributo == 5) then --> FRAGS
keyName = "frags"
elseif (sub_atributo == 6) then --> ENEMIES
keyName = "enemies"
elseif (sub_atributo == 7) then --> AURAS VOIDZONES
keyName = "voidzones"
elseif (sub_atributo == 8) then --> BY SPELL
keyName = "damage_taken_by_spells"
end
end
if (keyName == "frags") then
local frags = instancia.showing.frags
local frags_total_kills = 0
local index = 0
for fragName, fragAmount in _pairs (frags) do
index = index + 1
local fragged_actor = showing._NameIndexTable [fragName] --> get index
local actor_classe
if (fragged_actor) then
fragged_actor = showing._ActorTable [fragged_actor] --> get object
actor_classe = fragged_actor.classe
end
if (fragged_actor and fragged_actor.monster) then
actor_classe = "ENEMY"
elseif (not actor_classe) then
actor_classe = "UNGROUPPLAYER"
end
if (ntable [index]) then
ntable [index] [1] = fragName
ntable [index] [2] = fragAmount
ntable [index] [3] = actor_classe
else
ntable [index] = {fragName, fragAmount, actor_classe}
end
frags_total_kills = frags_total_kills + fragAmount
end
local tsize = #ntable
if (index < tsize) then
for i = index+1, tsize do
ntable [i][2] = 0
end
end
instancia.top = 0
if (tsize > 0) then
_table_sort (ntable, Details.Sort2)
instancia.top = ntable [1][2]
end
total = index
if (exportar) then
local export = {}
for i = 1, index do
export [i] = {ntable[i][1], ntable[i][2], ntable[i][3]}
end
return export
end
if (total < 1) then
instancia:EsconderScrollBar()
return Details:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh
end
tabela_do_combate.totals.frags_total = frags_total_kills
instancia:RefreshScrollBar (total)
local whichRowLine = 1
local lineContainer = instancia.barras
for i = instancia.barraS[1], instancia.barraS[2], 1 do
atributo_damage:AtualizarFrags (ntable[i], whichRowLine, i, instancia)
whichRowLine = whichRowLine+1
end
return Details:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh
elseif (keyName == "damage_taken_by_spells") then
local bs_index, total = 0, 0
wipe (bs_index_table)
local combat = tabela_do_combate
local AllDamageCharacters = combat:GetActorList (DETAILS_ATTRIBUTE_DAMAGE)
--> do a loop amoung the actors
for index, character in ipairs (AllDamageCharacters) do
--> is the actor a player?
if (character:IsPlayer()) then
for source_name, _ in pairs (character.damage_from) do
local source = combat (1, source_name)
if (source) then
--> came from an enemy
if (not source:IsPlayer()) then
local AllSpells = source:GetSpellList()
for spellid, spell in pairs (AllSpells) do
local on_player = spell.targets [character.nome]
if (on_player and on_player >= 1) then
local spellname = _GetSpellInfo (spellid)
if (spellname) then
local has_index = bs_index_table [spellname]
local this_spell
if (has_index) then
this_spell = bs_table [has_index]
else
bs_index = bs_index + 1
this_spell = bs_table [bs_index]
if (this_spell) then
this_spell [1] = spellid
this_spell [2] = 0
this_spell [3] = spell.spellschool or Details.spell_school_cache [select (1, GetSpellInfo (spellid))] or 1
bs_index_table [spellname] = bs_index
else
this_spell = {spellid, 0, spell.spellschool or Details.spell_school_cache [select (1, GetSpellInfo (spellid))] or 1}
bs_table [bs_index] = this_spell
bs_index_table [spellname] = bs_index
end
end
this_spell [2] = this_spell [2] + on_player
total = total + on_player
else
error ("error - no spell id for DTBS " .. spellid)
end
end
end
elseif (source:IsGroupPlayer()) then -- friendly fire
local AllSpells = source.friendlyfire [character.nome] and source.friendlyfire [character.nome].spells
if (AllSpells) then -- se no existir pode ter vindo de um pet, talvez
for spellid, on_player in pairs (AllSpells) do
if (on_player and on_player >= 1) then
local spellname = _GetSpellInfo (spellid)
if (spellname) then
local has_index = bs_index_table [spellname]
local this_spell
if (has_index) then
this_spell = bs_table [has_index]
else
bs_index = bs_index + 1
this_spell = bs_table [bs_index]
if (this_spell) then
this_spell [1] = spellid
this_spell [2] = 0
this_spell [3] = Details.spell_school_cache [select (1, GetSpellInfo (spellid))] or 1
bs_index_table [spellname] = bs_index
else
this_spell = {spellid, 0, Details.spell_school_cache [select (1, GetSpellInfo (spellid))] or 1}
bs_table [bs_index] = this_spell
bs_index_table [spellname] = bs_index
end
end
this_spell [2] = this_spell [2] + on_player
total = total + on_player
else
error ("error - no spell id for DTBS friendly fire " .. spellid)
end
end
end
end
end
end
end
end
end
local tsize = #bs_table
if (bs_index < tsize) then
for i = bs_index+1, tsize do
bs_table [i][2] = 0
end
end
instancia.top = 0
if (tsize > 0) then
_table_sort (bs_table, Details.Sort2)
instancia.top = bs_table [1][2]
end
local total2 = bs_index
if (exportar) then
local export = {}
for i = 1, bs_index do
-- spellid, total, spellschool
export [i] = {spellid = bs_table[i][1], damage = bs_table[i][2], spellschool = bs_table[i][3]}
end
return total, "damage", instancia.top, bs_index, export
end
if (bs_index < 1) then
instancia:EsconderScrollBar()
return Details:EndRefresh (instancia, bs_index, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh
end
tabela_do_combate.totals.by_spell = total
instancia:RefreshScrollBar (bs_index)
local whichRowLine = 1
local lineContainer = instancia.barras
--print (bs_index, #bs_table, instancia.barraS[1], instancia.barraS[2])
for i = instancia.barraS[1], instancia.barraS[2], 1 do
atributo_damage:AtualizarBySpell (bs_table[i], whichRowLine, i, instancia)
whichRowLine = whichRowLine+1
end
return Details:EndRefresh (instancia, bs_index, tabela_do_combate, showing)
elseif (keyName == "voidzones") then
local index = 0
local misc_container = tabela_do_combate [4]
local voidzone_damage_total = 0
for _, actor in _ipairs (misc_container._ActorTable) do
if (actor.boss_debuff) then
index = index + 1
--pega no container de dano o actor responsvel por aplicar o debuff
local twin_damage_actor = showing._NameIndexTable [actor.damage_twin] or showing._NameIndexTable ["[*] " .. actor.damage_twin]
if (twin_damage_actor) then
local index = twin_damage_actor
twin_damage_actor = showing._ActorTable [twin_damage_actor]
local spell = twin_damage_actor.spells._ActorTable [actor.damage_spellid]
if (spell) then
--> fix spell, sometimes there is two spells with the same name, one is the cast and other is the debuff
if (spell.total == 0 and not actor.damage_spellid_fixed) then
local curname = _GetSpellInfo (actor.damage_spellid)
for spellid, spelltable in _pairs (twin_damage_actor.spells._ActorTable) do
if (spelltable.total > spell.total) then
local name = _GetSpellInfo (spellid)
if (name == curname) then
actor.damage_spellid = spellid
spell = spelltable
end
end
end
actor.damage_spellid_fixed = true
end
actor.damage = spell.total
voidzone_damage_total = voidzone_damage_total + spell.total
elseif (not actor.damage_spellid_fixed) then --not
--> fix spell, if the spellid passed for debuff uptime is actully the spell id of a ability and not if the aura it self
actor.damage_spellid_fixed = true
local found = false
for spellid, spelltable in _pairs (twin_damage_actor.spells._ActorTable) do
local name = _GetSpellInfo (spellid)
if (actor.damage_twin:find (name)) then
actor.damage = spelltable.total
voidzone_damage_total = voidzone_damage_total + spelltable.total
actor.damage_spellid = spellid
found = true
break
end
end
if (not found) then
actor.damage = 0
end
else
actor.damage = 0
end
else
actor.damage = 0
end
vtable [index] = actor
end
end
local tsize = #vtable
if (index < tsize) then
for i = index+1, tsize do
vtable [i] = nil
end
end
if (tsize > 0 and vtable[1]) then
_table_sort (vtable, void_zone_sort)
instancia.top = vtable [1].damage
end
total = index
if (exportar) then
for _, t in ipairs (vtable) do
t.report_name = Details:GetSpellLink (t.damage_spellid)
end
return voidzone_damage_total, "damage", instancia.top, total, vtable, "report_name"
end
if (total < 1) then
instancia:EsconderScrollBar()
return Details:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh
end
tabela_do_combate.totals.voidzone_damage = voidzone_damage_total
instancia:RefreshScrollBar (total)
local whichRowLine = 1
local lineContainer = instancia.barras
for i = instancia.barraS[1], instancia.barraS[2], 1 do
vtable[i]:AtualizarVoidZone (whichRowLine, i, instancia)
whichRowLine = whichRowLine+1
end
return Details:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh
else
--/run Details:Dump(Details:GetCurrentCombat():GetActor(1, "Injured Steelspine 1"))
if (keyName == "enemies") then
amount, total = Details:ContainerSortEnemies (conteudo, amount, "damage_taken")
--remove actors with zero damage taken
local newAmount = 0
for i = 1, #conteudo do
if (conteudo[i].damage_taken < 1) then
newAmount = i-1
break
end
end
--if all units shown are enemies and all have damage taken, check if newAmount is zero and #conteudo has value bigger than 0
if (newAmount == 0 and #conteudo > 0) then
amount = amount
else
amount = newAmount
end
--keyName = "damage_taken"
--result of the first actor
instancia.top = conteudo[1] and conteudo[1][keyName]
elseif (modo == modo_ALL) then --> mostrando ALL
--> faz o sort da categoria e retorna o amount corrigido
--print (keyName)
if (sub_atributo == 2) then
local combat_time = instancia.showing:GetCombatTime()
total = atributo_damage:ContainerRefreshDps (conteudo, combat_time)
else
--> pega o total ja aplicado na tabela do combate
total = tabela_do_combate.totals [class_type]
end
amount = Details:ContainerSort (conteudo, amount, keyName)
--> grava o total
instancia.top = conteudo[1][keyName]
elseif (modo == modo_GROUP) then --> mostrando GROUP
--> organiza as tabelas
if (Details.in_combat and instancia.segmento == 0 and not exportar) then
using_cache = true
end
if (using_cache) then
conteudo = Details.cache_damage_group
if (sub_atributo == 2) then --> dps
local combat_time = instancia.showing:GetCombatTime()
atributo_damage:ContainerRefreshDps (conteudo, combat_time)
end
if (#conteudo < 1) then
if (Details.debug and false) then
Details.showing_ActorTable_Timer2 = Details.showing_ActorTable_Timer2 or 0
if (time() > Details.showing_ActorTable_Timer2) then
Details:Msg ("(debug) nothing to show -> #conteudo < 1 (using cache)")
Details.showing_ActorTable_Timer2 = time()+5
end
end
return Details:EsconderBarrasNaoUsadas (instancia, showing), "", 0, 0
end
_table_sort (conteudo, Details.SortKeySimple)
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 --> dps
local combat_time = instancia.showing:GetCombatTime()
atributo_damage:ContainerRefreshDps (conteudo, combat_time)
end
_table_sort (conteudo, Details.SortKeyGroup)
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
end
total = total + player[keyName]
else
amount = index-1
break
end
end
instancia.top = conteudo[1] and conteudo[1][keyName]
end
end
end
--> refaz o mapa do container
if (not using_cache) then
showing:remapear()
end
if (exportar) then
return total, keyName, instancia.top, amount
end
if (amount < 1) then --> no h barras para mostrar
if (forcar) then
if (instancia.modo == 2) then --> group
for i = 1, instancia.rows_fit_in_window do
Details.FadeHandler.Fader (instancia.barras [i], "in", Details.fade_speed)
end
end
end
instancia:EsconderScrollBar() --> precisaria esconder a scroll bar
if (Details.debug and false) then
Details.showing_ActorTable_Timer2 = Details.showing_ActorTable_Timer2 or 0
if (time() > Details.showing_ActorTable_Timer2) then
Details:Msg ("(debug) nothing to show -> amount < 1")
Details.showing_ActorTable_Timer2 = time()+5
end
end
return Details:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh
end
instancia:RefreshScrollBar (amount)
local whichRowLine = 1
local lineContainer = instancia.barras
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 = Details.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 and sub_atributo ~= 6
if (following) then
if (using_cache) then
local pname = Details.playername
for i, actor in _ipairs (conteudo) do
if (actor.nome == pname) then
myPos = i
break
end
end
else
myPos = showing._NameIndexTable [Details.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
if (sub_atributo > 4) then --enemies, frags, void zones
use_total_bar = false
end
end
if (sub_atributo == 2) then --> dps
instancia.player_top_dps = conteudo [1].last_dps
instancia.player_top_dps_threshold = instancia.player_top_dps - (instancia.player_top_dps * 0.65)
end
local totalBarIsShown
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 = lineContainer [1]
row1.minha_tabela = nil
row1.lineText1:SetText (Loc ["STRING_TOTAL"])
if (instancia.use_multi_fontstrings) then
row1.lineText2:SetText("")
row1.lineText3:SetText(Details:ToK2 (total))
row1.lineText4:SetText(Details:ToK (total / combat_time))
else
row1.lineText4:SetText(Details:ToK2 (total) .. " (" .. Details: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")
totalBarIsShown = true
if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then
for i = instancia.barraS[1], iter_last-1, 1 do
if (conteudo[i]) then
conteudo[i]:RefreshLine (instancia, lineContainer, 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, lineContainer, 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
if (conteudo[i]) then
conteudo[i]:RefreshLine (instancia, lineContainer, 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
if (conteudo[i]) then
conteudo[i]:RefreshLine (instancia, lineContainer, 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, lineContainer, 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
if (conteudo[i]) then
conteudo[i]:RefreshLine (instancia, lineContainer, 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 = lineContainer [1]
row1.minha_tabela = nil
row1.lineText1:SetText (Loc ["STRING_TOTAL"])
if (instancia.use_multi_fontstrings) then
row1.lineText2:SetText("")
row1.lineText3:SetText(Details:ToK2 (total))
row1.lineText4:SetText(Details:ToK (total / combat_time))
else
row1.lineText4:SetText(Details:ToK2 (total) .. " (" .. Details: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")
totalBarIsShown = true
if (following and myPos and myPos > instancia.rows_fit_in_window and instancia.barraS[2] < myPos) then
conteudo[myPos]:RefreshLine (instancia, lineContainer, 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
if (conteudo[i]) then
conteudo[i]:RefreshLine (instancia, lineContainer, 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
if (conteudo[i]) then
conteudo[i]:RefreshLine (instancia, lineContainer, 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, lineContainer, 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
if (conteudo[i]) then
conteudo[i]:RefreshLine (instancia, lineContainer, 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
-- /run print (Details:GetInstance(1).barraS[2]) -- vai do 5 ao 1 -- qual barra comea no 1 -- i = 5 at 1 -- player 5 atualiza na barra 1 / player 1 atualiza na barra 5
for i = instancia.barraS[2], instancia.barraS[1], -1 do
if (conteudo[i]) then
conteudo[i]:RefreshLine (instancia, lineContainer, 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 (totalBarIsShown) then
instancia:RefreshScrollBar(amount + 1)
else
instancia:RefreshScrollBar(amount)
end
if (use_animations) then
instancia:PerformAnimations(whichRowLine - 1)
end
--> beta, hidar barras no usadas durante um refresh forado
if (forcar) then
if (instancia.modo == 2) then --> group
for i = whichRowLine, instancia.rows_fit_in_window do
Details.FadeHandler.Fader (instancia.barras [i], "in", Details.fade_speed)
end
end
end
Details.LastFullDamageUpdate = Details._tempo
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
-- ~texts
function Details:SetTextsOnLine(thisLine, valueText, perSecondText, percentText)
--set defaults
valueText = valueText or ""
perSecondText = perSecondText or ""
percentText = percentText or ""
--parse information
if (percentText ~= "") then --has percent text
thisLine.lineText4:SetText(percentText)
if (perSecondText ~= "") then --has dps?
thisLine.lineText3:SetText(perSecondText) --set dps
thisLine.lineText2:SetText(valueText) --set amount
else
thisLine.lineText3:SetText(valueText) --set amount
thisLine.lineText2:SetText("") --clear
end
else --no percent text
if (perSecondText ~= "") then --has dps and no percent
thisLine.lineText4:SetText(perSecondText) --set dps
thisLine.lineText3:SetText(valueText) --set amount
thisLine.lineText2:SetText("") --clear
else --no dps and not percent
thisLine.lineText4:SetText(valueText) --set dps
thisLine.lineText3:SetText("") --clear
thisLine.lineText2:SetText("") --clear
end
end
end
-- ~atualizar ~barra ~update
function atributo_damage:RefreshLine (instance, lineContainer, whichRowLine, rank, total, sub_atributo, forcar, keyName, combat_time, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator)
local thisLine = lineContainer [whichRowLine]
if (not thisLine) then
print ("DEBUG: problema com <instance.thisLine> "..whichRowLine.." "..rank)
return
end
local previousData = thisLine.minha_tabela
thisLine.minha_tabela = self --store references
self.minha_barra = thisLine --store references
thisLine.colocacao = rank
self.colocacao = rank
local damage_total = self.total --total damage of this actor
local dps
local porcentagem
local esta_porcentagem
--calc the percent amount base on the percent type
if (percentage_type == 1) then
porcentagem = _cstr ("%.1f", self [keyName] / total * 100)
elseif (percentage_type == 2) then
porcentagem = _cstr ("%.1f", self [keyName] / instance.top * 100)
end
--> calculate the actor dps
if ( (Details.time_type == 2 and self.grupo) or not Details:CaptureGet ("damage") or instance.segmento == -1) then
if (instance.segmento == -1 and combat_time == 0) then
local p = Details.tabela_vigente (1, self.nome)
if (p) then
local t = p:Tempo()
dps = damage_total / t
self.last_dps = dps
else
dps = damage_total / combat_time
self.last_dps = dps
end
else
dps = damage_total / combat_time
self.last_dps = dps
end
else
if (not self.on_hold) then
dps = damage_total/self:Tempo() --calcula o dps deste objeto
self.last_dps = dps --salva o dps dele
else
if (self.last_dps == 0) then --> no calculou o dps dele ainda mas entrou em standby
dps = damage_total/self:Tempo()
self.last_dps = dps
else
dps = self.last_dps
end
end
end
--right text
if (sub_atributo == 1) then --damage done
dps = _math_floor (dps)
local formated_damage = SelectedToKFunction (_, damage_total)
local formated_dps = SelectedToKFunction (_, dps)
thisLine.ps_text = formated_dps
if (not bars_show_data [1]) then
formated_damage = ""
end
if (not bars_show_data [2]) then
formated_dps = ""
end
if (not bars_show_data [3]) then
porcentagem = ""
else
porcentagem = porcentagem .. "%"
end
local rightText = formated_damage .. bars_brackets[1] .. formated_dps .. bars_separator .. porcentagem .. bars_brackets[2]
if (UsingCustomRightText) then
thisLine.lineText4:SetText(_string_replace (instance.row_info.textR_custom_text, formated_damage, formated_dps, porcentagem, self, instance.showing, instance, rightText))
else
if (instance.use_multi_fontstrings) then
Details:SetTextsOnLine(thisLine, formated_damage, formated_dps, porcentagem)
else
thisLine.lineText4:SetText(rightText)
end
end
esta_porcentagem = _math_floor ((damage_total/instance.top) * 100)
elseif (sub_atributo == 2) then --dps
local raw_dps = dps
dps = _math_floor (dps)
local formated_damage = SelectedToKFunction (_, damage_total)
local formated_dps = SelectedToKFunction (_, dps)
thisLine.ps_text = formated_dps
local diff_from_topdps
if (rank > 1) then
diff_from_topdps = instance.player_top_dps - raw_dps
end
local rightText
if (diff_from_topdps) then
local threshold = diff_from_topdps / instance.player_top_dps_threshold * 100
if (threshold < 100) then
threshold = _math_abs (threshold - 100)
else
threshold = 5
end
local rr, gg, bb = Details:percent_color ( threshold )
rr, gg, bb = Details:hex (_math_floor (rr*255)), Details:hex (_math_floor (gg*255)), "28"
local color_percent = "" .. rr .. gg .. bb .. ""
if (not bars_show_data [1]) then
formated_dps = ""
end
if (not bars_show_data [2]) then
color_percent = ""
else
color_percent = bars_brackets[1] .. "|cFFFF4444-|r|cFF" .. color_percent .. SelectedToKFunction (_, _math_floor (diff_from_topdps)) .. "|r" .. bars_brackets[2]
end
rightText = formated_dps .. color_percent
else
local icon = " |TInterface\\GROUPFRAME\\UI-Group-LeaderIcon:14:14:0:0:16:16:0:16:0:16|t "
if (not bars_show_data [1]) then
formated_dps = ""
end
if (not bars_show_data [2]) then
icon = ""
end
rightText = formated_dps .. icon
end
if (UsingCustomRightText) then
thisLine.lineText4:SetText (_string_replace (instance.row_info.textR_custom_text, formated_dps, formated_damage, porcentagem, self, instance.showing, instance, rightText))
else
if (instance.use_multi_fontstrings) then
Details:SetTextsOnLine(thisLine, formated_damage, formated_dps, porcentagem)
else
thisLine.lineText4:SetText(rightText)
end
end
esta_porcentagem = _math_floor ((dps/instance.top) * 100)
elseif (sub_atributo == 3) then --damage taken
local dtps = self.damage_taken / combat_time
local formated_damage_taken = SelectedToKFunction (_, self.damage_taken)
local formated_dtps = SelectedToKFunction (_, dtps)
thisLine.ps_text = formated_dtps
if (not bars_show_data [1]) then
formated_damage_taken = ""
end
if (not bars_show_data [2]) then
formated_dtps = ""
end
if (not bars_show_data [3]) then
porcentagem = ""
else
porcentagem = porcentagem .. "%"
end
local rightText = formated_damage_taken .. bars_brackets[1] .. formated_dtps .. bars_separator .. porcentagem .. bars_brackets[2]
if (UsingCustomRightText) then
thisLine.lineText4:SetText (_string_replace (instance.row_info.textR_custom_text, formated_damage_taken, formated_dtps, porcentagem, self, instance.showing, instance, rightText))
else
if (instance.use_multi_fontstrings) then
Details:SetTextsOnLine(thisLine, formated_damage_taken, formated_dtps, porcentagem)
else
thisLine.lineText4:SetText(rightText)
end
end
esta_porcentagem = _math_floor ((self.damage_taken/instance.top) * 100)
elseif (sub_atributo == 4) then --friendly fire
local formated_friendly_fire = SelectedToKFunction (_, self.friendlyfire_total)
if (not bars_show_data [1]) then
formated_friendly_fire = ""
end
if (not bars_show_data [3]) then
porcentagem = ""
else
porcentagem = porcentagem .. "%"
end
local rightText = formated_friendly_fire .. bars_brackets[1] .. porcentagem .. bars_brackets[2]
if (UsingCustomRightText) then
thisLine.lineText4:SetText (_string_replace (instance.row_info.textR_custom_text, formated_friendly_fire, "", porcentagem, self, instance.showing, instance, rightText))
else
if (instance.use_multi_fontstrings) then
Details:SetTextsOnLine(thisLine, "", formated_friendly_fire, porcentagem)
else
thisLine.lineText4:SetText(rightText)
end
end
esta_porcentagem = _math_floor ((self.friendlyfire_total/instance.top) * 100)
elseif (sub_atributo == 6) then --enemies
local dtps = self.damage_taken / combat_time
local formated_damage_taken = SelectedToKFunction (_, self.damage_taken)
local formated_dtps = SelectedToKFunction (_, dtps)
thisLine.ps_text = formated_dtps
if (not bars_show_data [1]) then
formated_damage_taken = ""
end
if (not bars_show_data [2]) then
formated_dtps = ""
end
if (not bars_show_data [3]) then
porcentagem = ""
else
porcentagem = porcentagem .. "%"
end
local rightText = formated_damage_taken .. bars_brackets[1] .. formated_dtps .. bars_separator .. porcentagem .. bars_brackets[2]
if (UsingCustomRightText) then
thisLine.lineText4:SetText (_string_replace (instance.row_info.textR_custom_text, formated_damage_taken, formated_dtps, porcentagem, self, instance.showing, instance, rightText))
else
if (instance.use_multi_fontstrings) then
Details:SetTextsOnLine(thisLine, formated_damage_taken, formated_dtps, porcentagem)
else
thisLine.lineText4:SetText(rightText)
end
end
esta_porcentagem = _math_floor ((self.damage_taken/instance.top) * 100)
end
--need tooltip update?
if (thisLine.mouse_over and not instance.baseframe.isMoving) then
gump:UpdateTooltip (whichRowLine, thisLine, instance)
end
if (self.need_refresh) then
self.need_refresh = false
forcar = true
end
actor_class_color_r, actor_class_color_g, actor_class_color_b = self:GetBarColor()
return self:RefreshLineValue(thisLine, instance, previousData, forcar, esta_porcentagem, whichRowLine, lineContainer, use_animations)
end
--[[ exported]] function Details:RefreshLineValue(thisLine, instance, previousData, forcar, esta_porcentagem, whichRowLine, lineContainer, use_animations)
--> primeiro colocado
if (thisLine.colocacao == 1) then
--aqui
thisLine.animacao_ignorar = true
if (not previousData or previousData ~= 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, instance)
else
return
end
else
if (thisLine.hidden or thisLine.fading_in or thisLine.faded) then
--> setando o valor mesmo com animaes pq o barra esta hidada com o value do ltimo actor que ela mostrou
if (use_animations) then
thisLine.animacao_fim = esta_porcentagem
thisLine:SetValue (esta_porcentagem)
else
thisLine:SetValue (esta_porcentagem)
thisLine.animacao_ignorar = true
end
Details.FadeHandler.Fader (thisLine, "out")
return self:RefreshBarra (thisLine, instance)
else
--> agora esta comparando se a tabela da barra diferente da tabela na atualizao anterior
if (not previousData or previousData ~= thisLine.minha_tabela or forcar) then --> aqui diz se a barra do jogador mudou de posio ou se ela apenas ser atualizada
if (use_animations) then
thisLine.animacao_fim = esta_porcentagem
else
thisLine:SetValue (esta_porcentagem)
thisLine.animacao_ignorar = true
end
thisLine.last_value = esta_porcentagem --> reseta o ultimo valor da barra
return self:RefreshBarra (thisLine, instance)
elseif (esta_porcentagem ~= thisLine.last_value) then --> continua mostrando a mesma tabela ento compara a porcentagem
--> apenas atualizar
if (use_animations) then
thisLine.animacao_fim = esta_porcentagem
else
thisLine:SetValue (esta_porcentagem)
end
thisLine.last_value = esta_porcentagem
return self:RefreshBarra (thisLine, instance)
end
end
end
end
local set_text_size = function (bar, instance)
if (instance.bars_inverted) then
bar.lineText4:SetSize (instance.cached_bar_width - bar.lineText1:GetStringWidth() - 20, 15)
else
bar.lineText1:SetSize (instance.cached_bar_width - bar.lineText4:GetStringWidth() - 20, 15)
end
end
--> this is the in bar icon (icon inside the player bar, like faction or role icon) padding, icon has the row height as is width and height - padding
local InBarIconPadding = 6
--[[ exported]] function Details:SetBarLeftText (bar, instance, enemy, arena_enemy, arena_ally, UsingCustomLeftText)
local bar_number = ""
if (instance.row_info.textL_show_number) then
bar_number = bar.colocacao .. ". "
end
--translate cyrillic alphabet to western alphabet by Vardex (https://github.com/Vardex May 22, 2019)
if (instance.row_info.textL_translit_text) then
self.displayName = Translit:Transliterate(self.displayName, "!")
end
if (enemy) then
if (arena_enemy) then
if (Details.show_arena_role_icon) then
--> show arena role icon
local leftText = bar_number .. "|TInterface\\LFGFRAME\\UI-LFG-ICON-ROLES:" .. (instance.row_info.height - InBarIconPadding)..":"..(instance.row_info.height - InBarIconPadding) .. ":0:0:256:256:" .. Details.role_texcoord [self.role or "NONE"] .. "|t " .. self.displayName
if (UsingCustomLeftText) then
bar.lineText1:SetText (_string_replace (instance.row_info.textL_custom_text, bar.colocacao, self.displayName, "|TInterface\\LFGFRAME\\UI-LFG-ICON-ROLES:" .. (instance.row_info.height - InBarIconPadding)..":"..(instance.row_info.height - InBarIconPadding) .. ":0:0:256:256:" .. Details.role_texcoord [self.role or "NONE"] .. "|t ", self, instance.showing, instance, leftText))
else
bar.lineText1:SetText (leftText)
end
else
--don't show arena role icon
local leftText = bar_number .. self.displayName
if (UsingCustomLeftText) then
bar.lineText1:SetText (_string_replace (instance.row_info.textL_custom_text, bar.colocacao, self.displayName, " ", self, instance.showing, instance, leftText))
else
bar.lineText1:SetText (leftText)
end
end
else
if (Details.faction_against == "Horde") then
local leftText = bar_number .. "|TInterface\\AddOns\\Details\\images\\icones_barra:" .. (instance.row_info.height - InBarIconPadding)..":"..(instance.row_info.height - InBarIconPadding) .. ":0:0:256:32:0:32:0:32|t"..self.displayName
if (UsingCustomLeftText) then
bar.lineText1:SetText (_string_replace (instance.row_info.textL_custom_text, bar.colocacao, self.displayName, "|TInterface\\AddOns\\Details\\images\\icones_barra:" .. (instance.row_info.height - InBarIconPadding)..":"..(instance.row_info.height - InBarIconPadding) .. ":0:0:256:32:0:32:0:32|t", self, instance.showing, instance, leftText))
else
bar.lineText1:SetText (leftText) --seta o texto da esqueda -- HORDA
end
else --alliance
local leftText = bar_number .. "|TInterface\\AddOns\\Details\\images\\icones_barra:" .. (instance.row_info.height - InBarIconPadding)..":"..(instance.row_info.height - InBarIconPadding) .. ":0:0:256:32:32:64:0:32|t"..self.displayName
if (UsingCustomLeftText) then
bar.lineText1:SetText (_string_replace (instance.row_info.textL_custom_text, bar.colocacao, self.displayName, "|TInterface\\AddOns\\Details\\images\\icones_barra:" .. (instance.row_info.height - InBarIconPadding)..":"..(instance.row_info.height - InBarIconPadding) .. ":0:0:256:32:32:64:0:32|t", self, instance.showing, instance, leftText))
else
bar.lineText1:SetText (leftText) --seta o texto da esqueda -- ALLY
end
end
end
else
if (arena_ally and Details.show_arena_role_icon) then
local leftText = bar_number .. "|TInterface\\LFGFRAME\\UI-LFG-ICON-ROLES:" .. (instance.row_info.height - InBarIconPadding)..":"..(instance.row_info.height - InBarIconPadding) .. ":0:0:256:256:" .. Details.role_texcoord [self.role or "NONE"] .. "|t " .. self.displayName
if (UsingCustomLeftText) then
bar.lineText1:SetText (_string_replace (instance.row_info.textL_custom_text, bar.colocacao, self.displayName, "|TInterface\\LFGFRAME\\UI-LFG-ICON-ROLES:" .. (instance.row_info.height - InBarIconPadding)..":"..(instance.row_info.height - InBarIconPadding) .. ":0:0:256:256:" .. Details.role_texcoord [self.role or "NONE"] .. "|t ", self, instance.showing, instance, leftText))
else
bar.lineText1:SetText (leftText)
end
else
local leftText = bar_number .. self.displayName
if (UsingCustomLeftText) then
bar.lineText1:SetText (_string_replace (instance.row_info.textL_custom_text, bar.colocacao, self.displayName, "", self, instance.showing, instance, leftText))
else
bar.lineText1:SetText (leftText) --seta o texto da esqueda
end
end
end
set_text_size (bar, instance)
end
--[[ exported]] function Details:SetBarColors (bar, instance, r, g, b, a)
a = a or 1
if (instance.row_info.texture_class_colors) then
if (instance.bars_inverted) then
bar.right_to_left_texture:SetVertexColor (r, g, b, a)
else
bar.textura:SetVertexColor (r, g, b, a)
end
end
if (instance.row_info.texture_background_class_color) then
bar.background:SetVertexColor (r, g, b, a)
end
if (instance.row_info.textL_class_colors) then
bar.lineText1:SetTextColor (r, g, b, a)
end
if (instance.row_info.textR_class_colors) then
bar.lineText2:SetTextColor (r, g, b, a)
bar.lineText3:SetTextColor (r, g, b, a)
bar.lineText4:SetTextColor (r, g, b, a)
end
end
--[[ exported]] function Details:SetClassIcon (texture, instance, classe) --self is the actorObject
local customIcon
if (Details.immersion_unit_special_icons) then
customIcon = Details.Immersion.GetIcon(self.aID)
end
if (customIcon) then
texture:SetTexture(customIcon[1])
texture:SetTexCoord(unpack(customIcon[2]))
texture:SetVertexColor(1, 1, 1)
elseif (self.spellicon) then
texture:SetTexture (self.spellicon)
texture:SetTexCoord (0.078125, 0.921875, 0.078125, 0.921875)
elseif (classe == "UNKNOW") then
texture:SetTexture ([[Interface\AddOns\Details\images\classes_plus]])
texture:SetTexCoord (0.50390625, 0.62890625, 0, 0.125)
texture:SetVertexColor (1, 1, 1)
elseif (classe == "UNGROUPPLAYER") then
if (self.enemy) then
if (Details.faction_against == "Horde") then
texture:SetTexture ("Interface\\ICONS\\Achievement_Character_Troll_Male")
texture:SetTexCoord (0.05, 0.95, 0.05, 0.95)
else
texture:SetTexture ("Interface\\ICONS\\Achievement_Character_Nightelf_Female")
texture:SetTexCoord (0.05, 0.95, 0.05, 0.95)
end
else
if (Details.faction_against == "Horde") then
texture:SetTexture ("Interface\\ICONS\\Achievement_Character_Nightelf_Female")
texture:SetTexCoord (0.05, 0.95, 0.05, 0.95)
else
texture:SetTexture ("Interface\\ICONS\\Achievement_Character_Troll_Male")
texture:SetTexCoord (0.05, 0.95, 0.05, 0.95)
end
end
texture:SetVertexColor (1, 1, 1)
elseif (classe == "PET") then
texture:SetTexture(instance and instance.row_info.icon_file or [[Interface\AddOns\Details\images\classes_small]])
texture:SetTexCoord(0.25, 0.49609375, 0.75, 1)
texture:SetVertexColor(actor_class_color_r, actor_class_color_g, actor_class_color_b)
else
if (instance and instance.row_info.use_spec_icons) then
if (self.spec and Details.class_specs_coords[self.spec]) then
texture:SetTexture(instance.row_info.spec_file)
texture:SetTexCoord(_unpack (Details.class_specs_coords[self.spec]))
texture:SetVertexColor(1, 1, 1)
else
--if (self.spec and not Details.class_specs_coords[self.spec]) then
-- print("|cFFFFAA00Details!|r error 0x8525, report on discord", self.spec, self.classe)
--end
texture:SetTexture(instance.row_info.icon_file or [[Interface\AddOns\Details\images\classes_small]])
texture:SetTexCoord(_unpack (Details.class_coords[classe]))
texture:SetVertexColor(1, 1, 1)
end
else
texture:SetTexture(instance and instance.row_info.icon_file or [[Interface\AddOns\Details\images\classes_small]])
texture:SetTexCoord(_unpack (Details.class_coords[classe]))
texture:SetVertexColor(1, 1, 1)
end
end
end
--endd elsefi
--[[ exported]] function Details:RefreshBarra (thisLine, instance, from_resize)
local class, enemy, arena_enemy, arena_ally = self.classe, self.enemy, self.arena_enemy, self.arena_ally
if (not class) then
Details:Msg ("Warning, actor without a class:", self.nome, self.flag_original, self.serial)
self.classe = "UNKNOW"
class = "UNKNOW"
end
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, instance, class)
--> texture color
self:SetBarColors (thisLine, instance, actor_class_color_r, actor_class_color_g, actor_class_color_b)
--> left text
self:SetBarLeftText (thisLine, instance, enemy, arena_enemy, arena_ally, UsingCustomLeftText)
end
--------------------------------------------- // TOOLTIPS // ---------------------------------------------
---------> TOOLTIPS BIFURCAO
-- ~tooltip
function atributo_damage:ToolTip (instance, numero, barra, keydown)
--> seria possivel aqui colocar o icone da classe dele?
if (instance.atributo == 5) then --> custom
return self:TooltipForCustom (barra)
else
if (instance.sub_atributo == 1 or instance.sub_atributo == 2) then --> damage done or Dps or enemy
return self:ToolTip_DamageDone (instance, numero, barra, keydown)
elseif (instance.sub_atributo == 3) then --> damage taken
return self:ToolTip_DamageTaken (instance, numero, barra, keydown)
elseif (instance.sub_atributo == 6) then --> enemies
return self:ToolTip_Enemies (instance, numero, barra, keydown)
elseif (instance.sub_atributo == 4) then --> friendly fire
return self:ToolTip_FriendlyFire (instance, numero, barra, keydown)
end
end
end
--> tooltip locals
local r, g, b
local barAlha = .6
---------> DAMAGE DONE & DPS
function atributo_damage:ToolTip_DamageDone (instancia, numero, barra, keydown)
local owner = self.owner
if (owner and owner.classe) then
r, g, b = unpack (Details.class_colors [owner.classe])
else
if (not Details.class_colors [self.classe]) then
return print ("Details!: error class not found:", self.classe, "for", self.nome)
end
r, g, b = unpack (Details.class_colors [self.classe])
end
--> habilidades
local icon_size = Details.tooltip.icon_size
local icon_border = Details.tooltip.icon_border_texcoord
do
--> TOP HABILIDADES
--get variables
--local ActorDamage = self.total_without_pet --mostrando os pets no tooltip
local ActorDamage = self.total
local ActorDamageWithPet = self.total
if (ActorDamage == 0) then
ActorDamage = 0.00000001
end
local ActorSkillsContainer = self.spells._ActorTable
local ActorSkillsSortTable = {}
local reflectionSpells = {}
--get time type
local meu_tempo
if (Details.time_type == 1 or not self.grupo) then
meu_tempo = self:Tempo()
elseif (Details.time_type == 2) then
meu_tempo = instancia.showing:GetCombatTime()
end
--add actor spells
for _spellid, _skill in _pairs (ActorSkillsContainer) do
ActorSkillsSortTable [#ActorSkillsSortTable+1] = {_spellid, _skill.total, _skill.total/meu_tempo}
if (_skill.isReflection) then
reflectionSpells[#reflectionSpells+1] = _skill
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
ActorSkillsSortTable [#ActorSkillsSortTable+1] = {_spellid, _skill.total, _skill.total/meu_tempo, petName:gsub ((" <.*"), "")}
end
end
end
--sort
_table_sort (ActorSkillsSortTable, Details.Sort2)
--> TOP INIMIGOS
--get variables
local ActorTargetsSortTable = {}
--add
for target_name, amount in _pairs (self.targets) do
ActorTargetsSortTable [#ActorTargetsSortTable+1] = {target_name, amount}
end
--sort
_table_sort (ActorTargetsSortTable, Details.Sort2)
--tooltip stuff
local tooltip_max_abilities = Details.tooltip.tooltip_max_abilities
local is_maximized = false
if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3) then
tooltip_max_abilities = 99
is_maximized = true
end
--> MOSTRA HABILIDADES
Details:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #ActorSkillsSortTable, Details.tooltip_spell_icon.file, unpack (Details.tooltip_spell_icon.coords))
if (is_maximized) then
--highlight shift key
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2)
Details:AddTooltipHeaderStatusbar (r, g, b, 1)
else
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay1)
Details:AddTooltipHeaderStatusbar (r, g, b, barAlha)
end
local topAbility = ActorSkillsSortTable [1] and ActorSkillsSortTable [1][2] or 0.0001
if (#ActorSkillsSortTable > 0) then
for i = 1, _math_min (tooltip_max_abilities, #ActorSkillsSortTable) do
local SkillTable = ActorSkillsSortTable [i]
local spellID = SkillTable [1]
local totalDamage = SkillTable [2]
local totalDPS = SkillTable [3]
local petName = SkillTable [4]
local nome_magia, _, icone_magia = _GetSpellInfo (spellID)
if (petName) then
if (not nome_magia) then
spellID = spellID or "spellId?"
nome_magia = "|cffffaa00" .. spellID .. " " .. " (|cFFCCBBBB" .. petName .. "|r)"
else
nome_magia = nome_magia .. " (|cFFCCBBBB" .. petName .. "|r)"
end
end
local percent = _cstr("%.1f", totalDamage/ActorDamage*100)
if (string.len(percent) < 4) then
percent = percent .. "0"
end
if (instancia.sub_atributo == 1 or instancia.sub_atributo == 6) then
GameCooltip:AddLine (nome_magia, FormatTooltipNumber (_, totalDamage) .." ("..percent.."%)")
else
GameCooltip:AddLine (nome_magia, FormatTooltipNumber (_, _math_floor (totalDPS)) .." ("..percent.."%)")
end
GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W + 4, icon_size.H + 4, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
Details:AddTooltipBackgroundStatusbar (false, totalDamage/topAbility*100)
end
else
GameCooltip:AddLine (Loc ["STRING_NO_SPELL"])
end
--> spell reflected
if (#reflectionSpells > 0) then
--small blank space
Details:AddTooltipSpellHeaderText ("", headerColor, 1, false, 0.1, 0.9, 0.1, 0.9, true) --add a space
Details:AddTooltipSpellHeaderText ("Spells Reflected", headerColor, 1, select(3, _GetSpellInfo(reflectionSpells[1].id)), 0.1, 0.9, 0.1, 0.9) --localize-me
Details:AddTooltipHeaderStatusbar (r, g, b, barAlha)
for i = 1, #reflectionSpells do
local _spell = reflectionSpells[i]
local extraInfo = _spell.extra
for spellId, damageDone in pairs(extraInfo) do
local spellName, _, spellIcon = _GetSpellInfo(spellId)
if (spellName) then
GameCooltip:AddLine (spellName, FormatTooltipNumber (_, damageDone) .. " (" .. _math_floor (damageDone / self.total * 100) .. "%)")
Details:AddTooltipBackgroundStatusbar (false, damageDone / self.total * 100)
GameCooltip:AddIcon (spellIcon, 1, 1, icon_size.W, icon_size.H, 0.1, 0.9, 0.1, 0.9)
end
end
end
end
--> MOSTRA INIMIGOS
local topEnemy = ActorTargetsSortTable [1] and ActorTargetsSortTable [1][2] or 0
if (instancia.sub_atributo == 1 or instancia.sub_atributo == 6) then
--small blank space
Details:AddTooltipSpellHeaderText ("", headerColor, 1, false, 0.1, 0.9, 0.1, 0.9, true)
Details:AddTooltipSpellHeaderText (Loc ["STRING_TARGETS"], headerColor, #ActorTargetsSortTable, [[Interface\Addons\Details\images\icons]], 0, 0.03125, 0.126953125, 0.15625)
local max_targets = Details.tooltip.tooltip_max_targets
local is_maximized = false
if (keydown == "ctrl" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 4) then
max_targets = 99
is_maximized = true
end
if (is_maximized) then
--highlight
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2)
Details:AddTooltipHeaderStatusbar (r, g, b, 1)
else
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay1)
Details:AddTooltipHeaderStatusbar (r, g, b, barAlha)
end
for i = 1, _math_min (max_targets, #ActorTargetsSortTable) do
local este_inimigo = ActorTargetsSortTable [i]
GameCooltip:AddLine (este_inimigo[1], FormatTooltipNumber (_, este_inimigo[2]) .." (".._cstr("%.1f", este_inimigo[2]/ActorDamageWithPet*100).."%)")
GameCooltip:AddIcon ([[Interface\PetBattles\PetBattle-StatIcons]], nil, nil, icon_size.W, icon_size.H, 0, 0.5, 0, 0.5, {.7, .7, .7, 1}, nil, true)
Details:AddTooltipBackgroundStatusbar (false, este_inimigo[2] / topEnemy * 100)
end
end
end
--> PETS
local meus_pets = self.pets
if (#meus_pets > 0) then --> teve ajudantes
local quantidade = {} --> armazena a quantidade de pets iguais
local danos = {} --> armazena as habilidades
local alvos = {} --> armazena os alvos
local totais = {} --> armazena o dano total de cada objeto
--small blank space
Details:AddTooltipSpellHeaderText ("", headerColor, 1, false, 0.1, 0.9, 0.1, 0.9, true)
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_total = my_self.total_without_pet
local tabela = my_self.spells._ActorTable
local meus_danos = {}
--totais [nome] = my_self.total_without_pet
local meu_tempo
if (Details.time_type == 1 or not self.grupo) then
meu_tempo = my_self:Tempo()
elseif (Details.time_type == 2) then
meu_tempo = my_self:GetCombatTime()
end
totais [#totais+1] = {nome, my_self.total_without_pet, my_self.total_without_pet/meu_tempo}
for spellid, tabela in _pairs (tabela) do
local nome, rank, icone = _GetSpellInfo (spellid)
_table_insert (meus_danos, {spellid, tabela.total, tabela.total/meu_total*100, {nome, rank, icone}})
end
_table_sort (meus_danos, Details.Sort2)
danos [nome] = meus_danos
local meus_inimigos = {}
tabela = my_self.targets
for target_name, amount in _pairs (tabela) do
_table_insert (meus_inimigos, {target_name, amount, amount/meu_total*100})
end
_table_sort (meus_inimigos,Details.Sort2)
alvos [nome] = meus_inimigos
end
else
quantidade [nome] = quantidade [nome]+1
end
end
--GameTooltip:AddLine (" ")
--GameCooltip:AddLine (" ")
local _quantidade = 0
local added_logo = false
_table_sort (totais, Details.Sort2)
local ismaximized = false
if (keydown == "alt" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 5) then
ismaximized = true
end
local topPet = totais [1] and totais [1][2] or 0
for index, _table in _ipairs (totais) do
if (_table [2] > 0 and (index <= Details.tooltip.tooltip_max_pets or ismaximized)) then
if (not added_logo) then
added_logo = true
Details: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, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2)
Details:AddTooltipHeaderStatusbar (r, g, b, 1)
else
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_alt]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay1)
Details:AddTooltipHeaderStatusbar (r, g, b, barAlha)
end
end
local n = _table [1]:gsub (("%s%<.*"), "")
if (instancia.sub_atributo == 1) then
GameCooltip:AddLine (n, FormatTooltipNumber (_, _table [2]) .. " (" .. _math_floor (_table [2]/self.total*100) .. "%)")
else
GameCooltip:AddLine (n, FormatTooltipNumber (_, _math_floor (_table [3])) .. " (" .. _math_floor (_table [2]/self.total*100) .. "%)")
end
Details:AddTooltipBackgroundStatusbar (false, _table [2] / topPet * 100)
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
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
--small blank space
Details:AddTooltipSpellHeaderText ("", headerColor, 1, false, 0.1, 0.9, 0.1, 0.9, true)
Details:AddTooltipSpellHeaderText ("Damage by Encounter Phase", headerColor, 1, [[Interface\Garrison\orderhall-missions-mechanic8]], 11/64, 53/64, 11/64, 53/64) --localize-me
Details:AddTooltipHeaderStatusbar (r, g, b, barAlha)
local playerPhases = {}
local totalDamage = 0
for phase, playersTable in pairs (phasesInfo.damage) 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)
Details:AddTooltipBackgroundStatusbar()
end
end
end
end
return true
end
local on_switch_show_enemies = function (instance)
instance:TrocaTabela (instance, true, 1, 6)
return true
end
local on_switch_show_frags = function (instance)
instance:TrocaTabela (instance, true, 1, 5)
return true
end
local ENEMIES_format_name = function (player) if (player == 0) then return false end return Details:GetOnlyName (player.nome) end
local ENEMIES_format_amount = function (amount) if (amount <= 0) then return false end return Details:ToK (amount) .. " (" .. _cstr ("%.1f", amount / tooltip_temp_table.damage_total * 100) .. "%)" end
function atributo_damage:ReportEnemyDamageTaken (actor, instance, ShiftKeyDown, ControlKeyDown, fromFrags)
if (ShiftKeyDown) then
local inimigo = actor.nome
local custom_name = inimigo .. " -" .. Loc ["STRING_CUSTOM_ENEMY_DT"]
--> procura se j tem um custom:
for index, CustomObject in _ipairs (Details.custom) do
if (CustomObject:GetName() == custom_name) then
--> fix for not saving funcs on logout
if (not CustomObject.OnSwitchShow) then
CustomObject.OnSwitchShow = fromFrags and on_switch_show_frags or on_switch_show_enemies
end
return instance:TrocaTabela (instance.segmento, 5, index)
end
end
--> criar um custom para este actor.
local new_custom_object = {
name = custom_name,
icon = [[Interface\ICONS\Pet_Type_Undead]],
attribute = "damagedone",
author = Details.playername,
desc = inimigo .. " Damage Taken",
source = "[raid]",
target = inimigo,
script = false,
tooltip = false,
temp = true,
OnSwitchShow = fromFrags and on_switch_show_frags or on_switch_show_enemies,
}
tinsert (Details.custom, new_custom_object)
setmetatable (new_custom_object, Details.atributo_custom)
new_custom_object.__index = Details.atributo_custom
return instance:TrocaTabela (instance.segmento, 5, #Details.custom)
end
local report_table = {"Details!: " .. actor.nome .. " - " .. Loc ["STRING_ATTRIBUTE_DAMAGE_TAKEN"]}
Details:FormatReportLines (report_table, tooltip_temp_table, ENEMIES_format_name, ENEMIES_format_amount)
return Details:Reportar (report_table, {_no_current = true, _no_inverse = true, _custom = true})
end
local FRAGS_format_name = function (player_name) return Details:GetOnlyName (player_name) end
local FRAGS_format_amount = function (amount) return Details:ToK (amount) .. " (" .. _cstr ("%.1f", amount / frags_tooltip_table.damage_total * 100) .. "%)" end
function atributo_damage:ReportSingleFragsLine (frag, instance, ShiftKeyDown, ControlKeyDown)
if (ShiftKeyDown) then
return atributo_damage:ReportEnemyDamageTaken (frag, instance, ShiftKeyDown, ControlKeyDown, true)
end
local report_table = {"Details!: " .. frag [1] .. " - " .. Loc ["STRING_ATTRIBUTE_DAMAGE_TAKEN"]}
Details:FormatReportLines (report_table, frags_tooltip_table, FRAGS_format_name, FRAGS_format_amount)
return Details:Reportar (report_table, {_no_current = true, _no_inverse = true, _custom = true})
end
function atributo_damage:ToolTip_Enemies (instancia, numero, barra, keydown)
local owner = self.owner
if (owner and owner.classe) then
r, g, b = unpack (Details.class_colors [owner.classe])
else
r, g, b = unpack (Details.class_colors [self.classe])
end
local combat = instancia:GetShowingCombat()
local enemy_name = self:name()
--> enemy damage taken
local i = 1
local damage_taken = 0
for _, actor in _ipairs (combat[1]._ActorTable) do
if (actor.grupo and actor.targets [self.nome]) then
local t = tooltip_temp_table [i]
if (not t) then
tooltip_temp_table [i] = {}
t = tooltip_temp_table [i]
end
t [1] = actor
t [2] = actor.targets [enemy_name] or 0
damage_taken = damage_taken + t [2]
i = i + 1
end
end
for o = i, #tooltip_temp_table do
local t = tooltip_temp_table [o]
t[2] = 0
t[1] = 0
end
_table_sort (tooltip_temp_table, Details.Sort2)
-- enemy damage taken
Details:AddTooltipSpellHeaderText (Loc ["STRING_DAMAGE_TAKEN_FROM"], headerColor, i-1, [[Interface\Buttons\UI-MicroStream-Red]], 0.1875, 0.8125, 0.15625, 0.78125)
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2)
Details:AddTooltipHeaderStatusbar (1, 1, 1, 0.5)
--> build the tooltip
local top = (tooltip_temp_table [1] and tooltip_temp_table [1][2]) or 0
tooltip_temp_table.damage_total = damage_taken
local lineHeight = Details.tooltip.line_height
for o = 1, i-1 do
local player = tooltip_temp_table [o][1]
local total = tooltip_temp_table [o][2]
local player_name = Details:GetOnlyName (player:name())
GameCooltip:AddLine (player_name .. " ", FormatTooltipNumber (_, total) .." (" .. _cstr ("%.1f", (total / damage_taken) * 100) .. "%)")
local classe = player:class()
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 = player.spec
if (specID) then
local texture, l, r, t, b = Details:GetSpecIcon (specID, false)
GameCooltip:AddIcon (texture, 1, 1, lineHeight, lineHeight, l, r, t, b)
else
GameCooltip:AddIcon (instancia.row_info.icon_file, nil, nil, lineHeight, lineHeight, _unpack (Details.class_coords [classe]))
end
end
local r, g, b = unpack (Details.class_colors [classe])
GameCooltip:AddStatusBar (total/top*100, 1, r, g, b, 1, false, enemies_background)
end
GameCooltip:SetOption ("StatusBarTexture", "Interface\\AddOns\\Details\\images\\bar_serenity")
--> damage done and heal
GameCooltip:AddLine (" ")
GameCooltip:AddLine (Loc ["STRING_ATTRIBUTE_DAMAGE_ENEMIES_DONE"], FormatTooltipNumber (_, _math_floor (self.total)))
local half = 0.00048828125
GameCooltip:AddIcon (instancia:GetSkinTexture(), 1, 1, 14, 14, 0.005859375 + half, 0.025390625 - half, 0.3623046875, 0.3818359375)
GameCooltip:AddStatusBar (0, 1, r, g, b, 1, false, enemies_background)
local heal_actor = instancia.showing (2, self.nome)
if (heal_actor) then
GameCooltip:AddLine (Loc ["STRING_ATTRIBUTE_HEAL_ENEMY"], FormatTooltipNumber (_, _math_floor (heal_actor.heal_enemy_amt)))
else
GameCooltip:AddLine (Loc ["STRING_ATTRIBUTE_HEAL_ENEMY"], 0)
end
GameCooltip:AddIcon (instancia:GetSkinTexture(), 1, 1, 14, 14, 0.037109375 + half, 0.056640625 - half, 0.3623046875, 0.3818359375)
GameCooltip:AddStatusBar (0, 1, r, g, b, 1, false, enemies_background)
GameCooltip:AddLine (" ")
Details:AddTooltipReportLineText()
GameCooltip:SetOption ("YSpacingMod", 0)
return true
end
---------> DAMAGE TAKEN
function atributo_damage:ToolTip_DamageTaken (instancia, numero, barra, keydown)
local owner = self.owner
if (owner and owner.classe) then
r, g, b = unpack (Details.class_colors [owner.classe])
else
r, g, b = unpack (Details.class_colors [self.classe])
end
local agressores = self.damage_from
local damage_taken = self.damage_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_agressores = {}
if (instancia.sub_atributo == 6) then
for _, actor in _ipairs (showing._ActorTable) do
if (actor.grupo and actor.targets [self.nome]) then
meus_agressores [#meus_agressores+1] = {actor.nome, actor.targets [self.nome], actor.classe, actor}
end
end
else
--> aggressors
for nome, _ in _pairs (agressores) do --who damaged the player
--get the aggressor
local este_agressor = showing._ActorTable [showing._NameIndexTable [nome]]
if (este_agressor) then --> checagem por causa do total e do garbage collector que no limpa os nomes que deram dano
local name = nome
local table_added
local damage_amount = este_agressor.targets [self.nome]
if (damage_amount) then
if (este_agressor:IsPlayer() or este_agressor:IsNeutralOrEnemy()) then
table_added = {name, damage_amount, este_agressor.classe, este_agressor}
meus_agressores [#meus_agressores+1] = table_added
end
end
--special cases - Monk stagger
if (nome == self.nome and self.classe == "MONK") then
local ff = este_agressor.friendlyfire [nome]
if (ff and ff.total > 0) then
local staggerDamage = ff.spells [124255] or 0
if (staggerDamage > 0) then
if (table_added) then
table_added [2] = table_added [2] + staggerDamage
else
meus_agressores [#meus_agressores+1] = {name, staggerDamage, "MONK", este_agressor}
end
end
end
end
end
end
end
_table_sort (meus_agressores, Details.Sort2)
local max = #meus_agressores
if (max > 10) then
max = 10
end
local ismaximized = false
if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3 or instancia.sub_atributo == 6 or Details.damage_taken_everything) then
max = #meus_agressores
ismaximized = true
end
if (instancia.sub_atributo == 6) then
Details:AddTooltipSpellHeaderText (Loc ["STRING_DAMAGE_TAKEN_FROM"], headerColor, #meus_agressores, [[Interface\Buttons\UI-MicroStream-Red]], 0.1875, 0.8125, 0.15625, 0.78125)
else
Details:AddTooltipSpellHeaderText (Loc ["STRING_FROM"], headerColor, #meus_agressores, [[Interface\Addons\Details\images\icons]], 0.126953125, 0.1796875, 0, 0.0546875)
end
if (ismaximized) then
--highlight
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2)
if (instancia.sub_atributo == 6) then
GameCooltip:AddStatusBar (100, 1, 0.7, g, b, 1)
else
Details:AddTooltipHeaderStatusbar (r, g, b, 1)
end
else
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay1)
if (instancia.sub_atributo == 6) then
GameCooltip:AddStatusBar (100, 1, 0.7, 0, 0, barAlha)
else
Details:AddTooltipHeaderStatusbar (r, g, b, barAlha)
end
end
local icon_size = Details.tooltip.icon_size
local icon_border = Details.tooltip.icon_border_texcoord
for i = 1, max do
local aggressor = meus_agressores[i][4]
--only shows damage from enemies or from the player it self
--the player it self can only be placed on the list by the iteration above
--the iteration doesnt check friendly fire for all actors, only a few cases like Monk Stagger
if (aggressor:IsNeutralOrEnemy() or aggressor.nome == self.nome) then
local all_spells = {}
for spellid, spell in _pairs (aggressor.spells._ActorTable) do
local on_target = spell.targets [self.nome]
if (on_target) then
tinsert (all_spells, {spellid, on_target, aggressor.nome})
end
end
--friendly fire
local friendlyFire = aggressor.friendlyfire [self.nome]
if (friendlyFire) then
for spellid, amount in _pairs (friendlyFire.spells) do
tinsert (all_spells, {spellid, amount, aggressor.nome})
end
end
for _, spell in _ipairs (all_spells) do
local spellname, _, spellicon = _GetSpellInfo (spell [1])
GameCooltip:AddLine (spellname .. " (|cFFFFFF00" .. spell [3] .. "|r)", FormatTooltipNumber (_, spell [2]).." (" .. _cstr ("%.1f", (spell [2] / damage_taken) * 100).."%)")
GameCooltip:AddIcon (spellicon, 1, 1, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
Details:AddTooltipBackgroundStatusbar()
end
else
local aggressorName = Details:GetOnlyName (meus_agressores[i][1])
if (ismaximized and meus_agressores[i][1]:find (Details.playername)) then
GameCooltip:AddLine (aggressorName, FormatTooltipNumber (_, meus_agressores[i][2]).." (".._cstr("%.1f", (meus_agressores[i][2]/damage_taken) * 100).."%)", nil, "yellow")
else
GameCooltip:AddLine (aggressorName, FormatTooltipNumber (_, meus_agressores[i][2]).." (".._cstr("%.1f", (meus_agressores[i][2]/damage_taken) * 100).."%)")
end
local classe = meus_agressores[i][3]
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 (instancia.row_info.icon_file, nil, nil, icon_size.W, icon_size.H, _unpack (Details.class_coords [classe]))
end
Details:AddTooltipBackgroundStatusbar()
end
end
if (instancia.sub_atributo == 6) then
GameCooltip:AddLine (" ")
GameCooltip:AddLine (Loc ["STRING_ATTRIBUTE_DAMAGE_DONE"], FormatTooltipNumber (_, _math_floor (self.total)))
local half = 0.00048828125
GameCooltip:AddIcon (instancia:GetSkinTexture(), 1, 1, icon_size.W, icon_size.H, 0.005859375 + half, 0.025390625 - half, 0.3623046875, 0.3818359375)
Details:AddTooltipBackgroundStatusbar()
local heal_actor = instancia.showing (2, self.nome)
if (heal_actor) then
GameCooltip:AddLine (Loc ["STRING_ATTRIBUTE_HEAL_DONE"], FormatTooltipNumber (_, _math_floor (heal_actor.heal_enemy_amt)))
else
GameCooltip:AddLine (Loc ["STRING_ATTRIBUTE_HEAL_DONE"], 0)
end
GameCooltip:AddIcon (instancia:GetSkinTexture(), 1, 1, icon_size.W, icon_size.H, 0.037109375 + half, 0.056640625 - half, 0.3623046875, 0.3818359375)
Details:AddTooltipBackgroundStatusbar()
end
return true
end
---------> FRIENDLY FIRE
function atributo_damage:ToolTip_FriendlyFire (instancia, numero, barra, keydown)
local owner = self.owner
if (owner and owner.classe) then
r, g, b = unpack (Details.class_colors [owner.classe])
else
r, g, b = unpack (Details.class_colors [self.classe])
end
local FriendlyFire = self.friendlyfire
local FriendlyFireTotal = self.friendlyfire_total
local combat = instancia:GetShowingCombat()
local tabela_do_combate = instancia.showing
local showing = tabela_do_combate [class_type]
local icon_size = Details.tooltip.icon_size
local icon_border = Details.tooltip.icon_border_texcoord
local lineHeight = Details.tooltip.line_height
local DamagedPlayers = {}
local Skills = {}
for target_name, ff_table in _pairs (FriendlyFire) do
local actor = combat (1, target_name)
if (actor) then
DamagedPlayers [#DamagedPlayers+1] = {target_name, ff_table.total, actor.classe}
for spellid, amount in _pairs (ff_table.spells) do
Skills [spellid] = (Skills [spellid] or 0) + amount
end
end
end
_table_sort (DamagedPlayers, Details.Sort2)
Details:AddTooltipSpellHeaderText (Loc ["STRING_TARGETS"], headerColor, #DamagedPlayers, Details.tooltip_target_icon.file, unpack (Details.tooltip_target_icon.coords))
local ismaximized = false
if (keydown == "shift" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 3) then
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2)
Details:AddTooltipHeaderStatusbar (r, g, b, 1)
ismaximized = true
else
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_shift]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay1)
Details:AddTooltipHeaderStatusbar (r, g, b, barAlha)
end
local max_abilities = Details.tooltip.tooltip_max_abilities
if (ismaximized) then
max_abilities = 99
end
for i = 1, _math_min (max_abilities, #DamagedPlayers) do
local classe = DamagedPlayers[i][3]
if (not classe) then
classe = "UNKNOW"
end
GameCooltip:AddLine (Details:GetOnlyName (DamagedPlayers[i][1]), FormatTooltipNumber (_, DamagedPlayers[i][2]).." (".._cstr("%.1f", DamagedPlayers[i][2]/FriendlyFireTotal*100).."%)")
GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\espadas", nil, nil, lineHeight, lineHeight)
Details:AddTooltipBackgroundStatusbar()
if (classe == "UNKNOW") then
GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, lineHeight, lineHeight, _unpack (Details.class_coords ["UNKNOW"]))
else
local specID = Details:GetSpec (DamagedPlayers[i][1])
if (specID) then
local texture, l, r, t, b = Details: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 (Details.class_coords [classe]))
end
end
end
Details:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, 1, Details.tooltip_spell_icon.file, unpack (Details.tooltip_spell_icon.coords))
local ismaximized = false
if (keydown == "ctrl" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 4) then
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2)
Details:AddTooltipHeaderStatusbar (r, g, b, 1)
ismaximized = true
else
GameCooltip:AddIcon ([[Interface\AddOns\Details\images\key_ctrl]], 1, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay1)
Details:AddTooltipHeaderStatusbar (r, g, b, barAlha)
end
local max_abilities2 = Details.tooltip.tooltip_max_abilities
if (ismaximized) then
max_abilities2 = 99
end
--spells usadas no friendly fire
local SpellsInOrder = {}
for spellID, amount in _pairs (Skills) do
SpellsInOrder [#SpellsInOrder+1] = {spellID, amount}
end
_table_sort (SpellsInOrder, Details.Sort2)
for i = 1, _math_min (max_abilities2, #SpellsInOrder) do
local nome, _, icone = _GetSpellInfo (SpellsInOrder[i][1])
GameCooltip:AddLine (nome, FormatTooltipNumber (_, SpellsInOrder[i][2]).." (".._cstr("%.1f", SpellsInOrder[i][2]/FriendlyFireTotal*100).."%)")
GameCooltip:AddIcon (icone, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
Details:AddTooltipBackgroundStatusbar()
end
return true
end
--------------------------------------------- // JANELA DETALHES // ---------------------------------------------
---------> DETALHES BIFURCAO ~detalhes ~detailswindow
function atributo_damage:MontaInfo()
if (info.sub_atributo == 1 or info.sub_atributo == 2 or info.sub_atributo == 6) then --> damage done & dps
return self:MontaInfoDamageDone()
elseif (info.sub_atributo == 3) then --> damage taken
return self:MontaInfoDamageTaken()
elseif (info.sub_atributo == 4) then --> friendly fire
return self:MontaInfoFriendlyFire()
end
end
---------> DETALHES bloco da direita BIFURCAO
function atributo_damage:MontaDetalhes (spellid, barra, instancia)
if (info.sub_atributo == 1 or info.sub_atributo == 2) then
return self:MontaDetalhesDamageDone (spellid, barra, instancia)
elseif (info.sub_atributo == 3) then
return self:MontaDetalhesDamageTaken (spellid, barra, instancia)
elseif (info.sub_atributo == 4) then
return self:MontaDetalhesFriendlyFire (spellid, barra, instancia)
elseif (info.sub_atributo == 6) then
if (_bit_band (self.flag_original, 0x00000400) ~= 0) then -- um jogador
return self:MontaDetalhesDamageDone (spellid, barra, instancia)
end
return self:MontaDetalhesEnemy (spellid, barra, instancia)
--return self:MontaDetalhesDamageDone (spellid, barra)
end
end
------ Friendly Fire
function atributo_damage:MontaInfoFriendlyFire()
local instancia = info.instancia
local combat = instancia:GetShowingCombat()
local barras = info.barras1
local barras2 = info.barras2
local barras3 = info.barras3
local FriendlyFireTotal = self.friendlyfire_total
local DamagedPlayers = {}
local Skills = {}
for target_name, ff_table in _pairs (self.friendlyfire) do
local actor = combat (1, target_name)
if (actor) then
_table_insert (DamagedPlayers, {target_name, ff_table.total, ff_table.total / FriendlyFireTotal * 100, actor.classe})
for spellid, amount in _pairs (ff_table.spells) do
Skills [spellid] = (Skills [spellid] or 0) + amount
end
end
end
_table_sort (DamagedPlayers, Details.Sort2)
local amt = #DamagedPlayers
gump:JI_AtualizaContainerBarras (amt)
local FirstPlaceDamage = DamagedPlayers [1] and DamagedPlayers [1][2] or 0
for index, tabela in _ipairs (DamagedPlayers) do
local barra = barras [index]
if (not barra) then
barra = gump:CriaNovaBarraInfo1 (instancia, index)
barra.textura:SetStatusBarColor (1, 1, 1, 1)
barra.on_focus = false
end
if (not info.mostrando_mouse_over) then
if (tabela[1] == self.detalhes) then --> tabela [1] = NOME = NOME que esta na caixa da direita
if (not barra.on_focus) then --> se a barra no tiver no foco
barra.textura:SetStatusBarColor (129/255, 125/255, 69/255, 1)
barra.on_focus = true
if (not info.mostrando) then
info.mostrando = barra
end
end
else
if (barra.on_focus) then
barra.textura:SetStatusBarColor (1, 1, 1, 1) --> volta a cor antiga
barra:SetAlpha (.9) --> volta a alfa antiga
barra.on_focus = false
end
end
end
if (index == 1) then
barra.textura:SetValue (100)
else
barra.textura:SetValue (tabela[2]/FirstPlaceDamage*100)
end
barra.lineText1:SetText (index .. instancia.divisores.colocacao .. Details:GetOnlyName (tabela[1])) --seta o texto da esqueda
barra.lineText4:SetText (Details:comma_value (tabela[2]) .. " (" .. _cstr ("%.1f", tabela[3]) .."%)") --seta o texto da direita
local classe = tabela[4]
if (not classe) then
classe = "MONSTER"
end
barra.icone:SetTexture (info.instancia.row_info.icon_file)
if (Details.class_coords [classe]) then
barra.icone:SetTexCoord (_unpack (Details.class_coords [classe]))
else
barra.icone:SetTexture (nil)
end
local color = Details.class_colors [classe]
if (color) then
barra.textura:SetStatusBarColor (_unpack (color))
else
barra.textura:SetStatusBarColor (1, 1, 1)
end
barra.minha_tabela = self
barra.show = tabela[1]
barra:Show()
if (self.detalhes and self.detalhes == barra.show) then
self:MontaDetalhes (self.detalhes, barra, instancia)
end
end
local SkillTable = {}
for spellid, amt in _pairs (Skills) do
local nome, _, icone = _GetSpellInfo (spellid)
SkillTable [#SkillTable+1] = {nome, amt, amt/FriendlyFireTotal*100, icone}
end
_table_sort (SkillTable, Details.Sort2)
amt = #SkillTable
if (amt < 1) then
return
end
gump:JI_AtualizaContainerAlvos (amt)
FirstPlaceDamage = SkillTable [1] and SkillTable [1][2] or 0
for index, tabela in _ipairs (SkillTable) do
local barra = 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]/FirstPlaceDamage*100)
end
barra.lineText1:SetText (index..instancia.divisores.colocacao..tabela[1]) --seta o texto da esqueda
barra.lineText4:SetText (Details:comma_value (tabela[2]) .." (" .._cstr("%.1f", tabela[3]) .. ")") --seta o texto da direita
barra.icone:SetTexture (tabela[4])
barra.minha_tabela = nil --> desativa o tooltip
barra:Show()
end
end
------ Damage Taken
function atributo_damage:MontaInfoDamageTaken()
local damage_taken = self.damage_taken
local agressores = self.damage_from
local instancia = info.instancia
local tabela_do_combate = instancia.showing
local showing = tabela_do_combate [class_type] --> o que esta sendo mostrado -> [1] - dano [2] - cura --> pega o container com ._NameIndexTable ._ActorTable
local barras = info.barras1
local meus_agressores = {}
local este_agressor
for nome, _ in _pairs (agressores) do
este_agressor = showing._ActorTable[showing._NameIndexTable[nome]]
if (este_agressor) then
local alvos = este_agressor.targets
local este_alvo = alvos [self.nome]
if (este_alvo) then
meus_agressores [#meus_agressores+1] = {nome, este_alvo, este_alvo/damage_taken*100, este_agressor.classe}
end
end
end
local amt = #meus_agressores
if (amt < 1) then --> caso houve apenas friendly fire
return true
end
--_table_sort (meus_agressores, function (a, b) return a[2] > b[2] end)
_table_sort (meus_agressores, Details.Sort2)
gump:JI_AtualizaContainerBarras (amt)
local max_ = meus_agressores [1] and meus_agressores [1][2] or 0
local barra
for index, tabela in _ipairs (meus_agressores) do
barra = barras [index]
if (not barra) then
barra = gump:CriaNovaBarraInfo1 (instancia, index)
end
self:FocusLock (barra, tabela[1])
local texCoords = Details.class_coords [tabela[4]]
if (not texCoords) then
texCoords = Details.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_alpha", true, texCoords, nil, tabela[4])
end
end
--[[exported]] function Details:UpdadeInfoBar (row, index, spellid, name, value, value_formated, max, percent, icon, detalhes, texCoords, spellschool, class)
--> seta o tamanho da barra
if (index == 1) then
row.textura:SetValue (100)
else
row.textura:SetValue (value/max*100)
end
if (type (index) == "number") then
if (debugmode) then
row.lineText1:SetText (index .. ". " .. name .. " (" .. spellid .. ")")
else
row.lineText1:SetText (index .. ". " .. name)
end
else
row.lineText1:SetText (name)
end
row.lineText1.text = row.lineText1:GetText()
if (value_formated) then
row.lineText4:SetText (value_formated .. " (" .. _cstr ("%.1f", percent) .."%)")
end
row.lineText1:SetSize (row:GetWidth() - row.lineText4:GetStringWidth() - 40, 15)
--> seta o icone
if (icon) then
row.icone:SetTexture (icon)
if (icon == "Interface\\AddOns\\Details\\images\\classes_small") then
row.icone:SetTexCoord (0.25, 0.49609375, 0.75, 1)
else
row.icone:SetTexCoord (0, 1, 0, 1)
end
else
row.icone:SetTexture ("")
end
if (not row.IconUpBorder) then
row.IconUpBorder = CreateFrame ("frame", nil, row,"BackdropTemplate")
row.IconUpBorder:SetAllPoints (row.icone)
row.IconUpBorder:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1})
row.IconUpBorder:SetBackdropBorderColor (0, 0, 0, 0.75)
end
if (texCoords) then
row.icone:SetTexCoord (unpack (texCoords))
else
local icon_border = Details.tooltip.icon_border_texcoord
row.icone:SetTexCoord (icon_border.L, icon_border.R, icon_border.T, icon_border.B)
end
row.minha_tabela = self
row.show = spellid
row:Show() --> mostra a barra
if (spellschool) then
local t = Details.spells_school [spellschool]
if (t and t.decimals) then
row.textura:SetStatusBarColor (t.decimals[1], t.decimals[2], t.decimals[3])
else
row.textura:SetStatusBarColor (1, 1, 1)
end
elseif (class) then
local color = Details.class_colors [class]
if (color) then
row.textura:SetStatusBarColor (_unpack (color))
else
row.textura:SetStatusBarColor (1, 1, 1)
end
else
if (spellid == 98021) then --spirit linkl
row.textura:SetStatusBarColor (1, 0.4, 0.4)
else
row.textura:SetStatusBarColor (1, 1, 1)
end
end
if (detalhes and self.detalhes and self.detalhes == spellid and info.showing == index) then
--self:MontaDetalhes (spellid, row) --> poderia deixar isso pro final e montar uma tail call??
self:MontaDetalhes (row.show, row, info.instancia) --> poderia deixar isso pro final e montar uma tail call??
end
end
--[[exported]] function Details:FocusLock (row, spellid)
if (not info.mostrando_mouse_over) then
if (spellid == self.detalhes) then --> tabela [1] = spellid = spellid que esta na caixa da direita
if (not row.on_focus) then --> se a barra no tiver no foco
row.textura:SetStatusBarColor (129/255, 125/255, 69/255, 1)
row.on_focus = true
if (not info.mostrando) then
info.mostrando = row
end
end
else
if (row.on_focus) then
row.textura:SetStatusBarColor (1, 1, 1, 1) --> volta a cor antiga
row:SetAlpha (.9) --> volta a alfa antiga
row.on_focus = false
end
end
end
end
------ Damage Done & Dps
function atributo_damage:MontaInfoDamageDone()
local barras = info.barras1
local instancia = info.instancia
local total = self.total_without_pet --> total de dano aplicado por este jogador
local ActorTotalDamage = self.total
local ActorSkillsSortTable = {}
local ActorSkillsContainer = self.spells._ActorTable
--get time type
local meu_tempo
if (Details.time_type == 1 or not self.grupo) then
meu_tempo = self:Tempo()
elseif (Details.time_type == 2) then
meu_tempo = info.instancia.showing:GetCombatTime()
end
for _spellid, _skill in _pairs (ActorSkillsContainer) do --> da foreach em cada spellid do container
local nome, _, icone = _GetSpellInfo (_spellid)
if (nome) then
_table_insert (ActorSkillsSortTable, {_spellid, _skill.total, _skill.total/ActorTotalDamage*100, nome, icone, nil, _skill.spellschool})
end
end
--damage rank
local combat = instancia:GetShowingCombat()
local diff = combat:GetDifficulty()
local attribute, subattribute = instancia:GetDisplay()
--> check if is a raid encounter and if is heroic or mythic
if (diff and (diff == 15 or diff == 16)) then
local db = Details.OpenStorage()
if (db) then
local bestRank, encounterTable = Details.storage:GetBestFromPlayer (diff, combat:GetBossInfo().id, "damage", self.nome, true)
if (bestRank) then
--> discover which are the player position in the guild rank
local playerTable, onEncounter, rankPosition = Details.storage:GetPlayerGuildRank (diff, combat:GetBossInfo().id, "damage", self.nome, true)
local text1 = self.nome .. " Guild Rank on " .. (combat:GetBossInfo().name or "") .. ": |cFFFFFF00" .. (rankPosition or "x") .. "|r Best Dps: |cFFFFFF00" .. Details:ToK2 ((bestRank[1] or 0) / encounterTable.elapsed) .. "|r (" .. encounterTable.date:gsub (".*%s", "") .. ")"
info:SetStatusbarText (text1, 10, "gray")
else
info:SetStatusbarText()
end
else
info:SetStatusbarText()
end
else
info:SetStatusbarText()
end
--> add pets
local ActorPets = self.pets
--local class_color = RAID_CLASS_COLORS [self.classe] and RAID_CLASS_COLORS [self.classe].colorStr
local class_color = "FFCCBBBB"
--local class_color = "FFDDDD44"
for _, PetName in _ipairs (ActorPets) do
local PetActor = instancia.showing (class_type, PetName)
if (PetActor) then
local PetSkillsContainer = PetActor.spells._ActorTable
for _spellid, _skill in _pairs (PetSkillsContainer) do --> da foreach em cada spellid do container
local nome, _, icone = _GetSpellInfo (_spellid)
--_table_insert (ActorSkillsSortTable, {_spellid, _skill.total, _skill.total/ActorTotalDamage*100, nome .. " |TInterface\\AddOns\\Details\\images\\classes_small_alpha:12:12:0:0:128:128:33:64:96:128|t|c" .. class_color .. PetName:gsub ((" <.*"), "") .. "|r", icone, PetActor, _skill.spellschool})
if (nome) then
_table_insert (ActorSkillsSortTable, {_spellid, _skill.total, _skill.total/ActorTotalDamage*100, nome .. " (|c" .. class_color .. PetName:gsub ((" <.*"), "") .. "|r)", icone, PetActor, _skill.spellschool})
end
end
end
end
_table_sort (ActorSkillsSortTable, Details.Sort2)
gump:JI_AtualizaContainerBarras (#ActorSkillsSortTable + 1)
local max_ = ActorSkillsSortTable[1] and ActorSkillsSortTable[1][2] or 0 --> dano que a primeiro magia vez
local barra
--aura bar
if (false) then --> disabled for now
barra = barras [1]
if (not barra) then
barra = gump:CriaNovaBarraInfo1 (instancia, 1)
end
self:UpdadeInfoBar (barra, "", -51, "Auras", max_, false, max_, 100, [[Interface\BUTTONS\UI-GroupLoot-DE-Up]], true, nil, nil)
barra.textura:SetStatusBarColor (Details.gump:ParseColors ("purple"))
end
--spell bars
for index, tabela in _ipairs (ActorSkillsSortTable) do
--index = index + 1 --with the aura bar
index = index
barra = barras [index]
if (not barra) then
barra = gump:CriaNovaBarraInfo1 (instancia, index)
end
barra.other_actor = tabela [6]
local name = tabela[4]
if (info.sub_atributo == 2) then
local formated_value = SelectedToKFunction (_, _math_floor (tabela[2]/meu_tempo))
self:UpdadeInfoBar (barra, index, tabela[1], name, tabela[2], formated_value, max_, tabela[3], tabela[5], true, nil, tabela [7])
else
local formated_value = SelectedToKFunction (_, _math_floor (tabela[2]))
self:UpdadeInfoBar (barra, index, tabela[1], name, tabela[2], formated_value, max_, tabela[3], tabela[5], true, nil, tabela [7])
end
self:FocusLock (barra, tabela[1])
end
--> TOP INIMIGOS
if (instancia.sub_atributo == 6) then
local damage_taken = self.damage_taken
local agressores = self.damage_from
local tabela_do_combate = instancia.showing
local showing = tabela_do_combate [class_type] --> o que esta sendo mostrado -> [1] - dano [2] - cura --> pega o container com ._NameIndexTable ._ActorTable
local barras = info.barras2
local meus_agressores = {}
local este_agressor
for nome, _ in _pairs (agressores) do
este_agressor = showing._ActorTable[showing._NameIndexTable[nome]]
if (este_agressor) then
local este_alvo = este_agressor.targets [self.nome]
if (este_alvo) then
meus_agressores [#meus_agressores+1] = {nome, este_alvo, este_alvo/damage_taken*100, este_agressor.classe}
end
end
end
local amt = #meus_agressores
if (amt < 1) then --> caso houve apenas friendly fire
return true
end
gump:JI_AtualizaContainerAlvos (amt)
--_table_sort (meus_agressores, function (a, b) return a[2] > b[2] end)
_table_sort (meus_agressores, Details.Sort2)
local max_ = meus_agressores[1] and meus_agressores[1][2] or 0 --> dano que a primeiro magia vez
local barra
for index, tabela in _ipairs (meus_agressores) do
barra = barras [index]
if (not barra) then --> se a barra no existir, criar ela ento
barra = gump:CriaNovaBarraInfo2 (instancia, index)
barra.textura:SetStatusBarColor (1, 1, 1, 1) --> isso aqui a parte da seleo e desceleo
end
if (index == 1) then
barra.textura:SetValue (100)
else
barra.textura:SetValue (tabela[2]/max_*100)
end
barra.lineText1:SetText (index .. ". " .. Details:GetOnlyName (tabela[1])) --seta o texto da esqueda
barra.lineText4:SetText (Details:comma_value (tabela[2]) .. " (" .. _cstr ("%.1f", tabela[3]) .. "%)") --seta o texto da direita
barra.icone:SetTexture ([[Interface\AddOns\Details\images\classes_small_alpha]]) --CLASSE
local texCoords = Details.class_coords [tabela[4]]
if (not texCoords) then
texCoords = Details.class_coords ["UNKNOW"]
end
barra.icone:SetTexCoord (_unpack (texCoords))
local color = Details.class_colors [tabela[4]]
if (color) then
barra.textura:SetStatusBarColor (_unpack (color))
else
barra.textura:SetStatusBarColor (1, 1, 1)
end
Details:name_space_info (barra)
if (barra.mouse_over) then --> atualizar o tooltip
if (barra.isAlvo) then
GameTooltip:Hide()
GameTooltip:SetOwner (barra, "ANCHOR_TOPRIGHT")
if (not barra.minha_tabela:MontaTooltipDamageTaken (barra, index)) then
return
end
GameTooltip:Show()
end
end
barra.minha_tabela = self --> grava o jogador na tabela
barra.nome_inimigo = tabela [1] --> salva o nome do inimigo na barra --> isso necessrio?
-- no rank do spell id colocar o que?
barra.spellid = "enemies"
barra:Show() --> mostra a barra
end
else
local meus_inimigos = {}
--> my target container
conteudo = self.targets
for target_name, amount in _pairs (conteudo) do
_table_insert (meus_inimigos, {target_name, amount, amount/total*100})
end
--> sort
_table_sort (meus_inimigos, Details.Sort2)
local amt_alvos = #meus_inimigos
if (amt_alvos < 1) then
return
end
gump:JI_AtualizaContainerAlvos (amt_alvos)
local max_inimigos = meus_inimigos[1] and meus_inimigos[1][2] or 0
local barra
for index, tabela in _ipairs (meus_inimigos) do
barra = info.barras2 [index]
if (not barra) then
barra = gump:CriaNovaBarraInfo2 (instancia, index)
barra.textura:SetStatusBarColor (1, 1, 1, 1)
end
if (index == 1) then
barra.textura:SetValue (100)
else
barra.textura:SetValue (tabela[2]/max_inimigos*100)
end
local target_actor = instancia.showing (1, tabela[1])
if (target_actor) then
target_actor:SetClassIcon (barra.icone, instancia, target_actor.classe)
else
barra.icone:SetTexture ([[Interface\AddOns\Details\images\classes_small_alpha]]) --CLASSE
local texCoords = Details.class_coords ["ENEMY"]
barra.icone:SetTexCoord (_unpack (texCoords))
end
barra.textura:SetStatusBarColor (1, 0.8, 0.8)
barra.textura:SetStatusBarColor (1, 1, 1, 1)
barra.lineText1:SetText (index .. ". " .. Details:GetOnlyName (tabela[1]))
if (info.sub_atributo == 2) then
barra.lineText4:SetText (Details:comma_value ( _math_floor (tabela[2]/meu_tempo)) .. " (" .. _cstr ("%.1f", tabela[3]) .. "%)")
else
barra.lineText4:SetText (SelectedToKFunction (_, tabela[2]) .." (" .. _cstr ("%.1f", tabela[3]) .. "%)")
end
if (barra.mouse_over) then --> atualizar o tooltip
if (barra.isAlvo) then
--GameTooltip:Hide()
--GameTooltip:SetOwner (barra, "ANCHOR_TOPRIGHT")
if (not barra.minha_tabela:MontaTooltipAlvos (barra, index, instancia)) then
return
end
--GameTooltip:Show()
end
end
barra.minha_tabela = self --> grava o jogador na tabela
barra.nome_inimigo = tabela [1] --> salva o nome do inimigo na barra --> isso necessrio?
-- no rank do spell id colocar o que?
barra.spellid = tabela[5]
barra:Show()
end
end
end
------ Detalhe Info Friendly Fire
function atributo_damage:MontaDetalhesFriendlyFire (nome, barra)
for _, barra in _ipairs (info.barras3) do
barra:Hide()
end
local barras = info.barras3
local instancia = info.instancia
local tabela_do_combate = info.instancia.showing
local showing = tabela_do_combate [class_type] --> o que esta sendo mostrado -> [1] - dano [2] - cura --> pega o container com ._NameIndexTable ._ActorTable
local friendlyfire = self.friendlyfire
local ff_table = self.friendlyfire [nome] --> assumindo que nome o nome do Alvo que tomou dano // bastaria pegar a tabela de habilidades dele
if (not ff_table) then
return
end
local total = ff_table.total
local minhas_magias = {}
for spellid, amount in _pairs (ff_table.spells) do --> da foreach em cada spellid do container
local nome, _, icone = _GetSpellInfo (spellid)
_table_insert (minhas_magias, {spellid, amount, amount / total * 100, nome, icone})
end
_table_sort (minhas_magias, Details.Sort2)
local max_ = minhas_magias[1] and minhas_magias[1][2] or 0 --> dano que a primeiro magia vez
local barra
for index, tabela in _ipairs (minhas_magias) do
barra = barras [index]
if (not barra) then --> se a barra no existir, criar ela ento
barra = gump:CriaNovaBarraInfo3 (instancia, index)
barra.textura:SetStatusBarColor (1, 1, 1, 1) --> isso aqui a parte da seleo e desceleo
end
if (index == 1) then
barra.textura:SetValue (100)
else
barra.textura:SetValue (tabela[2]/max_*100) --> muito mais rapido...
end
barra.lineText1:SetText (index..instancia.divisores.colocacao..tabela[4]) --seta o texto da esqueda
barra.lineText4:SetText (Details:comma_value (tabela[2]) .. " " .. instancia.divisores.abre .. _cstr ("%.1f", tabela[3]) .. "%" .. instancia.divisores.fecha) --seta o texto da direita
barra.icone:SetTexture (tabela[5])
barra.icone:SetTexCoord (0, 1, 0, 1)
barra:Show() --> mostra a barra
if (index == 15) then
break
end
end
end
-- detalhes info enemies
function atributo_damage:MontaDetalhesEnemy (spellid, barra)
for _, barra in _ipairs (info.barras3) do
barra:Hide()
end
local container = info.instancia.showing[1]
local barras = info.barras3
local instancia = info.instancia
local other_actor = barra.other_actor
if (other_actor) then
self = other_actor
end
if (barra.lineText1:IsTruncated()) then
Details:CooltipPreset (2)
GameCooltip:SetOption ("FixedWidth", nil)
GameCooltip:AddLine (barra.lineText1.text)
GameCooltip:SetOwner (barra, "bottomleft", "topleft", 5, -10)
GameCooltip:ShowCooltip()
end
local spell = self.spells:PegaHabilidade (spellid)
local targets = spell.targets
local target_pool = {}
for target_name, amount in _pairs (targets) do
local classe
local this_actor = info.instancia.showing (1, target_name)
if (this_actor) then
classe = this_actor.classe or "UNKNOW"
else
classe = "UNKNOW"
end
target_pool [#target_pool+1] = {target_name, amount, classe}
end
_table_sort (target_pool, Details.Sort2)
local max_ = target_pool [1] and target_pool [1][2] or 0
local barra
for index, tabela in _ipairs (target_pool) do
barra = barras [index]
if (not barra) then --> se a barra no existir, criar ela ento
barra = gump:CriaNovaBarraInfo3 (instancia, index)
barra.textura:SetStatusBarColor (1, 1, 1, 1) --> isso aqui a parte da seleo e desceleo
end
if (index == 1) then
barra.textura:SetValue (100)
else
barra.textura:SetValue (tabela[2]/max_*100) --> muito mais rapido...
end
barra.lineText1:SetText (index .. ". " .. Details:GetOnlyName (tabela [1])) --seta o texto da esqueda
Details:name_space_info (barra)
if (spell.total > 0) then
barra.lineText4:SetText (Details:comma_value (tabela[2]) .." (".. _cstr("%.1f", tabela[2] / spell.total * 100) .."%)") --seta o texto da direita
else
barra.lineText4:SetText (tabela[2] .." (0%)") --seta o texto da direita
end
local texCoords = Details.class_coords [tabela[3]]
if (not texCoords) then
texCoords = Details.class_coords ["UNKNOW"]
end
local color = Details.class_colors [tabela[3]]
if (color) then
barra.textura:SetStatusBarColor (_unpack (color))
else
barra.textura:SetStatusBarColor (1, 1, 1, 1)
end
barra.icone:SetTexture ("Interface\\AddOns\\Details\\images\\classes_small_alpha")
barra.icone:SetTexCoord (unpack (texCoords))
barra:Show() --> mostra a barra
if (index == 15) then
break
end
end
end
------ Detalhe Info Damage Taken
function atributo_damage:MontaDetalhesDamageTaken (nome, barra)
for _, barra in _ipairs (info.barras3) do
barra:Hide()
end
local barras = info.barras3
local instancia = info.instancia
local tabela_do_combate = info.instancia.showing
local showing = tabela_do_combate [class_type] --> o que esta sendo mostrado -> [1] - dano [2] - cura --> pega o container com ._NameIndexTable ._ActorTable
local este_agressor = showing._ActorTable[showing._NameIndexTable[nome]]
if (not este_agressor ) then
return
end
local conteudo = este_agressor.spells._ActorTable --> _pairs[] com os IDs das magias
local actor = info.jogador.nome
local total = este_agressor.targets [actor] or 0
local minhas_magias = {}
for spellid, tabela in _pairs (conteudo) do --> da foreach em cada spellid do container
local este_alvo = tabela.targets [actor]
if (este_alvo) then --> esta magia deu dano no actor
local spell_nome, rank, icone = _GetSpellInfo (spellid)
_table_insert (minhas_magias, {spellid, este_alvo, este_alvo/total*100, spell_nome, icone})
end
end
_table_sort (minhas_magias, Details.Sort2)
--local amt = #minhas_magias
--gump:JI_AtualizaContainerBarras (amt)
local max_ = minhas_magias[1] and minhas_magias[1][2] or 0 --> dano que a primeiro magia vez
local barra
for index, tabela in _ipairs (minhas_magias) do
barra = barras [index]
if (not barra) then --> se a barra no existir, criar ela ento
barra = gump:CriaNovaBarraInfo3 (instancia, index)
barra.textura:SetStatusBarColor (1, 1, 1, 1) --> isso aqui a parte da seleo e desceleo
end
if (index == 1) then
barra.textura:SetValue (100)
else
barra.textura:SetValue (tabela[2]/max_*100)
end
barra.lineText1:SetText (index .. "." .. tabela[4]) --seta o texto da esqueda
Details:name_space_info (barra)
barra.lineText4:SetText (Details:comma_value (tabela[2]) .." ".. instancia.divisores.abre .._cstr("%.1f", tabela[3]) .."%".. instancia.divisores.fecha) --seta o texto da direita
barra.icone:SetTexture (tabela[5])
barra.icone:SetTexCoord (0, 1, 0, 1)
barra:Show() --> mostra a barra
if (index == 15) then
break
end
end
end
------ Detalhe Info Damage Done e Dps
--local defenses_table = {c = {117/255, 58/255, 0/255}, p = 0}
--local normal_table = {c = {255/255, 180/255, 0/255, 0.5}, p = 0}
--local critical_table = {c = {249/255, 74/255, 45/255, 0.5}, p = 0}
local defenses_table = {c = {1, 1, 1, 0.5}, p = 0}
local normal_table = {c = {1, 1, 1, 0.5}, p = 0}
local critical_table = {c = {1, 1, 1, 0.5}, p = 0}
local data_table = {}
local t1, t2, t3, t4 = {}, {}, {}, {}
local function FormatSpellString(str)
return (string.gsub(str, "%d+", function(spellID)
local name, _, icon = GetSpellInfo (spellID);
return string.format("|T%s:16|t", icon);
end));
end
local MontaDetalhesBuffProcs = function (actor, row, instance)
instance = instance or info.instancia
local spec = actor.spec
if (spec) then
local mainAuras = Details.important_auras [spec]
if (mainAuras) then
local miscActor = instance:GetShowingCombat():GetActor (4, actor:name())
if (miscActor and miscActor.buff_uptime_spells) then
--> get the auras
local added = 0
for i = 1, #mainAuras do
local spellID = mainAuras [i]
local spellObject = miscActor.buff_uptime_spells._ActorTable [spellID]
if (spellObject) then
local spellName, spellIcon = GetSpellInfo (spellID)
local spellUptime = spellObject.uptime
local spellApplies = spellObject.appliedamt
local spellRefreshes = spellObject.refreshamt
gump:SetaDetalheInfoTexto (i, 100, FormatSpellString ("" .. spellID .. " " .. spellName), "Activations: " .. spellApplies, " ", "Refreshes: " .. spellRefreshes, " ", "Uptime: " .. spellUptime .. "s")
added = added + 1
end
end
for i = added + 1, 5 do
gump:HidaDetalheInfo (i)
end
return
end
end
end
for i = 1, 5 do
gump:HidaDetalheInfo (i)
end
end
function atributo_damage:MontaDetalhesDamageDone (spellid, barra, instancia)
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 (spellid == -51) then
return MontaDetalhesBuffProcs (self, barra, instancia)
end
if (not esta_magia) then
return
end
--> icone direito superior
local _, _, icone = _GetSpellInfo (spellid)
Details.playerDetailWindow.spell_icone:SetTexture (icone)
local total = self.total
local meu_tempo
if (Details.time_type == 1 or not self.grupo) then
meu_tempo = self:Tempo()
elseif (Details.time_type == 2) then
meu_tempo = info.instancia.showing:GetCombatTime()
end
local total_hits = esta_magia.counter
local index = 1
local data = data_table
table.wipe (t1)
table.wipe (t2)
table.wipe (t3)
table.wipe (t4)
table.wipe (data)
--> GERAL
local media = 0
if (total_hits > 0) then
media = esta_magia.total/total_hits
end
local this_dps = nil
if (esta_magia.counter > esta_magia.c_amt) then
this_dps = Loc ["STRING_DPS"] .. ": " .. Details:comma_value (esta_magia.total/meu_tempo)
else
this_dps = Loc ["STRING_DPS"] .. ": " .. Loc ["STRING_SEE_BELOW"]
end
local spellschool, schooltext = esta_magia.spellschool, ""
if (spellschool) then
local t = Details.spells_school [spellschool]
if (t and t.name) then
schooltext = t.formated
end
end
local hits_string = "" .. total_hits
local cast_string = Loc ["STRING_CAST"] .. ": "
local misc_actor = info.instancia.showing (4, self:name())
if (misc_actor) then
local uptime_spellid = esta_magia.id
--if (uptime_spellid == 233490) then
-- uptime_spellid = 233496
-- uptime_spellid = 233490
--end
local debuff_uptime = misc_actor.debuff_uptime_spells and misc_actor.debuff_uptime_spells._ActorTable [uptime_spellid] and misc_actor.debuff_uptime_spells._ActorTable [uptime_spellid].uptime
if (debuff_uptime) then
hits_string = hits_string .. " |cFFDDDD44(" .. _math_floor (debuff_uptime / info.instancia.showing:GetCombatTime() * 100) .. "% uptime)|r"
end
local spell_cast = misc_actor.spell_cast and misc_actor.spell_cast [spellid]
if (not spell_cast and misc_actor.spell_cast) then
local spellname = GetSpellInfo (spellid)
for casted_spellid, amount in _pairs (misc_actor.spell_cast) do
local casted_spellname = GetSpellInfo (casted_spellid)
if (casted_spellname == spellname) then
spell_cast = amount .. " (|cFFFFFF00?|r)"
end
end
end
if (not spell_cast) then
spell_cast = "(|cFFFFFF00?|r)"
end
cast_string = cast_string .. spell_cast
end
gump:SetaDetalheInfoTexto ( index, 100,
cast_string,
Loc ["STRING_DAMAGE"]..": "..Details:ToK (esta_magia.total),
schooltext, --offhand,
Loc ["STRING_AVERAGE"] .. ": " .. Details:comma_value (media),
this_dps,
Loc ["STRING_HITS"]..": " .. hits_string)
--> NORMAL
local normal_hits = esta_magia.n_amt
if (normal_hits > 0) then
local normal_dmg = esta_magia.n_dmg
local media_normal = normal_dmg/normal_hits
local T = (meu_tempo*normal_dmg)/esta_magia.total
local P = media/media_normal*100
T = P*T/100
normal_table.p = normal_hits/total_hits*100
data[#data+1] = t1
t1[1] = esta_magia.n_amt
t1[2] = normal_table
t1[3] = Loc ["STRING_NORMAL_HITS"]
t1[4] = Loc ["STRING_MINIMUM_SHORT"] .. ": " .. Details:comma_value (esta_magia.n_min)
t1[5] = Loc ["STRING_MAXIMUM_SHORT"] .. ": " .. Details:comma_value (esta_magia.n_max)
t1[6] = Loc ["STRING_AVERAGE"] .. ": " .. Details:comma_value (media_normal)
t1[7] = Loc ["STRING_DPS"] .. ": " .. Details:comma_value (normal_dmg/T)
t1[8] = normal_hits .. " [|cFFC0C0C0" .. _cstr ("%.1f", normal_hits/total_hits*100) .. "%|r]"
end
--> CRITICO
if (esta_magia.c_amt > 0) then
local media_critico = esta_magia.c_dmg/esta_magia.c_amt
local T = (meu_tempo*esta_magia.c_dmg)/esta_magia.total
local P = media/media_critico*100
T = P*T/100
local crit_dps = esta_magia.c_dmg/T
if (not crit_dps) then
crit_dps = 0
end
critical_table.p = esta_magia.c_amt/total_hits*100
data[#data+1] = t2
t2[1] = esta_magia.c_amt
t2[2] = critical_table
t2[3] = Loc ["STRING_CRITICAL_HITS"]
t2[4] = Loc ["STRING_MINIMUM_SHORT"] .. ": " .. Details:comma_value (esta_magia.c_min)
t2[5] = Loc ["STRING_MAXIMUM_SHORT"] .. ": " .. Details:comma_value (esta_magia.c_max)
t2[6] = Loc ["STRING_AVERAGE"] .. ": " .. Details:comma_value (media_critico)
t2[7] = Loc ["STRING_DPS"] .. ": " .. Details:comma_value (crit_dps)
t2[8] = esta_magia.c_amt .. " [|cFFC0C0C0" .. _cstr ("%.1f", esta_magia.c_amt/total_hits*100) .. "%|r]"
end
--> Outros erros: GLACING, resisted, blocked, absorbed
local outros_desvios = esta_magia.g_amt + esta_magia.b_amt
local parry = esta_magia ["PARRY"] or 0
local dodge = esta_magia ["DODGE"] or 0
local erros = parry + dodge
if (outros_desvios > 0 or erros > 0) then
local porcentagem_defesas = (outros_desvios+erros) / total_hits * 100
data[#data+1] = t3
defenses_table.p = porcentagem_defesas
t3[1] = outros_desvios+erros
t3[2] = defenses_table
t3[3] = Loc ["STRING_DEFENSES"]
t3[4] = Loc ["STRING_GLANCING"] .. ": " .. _math_floor (esta_magia.g_amt/esta_magia.counter*100) .. "%"
t3[5] = Loc ["STRING_PARRY"] .. ": " .. parry
t3[6] = Loc ["STRING_DODGE"] .. ": " .. dodge
t3[7] = Loc ["STRING_BLOCKED"] .. ": " .. _math_floor (esta_magia.b_amt/esta_magia.counter*100)
t3[8] = (outros_desvios+erros) .. " / " .. _cstr ("%.1f", porcentagem_defesas) .. "%"
end
--Details:BuildPlayerDetailsSpellChart()
--DetailsPlayerDetailSmallChart.ShowChart (Details.playerDetailWindow.grupos_detalhes [5].bg, info.instancia.showing, info.instancia.showing.cleu_events, self.nome, false, spellid, 1, 2, 3, 4, 5, 6, 7, 8, 15)
--> spell damage chart
--events: 1 2 3 4 5 6 7 8 15
_table_sort (data, Details.Sort1)
for index, tabela in _ipairs (data) do
gump:SetaDetalheInfoTexto (index+1, tabela[2], tabela[3], tabela[4], tabela[5], tabela[6], tabela[7], tabela[8])
end
for i = #data+2, 5 do
gump:HidaDetalheInfo (i)
end
end
function Details:BuildPlayerDetailsSpellChart()
local playerDetailSmallChart = DetailsPlayerDetailSmallChart
if (not playerDetailSmallChart) then
playerDetailSmallChart = CreateFrame ("frame", "DetailsPlayerDetailSmallChart", info,"BackdropTemplate")
DetailsFramework:ApplyStandardBackdrop (playerDetailSmallChart)
playerDetailSmallChart.Lines = {}
for i = 1, 200 do
local texture = playerDetailSmallChart:CreateTexture (nil, "artwork")
texture:SetColorTexture (1, 1, 1, 1)
tinsert (playerDetailSmallChart.Lines, texture)
end
--Details.playerDetailWindow.grupos_detalhes [index]
function playerDetailSmallChart.ShowChart (parent, combatObject, cleuData, playerName, targetName, spellId, ...)
local tokenIdList = {}
local eventList = {}
--build the list of tokens
for i = 1, select ("#", ... ) do
local tokenId = select (i, ...)
tokenIdList [tokenId] = true
end
--check which lines can be added
local index = 1
local peakValue = 0
for i = 1, cleuData.n -1 do
local event = cleuData [i]
if (event [2]) then --index 2 = token
local playerNameFilter = playerName and playerName == event [3]
local targetNameFilter = targetName and targetName == event [4]
local spellIdFilter = spellId and spellId == event [5]
if (playerNameFilter or targetNameFilter or spellIdFilter) then
eventList [index] = cleuData [i]
if (peakValue < cleuData [i] [6]) then
peakValue = cleuData [i] [6]
end
index = index + 1
end
end
end
--200 lines, adjust the mini chart
playerDetailSmallChart:SetPoint ("topleft", parent, "topleft")
playerDetailSmallChart:SetPoint ("bottomright", parent, "bottomright")
--update lines
local width = playerDetailSmallChart:GetWidth()
local combatTime = combatObject:GetCombatTime()
local secondsPerBar = combatTime / 200
local barWidth = width / 200
local barHeight = playerDetailSmallChart:GetHeight()
local currentTime = eventList [1][1]
local currentIndex = 1
local eventAmount = #eventList
for i = 1, #playerDetailSmallChart.Lines do
playerDetailSmallChart.Lines [i]:SetWidth (width / 200)
playerDetailSmallChart.Lines [i]:SetHeight (1)
for o = currentIndex, eventAmount do
if (eventList [o][1] <= currentTime + secondsPerBar or eventList [o][1] >= currentTime) then
playerDetailSmallChart.Lines [i]:SetPoint ("bottomleft", playerDetailSmallChart, "bottomleft", barWidth * (i - 1), 0)
playerDetailSmallChart.Lines [i]:SetWidth (barWidth)
playerDetailSmallChart.Lines [i]:SetHeight (eventList [o][6] / peakValue * barHeight)
else
currentIndex = o
break
end
end
currentTime = currentTime + secondsPerBar
end
end
end
end
function atributo_damage:MontaTooltipDamageTaken (thisLine, index)
local aggressor = info.instancia.showing [1]:PegarCombatente (_, thisLine.nome_inimigo)
local container = aggressor.spells._ActorTable
local habilidades = {}
local total = 0
for spellid, spell in _pairs (container) do
for target_name, amount in _pairs (spell.targets) do
if (target_name == self.nome) then
total = total + amount
habilidades [#habilidades+1] = {spellid, amount}
end
end
end
_table_sort (habilidades, Details.Sort2)
GameTooltip:AddLine (index..". "..thisLine.nome_inimigo)
GameTooltip:AddLine (Loc ["STRING_DAMAGE_TAKEN_FROM2"]..":")
GameTooltip:AddLine (" ")
for index, tabela in _ipairs (habilidades) do
local nome, _, icone = _GetSpellInfo (tabela[1])
if (index < 8) then
GameTooltip:AddDoubleLine (index..". |T"..icone..":0|t "..nome, Details:comma_value (tabela[2]).." (".._cstr("%.1f", tabela[2]/total*100).."%)", 1, 1, 1, 1, 1, 1)
else
GameTooltip:AddDoubleLine (index..". "..nome, Details:comma_value (tabela[2]).." (".._cstr("%.1f", tabela[2]/total*100).."%)", .65, .65, .65, .65, .65, .65)
end
end
return true
--GameTooltip:AddDoubleLine (meus_danos[i][4][1]..": ", meus_danos[i][2].." (".._cstr("%.1f", meus_danos[i][3]).."%)", 1, 1, 1, 1, 1, 1)
end
function atributo_damage:MontaTooltipAlvos (thisLine, index, instancia)
local inimigo = thisLine.nome_inimigo
local habilidades = {}
local total = self.total
local i = 1
Details:FormatCooltipForSpells()
GameCooltip:SetOwner(thisLine, "bottom", "top", 4, -2)
GameCooltip:SetOption ("MinWidth", _math_max (230, thisLine:GetWidth()*0.98))
for spellid, spell in _pairs (self.spells._ActorTable) do
if (spell.isReflection) then
for target_name, amount in _pairs (spell.targets) do
if (target_name == inimigo) then
for reflectedSpellId, amount in _pairs (spell.extra) do
local spellName, _, spellIcon = _GetSpellInfo(reflectedSpellId)
local t = habilidades [i]
if (not t) then
habilidades [i] = {}
t = habilidades [i]
end
t[1], t[2], t[3] = spellName .. " (|cFFCCBBBBreflected|r)", amount, spellIcon
i = i + 1
end
end
end
else
for target_name, amount in _pairs (spell.targets) do
if (target_name == inimigo) then
local nome, _, icone = _GetSpellInfo (spellid)
local t = habilidades [i]
if (not t) then
habilidades [i] = {}
t = habilidades [i]
end
t[1], t[2], t[3] = nome, amount, icone
i = i + 1
end
end
end
end
--> add pets
for _, PetName in _ipairs (self.pets) do
local PetActor = instancia.showing (class_type, PetName)
if (PetActor) then
local PetSkillsContainer = PetActor.spells._ActorTable
for _spellid, _skill in _pairs (PetSkillsContainer) do
local alvos = _skill.targets
for target_name, amount in _pairs (alvos) do
if (target_name == inimigo) then
local t = habilidades [i]
if (not t) then
habilidades [i] = {}
t = habilidades [i]
end
local nome, _, icone = _GetSpellInfo (_spellid)
t[1], t[2], t[3] = nome .. " (" .. PetName:gsub ((" <.*"), "") .. ")", amount, icone
i = i + 1
end
end
end
end
end
_table_sort (habilidades, Details.Sort2)
--get time type
local meu_tempo
if (Details.time_type == 1 or not self.grupo) then
meu_tempo = self:Tempo()
elseif (Details.time_type == 2) then
meu_tempo = info.instancia.showing:GetCombatTime()
end
local is_dps = info.instancia.sub_atributo == 2
if (is_dps) then
Details:AddTooltipSpellHeaderText (Loc ["STRING_DAMAGE_DPS_IN"] .. ":", {1, 0.9, 0.0, 1}, 1, Details.tooltip_spell_icon.file, unpack (Details.tooltip_spell_icon.coords))
Details:AddTooltipHeaderStatusbar (1, 1, 1, 1)
else
Details:AddTooltipSpellHeaderText (Loc ["STRING_DAMAGE_FROM"] .. ":", {1, 0.9, 0.0, 1}, 1, Details.tooltip_spell_icon.file, unpack (Details.tooltip_spell_icon.coords))
Details:AddTooltipHeaderStatusbar (1, 1, 1, 1)
end
local icon_size = Details.tooltip.icon_size
local icon_border = Details.tooltip.icon_border_texcoord
local topSpellDamage = habilidades[1] and habilidades[1][2]
if (topSpellDamage) then
for index, tabela in _ipairs (habilidades) do
if (tabela [2] < 1) then
break
end
if (is_dps) then
--GameCooltip:AddDoubleLine (index..". |T"..tabela[3]..":0|t "..tabela[1], Details:comma_value ( _math_floor (tabela[2] / meu_tempo) ).." (".._cstr("%.1f", tabela[2]/total*100).."%)", 1, 1, 1, 1, 1, 1)
GameCooltip:AddLine (tabela[1], Details:comma_value ( _math_floor (tabela[2] / meu_tempo) ).." (".._cstr("%.1f", tabela[2]/total*100).."%)")
else
--GameCooltip:AddDoubleLine (index..". |T"..tabela[3]..":0|t " .. tabela[1], SelectedToKFunction (_, tabela[2]) .. " (".._cstr("%.1f", tabela[2]/total*100).."%)", 1, 1, 1, 1, 1, 1)
GameCooltip:AddLine (tabela[1], SelectedToKFunction (_, tabela[2]) .. " (".._cstr("%.1f", tabela[2]/total*100).."%)")
end
GameCooltip:AddIcon (tabela[3], nil, nil, icon_size.W + 4, icon_size.H + 4, icon_border.L, icon_border.R, icon_border.T, icon_border.B)
Details:AddTooltipBackgroundStatusbar (false, tabela[2] / topSpellDamage * 100)
end
end
GameCooltip:Show()
return true
end
--> controla se o dps do jogador esta travado ou destravado
function atributo_damage:Iniciar (iniciar)
if (iniciar == nil) then
return self.dps_started --> retorna se o dps esta aberto ou fechado para este jogador
elseif (iniciar) then
self.dps_started = true
self:RegistrarNaTimeMachine() --coloca ele da timeMachine
else
self.dps_started = false
self:DesregistrarNaTimeMachine() --retira ele da timeMachine
end
end
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--> core functions
--> limpa as tabelas temporrias ao resetar
function atributo_damage:ClearTempTables()
for i = #ntable, 1, -1 do
ntable [i] = nil
end
for i = #vtable, 1, -1 do
vtable [i] = nil
end
for i = #bs_table, 1, -1 do
bs_table [i] = nil
end
if (bs_tooltip_table) then
wipe (bs_tooltip_table)
end
if (frags_tooltip_table) then
wipe (frags_tooltip_table)
end
wipe (bs_index_table)
wipe (tooltip_temp_table)
wipe (tooltip_void_zone_temp)
end
--> atualize a funcao de abreviacao
function atributo_damage:UpdateSelectedToKFunction()
SelectedToKFunction = ToKFunctions [Details.ps_abbreviation]
FormatTooltipNumber = ToKFunctions [Details.tooltip.abbreviation]
TooltipMaximizedMethod = Details.tooltip.maximize_method
headerColor = Details.tooltip.header_text_color
end
--> diminui o total das tabelas do combate
function atributo_damage:subtract_total (combat_table)
combat_table.totals [class_type] = combat_table.totals [class_type] - self.total
if (self.grupo) then
combat_table.totals_grupo [class_type] = combat_table.totals_grupo [class_type] - self.total
end
end
function atributo_damage:add_total (combat_table)
combat_table.totals [class_type] = combat_table.totals [class_type] + self.total
if (self.grupo) then
combat_table.totals_grupo [class_type] = combat_table.totals_grupo [class_type] + self.total
end
end
--> restaura a tabela de last event
function atributo_damage:r_last_events_table (actor)
if (not actor) then
actor = self
end
--actor.last_events_table = Details:CreateActorLastEventTable()
end
--> restaura e liga o ator com a sua shadow durante a inicializao (startup function)
function atributo_damage:r_onlyrefresh_shadow (actor)
--> criar uma shadow desse ator se ainda no tiver uma
local overall_dano = Details.tabela_overall [1]
local shadow = overall_dano._ActorTable [overall_dano._NameIndexTable [actor.nome]]
if (not shadow) then
shadow = overall_dano:PegarCombatente (actor.serial, actor.nome, actor.flag_original, true)
shadow.classe = actor.classe
shadow.spec = actor.spec
shadow.grupo = actor.grupo
shadow.pvp = actor.pvp
shadow.isTank = actor.isTank
shadow.boss = actor.boss
shadow.boss_fight_component = actor.boss_fight_component
shadow.fight_component = actor.fight_component
shadow.start_time = time() - 3
shadow.end_time = time()
end
--> restaura a meta e indexes ao ator
Details.refresh:r_atributo_damage (actor, shadow)
--> copia o container de alvos (captura de dados)
for target_name, amount in _pairs (actor.targets) do
--> cria e soma o valor do total
if (not shadow.targets [target_name]) then
shadow.targets [target_name] = 0
end
end
--> copia o container de habilidades (captura de dados)
for spellid, habilidade in _pairs (actor.spells._ActorTable) do
--> cria e soma o valor
local habilidade_shadow = shadow.spells:PegaHabilidade (spellid, true, nil, true)
--> create the target value
for target_name, amount in _pairs (habilidade.targets) do
if (not habilidade_shadow.targets [target_name]) then
habilidade_shadow.targets [target_name] = 0
end
end
--> create the extra value
for spellId, amount in _pairs (habilidade.extra) do
if (not habilidade_shadow.extra [spellId]) then
habilidade_shadow.extra [spellId] = 0
end
end
end
--> copia o container de friendly fire (captura de dados)
for target_name, ff_table in _pairs (actor.friendlyfire) do
--> cria ou pega a shadow
local friendlyFire_shadow = shadow.friendlyfire [target_name] or shadow:CreateFFTable (target_name)
--> some as spells
for spellid, amount in _pairs (ff_table.spells) do
friendlyFire_shadow.spells [spellid] = 0
end
end
return shadow
end
function atributo_damage:r_connect_shadow (actor, no_refresh, combat_object)
--check if there's a custom combat, if not just use the overall container
local host_combat = combat_object or Details.tabela_overall
--check if the host combat object has a shadow actor for this actor, if not, just create one new
local overall_dano = host_combat [1]
local shadow = overall_dano._ActorTable [overall_dano._NameIndexTable [actor.nome]]
if (not shadow) then
shadow = overall_dano:PegarCombatente (actor.serial, actor.nome, actor.flag_original, true)
shadow.classe = actor.classe
shadow.spec = actor.spec
shadow.isTank = actor.isTank
shadow.grupo = actor.grupo
shadow.pvp = actor.pvp
shadow.boss = actor.boss
shadow.boss_fight_component = actor.boss_fight_component
shadow.fight_component = actor.fight_component
shadow.start_time = time() - 3
shadow.end_time = time()
end
shadow.displayName = actor.displayName or actor.nome
shadow.boss_fight_component = actor.boss_fight_component or shadow.boss_fight_component
shadow.fight_component = actor.fight_component or shadow.fight_component
shadow.grupo = actor.grupo or shadow.grupo
--check if need to restore meta tables and indexes for this actor
if (not no_refresh) then
Details.refresh:r_atributo_damage (actor, shadow)
end
--> tempo decorrido (captura de dados)
local end_time = actor.end_time
if (not actor.end_time) then
end_time = time()
end
local tempo = end_time - actor.start_time
shadow.start_time = shadow.start_time - tempo
--> pets (add unique pet names)
for _, petName in _ipairs (actor.pets) do
local hasPet = false
for i = 1, #shadow.pets do
if (shadow.pets[i] == petName) then
hasPet = true
break
end
end
if (not hasPet) then
shadow.pets [#shadow.pets+1] = petName
end
end
--> total de dano (captura de dados)
shadow.total = shadow.total + actor.total
shadow.totalabsorbed = shadow.totalabsorbed + actor.totalabsorbed
--> total de dano sem o pet (captura de dados)
shadow.total_without_pet = shadow.total_without_pet + actor.total_without_pet
--> total de dano que o ator sofreu (captura de dados)
shadow.damage_taken = shadow.damage_taken + actor.damage_taken
--> total do friendly fire causado
shadow.friendlyfire_total = shadow.friendlyfire_total + actor.friendlyfire_total
--> total no combate overall (captura de dados)
host_combat.totals[1] = host_combat.totals[1] + actor.total
if (actor.grupo) then
host_combat.totals_grupo[1] = host_combat.totals_grupo[1] + actor.total
end
--> copia o damage_from (captura de dados)
for nome, _ in _pairs (actor.damage_from) do
shadow.damage_from [nome] = true
end
--> copia o container de alvos (captura de dados)
for target_name, amount in _pairs (actor.targets) do
shadow.targets [target_name] = (shadow.targets [target_name] or 0) + amount
end
--> copiar o container de raid targets
for flag, amount in _pairs (actor.raid_targets) do
shadow.raid_targets = shadow.raid_targets or {} --deu invalido noutro dia
shadow.raid_targets [flag] = (shadow.raid_targets [flag] or 0) + amount
end
--> copia o container de habilidades (captura de dados)
for spellid, habilidade in _pairs (actor.spells._ActorTable) do
--> cria e soma o valor
local habilidade_shadow = shadow.spells:PegaHabilidade (spellid, true, nil, true)
--> refresh e soma os valores dos alvos
for target_name, amount in _pairs (habilidade.targets) do
habilidade_shadow.targets [target_name] = (habilidade_shadow.targets [target_name] or 0) + amount
end
--> refresh and add extra values
for spellId, amount in _pairs (habilidade.extra) do
habilidade_shadow.extra [spellId] = (habilidade_shadow.extra [spellId] or 0) + amount
end
--> soma todos os demais valores
for key, value in _pairs (habilidade) do
if (_type (value) == "number") then
if (key ~= "id" and key ~= "spellschool") then
if (not habilidade_shadow [key]) then
habilidade_shadow [key] = 0
end
if (key == "n_min" or key == "c_min") then
if (habilidade_shadow [key] > value) then
habilidade_shadow [key] = value
end
elseif (key == "n_max" or key == "c_max") then
if (habilidade_shadow [key] < value) then
habilidade_shadow [key] = value
end
else
habilidade_shadow [key] = habilidade_shadow [key] + value
end
end
end
end
end
--> copia o container de friendly fire (captura de dados)
for target_name, ff_table in _pairs (actor.friendlyfire) do
--> cria ou pega a shadow
local friendlyFire_shadow = shadow.friendlyfire [target_name] or shadow:CreateFFTable (target_name)
--> soma o total
friendlyFire_shadow.total = friendlyFire_shadow.total + ff_table.total
--> some as spells
for spellid, amount in _pairs (ff_table.spells) do
friendlyFire_shadow.spells [spellid] = (friendlyFire_shadow.spells [spellid] or 0) + amount
end
end
return shadow
end
function atributo_damage:ColetarLixo (lastevent)
return Details:ColetarLixo (class_type, lastevent)
end
--actor 1 is who will receive the sum from actor2
function Details.SumDamageActors(actor1, actor2, actorContainer)
--general
actor1.total = actor1.total + actor2.total
actor1.damage_taken = actor1.damage_taken + actor2.damage_taken
actor1.totalabsorbed = actor1.totalabsorbed + actor2.totalabsorbed
actor1.total_without_pet = actor1.total_without_pet + actor2.total_without_pet
actor1.friendlyfire_total = actor1.friendlyfire_total + actor2.friendlyfire_total
--damage taken from
for actorName in pairs(actor2.damage_from) do
actor1.damage_from[actorName] = true
--add the damage done to actor2 into the damage done to target1
if (actorContainer) then
--get the actor that caused the damage on actor2
local actorObject = actorContainer:GetActor(actorName)
if (actorObject) then
local damageToActor2 = (actorObject.targets[actor2.nome]) or 0
actorObject.targets[actor1.nome] = (actorObject.targets[actor1.nome] or 0) + damageToActor2
end
end
end
--targets
for actorName, damageDone in pairs(actor2.targets) do
actor1.targets[actorName] = (actor1.targets[actorName] or 0) + damageDone
end
--pets
for i = 1, #actor2.pets do
DetailsFramework.table.addunique(actor1.pets, actor2.pets[i])
end
--raid targets
for raidTargetFlag, damageDone in pairs(actor2.raid_targets) do
actor1.raid_targets[raidTargetFlag] = (actor1.raid_targets[raidTargetFlag] or 0) + damageDone
end
--friendly fire
for actorName, ffTable in pairs(actor2.friendlyfire) do
actor1.friendlyfire[actorName] = actor1.friendlyfire[actorName] or actor1:CreateFFTable(actorName)
actor1.friendlyfire[actorName].total = actor1.friendlyfire[actorName].total + ffTable.total
for spellId, damageDone in pairs(ffTable.spells) do
actor1.friendlyfire[actorName].spells[spellId] = (actor1.friendlyfire[actorName].spells[spellId] or 0) + damageDone
end
end
--spells
local ignoredKeys = {
id = true,
spellschool = true,
}
local actor1Spells = actor1.spells
for spellId, spellTable in pairs(actor2.spells._ActorTable) do
local actor1Spell = actor1Spells:GetOrCreateSpell(spellId, true, "DAMAGE_DONE")
--genetal spell attributes
for key, value in pairs(spellTable) do
if (type(value) == "number") then
if (not ignoredKeys[key]) then
if (key == "n_min" or key == "c_min") then
if (actor1Spell[key] > value) then
actor1Spell[key] = value
end
elseif (key == "n_max" or key == "c_max") then
if (actor1Spell[key] < value) then
actor1Spell[key] = value
end
else
actor1Spell[key] = actor1Spell[key] + value
end
end
end
end
--spell targets
for targetName, damageDone in pairs(spellTable) do
actor1Spell.targets[targetName] = (actor1Spell.targets[targetName] or 0) + damageDone
end
end
end
atributo_damage.__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 dano
tabela1.total = tabela1.total + tabela2.total
tabela1.totalabsorbed = tabela1.totalabsorbed + tabela2.totalabsorbed
--> total de dano sem o pet
tabela1.total_without_pet = tabela1.total_without_pet + tabela2.total_without_pet
--> total de dano que o cara levou
tabela1.damage_taken = tabela1.damage_taken + tabela2.damage_taken
--> total do friendly fire causado
tabela1.friendlyfire_total = tabela1.friendlyfire_total + tabela2.friendlyfire_total
--> soma o damage_from
for nome, _ in _pairs (tabela2.damage_from) do
tabela1.damage_from [nome] = true
end
--> pets (add unique pet names)
for _, petName in _ipairs (tabela2.pets) do
local hasPet = false
for i = 1, #tabela1.pets do
if (tabela1.pets[i] == petName) then
hasPet = true
break
end
end
if (not hasPet) then
tabela1.pets [#tabela1.pets+1] = petName
end
end
--> soma os containers de alvos
for target_name, amount in _pairs (tabela2.targets) do
tabela1.targets [target_name] = (tabela1.targets [target_name] or 0) + amount
end
--> soma o container de raid targets
for flag, amount in _pairs (tabela2.raid_targets) do
tabela1.raid_targets [flag] = (tabela1.raid_targets [flag] 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_DAMAGE", false)
--> soma os alvos
for target_name, amount in _pairs (habilidade.targets) do
habilidade_tabela1.targets[target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount
end
--> soma os extras
for spellId, amount in _pairs (habilidade.extra) do
habilidade_tabela1.extra = (habilidade_tabela1.extra [spellId] or 0) + amount
end
--> soma os valores da habilidade
for key, value in _pairs (habilidade) do
if (_type (value) == "number") then
if (key ~= "id" and key ~= "spellschool") 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
--> soma o container de friendly fire
for target_name, ff_table in _pairs (tabela2.friendlyfire) do
--> pega o ator ff no ator principal
local friendlyFire_tabela1 = tabela1.friendlyfire [target_name] or tabela1:CreateFFTable (target_name)
--> soma o total
friendlyFire_tabela1.total = friendlyFire_tabela1.total + ff_table.total
--> soma as habilidades
for spellid, amount in _pairs (ff_table.spells) do
friendlyFire_tabela1.spells [spellid] = (friendlyFire_tabela1.spells [spellid] or 0) + amount
end
end
return tabela1
end
atributo_damage.__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 dano
tabela1.total = tabela1.total - tabela2.total
tabela1.totalabsorbed = tabela1.totalabsorbed - tabela2.totalabsorbed
--> total de dano sem o pet
tabela1.total_without_pet = tabela1.total_without_pet - tabela2.total_without_pet
--> total de dano que o cara levou
tabela1.damage_taken = tabela1.damage_taken - tabela2.damage_taken
--> total do friendly fire causado
tabela1.friendlyfire_total = tabela1.friendlyfire_total - tabela2.friendlyfire_total
--> reduz os containers de alvos
for target_name, amount in _pairs (tabela2.targets) do
local alvo_tabela1 = tabela1.targets [target_name]
if (alvo_tabela1) then
tabela1.targets [target_name] = tabela1.targets [target_name] - amount
end
end
--> reduz o container de raid targets
for flag, amount in _pairs (tabela2.raid_targets) do
if (tabela1.raid_targets [flag]) then
tabela1.raid_targets [flag] = _math_max (tabela1.raid_targets [flag] - amount, 0)
end
end
--> reduz o container de habilidades
for spellid, habilidade in _pairs (tabela2.spells._ActorTable) do
--> get the spell from the first actor
local habilidade_tabela1 = tabela1.spells:PegaHabilidade (spellid, true, "SPELL_DAMAGE", false)
--> subtract targets
for target_name, amount in _pairs (habilidade.targets) do
local alvo_tabela1 = habilidade_tabela1.targets [target_name]
if (alvo_tabela1) then
habilidade_tabela1.targets [target_name] = habilidade_tabela1.targets [target_name] - amount
end
end
--> subtract extra table
for spellId, amount in _pairs (habilidade.extra) do
local extra_tabela1 = habilidade_tabela1.extra [spellId]
if (extra_tabela1) then
habilidade_tabela1.extra [spellId] = habilidade_tabela1.extra [spellId] - amount
end
end
--> subtrai os valores da habilidade
for key, value in _pairs (habilidade) do
if (_type (value) == "number") then
if (key ~= "id" and key ~= "spellschool") 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
--> reduz o container de friendly fire
for target_name, ff_table in _pairs (tabela2.friendlyfire) do
--> pega o ator ff no ator principal
local friendlyFire_tabela1 = tabela1.friendlyfire [target_name]
if (friendlyFire_tabela1) then
friendlyFire_tabela1.total = friendlyFire_tabela1.total - ff_table.total
for spellid, amount in _pairs (ff_table.spells) do
if (friendlyFire_tabela1.spells [spellid]) then
friendlyFire_tabela1.spells [spellid] = friendlyFire_tabela1.spells [spellid] - amount
end
end
end
end
return tabela1
end
function Details.refresh:r_atributo_damage (este_jogador, shadow)
--> restaura metas do ator
_setmetatable (este_jogador, Details.atributo_damage)
este_jogador.__index = Details.atributo_damage
--> restaura as metas dos containers
Details.refresh:r_container_habilidades (este_jogador.spells, shadow and shadow.spells)
end
function Details.clear:c_atributo_damage (este_jogador)
este_jogador.__index = nil
este_jogador.shadow = nil
este_jogador.links = nil
este_jogador.minha_barra = nil
Details.clear:c_container_habilidades (este_jogador.spells)
end
--[[
--> enemy damage done
i = 1
local enemy = combat (1, enemy_name)
if (enemy) then
local damage_done = 0
--> get targets
for target_name, amount in _pairs (enemy.targets) do
local player = combat (1, target_name)
if (player and player.grupo) then
local t = tooltip_temp_table [i]
if (not t) then
tooltip_temp_table [i] = {}
t = tooltip_temp_table [i]
end
t [1] = player
t [2] = amount
damage_done = damage_done + amount
i = i + 1
end
end
--> first clenup
for o = i, #tooltip_temp_table do
local t = tooltip_temp_table [o]
t[2] = 0
t[1] = 0
end
_table_sort (tooltip_temp_table, Details.Sort2)
--> enemy damage taken
Details:AddTooltipSpellHeaderText (Loc ["STRING_ATTRIBUTE_DAMAGE"], headerColor, i-1, true)
GameCooltip:AddIcon ([=[Interface\Buttons\UI-MicroStream-Green]=], 2, 1, 14, 14, 0.1875, 0.8125, 0.15625, 0.78125)
GameCooltip:AddIcon ([=[Interface\AddOns\Details\images\key_shift]=], 2, 2, Details.tooltip_key_size_width, Details.tooltip_key_size_height, 0, 1, 0, 0.640625, Details.tooltip_key_overlay2)
GameCooltip:AddStatusBar (100, 2, 0.7, g, b, 1)
--> build the tooltip
for o = 1, i-1 do
local player = tooltip_temp_table [o][1]
local total = tooltip_temp_table [o][2]
local player_name = player:name()
if (player_name:find (Details.playername)) then
GameCooltip:AddLine (player_name .. ": ", FormatTooltipNumber (_, total) .. " (" .. _cstr ("%.1f", (total / damage_done) * 100) .. "%)", 2, "yellow")
else
GameCooltip:AddLine (player_name .. ": ", FormatTooltipNumber (_, total) .." (" .. _cstr ("%.1f", (total / damage_done) * 100) .. "%)", 2)
end
local classe = player:class()
if (not classe) then
classe = "UNKNOW"
end
if (classe == "UNKNOW") then
GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", 2, nil, 14, 14, .25, .5, 0, 1)
else
GameCooltip:AddIcon (instancia.row_info.icon_file, 2, nil, 14, 14, _unpack (Details.class_coords [classe]))
end
Details:AddTooltipBackgroundStatusbar (2)
end
end
--> clean up
for o = 1, #tooltip_temp_table do
local t = tooltip_temp_table [o]
t[2] = 0
t[1] = 0
end
--]]