do local Details = Details if (not Details) then print ("Details! Not Found.") return end local _ local DF = _G.DetailsFramework local _ipairs = ipairs local unpack = _G.unpack local gameCooltip = GameCooltip2 --> minimal details version required to run this plugin local MINIMAL_DETAILS_VERSION_REQUIRED = 136 local COMPARETWO_VERSION = "v1.0.0" --> create a plugin object local compareTwo = Details:NewPluginObject ("Details_Compare2", _G.DETAILSPLUGIN_ALWAYSENABLED) --> just localizing here the plugin's main frame local frame = compareTwo.Frame --> set the description compareTwo:SetPluginDescription("Replaces the default comparison window on the player breakdown.") --> when receiving an event from details, handle it here local handle_details_event = function (event, ...) if (event == "COMBAT_PLAYER_ENTER") then elseif (event == "COMBAT_PLAYER_LEAVE") then elseif (event == "PLUGIN_DISABLED") then --> plugin has been disabled at the details options panel elseif (event == "PLUGIN_ENABLED") then --> plugin has been enabled at the details options panel elseif (event == "DETAILS_DATA_SEGMENTREMOVED") then --> old segment got deleted by the segment limit elseif (event == "DETAILS_DATA_RESET") then --> combat data got wiped end end function compareTwo.InstallAdvancedCompareWindow() --colors to use on percent number local red = "FFFFAAAA" local green = "FFAAFFAA" local plus = red .. "-" local minor = green .. "+" local comparisonFrameSettings = { --main player scroll frame mainScrollWidth = 250, petColor = "|cFFCCBBBB", --spell scroll spellScrollHeight = 300, spellLineAmount = 14, spellLineHeight = 20, --target scroll targetScrollHeight = 130, targetScrollLineAmount = 6, targetScrollLineHeight = 20, --comparison scrolls comparisonScrollWidth = 140, targetMaxLines = 16, targetTooltipLineHeight = 16, --font settings fontSize = 10, playerNameSize = 12, playerNameYOffset = 12, --line colors lineOnEnterColor = {.85, .85, .85, .5}, --tooltips tooltipBorderColor = {.2, .2, .2, .9}, } local comparisonLineContrast = {{1, 1, 1, .1}, {1, 1, 1, 0}} local latestLinesHighlighted = {} local comparisonTooltips = {nextTooltip = 0} local comparisonTargetTooltips = {nextTooltip = 0} local resetTargetComparisonTooltip = function() comparisonTargetTooltips.nextTooltip = 0 for _, tooltip in ipairs (comparisonTargetTooltips) do for i = 1, #tooltip.lines do local line = tooltip.lines [i] line.spellIcon:SetTexture ("") line.spellName:SetText ("") line.spellAmount:SetText ("") line.spellPercent:SetText ("") line:Hide() end tooltip:Hide() tooltip:ClearAllPoints() end end local resetComparisonTooltip = function() comparisonTooltips.nextTooltip = 0 for _, tooltip in ipairs (comparisonTooltips) do tooltip:Hide() tooltip:ClearAllPoints() end end local getTargetComparisonTooltip = function() comparisonTargetTooltips.nextTooltip = comparisonTargetTooltips.nextTooltip + 1 local tooltip = comparisonTargetTooltips [comparisonTargetTooltips.nextTooltip] if (tooltip) then return tooltip end tooltip = CreateFrame ("frame", nil, UIParent, "BackdropTemplate") tooltip:SetFrameStrata ("tooltip") tooltip:SetSize (1, 1) Details.gump:CreateBorder (tooltip) tooltip:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true}) tooltip:SetBackdropColor (.2, .2, .2, .99) tooltip:SetBackdropBorderColor (unpack (comparisonFrameSettings.tooltipBorderColor)) tooltip:SetHeight (77) local bg_color = {0.5, 0.5, 0.5} local bg_texture = [[Interface\AddOns\Details\images\bar_background]] local bg_alpha = 1 local bg_height = 12 local colors = {{26/255, 26/255, 26/255}, {19/255, 19/255, 19/255}, {26/255, 26/255, 26/255}, {34/255, 39/255, 42/255}, {42/255, 51/255, 60/255}} --player name label tooltip.player_name_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.player_name_label:SetPoint ("bottomleft", tooltip, "topleft", 1, 2) tooltip.player_name_label:SetTextColor (1, .7, .1, .834) DetailsFramework:SetFontSize (tooltip.player_name_label, 11) local name_bg = tooltip:CreateTexture (nil, "artwork") name_bg:SetTexture (bg_texture) name_bg:SetPoint ("bottomleft", tooltip, "topleft", 0, 1) name_bg:SetPoint ("bottomright", tooltip, "topright", 0, 1) name_bg:SetHeight (bg_height + 2) name_bg:SetAlpha (bg_alpha) name_bg:SetVertexColor (unpack (colors[2])) comparisonTargetTooltips [comparisonTargetTooltips.nextTooltip] = tooltip tooltip.lines = {} local lineHeight = comparisonFrameSettings.targetTooltipLineHeight local fontSize = 10 for i = 1, comparisonFrameSettings.targetMaxLines do local line = CreateFrame ("frame", nil, tooltip, "BackdropTemplate") line:SetPoint ("topleft", tooltip, "topleft", 0, -(i-1) * (lineHeight + 1)) line:SetPoint ("topright", tooltip, "topright", 0, -(i-1) * (lineHeight + 1)) line:SetHeight (lineHeight) line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) line:SetBackdropColor (0, 0, 0, 0.2) local spellIcon = line:CreateTexture ("$parentIcon", "overlay") spellIcon:SetSize (lineHeight -2 , lineHeight - 2) local spellName = line:CreateFontString ("$parentName", "overlay", "GameFontNormal") local spellAmount = line:CreateFontString ("$parentAmount", "overlay", "GameFontNormal") local spellPercent = line:CreateFontString ("$parentPercent", "overlay", "GameFontNormal") DetailsFramework:SetFontSize (spellName, fontSize) DetailsFramework:SetFontSize (spellAmount, fontSize) DetailsFramework:SetFontSize (spellPercent, fontSize) spellIcon:SetPoint ("left", line, "left", 2, 0) spellName:SetPoint ("left", spellIcon, "right", 2, 0) spellAmount:SetPoint ("right", line, "right", -2, 0) spellPercent:SetPoint ("right", line, "right", -40, 0) spellName:SetJustifyH ("left") spellAmount:SetJustifyH ("right") spellPercent:SetJustifyH ("right") line.spellIcon = spellIcon line.spellName = spellName line.spellAmount = spellAmount line.spellPercent = spellPercent tooltip.lines [#tooltip.lines+1] = line if (i % 2 == 0) then line:SetBackdropColor (unpack (comparisonLineContrast [1])) line.BackgroundColor = comparisonLineContrast [1] else line:SetBackdropColor (unpack (comparisonLineContrast [2])) line.BackgroundColor = comparisonLineContrast [2] end end return tooltip end local getComparisonTooltip = function() comparisonTooltips.nextTooltip = comparisonTooltips.nextTooltip + 1 local tooltip = comparisonTooltips [comparisonTooltips.nextTooltip] if (tooltip) then return tooltip end tooltip = CreateFrame ("frame", nil, UIParent, "BackdropTemplate") tooltip:SetFrameStrata ("tooltip") tooltip:SetSize (1, 1) Details.gump:CreateBorder (tooltip) tooltip:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true}) tooltip:SetBackdropColor (0, 0, 0, 1) tooltip:SetBackdropBorderColor (unpack (comparisonFrameSettings.tooltipBorderColor)) tooltip:SetHeight (77) comparisonTooltips [comparisonTooltips.nextTooltip] = tooltip --prototype local y = -3 local x_start = 2 local bg_color = {0.5, 0.5, 0.5} local bg_texture = [[Interface\AddOns\Details\images\bar_background]] local bg_alpha = 1 local bg_height = 12 local colors = {{26/255, 26/255, 26/255}, {19/255, 19/255, 19/255}, {26/255, 26/255, 26/255}, {34/255, 39/255, 42/255}, {42/255, 51/255, 60/255}} local background = tooltip:CreateTexture (nil, "border") background:SetTexture ([[Interface\SPELLBOOK\Spellbook-Page-1]]) background:SetTexCoord (.6, 0.1, 0, 0.64453125) background:SetVertexColor (0, 0, 0, 0.2) background:SetPoint ("topleft", tooltip, "topleft", 0, 0) background:SetPoint ("bottomright", tooltip, "bottomright", 0, 0) --player name label tooltip.player_name_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.player_name_label:SetPoint ("bottomleft", tooltip, "topleft", 1, 2) tooltip.player_name_label:SetTextColor (1, .7, .1, .834) DetailsFramework:SetFontSize (tooltip.player_name_label, 11) local name_bg = tooltip:CreateTexture (nil, "artwork") name_bg:SetTexture (bg_texture) name_bg:SetPoint ("bottomleft", tooltip, "topleft", 0, 1) name_bg:SetPoint ("bottomright", tooltip, "topright", 0, 1) name_bg:SetHeight (bg_height + 2) name_bg:SetAlpha (bg_alpha) name_bg:SetVertexColor (unpack (colors[2])) --cast line tooltip.casts_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.casts_label:SetPoint ("topleft", tooltip, "topleft", x_start, -2 + (y*0)) tooltip.casts_label:SetText ("Casts:") tooltip.casts_label:SetJustifyH ("left") tooltip.casts_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.casts_label2:SetPoint ("topright", tooltip, "topright", -x_start, -2 + (y*0)) tooltip.casts_label2:SetText ("0") tooltip.casts_label2:SetJustifyH ("right") tooltip.casts_label3 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.casts_label3:SetPoint ("topright", tooltip, "topright", -x_start - 46, -2 + (y*0)) tooltip.casts_label3:SetText ("0") tooltip.casts_label3:SetJustifyH ("right") --hits tooltip.hits_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.hits_label:SetPoint ("topleft", tooltip, "topleft", x_start, -14 + (y*1)) tooltip.hits_label:SetText ("Hits:") tooltip.hits_label:SetJustifyH ("left") tooltip.hits_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.hits_label2:SetPoint ("topright", tooltip, "topright", -x_start, -14 + (y*1)) tooltip.hits_label2:SetText ("0") tooltip.hits_label2:SetJustifyH ("right") tooltip.hits_label3 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.hits_label3:SetPoint ("topright", tooltip, "topright", -x_start - 46, -14 + (y*1)) tooltip.hits_label3:SetText ("0") tooltip.hits_label3:SetJustifyH ("right") --average tooltip.average_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.average_label:SetPoint ("topleft", tooltip, "topleft", x_start, -26 + (y*2)) tooltip.average_label:SetText ("Average:") tooltip.average_label:SetJustifyH ("left") tooltip.average_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.average_label2:SetPoint ("topright", tooltip, "topright", -x_start, -26 + (y*2)) tooltip.average_label2:SetText ("0") tooltip.average_label2:SetJustifyH ("right") tooltip.average_label3 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.average_label3:SetPoint ("topright", tooltip, "topright", -x_start - 46, -26 + (y*2)) tooltip.average_label3:SetText ("0") tooltip.average_label3:SetJustifyH ("right") --critical tooltip.crit_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.crit_label:SetPoint ("topleft", tooltip, "topleft", x_start, -38 + (y*3)) tooltip.crit_label:SetText ("Critical:") tooltip.crit_label:SetJustifyH ("left") tooltip.crit_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.crit_label2:SetPoint ("topright", tooltip, "topright", -x_start, -38 + (y*3)) tooltip.crit_label2:SetText ("0") tooltip.crit_label2:SetJustifyH ("right") tooltip.crit_label3 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.crit_label3:SetPoint ("topright", tooltip, "topright", -x_start - 46, -38 + (y*3)) tooltip.crit_label3:SetText ("0") tooltip.crit_label3:SetJustifyH ("right") --uptime tooltip.uptime_label = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.uptime_label:SetPoint ("topleft", tooltip, "topleft", x_start, -50 + (y*4)) tooltip.uptime_label:SetText ("Uptime:") tooltip.uptime_label:SetJustifyH ("left") tooltip.uptime_label2 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.uptime_label2:SetPoint ("topright", tooltip, "topright", -x_start, -50 + (y*4)) tooltip.uptime_label2:SetText ("0") tooltip.uptime_label2:SetJustifyH ("right") tooltip.uptime_label3 = tooltip:CreateFontString (nil, "overlay", "GameFontHighlightSmall") tooltip.uptime_label3:SetPoint ("topright", tooltip, "topright", -x_start - 46, -50 + (y*4)) tooltip.uptime_label3:SetText ("0") tooltip.uptime_label3:SetJustifyH ("right") for i = 1, 5 do local bg_line1 = tooltip:CreateTexture (nil, "artwork") bg_line1:SetTexture (bg_texture) bg_line1:SetPoint ("topleft", tooltip, "topleft", 0, -2 + (((i-1) * 12) * -1) + (y * (i-1)) + 2) bg_line1:SetPoint ("topright", tooltip, "topright", -0, -2 + (((i-1) * 12) * -1) + (y * (i-1)) + 2) bg_line1:SetHeight (bg_height + 4) bg_line1:SetAlpha (bg_alpha) bg_line1:SetVertexColor (unpack (colors[i])) end return tooltip end --fill the tooltip for the main player being compared --actualPlayerName is the name of the player being compared, playerName can be the name of a pet local fillMainSpellTooltip = function (line, rawSpellTable, actualPlayerName, playerName) local tooltip = getComparisonTooltip() local formatFunc = Details:GetCurrentToKFunction() local spellId = rawSpellTable.id tooltip.player_name_label:SetText (Details:GetOnlyName (actualPlayerName)) local fullPercent = "100%" local noData = "-" --amount of casts local combatObject = Details:GetCombatFromBreakdownWindow() local castAmount = combatObject:GetSpellCastAmount(playerName, GetSpellInfo(spellId)) local playerMiscObject = combatObject:GetActor(DETAILS_ATTRIBUTE_MISC, playerName) if (castAmount > 0) then tooltip.casts_label2:SetText (fullPercent) tooltip.casts_label3:SetText (castAmount) DetailsFramework:SetFontColor (tooltip.casts_label2, "gray") DetailsFramework:SetFontColor (tooltip.casts_label3, "white") else tooltip.casts_label2:SetText (noData) tooltip.casts_label3:SetText (noData) DetailsFramework:SetFontColor (tooltip.casts_label2, "silver") DetailsFramework:SetFontColor (tooltip.casts_label3, "silver") end --hit amount tooltip.hits_label2:SetText (fullPercent) DetailsFramework:SetFontColor (tooltip.hits_label2, "gray") tooltip.hits_label3:SetText (rawSpellTable.counter) DetailsFramework:SetFontColor (tooltip.hits_label3, "white") --average tooltip.average_label2:SetText (fullPercent) DetailsFramework:SetFontColor (tooltip.average_label2, "gray") local average = rawSpellTable.total / rawSpellTable.counter tooltip.average_label3:SetText (formatFunc (_, average)) --critical strikes tooltip.crit_label2:SetText (fullPercent) DetailsFramework:SetFontColor (tooltip.crit_label2, "gray") tooltip.crit_label3:SetText (rawSpellTable.c_amt) --uptime local uptime = 0 if (playerMiscObject) then local spell = playerMiscObject.debuff_uptime_spells and playerMiscObject.debuff_uptime_spells._ActorTable and playerMiscObject.debuff_uptime_spells._ActorTable [spellId] if (spell) then local minutos, segundos = floor (spell.uptime / 60), floor (spell.uptime % 60) uptime = spell.uptime tooltip.uptime_label2:SetText (fullPercent) tooltip.uptime_label3:SetText (minutos .. "m " .. segundos .. "s") DetailsFramework:SetFontColor (tooltip.uptime_label2, "gray") DetailsFramework:SetFontColor (tooltip.uptime_label3, "white") else tooltip.uptime_label2:SetText (noData) tooltip.uptime_label3:SetText (noData) DetailsFramework:SetFontColor (tooltip.uptime_label2, "gray") DetailsFramework:SetFontColor (tooltip.uptime_label3, "gray") end else tooltip.uptime_label2:SetText (noData) tooltip.uptime_label3:SetText (noData) DetailsFramework:SetFontColor (tooltip.uptime_label2, "gray") DetailsFramework:SetFontColor (tooltip.uptime_label3, "gray") end --show tooltip tooltip:SetPoint ("bottom", line, "top", 0, 2) tooltip:SetWidth (line:GetWidth()) tooltip:Show() --highlight line line:SetBackdropColor (unpack (comparisonFrameSettings.lineOnEnterColor)) latestLinesHighlighted [#latestLinesHighlighted + 1] = line return true, castAmount, rawSpellTable.counter, average, rawSpellTable.c_amt, uptime end local getPercentComparison = function (value1, value2) if (value1 == 0 and value2 == 0) then return "|c" .. minor .. "0%|r" elseif (value1 >= value2) then local diff = value1 - value2 local up if (diff == 0 or value2 == 0) then --stop div by zero ptr up = "0" else up = diff / value2 * 100 up = floor (up) if (up > 999) then up = "" .. 999 end end return "|c" .. minor .. up .. "%|r" else local diff = value2 - value1 local down if (diff == 0 or value1 == 0) then --stop div by zero ptr down = "0" else down = diff / value1 * 100 down = floor (down) if (down > 999) then down = "" .. 999 end end return "|c" .. plus .. down .. "%|r" end end --fill the tooltip for comparison lines --actualPlayerName is the name of the player being compared, playerName can be the name of a pet local fillComparisonSpellTooltip = function (line, rawSpellTable, actualPlayerName, playerName, mainCastAmount, mainHitCounter, mainAverageDamage, mainCritAmount, mainAuraUptime) local tooltip = getComparisonTooltip() local formatFunc = Details:GetCurrentToKFunction() local spellId = rawSpellTable.id local noData = "-" tooltip.player_name_label:SetText(Details:GetOnlyName(actualPlayerName)) --amount of casts local combatObject = Details:GetCombatFromBreakdownWindow() local playerMiscObject = combatObject:GetActor (DETAILS_ATTRIBUTE_MISC, playerName) local castAmount = combatObject:GetSpellCastAmount(playerName, GetSpellInfo(spellId)) if (castAmount > 0) then tooltip.casts_label2:SetText (getPercentComparison (mainCastAmount, castAmount)) tooltip.casts_label3:SetText (castAmount) DetailsFramework:SetFontColor (tooltip.casts_label2, "white") DetailsFramework:SetFontColor (tooltip.casts_label3, "white") else tooltip.casts_label2:SetText (noData) tooltip.casts_label3:SetText (noData) DetailsFramework:SetFontColor (tooltip.casts_label2, "silver") DetailsFramework:SetFontColor (tooltip.casts_label3, "silver") end --hits tooltip.hits_label2:SetText (getPercentComparison (mainHitCounter, rawSpellTable.counter)) tooltip.hits_label3:SetText (rawSpellTable.counter) DetailsFramework:SetFontColor (tooltip.hits_label2, "white") DetailsFramework:SetFontColor (tooltip.hits_label3, "white") --average local average = rawSpellTable.total / rawSpellTable.counter tooltip.average_label2:SetText (getPercentComparison (mainAverageDamage, average)) tooltip.average_label3:SetText (formatFunc (_, average)) DetailsFramework:SetFontColor (tooltip.average_label3, "white") DetailsFramework:SetFontColor (tooltip.average_label2, "white") --critical strikes tooltip.crit_label2:SetText (getPercentComparison (mainCritAmount, rawSpellTable.c_amt)) tooltip.crit_label3:SetText (rawSpellTable.c_amt) DetailsFramework:SetFontColor (tooltip.crit_label2, "white") DetailsFramework:SetFontColor (tooltip.crit_label2, "white") --uptime local uptime = 0 if (playerMiscObject) then local spell = playerMiscObject.debuff_uptime_spells and playerMiscObject.debuff_uptime_spells._ActorTable and playerMiscObject.debuff_uptime_spells._ActorTable [spellId] if (spell) then local minutos, segundos = floor (spell.uptime / 60), floor (spell.uptime % 60) uptime = spell.uptime tooltip.uptime_label2:SetText (getPercentComparison (mainAuraUptime, uptime)) tooltip.uptime_label3:SetText (minutos .. "m " .. segundos .. "s") DetailsFramework:SetFontColor (tooltip.uptime_label2, "white") DetailsFramework:SetFontColor (tooltip.uptime_label3, "white") else tooltip.uptime_label2:SetText (noData) tooltip.uptime_label3:SetText (noData) DetailsFramework:SetFontColor (tooltip.uptime_label2, "gray") DetailsFramework:SetFontColor (tooltip.uptime_label3, "gray") end else tooltip.uptime_label2:SetText (noData) tooltip.uptime_label3:SetText (noData) DetailsFramework:SetFontColor (tooltip.uptime_label2, "gray") DetailsFramework:SetFontColor (tooltip.uptime_label3, "gray") end --show tooltip tooltip:SetPoint ("bottom", line, "top", 0, 2) tooltip:SetWidth (line:GetWidth()) tooltip:Show() --highlight line line:SetBackdropColor (unpack (comparisonFrameSettings.lineOnEnterColor)) latestLinesHighlighted [#latestLinesHighlighted + 1] = line end local comparisonLineOnEnter = function (self) local scrollFrame = self:GetParent() local frame = scrollFrame:GetParent() if (not frame.GetPlayerInfo) then frame = frame:GetParent() end --check if this is a spell or a target line if (self.lineType == "mainPlayerSpell" or self.lineType == "comparisonPlayerSpell") then --get data local spellTable = self.spellTable local isPet = spellTable.npcId local npcId = spellTable.npcId local spellId = spellTable.spellId local mainPlayerObject = frame.GetMainPlayerObject() local mainSpellTable = frame.GetMainSpellTable() local allComparisonFrames = frame.GetAllComparisonFrames() local mainFrameScroll = frame.mainFrameScroll local playerObject, playerName = frame.GetPlayerInfo (scrollFrame) --store the spell information from the main tooltip local mainHasTooltip, castAmount, hitCounter, averageDamage, critAmount, auraUptime --iterate on the main player scroll and find the line local mainFrameLines = mainFrameScroll:GetFrames() for i = 1, #mainFrameLines do local line = mainFrameLines [i] if (line.spellTable and line:IsShown()) then if (isPet) then if (line.spellTable.spellId == spellId and line.spellTable.npcId == npcId) then --main line for the hover over spell local rawSpellTable = line.spellTable.rawSpellTable mainHasTooltip, castAmount, hitCounter, averageDamage, critAmount, auraUptime = fillMainSpellTooltip (line, rawSpellTable, mainPlayerObject:Name(), line.spellTable.originalName) break end else if (line.spellTable.spellId == spellId and not line.spellTable.npcId) then --main line for the hover over spell local rawSpellTable = line.spellTable.rawSpellTable mainHasTooltip, castAmount, hitCounter, averageDamage, critAmount, auraUptime = fillMainSpellTooltip (line, rawSpellTable, mainPlayerObject:Name(), mainPlayerObject:Name()) break end end end end if (mainHasTooltip) then --iterate among all other comparison scrolls for i = 1, #allComparisonFrames do local comparisonFrame = allComparisonFrames [i] if (comparisonFrame:IsShown()) then local scrollFrame = comparisonFrame.spellsScroll local playerObject, playerName = frame.GetPlayerInfo (comparisonFrame) local frameLines = scrollFrame:GetFrames() for i = 1, #frameLines do local line = frameLines [i] if (line.spellTable and line:IsShown() and line.spellTable.rawSpellTable) then if (isPet) then if (line.spellTable.spellId == spellId and line.spellTable.npcId == npcId) then --line for the hover over spell in a comparison scroll frame local rawSpellTable = line.spellTable.rawSpellTable fillComparisonSpellTooltip (line, rawSpellTable, playerName, line.spellTable.originalName, castAmount, hitCounter, averageDamage, critAmount, auraUptime) end else if (line.spellTable.spellId == spellId and not line.spellTable.npcId) then --line for the hover over spell in a comparison scroll frame local rawSpellTable = line.spellTable.rawSpellTable fillComparisonSpellTooltip (line, rawSpellTable, playerName, playerName, castAmount, hitCounter, averageDamage, critAmount, auraUptime) end end end end end end end elseif (self.lineType == "mainPlayerTarget" or self.lineType == "comparisonPlayerTarget") then local targetName = self.targetTable.originalName local attribute = Details:GetDisplayTypeFromBreakdownWindow() --build a list of spells used by the main actor local mainPlayerObject = frame.GetMainPlayerObject() local damageDoneBySpell = {} --find the main line --iterate on the main player scroll and find the line local mainLine local mainFrameScroll = frame.targetFrameScroll local mainFrameLines = mainFrameScroll:GetFrames() for i = 1, #mainFrameLines do local line = mainFrameLines [i] if (line.targetTable and line:IsShown()) then if (line.targetTable.originalName == targetName) then mainLine = line break end end end if (not mainLine) then return end --spells for spellId, spellTable in pairs (mainPlayerObject:GetActorSpells()) do local damageOnTarget = spellTable.targets [targetName] if (damageOnTarget and damageOnTarget > 0) then damageDoneBySpell [#damageDoneBySpell + 1] = {spellTable, damageOnTarget, mainPlayerObject:Name(), mainPlayerObject, false} end end --pets for _, petName in ipairs (mainPlayerObject:Pets()) do local petObject = Details:GetCombatFromBreakdownWindow():GetActor (attribute, petName) if (petObject) then for spellId, spellTable in pairs (petObject:GetActorSpells()) do local damageOnTarget = spellTable.targets [targetName] if (damageOnTarget and damageOnTarget > 0) then damageDoneBySpell [#damageDoneBySpell + 1] = {spellTable, damageOnTarget, petName, petObject, DetailsFramework:GetNpcIdFromGuid (petObject.serial)} end end end end table.sort (damageDoneBySpell, DetailsFramework.SortOrder2) local tooltip = getTargetComparisonTooltip() local formatFunc = Details:GetCurrentToKFunction() local mainHasTooltip = false tooltip.player_name_label:SetText (mainPlayerObject:GetDisplayName()) for i = 1, #damageDoneBySpell do local damageTable = damageDoneBySpell [i] local spellTable = damageTable [1] local damageDone = damageTable [2] local actorName = damageTable [3] local actorObject = damageTable [4] local npcId = damageTable [5] local spellName, _, spellIcon = Details.GetSpellInfo (spellTable.id) local line = tooltip.lines [i] if (not line) then break end if (npcId) then spellName = spellName .. " (" .. comparisonFrameSettings.petColor .. actorName:gsub (" <.*", "") .. "|r)" end line.spellName:SetText (spellName) DetailsFramework:TruncateText (line.spellName, mainFrameScroll:GetWidth() - 110) line.spellIcon:SetTexture (spellIcon) line.spellIcon:SetTexCoord (.1, .9, .1, .9) line.spellAmount:SetText ("100%") DetailsFramework:SetFontColor (line.spellAmount, "gray") line.spellPercent:SetText (formatFunc (_, damageDone)) line:Show() mainHasTooltip = true end --comparison if (mainHasTooltip) then local allComparisonFrames = frame.GetAllComparisonFrames() local combatObject = Details:GetCombatFromBreakdownWindow() --iterate among all other comparison scrolls for i = 1, #allComparisonFrames do local comparisonFrame = allComparisonFrames [i] if (comparisonFrame:IsShown()) then local scrollFrame = comparisonFrame.targetsScroll local playerObject, playerName = frame.GetPlayerInfo (comparisonFrame) local targetLines = scrollFrame:GetFrames() for o = 1, #targetLines do local line = targetLines [o] if (line and line.targetTable and line:IsShown()) then if (line.targetTable.originalName == targetName) then --get a tooltip for this actor local actorTooltip = getTargetComparisonTooltip() actorTooltip:SetPoint ("bottom", line, "top", 0, 2) actorTooltip:SetWidth (line:GetWidth()) actorTooltip:SetHeight (min (comparisonFrameSettings.targetMaxLines, #damageDoneBySpell) * comparisonFrameSettings.targetTooltipLineHeight + comparisonFrameSettings.targetMaxLines) actorTooltip:Show() actorTooltip.player_name_label:SetText (playerObject:GetDisplayName()) --highlight line line:SetBackdropColor (unpack (comparisonFrameSettings.lineOnEnterColor)) latestLinesHighlighted [#latestLinesHighlighted + 1] = line --iterate among all spells in the first tooltip and fill here --if is a pet line, need to get the data from the player pet instead for a = 1, #damageDoneBySpell do local damageTable = damageDoneBySpell [a] local spellTable = damageTable [1] local damageDone = damageTable [2] local actorName = damageTable [3] local actorObject = damageTable [4] local npcId = damageTable [5] local foundSpell -- i is also the tooltip line index if (not npcId) then local spellObject = playerObject:GetSpell (spellTable.id) if (spellObject) then local damageOnTarget = spellObject.targets [targetName] or 0 if (damageOnTarget > 0) then --this actor did damage on this target, add into the tooltip local tooltipLine = actorTooltip.lines [a] if (not tooltipLine) then break end local spellName, _, spellIcon = Details.GetSpellInfo (spellTable.id) tooltipLine.spellName:SetText ("") tooltipLine.spellIcon:SetTexture (spellIcon) tooltipLine.spellIcon:SetTexCoord (.1, .9, .1, .9) -- calculate percent local mainSpellDamageOnTarget = 0 -- find this spell in the main actor table for u = 1, #damageDoneBySpell do local mainSpell = damageDoneBySpell [u] local spellTableMain = damageTable [1] local damageDoneMain = damageTable [2] local actorNameMain = damageTable [3] local actorObjectMain = damageTable [4] local npcIdMain = damageTable [5] if (not npcIdMain and spellTableMain.id == spellObject.id) then --found the spell in the main table mainSpellDamageOnTarget = damageDoneMain break end end tooltipLine.spellAmount:SetText (getPercentComparison (mainSpellDamageOnTarget, damageOnTarget)) tooltipLine.spellPercent:SetText (formatFunc (_, damageOnTarget)) tooltipLine:Show() foundSpell = true end end else --iterate among all pets the player has and find one with the same npcId for _, petName in ipairs (playerObject:Pets()) do local petObject = combatObject:GetActor (attribute, petName) if (petObject) then local petNpcId = DetailsFramework:GetNpcIdFromGuid (petObject.serial) if (petNpcId and petNpcId == npcId) then --found the correct pet local spellObject = petObject:GetSpell (spellTable.id) if (spellObject) then local damageOnTarget = spellObject.targets [targetName] or 0 if (damageOnTarget > 0) then --this pet did damage on this target, add into the tooltip local tooltipLine = actorTooltip.lines [a] if (not tooltipLine) then break end -- calculate percent local mainSpellDamageOnTarget = 0 -- find this spell in the main actor table for u = 1, #damageDoneBySpell do local mainSpell = damageDoneBySpell [u] local spellTableMain = damageTable [1] local damageDoneMain = damageTable [2] local actorNameMain = damageTable [3] local actorObjectMain = damageTable [4] local npcIdMain = damageTable [5] if (npcIdMain and npcIdMain == petNpcId and spellTableMain.id == spellObject.id) then --found the spell in the main table mainSpellDamageOnTarget = damageDoneMain break end end local spellName, _, spellIcon = Details.GetSpellInfo (spellTable.id) tooltipLine.spellName:SetText ("") tooltipLine.spellIcon:SetTexture (spellIcon) tooltipLine.spellIcon:SetTexCoord (.1, .9, .1, .9) tooltipLine.spellAmount:SetText (getPercentComparison (mainSpellDamageOnTarget, damageOnTarget)) tooltipLine.spellPercent:SetText (formatFunc (_, damageOnTarget)) tooltipLine:Show() foundSpell = true end end end end end end if (not foundSpell) then --add an empty line in the tooltip local tooltipLine = actorTooltip.lines [a] if (tooltipLine) then tooltipLine:Show() end end end --break the loop to find the correct line break end end end end end end --highlight line mainLine:SetBackdropColor (unpack (comparisonFrameSettings.lineOnEnterColor)) latestLinesHighlighted [#latestLinesHighlighted + 1] = mainLine tooltip:SetPoint ("bottom", mainLine, "top", 0, 2) tooltip:SetWidth (mainLine:GetWidth()) tooltip:SetHeight (min (comparisonFrameSettings.targetMaxLines, #damageDoneBySpell) * comparisonFrameSettings.targetTooltipLineHeight + comparisonFrameSettings.targetMaxLines) tooltip:Show() end end local comparisonLineOnLeave = function (self) for i = #latestLinesHighlighted, 1, -1 do local line = latestLinesHighlighted [i] line:SetBackdropColor (unpack (line.BackgroundColor)) tremove (latestLinesHighlighted, i) end resetComparisonTooltip() resetTargetComparisonTooltip() end local playerComparisonCreate = function (tab, frame) frame.isComparisonTab = true --regular functions for comparison API function frame.GetMainPlayerName() return frame.mainPlayerObject:Name() end function frame.GetMainPlayerObject() return frame.mainPlayerObject end function frame.GetMainSpellTable() return frame.mainSpellTable end function frame.GetMainTargetTable() return frame.mainTargetTable end function frame.GetAllComparisonFrames() return frame.comparisonFrames end function frame.GetPlayerInfo (f) if (f.mainPlayerObject) then return f.mainPlayerObject, f.mainPlayerObject:Name() else return f.playerObject, f.playerObject:Name() end end --main player spells (scroll box with the spells the player used) local mainPlayerCreateline = function (self, index) local lineHeight = self.lineHeight local lineWidth = self.scrollWidth local fontSize = self.fontSize local line = CreateFrame ("button", "$parentLine" .. index, self, "BackdropTemplate") line:SetPoint ("topleft", self, "topleft", 1, -((index-1) * (lineHeight+1))) line:SetSize (lineWidth -2, lineHeight) line:SetScript ("OnEnter", comparisonLineOnEnter) line:SetScript ("OnLeave", comparisonLineOnLeave) line:SetBackdrop ({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true}) line:SetBackdropColor (0, 0, 0, 0.2) local spellIcon = line:CreateTexture ("$parentIcon", "overlay") spellIcon:SetSize (lineHeight -2 , lineHeight - 2) local spellName = line:CreateFontString ("$parentName", "overlay", "GameFontNormal") local spellAmount = line:CreateFontString ("$parentAmount", "overlay", "GameFontNormal") local spellPercent = line:CreateFontString ("$parentPercent", "overlay", "GameFontNormal") DetailsFramework:SetFontSize (spellName, fontSize) DetailsFramework:SetFontSize (spellAmount, fontSize) DetailsFramework:SetFontSize (spellPercent, fontSize) spellIcon:SetPoint ("left", line, "left", 2, 0) spellName:SetPoint ("left", spellIcon, "right", 2, 0) spellAmount:SetPoint ("right", line, "right", -2, 0) spellPercent:SetPoint ("right", line, "right", -40, 0) spellName:SetJustifyH ("left") spellAmount:SetJustifyH ("right") spellPercent:SetJustifyH ("right") line.spellIcon = spellIcon line.spellName = spellName line.spellAmount = spellAmount line.spellPercent = spellPercent return line end --the refresh function receives an already prepared table and just update the lines local mainPlayerRefreshSpellScroll = function (self, data, offset, totalLines) for i = 1, totalLines do local index = i + offset local spellTable = data [index] if (spellTable) then local line = self:GetLine (i) --store the line into the spell table spellTable.line = line line.spellTable = spellTable local spellId = spellTable.spellId local spellName = spellTable.spellName local spellIcon = spellTable.spellIcon local amountDone = spellTable.amount line.spellId = spellId line.spellIcon:SetTexture (spellIcon) line.spellIcon:SetTexCoord (.1, .9, .1, .9) line.spellName:SetText (spellName) DetailsFramework:TruncateText (line.spellName, line:GetWidth() - 70) local formatFunc = Details:GetCurrentToKFunction() line.spellAmount:SetText (formatFunc (_, amountDone)) if (i % 2 == 0) then line:SetBackdropColor (unpack (comparisonLineContrast [1])) line.BackgroundColor = comparisonLineContrast [1] else line:SetBackdropColor (unpack (comparisonLineContrast [2])) line.BackgroundColor = comparisonLineContrast [2] end end end end local mainPlayerRefreshTargetScroll = function (self, data, offset, totalLines) for i = 1, totalLines do local index = i + offset local targetTable = data [index] if (targetTable) then local line = self:GetLine (i) --store the line into the target table targetTable.line = line line.targetTable = targetTable local targetName = targetTable.targetName local amountDone = targetTable.amount line.targetName = targetName line.spellIcon:SetTexture ("") --todo - fill this texture line.spellIcon:SetTexCoord (.1, .9, .1, .9) line.spellName:SetText (targetName) DetailsFramework:TruncateText (line.spellName, line:GetWidth() - 50) local formatFunc = Details:GetCurrentToKFunction() line.spellAmount:SetText (formatFunc (_, amountDone)) if (i % 2 == 0) then line:SetBackdropColor (unpack (comparisonLineContrast [1])) line.BackgroundColor = comparisonLineContrast [1] else line:SetBackdropColor (unpack (comparisonLineContrast [2])) line.BackgroundColor = comparisonLineContrast [2] end end end end --main player spells scroll local mainPlayerFrameScroll = DetailsFramework:CreateScrollBox (frame, "$parentComparisonMainPlayerSpellsScroll", mainPlayerRefreshSpellScroll, {}, comparisonFrameSettings.mainScrollWidth, comparisonFrameSettings.spellScrollHeight, comparisonFrameSettings.spellLineAmount, comparisonFrameSettings.spellLineHeight) mainPlayerFrameScroll:SetPoint ("topleft", frame, "topleft", 5, -30) mainPlayerFrameScroll.lineHeight = comparisonFrameSettings.spellLineHeight mainPlayerFrameScroll.scrollWidth = comparisonFrameSettings.mainScrollWidth mainPlayerFrameScroll.fontSize = comparisonFrameSettings.fontSize mainPlayerFrameScroll:HookScript ("OnVerticalScroll", function (self, offset) frame.RefreshAllComparisonScrollFrames() end) --create lines for i = 1, comparisonFrameSettings.spellLineAmount do local line = mainPlayerFrameScroll:CreateLine (mainPlayerCreateline) line.lineType = "mainPlayerSpell" end DetailsFramework:ReskinSlider (mainPlayerFrameScroll) frame.mainFrameScroll = mainPlayerFrameScroll --main player targets (scroll box with enemies the player applied damage) local mainTargetFrameScroll = DetailsFramework:CreateScrollBox (frame, "$parentComparisonMainPlayerTargetsScroll", mainPlayerRefreshTargetScroll, {}, comparisonFrameSettings.mainScrollWidth, comparisonFrameSettings.targetScrollHeight, comparisonFrameSettings.targetScrollLineAmount, comparisonFrameSettings.targetScrollLineHeight) mainTargetFrameScroll:SetPoint ("topleft", mainPlayerFrameScroll, "bottomleft", 0, -20) mainTargetFrameScroll.lineHeight = comparisonFrameSettings.targetScrollLineHeight mainTargetFrameScroll.scrollWidth = comparisonFrameSettings.mainScrollWidth mainTargetFrameScroll.fontSize = comparisonFrameSettings.fontSize --create lines for i = 1, comparisonFrameSettings.targetScrollLineAmount do local line = mainTargetFrameScroll:CreateLine (mainPlayerCreateline) line.lineType = "mainPlayerTarget" end DetailsFramework:ReskinSlider (mainTargetFrameScroll) frame.targetFrameScroll = mainTargetFrameScroll --main player name frame.mainPlayerName = DetailsFramework:CreateLabel (mainPlayerFrameScroll) frame.mainPlayerName:SetPoint ("topleft", mainPlayerFrameScroll, "topleft", 2, comparisonFrameSettings.playerNameYOffset) frame.mainPlayerName.fontsize = comparisonFrameSettings.playerNameSize --create the framework for the comparing players local settings = { --comparison frame height = 600, } frame.comparisonFrames = {} frame.comparisonScrollFrameIndex = 0 function frame.ResetComparisonFrames() frame.comparisonScrollFrameIndex = 0 for _, comparisonFrame in ipairs (frame.comparisonFrames) do comparisonFrame:Hide() comparisonFrame.playerObject = nil comparisonFrame.spellsScroll.playerObject = nil end end local comparisonPlayerRefreshTargetScroll = function (self, data, offset, totalLines) offset = FauxScrollFrame_GetOffset (mainPlayerFrameScroll) for i = 1, totalLines do local index = i + offset local targetTable = data [index] if (targetTable) then local line = self:GetLine (i) line:SetWidth (comparisonFrameSettings.comparisonScrollWidth - 2) --store the line into the target table targetTable.line = line line.targetTable = targetTable line.spellIcon:SetTexture ("") local mainPlayerAmount = targetTable.mainTargetAmount local amountDone = targetTable.amount if (mainPlayerAmount) then local formatFunc = Details:GetCurrentToKFunction() if (mainPlayerAmount > amountDone) then local diff = mainPlayerAmount - amountDone local up = diff / amountDone * 100 up = floor (up) if (up > 999) then up = "" .. 999 end line.spellPercent:SetText ("|c" .. minor .. up .. "%|r") else local diff = amountDone - mainPlayerAmount local down = diff / mainPlayerAmount * 100 down = floor (down) if (down > 999) then down = "" .. 999 end line.spellPercent:SetText ("|c" .. plus .. down .. "%|r") end line.spellAmount:SetText (formatFunc (_, amountDone)) else line.spellPercent:SetText ("") line.spellAmount:SetText ("") end if (i % 2 == 0) then line:SetBackdropColor (unpack (comparisonLineContrast [1])) line.BackgroundColor = comparisonLineContrast [1] else line:SetBackdropColor (unpack (comparisonLineContrast [2])) line.BackgroundColor = comparisonLineContrast [2] end end end end --refresh a spell scroll on a comparison frame local comparisonPlayerRefreshSpellScroll = function (self, data, offset, totalLines) offset = FauxScrollFrame_GetOffset (mainPlayerFrameScroll) for i = 1, totalLines do local index = i + offset local spellTable = data[index] if (spellTable) then local line = self:GetLine(i) line:SetWidth(comparisonFrameSettings.comparisonScrollWidth - 2) --store the line into the spell table spellTable.line = line line.spellTable = spellTable local spellId = spellTable.spellId local spellName = spellTable.spellName local spellIcon = spellTable.spellIcon local amountDone = spellTable.amount line.spellId = spellId line.spellIcon:SetTexture(spellIcon) line.spellIcon:SetTexCoord(.1, .9, .1, .9) line.spellName:SetText("") --won't show the spell name, only the icon local percent = 1 local mainFrame = self:GetParent().mainPlayer local mainSpellTable = self:GetParent().mainSpellTable local mainPlayerAmount = spellTable.mainSpellAmount if (mainPlayerAmount) then local formatFunc = Details:GetCurrentToKFunction() if (mainPlayerAmount > amountDone) then local diff = mainPlayerAmount - amountDone local up if (diff == 0 or mainPlayerAmount == 0) then --stop div by zero ptr up = "0" else up = diff / amountDone * 100 up = floor (up) if (up > 999) then up = "" .. 999 end end line.spellPercent:SetText ("|c" .. minor .. up .. "%|r") else local down local diff = amountDone - mainPlayerAmount if (diff == 0 or mainPlayerAmount == 0) then --stop div by zero ptr down = "0" else down = diff / mainPlayerAmount * 100 down = floor(down) if (down > 999) then down = "" .. 999 end end line.spellPercent:SetText("|c" .. plus .. down .. "%|r") end line.spellAmount:SetText(formatFunc(_, amountDone)) else line.spellPercent:SetText("") line.spellAmount:SetText("") end if (i % 2 == 0) then line:SetBackdropColor (unpack (comparisonLineContrast [1])) line.BackgroundColor = comparisonLineContrast [1] else line:SetBackdropColor (unpack (comparisonLineContrast [2])) line.BackgroundColor = comparisonLineContrast [2] end end end end function frame.RefreshAllComparisonScrollFrames() for _, comparisonFrame in ipairs (frame.comparisonFrames) do comparisonFrame.spellsScroll:Refresh() end end --get a frame which has two scrolls, one for spells and another for targets function frame.GetComparisonScrollFrame() frame.comparisonScrollFrameIndex = frame.comparisonScrollFrameIndex + 1 local comparisonFrame = frame.comparisonFrames [frame.comparisonScrollFrameIndex] if (comparisonFrame) then comparisonFrame:Show() return comparisonFrame end local newComparisonFrame = CreateFrame ("frame", "DetailsComparisonFrame" .. frame.comparisonScrollFrameIndex, frame, "BackdropTemplate") frame.comparisonFrames [frame.comparisonScrollFrameIndex] = newComparisonFrame newComparisonFrame:SetSize (comparisonFrameSettings.comparisonScrollWidth, settings.height) if (frame.comparisonScrollFrameIndex == 1) then newComparisonFrame:SetPoint ("topleft", mainPlayerFrameScroll, "topright", 30, 0) else newComparisonFrame:SetPoint ("topleft", frame.comparisonFrames [frame.comparisonScrollFrameIndex - 1], "topright", 10, 0) end --create the spell comparison scroll --player name newComparisonFrame.playerName = DetailsFramework:CreateLabel (newComparisonFrame) newComparisonFrame.playerName:SetPoint ("topleft", newComparisonFrame, "topleft", 2, comparisonFrameSettings.playerNameYOffset) newComparisonFrame.playerName.fontsize = comparisonFrameSettings.playerNameSize --spells scroll local spellsScroll = DetailsFramework:CreateScrollBox (newComparisonFrame, "$parentComparisonPlayerSpellsScroll", comparisonPlayerRefreshSpellScroll, {}, comparisonFrameSettings.comparisonScrollWidth, comparisonFrameSettings.spellScrollHeight, comparisonFrameSettings.spellLineAmount, comparisonFrameSettings.spellLineHeight) spellsScroll:SetPoint ("topleft", newComparisonFrame, "topleft", 0, 0) spellsScroll.lineHeight = comparisonFrameSettings.spellLineHeight spellsScroll.scrollWidth = comparisonFrameSettings.mainScrollWidth spellsScroll.fontSize = comparisonFrameSettings.fontSize _G [spellsScroll:GetName() .. "ScrollBar"]:Hide() --create lines for i = 1, comparisonFrameSettings.spellLineAmount do local line = spellsScroll:CreateLine (mainPlayerCreateline) line.lineType = "comparisonPlayerSpell" end DetailsFramework:ReskinSlider (spellsScroll) newComparisonFrame.spellsScroll = spellsScroll --targets scroll local targetsScroll = DetailsFramework:CreateScrollBox (newComparisonFrame, "$parentComparisonPlayerTargetsScroll", comparisonPlayerRefreshTargetScroll, {}, comparisonFrameSettings.comparisonScrollWidth, comparisonFrameSettings.targetScrollHeight, comparisonFrameSettings.targetScrollLineAmount, comparisonFrameSettings.targetScrollLineHeight) targetsScroll:SetPoint ("topleft", newComparisonFrame, "topleft", 0, -comparisonFrameSettings.spellScrollHeight - 20) targetsScroll.lineHeight = comparisonFrameSettings.spellLineHeight targetsScroll.scrollWidth = comparisonFrameSettings.mainScrollWidth targetsScroll.fontSize = comparisonFrameSettings.fontSize _G [targetsScroll:GetName() .. "ScrollBar"]:Hide() --create lines for i = 1, comparisonFrameSettings.targetScrollLineAmount do local line = targetsScroll:CreateLine (mainPlayerCreateline) line.lineType = "comparisonPlayerTarget" end DetailsFramework:ReskinSlider (targetsScroll) newComparisonFrame.targetsScroll = targetsScroll return newComparisonFrame end if (not frame.__background) then DetailsFramework:ApplyStandardBackdrop(frame) frame.__background:SetAlpha(0.6) end end local buildSpellAndTargetTables = function (player, combat, attribute) --build the spell list for the main player including pets local allPlayerSpells = player:GetActorSpells() local resultSpellTable = {} for spellId, spellTable in pairs(allPlayerSpells) do local spellName, _, spellIcon = Details.GetSpellInfo (spellId) resultSpellTable [#resultSpellTable + 1] = {spellId, spellTable.total, spellName = spellName, spellIcon = spellIcon, spellId = spellId, amount = spellTable.total, rawSpellTable = spellTable} end --pets local petAbilities = {} for _, petName in ipairs(player:Pets()) do local petObject = combat:GetActor(attribute, petName) if (petObject) then local allPetSpells = petObject:GetActorSpells() local petNpcId = DetailsFramework:GetNpcIdFromGuid(petObject.serial) for spellId, spellTable in pairs(allPetSpells) do petAbilities[spellId] = petAbilities[spellId] or {total = 0, rawSpellTable = spellTable} petAbilities[spellId].total = petAbilities[spellId].total + spellTable.total end end end for spellId, petSpellTable in pairs(petAbilities) do local spellName, _, spellIcon = Details.GetSpellInfo(spellId) resultSpellTable [#resultSpellTable + 1] = {spellId, petSpellTable.total, spellName = spellName, spellIcon = spellIcon, spellId = spellId, amount = petSpellTable.total, rawSpellTable = petSpellTable.rawSpellTable} end table.sort (resultSpellTable, DetailsFramework.SortOrder2) --build the target list for the main player local resultTargetTable = {} for targetName, amountDone in pairs (player.targets) do resultTargetTable [#resultTargetTable + 1] = {targetName, amountDone, targetName = Details:RemoveOwnerName (targetName), amount = amountDone, originalName = targetName, rawPlayerObject = player} end table.sort (resultTargetTable, DetailsFramework.SortOrder2) return resultSpellTable, resultTargetTable end --main tab function to be executed when the tab is shown local playerComparisonFill = function (tab, player, combat) local frame = tab.frame --update player name frame.mainPlayerName.text = player:GetDisplayName() frame.mainPlayerObject = player frame.mainFrameScroll.mainPlayerObject = player --reset the comparison scroll frame frame.ResetComparisonFrames() resetComparisonTooltip() resetTargetComparisonTooltip() local attribute = Details:GetDisplayTypeFromBreakdownWindow() local resultSpellTable, resultTargetTable = buildSpellAndTargetTables (player, combat, attribute) --update the two main scroll frames frame.mainFrameScroll:SetData (resultSpellTable) frame.mainFrameScroll:Refresh() frame.targetFrameScroll:SetData (resultTargetTable) frame.targetFrameScroll:Refresh() frame.mainSpellTable = resultSpellTable frame.mainTargetTable = resultTargetTable --search the combat for players with the same spec and build a scroll frame for them --to keep consistency, sort these players with the max amount of damage or healing they have done local actorContainer = combat:GetContainer (attribute) local playersWithSameSpec = {} for _, playerObject in actorContainer:ListActors() do if (playerObject:IsPlayer() and playerObject.spec == player.spec and playerObject.serial ~= player.serial) then playersWithSameSpec [#playersWithSameSpec + 1] = {playerObject, playerObject.total} end end table.sort (playersWithSameSpec, DetailsFramework.SortOrder2) frame.comparisonSpellTable = {} frame.comparisonTargetTable = {} for i = 1, #playersWithSameSpec do --other player with the same spec local playerObject = playersWithSameSpec[i][1] local otherPlayerSpellTable, otherPlayerTargetTable = buildSpellAndTargetTables (playerObject, combat, attribute) frame.comparisonSpellTable [#frame.comparisonSpellTable + 1] = otherPlayerSpellTable frame.comparisonTargetTable [#frame.comparisonTargetTable + 1] = otherPlayerTargetTable local comparisonFrame = frame.GetComparisonScrollFrame() comparisonFrame.mainPlayer = player comparisonFrame.mainSpellTable = resultSpellTable comparisonFrame.mainTargetTable = resultTargetTable comparisonFrame.playerObject = playerObject comparisonFrame.playerName.text = playerObject:GetDisplayName() --iterate among spells of the main player and check if the spell exists on this player local otherPlayerResultSpellTable = {} for i = 1, #resultSpellTable do local spellTable = resultSpellTable [i] local found = false --iterate amont spell of the other player which the main player is being compared for o = 1, #otherPlayerSpellTable do local otherSpellTable = otherPlayerSpellTable[o] --check if this is a pet if (spellTable.npcId) then --match the npcId before match the spellId if (otherSpellTable.npcId == spellTable.npcId) then if (otherSpellTable.spellId == spellTable.spellId) then found = true --insert the amount of the main spell in the table otherSpellTable.mainSpellAmount = spellTable.amount otherPlayerResultSpellTable [#otherPlayerResultSpellTable+1] = otherSpellTable break end end else if (otherSpellTable.spellId == spellTable.spellId) then found = true --insert the amount of the main spell in the table otherSpellTable.mainSpellAmount = spellTable.amount otherPlayerResultSpellTable [#otherPlayerResultSpellTable+1] = otherSpellTable break end end end if (not found) then otherPlayerResultSpellTable [#otherPlayerResultSpellTable+1] = {0, 0, spellName = "", spellIcon = "", spellId = 0, amount = 0} end end --call the update function comparisonFrame.spellsScroll.playerObject = playerObject comparisonFrame.spellsScroll:SetData (otherPlayerResultSpellTable) comparisonFrame.spellsScroll:Refresh() --iterate among targets of the main player and check if the target exists on this player local otherPlayerResultTargetsTable = {} for i = 1, #resultTargetTable do local targetTable = resultTargetTable [i] local found = false --iterate amont targets of the other player which the main player is being compared for o = 1, #otherPlayerTargetTable do local otherTargetTable = otherPlayerTargetTable[o] if (otherTargetTable.originalName == targetTable.originalName) then found = true --insert the amount of the main spell in the table otherTargetTable.mainTargetAmount = targetTable.amount otherPlayerResultTargetsTable [#otherPlayerResultTargetsTable+1] = otherTargetTable break end end if (not found) then otherPlayerResultTargetsTable [#otherPlayerResultTargetsTable+1] = {"", 0, targetName = "", amount = 0, originalName = ""} end end --call the update function comparisonFrame.targetsScroll:SetData (otherPlayerResultTargetsTable) comparisonFrame.targetsScroll:Refresh() end end local iconTableCompare = { texture = [[Interface\AddOns\Details\images\icons]], --coords = {363/512, 381/512, 0/512, 17/512}, coords = {383/512, 403/512, 0/512, 15/512}, width = 16, height = 14, } Details:CreatePlayerDetailsTab ("New Compare", "Compare", --[1] tab name [2] localized name function (tabOBject, playerObject) --[2] condition local attribute = Details:GetDisplayTypeFromBreakdownWindow() local combat = Details:GetCombatFromBreakdownWindow() if (attribute > 2) then return false end local playerSpec = playerObject.spec or "no-spec" local playerSerial = playerObject.serial local showTab = false for index, actor in _ipairs (combat [attribute]._ActorTable) do if (actor.spec == playerSpec and actor.serial ~= playerSerial) then showTab = true break end end if (showTab) then return true end --return false return true --debug? end, playerComparisonFill, --[3] fill function nil, --[4] onclick playerComparisonCreate, --[5] oncreate iconTableCompare, --[6] icon table { attributes = { [1] = {1, 2, 3, 4, 5, 6, 7, 8}, [2] = {1, 2, 3, 4, 5, 6, 7, 8}, }, tabNameToReplace = "Compare", bIsCompareTab = true, } --replace tab [attribute] = [sub attributes] ) end --------------------------------------------------------------------------------------------------------------------------------------- function compareTwo:OnEvent(_, event, ...) if (event == "ADDON_LOADED") then local AddonName = select(1, ...) if (AddonName == "Details_Compare2") then --> every plugin must have a OnDetailsEvent function function compareTwo:OnDetailsEvent(event, ...) return handle_details_event(event, ...) end --> Install: install -> if successful installed; saveddata -> a table saved inside details db, used to save small amount of data like configs local install, saveddata = Details:InstallPlugin("RAID", "Compare 2.0", "Interface\\Icons\\Ability_Warrior_BattleShout", compareTwo, "DETAILS_PLUGIN_COMPARETWO_WINDOW", MINIMAL_DETAILS_VERSION_REQUIRED, "Terciob", COMPARETWO_VERSION) if (type(install) == "table" and install.error) then print(install.error) end --> registering details events we need Details:RegisterEvent(compareTwo, "COMBAT_PLAYER_ENTER") --when details creates a new segment, not necessary the player entering in combat. Details:RegisterEvent(compareTwo, "COMBAT_PLAYER_LEAVE") --when details finishs a segment, not necessary the player leaving the combat. Details:RegisterEvent(compareTwo, "DETAILS_DATA_RESET") --details combat data has been wiped compareTwo.InstallAdvancedCompareWindow() --this plugin does not show in lists of plugins compareTwo.NoMenu = true end end end end