-- 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 tr�s 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 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 refer�ncia da barra na janela if (not thisLine) then print ("DEBUG: problema com "..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 n�o tem PS, ent�o � 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 fun��o o mais low level poss�vel 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 n�o 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 refer�ncia da barra na janela if (not thisLine) then print ("DEBUG: problema com "..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 tamb�m 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 refer�ncia da barra na janela local thisLine = instancia.barras [whichRowLine] if (not thisLine) then print ("DEBUG: problema com "..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 --> n�o 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 inst�ncia 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 n�o 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 respons�vel 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 --> n�o 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 come�a 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 n�o usadas durante um refresh for�ado if (forcar) then if (instancia.modo == 2) then --> group for i = whichRowLine, instancia.rows_fit_in_window do Details.FadeHandler.Fader (instancia.barras [i], "in", Details.fade_speed) end end end 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 "..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 --> n�o 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 anima��es 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 atualiza��o anterior if (not previousData or previousData ~= thisLine.minha_tabela or forcar) then --> aqui diz se a barra do jogador mudou de posi��o ou se ela apenas ser� atualizada if (use_animations) then thisLine.animacao_fim = esta_porcentagem else thisLine:SetValue (esta_porcentagem) thisLine.animacao_ignorar = true end thisLine.last_value = esta_porcentagem --> reseta o ultimo valor da barra return self:RefreshBarra (thisLine, instance) elseif (esta_porcentagem ~= thisLine.last_value) then --> continua mostrando a mesma tabela ent�o compara a porcentagem --> apenas atualizar if (use_animations) then thisLine.animacao_fim = esta_porcentagem else thisLine:SetValue (esta_porcentagem) end thisLine.last_value = esta_porcentagem return self:RefreshBarra (thisLine, 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 BIFURCA��O -- ~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 n�o 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 BIFURCA��O ~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 BIFURCA��O 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 n�o 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 n�o 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 n�o existir, criar ela ent�o barra = gump:CriaNovaBarraInfo2 (instancia, index) barra.textura:SetStatusBarColor (1, 1, 1, 1) --> isso aqui � a parte da sele��o e descele��o 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 � necess�rio? -- 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 � necess�rio? -- 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 n�o existir, criar ela ent�o barra = gump:CriaNovaBarraInfo3 (instancia, index) barra.textura:SetStatusBarColor (1, 1, 1, 1) --> isso aqui � a parte da sele��o e descele��o end 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 n�o existir, criar ela ent�o barra = gump:CriaNovaBarraInfo3 (instancia, index) barra.textura:SetStatusBarColor (1, 1, 1, 1) --> isso aqui � a parte da sele��o e descele��o end 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 n�o existir, criar ela ent�o barra = gump:CriaNovaBarraInfo3 (instancia, index) barra.textura:SetStatusBarColor (1, 1, 1, 1) --> isso aqui � a parte da sele��o e descele��o end 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 tempor�rias 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 inicializa��o (startup function) function atributo_damage:r_onlyrefresh_shadow (actor) --> criar uma shadow desse ator se ainda n�o 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 --]]