local _detalhes = _G.Details local _ = nil _detalhes.custom_function_cache = {} local addonName, Details222 = ... local Details = _detalhes ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --local pointers local format = string.format local floor = math.floor local sort = table.sort local tinsert = table.insert local ipairs = ipairs local unpack = table.unpack or unpack local _GetSpellInfo = Details.getspellinfo local IsInRaid = IsInRaid local IsInGroup = IsInGroup local stringReplace = Details.string.replace local GetSpellLink = GetSpellLink or C_Spell.GetSpellLink --api local local Loc = LibStub("AceLocale-3.0"):GetLocale("Details") ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --constants local classCustom = Details.atributo_custom classCustom.mt = {__index = classCustom} local combatContainers = { ["damagedone"] = 1, ["healdone"] = 2, } --hold the mini custom objects classCustom._InstanceActorContainer = {} classCustom._InstanceLastCustomShown = {} classCustom._InstanceLastCombatShown = {} classCustom._TargetActorsProcessed = {} local ToKFunctions = Details.ToKFunctions local SelectedToKFunction = ToKFunctions[1] local UsingCustomRightText = false local UsingCustomLeftText = false ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --core function classCustom:GetCombatContainerIndex (attribute) return combatContainers [attribute] end function classCustom:RefreshWindow(instanceObject, combatObject, force, export) --get the custom object local customObject = instanceObject:GetCustomObject() if (not customObject) then return instanceObject:ResetAttribute() end --save the custom name in the instance instanceObject.customName = customObject.name --get the container holding the custom actor objects for this instance local instance_container = classCustom:GetInstanceCustomActorContainer (instanceObject) local last_shown = classCustom._InstanceLastCustomShown [instanceObject:GetId()] if (last_shown and last_shown ~= customObject:GetName()) then instance_container:WipeCustomActorContainer() end classCustom._InstanceLastCustomShown [instanceObject:GetId()] = customObject:GetName() local last_combat_shown = classCustom._InstanceLastCombatShown [instanceObject:GetId()] if (last_combat_shown and last_combat_shown ~= combatObject) then instance_container:WipeCustomActorContainer() end classCustom._InstanceLastCombatShown [instanceObject:GetId()] = combatObject --declare the main locals local total = 0 local top = 0 local amount = 0 --check if is a custom script (if has .script) if (customObject:IsScripted()) then --be save reseting the values on every refresh instance_container:ResetCustomActorContainer() local func local scriptTypeName = "search" if (Details.custom_function_cache [instanceObject.customName]) then func = Details.custom_function_cache [instanceObject.customName] else local errortext func, errortext = loadstring (customObject.script) if (func) then DetailsFramework:SetEnvironment(func) Details.custom_function_cache [instanceObject.customName] = func else Details:Msg("|cFFFF9900error compiling code for custom display " .. (instanceObject.customName or "") .. " |r:", errortext) end if (customObject.tooltip) then local tooltip_script, errortext = loadstring (customObject.tooltip) if (tooltip_script) then DetailsFramework:SetEnvironment(tooltip_script) Details.custom_function_cache [instanceObject.customName .. "Tooltip"] = tooltip_script else Details:Msg("|cFFFF9900error compiling tooltip code for custom display " .. (instanceObject.customName or "") .. " |r:", errortext) end scriptTypeName = "tooltip" end if (customObject.total_script) then local total_script, errortext = loadstring (customObject.total_script) if (total_script) then DetailsFramework:SetEnvironment(total_script) Details.custom_function_cache [instanceObject.customName .. "Total"] = total_script else Details:Msg("|cFFFF9900error compiling total code for custom display " .. (instanceObject.customName or "") .. " |r:", errortext) end scriptTypeName = "total" end if (customObject.percent_script) then local percent_script, errortext = loadstring (customObject.percent_script) if (percent_script) then DetailsFramework:SetEnvironment(percent_script) Details.custom_function_cache [instanceObject.customName .. "Percent"] = percent_script else Details:Msg("|cFFFF9900error compiling percent code for custom display " .. (instanceObject.customName or "") .. " |r:", errortext) end scriptTypeName = "percent" end end if (not func) then Details:Msg(Loc ["STRING_CUSTOM_FUNC_INVALID"], func) Details:EndRefresh (instanceObject, 0, combatObject, combatObject [1]) end local okey, _total, _top, _amount = pcall (func, combatObject, instance_container, instanceObject) if (not okey) then local errorText = _total Details:Msg("|cFFFF9900error on display " .. customObject:GetName() .. " (" .. scriptTypeName .. ")|r:", errorText) return Details:EndRefresh(instanceObject, 0, combatObject, combatObject[1]) end total = _total or 0 top = _top or 0 amount = _amount or 0 else --does not have a .script --get the attribute local attribute = customObject:GetAttribute() --"damagedone" --get the custom function(actor, source, target, spellid) local func = classCustom [attribute] --get the combat container local container_index = self:GetCombatContainerIndex (attribute) local combat_container = combatObject [container_index]._ActorTable --build container total, top, amount = classCustom:BuildActorList (func, customObject.source, customObject.target, customObject.spellid, combatObject, combat_container, container_index, instance_container, instanceObject, customObject) end if (customObject:IsSpellTarget()) then amount = classCustom._TargetActorsProcessedAmt total = classCustom._TargetActorsProcessedTotal top = classCustom._TargetActorsProcessedTop end if (amount == 0) then if (force) then if (instanceObject:IsGroupMode()) then for i = 1, instanceObject.rows_fit_in_window do Details.FadeHandler.Fader(instanceObject.barras [i], "in", Details.fade_speed) end end end instanceObject:EsconderScrollBar() return Details:EndRefresh (instanceObject, total, combatObject, nil) end if (amount > #instance_container._ActorTable) then amount = #instance_container._ActorTable end combatObject.totals [customObject:GetName()] = total instance_container:Sort() instance_container:Remap() if (export) then -- key name value need to be formated if (customObject) then local percent_script = Details.custom_function_cache [instanceObject.customName .. "Percent"] local total_script = Details.custom_function_cache [instanceObject.customName .. "Total"] local okey for index, actor in ipairs(instance_container._ActorTable) do local percent, ptotal if (percent_script) then okey, percent = pcall (percent_script, floor(actor.value), top, total, combatObject, instanceObject, actor) if (not okey) then Details:Msg("|cFFFF9900percent script error|r:", percent) return Details:EndRefresh (instanceObject, 0, combatObject, combatObject [1]) end else percent = format ("%.1f", floor(actor.value) / total * 100) end if (total_script) then local okey, value = pcall (total_script, floor(actor.value), top, total, combatObject, instanceObject, actor) if (not okey) then Details:Msg("|cFFFF9900total script error|r:", value) return Details:EndRefresh (instanceObject, 0, combatObject, combatObject [1]) end if (type(value) == "number") then value = SelectedToKFunction (_, value) end ptotal = value else ptotal = SelectedToKFunction (_, floor(actor.value)) end actor.report_value = ptotal .. " (" .. percent .. "%)" if (actor.id) then if (actor.id == 1) then actor.report_name = GetSpellLink(6603) elseif (actor.id > 10) then actor.report_name = GetSpellLink(actor.id) else actor.report_name = actor.nome end else actor.report_name = actor.nome end end end return total, instance_container._ActorTable, top, amount, "report_name" end instanceObject:RefreshScrollBar (amount) classCustom:Refresh (instanceObject, instance_container, combatObject, force, total, top, customObject) return Details:EndRefresh (instanceObject, total, combatObject, combatObject [container_index]) end function classCustom:BuildActorList (func, source, target, spellid, combat, combat_container, container_index, instance_container, instance, custom_object) local total = 0 local top = 0 local amount = 0 --check if is a spell target custom if (custom_object:IsSpellTarget()) then Details:Destroy(classCustom._TargetActorsProcessed) classCustom._TargetActorsProcessedAmt = 0 classCustom._TargetActorsProcessedTotal = 0 classCustom._TargetActorsProcessedTop = 0 instance_container:ResetCustomActorContainer() end if (source == "[all]") then for _, actor in ipairs(combat_container) do local actortotal = func (_, actor, source, target, spellid, combat, instance_container) if (actortotal > 0) then total = total + actortotal amount = amount + 1 if (actortotal > top) then top = actortotal end instance_container:SetValue(actor, actortotal) end end elseif (source == "[raid]") then if (Details.in_combat and instance.segmento == 0 and not export) then if (container_index == 1) then combat_container = Details.cache_damage_group elseif (container_index == 2) then combat_container = Details.cache_healing_group end end for _, actor in ipairs(combat_container) do if (actor.grupo) then if (not func) then Details:Msg("error on class_custom 'func' is invalid, backtrace:", debugstack()) return end local actortotal = func (_, actor, source, target, spellid, combat, instance_container) if (actortotal > 0) then total = total + actortotal amount = amount + 1 if (actortotal > top) then top = actortotal end instance_container:SetValue(actor, actortotal) end end end elseif (source == "[player]") then local pindex = combat [container_index]._NameIndexTable [Details.playername] if (pindex) then local actor = combat [container_index]._ActorTable [pindex] local actortotal = func (_, actor, source, target, spellid, combat, instance_container) if (actortotal > 0) then total = total + actortotal amount = amount + 1 if (actortotal > top) then top = actortotal end instance_container:SetValue(actor, actortotal) end end else local pindex = combat [container_index]._NameIndexTable [source] if (pindex) then local actor = combat [container_index]._ActorTable [pindex] local actortotal = func (_, actor, source, target, spellid, combat, instance_container) if (actortotal > 0) then total = total + actortotal amount = amount + 1 if (actortotal > top) then top = actortotal end instance_container:SetValue(actor, actortotal) end end end return total, top, amount end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --refresh functions function classCustom:Refresh (instance, instance_container, combat, force, total, top, custom_object) local whichRowLine = 1 local barContainer = instance.barras local percentageType = instance.row_info.percent_type local combatElapsedTime = combat:GetCombatTime() UsingCustomLeftText = instance.row_info.textL_enable_custom_text UsingCustomRightText = instance.row_info.textR_enable_custom_text --total bar local bUseTotalbar = false if (instance.total_bar.enabled) then bUseTotalbar = true if (instance.total_bar.only_in_group and (not IsInGroup() and not IsInRaid())) then bUseTotalbar = false end end local percent_script = Details.custom_function_cache [instance.customName .. "Percent"] local total_script = Details.custom_function_cache [instance.customName .. "Total"] local bars_show_data = instance.row_info.textR_show_data local bars_brackets = instance:GetBarBracket() local bars_separator = instance:GetBarSeparator() if (instance.bars_sort_direction == 1) then --top to bottom if (bUseTotalbar and instance.barraS[1] == 1) then whichRowLine = 2 local iter_last = instance.barraS[2] if (iter_last == instance.rows_fit_in_window) then iter_last = iter_last - 1 end local row1 = barContainer [1] row1.minha_tabela = nil row1.lineText1:SetText(Loc ["STRING_TOTAL"]) row1.lineText4:SetText(Details:ToK2 (total) .. " (" .. Details:ToK (total / combatElapsedTime) .. ")") row1:SetValue(100) local r, g, b = unpack(instance.total_bar.color) row1.textura:SetVertexColor(r, g, b) row1.icone_classe:SetTexture(instance.total_bar.icon) row1.icone_classe:SetTexCoord(0.0625, 0.9375, 0.0625, 0.9375) Details.FadeHandler.Fader(row1, "out") for i = instance.barraS[1], iter_last, 1 do instance_container._ActorTable[i]:UpdateBar (barContainer, whichRowLine, percentageType, i, total, top, instance, force, percent_script, total_script, combat, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end else for i = instance.barraS[1], instance.barraS[2], 1 do instance_container._ActorTable[i]:UpdateBar (barContainer, whichRowLine, percentageType, i, total, top, instance, force, percent_script, total_script, combat, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end end elseif (instance.bars_sort_direction == 2) then --bottom to top if (bUseTotalbar and instance.barraS[1] == 1) then whichRowLine = 2 local iter_last = instance.barraS[2] if (iter_last == instance.rows_fit_in_window) then iter_last = iter_last - 1 end local row1 = barContainer [1] row1.minha_tabela = nil row1.lineText1:SetText(Loc ["STRING_TOTAL"]) row1.lineText4:SetText(Details:ToK2 (total) .. " (" .. Details:ToK (total / combatElapsedTime) .. ")") row1:SetValue(100) local r, g, b = unpack(instance.total_bar.color) row1.textura:SetVertexColor(r, g, b) row1.icone_classe:SetTexture(instance.total_bar.icon) row1.icone_classe:SetTexCoord(0.0625, 0.9375, 0.0625, 0.9375) Details.FadeHandler.Fader(row1, "out") for i = iter_last, instance.barraS[1], -1 do --vai atualizar s� o range que esta sendo mostrado instance_container._ActorTable[i]:UpdateBar (barContainer, whichRowLine, percentageType, i, total, top, instance, force, percent_script, total_script, combat, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end else for i = instance.barraS[2], instance.barraS[1], -1 do --vai atualizar s� o range que esta sendo mostrado instance_container._ActorTable[i]:UpdateBar (barContainer, whichRowLine, percentageType, i, total, top, instance, force, percent_script, total_script, combat, bars_show_data, bars_brackets, bars_separator) whichRowLine = whichRowLine+1 end end end if (force) then if (instance:IsGroupMode()) then for i = whichRowLine, instance.rows_fit_in_window do Details.FadeHandler.Fader(instance.barras [i], "in", Details.fade_speed) end end end instance:AutoAlignInLineFontStrings() end ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --custom object functions local actor_class_color_r, actor_class_color_g, actor_class_color_b function classCustom:UpdateBar (row_container, index, percentage_type, rank, total, top, instance, is_forced, percent_script, total_script, combat, bars_show_data, bars_brackets, bars_separator) local row = row_container[index] local previous_table = row.minha_tabela row.colocacao = rank row.minha_tabela = self self.minha_barra = row local percent local okey --percent if (percent_script) then --local value, top, total, combat, instance = ... okey, percent = pcall (percent_script, self.value, top, total, combat, instance, self) if (not okey) then Details:Msg("|cFFFF9900error on custom display function|r:", percent) return Details:EndRefresh (instance, 0, combat, combat [1]) end else if (percentage_type == 1) then percent = format("%.1f", self.value / total * 100) .. "%" elseif (percentage_type == 2) then percent = format("%.1f", self.value / top * 100) .. "%" end end if (not percent) then percent = "" end --total done if (total_script) then local okey, value = pcall (total_script, self.value, top, total, combat, instance, self) if (not okey) then Details:Msg("|cFFFF9900error on custom display function|r:", value) return Details:EndRefresh (instance, 0, combat, combat [1]) end if (instance.use_multi_fontstrings) then if (type(value) == "string") then instance:SetInLineTexts(row, "", value, percent) --usando essa linha else instance:SetInLineTexts(row, "", SelectedToKFunction(_, value), percent) end else if (type(value) == "number") then row.lineText4:SetText(SelectedToKFunction (_, value) .. bars_brackets[1] .. percent .. bars_brackets[2]) else row.lineText4:SetText(value .. bars_brackets[1] .. percent .. bars_brackets[2]) end row.lineText3:SetText("") row.lineText2:SetText("") end else local formatedValue = SelectedToKFunction(_, self.value) local rightText = formatedValue .. bars_brackets[1] .. percent .. bars_brackets[2] if (UsingCustomRightText) then row.lineText4:SetText(stringReplace(instance.row_info.textR_custom_text, formatedValue, "", percent, self, combat, instance, rightText)) else if (instance.use_multi_fontstrings) then instance:SetInLineTexts(row, "", formatedValue, percent) else row.lineText4:SetText(rightText) row.lineText3:SetText("") row.lineText2:SetText("") end end end local row_value = floor((self.value / top) * 100) -- update tooltip function -- if (self.id) then local school = Details.spell_school_cache[self.nome] if (school) then local schoolColor = Details.spells_school[school] if (not schoolColor) then schoolColor = Details.spells_school[1] end actor_class_color_r, actor_class_color_g, actor_class_color_b = unpack(schoolColor.decimals) else local schoolColor = Details.spells_school[1] actor_class_color_r, actor_class_color_g, actor_class_color_b = unpack(schoolColor.decimals) end else actor_class_color_r, actor_class_color_g, actor_class_color_b = self:GetBarColor() end self:RefreshBarra2(row, instance, previous_table, is_forced, row_value, index, row_container) end function classCustom:RefreshBarra2 (esta_barra, instancia, tabela_anterior, forcar, esta_porcentagem, whichRowLine, barras_container) --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 esta_barra:SetValue(esta_porcentagem) 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 esta_barra:SetValue(esta_porcentagem) esta_barra.last_value = esta_porcentagem --reseta o ultimo valor da barra if (Details.is_using_row_animations and forcar) then esta_barra.tem_animacao = 0 esta_barra:SetScript("OnUpdate", nil) end 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 (Details.is_using_row_animations) then local upRow = barras_container [whichRowLine-1] if (upRow) then if (upRow.statusbar:GetValue() < esta_barra.statusbar:GetValue()) then esta_barra:SetValue(esta_porcentagem) else instancia:AnimarBarra (esta_barra, esta_porcentagem) end else instancia:AnimarBarra (esta_barra, esta_porcentagem) end else esta_barra:SetValue(esta_porcentagem) end esta_barra.last_value = esta_porcentagem end end end end function classCustom:RefreshBarra(thisBar, instanceObject, bFromResize) local class, enemy, arena_enemy, arena_ally = self.classe, self.enemy, self.arena_enemy, self.arena_ally if (bFromResize) then if (self.id) then local schoolData = Details.spell_school_cache[self.nome] if (schoolData) then local schoolColor = Details.spells_school[schoolData] if (not schoolColor) then schoolColor = Details.spells_school[1] end actor_class_color_r, actor_class_color_g, actor_class_color_b = unpack(schoolColor.decimals) else local schoolColor = Details.spells_school[1] actor_class_color_r, actor_class_color_g, actor_class_color_b = unpack(schoolColor.decimals) end else actor_class_color_r, actor_class_color_g, actor_class_color_b = self:GetBarColor() end end self:SetBarColors(thisBar, instanceObject, actor_class_color_r, actor_class_color_g, actor_class_color_b) --we need a customized icon settings for custom displays. if (self.classe == "UNKNOW") then thisBar.icone_classe:SetTexture("Interface\\LFGFRAME\\LFGROLE_BW") thisBar.icone_classe:SetTexCoord(.25, .5, 0, 1) thisBar.icone_classe:SetVertexColor(1, 1, 1) elseif (self.classe == "UNGROUPPLAYER") then if (self.enemy) then if (Details.faction_against == "Horde") then thisBar.icone_classe:SetTexture("Interface\\ICONS\\Achievement_Character_Orc_Male") thisBar.icone_classe:SetTexCoord(0, 1, 0, 1) else thisBar.icone_classe:SetTexture("Interface\\ICONS\\Achievement_Character_Human_Male") thisBar.icone_classe:SetTexCoord(0, 1, 0, 1) end else if (Details.faction_against == "Horde") then thisBar.icone_classe:SetTexture("Interface\\ICONS\\Achievement_Character_Human_Male") thisBar.icone_classe:SetTexCoord(0, 1, 0, 1) else thisBar.icone_classe:SetTexture("Interface\\ICONS\\Achievement_Character_Orc_Male") thisBar.icone_classe:SetTexCoord(0, 1, 0, 1) end end thisBar.icone_classe:SetVertexColor(1, 1, 1) elseif (self.classe == "PET") then thisBar.icone_classe:SetTexture(instanceObject.row_info.icon_file) thisBar.icone_classe:SetTexCoord(0.25, 0.49609375, 0.75, 1) thisBar.icone_classe:SetVertexColor(actor_class_color_r, actor_class_color_g, actor_class_color_b) else if (self.id) then thisBar.icone_classe:SetTexCoord(0.078125, 0.921875, 0.078125, 0.921875) thisBar.icone_classe:SetTexture(self.icon) else if (instanceObject.row_info.use_spec_icons) then if ((self.spec and self.spec ~= 0) or (self.my_actor.spec and self.my_actor.spec ~= 0)) then thisBar.icone_classe:SetTexture(instanceObject.row_info.spec_file) thisBar.icone_classe:SetTexCoord(unpack(Details.class_specs_coords[self.spec or self.my_actor.spec])) else thisBar.icone_classe:SetTexture([[Interface\AddOns\Details\images\classes_small]]) thisBar.icone_classe:SetTexCoord(unpack(Details.class_coords[self.classe])) end else thisBar.icone_classe:SetTexture(instanceObject.row_info.icon_file) thisBar.icone_classe:SetTexCoord(unpack(Details.class_coords[self.classe])) end end thisBar.icone_classe:SetVertexColor(1, 1, 1) end --left text self:SetBarLeftText(thisBar, instanceObject, enemy, arena_enemy, arena_ally, UsingCustomLeftText) thisBar.lineText1:SetSize(thisBar:GetWidth() - thisBar.lineText4:GetStringWidth() - 20, 15) end function classCustom:CreateCustomActorContainer() return setmetatable({ _NameIndexTable = {}, _ActorTable = {} }, {__index = classCustom}) end function classCustom:ResetCustomActorContainer() for _, actor in ipairs(self._ActorTable) do actor.value = actor.value - floor(actor.value) --actor.value = _detalhes:GetOrderNumber(actor.nome) end end function classCustom:WipeCustomActorContainer() Details:Destroy(self._ActorTable) Details:Destroy(self._NameIndexTable) end function classCustom:GetValue (actor) local actor_table = self:GetActorTable(actor) return actor_table.value end -- ~add function classCustom:AddValue (actor, actortotal, checktop, name_complement) local actor_table = self:GetActorTable(actor, name_complement) if (not getmetatable(actor)) then setmetatable(actor,classCustom.mt) end actor_table.my_actor = actor actor_table.value = actor_table.value + actortotal if (checktop) then if (actor_table.value > classCustom._TargetActorsProcessedTop) then classCustom._TargetActorsProcessedTop = actor_table.value end end return actor_table.value end function classCustom:SetValue(actor, actortotal, name_complement) local actor_table = self:GetActorTable(actor, name_complement) actor_table.my_actor = actor actor_table.value = actortotal end function classCustom:UpdateClass(actors) actors.new_actor.classe = actors.actor.classe end function classCustom:HasActor(actor) return self._NameIndexTable[actor.nome or actor.name] and true or false end function classCustom:GetNumActors() return #self._ActorTable end function classCustom:GetTotalAndHighestValue() local total, top = 0, 0 for i, actor in ipairs(self._ActorTable) do if (actor.value > top) then top = actor.value end total = total + actor.value end return total, top end local icon_cache = {} function classCustom:GetActorTable(actor, name_complement) local index = self._NameIndexTable[actor.nome or actor.name] if (index) then return self._ActorTable[index] else --if is a spell object local class if (actor.id) then local spellname, _, icon = _GetSpellInfo(actor.id) if (not icon_cache[spellname] and spellname) then icon_cache[spellname] = icon elseif (not spellname) then spellname = "" end actor.nome = spellname actor.name = spellname actor.classe = actor.spellschool class = actor.spellschool local index = self._NameIndexTable[actor.nome] if (index) then return self._ActorTable[index] end else class = actor.classe or actor.class if (not class or class == "UNKNOWN") then class = "UNKNOW" end if (class == "UNKNOW") then --try once again class = Details:GetClass(actor.nome or actor.name) if (class and class ~= "UNKNOW") then actor.classe = class end end end local newActor = setmetatable({ nome = actor.nome or actor.name, classe = class, value = Details:GetOrderNumber(), is_custom = true, color = actor.color, }, classCustom.mt) newActor.customColor = actor.customColor newActor.name_complement = name_complement newActor.displayName = actor.displayName or (Details:GetOnlyName(newActor.nome) .. (name_complement or "")) newActor:SetSpecId(actor.spec) newActor.enemy = actor.enemy newActor.role = actor.role newActor.arena_enemy = actor.arena_enemy newActor.arena_ally = actor.arena_ally newActor.arena_team = actor.arena_team if (actor.id) then newActor.id = actor.id --icon if (icon_cache[actor.nome]) then newActor.icon = icon_cache[actor.nome] else local _, _, icon = _GetSpellInfo(actor.id) if (icon) then icon_cache[actor.nome] = icon newActor.icon = icon end end else if (not newActor.classe) then newActor.classe = Details:GetClass(actor.nome or actor.name) or "UNKNOW" end if (newActor.classe == "UNGROUPPLAYER") then --atributo_custom:ScheduleTimer("UpdateClass", 5, {newActor = newActor, actor = actor}) Details.Schedules.NewTimer(5, classCustom.UpdateClass, self, {new_actor = newActor, actor = actor}) end end index = #self._ActorTable+1 self._ActorTable[index] = newActor self._NameIndexTable[actor.nome or actor.name] = index return newActor end end function classCustom:GetInstanceCustomActorContainer (instance) if (not classCustom._InstanceActorContainer [instance:GetId()]) then classCustom._InstanceActorContainer [instance:GetId()] = self:CreateCustomActorContainer() end return classCustom._InstanceActorContainer [instance:GetId()] end function classCustom:CreateCustomDisplayObject() return setmetatable({ name = "new custom", icon = [[Interface\ICONS\TEMP]], author = "unknown", attribute = "damagedone", source = "[all]", target = "[all]", spellid = false, script = false, }, {__index = classCustom}) end local custom_sort = function(t1, t2) return t1.value > t2.value end function classCustom:Sort (container) container = container or self sort (container._ActorTable, custom_sort) end function classCustom:Remap() local map = self._NameIndexTable local actors = self._ActorTable for i = 1, #actors do map [actors[i].nome] = i end end function classCustom:ToolTip (instanceObject, barNumber, rowObject, keydown) --get the custom object local customObject = instanceObject:GetCustomObject() if (customObject.notooltip) then return end --get the actor local actorObject = self.my_actor if (actorObject.id) then Details:AddTooltipSpellHeaderText (select(1, _GetSpellInfo(actorObject.id)), "yellow", 1, select(3, _GetSpellInfo(actorObject.id)), 0.90625, 0.109375, 0.15625, 0.875, false, 18) else Details:AddTooltipSpellHeaderText (customObject:GetName(), "yellow", 1, customObject:GetIcon(), 0.90625, 0.109375, 0.15625, 0.875, false, 18) end Details:AddTooltipHeaderStatusbar (1, 1, 1, 0.6) if (customObject:IsScripted()) then if (customObject.tooltip) then local func = Details.custom_function_cache [instanceObject.customName .. "Tooltip"] local okey, errortext = pcall(func, actorObject, instanceObject.showing, instanceObject, keydown) if (not okey) then Details:Msg("|cFFFF9900error on custom display tooltip function|r:", errortext) return false end end else --get the attribute local attribute = customObject:GetAttribute() local container_index = classCustom:GetCombatContainerIndex (attribute) --get the tooltip function local func = classCustom [attribute .. "Tooltip"] --build the tooltip func (_, actorObject, customObject.target, customObject.spellid, instanceObject.showing, instanceObject) end return true end function classCustom:GetName() return self.name end function classCustom:GetIcon() return self.icon end function classCustom:GetAuthor() return self.author end function classCustom:GetDesc() return self.desc end function classCustom:GetAttribute() return self.attribute end function classCustom:GetSource() return self.source end function classCustom:GetTarget() return self.target end function classCustom:GetSpellId() return self.spellid end function classCustom:GetScript() return self.script end function classCustom:GetScriptToolip() return self.tooltip end function classCustom:GetScriptTotal() return self.total_script end function classCustom:GetScriptPercent() return self.percent_script end function classCustom:SetName (name) self.name = name end function classCustom:SetIcon (path) self.icon = path end function classCustom:SetAuthor (author) self.author = author end function classCustom:SetDesc (desc) self.desc = desc end function classCustom:SetAttribute (newattribute) self.attribute = newattribute end function classCustom:SetSource (source) self.source = source end function classCustom:SetTarget (target) self.target = target end function classCustom:SetSpellId (spellid) self.spellid = spellid end function classCustom:SetScript(code) self.script = code end function classCustom:SetScriptToolip (code) self.tooltip = code end function classCustom:IsScripted() return self.script and true or false end function classCustom:IsSpellTarget() return self.spellid and self.target and true end function classCustom:RemoveCustom (index) if (not Details.tabela_instancias) then --do not remove customs while the addon is loading. return end table.remove (Details.custom, index) for _, instance in ipairs(Details.tabela_instancias) do if (instance.atributo == 5 and instance.sub_atributo == index) then instance:ResetAttribute() elseif (instance.atributo == 5 and instance.sub_atributo > index) then instance.sub_atributo = instance.sub_atributo - 1 instance.sub_atributo_last [5] = 1 else instance.sub_atributo_last [5] = 1 end end Details.switch:OnRemoveCustom (index) end --export for plugins function Details:RemoveCustomObject (object_name) for index, object in ipairs(Details.custom) do if (object.name == object_name) then return classCustom:RemoveCustom (index) end end end function Details:ResetCustomFunctionsCache() Details:Destroy(Details.custom_function_cache) end function Details.refresh:r_atributo_custom() --check for non used temp displays if (Details.tabela_instancias) then for i = #Details.custom, 1, -1 do local custom_object = Details.custom [i] if (custom_object.temp) then --check if there is a instance showing this custom local showing = false for index, instance in ipairs(Details.tabela_instancias) do if (instance.atributo == 5 and instance.sub_atributo == i) then showing = true end end if (not showing) then classCustom:RemoveCustom (i) end end end end --restore metatable and indexes for index, custom_object in ipairs(Details.custom) do setmetatable(custom_object, classCustom) custom_object.__index = classCustom end end function Details.clear:c_atributo_custom() for _, custom_object in ipairs(Details.custom) do custom_object.__index = nil end end function classCustom:UpdateSelectedToKFunction() SelectedToKFunction = ToKFunctions [Details.ps_abbreviation] FormatTooltipNumber = ToKFunctions [Details.tooltip.abbreviation] TooltipMaximizedMethod = Details.tooltip.maximize_method classCustom:UpdateDamageDoneBracket() classCustom:UpdateHealingDoneBracket() end function Details:InstallCustomObject (object) local have = false if (object.script_version) then for _, custom in ipairs(Details.custom) do if (custom.name == object.name and (custom.script_version and custom.script_version >= object.script_version) ) then have = true break end end else for _, custom in ipairs(Details.custom) do if (custom.name == object.name) then have = true break end end end if (not have) then for i, custom in ipairs(Details.custom) do if (custom.name == object.name) then table.remove (Details.custom, i) break end end setmetatable(object, Details.atributo_custom) object.__index = Details.atributo_custom Details.custom [#Details.custom+1] = object end end function Details222.GetCustomDisplayIDByName(customDisplayName) for customDisplayID, customObject in ipairs(Details.custom) do if (customObject.name == customDisplayName) then return customDisplayID end end end function Details:AddDefaultCustomDisplays() local PotionUsed = { name = Loc ["STRING_CUSTOM_POT_DEFAULT"], icon = [[Interface\ICONS\INV_Potion_03]], attribute = false, spellid = false, author = "Terciob", desc = Loc ["STRING_CUSTOM_POT_DEFAULT_DESC"], source = false, target = false, script_version = 8, import_string = "1EvBVnkoq4FlxKwDWDjCn6Q0kfD7kL(YwruUMOLK7JaoGPX3rSrgZwLV4F73yJ5LMxjPDfBBzHXZZZmEMhg7p0FHVxoRGhH9x57HkeRzCFVhWcejn)x89YWWROIG8iojt47LYIqPYWFGslW9LHcwM(3cuk83i2MvibCdHMlq0iSm8lYqhhh5e5e9s0pydsS2jjLX4w6hAREnhlk4uzyVEYWbdYfCc9fNeghm2Q3NCgM0RVb2)qd3Vn8MBSvohwYN6P8GCIVxmopY3ZBn7vz4RRzkMid3cXNmKJiXYWICm8BKmmJjim4LXfkKGyynqomnIvqfyUJVNgLpG4UkW2pQljV6Fg2tIyu)Nh(N3(5H367rrBW(EZn8CjqCyRkdNMsIv7vce)fSqD3oCSKnZw9V4ifNIkYfSn3ZOWwkfZBXYstA4Qz9vrvzmI2OYiAJUPV5hfBhmaq3K22qYJalJemUcEds1omLKlMLSuqsjITJvwLR9xBIo6jSq)QPGXwp84IXUt9cgVyX3DVB5Ihd(BxV7TlXnMzGfYLzJKtsuOg03qGQGsTXtYqeEU1bWhs(GBMidlVgmGrt3cffPOTaX1l(foRiRXesIm0QfcJCZFszXC9sSST1KI2SGQltsy13G8yC1Uje9jO0C8(MV)tANP17)a3XRksacvKjiBWVjNFe4lxXsT911cAE0oMGnbpfc1wy1RCH9S33Z6mYb97rZfnHuv7hdCscdQrbFfHO)Qq3IcScEqghBSd2CZzQkxrEtfjrDF6ROTWFhECSmjaniTs)hK41jG6kWVn7(LEbZNTWD2ZbUpyFCC0PJwOC2Kq1LUFtZjZD)(jJNQR9kOe8c85xMMMqRTm8Vay6mjBiBMgSoqqmn(8gnyakoUzpvu1BB6ep763rDB0444)rPU2UvTVoqNCr88WKVl9MxAN5v2xEYUYRPNulJQJb34(vFFCo71k9WsT0PU3fmB(Jph89XUpemE6utVH3okQNPBuJZc0Q0YpvEYwrdNS7yTDJRV4IBd5kNr4lTzPdSBq(bogTr0D3PPJzGdA9ShFf(a6fZStPvOD7f7PRu(4eX4x1QdxDOTRcZ1fwDs05891)SLTUszmvoXU7EVtjJtA07rBSujQvz2zlnAnRz1Th(BHVHb6)t5tGPdlh3EuZC3hCCw942ibCkJvfc9rFemwQGKvpf9Bt87mt9XMGUEK33POENfX)5iA)HksFPIYVtr4par32H)ZWHW6xE8IYqmYixwf5U0e2f8jQNqQ0NUut1KpfYIwTbQJD474gfRSQ5NAEhZpMdY7yQUDsb8cwJjVSwC632boywTc)fLo4ou0)Po2engoDQOiFfcoy07rCPQ12x47))d", script = [[ local combatObject, customContainer, instanceObject = ... local total, top, amount = 0, 0, 0 --get the misc actor container local listOfUtilityActors = combatObject:GetActorList(DETAILS_ATTRIBUTE_MISC) --do the loop: for _, actorObject in ipairs(listOfUtilityActors) do --only player in group if (actorObject:IsGroupPlayer()) then local bFoundPotion = false --get the spell debuff uptime container local debuffUptimeContainer = actorObject:GetSpellContainer("debuff") if (debuffUptimeContainer) then --potion of focus (can't use as pre-potion, so, its amount is always 1 local focusPotion = debuffUptimeContainer:GetSpell(DETAILS_FOCUS_POTION_ID) if (focusPotion) then total = total + 1 bFoundPotion = true if (top < 1) then top = 1 end --add amount to the player customContainer:AddValue(actorObject, 1) end end --get the spell buff uptime container local buffUptimeContainer = actorObject:GetSpellContainer("buff") if (buffUptimeContainer) then for spellId, potionPower in pairs(LIB_OPEN_RAID_ALL_POTIONS) do local spellTable = buffUptimeContainer:GetSpell(spellId) if (spellTable) then local used = spellTable.activedamt if (used and used > 0) then total = total + used bFoundPotion = true if (used > top) then top = used end --add amount to the player customContainer:AddValue(actorObject, used) end end end end if (bFoundPotion) then amount = amount + 1 end end end --return: return total, top, amount ]], tooltip = [[ local actorObject, combatObject, instanceObject = ... local iconSize = 20 local buffUptimeContainer = actorObject:GetSpellContainer("buff") if (buffUptimeContainer) then for spellId, potionPower in pairs(LIB_OPEN_RAID_ALL_POTIONS) do local spellTable = buffUptimeContainer:GetSpell(spellId) if (spellTable) then local used = spellTable.activedamt if (used and used > 0) then local spellName, _, spellIcon = GetSpellInfo(spellId) GameCooltip:AddLine(spellName, used) GameCooltip:AddIcon(spellIcon, 1, 1, iconSize, iconSize) Details:AddTooltipBackgroundStatusbar() end end end end ]], total_script = [[ local value, top, total, combat, instance = ... return math.floor(value) .. " " ]], percent_script = [[ local value, top, total, combat, instance = ... value = math.floor(value) return "" ]], } local have = false for _, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_POT_DEFAULT"] and (custom.script_version and custom.script_version >= PotionUsed.script_version) ) then have = true break end end if (not have) then for i, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_POT_DEFAULT"]) then table.remove (self.custom, i) end end setmetatable(PotionUsed, Details.atributo_custom) PotionUsed.__index = Details.atributo_custom self.custom [#self.custom+1] = PotionUsed end ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ -- /run _detalhes:AddDefaultCustomDisplays() local Healthstone = { name = Loc ["STRING_CUSTOM_HEALTHSTONE_DEFAULT"], icon = [[Interface\ICONS\INV_Stone_04]], attribute = false, spellid = false, author = "Terciob", desc = Loc ["STRING_CUSTOM_HEALTHSTONE_DEFAULT_DESC"], source = false, target = false, script = [[ local combatObject, instanceContainer, instanceObject = ... local total, top, amount = 0, 0, 0 local listOfHealingActors = combatObject:GetActorList(DETAILS_ATTRIBUTE_HEAL) for _, actorObject in ipairs(listOfHealingActors) do local listOfSpells = actorObject:GetSpellList() local found = false for spellId, spellTable in pairs(listOfSpells) do if (LIB_OPEN_RAID_HEALING_POTIONS[spellId]) then instanceContainer:AddValue(actorObject, spellTable.total) total = total + spellTable.total if (top < spellTable.total) then top = spellTable.total end found = true end end if (found) then amount = amount + 1 end end return total, top, amount ]], tooltip = [[ local actorObject, combatObject, instanceObject = ... local spellContainer = actorObject:GetSpellContainer("spell") local iconSize = 20 local allHealingPotions = {6262} for spellId, potionPower in pairs(LIB_OPEN_RAID_ALL_POTIONS) do allHealingPotions[#allHealingPotions+1] = spellId end for i = 1, #allHealingPotions do local spellId = allHealingPotions[i] local spellTable = spellContainer:GetSpell(spellId) if (spellTable) then local spellName, _, spellIcon = GetSpellInfo(spellId) GameCooltip:AddLine(spellName, Details:ToK(spellTable.total)) GameCooltip:AddIcon(spellIcon, 1, 1, iconSize, iconSize) GameCooltip:AddStatusBar (100, 1, 0, 0, 0, 0.75) end end ]], percent_script = false, total_script = false, script_version = 18, } -- /run _detalhes:AddDefaultCustomDisplays() local have = false for _, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_HEALTHSTONE_DEFAULT"] and (custom.script_version and custom.script_version >= Healthstone.script_version) ) then have = true break end end if (not have) then for i, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_HEALTHSTONE_DEFAULT"]) then table.remove (self.custom, i) end end setmetatable(Healthstone, Details.atributo_custom) Healthstone.__index = Details.atributo_custom self.custom [#self.custom+1] = Healthstone end --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- local DamageActivityTime = { name = Loc ["STRING_CUSTOM_ACTIVITY_DPS"], icon = [[Interface\Buttons\UI-MicroStream-Red]], attribute = false, spellid = false, author = "Details!", desc = Loc ["STRING_CUSTOM_ACTIVITY_DPS_DESC"], source = false, target = false, script_version = 4, total_script = [[ local value, top, total, combat, instance = ... local minutos, segundos = math.floor(value/60), math.floor(value%60) return minutos .. "m " .. segundos .. "s" ]], percent_script = [[ local value, top, total, combat, instance = ... return string.format("%.1f", value/top*100) ]], script = [[ local combatObject, instanceContainer, instanceObject = ... local total, amount = 0, 0 --get the damager actors local listOfDamageActors = combatObject:GetActorList(DETAILS_ATTRIBUTE_DAMAGE) for _, actorObject in ipairs(listOfDamageActors) do if (actorObject:IsGroupPlayer()) then local activity = actorObject:Tempo() total = total + activity amount = amount + 1 --add amount to the player instanceContainer:AddValue(actorObject, activity) end end --return: return total, combatObject:GetCombatTime(), amount ]], tooltip = [[ ]], } local have = false for _, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_ACTIVITY_DPS"] and (custom.script_version and custom.script_version >= DamageActivityTime.script_version) ) then have = true break end end if (not have) then for i, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_ACTIVITY_DPS"]) then table.remove (self.custom, i) end end setmetatable(DamageActivityTime, Details.atributo_custom) DamageActivityTime.__index = Details.atributo_custom self.custom [#self.custom+1] = DamageActivityTime end local HealActivityTime = { name = Loc ["STRING_CUSTOM_ACTIVITY_HPS"], icon = [[Interface\Buttons\UI-MicroStream-Green]], attribute = false, spellid = false, author = "Details!", desc = Loc ["STRING_CUSTOM_ACTIVITY_HPS_DESC"], source = false, target = false, script_version = 3, total_script = [[ local value, top, total, combat, instance = ... local minutos, segundos = math.floor(value/60), math.floor(value%60) return minutos .. "m " .. segundos .. "s" ]], percent_script = [[ local value, top, total, combat, instance = ... return string.format("%.1f", value/top*100) ]], script = [[ local combatObject, instanceContainer, instanceObject = ... local total, amount = 0, 0 --get the healing actors local listOfHealingActors = combatObject:GetActorList(DETAILS_ATTRIBUTE_HEAL) for _, actorObject in ipairs(listOfHealingActors) do if (actorObject:IsGroupPlayer()) then local activity = actorObject:Tempo() total = total + activity amount = amount + 1 --add amount to the player instanceContainer:AddValue (actorObject, activity) end end --return: return total, combatObject:GetCombatTime(), amount ]], tooltip = [[ ]], } local have = false for _, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_ACTIVITY_HPS"] and (custom.script_version and custom.script_version >= HealActivityTime.script_version) ) then have = true break end end if (not have) then for i, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_ACTIVITY_HPS"]) then table.remove (self.custom, i) end end setmetatable(HealActivityTime, Details.atributo_custom) HealActivityTime.__index = Details.atributo_custom self.custom [#self.custom+1] = HealActivityTime end --------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------- --doas local CC_Done = { name = Loc ["STRING_CUSTOM_CC_DONE"], icon = [[Interface\ICONS\Spell_Frost_FreezingBreath]], attribute = false, spellid = false, author = "Details!", desc = "Show the crowd control amount for each player.", source = false, target = false, script_version = 11, script = [[ local combat, instance_container, instance = ... local total, top, amount = 0, 0, 0 local misc_actors = combat:GetActorList (DETAILS_ATTRIBUTE_MISC) for index, character in ipairs(misc_actors) do if (character.cc_done and character:IsPlayer()) then local cc_done = floor(character.cc_done) instance_container:AddValue (character, cc_done) total = total + cc_done if (cc_done > top) then top = cc_done end amount = amount + 1 end end return total, top, amount ]], tooltip = [[ local actor, combat, instance = ... local spells = {} for spellid, spell in pairs(actor.cc_done_spells._ActorTable) do tinsert(spells, {spellid, spell.counter}) end table.sort (spells, _detalhes.Sort2) for index, spell in ipairs(spells) do local name, _, icon = GetSpellInfo(spell [1]) GameCooltip:AddLine(name, spell [2]) _detalhes:AddTooltipBackgroundStatusbar() GameCooltip:AddIcon (icon, 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height) end local targets = {} for playername, amount in pairs(actor.cc_done_targets) do tinsert(targets, {playername, amount}) end table.sort (targets, _detalhes.Sort2) _detalhes:AddTooltipSpellHeaderText ("Targets", "yellow", #targets) local class, _, _, _, _, r, g, b = _detalhes:GetClass(actor.nome) _detalhes:AddTooltipHeaderStatusbar (1, 1, 1, 0.6) for index, target in ipairs(targets) do GameCooltip:AddLine(target[1], target [2]) _detalhes:AddTooltipBackgroundStatusbar() local class, _, _, _, _, r, g, b = _detalhes:GetClass(target [1]) if (class and class ~= "UNKNOW") then local texture, l, r, t, b = _detalhes:GetClassIcon(class) GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small_alpha", 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height, l, r, t, b) else GameCooltip:AddIcon ("Interface\\GossipFrame\\IncompleteQuestIcon", 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height) end -- end ]], total_script = [[ local value, top, total, combat, instance = ... return floor(value) ]], } -- /run _detalhes:AddDefaultCustomDisplays() local have = false for _, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_CC_DONE"] and (custom.script_version and custom.script_version >= CC_Done.script_version) ) then have = true break end end if (not have) then setmetatable(CC_Done, Details.atributo_custom) CC_Done.__index = Details.atributo_custom for i, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_CC_DONE"]) then table.remove (self.custom, i) tinsert(self.custom, i, CC_Done) have = true end end if (not have) then self.custom [#self.custom+1] = CC_Done end end ---------------------------------------------------------------------------------------------------------------------------------------------------- local CC_Received = { name = Loc ["STRING_CUSTOM_CC_RECEIVED"], icon = [[Interface\ICONS\Spell_Frost_ChainsOfIce]], attribute = false, spellid = false, author = "Details!", desc = "Show the amount of crowd control received for each player.", source = false, target = false, script_version = 3, script = [[ local combat, instance_container, instance = ... local total, top, amt = 0, 0, 0 local misc_actors = combat:GetActorList (DETAILS_ATTRIBUTE_MISC) DETAILS_CUSTOM_CC_RECEIVED_CACHE = DETAILS_CUSTOM_CC_RECEIVED_CACHE or {} wipe (DETAILS_CUSTOM_CC_RECEIVED_CACHE) for index, character in ipairs(misc_actors) do if (character.cc_done and character:IsPlayer()) then for player_name, amount in pairs(character.cc_done_targets) do local target = combat (1, player_name) or combat (2, player_name) if (target and target:IsPlayer()) then instance_container:AddValue (target, amount) total = total + amount if (amount > top) then top = amount end if (not DETAILS_CUSTOM_CC_RECEIVED_CACHE [player_name]) then DETAILS_CUSTOM_CC_RECEIVED_CACHE [player_name] = true amt = amt + 1 end end end end end return total, top, amt ]], tooltip = [[ local actor, combat, instance = ... local name = actor:name() local spells, from = {}, {} local misc_actors = combat:GetActorList (DETAILS_ATTRIBUTE_MISC) for index, character in ipairs(misc_actors) do if (character.cc_done and character:IsPlayer()) then local on_actor = character.cc_done_targets [name] if (on_actor) then tinsert(from, {character:name(), on_actor}) for spellid, spell in pairs(character.cc_done_spells._ActorTable) do local spell_on_actor = spell.targets [name] if (spell_on_actor) then local has_spell for index, spell_table in ipairs(spells) do if (spell_table [1] == spellid) then spell_table [2] = spell_table [2] + spell_on_actor has_spell = true end end if (not has_spell) then tinsert(spells, {spellid, spell_on_actor}) end end end end end end table.sort (from, _detalhes.Sort2) table.sort (spells, _detalhes.Sort2) for index, spell in ipairs(spells) do local name, _, icon = GetSpellInfo(spell [1]) GameCooltip:AddLine(name, spell [2]) _detalhes:AddTooltipBackgroundStatusbar() GameCooltip:AddIcon (icon, 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height) end _detalhes:AddTooltipSpellHeaderText ("From", "yellow", #from) _detalhes:AddTooltipHeaderStatusbar (1, 1, 1, 0.6) for index, t in ipairs(from) do GameCooltip:AddLine(t[1], t[2]) _detalhes:AddTooltipBackgroundStatusbar() local class, _, _, _, _, r, g, b = _detalhes:GetClass(t [1]) if (class and class ~= "UNKNOW") then local texture, l, r, t, b = _detalhes:GetClassIcon(class) GameCooltip:AddIcon ("Interface\\AddOns\\Details\\images\\classes_small_alpha", 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height, l, r, t, b) else GameCooltip:AddIcon ("Interface\\GossipFrame\\IncompleteQuestIcon", 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height) end end ]], total_script = [[ local value, top, total, combat, instance = ... return floor(value) ]], } -- /run _detalhes:AddDefaultCustomDisplays() local have = false for _, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_CC_RECEIVED"] and (custom.script_version and custom.script_version >= CC_Received.script_version) ) then have = true break end end if (not have) then setmetatable(CC_Received, Details.atributo_custom) CC_Received.__index = Details.atributo_custom for i, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_CC_RECEIVED"]) then table.remove (self.custom, i) tinsert(self.custom, i, CC_Received) have = true end end if (not have) then self.custom [#self.custom+1] = CC_Received end end ---------------------------------------------------------------------------------------------------------------------------------------------------- local MySpells = { name = Loc ["STRING_CUSTOM_MYSPELLS"], icon = [[Interface\CHATFRAME\UI-ChatIcon-Battlenet]], attribute = false, spellid = false, author = "Details!", desc = Loc ["STRING_CUSTOM_MYSPELLS_DESC"], source = false, target = false, script_version = 10, script = [[ --get the parameters passed local combat, instance_container, instance = ... --declade the values to return local total, top, amount = 0, 0, 0 local player local pet_attribute local role = DetailsFramework.UnitGroupRolesAssigned("player") local spec = DetailsFramework.GetSpecialization() role = spec and DetailsFramework.GetSpecializationRole (spec) or role if (role == "DAMAGER") then player = combat (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) pet_attribute = DETAILS_ATTRIBUTE_DAMAGE elseif (role == "HEALER") then player = combat (DETAILS_ATTRIBUTE_HEAL, _detalhes.playername) pet_attribute = DETAILS_ATTRIBUTE_HEAL else player = combat (DETAILS_ATTRIBUTE_DAMAGE, _detalhes.playername) pet_attribute = DETAILS_ATTRIBUTE_DAMAGE end --do the loop if (player) then local spells = player:GetSpellList() for spellid, spell in pairs(spells) do instance_container:AddValue (spell, spell.total) total = total + spell.total if (top < spell.total) then top = spell.total end amount = amount + 1 end for _, PetName in ipairs(player.pets) do local pet = combat (pet_attribute, PetName) if (pet) then for spellid, spell in pairs(pet:GetSpellList()) do instance_container:AddValue (spell, spell.total, nil, " (" .. PetName:gsub((" <.*"), "") .. ")") total = total + spell.total if (top < spell.total) then top = spell.total end amount = amount + 1 end end end end --return the values return total, top, amount ]], tooltip = [[ --config: --Background RBG and Alpha: local R, G, B, A = 0, 0, 0, 0.75 local R, G, B, A = 0.1960, 0.1960, 0.1960, 0.8697 --get the parameters passed local spell, combat, instance = ... --get the cooltip object (we dont use the convencional GameTooltip here) local GC = GameCooltip GC:SetOption("YSpacingMod", 0) local role = DetailsFramework.UnitGroupRolesAssigned("player") if (spell.n_total) then local spellschool, schooltext = spell.spellschool, "" if (spellschool) then local t = Details.spells_school [spellschool] if (t and t.name) then schooltext = t.formated end end local total_hits = spell.counter local combat_time = instance.showing:GetCombatTime() local debuff_uptime_total, cast_string = "", "" local misc_actor = instance.showing (4, Details.playername) if (misc_actor) then local debuff_uptime = misc_actor.debuff_uptime_spells and misc_actor.debuff_uptime_spells._ActorTable [spell.id] and misc_actor.debuff_uptime_spells._ActorTable [spell.id].uptime if (debuff_uptime) then debuff_uptime_total = floor(debuff_uptime / instance.showing:GetCombatTime() * 100) end local spellName = GetSpellInfo(spell.id) local amountOfCasts = combat:GetSpellCastAmount(Details.playername, spellName) if (amountOfCasts == 0) then amountOfCasts = "(|cFFFFFF00?|r)" end cast_string = cast_string .. amountOfCasts end --Cooltip code GC:AddLine("Casts:", cast_string or "?") GC:AddStatusBar (100, 1, R, G, B, A) if (debuff_uptime_total ~= "") then GC:AddLine("Uptime:", (debuff_uptime_total or "?") .. "%") GC:AddStatusBar (100, 1, R, G, B, A) end GC:AddLine("Hits:", spell.counter) GC:AddStatusBar (100, 1, R, G, B, A) local average = spell.total / total_hits GC:AddLine("Average:", _detalhes:ToK (average)) GC:AddStatusBar (100, 1, R, G, B, A) GC:AddLine("E-Dps:", _detalhes:ToK (spell.total / combat_time)) GC:AddStatusBar (100, 1, R, G, B, A) GC:AddLine("School:", schooltext) GC:AddStatusBar (100, 1, R, G, B, A) --GC:AddLine(" ") GC:AddLine("Normal Hits: ", spell.n_amt .. " (" ..floor( spell.n_amt/total_hits*100) .. "%)") GC:AddStatusBar (100, 1, R, G, B, A) local n_average = spell.n_total / spell.n_amt local T = (combat_time*spell.n_total)/spell.total local P = average/n_average*100 T = P*T/100 GC:AddLine("Average / E-Dps: ", _detalhes:ToK (n_average) .. " / " .. format("%.1f",spell.n_total / T )) GC:AddStatusBar (100, 1, R, G, B, A) --GC:AddLine(" ") GC:AddLine("Critical Hits: ", spell.c_amt .. " (" ..floor( spell.c_amt/total_hits*100) .. "%)") GC:AddStatusBar (100, 1, R, G, B, A) if (spell.c_amt > 0) then local c_average = spell.c_total/spell.c_amt local T = (combat_time*spell.c_total)/spell.total local P = average/c_average*100 T = P*T/100 local crit_dps = spell.c_total / T GC:AddLine("Average / E-Dps: ", _detalhes:ToK (c_average) .. " / " .. _detalhes:comma_value (crit_dps)) else GC:AddLine("Average / E-Dps: ", "0 / 0") end GC:AddStatusBar (100, 1, R, G, B, A) elseif (spell.n_total) then local spellschool, schooltext = spell.spellschool, "" if (spellschool) then local t = _detalhes.spells_school [spellschool] if (t and t.name) then schooltext = t.formated end end local total_hits = spell.counter local combat_time = instance.showing:GetCombatTime() --Cooltip code GC:AddLine("Hits:", spell.counter) GC:AddStatusBar (100, 1, R, G, B, A) local average = spell.total / total_hits GC:AddLine("Average:", _detalhes:ToK (average)) GC:AddStatusBar (100, 1, R, G, B, A) GC:AddLine("E-Hps:", _detalhes:ToK (spell.total / combat_time)) GC:AddStatusBar (100, 1, R, G, B, A) GC:AddLine("School:", schooltext) GC:AddStatusBar (100, 1, R, G, B, A) --GC:AddLine(" ") GC:AddLine("Normal Hits: ", spell.n_amt .. " (" ..floor( spell.n_amt/total_hits*100) .. "%)") GC:AddStatusBar (100, 1, R, G, B, A) local n_average = spell.n_total / spell.n_amt local T = (combat_time*spell.n_total)/spell.total local P = average/n_average*100 T = P*T/100 GC:AddLine("Average / E-Dps: ", _detalhes:ToK (n_average) .. " / " .. format("%.1f",spell.n_total / T )) GC:AddStatusBar (100, 1, R, G, B, A) --GC:AddLine(" ") GC:AddLine("Critical Hits: ", spell.c_amt .. " (" ..floor( spell.c_amt/total_hits*100) .. "%)") GC:AddStatusBar (100, 1, R, G, B, A) if (spell.c_amt > 0) then local c_average = spell.c_total/spell.c_amt local T = (combat_time*spell.c_total)/spell.total local P = average/c_average*100 T = P*T/100 local crit_dps = spell.c_total / T GC:AddLine("Average / E-Hps: ", _detalhes:ToK (c_average) .. " / " .. _detalhes:comma_value (crit_dps)) else GC:AddLine("Average / E-Hps: ", "0 / 0") end GC:AddStatusBar (100, 1, R, G, B, A) end ]], percent_script = [[ local value, top, total, combat, instance = ... local dps = _detalhes:ToK (floor(value) / combat:GetCombatTime()) local percent = string.format("%.1f", value/total*100) return dps .. ", " .. percent ]], } local have = false for _, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_MYSPELLS"] and (custom.script_version and custom.script_version >= MySpells.script_version) ) then have = true break end end if (not have) then setmetatable(MySpells, Details.atributo_custom) MySpells.__index = Details.atributo_custom for i, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_MYSPELLS"]) then table.remove (self.custom, i) tinsert(self.custom, i, MySpells) have = true end end if (not have) then self.custom [#self.custom+1] = MySpells end end ---------------------------------------------------------------------------------------------------------------------------------------------------- local DamageOnSkullTarget = { name = Loc ["STRING_CUSTOM_DAMAGEONSKULL"], icon = [[Interface\TARGETINGFRAME\UI-RaidTargetingIcon_8]], attribute = false, spellid = false, author = "Details!", desc = Loc ["STRING_CUSTOM_DAMAGEONSKULL_DESC"], source = false, target = false, script_version = 3, script = [[ --get the parameters passed local Combat, CustomContainer, Instance = ... --declade the values to return local total, top, amount = 0, 0, 0 --raid target flags: -- 128: skull -- 64: cross -- 32: square -- 16: moon -- 8: triangle -- 4: diamond -- 2: circle -- 1: star --do the loop for _, actor in ipairs(Combat:GetActorList (DETAILS_ATTRIBUTE_DAMAGE)) do if (actor:IsPlayer()) then if (actor.raid_targets [128]) then CustomContainer:AddValue (actor, actor.raid_targets [128]) end end end --if not managed inside the loop, get the values of total, top and amount total, top = CustomContainer:GetTotalAndHighestValue() amount = CustomContainer:GetNumActors() --return the values return total, top, amount ]], tooltip = [[ --get the parameters passed local actor, combat, instance = ... --get the cooltip object (we dont use the convencional GameTooltip here) local GameCooltip = GameCooltip --Cooltip code local format_func = Details:GetCurrentToKFunction() --Cooltip code local RaidTargets = actor.raid_targets local DamageOnStar = RaidTargets [128] if (DamageOnStar) then --RAID_TARGET_8 is the built-in localized word for 'Skull'. GameCooltip:AddLine(RAID_TARGET_8 .. ":", format_func (_, DamageOnStar)) GameCooltip:AddIcon ("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_8", 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height) Details:AddTooltipBackgroundStatusbar() end ]], } -- /run _detalhes:AddDefaultCustomDisplays() local have = false for _, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_DAMAGEONSKULL"] and (custom.script_version and custom.script_version >= DamageOnSkullTarget.script_version) ) then have = true break end end if (not have) then setmetatable(DamageOnSkullTarget, Details.atributo_custom) DamageOnSkullTarget.__index = Details.atributo_custom for i, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_DAMAGEONSKULL"]) then table.remove (self.custom, i) tinsert(self.custom, i, DamageOnSkullTarget) have = true end end if (not have) then self.custom [#self.custom+1] = DamageOnSkullTarget end end ---------------------------------------------------------------------------------------------------------------------------------------------------- local DamageOnAnyTarget = { name = Loc ["STRING_CUSTOM_DAMAGEONANYMARKEDTARGET"], icon = [[Interface\TARGETINGFRAME\UI-RaidTargetingIcon_5]], attribute = false, spellid = false, author = "Details!", desc = Loc ["STRING_CUSTOM_DAMAGEONANYMARKEDTARGET_DESC"], source = false, target = false, script_version = 3, script = [[ --get the parameters passed local Combat, CustomContainer, Instance = ... --declade the values to return local total, top, amount = 0, 0, 0 --do the loop for _, actor in ipairs(Combat:GetActorList (DETAILS_ATTRIBUTE_DAMAGE)) do if (actor:IsPlayer()) then local total = (actor.raid_targets [1] or 0) --star total = total + (actor.raid_targets [2] or 0) --circle total = total + (actor.raid_targets [4] or 0) --diamond total = total + (actor.raid_targets [8] or 0) --tiangle total = total + (actor.raid_targets [16] or 0) --moon total = total + (actor.raid_targets [32] or 0) --square total = total + (actor.raid_targets [64] or 0) --cross if (total > 0) then CustomContainer:AddValue (actor, total) end end end --if not managed inside the loop, get the values of total, top and amount total, top = CustomContainer:GetTotalAndHighestValue() amount = CustomContainer:GetNumActors() --return the values return total, top, amount ]], tooltip = [[ --get the parameters passed local actor, combat, instance = ... --get the cooltip object local GameCooltip = GameCooltip local format_func = Details:GetCurrentToKFunction() --Cooltip code local RaidTargets = actor.raid_targets local DamageOnStar = RaidTargets [1] if (DamageOnStar) then GameCooltip:AddLine(RAID_TARGET_1 .. ":", format_func (_, DamageOnStar)) GameCooltip:AddIcon ("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_1", 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height) Details:AddTooltipBackgroundStatusbar() end local DamageOnCircle = RaidTargets [2] if (DamageOnCircle) then GameCooltip:AddLine(RAID_TARGET_2 .. ":", format_func (_, DamageOnCircle)) GameCooltip:AddIcon ("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_2", 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height) Details:AddTooltipBackgroundStatusbar() end local DamageOnDiamond = RaidTargets [4] if (DamageOnDiamond) then GameCooltip:AddLine(RAID_TARGET_3 .. ":", format_func (_, DamageOnDiamond)) GameCooltip:AddIcon ("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_3", 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height) Details:AddTooltipBackgroundStatusbar() end local DamageOnTriangle = RaidTargets [8] if (DamageOnTriangle) then GameCooltip:AddLine(RAID_TARGET_4 .. ":", format_func (_, DamageOnTriangle)) GameCooltip:AddIcon ("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_4", 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height) Details:AddTooltipBackgroundStatusbar() end local DamageOnMoon = RaidTargets [16] if (DamageOnMoon) then GameCooltip:AddLine(RAID_TARGET_5 .. ":", format_func (_, DamageOnMoon)) GameCooltip:AddIcon ("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_5", 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height) Details:AddTooltipBackgroundStatusbar() end local DamageOnSquare = RaidTargets [32] if (DamageOnSquare) then GameCooltip:AddLine(RAID_TARGET_6 .. ":", format_func (_, DamageOnSquare)) GameCooltip:AddIcon ("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_6", 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height) Details:AddTooltipBackgroundStatusbar() end local DamageOnCross = RaidTargets [64] if (DamageOnCross) then GameCooltip:AddLine(RAID_TARGET_7 .. ":", format_func (_, DamageOnCross)) GameCooltip:AddIcon ("Interface\\TARGETINGFRAME\\UI-RaidTargetingIcon_7", 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height) Details:AddTooltipBackgroundStatusbar() end ]], } -- /run _detalhes:AddDefaultCustomDisplays() local have = false for _, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_DAMAGEONANYMARKEDTARGET"] and (custom.script_version and custom.script_version >= DamageOnAnyTarget.script_version) ) then have = true break end end if (not have) then setmetatable(DamageOnAnyTarget, Details.atributo_custom) DamageOnAnyTarget.__index = Details.atributo_custom for i, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_DAMAGEONANYMARKEDTARGET"]) then table.remove (self.custom, i) tinsert(self.custom, i, DamageOnAnyTarget) have = true end end if (not have) then self.custom [#self.custom+1] = DamageOnAnyTarget end end ---------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- local DynamicOverallDamage = { name = Loc ["STRING_CUSTOM_DYNAMICOVERAL"], --"Dynamic Overall Damage", displayName = Loc ["STRING_ATTRIBUTE_DAMAGE_DONE"], icon = [[Interface\Buttons\Spell-Reset]], attribute = false, spellid = false, author = "Details!", desc = "Show overall damage done on the fly.", source = false, target = false, script_version = 8, script = [[ --init: local combat, instance_container, instance = ... local total, top, amount = 0, 0, 0 --get the overall combat local OverallCombat = Details:GetCombat(-1) --get the current combat local CurrentCombat = Details:GetCombat(0) if (not OverallCombat.GetActorList or not CurrentCombat.GetActorList) then return 0, 0, 0 end --get the damage actor container for overall local damage_container_overall = OverallCombat:GetActorList ( DETAILS_ATTRIBUTE_DAMAGE ) --get the damage actor container for current local damage_container_current = CurrentCombat:GetActorList ( DETAILS_ATTRIBUTE_DAMAGE ) --do the loop: for _, player in ipairs( damage_container_overall ) do --only player in group if (player:IsGroupPlayer()) then instance_container:AddValue (player, player.total) end end if (Details.in_combat) then for _, player in ipairs( damage_container_current ) do --only player in group if (player:IsGroupPlayer()) then instance_container:AddValue (player, player.total) end end end total, top = instance_container:GetTotalAndHighestValue() amount = instance_container:GetNumActors() --return: return total, top, amount ]], tooltip = [[ --get the parameters passed local actor, combat, instance = ... --get the cooltip object (we dont use the convencional GameTooltip here) local GameCooltip = GameCooltip2 --Cooltip code --get the overall combat local OverallCombat = Details:GetCombat(-1) --get the current combat local CurrentCombat = Details:GetCombat(0) local AllSpells = {} local playerTotal = 0 --overall local player = OverallCombat [1]:GetActor(actor.nome) if (player) then playerTotal = playerTotal + player.total local playerSpells = player:GetSpellList() for spellID, spellTable in pairs(playerSpells) do AllSpells [spellID] = spellTable.total end end --current if (Details.in_combat) then local player = CurrentCombat [1]:GetActor(actor.nome) if (player) then playerTotal = playerTotal + player.total local playerSpells = player:GetSpellList() for spellID, spellTable in pairs(playerSpells) do AllSpells [spellID] = (AllSpells [spellID] or 0) + (spellTable.total or 0) end end end local sortedList = {} for spellID, total in pairs(AllSpells) do tinsert(sortedList, {spellID, total}) end table.sort (sortedList, Details.Sort2) local format_func = Details:GetCurrentToKFunction() --build the tooltip local topSpellTotal = sortedList and sortedList[1] and sortedList[1][2] or 0 for i, t in ipairs(sortedList) do local spellID, total = unpack(t) if (total > 1) then local spellName, _, spellIcon = Details.GetSpellInfo(spellID) local spellPercent = total / playerTotal * 100 local formatedSpellPercent = format("%.1f", spellPercent) if (string.len(formatedSpellPercent) < 4) then formatedSpellPercent = formatedSpellPercent .. "0" end GameCooltip:AddLine(spellName, format_func (_, total) .. " " .. formatedSpellPercent .. "%") Details:AddTooltipBackgroundStatusbar(false, total / topSpellTotal * 100) GameCooltip:AddIcon (spellIcon, 1, 1, _detalhes.tooltip.line_height, _detalhes.tooltip.line_height, 0.078125, 0.921875, 0.078125, 0.921875) end end ]], total_script = [[ local value, top, total, combat, instance = ... return value ]], percent_script = [[ local value, top, total, combat, instance = ... --get the time of overall combat local OverallCombatTime = Details:GetCombat(-1):GetCombatTime() --get the time of current combat if the player is in combat if (Details.in_combat) then local CurrentCombatTime = Details:GetCombat(0):GetCombatTime() OverallCombatTime = OverallCombatTime + CurrentCombatTime end --calculate the DPS and return it as percent local totalValue = value --build the string local ToK = Details:GetCurrentToKFunction() local s = ToK (_, value / OverallCombatTime) return s ]], } local have = false for _, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_DYNAMICOVERAL"] and (custom.script_version and custom.script_version >= DynamicOverallDamage.script_version) ) then have = true break end end if (not have) then for i, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_DYNAMICOVERAL"]) then table.remove (self.custom, i) end end setmetatable(DynamicOverallDamage, Details.atributo_custom) DynamicOverallDamage.__index = Details.atributo_custom self.custom [#self.custom+1] = DynamicOverallDamage end --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- local DamageOnShields = { name = Loc ["STRING_CUSTOM_DAMAGEONSHIELDS"], icon = [[Interface\ICONS\Spell_Holy_PowerWordShield]], attribute = false, spellid = false, author = "Details!", desc = "Damage done to shields", source = false, target = false, script_version = 1, script = [[ --get the parameters passed local Combat, CustomContainer, Instance = ... --declade the values to return local total, top, amount = 0, 0, 0 --do the loop for index, actor in ipairs(Combat:GetActorList(1)) do if (actor:IsPlayer()) then --get the actor total damage absorbed local totalAbsorb = actor.totalabsorbed --get the damage absorbed by all the actor pets for petIndex, petName in ipairs(actor.pets) do local pet = Combat :GetActor(1, petName) if (pet) then totalAbsorb = totalAbsorb + pet.totalabsorbed end end --add the value to the actor on the custom container CustomContainer:AddValue (actor, totalAbsorb) end end --loop end --if not managed inside the loop, get the values of total, top and amount total, top = CustomContainer:GetTotalAndHighestValue() amount = CustomContainer:GetNumActors() --return the values return total, top, amount ]], tooltip = [[ --get the parameters passed local actor, Combat, instance = ... --get the cooltip object (we dont use the convencional GameTooltip here) local GameCooltip = GameCooltip --Cooltip code --get the actor total damage absorbed local totalAbsorb = actor.totalabsorbed local format_func = Details:GetCurrentToKFunction() --get the damage absorbed by all the actor pets for petIndex, petName in ipairs(actor.pets) do local pet = Combat :GetActor(1, petName) if (pet) then totalAbsorb = totalAbsorb + pet.totalabsorbed end end GameCooltip:AddLine(actor:Name(), format_func (_, actor.totalabsorbed)) Details:AddTooltipBackgroundStatusbar() for petIndex, petName in ipairs(actor.pets) do local pet = Combat :GetActor(1, petName) if (pet) then totalAbsorb = totalAbsorb + pet.totalabsorbed GameCooltip:AddLine(petName, format_func (_, pet.totalabsorbed)) Details:AddTooltipBackgroundStatusbar() end end ]], } local have = false for _, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_DAMAGEONSHIELDS"] and (custom.script_version and custom.script_version >= DamageOnShields.script_version) ) then have = true break end end if (not have) then for i, custom in ipairs(self.custom) do if (custom.name == Loc ["STRING_CUSTOM_DAMAGEONSHIELDS"]) then table.remove (self.custom, i) end end setmetatable(DamageOnShields, Details.atributo_custom) DamageOnShields.__index = Details.atributo_custom self.custom [#self.custom+1] = DamageOnShields end --------------------------------------- Details:ResetCustomFunctionsCache() end