--lua locals local _cstr = string.format local _math_floor = math.floor local _table_sort = table.sort local _table_insert = table.insert local _table_size = table.getn local _setmetatable = setmetatable local _getmetatable = getmetatable local _ipairs = ipairs local _pairs = pairs local _rawget= rawget local _math_min = math.min local _math_max = math.max local _math_abs = math.abs local _bit_band = bit.band local _unpack = unpack local _type = type --api locals local _GetSpellInfo = _detalhes.getspellinfo local GameTooltip = GameTooltip local _IsInRaid = IsInRaid local _IsInGroup = IsInGroup local _GetNumGroupMembers = GetNumGroupMembers local _GetNumSubgroupMembers = GetNumSubgroupMembers local _UnitAura = UnitAura local _UnitGUID = UnitGUID local _UnitName = UnitName local format = _G.format local UnitIsUnit = UnitIsUnit local _string_replace = _detalhes.string.replace --details api local _detalhes = _G._detalhes local Details = _detalhes local AceLocale = LibStub ("AceLocale-3.0") local Loc = AceLocale:GetLocale ( "Details" ) local gump = _detalhes.gump local _ local alvo_da_habilidade = _detalhes.alvo_da_habilidade local container_habilidades = _detalhes.container_habilidades local container_combatentes = _detalhes.container_combatentes local container_pets = _detalhes.container_pets local atributo_misc = _detalhes.atributo_misc local habilidade_misc = _detalhes.habilidade_misc local container_damage_target = _detalhes.container_type.CONTAINER_DAMAGETARGET_CLASS local container_playernpc = _detalhes.container_type.CONTAINER_PLAYERNPC local container_misc = _detalhes.container_type.CONTAINER_MISC_CLASS local container_misc_target = _detalhes.container_type.CONTAINER_ENERGYTARGET_CLASS --local container_friendlyfire = _detalhes.container_type.CONTAINER_FRIENDLYFIRE --local modo_ALONE = _detalhes.modos.alone local modo_GROUP = _detalhes.modos.group local modo_ALL = _detalhes.modos.all local class_type = _detalhes.atributos.misc local DATA_TYPE_START = _detalhes._detalhes_props.DATA_TYPE_START local DATA_TYPE_END = _detalhes._detalhes_props.DATA_TYPE_END local div_abre = _detalhes.divisores.abre local div_fecha = _detalhes.divisores.fecha local div_lugar = _detalhes.divisores.colocacao local ToKFunctions = _detalhes.ToKFunctions local SelectedToKFunction = ToKFunctions [1] local UsingCustomLeftText = false local UsingCustomRightText = false local FormatTooltipNumber = ToKFunctions [8] local TooltipMaximizedMethod = 1 local info = _detalhes.playerDetailWindow local keyName local headerColor = "yellow" function _detalhes.SortIfHaveKey (table1, table2) if (table1[keyName] and table2[keyName]) then return table1[keyName] > table2[keyName] elseif (table1[keyName] and not table2[keyName]) then return true else return false end end function _detalhes.SortGroupIfHaveKey (table1, table2) if (table1.grupo and table2.grupo) then if (table1[keyName] and table2[keyName]) then return table1[keyName] > table2[keyName] elseif (table1[keyName] and not table2[keyName]) then return true else return false end elseif (table1.grupo and not table2.grupo) then return true elseif (not table1.grupo and table2.grupo) then return false else if (table1[keyName] and table2[keyName]) then return table1[keyName] > table2[keyName] elseif (table1[keyName] and not table2[keyName]) then return true else return false end end end function _detalhes.SortGroupMisc (container, keyName2) keyName = keyName2 return _table_sort (container, _detalhes.SortKeyGroupMisc) end function _detalhes.SortKeyGroupMisc (table1, table2) if (table1.grupo and table2.grupo) then return table1 [keyName] > table2 [keyName] elseif (table1.grupo and not table2.grupo) then return true elseif (not table1.grupo and table2.grupo) then return false else return table1 [keyName] > table2 [keyName] end end function _detalhes.SortKeySimpleMisc (table1, table2) return table1 [keyName] > table2 [keyName] end function _detalhes:ContainerSortMisc (container, amount, keyName2) keyName = keyName2 _table_sort (container, _detalhes.SortKeySimpleMisc) 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 _detalhes:GetSpellCastAmount (combat, actorName, spellId) local misc_actor = combat:GetActor (4, actorName) if (misc_actor) then local spell_cast = misc_actor.spell_cast and misc_actor.spell_cast [spellId] --try to find a spell with the same name and get the amount of casts of that spell object 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 return amount, true end end end if (not spell_cast) then return false end return spell_cast end end function atributo_misc:NovaTabela (serial, nome, link) local _new_miscActor = { last_event = 0, tipo = class_type, --> atributo 4 = misc pets = {} --> pets? okey pets } _setmetatable (_new_miscActor, atributo_misc) return _new_miscActor end function atributo_misc:CreateBuffTargetObject() return { uptime = 0, actived = false, activedamt = 0, refreshamt = 0, appliedamt = 0, } end local backgroundColor = {0, 0, 0, 1} local backgroud_bar_damage = {value = 100, texture = [[Interface\AddOns\Details\images\bar_serenity]], color = {1, 0, 0, 0.1}} function Details:ShowDeathTooltip(combatObject, deathTable) local events = deathTable[1] local timeOfDeath = deathTable[2] local maxHP = deathTable[5] local battleress = false local lastcooldown = false local GameCooltip = GameCooltip GameCooltip:Reset() GameCooltip:SetType ("tooltipbar") GameCooltip:AddLine (Loc ["STRING_REPORT_LEFTCLICK"], nil, 1, _unpack (self.click_to_report_color)) GameCooltip:AddIcon ([[Interface\TUTORIALFRAME\UI-TUTORIAL-FRAME]], 1, 1, 12, 16, 0.015625, 0.13671875, 0.4375, 0.59765625) GameCooltip:AddStatusBar (0, 1, 1, 1, 1, 1, false, {value = 100, color = {.3, .3, .3, 1}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar_serenity]]}) local barTypeColors = Details.death_log_colors --death parser for i, event in _ipairs (events) do local currentHP = event[5] local hp = floor(currentHP / maxHP * 100) if (hp > 100) then hp = 100 end local evtype = event[1] local spellName, _, spellIcon = _GetSpellInfo(event[2]) local amount = event[3] local time = event[4] local source = event[6] if (time + 12 > timeOfDeath) then if (type (evtype) == "boolean") then --is damage or heal? if (evtype) then --bool true --damage local overkill = event[10] or 0 local critical = event[11] and (" " .. TEXT_MODE_A_STRING_RESULT_CRITICAL) or "" -- (Critical) local crushing = event[12] and (" " .. TEXT_MODE_A_STRING_RESULT_CRUSHING) or "" -- (Crushing) local critOrCrush = critical .. crushing if (overkill > 0) then --> deprecated as the parser now removes the overkill damage from total damage --> this should now sum the overkill from [10] with the damage from [3] --check the type of overkill that should be shown --if show_totalhitdamage_on_overkill is true it'll show the total damage of the hit --if false it shows the total damage of the hit minus the overkill --if (not _detalhes.show_totalhitdamage_on_overkill) then -- amount = amount - overkill --end overkill = " (" .. _detalhes:ToK(overkill) .. " |cFFFF8800overkill|r)" GameCooltip:AddLine("" .. format("%.1f", time - timeOfDeath) .. "s |cFFFFFF00" .. spellName .. "|r (|cFFC6B0D9" .. source .. "|r)", "-" .. _detalhes:ToK(amount) .. critOrCrush .. overkill .. " (" .. hp .. "%)", 1, "white", "white") else overkill = "" GameCooltip:AddLine("" .. format("%.1f", time - timeOfDeath) .. "s " .. spellName .. " (|cFFC6B0D9" .. source .. "|r)", "-" .. _detalhes:ToK(amount) .. critOrCrush .. overkill .. " (" .. hp .. "%)", 1, "white", "white") end --iconTexture, frame, side, iconWidth, iconHeight, L, R, T, B GameCooltip:AddIcon(spellIcon, nil, nil, nil, nil, .1, .9, .1, .9) if (event[9]) then --friendly fire GameCooltip:AddStatusBar(hp, 1, barTypeColors.friendlyfire, true, backgroud_bar_damage) else --from a enemy GameCooltip:AddStatusBar(hp, 1, barTypeColors.damage, true, backgroud_bar_damage) end else --heal if (amount > _detalhes.deathlog_healingdone_min) then if (combatObject.is_arena) then if (amount > _detalhes.deathlog_healingdone_min_arena) then GameCooltip:AddLine("" .. format("%.1f", time - timeOfDeath) .. "s " .. spellName .. " (|cFFC6B0D9" .. source .. "|r)", "+" .. _detalhes:ToK(amount) .. " (" .. hp .. "%)", 1, "white", "white") GameCooltip:AddIcon(spellIcon, nil, nil, nil, nil, .1, .9, .1, .9) GameCooltip:AddStatusBar(hp, 1, barTypeColors.heal, true) end else GameCooltip:AddLine("" .. format("%.1f", time - timeOfDeath) .. "s " .. spellName .. " (|cFFC6B0D9" .. source .. "|r)", "+" .. _detalhes:ToK(amount) .. " (" .. hp .. "%)", 1, "white", "white") GameCooltip:AddIcon(spellIcon, nil, nil, nil, nil, .1, .9, .1, .9) GameCooltip:AddStatusBar(hp, 1, barTypeColors.heal, true) end end end elseif (type (evtype) == "number") then if (evtype == 1) then --cooldown GameCooltip:AddLine("" .. format("%.1f", time - timeOfDeath) .. "s " .. spellName .. " (" .. source .. ")", "cooldown (" .. hp .. "%)", 1, "white", "white") GameCooltip:AddIcon(spellIcon, nil, nil, nil, nil, .1, .9, .1, .9) GameCooltip:AddStatusBar(100, 1, barTypeColors.cooldown, true) elseif (evtype == 2 and not battleress) then --battle ress battleress = event elseif (evtype == 3) then --last cooldown used lastcooldown = event elseif (evtype == 4) then --debuff GameCooltip:AddLine("" .. format("%.1f", time - timeOfDeath) .. "s [x" .. amount .. "] " .. spellName .. " (" .. source .. ")", "debuff (" .. hp .. "%)", 1, "white", "white") GameCooltip:AddIcon(spellIcon) GameCooltip:AddStatusBar(100, 1, barTypeColors.debuff, true) end end end end GameCooltip:AddLine(deathTable[6] .. " " .. Loc["STRING_TIME_OF_DEATH"] , "-- -- -- ", 1, "white") GameCooltip:AddIcon("Interface\\AddOns\\Details\\images\\small_icons", 1, 1, nil, nil, .75, 1, 0, 1) GameCooltip:AddStatusBar(0, 1, .5, .5, .5, .5, false, {value = 100, color = {.5, .5, .5, 1}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar4_vidro]]}) if (battleress) then local spellName, _, spellIcon = _GetSpellInfo (battleress[2]) GameCooltip:AddLine("+" .. format("%.1f", battleress[4] - timeOfDeath) .. "s " .. spellName .. " (" .. battleress[6] .. ")", "", 1, "white") GameCooltip:AddIcon("Interface\\Glues\\CharacterSelect\\Glues-AddOn-Icons", 1, 1, nil, nil, .75, 1, 0, 1) GameCooltip:AddStatusBar(0, 1, .5, .5, .5, .5, false, {value = 100, color = {.5, .5, .5, 1}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar4_vidro]]}) end if (lastcooldown) then if (lastcooldown[3] == 1) then local spellName, _, spellIcon = _GetSpellInfo (lastcooldown[2]) GameCooltip:AddLine(format("%.1f", lastcooldown[4] - timeOfDeath) .. "s " .. spellName .. " (" .. Loc ["STRING_LAST_COOLDOWN"] .. ")") GameCooltip:AddIcon(spellIcon) else GameCooltip:AddLine(Loc ["STRING_NOLAST_COOLDOWN"]) GameCooltip:AddIcon([[Interface\CHARACTERFRAME\UI-Player-PlayTimeUnhealthy]], 1, 1, 18, 18) end GameCooltip:AddStatusBar(0, 1, 1, 1, 1, 1, false, {value = 100, color = {.3, .3, .3, 1}, specialSpark = false, texture = [[Interface\AddOns\Details\images\bar_serenity]]}) end GameCooltip:SetOption("StatusBarHeightMod", -6) GameCooltip:SetOption("FixedWidth", (type(_detalhes.death_tooltip_width) == "number" and _detalhes.death_tooltip_width) or 300) GameCooltip:SetOption("TextSize", _detalhes.tooltip.fontsize) GameCooltip:SetOption("TextFont", _detalhes.tooltip.fontface) GameCooltip:SetOption("LeftBorderSize", -4) GameCooltip:SetOption("RightBorderSize", 5) GameCooltip:SetOption("StatusBarTexture", [[Interface\AddOns\Details\images\bar4_reverse]]) GameCooltip:SetOption("StatusBarTexture", [[Interface\AddOns\Details\images\BantoBar]]) GameCooltip:SetWallpaper(1, [[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0.64453125, 0}, {.8, .8, .8, 0.2}, true) GameCooltip:SetBackdrop(1, _detalhes.tooltip_backdrop, backgroundColor, _detalhes.tooltip_border_color) end function _detalhes:ToolTipDead (instancia, morte, esta_barra) local GameCooltip = GameCooltip Details:ShowDeathTooltip(instancia:GetShowingCombat(), morte) local myPoint = _detalhes.tooltip.anchor_point local anchorPoint = _detalhes.tooltip.anchor_relative local x_Offset = _detalhes.tooltip.anchor_offset[1] local y_Offset = _detalhes.tooltip.anchor_offset[2] if (_detalhes.tooltip.anchored_to == 1) then GameCooltip:SetHost (esta_barra, myPoint, anchorPoint, x_Offset, y_Offset) else GameCooltip:SetHost (DetailsTooltipAnchor, myPoint, anchorPoint, x_Offset, y_Offset) end GameCooltip:ShowCooltip() end local function RefreshBarraMorte (morte, barra, instancia) atributo_misc:DeadAtualizarBarra (morte, morte.minha_barra, barra.colocacao, instancia) end --objeto death: --[1] tabela [2] time [3] nome [4] classe [5] maxhealth [6] time of death --[1] true damage/ false heal [2] spellid [3] amount [4] time [5] current health [6] source local report_table = {} local ReportSingleDeathFunc = function (IsCurrent, IsReverse, AmtLines) AmtLines = AmtLines + 1 local t = {} for i = 1, _math_min (#report_table, AmtLines) do local table = report_table [i] t [#t+1] = table [1] .. table [4] .. table [2] .. table [3] end local title = tremove (t, 1) t = _detalhes.table.reverse (t) tinsert (t, 1, title) _detalhes:SendReportLines (t) end function atributo_misc:ReportSingleDeadLine (morte, instancia) local barra = instancia.barras [morte.minha_barra] local max_health = morte [5] local time_of_death = morte [2] do if (not _detalhes.fontstring_len) then _detalhes.fontstring_len = _detalhes.listener:CreateFontString (nil, "background", "GameFontNormal") end local _, fontSize = FCF_GetChatWindowInfo (1) if (fontSize < 1) then fontSize = 10 end local fonte, _, flags = _detalhes.fontstring_len:GetFont() _detalhes.fontstring_len:SetFont (fonte, fontSize, flags) _detalhes.fontstring_len:SetText ("thisisspacement") end local default_len = _detalhes.fontstring_len:GetStringWidth() wipe (report_table) local report_array = report_table report_array[1] = {"Details! " .. Loc ["STRING_REPORT_SINGLE_DEATH"] .. " " .. morte [3] .. " " .. Loc ["STRING_ACTORFRAME_REPORTAT"] .. " " .. morte [6], "", "", ""} for index, evento in _ipairs (_detalhes.table.reverse (morte [1])) do if (evento [1] and type (evento [1]) == "boolean") then --> damage if (evento [3]) then local elapsed = _cstr ("%.1f", evento [4] - time_of_death) .."s" local spellname, _, spellicon = _GetSpellInfo (evento [2]) local spelllink if (evento [2] == 1) then spelllink = GetSpellLink (6603) elseif (evento [2] > 10) then spelllink = GetSpellLink (evento [2]) else spelllink = spellname end local source = _detalhes:GetOnlyName (evento [6]) local amount = evento [3] local hp = _math_floor (evento [5] / max_health * 100) if (hp > 100) then hp = 100 end tinsert (report_array, {elapsed .. " ", spelllink, " (" .. source .. ")", "-" .. _detalhes:ToK (amount) .. " (" .. hp .. "%) "}) end elseif (not evento [1] and type (evento [1]) == "boolean") then --> heal local amount = evento [3] if (amount > _detalhes.deathlog_healingdone_min) then local elapsed = _cstr ("%.1f", evento [4] - time_of_death) .."s" local spelllink = GetSpellLink (evento [2]) local source = _detalhes:GetOnlyName (evento [6]) local spellname, _, spellicon = _GetSpellInfo (evento [2]) local hp = _math_floor (evento [5] / max_health * 100) if (hp > 100) then hp = 100 end if (_detalhes.report_heal_links) then tinsert (report_array, {elapsed .. " ", spelllink, " (" .. source .. ")", "+" .. _detalhes:ToK (amount) .. " (" .. hp .. "%) "}) else tinsert (report_array, {elapsed .. " ", spellname, " (" .. source .. ")", "+" .. _detalhes:ToK (amount) .. " (" .. hp .. "%) "}) end end elseif (type (evento [1]) == "number" and evento [1] == 4) then --> debuff local elapsed = _cstr ("%.1f", evento [4] - time_of_death) .."s" local spelllink = GetSpellLink (evento [2]) local source = _detalhes:GetOnlyName (evento [6]) local spellname, _, spellicon = _GetSpellInfo (evento [2]) local stacks = evento [3] local hp = _math_floor (evento [5] / max_health * 100) if (hp > 100) then hp = 100 end tinsert (report_array, {elapsed .. " ", "x" .. stacks .. "" .. spelllink, " (" .. source .. ")", "(" .. hp .. "%) "}) end end _detalhes:SendReportWindow (ReportSingleDeathFunc, nil, nil, true) end function atributo_misc:ReportSingleCooldownLine (misc_actor, instancia) local reportar if (instancia.segmento == -1) then --overall reportar = {"Details!: " .. misc_actor.nome .. " - " .. Loc ["STRING_OVERALL"] .. " " .. Loc ["STRING_ATTRIBUTE_MISC_DEFENSIVE_COOLDOWNS"]} else reportar = {"Details!: " .. misc_actor.nome .. " - " .. Loc ["STRING_ATTRIBUTE_MISC_DEFENSIVE_COOLDOWNS"]} end local meu_total = _math_floor (misc_actor.cooldowns_defensive) local cooldowns = misc_actor.cooldowns_defensive_spells._ActorTable local cooldowns_used = {} for spellid, spell in _pairs (cooldowns) do cooldowns_used [#cooldowns_used+1] = {spellid, spell.counter, spell} end _table_sort (cooldowns_used, _detalhes.Sort2) for i, spell in _ipairs (cooldowns_used) do local spelllink = GetSpellLink (spell [1]) reportar [#reportar+1] = spelllink .. ": " .. spell [2] for target_name, amount in _pairs (spell[3].targets) do if (target_name ~= misc_actor.nome and target_name ~= Loc ["STRING_RAID_WIDE"] and amount > 0) then reportar [#reportar+1] = " -" .. target_name .. ": " .. amount end end end return _detalhes:Reportar (reportar, {_no_current = true, _no_inverse = true, _custom = true}) end local buff_format_name = function (spellid) if (_type (spellid) == "string") then return spellid end return _detalhes:GetSpellLink (spellid) end local buff_format_amount = function (t) local total, percent = unpack (t) local m, s = _math_floor (total / 60), _math_floor (total % 60) return _cstr ("%.1f", percent) .. "% (" .. m .. "m " .. s .. "s)" end local sort_buff_report = function (t1, t2) return t1[2][1] > t2[2][1] end function atributo_misc:ReportSingleBuffUptimeLine (misc_actor, instance) local report_table = {"Details!: " .. misc_actor.nome .. " - " .. Loc ["STRING_ATTRIBUTE_MISC_BUFF_UPTIME"]} local buffs = {} local combat_time = instance.showing:GetCombatTime() for spellid, spell in _pairs (misc_actor.buff_uptime_spells._ActorTable) do local percent = spell.uptime / combat_time * 100 if (percent < 99.5) then buffs [#buffs+1] = {spellid, {spell.uptime, percent}} end end _table_sort (buffs, sort_buff_report) _detalhes:FormatReportLines (report_table, buffs, buff_format_name, buff_format_amount) return _detalhes:Reportar (report_table, {_no_current = true, _no_inverse = true, _custom = true}) end function atributo_misc:ReportSingleDebuffUptimeLine (misc_actor, instance) local report_table = {"Details!: " .. misc_actor.nome .. " - " .. Loc ["STRING_ATTRIBUTE_MISC_DEBUFF_UPTIME"]} local debuffs = {} local combat_time = instance.showing:GetCombatTime() for spellid, spell in _pairs (misc_actor.debuff_uptime_spells._ActorTable) do local percent = spell.uptime / combat_time * 100 debuffs [#debuffs+1] = {spellid, {spell.uptime, percent}} end _table_sort (debuffs, sort_buff_report) _detalhes:FormatReportLines (report_table, debuffs, buff_format_name, buff_format_amount) return _detalhes:Reportar (report_table, {_no_current = true, _no_inverse = true, _custom = true}) end function atributo_misc:DeadAtualizarBarra (morte, whichRowLine, colocacao, instancia) morte ["dead"] = true --> marca que esta tabela � uma tabela de mortes, usado no controla na hora de montar o tooltip local esta_barra = instancia.barras[whichRowLine] --> pega a refer�ncia da barra na janela if (not esta_barra) then print ("DEBUG: problema com "..whichRowLine.." "..lugar) return end local tabela_anterior = esta_barra.minha_tabela esta_barra.minha_tabela = morte morte.nome = morte [3] --> evita dar erro ao redimencionar a janela morte.minha_barra = whichRowLine esta_barra.colocacao = colocacao if (not _getmetatable (morte)) then _setmetatable (morte, {__call = RefreshBarraMorte}) morte._custom = true end esta_barra.lineText1:SetText (colocacao .. ". " .. morte [3]:gsub (("%-.*"), "")) esta_barra.lineText2:SetText("") esta_barra.lineText3:SetText("") esta_barra.lineText4:SetText (morte [6]) esta_barra:SetValue (100) if (esta_barra.hidden or esta_barra.fading_in or esta_barra.faded) then Details.FadeHandler.Fader (esta_barra, "out") end --> seta a cor da barra e a cor do texto caso eles esteja mostrando com a cor da classe local r, g, b, a = _unpack (_detalhes.class_colors [morte[4]]) _detalhes:SetBarColors (esta_barra, instancia, r, g, b, a) if (instancia.row_info.use_spec_icons) then local nome = morte[3] local spec = instancia.showing (1, nome) and instancia.showing (1, nome).spec or (instancia.showing (2, nome) and instancia.showing (2, nome).spec) if (spec and spec ~= 0) then esta_barra.icone_classe:SetTexture (instancia.row_info.spec_file) esta_barra.icone_classe:SetTexCoord (_unpack (_detalhes.class_specs_coords[spec])) else if (CLASS_ICON_TCOORDS [morte[4]]) then esta_barra.icone_classe:SetTexture (instancia.row_info.icon_file) esta_barra.icone_classe:SetTexCoord (_unpack (CLASS_ICON_TCOORDS [morte[4]])) else local texture, l, r, t, b = Details:GetUnknownClassIcon() esta_barra.icone_classe:SetTexture(texture) esta_barra.icone_classe:SetTexCoord(l, r, t, b) end end else if (CLASS_ICON_TCOORDS [morte[4]]) then esta_barra.icone_classe:SetTexture (instancia.row_info.icon_file) esta_barra.icone_classe:SetTexCoord (_unpack (CLASS_ICON_TCOORDS [morte[4]])) else local texture, l, r, t, b = Details:GetUnknownClassIcon() esta_barra.icone_classe:SetTexture(texture) esta_barra.icone_classe:SetTexCoord(l, r, t, b) end end esta_barra.icone_classe:SetVertexColor (1, 1, 1) if (esta_barra.mouse_over and not instancia.baseframe.isMoving) then --> precisa atualizar o tooltip gump:UpdateTooltip (whichRowLine, esta_barra, instancia) end esta_barra.lineText1:SetSize (esta_barra:GetWidth() - esta_barra.lineText4:GetStringWidth() - 20, 15) end function atributo_misc: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 if (#showing._ActorTable < 1) then --> n�o h� barras para mostrar return _detalhes:EsconderBarrasNaoUsadas (instancia, showing), "", 0, 0 end local total = 0 instancia.top = 0 local sub_atributo = instancia.sub_atributo --> o que esta sendo mostrado nesta inst�ncia local conteudo = showing._ActorTable local amount = #conteudo local modo = instancia.modo if (exportar) then if (_type (exportar) == "boolean") then if (sub_atributo == 1) then --> CC BREAKS keyName = "cc_break" elseif (sub_atributo == 2) then --> RESS keyName = "ress" elseif (sub_atributo == 3) then --> INTERRUPT keyName = "interrupt" elseif (sub_atributo == 4) then --> DISPELLS keyName = "dispell" elseif (sub_atributo == 5) then --> DEATHS keyName = "dead" elseif (sub_atributo == 6) then --> DEFENSIVE COOLDOWNS keyName = "cooldowns_defensive" elseif (sub_atributo == 7) then --> BUFF UPTIME keyName = "buff_uptime" elseif (sub_atributo == 8) then --> DEBUFF UPTIME keyName = "debuff_uptime" 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 --> pega qual a sub key que ser� usada if (sub_atributo == 1) then --> CC BREAKS keyName = "cc_break" elseif (sub_atributo == 2) then --> RESS keyName = "ress" elseif (sub_atributo == 3) then --> INTERRUPT keyName = "interrupt" elseif (sub_atributo == 4) then --> DISPELLS keyName = "dispell" elseif (sub_atributo == 5) then --> DEATHS keyName = "dead" elseif (sub_atributo == 6) then --> DEFENSIVE COOLDOWNS keyName = "cooldowns_defensive" elseif (sub_atributo == 7) then --> BUFF UPTIME keyName = "buff_uptime" elseif (sub_atributo == 8) then --> DEBUFF UPTIME keyName = "debuff_uptime" end end if (keyName == "dead") then local mortes = tabela_do_combate.last_events_tables --> n�o precisa reordenar, uma vez que sempre vai da na ordem do �ltimo a morrer at� o primeiro -- _table_sort (mortes, function (m1, m2) return m1[2] < m2[2] end) -- [1] = tabela com a morte [2] = tempo [3] = nome do jogador instancia.top = 1 total = #mortes if (exportar) then return mortes end if (total < 1) then instancia:EsconderScrollBar() return _detalhes:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh end --estra mostrando ALL ent�o posso seguir o padr�o correto? primeiro, atualiza a scroll bar... instancia:RefreshScrollBar (total) --depois faz a atualiza��o normal dele atrav�s dos_ iterators local whichRowLine = 1 local barras_container = instancia.barras local percentage_type = instancia.row_info.percent_type for i = instancia.barraS[1], instancia.barraS[2], 1 do --> vai atualizar s� o range que esta sendo mostrado if (mortes[i]) then --> corre��o para um raro e desconhecido problema onde mortes[i] � nil atributo_misc:DeadAtualizarBarra (mortes[i], whichRowLine, i, instancia) whichRowLine = whichRowLine+1 end end return _detalhes:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh else if (instancia.atributo == 5) then --> custom --> faz o sort da categoria e retorna o amount corrigido _table_sort (conteudo, _detalhes.SortIfHaveKey) --> n�o mostrar resultados com zero for i = amount, 1, -1 do --> de tr�s pra frente if (not conteudo[i][keyName] or conteudo[i][keyName] < 1) then amount = amount - 1 else break end end --> pega o total ja aplicado na tabela do combate total = tabela_do_combate.totals [class_type] [keyName] --> grava o total instancia.top = conteudo[1][keyName] elseif (modo == modo_ALL) then --> mostrando ALL _table_sort (conteudo, _detalhes.SortIfHaveKey) --> n�o mostrar resultados com zero for i = amount, 1, -1 do --> de tr�s pra frente if (not conteudo[i][keyName] or conteudo[i][keyName] < 1) then amount = amount - 1 else break end end --> pega o total ja aplicado na tabela do combate total = tabela_do_combate.totals [class_type] [keyName] --> grava o total instancia.top = conteudo[1][keyName] elseif (modo == modo_GROUP) then --> mostrando GROUP --if (refresh_needed) then _table_sort (conteudo, _detalhes.SortGroupIfHaveKey) --end for index, player in _ipairs (conteudo) do if (player.grupo) then --> � um player e esta em grupo if (not player[keyName] or player[keyName] < 1) then --> dano menor que 1, interromper o loop amount = index - 1 break elseif (index == 1) then --> esse IF aqui, precisa mesmo ser aqui? n�o daria pra pega-lo com uma chave [1] nad grupo == true? instancia.top = conteudo[1][keyName] end total = total + player[keyName] else amount = index-1 break end end end end --> refaz o mapa do container showing:remapear() if (exportar) then return total, keyName, instancia.top, amount end if (amount < 1) then --> n�o h� barras para mostrar instancia:EsconderScrollBar() --> precisaria esconder a scroll bar return _detalhes:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh end --estra mostrando ALL ent�o posso seguir o padr�o correto? primeiro, atualiza a scroll bar... instancia:RefreshScrollBar (amount) --depois faz a atualiza��o normal dele atrav�s dos_ iterators local whichRowLine = 1 local barras_container = instancia.barras 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 use_animations = _detalhes.is_using_row_animations and (not instancia.baseframe.isStretching and not forcar) if (total == 0) then total = 0.00000001 end UsingCustomLeftText = instancia.row_info.textL_enable_custom_text UsingCustomRightText = instancia.row_info.textR_enable_custom_text if (instancia.bars_sort_direction == 1) then --top to bottom for i = instancia.barraS[1], instancia.barraS[2], 1 do --> vai atualizar s� o range que esta sendo mostrado conteudo[i]:RefreshLine (instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, nil, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end elseif (instancia.bars_sort_direction == 2) then --bottom to top for i = instancia.barraS[2], instancia.barraS[1], -1 do --> vai atualizar s� o range que esta sendo mostrado if (conteudo[i]) then conteudo[i]:RefreshLine (instancia, barras_container, whichRowLine, i, total, sub_atributo, forcar, keyName, nil, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end end end if (use_animations) then instancia:PerformAnimations (whichRowLine-1) end if (instancia.atributo == 5) then --> custom --> zerar o .custom dos_ Actors for index, player in _ipairs (conteudo) do if (player.custom > 0) then player.custom = 0 else break end end end --> beta, hidar barras n�o usadas durante um refresh for�ado if (forcar) then if (instancia.modo == 2) then --> group for i = whichRowLine, instancia.rows_fit_in_window do Details.FadeHandler.Fader (instancia.barras [i], "in", Details.fade_speed) end end end return _detalhes:EndRefresh (instancia, total, tabela_do_combate, showing) --> retorna a tabela que precisa ganhar o refresh end local actor_class_color_r, actor_class_color_g, actor_class_color_b function atributo_misc:RefreshLine (instancia, barras_container, whichRowLine, lugar, total, sub_atributo, forcar, keyName, is_dead, percentage_type, use_animations, bars_show_data, bars_brackets, bars_separator) local esta_barra = instancia.barras[whichRowLine] --> pega a refer�ncia da barra na janela if (not esta_barra) then print ("DEBUG: problema com "..whichRowLine.." "..lugar) return end local tabela_anterior = esta_barra.minha_tabela esta_barra.minha_tabela = self esta_barra.colocacao = lugar self.minha_barra = esta_barra self.colocacao = lugar local meu_total = _math_floor (self [keyName] or 0) --> total if (not meu_total) then return end --local porcentagem = meu_total / total * 100 if (not percentage_type or percentage_type == 1) then porcentagem = _cstr ("%.1f", meu_total / total * 100) elseif (percentage_type == 2) then porcentagem = _cstr ("%.1f", meu_total / instancia.top * 100) end local esta_porcentagem = _math_floor ((meu_total/instancia.top) * 100) if (not bars_show_data [1]) then meu_total = "" end if (not bars_show_data [3]) then porcentagem = "" else porcentagem = porcentagem .. "%" end local rightText = meu_total .. bars_brackets[1] .. porcentagem .. bars_brackets[2] if (UsingCustomRightText) then esta_barra.lineText4:SetText (_string_replace (instancia.row_info.textR_custom_text, meu_total, "", porcentagem, self, instancia.showing, instancia, rightText)) else if (instancia.use_multi_fontstrings) then instancia:SetTextsOnLine(esta_barra, "", meu_total, porcentagem) else esta_barra.lineText4:SetText(rightText) end end if (esta_barra.mouse_over and not instancia.baseframe.isMoving) then --> precisa atualizar o tooltip gump:UpdateTooltip (whichRowLine, esta_barra, instancia) end actor_class_color_r, actor_class_color_g, actor_class_color_b = self:GetBarColor() return self:RefreshBarra2 (esta_barra, instancia, tabela_anterior, forcar, esta_porcentagem, whichRowLine, barras_container, use_animations) end function atributo_misc:RefreshBarra2 (esta_barra, instancia, tabela_anterior, forcar, esta_porcentagem, whichRowLine, barras_container, use_animations) --> primeiro colocado if (esta_barra.colocacao == 1) then if (not tabela_anterior or tabela_anterior ~= esta_barra.minha_tabela or forcar) then esta_barra:SetValue (100) if (esta_barra.hidden or esta_barra.fading_in or esta_barra.faded) then Details.FadeHandler.Fader (esta_barra, "out") end return self:RefreshBarra (esta_barra, instancia) else return end else if (esta_barra.hidden or esta_barra.fading_in or esta_barra.faded) then if (use_animations) then esta_barra.animacao_fim = esta_porcentagem else esta_barra:SetValue (esta_porcentagem) esta_barra.animacao_ignorar = true end Details.FadeHandler.Fader (esta_barra, "out") if (instancia.row_info.texture_class_colors) then esta_barra.textura:SetVertexColor (actor_class_color_r, actor_class_color_g, actor_class_color_b) end if (instancia.row_info.texture_background_class_color) then esta_barra.background:SetVertexColor (actor_class_color_r, actor_class_color_g, actor_class_color_b) end return self:RefreshBarra (esta_barra, instancia) else --> agora esta comparando se a tabela da barra � diferente da tabela na atualiza��o anterior if (not tabela_anterior or tabela_anterior ~= esta_barra.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 esta_barra.animacao_fim = esta_porcentagem else esta_barra:SetValue (esta_porcentagem) esta_barra.animacao_ignorar = true end esta_barra.last_value = esta_porcentagem --> reseta o ultimo valor da barra return self:RefreshBarra (esta_barra, instancia) elseif (esta_porcentagem ~= esta_barra.last_value) then --> continua mostrando a mesma tabela ent�o compara a porcentagem --> apenas atualizar if (use_animations) then esta_barra.animacao_fim = esta_porcentagem else esta_barra:SetValue (esta_porcentagem) end esta_barra.last_value = esta_porcentagem return self:RefreshBarra (esta_barra, instancia) end end end end function atributo_misc:RefreshBarra (esta_barra, instancia, from_resize) local class, enemy, arena_enemy, arena_ally = self.classe, self.enemy, self.arena_enemy, self.arena_ally if (from_resize) then actor_class_color_r, actor_class_color_g, actor_class_color_b = self:GetBarColor() end --> icon self:SetClassIcon (esta_barra.icone_classe, instancia, class) --> texture color self:SetBarColors (esta_barra, instancia, actor_class_color_r, actor_class_color_g, actor_class_color_b) --> left text self:SetBarLeftText (esta_barra, instancia, enemy, arena_enemy, arena_ally, UsingCustomLeftText) esta_barra.lineText1:SetSize (esta_barra:GetWidth() - esta_barra.lineText4:GetStringWidth() - 20, 15) end --------------------------------------------- // TOOLTIPS // --------------------------------------------- ---------> TOOLTIPS BIFURCA��O ~tooltip function atributo_misc:ToolTip (instancia, numero, barra, keydown) --> seria possivel aqui colocar o icone da classe dele? GameTooltip:ClearLines() GameTooltip:AddLine (barra.colocacao..". "..self.nome) if (instancia.sub_atributo == 3) then --> interrupt return self:ToolTipInterrupt (instancia, numero, barra, keydown) elseif (instancia.sub_atributo == 1) then --> cc_break return self:ToolTipCC (instancia, numero, barra, keydown) elseif (instancia.sub_atributo == 2) then --> ress return self:ToolTipRess (instancia, numero, barra, keydown) elseif (instancia.sub_atributo == 4) then --> dispell return self:ToolTipDispell (instancia, numero, barra, keydown) elseif (instancia.sub_atributo == 5) then --> mortes return self:ToolTipDead (instancia, numero, barra, keydown) elseif (instancia.sub_atributo == 6) then --> defensive cooldowns return self:ToolTipDefensiveCooldowns (instancia, numero, barra, keydown) elseif (instancia.sub_atributo == 7) then --> buff uptime return self:ToolTipBuffUptime (instancia, numero, barra, keydown) elseif (instancia.sub_atributo == 8) then --> debuff uptime return self:ToolTipDebuffUptime (instancia, numero, barra, keydown) end end --> tooltip locals local r, g, b local barAlha = .6 function atributo_misc:ToolTipDead (instancia, numero, barra) local last_dead = self.dead_log [#self.dead_log] end function atributo_misc:ToolTipCC (instancia, numero, barra) local owner = self.owner if (owner and owner.classe) then r, g, b = unpack (_detalhes.class_colors [owner.classe]) else r, g, b = unpack (_detalhes.class_colors [self.classe]) end local meu_total = self ["cc_break"] local habilidades = self.cc_break_spells._ActorTable --> habilidade usada para tirar o CC local icon_size = _detalhes.tooltip.icon_size local icon_border = _detalhes.tooltip.icon_border_texcoord local lineHeight = _detalhes.tooltip.line_height local icon_border = _detalhes.tooltip.icon_border_texcoord for _spellid, _tabela in _pairs (habilidades) do --> quantidade local nome_magia, _, icone_magia = _GetSpellInfo (_spellid) GameCooltip:AddLine (nome_magia, _tabela.cc_break .. " (" .. _cstr ("%.1f", _tabela.cc_break / meu_total * 100) .. "%)") GameCooltip:AddIcon (icone_magia, nil, nil, lineHeight, lineHeight, icon_border.L, icon_border.R, icon_border.T, icon_border.B) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) --> o que quebrou local quebrou_oque = _tabela.cc_break_oque for spellid_quebrada, amt_quebrada in _pairs (_tabela.cc_break_oque) do local nome_magia, _, icone_magia = _GetSpellInfo (spellid_quebrada) GameCooltip:AddLine (nome_magia, amt_quebrada .. " ") GameCooltip:AddIcon ([[Interface\Buttons\UI-GroupLoot-Pass-Down]], nil, 1, 14, 14) GameCooltip:AddIcon (icone_magia, nil, 2, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) GameCooltip:AddStatusBar (100, 1, 1, 0, 0, .2) end --> em quem quebrou for target_name, amount in _pairs (_tabela.targets) do GameCooltip:AddLine (target_name .. ": ", amount .. " ") local classe = _detalhes:GetClass (target_name) GameCooltip:AddIcon ([[Interface\AddOns\Details\images\espadas]], nil, 1, lineHeight, lineHeight) if (classe) then GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small]], nil, 2, lineHeight, lineHeight, unpack (_detalhes.class_coords [classe])) else GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, 2, lineHeight, lineHeight, .25, .5, 0, 1) end _detalhes:AddTooltipBackgroundStatusbar() end end return true end function atributo_misc:ToolTipDispell (instancia, numero, barra) local owner = self.owner if (owner and owner.classe) then r, g, b = unpack (_detalhes.class_colors [owner.classe]) else r, g, b = unpack (_detalhes.class_colors [self.classe]) end local meu_total = _math_floor (self ["dispell"]) local habilidades = self.dispell_spells._ActorTable --> habilidade usada para dispelar local meus_dispells = {} for _spellid, _tabela in _pairs (habilidades) do if (_tabela.dispell) then meus_dispells [#meus_dispells+1] = {_spellid, _math_floor (_tabela.dispell)} --_math_floor valor é nil, uma magia na tabela de dispel, sem dispel? else Details:Msg("D! table.dispell is invalid. spellId:", _spellid) end end _table_sort (meus_dispells, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #meus_dispells, [[Interface\ICONS\Spell_Arcane_ArcaneTorrent]], 0.078125, 0.9375, 0.078125, 0.953125) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) local icon_size = _detalhes.tooltip.icon_size local icon_border = _detalhes.tooltip.icon_border_texcoord if (#meus_dispells > 0) then for i = 1, _math_min (25, #meus_dispells) do local esta_habilidade = meus_dispells[i] local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1]) GameCooltip:AddLine (nome_magia, esta_habilidade[2].." (".._cstr("%.1f", esta_habilidade[2]/meu_total*100).."%)") GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) _detalhes:AddTooltipBackgroundStatusbar() end else GameTooltip:AddLine (Loc ["STRING_NO_SPELL"]) end --> quais habilidades foram dispaladas local buffs_dispelados = {} for _spellid, amt in _pairs (self.dispell_oque) do buffs_dispelados [#buffs_dispelados+1] = {_spellid, amt} end _table_sort (buffs_dispelados, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_DISPELLED"], headerColor, #buffs_dispelados, [[Interface\ICONS\Spell_Arcane_ManaTap]], 0.078125, 0.9375, 0.078125, 0.953125) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) if (#buffs_dispelados > 0) then for i = 1, _math_min (25, #buffs_dispelados) do local esta_habilidade = buffs_dispelados[i] local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1]) GameCooltip:AddLine (nome_magia, esta_habilidade[2].." (".._cstr("%.1f", esta_habilidade[2]/meu_total*100).."%)") GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) _detalhes:AddTooltipBackgroundStatusbar() end end --> alvos dispelados local alvos_dispelados = {} for target_name, amount in _pairs (self.dispell_targets) do alvos_dispelados [#alvos_dispelados + 1] = {target_name, _math_floor (amount), amount / meu_total * 100} end _table_sort (alvos_dispelados, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_TARGETS"], headerColor, #alvos_dispelados, [[Interface\ICONS\ACHIEVEMENT_GUILDPERK_EVERYONES A HERO_RANK2]], 0.078125, 0.9375, 0.078125, 0.953125) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) for i = 1, _math_min (25, #alvos_dispelados) do if (alvos_dispelados[i][2] < 1) then break end GameCooltip:AddLine (alvos_dispelados[i][1], _detalhes:comma_value (alvos_dispelados[i][2]) .." (".._cstr ("%.1f", alvos_dispelados[i][3]).."%)") _detalhes:AddTooltipBackgroundStatusbar() local targetActor = instancia.showing[4]:PegarCombatente (_, alvos_dispelados[i][1]) if (targetActor) then local classe = targetActor.classe if (not classe) then classe = "UNKNOW" end if (classe == "UNKNOW") then GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, 14, 14, .25, .5, 0, 1) else GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, 14, 14, _unpack (_detalhes.class_coords [classe])) end end end --> Pet local meus_pets = self.pets if (#meus_pets > 0) then --> teve ajudantes local quantidade = {} --> armazena a quantidade de pets iguais local interrupts = {} --> armazena as habilidades local alvos = {} --> armazena os alvos local totais = {} --> armazena o dano total de cada objeto for index, nome in _ipairs (meus_pets) do if (not quantidade [nome]) then quantidade [nome] = 1 local my_self = instancia.showing[class_type]:PegarCombatente (nil, nome) if (my_self and my_self.dispell) then totais [#totais+1] = {nome, my_self.dispell} end else quantidade [nome] = quantidade [nome]+1 end end local _quantidade = 0 local added_logo = false _table_sort (totais, _detalhes.Sort2) local ismaximized = false if (keydown == "alt" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 5) then ismaximized = true end for index, _table in _ipairs (totais) do if (_table [2] > 0 and (index < 3 or ismaximized)) then if (not added_logo) then added_logo = true _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_PETS"], headerColor, #totais, [[Interface\COMMON\friendship-heart]], 0.21875, 0.78125, 0.09375, 0.6875) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) end local n = _table [1]:gsub (("%s%<.*"), "") GameCooltip:AddLine (n, _table [2] .. " (" .. _math_floor (_table [2]/self.dispell*100) .. "%)") _detalhes:AddTooltipBackgroundStatusbar() GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small]], 1, 1, 14, 14, 0.25, 0.49609375, 0.75, 1) end end end return true end local UnitReaction = UnitReaction local UnitDebuff = UnitDebuff function _detalhes:CloseEnemyDebuffsUptime() local combat = _detalhes.tabela_vigente local misc_container = combat [4]._ActorTable for _, actor in _ipairs (misc_container) do if (actor.boss_debuff) then for target_name, target in _ipairs (actor.debuff_uptime_targets) do if (target.actived and target.actived_at) then target.uptime = target.uptime + _detalhes._tempo - target.actived_at actor.debuff_uptime = actor.debuff_uptime + _detalhes._tempo - target.actived_at target.actived = false target.actived_at = nil end end end end return end function _detalhes:CatchRaidDebuffUptime (in_or_out) -- "DEBUFF_UPTIME_IN" if (in_or_out == "DEBUFF_UPTIME_OUT") then local combat = _detalhes.tabela_vigente local misc_container = combat [4]._ActorTable for _, actor in _ipairs (misc_container) do if (actor.debuff_uptime) then for spellid, spell in _pairs (actor.debuff_uptime_spells._ActorTable) do if (spell.actived and spell.actived_at) then spell.uptime = spell.uptime + _detalhes._tempo - spell.actived_at actor.debuff_uptime = actor.debuff_uptime + _detalhes._tempo - spell.actived_at spell.actived = false spell.actived_at = nil end end end end return end local cacheGetTime = GetTime() if (_IsInRaid()) then local checked = {} for raidIndex = 1, _GetNumGroupMembers() do local target = "raid"..raidIndex.."target" local his_target = _UnitGUID (target) if (his_target and not checked [his_target]) then local rect = UnitReaction (target, "player") if (rect and rect <= 4) then checked [his_target] = true for debuffIndex = 1, 41 do local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff (target, debuffIndex) if (name and unitCaster) then local playerGUID = _UnitGUID (unitCaster) if (playerGUID) then local playerName, realmName = _UnitName (unitCaster) if (realmName and realmName ~= "") then playerName = playerName .. "-" .. realmName end _detalhes.parser:add_debuff_uptime (nil, cacheGetTime, playerGUID, playerName, 0x00000417, his_target, _UnitName (target), 0x842, nil, spellid, name, in_or_out) end end end end end end elseif (_IsInGroup()) then local checked = {} for raidIndex = 1, _GetNumGroupMembers()-1 do local his_target = _UnitGUID ("party"..raidIndex.."target") local rect = UnitReaction ("party"..raidIndex.."target", "player") if (his_target and not checked [his_target] and rect and rect <= 4) then checked [his_target] = true for debuffIndex = 1, 40 do local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("party"..raidIndex.."target", debuffIndex) if (name and unitCaster) then local playerName, realmName = _UnitName (unitCaster) local playerGUID = _UnitGUID (unitCaster) if (playerGUID) then if (realmName and realmName ~= "") then playerName = playerName .. "-" .. realmName end _detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("party"..raidIndex.."target"), 0x842, nil, spellid, name, in_or_out) end end end end end local his_target = _UnitGUID ("playertarget") local rect = UnitReaction ("playertarget", "player") if (his_target and not checked [his_target] and rect and rect <= 4) then for debuffIndex = 1, 40 do local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("playertarget", debuffIndex) if (name and unitCaster) then local playerName, realmName = _UnitName (unitCaster) local playerGUID = _UnitGUID (unitCaster) if (playerGUID) then if (realmName and realmName ~= "") then playerName = playerName .. "-" .. realmName end _detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("playertarget"), 0x842, nil, spellid, name, in_or_out) end end end end else local his_target = _UnitGUID ("playertarget") if (his_target) then local reaction = UnitReaction ("playertarget", "player") if (reaction and reaction <= 4) then for debuffIndex = 1, 40 do local name, _, _, _, _, _, _, unitCaster, _, _, spellid = UnitDebuff ("playertarget", debuffIndex) if (name and unitCaster) then local playerName, realmName = _UnitName (unitCaster) local playerGUID = _UnitGUID (unitCaster) if (playerGUID) then if (realmName and realmName ~= "") then playerName = playerName .. "-" .. realmName end _detalhes.parser:add_debuff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, his_target, _UnitName ("playertarget"), 0x842, nil, spellid, name, in_or_out) end end end end end end end --> this shouldn't be hardcoded local runes_id = { [175457] = true, -- focus [175456] = true, --hyper [175439] = true, --stout } --called from control on leave / enter combat function _detalhes:CatchRaidBuffUptime (in_or_out) if (_IsInRaid()) then local pot_usage = {} local focus_augmentation = {} --> raid groups local cacheGetTime = GetTime() for raidIndex = 1, _GetNumGroupMembers() do local RaidIndex = "raid" .. raidIndex local playerGUID = _UnitGUID (RaidIndex) if (playerGUID) then local playerName, realmName = _UnitName (RaidIndex) if (realmName and realmName ~= "") then playerName = playerName .. "-" .. realmName end for buffIndex = 1, 41 do local name, _, _, _, _, _, unitCaster, _, _, spellid = _UnitAura (RaidIndex, buffIndex, nil, "HELPFUL") if (name and unitCaster and UnitExists (unitCaster) and UnitExists (RaidIndex) and UnitIsUnit (unitCaster, RaidIndex)) then _detalhes.parser:add_buff_uptime (nil, cacheGetTime, playerGUID, playerName, 0x00000514, playerGUID, playerName, 0x00000514, 0x0, spellid, name, in_or_out) if (in_or_out == "BUFF_UPTIME_IN") then if (_detalhes.PotionList [spellid]) then pot_usage [playerName] = spellid elseif (runes_id [spellid]) then focus_augmentation [playerName] = true end end end end end end if (in_or_out == "BUFF_UPTIME_IN") then local string_output = "pre-potion: " --> localize-me for playername, potspellid in _pairs (pot_usage) do local name, _, icon = _GetSpellInfo (potspellid) local _, class = UnitClass (playername) local class_color = "" if (class and RAID_CLASS_COLORS [class]) then class_color = RAID_CLASS_COLORS [class].colorStr end string_output = string_output .. "|c" .. class_color .. playername .. "|r |T" .. icon .. ":14:14:0:0:64:64:0:64:0:64|t " end _detalhes.pre_pot_used = string_output _detalhes:SendEvent ("COMBAT_PREPOTION_UPDATED", nil, pot_usage, focus_augmentation) end elseif (_IsInGroup()) then local pot_usage = {} local focus_augmentation = {} --party members for groupIndex = 1, _GetNumGroupMembers() - 1 do for buffIndex = 1, 41 do local name, _, _, _, _, _, unitCaster, _, _, spellid = _UnitAura ("party"..groupIndex, buffIndex, nil, "HELPFUL") if (name and unitCaster and UnitExists (unitCaster) and UnitExists ("party" .. groupIndex) and UnitIsUnit (unitCaster, "party" .. groupIndex)) then local playerName, realmName = _UnitName ("party"..groupIndex) local playerGUID = _UnitGUID ("party"..groupIndex) if (playerGUID) then if (realmName and realmName ~= "") then playerName = playerName .. "-" .. realmName end if (in_or_out == "BUFF_UPTIME_IN") then if (_detalhes.PotionList [spellid]) then pot_usage [playerName] = spellid elseif (runes_id [spellid]) then focus_augmentation [playerName] = true end end _detalhes.parser:add_buff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, playerGUID, playerName, 0x00000417, 0x0, spellid, name, in_or_out) end end end end --player it self for buffIndex = 1, 41 do local name, _, _, _, _, _, unitCaster, _, _, spellid = _UnitAura ("player", buffIndex, nil, "HELPFUL") if (name and unitCaster and UnitExists (unitCaster) and UnitIsUnit (unitCaster, "player")) then local playerName = _UnitName ("player") local playerGUID = _UnitGUID ("player") if (playerGUID) then if (in_or_out == "BUFF_UPTIME_IN") then if (_detalhes.PotionList [spellid]) then pot_usage [playerName] = spellid elseif (runes_id [spellid]) then focus_augmentation [playerName] = true end end _detalhes.parser:add_buff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, playerGUID, playerName, 0x00000417, 0x0, spellid, name, in_or_out) end end end if (in_or_out == "BUFF_UPTIME_IN") then local string_output = "pre-potion: " for playername, potspellid in _pairs (pot_usage) do local name, _, icon = _GetSpellInfo (potspellid) local _, class = UnitClass (playername) local class_color = "" if (class and RAID_CLASS_COLORS [class]) then class_color = RAID_CLASS_COLORS [class].colorStr end string_output = string_output .. "|c" .. class_color .. playername .. "|r |T" .. icon .. ":14:14:0:0:64:64:0:64:0:64|t " end _detalhes.pre_pot_used = string_output _detalhes:SendEvent ("COMBAT_PREPOTION_UPDATED", nil, pot_usage, focus_augmentation) end else local pot_usage = {} local focus_augmentation = {} for buffIndex = 1, 41 do local name, _, _, _, _, _, unitCaster, _, _, spellid = _UnitAura ("player", buffIndex, nil, "HELPFUL") if (name and unitCaster and UnitExists (unitCaster) and UnitIsUnit (unitCaster, "player")) then local playerName = _UnitName ("player") local playerGUID = _UnitGUID ("player") if (playerGUID) then if (in_or_out == "BUFF_UPTIME_IN") then if (_detalhes.PotionList [spellid]) then pot_usage [playerName] = spellid elseif (runes_id [spellid]) then focus_augmentation [playerName] = true end end _detalhes.parser:add_buff_uptime (nil, GetTime(), playerGUID, playerName, 0x00000417, playerGUID, playerName, 0x00000417, 0x0, spellid, name, in_or_out) end end end --[ if (in_or_out == "BUFF_UPTIME_IN") then local string_output = "pre-potion: " for playername, potspellid in _pairs (pot_usage) do local name, _, icon = _GetSpellInfo (potspellid) local _, class = UnitClass (playername) local class_color = "" if (class and RAID_CLASS_COLORS [class]) then class_color = RAID_CLASS_COLORS [class].colorStr end string_output = string_output .. "|c" .. class_color .. playername .. "|r |T" .. icon .. ":14:14:0:0:64:64:0:64:0:64|t " end _detalhes.pre_pot_used = string_output _detalhes:SendEvent ("COMBAT_PREPOTION_UPDATED", nil, pot_usage, focus_augmentation) end --]] -- _detalhes:Msg (string_output) end end local Sort2Reverse = function (a, b) return a[2] < b[2] end function atributo_misc:ToolTipDebuffUptime (instancia, numero, barra) local owner = self.owner if (owner and owner.classe) then r, g, b = unpack (_detalhes.class_colors [owner.classe]) else r, g, b = unpack (_detalhes.class_colors [self.classe]) end local meu_total = self ["debuff_uptime"] local minha_tabela = self.debuff_uptime_spells._ActorTable --> habilidade usada para interromper local debuffs_usados = {} local _combat_time = instancia.showing:GetCombatTime() for _spellid, _tabela in _pairs (minha_tabela) do debuffs_usados [#debuffs_usados+1] = {_spellid, _tabela.uptime} end --_table_sort (debuffs_usados, Sort2Reverse) _table_sort (debuffs_usados, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #debuffs_usados, _detalhes.tooltip_spell_icon.file, unpack (_detalhes.tooltip_spell_icon.coords)) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) local icon_size = _detalhes.tooltip.icon_size local icon_border = _detalhes.tooltip.icon_border_texcoord if (#debuffs_usados > 0) then for i = 1, _math_min (30, #debuffs_usados) do local esta_habilidade = debuffs_usados[i] if (esta_habilidade[2] > 0) then local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1]) local minutos, segundos = _math_floor (esta_habilidade[2]/60), _math_floor (esta_habilidade[2]%60) if (esta_habilidade[2] >= _combat_time) then --GameCooltip:AddLine (nome_magia, minutos .. "m " .. segundos .. "s" .. " (" .. _cstr ("%.1f", esta_habilidade[2] / _combat_time * 100) .. "%)", nil, "gray", "gray") --GameCooltip:AddStatusBar (100, nil, 1, 0, 1, .3, false) elseif (minutos > 0) then GameCooltip:AddLine (nome_magia, minutos .. "m " .. segundos .. "s" .. " (" .. _cstr ("%.1f", esta_habilidade[2] / _combat_time * 100) .. "%)") _detalhes:AddTooltipBackgroundStatusbar (false, esta_habilidade[2] / _combat_time * 100) else GameCooltip:AddLine (nome_magia, segundos .. "s" .. " (" .. _cstr ("%.1f", esta_habilidade[2] / _combat_time * 100) .. "%)") _detalhes:AddTooltipBackgroundStatusbar (false, esta_habilidade[2] / _combat_time * 100) end GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) end end else GameCooltip:AddLine (Loc ["STRING_NO_SPELL"]) end return true end function atributo_misc:ToolTipBuffUptime (instancia, numero, barra) local owner = self.owner if (owner and owner.classe) then r, g, b = unpack (_detalhes.class_colors [owner.classe]) else r, g, b = unpack (_detalhes.class_colors [self.classe]) end local meu_total = self ["buff_uptime"] local minha_tabela = self.buff_uptime_spells._ActorTable --> habilidade usada para interromper local buffs_usados = {} local _combat_time = instancia.showing:GetCombatTime() for _spellid, _tabela in _pairs (minha_tabela) do buffs_usados [#buffs_usados+1] = {_spellid, _tabela.uptime} end --_table_sort (buffs_usados, Sort2Reverse) _table_sort (buffs_usados, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #buffs_usados, _detalhes.tooltip_spell_icon.file, unpack (_detalhes.tooltip_spell_icon.coords)) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) local icon_size = _detalhes.tooltip.icon_size local icon_border = _detalhes.tooltip.icon_border_texcoord if (#buffs_usados > 0) then for i = 1, _math_min (30, #buffs_usados) do local esta_habilidade = buffs_usados[i] local percent = esta_habilidade[2] / _combat_time * 100 if (esta_habilidade[2] > 0 and percent < 99.5) then local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1]) local minutos, segundos = _math_floor (esta_habilidade[2]/60), _math_floor (esta_habilidade[2]%60) if (esta_habilidade[2] >= _combat_time) then --GameCooltip:AddLine (nome_magia, minutos .. "m " .. segundos .. "s" .. " (" .. _cstr ("%.1f", esta_habilidade[2] / _combat_time * 100) .. "%)", nil, "gray", "gray") --GameCooltip:AddStatusBar (100, nil, 1, 0, 1, .3, false) elseif (minutos > 0) then GameCooltip:AddLine (nome_magia, minutos .. "m " .. segundos .. "s" .. " (" .. _cstr ("%.1f", percent) .. "%)") _detalhes:AddTooltipBackgroundStatusbar (false, percent) else GameCooltip:AddLine (nome_magia, segundos .. "s" .. " (" .. _cstr ("%.1f", percent) .. "%)") _detalhes:AddTooltipBackgroundStatusbar (false, percent) end GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) end end else GameCooltip:AddLine (Loc ["STRING_NO_SPELL"]) end return true end function atributo_misc:ToolTipDefensiveCooldowns (instancia, numero, barra) local owner = self.owner if (owner and owner.classe) then r, g, b = unpack (_detalhes.class_colors [owner.classe]) else r, g, b = unpack (_detalhes.class_colors [self.classe]) end local meu_total = _math_floor (self ["cooldowns_defensive"]) local minha_tabela = self.cooldowns_defensive_spells._ActorTable --> spells local cooldowns_usados = {} for _spellid, _tabela in _pairs (minha_tabela) do cooldowns_usados [#cooldowns_usados+1] = {_spellid, _tabela.counter} end _table_sort (cooldowns_usados, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #cooldowns_usados, _detalhes.tooltip_spell_icon.file, unpack (_detalhes.tooltip_spell_icon.coords)) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) local icon_size = _detalhes.tooltip.icon_size local icon_border = _detalhes.tooltip.icon_border_texcoord local lineHeight = _detalhes.tooltip.line_height if (#cooldowns_usados > 0) then for i = 1, _math_min (25, #cooldowns_usados) do local esta_habilidade = cooldowns_usados[i] local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1]) GameCooltip:AddLine (nome_magia, esta_habilidade[2].." (".._cstr("%.1f", esta_habilidade[2]/meu_total*100).."%)") GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) _detalhes:AddTooltipBackgroundStatusbar() end else GameCooltip:AddLine (Loc ["STRING_NO_SPELL"]) end --> targets local meus_alvos = self.cooldowns_defensive_targets local alvos = {} for target_name, amount in _pairs (meus_alvos) do alvos [#alvos+1] = {target_name, amount} end _table_sort (alvos, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_TARGETS"], headerColor, #alvos, _detalhes.tooltip_target_icon.file, unpack (_detalhes.tooltip_target_icon.coords)) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) if (#alvos > 0) then for i = 1, _math_min (25, #alvos) do GameCooltip:AddLine (_detalhes:GetOnlyName (alvos[i][1]) .. ": ", alvos[i][2], 1, "white", "white") _detalhes:AddTooltipBackgroundStatusbar() GameCooltip:AddIcon ("Interface\\Icons\\PALADIN_HOLY", nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) local targetActor = instancia.showing[4]:PegarCombatente (_, alvos[i][1]) if (targetActor) then local classe = targetActor.classe if (not classe) then classe = "UNKNOW" end if (classe == "UNKNOW") then GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, 14, 14, .25, .5, 0, 1) else local specID = _detalhes:GetSpec (alvos[i][1]) if (specID) then local texture, l, r, t, b = _detalhes:GetSpecIcon (specID, false) GameCooltip:AddIcon (texture, 1, 1, lineHeight, lineHeight, l, r, t, b) else GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, 14, 14, _unpack (_detalhes.class_coords [classe])) end end end end end return true end function atributo_misc:ToolTipRess (instancia, numero, barra) local owner = self.owner if (owner and owner.classe) then r, g, b = unpack (_detalhes.class_colors [owner.classe]) else r, g, b = unpack (_detalhes.class_colors [self.classe]) end local meu_total = self ["ress"] local minha_tabela = self.ress_spells._ActorTable local lineHeight = _detalhes.tooltip.line_height local icon_border = _detalhes.tooltip.icon_border_texcoord --> habilidade usada para interromper local meus_ress = {} for _spellid, _tabela in _pairs (minha_tabela) do meus_ress [#meus_ress+1] = {_spellid, _tabela.ress} end _table_sort (meus_ress, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #meus_ress, _detalhes.tooltip_spell_icon.file, unpack (_detalhes.tooltip_spell_icon.coords)) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) if (#meus_ress > 0) then for i = 1, _math_min (3, #meus_ress) do local esta_habilidade = meus_ress[i] local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1]) GameCooltip:AddLine (nome_magia, esta_habilidade[2] .. " (" .. _cstr ("%.1f", floor (esta_habilidade[2]) / floor (meu_total) * 100).."%)") GameCooltip:AddIcon (icone_magia, nil, nil, lineHeight, lineHeight, icon_border.L, icon_border.R, icon_border.T, icon_border.B) _detalhes:AddTooltipBackgroundStatusbar() end else GameCooltip:AddLine (Loc ["STRING_NO_SPELL"]) end --> quem foi que o cara reviveu local meus_alvos = self.ress_targets local alvos = {} for target_name, amount in _pairs (meus_alvos) do alvos [#alvos+1] = {target_name, amount} end _table_sort (alvos, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_TARGETS"], headerColor, #alvos, _detalhes.tooltip_target_icon.file, unpack (_detalhes.tooltip_target_icon.coords)) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) if (#alvos > 0) then for i = 1, _math_min (3, #alvos) do GameCooltip:AddLine (alvos[i][1], alvos[i][2]) _detalhes:AddTooltipBackgroundStatusbar() local targetActor = instancia.showing[4]:PegarCombatente (_, alvos[i][1]) if (targetActor) then local classe = targetActor.classe if (not classe) then classe = "UNKNOW" end if (classe == "UNKNOW") then GameCooltip:AddIcon ("Interface\\LFGFRAME\\LFGROLE_BW", nil, nil, lineHeight, lineHeight, .25, .5, 0, 1) else local specID = _detalhes:GetSpec (alvos[i][1]) if (specID) then local texture, l, r, t, b = _detalhes:GetSpecIcon (specID, false) GameCooltip:AddIcon (texture, 1, 1, lineHeight, lineHeight, l, r, t, b) else GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small", nil, nil, lineHeight, lineHeight, _unpack (_detalhes.class_coords [classe])) end end end end end return true end function atributo_misc:ToolTipInterrupt (instancia, numero, barra) local owner = self.owner if (owner and owner.classe) then r, g, b = unpack (_detalhes.class_colors [owner.classe]) else r, g, b = unpack (_detalhes.class_colors [self.classe]) end local meu_total = self ["interrupt"] local minha_tabela = self.interrupt_spells._ActorTable local icon_size = _detalhes.tooltip.icon_size local icon_border = _detalhes.tooltip.icon_border_texcoord local lineHeight = _detalhes.tooltip.line_height --> habilidade usada para interromper local meus_interrupts = {} for _spellid, _tabela in _pairs (minha_tabela) do meus_interrupts [#meus_interrupts+1] = {_spellid, _tabela.counter} end _table_sort (meus_interrupts, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELLS"], headerColor, #meus_interrupts, _detalhes.tooltip_spell_icon.file, unpack (_detalhes.tooltip_spell_icon.coords)) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) if (#meus_interrupts > 0) then for i = 1, _math_min (25, #meus_interrupts) do local esta_habilidade = meus_interrupts[i] local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1]) GameCooltip:AddLine (nome_magia, esta_habilidade[2].." (".._cstr("%.1f", floor (esta_habilidade[2])/floor (meu_total)*100).."%)") GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) _detalhes:AddTooltipBackgroundStatusbar() end else GameTooltip:AddLine (Loc ["STRING_NO_SPELL"]) end --> quais habilidades foram interrompidas local habilidades_interrompidas = {} for _spellid, amt in _pairs (self.interrompeu_oque) do habilidades_interrompidas [#habilidades_interrompidas+1] = {_spellid, amt} end _table_sort (habilidades_interrompidas, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_SPELL_INTERRUPTED"] .. ":", headerColor, #habilidades_interrompidas, _detalhes.tooltip_target_icon.file, unpack (_detalhes.tooltip_target_icon.coords)) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) if (#habilidades_interrompidas > 0) then for i = 1, _math_min (25, #habilidades_interrompidas) do local esta_habilidade = habilidades_interrompidas[i] local nome_magia, _, icone_magia = _GetSpellInfo (esta_habilidade[1]) GameCooltip:AddLine (nome_magia, esta_habilidade[2].." (".._cstr("%.1f", floor (esta_habilidade[2])/floor (meu_total)*100).."%)") GameCooltip:AddIcon (icone_magia, nil, nil, icon_size.W, icon_size.H, icon_border.L, icon_border.R, icon_border.T, icon_border.B) _detalhes:AddTooltipBackgroundStatusbar() end end --> Pet local meus_pets = self.pets if (#meus_pets > 0) then --> teve ajudantes local quantidade = {} --> armazena a quantidade de pets iguais local interrupts = {} --> armazena as habilidades local alvos = {} --> armazena os alvos local totais = {} --> armazena o dano total de cada objeto for index, nome in _ipairs (meus_pets) do if (not quantidade [nome]) then quantidade [nome] = 1 local my_self = instancia.showing[class_type]:PegarCombatente (nil, nome) if (my_self and my_self.interrupt) then totais [#totais+1] = {nome, my_self.interrupt} end else quantidade [nome] = quantidade [nome]+1 end end local _quantidade = 0 local added_logo = false _table_sort (totais, _detalhes.Sort2) local ismaximized = false if (keydown == "alt" or TooltipMaximizedMethod == 2 or TooltipMaximizedMethod == 5) then ismaximized = true end for index, _table in _ipairs (totais) do if (_table [2] > 0 and (index < 3 or ismaximized)) then if (not added_logo) then added_logo = true _detalhes:AddTooltipSpellHeaderText (Loc ["STRING_PETS"], headerColor, #totais, [[Interface\COMMON\friendship-heart]], 0.21875, 0.78125, 0.09375, 0.6875) _detalhes:AddTooltipHeaderStatusbar (r, g, b, barAlha) end local n = _table [1]:gsub (("%s%<.*"), "") GameCooltip:AddLine (n, _table [2] .. " (" .. _math_floor (_table [2]/self.interrupt*100) .. "%)") _detalhes:AddTooltipBackgroundStatusbar() GameCooltip:AddIcon ([[Interface\AddOns\Details\images\classes_small]], 1, 1, 14, 14, 0.25, 0.49609375, 0.75, 1) end end end return true end --------------------------------------------- // JANELA DETALHES // --------------------------------------------- ---------> DETALHES BIFURCA��O function atributo_misc:MontaInfo() if (info.sub_atributo == 3) then --> interrupt return self:MontaInfoInterrupt() end end ---------> DETALHES bloco da direita BIFURCA��O function atributo_misc:MontaDetalhes (spellid, barra) if (info.sub_atributo == 3) then --> interrupt return self:MontaDetalhesInterrupt (spellid, barra) end end ------ Interrupt function atributo_misc:MontaInfoInterrupt() local meu_total = self ["interrupt"] if (not self.interrupt_spells) then return end local minha_tabela = self.interrupt_spells._ActorTable local barras = info.barras1 local instancia = info.instancia local meus_interrupts = {} --player for _spellid, _tabela in _pairs (minha_tabela) do --> da foreach em cada spellid do container local nome, _, icone = _GetSpellInfo (_spellid) _table_insert (meus_interrupts, {_spellid, _tabela.counter, _tabela.counter/meu_total*100, nome, icone}) end --pet local ActorPets = self.pets local class_color = "FFDDDDDD" for _, PetName in _ipairs (ActorPets) do local PetActor = instancia.showing (class_type, PetName) if (PetActor and PetActor.interrupt and PetActor.interrupt > 0) then local PetSkillsContainer = PetActor.interrupt_spells._ActorTable for _spellid, _skill in _pairs (PetSkillsContainer) do --> da foreach em cada spellid do container local nome, _, icone = _GetSpellInfo (_spellid) _table_insert (meus_interrupts, {_spellid, _skill.counter, _skill.counter/meu_total*100, nome .. " (|c" .. class_color .. PetName:gsub ((" <.*"), "") .. "|r)", icone, PetActor}) end end end _table_sort (meus_interrupts, _detalhes.Sort2) local amt = #meus_interrupts gump:JI_AtualizaContainerBarras (amt) local max_ = meus_interrupts [1][2] --> dano que a primeiro magia vez local barra for index, tabela in _ipairs (meus_interrupts) do barra = barras [index] if (not barra) then --> se a barra n�o existir, criar ela ent�o barra = gump:CriaNovaBarraInfo1 (instancia, index) barra.textura:SetStatusBarColor (1, 1, 1, 1) --> isso aqui � a parte da sele��o e descele��o barra.on_focus = false --> isso aqui � a parte da sele��o e descele��o end --> isso aqui � tudo da sele��o e descele��o das barras if (not info.mostrando_mouse_over) then if (tabela[1] == self.detalhes) then --> tabela [1] = spellid = spellid que esta na caixa da direita if (not barra.on_focus) then --> se a barra 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]/max_*100) --> muito mais rapido... end barra.lineText1:SetText (index..instancia.divisores.colocacao..tabela[4]) --seta o texto da esqueda barra.lineText4:SetText (tabela[2] .." ".. instancia.divisores.abre .._cstr("%.1f", tabela[3]) .."%".. instancia.divisores.fecha) --seta o texto da direita barra.icone:SetTexture (tabela[5]) barra.minha_tabela = self --> grava o jogador na barrinho... � estranho pq todas as barras v�o ter o mesmo valor do jogador barra.show = tabela[1] --> grava o spellid na barra barra:Show() --> mostra a barra if (self.detalhes and self.detalhes == barra.show) then self:MontaDetalhes (self.detalhes, barra) --> poderia deixar isso pro final e montar uma tail call?? end end --> Alvos do interrupt local meus_alvos = {} for target_name, amount in _pairs (self.interrupt_targets) do meus_alvos [#meus_alvos+1] = {target_name, amount} end _table_sort (meus_alvos, _detalhes.Sort2) local amt_alvos = #meus_alvos if (amt_alvos < 1) then return end gump:JI_AtualizaContainerAlvos (amt_alvos) local max_alvos = meus_alvos[1][2] local barra for index, tabela in _ipairs (meus_alvos) 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_alvos*100) end barra.lineText1:SetText (index..instancia.divisores.colocacao..tabela[1]) --seta o texto da esqueda barra.lineText4:SetText (tabela[2] .." ".. instancia.divisores.abre .._cstr("%.1f", tabela[2]/meu_total*100) .. instancia.divisores.fecha) --seta o texto da direita 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)) 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? barra:Show() end end ------ Detalhe Info Interrupt function atributo_misc:MontaDetalhesInterrupt (spellid, barra) for _, barra in _ipairs (info.barras3) do barra:Hide() end local esta_magia = self.interrupt_spells._ActorTable [spellid] if (not esta_magia) then return end --> icone direito superior local nome, _, icone = _GetSpellInfo (spellid) local infospell = {nome, nil, icone} _detalhes.playerDetailWindow.spell_icone:SetTexture (infospell[3]) local total = self.interrupt local meu_total = esta_magia.counter local index = 1 local data = {} local barras = info.barras3 local instancia = info.instancia local habilidades_alvos = {} for spellid, amt in pairs (esta_magia.interrompeu_oque) do habilidades_alvos [#habilidades_alvos+1] = {spellid, amt} end _table_sort (habilidades_alvos, _detalhes.Sort2) local max_ = habilidades_alvos[1][2] local barra for index, tabela in _ipairs (habilidades_alvos) 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 local nome, _, icone = _GetSpellInfo (tabela[1]) barra.lineText1:SetText (index..instancia.divisores.colocacao..nome) --seta o texto da esqueda barra.lineText4:SetText (tabela[2] .." ".. instancia.divisores.abre .._cstr("%.1f", tabela[2]/total*100) .."%".. instancia.divisores.fecha) --seta o texto da direita barra.icone:SetTexture (icone) barra:Show() --> mostra a barra if (index == 15) then break end end end function atributo_misc:MontaTooltipAlvos (esta_barra, index) local inimigo = esta_barra.nome_inimigo local container if (info.instancia.sub_atributo == 3) then --interrupt container = self.interrupt_spells._ActorTable end local habilidades = {} local total = self.interrupt for spellid, tabela in _pairs (container) do --> tabela = classe_damage_habilidade local alvos = tabela.targets for target_name, amount in _ipairs (alvos) do --> tabela = classe_target if (target_name == inimigo) then habilidades [#habilidades+1] = {spellid, amount} end end end table.sort (habilidades, _detalhes.Sort2) GameTooltip:AddLine (index..". "..inimigo) GameTooltip:AddLine (Loc ["STRING_SPELL_INTERRUPTED"] .. ":") GameTooltip:AddLine (" ") for index, tabela in _ipairs (habilidades) do local nome, rank, icone = _GetSpellInfo (tabela[1]) if (index < 8) then GameTooltip:AddDoubleLine (index..". |T"..icone..":0|t "..nome, tabela[2].." (".._cstr("%.1f", tabela[2]/total*100).."%)", 1, 1, 1, 1, 1, 1) else GameTooltip:AddDoubleLine (index..". "..nome, tabela[2].." (".._cstr("%.1f", tabela[2]/total*100).."%)", .65, .65, .65, .65, .65, .65) end end return true end --controla se o dps do jogador esta travado ou destravado function atributo_misc:Iniciar (iniciar) return false --retorna se o dps esta aberto ou fechado para este jogador end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --> core functions --> atualize a funcao de abreviacao function atributo_misc:UpdateSelectedToKFunction() SelectedToKFunction = ToKFunctions [_detalhes.ps_abbreviation] FormatTooltipNumber = ToKFunctions [_detalhes.tooltip.abbreviation] TooltipMaximizedMethod = _detalhes.tooltip.maximize_method headerColor = _detalhes.tooltip.header_text_color end local sub_list = {"cc_break", "ress", "interrupt", "cooldowns_defensive", "dispell", "dead"} --> subtract total from a combat table function atributo_misc:subtract_total (combat_table) for _, sub_attribute in _ipairs (sub_list) do if (self [sub_attribute]) then combat_table.totals [class_type][sub_attribute] = combat_table.totals [class_type][sub_attribute] - self [sub_attribute] if (self.grupo) then combat_table.totals_grupo [class_type][sub_attribute] = combat_table.totals_grupo [class_type][sub_attribute] - self [sub_attribute] end end end end function atributo_misc:add_total (combat_table) for _, sub_attribute in _ipairs (sub_list) do if (self [sub_attribute]) then combat_table.totals [class_type][sub_attribute] = combat_table.totals [class_type][sub_attribute] + self [sub_attribute] if (self.grupo) then combat_table.totals_grupo [class_type][sub_attribute] = combat_table.totals_grupo [class_type][sub_attribute] + self [sub_attribute] end end end end local refresh_alvos = function (container1, container2) for target_name, amount in _pairs (container2) do container1 [target_name] = container1 [target_name] or 0 end end local refresh_habilidades = function (container1, container2) for spellid, habilidade in _pairs (container2._ActorTable) do local habilidade_shadow = container1:PegaHabilidade (spellid, true, nil, true) refresh_alvos (habilidade_shadow.targets , habilidade.targets) end end function atributo_misc:r_onlyrefresh_shadow (actor) local overall_misc = _detalhes.tabela_overall [4] local shadow = overall_misc._ActorTable [overall_misc._NameIndexTable [actor.nome]] if (not actor.nome) then actor.nome = "unknown" end if (not shadow) then shadow = overall_misc: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 end _detalhes.refresh:r_atributo_misc (actor, shadow) --> spell cast if (actor.spell_cast) then if (not shadow.spell_cast) then shadow.spell_cast = {} end for spellid, _ in _pairs (actor.spell_cast) do shadow.spell_cast [spellid] = shadow.spell_cast [spellid] or 0 end end --> cc done if (actor.cc_done) then refresh_alvos (shadow.cc_done_targets, actor.cc_done_targets) refresh_habilidades (shadow.cc_done_spells, actor.cc_done_spells) end --> cooldowns if (actor.cooldowns_defensive) then refresh_alvos (shadow.cooldowns_defensive_targets, actor.cooldowns_defensive_targets) refresh_habilidades (shadow.cooldowns_defensive_spells, actor.cooldowns_defensive_spells) end --> buff uptime if (actor.buff_uptime) then refresh_alvos (shadow.buff_uptime_targets, actor.buff_uptime_targets) refresh_habilidades (shadow.buff_uptime_spells, actor.buff_uptime_spells) end --> debuff uptime if (actor.debuff_uptime) then refresh_habilidades (shadow.debuff_uptime_spells, actor.debuff_uptime_spells) if (actor.boss_debuff) then -- else refresh_alvos (shadow.debuff_uptime_targets, actor.debuff_uptime_targets) end end --> interrupt if (actor.interrupt) then refresh_alvos (shadow.interrupt_targets, actor.interrupt_targets) refresh_habilidades (shadow.interrupt_spells, actor.interrupt_spells) for spellid, habilidade in _pairs (actor.interrupt_spells._ActorTable) do local habilidade_shadow = shadow.interrupt_spells:PegaHabilidade (spellid, true, nil, true) habilidade_shadow.interrompeu_oque = habilidade_shadow.interrompeu_oque or {} end end --> ress if (actor.ress) then refresh_alvos (shadow.ress_targets, actor.ress_targets) refresh_habilidades (shadow.ress_spells, actor.ress_spells) end --> dispell if (actor.dispell) then refresh_alvos (shadow.dispell_targets, actor.dispell_targets) refresh_habilidades (shadow.dispell_spells, actor.dispell_spells) for spellid, habilidade in _pairs (actor.dispell_spells._ActorTable) do local habilidade_shadow = shadow.dispell_spells:PegaHabilidade (spellid, true, nil, true) habilidade_shadow.dispell_oque = habilidade_shadow.dispell_oque or {} end end --> cc break if (actor.cc_break) then refresh_alvos (shadow.cc_break_targets, actor.cc_break_targets) refresh_habilidades (shadow.cc_break_spells, actor.cc_break_spells) for spellid, habilidade in _pairs (actor.cc_break_spells._ActorTable) do local habilidade_shadow = shadow.cc_break_spells:PegaHabilidade (spellid, true, nil, true) habilidade_shadow.cc_break_oque = habilidade_shadow.cc_break_oque or {} end end return shadow end local somar_keys = function (habilidade, habilidade_tabela1) for key, value in _pairs (habilidade) do if (_type (value) == "number") then if (key ~= "id" and key ~= "spellschool") then habilidade_tabela1 [key] = (habilidade_tabela1 [key] or 0) + value end end end end local somar_alvos = function (container1, container2) for target_name, amount in _pairs (container2) do container1 [target_name] = (container1 [target_name] or 0) + amount end end local somar_habilidades = function (container1, container2) for spellid, habilidade in _pairs (container2._ActorTable) do local habilidade_tabela1 = container1:PegaHabilidade (spellid, true, nil, false) somar_alvos (habilidade_tabela1.targets, habilidade.targets) somar_keys (habilidade, habilidade_tabela1) end end function atributo_misc:r_connect_shadow (actor, no_refresh, combat_object) local host_combat = combat_object or _detalhes.tabela_overall --> criar uma shadow desse ator se ainda n�o tiver uma local overall_misc = host_combat [4] local shadow = overall_misc._ActorTable [overall_misc._NameIndexTable [actor.nome]] if (not actor.nome) then actor.nome = "unknown" end if (not shadow) then shadow = overall_misc: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 end --> aplica a meta e indexes if (not no_refresh) then _detalhes.refresh:r_atributo_misc (actor, shadow) end --> pets (add unique pet names) for _, petName in _ipairs (actor.pets) do DetailsFramework.table.addunique (shadow.pets, petName) end if (actor.spell_cast) then if (not shadow.spell_cast) then shadow.spell_cast = {} end for spellid, amount in _pairs (actor.spell_cast) do shadow.spell_cast [spellid] = (shadow.spell_cast [spellid] or 0) + amount end end if (actor.cc_done) then if (not shadow.cc_done_targets) then shadow.cc_done = _detalhes:GetOrderNumber() shadow.cc_done_targets = {} shadow.cc_done_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) end shadow.cc_done = shadow.cc_done + actor.cc_done somar_alvos (shadow.cc_done_targets, actor.cc_done_targets) somar_habilidades (shadow.cc_done_spells, actor.cc_done_spells) end if (actor.cooldowns_defensive) then if (not shadow.cooldowns_defensive_targets) then shadow.cooldowns_defensive = _detalhes:GetOrderNumber (actor.nome) shadow.cooldowns_defensive_targets = {} shadow.cooldowns_defensive_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) end shadow.cooldowns_defensive = shadow.cooldowns_defensive + actor.cooldowns_defensive host_combat.totals[4].cooldowns_defensive = host_combat.totals[4].cooldowns_defensive + actor.cooldowns_defensive if (actor.grupo) then host_combat.totals_grupo[4].cooldowns_defensive = host_combat.totals_grupo[4].cooldowns_defensive + actor.cooldowns_defensive end somar_alvos (shadow.cooldowns_defensive_targets, actor.cooldowns_defensive_targets) somar_habilidades (shadow.cooldowns_defensive_spells, actor.cooldowns_defensive_spells) end if (actor.buff_uptime) then if (not shadow.buff_uptime_targets) then shadow.buff_uptime = 0 shadow.buff_uptime_targets = {} shadow.buff_uptime_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) end shadow.buff_uptime = shadow.buff_uptime + actor.buff_uptime somar_alvos (shadow.buff_uptime_targets, actor.buff_uptime_targets) somar_habilidades (shadow.buff_uptime_spells, actor.buff_uptime_spells) end if (actor.debuff_uptime) then if (not shadow.debuff_uptime_targets) then shadow.debuff_uptime = 0 if (actor.boss_debuff) then shadow.debuff_uptime_targets = {} shadow.boss_debuff = true shadow.damage_twin = actor.damage_twin shadow.spellschool = actor.spellschool shadow.damage_spellid = actor.damage_spellid shadow.debuff_uptime = 0 else shadow.debuff_uptime_targets = {} end shadow.debuff_uptime_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) end shadow.debuff_uptime = shadow.debuff_uptime + actor.debuff_uptime for target_name, amount in _pairs (actor.debuff_uptime_targets) do if (_type (amount) == "table") then --> boss debuff local t = shadow.debuff_uptime_targets [target_name] if (not t) then shadow.debuff_uptime_targets [target_name] = atributo_misc:CreateBuffTargetObject() t = shadow.debuff_uptime_targets [target_name] end t.uptime = t.uptime + amount.uptime t.activedamt = t.activedamt + amount.activedamt t.refreshamt = t.refreshamt + amount.refreshamt t.appliedamt = t.appliedamt + amount.appliedamt else shadow.debuff_uptime_targets [target_name] = (shadow.debuff_uptime_targets [target_name] or 0) + amount end end somar_habilidades (shadow.debuff_uptime_spells, actor.debuff_uptime_spells) end --> interrupt if (actor.interrupt) then if (not shadow.interrupt_targets) then shadow.interrupt = 0 shadow.interrupt_targets = {} shadow.interrupt_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) --> cria o container das habilidades usadas para interromper shadow.interrompeu_oque = {} end shadow.interrupt = shadow.interrupt + actor.interrupt host_combat.totals[4].interrupt = host_combat.totals[4].interrupt + actor.interrupt if (actor.grupo) then host_combat.totals_grupo[4].interrupt = host_combat.totals_grupo[4].interrupt + actor.interrupt end somar_alvos (shadow.interrupt_targets, actor.interrupt_targets) somar_habilidades (shadow.interrupt_spells, actor.interrupt_spells) for spellid, habilidade in _pairs (actor.interrupt_spells._ActorTable) do local habilidade_shadow = shadow.interrupt_spells:PegaHabilidade (spellid, true, nil, true) habilidade_shadow.interrompeu_oque = habilidade_shadow.interrompeu_oque or {} for _spellid, amount in _pairs (habilidade.interrompeu_oque) do habilidade_shadow.interrompeu_oque [_spellid] = (habilidade_shadow.interrompeu_oque [_spellid] or 0) + amount end end for spellid, amount in _pairs (actor.interrompeu_oque) do shadow.interrompeu_oque [spellid] = (shadow.interrompeu_oque [spellid] or 0) + amount end end --> ress if (actor.ress) then if (not shadow.ress_targets) then shadow.ress = 0 shadow.ress_targets = {} shadow.ress_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) end shadow.ress = shadow.ress + actor.ress host_combat.totals[4].ress = host_combat.totals[4].ress + actor.ress if (actor.grupo) then host_combat.totals_grupo[4].ress = host_combat.totals_grupo[4].ress + actor.ress end somar_alvos (shadow.ress_targets, actor.ress_targets) somar_habilidades (shadow.ress_spells, actor.ress_spells) end --> dispell if (actor.dispell) then if (not shadow.dispell_targets) then shadow.dispell = 0 shadow.dispell_targets = {} shadow.dispell_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) shadow.dispell_oque = {} end shadow.dispell = shadow.dispell + actor.dispell host_combat.totals[4].dispell = host_combat.totals[4].dispell + actor.dispell if (actor.grupo) then host_combat.totals_grupo[4].dispell = host_combat.totals_grupo[4].dispell + actor.dispell end somar_alvos (shadow.dispell_targets, actor.dispell_targets) somar_habilidades (shadow.dispell_spells, actor.dispell_spells) for spellid, habilidade in _pairs (actor.dispell_spells._ActorTable) do local habilidade_shadow = shadow.dispell_spells:PegaHabilidade (spellid, true, nil, true) habilidade_shadow.dispell_oque = habilidade_shadow.dispell_oque or {} for _spellid, amount in _pairs (habilidade.dispell_oque) do habilidade_shadow.dispell_oque [_spellid] = (habilidade_shadow.dispell_oque [_spellid] or 0) + amount end end for spellid, amount in _pairs (actor.dispell_oque) do shadow.dispell_oque [spellid] = (shadow.dispell_oque [spellid] or 0) + amount end end if (actor.cc_break) then if (not shadow.cc_break) then shadow.cc_break = 0 shadow.cc_break_targets = {} shadow.cc_break_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) --> cria o container das habilidades usadas para interromper shadow.cc_break_oque = {} end shadow.cc_break = shadow.cc_break + actor.cc_break host_combat.totals[4].cc_break = host_combat.totals[4].cc_break + actor.cc_break if (actor.grupo) then host_combat.totals_grupo[4].cc_break = host_combat.totals_grupo[4].cc_break + actor.cc_break end somar_alvos (shadow.cc_break_targets, actor.cc_break_targets) somar_habilidades (shadow.cc_break_spells, actor.cc_break_spells) for spellid, habilidade in _pairs (actor.cc_break_spells._ActorTable) do local habilidade_shadow = shadow.cc_break_spells:PegaHabilidade (spellid, true, nil, true) habilidade_shadow.cc_break_oque = habilidade_shadow.cc_break_oque or {} for _spellid, amount in _pairs (habilidade.cc_break_oque) do habilidade_shadow.cc_break_oque [_spellid] = (habilidade_shadow.cc_break_oque [_spellid] or 0) + amount end end for spellid, amount in _pairs (actor.cc_break_oque) do shadow.cc_break_oque [spellid] = (shadow.cc_break_oque [spellid] or 0) + amount end end return shadow end function atributo_misc:ColetarLixo (lastevent) return _detalhes:ColetarLixo (class_type, lastevent) end function _detalhes.refresh:r_atributo_misc (este_jogador, shadow) _setmetatable (este_jogador, _detalhes.atributo_misc) este_jogador.__index = _detalhes.atributo_misc --> refresh spell cast if (este_jogador.spell_cast) then if (shadow and not shadow.spell_cast) then shadow.spell_cast = {} end end --> refresh cc done if (este_jogador.cc_done) then if (shadow and not shadow.cc_done_targets) then shadow.cc_done = 0 shadow.cc_done_targets = {} shadow.cc_done_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) end _detalhes.refresh:r_container_habilidades (este_jogador.cc_done_spells, shadow and shadow.cc_done_spells) end --> refresh interrupts if (este_jogador.interrupt_targets) then if (shadow and not shadow.interrupt_targets) then shadow.interrupt = 0 shadow.interrupt_targets = {} shadow.interrupt_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) shadow.interrompeu_oque = {} end _detalhes.refresh:r_container_habilidades (este_jogador.interrupt_spells, shadow and shadow.interrupt_spells) end --> refresh buff uptime if (este_jogador.buff_uptime_targets) then if (shadow and not shadow.buff_uptime_targets) then shadow.buff_uptime = 0 shadow.buff_uptime_targets = {} shadow.buff_uptime_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) end _detalhes.refresh:r_container_habilidades (este_jogador.buff_uptime_spells, shadow and shadow.buff_uptime_spells) end --> refresh buff uptime if (este_jogador.debuff_uptime_targets) then if (shadow and not shadow.debuff_uptime_targets) then shadow.debuff_uptime = 0 if (este_jogador.boss_debuff) then shadow.debuff_uptime_targets = {} shadow.boss_debuff = true shadow.damage_twin = este_jogador.damage_twin shadow.spellschool = este_jogador.spellschool shadow.damage_spellid = este_jogador.damage_spellid shadow.debuff_uptime = 0 else shadow.debuff_uptime_targets = {} end shadow.debuff_uptime_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) end _detalhes.refresh:r_container_habilidades (este_jogador.debuff_uptime_spells, shadow and shadow.debuff_uptime_spells) end --> refresh cooldowns defensive if (este_jogador.cooldowns_defensive_targets) then if (shadow and not shadow.cooldowns_defensive_targets) then shadow.cooldowns_defensive = 0 shadow.cooldowns_defensive_targets = {} shadow.cooldowns_defensive_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) end _detalhes.refresh:r_container_habilidades (este_jogador.cooldowns_defensive_spells, shadow and shadow.cooldowns_defensive_spells) end --> refresh ressers if (este_jogador.ress_targets) then if (shadow and not shadow.ress_targets) then shadow.ress = 0 shadow.ress_targets = {} shadow.ress_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) end _detalhes.refresh:r_container_habilidades (este_jogador.ress_spells, shadow and shadow.ress_spells) end --> refresh dispells if (este_jogador.dispell_targets) then if (shadow and not shadow.dispell_targets) then shadow.dispell = 0 shadow.dispell_targets = {} shadow.dispell_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) --> cria o container das habilidades usadas para interromper shadow.dispell_oque = {} end _detalhes.refresh:r_container_habilidades (este_jogador.dispell_spells, shadow and shadow.dispell_spells) end --> refresh cc_breaks if (este_jogador.cc_break_targets) then if (shadow and not shadow.cc_break) then shadow.cc_break = 0 shadow.cc_break_targets = {} shadow.cc_break_spells = container_habilidades:NovoContainer (_detalhes.container_type.CONTAINER_MISC_CLASS) shadow.cc_break_oque = {} end _detalhes.refresh:r_container_habilidades (este_jogador.cc_break_spells, shadow and shadow.cc_break_spells) end end function _detalhes.clear:c_atributo_misc (este_jogador) este_jogador.__index = nil este_jogador.shadow = nil este_jogador.links = nil este_jogador.minha_barra = nil if (este_jogador.cc_done_targets) then _detalhes.clear:c_container_habilidades (este_jogador.cc_done_spells) end if (este_jogador.interrupt_targets) then _detalhes.clear:c_container_habilidades (este_jogador.interrupt_spells) end if (este_jogador.cooldowns_defensive_targets) then _detalhes.clear:c_container_habilidades (este_jogador.cooldowns_defensive_spells) end if (este_jogador.buff_uptime_targets) then _detalhes.clear:c_container_habilidades (este_jogador.buff_uptime_spells) end if (este_jogador.debuff_uptime_targets) then _detalhes.clear:c_container_habilidades (este_jogador.debuff_uptime_spells) end if (este_jogador.ress_targets) then _detalhes.clear:c_container_habilidades (este_jogador.ress_spells) end if (este_jogador.cc_break_targets) then _detalhes.clear:c_container_habilidades (este_jogador.cc_break_spells) end if (este_jogador.dispell_targets) then _detalhes.clear:c_container_habilidades (este_jogador.dispell_spells) end end atributo_misc.__add = function (tabela1, tabela2) if (tabela2.spell_cast) then for spellid, amount in _pairs (tabela2.spell_cast) do tabela1.spell_cast [spellid] = (tabela1.spell_cast [spellid] or 0) + amount end end if (tabela2.cc_done) then tabela1.cc_done = tabela1.cc_done + tabela2.cc_done for target_name, amount in _pairs (tabela2.cc_done_targets) do tabela1.cc_done_targets [target_name] = (tabela1.cc_done_targets [target_name] or 0) + amount end for spellid, habilidade in _pairs (tabela2.cc_done_spells._ActorTable) do local habilidade_tabela1 = tabela1.cc_done_spells:PegaHabilidade (spellid, true, nil, false) for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount end somar_keys (habilidade, habilidade_tabela1) end end if (tabela2.interrupt) then if (not tabela1.interrupt) then tabela1.interrupt = 0 tabela1.interrupt_targets = {} tabela1.interrupt_spells = container_habilidades:NovoContainer (container_misc) tabela1.interrompeu_oque = {} end --> total de interrupts tabela1.interrupt = tabela1.interrupt + tabela2.interrupt --> soma o interrompeu o que for spellid, amount in _pairs (tabela2.interrompeu_oque) do tabela1.interrompeu_oque [spellid] = (tabela1.interrompeu_oque [spellid] or 0) + amount end --> soma os containers de alvos for target_name, amount in _pairs (tabela2.interrupt_targets) do tabela1.interrupt_targets [target_name] = (tabela1.interrupt_targets [target_name] or 0) + amount end --> soma o container de habilidades for spellid, habilidade in _pairs (tabela2.interrupt_spells._ActorTable) do local habilidade_tabela1 = tabela1.interrupt_spells:PegaHabilidade (spellid, true, nil, false) habilidade_tabela1.interrompeu_oque = habilidade_tabela1.interrompeu_oque or {} for _spellid, amount in _pairs (habilidade.interrompeu_oque) do habilidade_tabela1.interrompeu_oque [_spellid] = (habilidade_tabela1.interrompeu_oque [_spellid] or 0) + amount end for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount end somar_keys (habilidade, habilidade_tabela1) end end if (tabela2.buff_uptime) then if (not tabela1.buff_uptime) then tabela1.buff_uptime = 0 tabela1.buff_uptime_targets = {} tabela1.buff_uptime_spells = container_habilidades:NovoContainer (container_misc) end tabela1.buff_uptime = tabela1.buff_uptime + tabela2.buff_uptime for target_name, amount in _pairs (tabela2.buff_uptime_targets) do tabela1.buff_uptime_targets [target_name] = (tabela1.buff_uptime_targets [target_name] or 0) + amount end for spellid, habilidade in _pairs (tabela2.buff_uptime_spells._ActorTable) do local habilidade_tabela1 = tabela1.buff_uptime_spells:PegaHabilidade (spellid, true, nil, false) for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount end somar_keys (habilidade, habilidade_tabela1) end end if (tabela2.debuff_uptime) then if (not tabela1.debuff_uptime) then if (tabela2.boss_debuff) then tabela1.debuff_uptime_targets = {} tabela1.boss_debuff = true tabela1.damage_twin = tabela2.damage_twin tabela1.spellschool = tabela2.spellschool tabela1.damage_spellid = tabela2.damage_spellid else tabela1.debuff_uptime_targets = {} end tabela1.debuff_uptime = 0 tabela1.debuff_uptime_spells = container_habilidades:NovoContainer (container_misc) end tabela1.debuff_uptime = tabela1.debuff_uptime + tabela2.debuff_uptime for target_name, amount in _pairs (tabela2.debuff_uptime_targets) do if (_type (amount) == "table") then --> boss debuff local t = tabela1.debuff_uptime_targets [target_name] if (not t) then tabela1.debuff_uptime_targets [target_name] = atributo_misc:CreateBuffTargetObject() t = tabela1.debuff_uptime_targets [target_name] end t.uptime = t.uptime + amount.uptime t.activedamt = t.activedamt + amount.activedamt t.refreshamt = t.refreshamt + amount.refreshamt t.appliedamt = t.appliedamt + amount.appliedamt else tabela1.debuff_uptime_targets [target_name] = (tabela1.debuff_uptime_targets [target_name] or 0) + amount end end for spellid, habilidade in _pairs (tabela2.debuff_uptime_spells._ActorTable) do local habilidade_tabela1 = tabela1.debuff_uptime_spells:PegaHabilidade (spellid, true, nil, false) for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount end somar_keys (habilidade, habilidade_tabela1) end end if (tabela2.cooldowns_defensive) then if (not tabela1.cooldowns_defensive) then tabela1.cooldowns_defensive = 0 tabela1.cooldowns_defensive_targets = {} tabela1.cooldowns_defensive_spells = container_habilidades:NovoContainer (container_misc) end tabela1.cooldowns_defensive = tabela1.cooldowns_defensive + tabela2.cooldowns_defensive for target_name, amount in _pairs (tabela2.cooldowns_defensive_targets) do tabela1.cooldowns_defensive_targets [target_name] = (tabela1.cooldowns_defensive_targets [target_name] or 0) + amount end for spellid, habilidade in _pairs (tabela2.cooldowns_defensive_spells._ActorTable) do local habilidade_tabela1 = tabela1.cooldowns_defensive_spells:PegaHabilidade (spellid, true, nil, false) for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount end somar_keys (habilidade, habilidade_tabela1) end end if (tabela2.ress) then if (not tabela1.ress) then tabela1.ress = 0 tabela1.ress_targets = {} tabela1.ress_spells = container_habilidades:NovoContainer (container_misc) end tabela1.ress = tabela1.ress + tabela2.ress for target_name, amount in _pairs (tabela2.ress_targets) do tabela1.ress_targets [target_name] = (tabela1.ress_targets [target_name] or 0) + amount end for spellid, habilidade in _pairs (tabela2.ress_spells._ActorTable) do local habilidade_tabela1 = tabela1.ress_spells:PegaHabilidade (spellid, true, nil, false) for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount end somar_keys (habilidade, habilidade_tabela1) end end if (tabela2.dispell) then if (not tabela1.dispell) then tabela1.dispell = 0 tabela1.dispell_targets = {} tabela1.dispell_spells = container_habilidades:NovoContainer (container_misc) tabela1.dispell_oque = {} end tabela1.dispell = tabela1.dispell + tabela2.dispell for target_name, amount in _pairs (tabela2.dispell_targets) do tabela1.dispell_targets [target_name] = (tabela1.dispell_targets [target_name] or 0) + amount end for spellid, habilidade in _pairs (tabela2.dispell_spells._ActorTable) do local habilidade_tabela1 = tabela1.dispell_spells:PegaHabilidade (spellid, true, nil, false) habilidade_tabela1.dispell_oque = habilidade_tabela1.dispell_oque or {} for _spellid, amount in _pairs (habilidade.dispell_oque) do habilidade_tabela1.dispell_oque [_spellid] = (habilidade_tabela1.dispell_oque [_spellid] or 0) + amount end for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount end somar_keys (habilidade, habilidade_tabela1) end for spellid, amount in _pairs (tabela2.dispell_oque) do tabela1.dispell_oque [spellid] = (tabela1.dispell_oque [spellid] or 0) + amount end end if (tabela2.cc_break) then if (not tabela1.cc_break) then tabela1.cc_break = 0 tabela1.cc_break_targets = {} tabela1.cc_break_spells = container_habilidades:NovoContainer (container_misc) tabela1.cc_break_oque = {} end tabela1.cc_break = tabela1.cc_break + tabela2.cc_break for target_name, amount in _pairs (tabela2.cc_break_targets) do tabela1.cc_break_targets [target_name] = (tabela1.cc_break_targets [target_name] or 0) + amount end for spellid, habilidade in _pairs (tabela2.cc_break_spells._ActorTable) do local habilidade_tabela1 = tabela1.cc_break_spells:PegaHabilidade (spellid, true, nil, false) habilidade_tabela1.cc_break_oque = habilidade_tabela1.cc_break_oque or {} for _spellid, amount in _pairs (habilidade.cc_break_oque) do habilidade_tabela1.cc_break_oque [_spellid] = (habilidade_tabela1.cc_break_oque [_spellid] or 0) + amount end for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) + amount end somar_keys (habilidade, habilidade_tabela1) end for spellid, amount in _pairs (tabela2.cc_break_oque) do tabela1.cc_break_oque [spellid] = (tabela1.cc_break_oque [spellid] or 0) + amount end end return tabela1 end local subtrair_keys = function (habilidade, habilidade_tabela1) for key, value in _pairs (habilidade) do if (_type (value) == "number") then if (key ~= "id" and key ~= "spellschool") then habilidade_tabela1 [key] = (habilidade_tabela1 [key] or 0) - value end end end end atributo_misc.__sub = function (tabela1, tabela2) if (tabela2.spell_cast) then for spellid, amount in _pairs (tabela2.spell_cast) do tabela1.spell_cast [spellid] = (tabela1.spell_cast [spellid] or 0) - amount end end if (tabela2.cc_done) then tabela1.cc_done = tabela1.cc_done - tabela2.cc_done for target_name, amount in _pairs (tabela2.cc_done_targets) do tabela1.cc_done_targets [target_name] = (tabela1.cc_done_targets [target_name] or 0) - amount end for spellid, habilidade in _pairs (tabela2.cc_done_spells._ActorTable) do local habilidade_tabela1 = tabela1.cc_done_spells:PegaHabilidade (spellid, true, nil, false) for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount end subtrair_keys (habilidade, habilidade_tabela1) end end if (tabela2.interrupt) then --> total de interrupts tabela1.interrupt = tabela1.interrupt - tabela2.interrupt --> soma o interrompeu o que for spellid, amount in _pairs (tabela2.interrompeu_oque) do tabela1.interrompeu_oque [spellid] = (tabela1.interrompeu_oque [spellid] or 0) - amount end --> soma os containers de alvos for target_name, amount in _pairs (tabela2.interrupt_targets) do tabela1.interrupt_targets [target_name] = (tabela1.interrupt_targets [target_name] or 0) - amount end --> soma o container de habilidades for spellid, habilidade in _pairs (tabela2.interrupt_spells._ActorTable) do local habilidade_tabela1 = tabela1.interrupt_spells:PegaHabilidade (spellid, true, nil, false) habilidade_tabela1.interrompeu_oque = habilidade_tabela1.interrompeu_oque or {} for _spellid, amount in _pairs (habilidade.interrompeu_oque) do habilidade_tabela1.interrompeu_oque [_spellid] = (habilidade_tabela1.interrompeu_oque [_spellid] or 0) - amount end for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount end subtrair_keys (habilidade, habilidade_tabela1) end end if (tabela2.buff_uptime) then tabela1.buff_uptime = tabela1.buff_uptime - tabela2.buff_uptime for target_name, amount in _pairs (tabela2.buff_uptime_targets) do tabela1.buff_uptime_targets [target_name] = (tabela1.buff_uptime_targets [target_name] or 0) - amount end for spellid, habilidade in _pairs (tabela2.buff_uptime_spells._ActorTable) do local habilidade_tabela1 = tabela1.buff_uptime_spells:PegaHabilidade (spellid, true, nil, false) for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount end subtrair_keys (habilidade, habilidade_tabela1) end end if (tabela2.debuff_uptime) then tabela1.debuff_uptime = tabela1.debuff_uptime - tabela2.debuff_uptime for target_name, amount in _pairs (tabela2.debuff_uptime_targets) do if (_type (amount) == "table") then --> boss debuff local t = tabela1.debuff_uptime_targets [target_name] if (not t) then tabela1.debuff_uptime_targets [target_name] = atributo_misc:CreateBuffTargetObject() t = tabela1.debuff_uptime_targets [target_name] end t.uptime = t.uptime - amount.uptime t.activedamt = t.activedamt - amount.activedamt t.refreshamt = t.refreshamt - amount.refreshamt t.appliedamt = t.appliedamt - amount.appliedamt else tabela2.debuff_uptime_targets [target_name] = (tabela2.debuff_uptime_targets [target_name] or 0) - amount end end for spellid, habilidade in _pairs (tabela2.debuff_uptime_spells._ActorTable) do local habilidade_tabela1 = tabela1.debuff_uptime_spells:PegaHabilidade (spellid, true, nil, false) for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount end subtrair_keys (habilidade, habilidade_tabela1) end end if (tabela2.cooldowns_defensive) then tabela1.cooldowns_defensive = tabela1.cooldowns_defensive - tabela2.cooldowns_defensive for target_name, amount in _pairs (tabela2.cooldowns_defensive_targets) do tabela1.cooldowns_defensive_targets [target_name] = (tabela1.cooldowns_defensive_targets [target_name] or 0) - amount end for spellid, habilidade in _pairs (tabela2.cooldowns_defensive_spells._ActorTable) do local habilidade_tabela1 = tabela1.cooldowns_defensive_spells:PegaHabilidade (spellid, true, nil, false) for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount end subtrair_keys (habilidade, habilidade_tabela1) end end if (tabela2.ress) then tabela1.ress = tabela1.ress - tabela2.ress for target_name, amount in _pairs (tabela2.ress_targets) do tabela1.ress_targets [target_name] = (tabela1.ress_targets [target_name] or 0) - amount end for spellid, habilidade in _pairs (tabela2.ress_spells._ActorTable) do local habilidade_tabela1 = tabela1.ress_spells:PegaHabilidade (spellid, true, nil, false) for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount end subtrair_keys (habilidade, habilidade_tabela1) end end if (tabela2.dispell) then tabela1.dispell = tabela1.dispell - tabela2.dispell for target_name, amount in _pairs (tabela2.dispell_targets) do tabela1.dispell_targets [target_name] = (tabela1.dispell_targets [target_name] or 0) - amount end for spellid, habilidade in _pairs (tabela2.dispell_spells._ActorTable) do local habilidade_tabela1 = tabela1.dispell_spells:PegaHabilidade (spellid, true, nil, false) habilidade_tabela1.dispell_oque = habilidade_tabela1.dispell_oque or {} for _spellid, amount in _pairs (habilidade.dispell_oque) do habilidade_tabela1.dispell_oque [_spellid] = (habilidade_tabela1.dispell_oque [_spellid] or 0) - amount end for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount end subtrair_keys (habilidade, habilidade_tabela1) end for spellid, amount in _pairs (tabela2.dispell_oque) do tabela1.dispell_oque [spellid] = (tabela1.dispell_oque [spellid] or 0) - amount end end if (tabela2.cc_break) then tabela1.cc_break = tabela1.cc_break - tabela2.cc_break for target_name, amount in _pairs (tabela2.cc_break_targets) do tabela1.cc_break_targets [target_name] = (tabela1.cc_break_targets [target_name] or 0) - amount end for spellid, habilidade in _pairs (tabela2.cc_break_spells._ActorTable) do local habilidade_tabela1 = tabela1.cc_break_spells:PegaHabilidade (spellid, true, nil, false) habilidade_tabela1.cc_break_oque = habilidade_tabela1.cc_break_oque or {} for _spellid, amount in _pairs (habilidade.cc_break_oque) do habilidade_tabela1.cc_break_oque [_spellid] = (habilidade_tabela1.cc_break_oque [_spellid] or 0) - amount end for target_name, amount in _pairs (habilidade.targets) do habilidade_tabela1.targets [target_name] = (habilidade_tabela1.targets [target_name] or 0) - amount end subtrair_keys (habilidade, habilidade_tabela1) end for spellid, amount in _pairs (tabela2.cc_break_oque) do tabela1.cc_break_oque [spellid] = (tabela1.cc_break_oque [spellid] or 0) - amount end end return tabela1 end