local addonId, edTable = ... local Details = _G._detalhes local AceLocale = LibStub("AceLocale-3.0") local Loc = AceLocale:GetLocale("Details_EncounterDetails") local Graphics = LibStub:GetLibrary("LibGraph-2.0") local ipairs = ipairs local _GetSpellInfo = Details.getspellinfo local unpack = unpack ---@type detailsframework local detailsFramework = DetailsFramework local CreateFrame = CreateFrame local GameCooltip = GameCooltip local wipe = table.wipe local _ --VerticalLines são os indicatores de onde aconteceram mortes, precisa ser renomeados e criar uma classe pra eles --precisa fazer um indicator genérico na classe df_chart para ser usado como indicador de bloodlust ou qualquer coisa que indica um evento por x tempo ---@class ed_phaseframe : frame ---@field texture texture local encounterDetails = _G.EncounterDetailsGlobal local edFrame = encounterDetails.Frame --an auxiliary table to store things related to df_chartmulti but can't be stored in 'chartPanel' encounterDetails.chartFrameAux = {} local CONST_CHART_WIDTH = 921 local CONST_CHART_HEIGHT = 524 local CONST_CHART_LENGTH = 810 local CONST_CHART_TIMELINE_Y_POSITION = -540 local CONST_CHART_MAX_DEATHS_ICONS = 6 local CONST_PHASE_PANEL_WIDTH = 451 local CONST_PHASE_BAR_HEIGHT = 16 local DETAILS_ATTRIBUTE_DAMAGE = 1 local phaseAlpha = 0.5 local lastBoss = nil local chartLineColors = {{1, 1, 1, 1}, {1, 0.5, 0.3, 1}, {0.75, 0.7, 0.1, 1}, {0.2, 0.9, 0.2, 1}, {0.2, 0.5, 0.9, 1}} encounterDetails.CombatsAlreadyDrew = {} ---create a multi chart frame ---@return df_chartmulti local createMultiChartFrame = function() ---@type df_chartmulti local chartPanel = detailsFramework:CreateGraphicMultiLineFrame(edFrame, "EncounterDetailsChartPanel") chartPanel.xAxisLabelsYOffset = -9 chartPanel:CreateAxesLines(48, 28, "left", 1, 10, 10, 1, 1, 1, 1) chartPanel:SetXAxisDataType("time") chartPanel:SetSize(CONST_CHART_WIDTH, CONST_CHART_HEIGHT) chartPanel:SetPoint("topleft", encounterDetails.Frame, "topleft", 2, -76) chartPanel:SetLineThickness(3) encounterDetails.chartPanel = chartPanel detailsFramework:ApplyStandardBackdrop(chartPanel) ---@type ed_phaseframe[] encounterDetails.chartFrameAux.PhaseFrames = {} encounterDetails.chartFrameAux.VerticalLines = {} local phaseTooltip = encounterDetails:CreatePhaseTooltip(chartPanel) encounterDetails:CreatePhaseIndicators(chartPanel, phaseTooltip) detailsFramework:NewLabel(chartPanel, chartPanel, nil, "phases_string", "phases:", "GameFontHighlightSmall") chartPanel["phases_string"]:SetPoint("bottomleft", chartPanel, "bottomleft", 5, 10) chartPanel:SetScript("OnShow", function() chartPanel["phases_string"]:Show() end) chartPanel:SetScript("OnHide", function() chartPanel["phases_string"]:Hide() end) return chartPanel end function encounterDetails:ShowChartFrame() local segment = encounterDetails._segment if (not segment) then return end ---@type df_chartmulti local multiChartPanel = encounterDetails.chartPanel if (not multiChartPanel) then ---@type df_chartmulti multiChartPanel = createMultiChartFrame() end multiChartPanel:Reset() ---@type combat local combatObject = encounterDetails:GetCombat(segment) --elapsed combat time if (combatObject:GetCombatTime() < 12) then return end local uniqueCombatId = combatObject:GetCombatUID() local chartData = EncounterDetailsDB.chartData[uniqueCombatId] local currentChartData = chartData and chartData["Raid Damage Done"] if (not currentChartData or not combatObject.start_time or not combatObject.end_time) then encounterDetails:Msg("This segment doesn't have chart data.") return elseif (currentChartData.max_value and currentChartData.max_value == 0) then return end encounterDetails.Frame.linhas = 1 --can't find references to this variable if (encounterDetails.Frame.linhas > 5) then encounterDetails.Frame.linhas = 1 end for _, line in ipairs(encounterDetails.chartFrameAux.VerticalLines) do line:Hide() end local encounterId = combatObject.is_boss and combatObject.is_boss.id local chartIndex = 2 local smoothnessLevel = 3 ---draw the damage line from the 5th combat to 2nd combat for i = segment + 4, segment + 1, -1 do ---@type combat local thisCombatObject = encounterDetails:GetCombat(i) if (thisCombatObject) then local elapsedTime = thisCombatObject:GetCombatTime() if (elapsedTime > 12 and thisCombatObject.is_boss and thisCombatObject.is_boss.id == encounterId) then --is the same boss local thisUniqueCombatId = thisCombatObject:GetCombatUID() local thisChartData = EncounterDetailsDB.chartData[thisUniqueCombatId] and EncounterDetailsDB.chartData[thisUniqueCombatId]["Raid Damage Done"] --check if this is a valid chart data if (thisChartData and thisChartData.max_value and thisChartData.max_value > 0) then local tryNumber = thisCombatObject.is_boss.try_number or i multiChartPanel:AddData(thisChartData, nil, smoothnessLevel, "Try #" .. tryNumber, chartLineColors[chartIndex]) multiChartPanel:SetXAxisData(elapsedTime) chartIndex = chartIndex + 1 end end end end ---@type number[] local bloodLustTimers = combatObject.bloodlust or {} for index, bloodlustCombatTime in ipairs(bloodLustTimers) do multiChartPanel:AddBackdropIndicator("Bloodlust #" .. index, bloodlustCombatTime, bloodlustCombatTime + 40, {0, 0, 1, 0.2}) end encounterDetails:UpdatePhaseIndicators(multiChartPanel, combatObject) multiChartPanel:AddData(currentChartData, nil, smoothnessLevel, "current", chartLineColors[1]) multiChartPanel:SetXAxisData(combatObject:GetCombatTime()) multiChartPanel:Plot() multiChartPanel:Show() end function encounterDetails:UpdatePhaseIndicators(chartPanel, combatObject) encounterDetails:ClearPhaseIndicators() --update phase indicators local phaseData = combatObject.PhaseData local plotFrameWidth = chartPanel.plotFrame:GetWidth() local scale = (plotFrameWidth) / combatObject:GetCombatTime() for i = 1, #phaseData do local phase = phaseData[i][1] local phaseStartAt = phaseData[i][2] local phaseIndicator = encounterDetails:GetPhaseIndicator(i, phase) if (phaseStartAt == 1) then phaseStartAt = 0 end phaseIndicator:SetPoint("topleft", chartPanel.plotFrame, "bottomleft", (phaseStartAt * scale), -6) phaseIndicator.phase = phase phaseIndicator.start_at = phaseStartAt local nextPhase = phaseData[i+1] if (nextPhase) then local duration = nextPhase[2] - phaseStartAt phaseIndicator:SetWidth(scale * duration) phaseIndicator.elapsed = duration else local duration = combatObject:GetCombatTime() - phaseStartAt phaseIndicator:SetWidth(scale * duration) phaseIndicator.elapsed = duration end end end ---tooltip frame on hovering over ---@param chartPanel df_chartmulti ---@return frame function encounterDetails:CreatePhaseTooltip(chartPanel) ---@type frame local phaseTooltip = CreateFrame("frame", "EncounterDetailsPhasePanel", chartPanel, "BackdropTemplate") phaseTooltip:SetFrameStrata("TOOLTIP") phaseTooltip:SetFrameLevel(1000) phaseTooltip:SetWidth(450) detailsFramework:ApplyStandardBackdrop(phaseTooltip) local damageTexture = detailsFramework:CreateImage(phaseTooltip,[[Interface\AddOns\Details\images\skins\classic_skin_v1]], 16, 16, "overlay", {11/1024, 24/1024, 376/1024, 390/1024}) local damageLabel = detailsFramework:CreateLabel(phaseTooltip, "Damage Done:") damageTexture:SetPoint("topleft", phaseTooltip, "topleft", 10, -10) damageLabel:SetPoint("left", damageTexture, "right", 4, 0) local healingTexture = detailsFramework:CreateImage(phaseTooltip,[[Interface\AddOns\Details\images\skins\classic_skin_v1]], 16, 16, "overlay", {43/1024, 57/1024, 376/1024, 390/1024}) local healingLabel = detailsFramework:CreateLabel(phaseTooltip, "Healing Done:") healingTexture:SetPoint("topleft", phaseTooltip, "topleft", 250, -10) healingLabel:SetPoint("left", healingTexture, "right", 4, 0) phaseTooltip.phase_label = detailsFramework:CreateLabel(phaseTooltip, "") phaseTooltip.phase_label.fontsize = 10 phaseTooltip.time_label = detailsFramework:CreateLabel(phaseTooltip, "") phaseTooltip.time_label.fontsize = 10 phaseTooltip.report_label = detailsFramework:CreateLabel(phaseTooltip, "|cFFffb400Left Click|r: Report Damage |cFFffb400Right Click|r: Report Heal") phaseTooltip.report_label.fontsize = 10 phaseTooltip.phase_label:SetPoint("bottomleft", phaseTooltip, "bottomleft", 10, 5) phaseTooltip.time_label:SetPoint("left", phaseTooltip.phase_label, "right", 5, 0) phaseTooltip.report_label:SetPoint("bottomright", phaseTooltip, "bottomright", -10, 5) local phaseFrameBackgroundTexture = detailsFramework:CreateImage(phaseTooltip,[[Interface\Tooltips\UI-Tooltip-Background]], nil, nil, "artwork") phaseFrameBackgroundTexture:SetPoint("left", phaseTooltip.phase_label, "left") phaseFrameBackgroundTexture.height = 16 phaseFrameBackgroundTexture:SetPoint("right", phaseTooltip.report_label, "right") phaseFrameBackgroundTexture:SetVertexColor(0, 0, 0, 1) phaseTooltip.damage_labels = {} phaseTooltip.heal_labels = {} function phaseTooltip:ClearLabels() for i, tooltipBar in ipairs(phaseTooltip.damage_labels) do tooltipBar:Hide() end for i, tooltipBar in ipairs(phaseTooltip.heal_labels) do tooltipBar:Hide() end end local createTooltipBar = function(index, xOffset) ---@type statusbar local newtooltipBar = CreateFrame("statusbar", nil, phaseTooltip, "BackdropTemplate") newtooltipBar:SetSize(200, 16) newtooltipBar:SetFrameLevel(phaseTooltip:GetFrameLevel() + 50 - index) newtooltipBar:SetMinMaxValues(0, 1) newtooltipBar:SetPoint("topleft", phaseTooltip, "topleft", 5 + xOffset, ((index * 16) * -1) - 30) local playerName = detailsFramework:CreateLabel(newtooltipBar, "", 11, "white", nil, nil, nil, "overlay") local amountLabel = detailsFramework:CreateLabel(newtooltipBar, "", 11, nil, nil, nil, nil, "overlay") amountLabel:SetJustifyH("right") local iconTexture = detailsFramework:CreateImage(newtooltipBar, "", 16, 16, "overlay") local backgroundTexture = detailsFramework:CreateImage(newtooltipBar, [[Interface\AddOns\Details\images\bar_serenity]], nil, nil, "border") backgroundTexture.height = 16 backgroundTexture:SetVertexColor(.1, .1, .1, 0.834) local statusBarTexture = newtooltipBar:CreateTexture(nil, "artwork") statusBarTexture:SetTexture([[Interface\AddOns\Details\images\bar_serenity]]) statusBarTexture:SetVertexColor(.3, .3, .3, 1) statusBarTexture:SetAllPoints() newtooltipBar:SetStatusBarTexture(statusBarTexture) backgroundTexture:SetAllPoints() iconTexture:SetPoint("left", newtooltipBar, "left", 0, 0) playerName:SetPoint("left", iconTexture, "right", 2, 0) amountLabel:SetPoint("right", newtooltipBar, "right", -2, 0) newtooltipBar.lefttext = playerName newtooltipBar.righttext = amountLabel newtooltipBar.icon = iconTexture newtooltipBar.bg = backgroundTexture newtooltipBar.statusBarTexture = statusBarTexture return newtooltipBar end function phaseTooltip:GetTooltipBar(index, barType) local thisBar if (barType == "damage") then thisBar = phaseTooltip.damage_labels[index] if (not thisBar) then thisBar = createTooltipBar(index, 0) phaseTooltip.damage_labels[index] = thisBar end elseif (barType == "healing") then thisBar = phaseTooltip.heal_labels[index] if (not thisBar) then thisBar = createTooltipBar(index, 235) phaseTooltip.heal_labels[index] = thisBar end end thisBar:Show() return thisBar end return phaseTooltip end ---phase indicators below the x axis ---@param chartPanel df_chartmulti function encounterDetails:CreatePhaseIndicators(chartPanel, phaseTooltip) local sparkContainer = {} local phaseColors = {{0.2, 1, 0.2, phaseAlpha}, {1, 1, 0.2, phaseAlpha}, {1, 0.2, 0.2, phaseAlpha}, {0.2, 1, 1, phaseAlpha}, {0.2, 0.2, 1, phaseAlpha}, [1.5] = {0.25, 0.95, 0.25, phaseAlpha},[2.5] = {0.95, 0.95, 0.25, phaseAlpha},[3.5] = {0.95, 0.25, 0.25, phaseAlpha} } local createSpark = function() local newSpark = phaseTooltip:CreateTexture(nil, "overlay") newSpark:SetTexture([[Interface\CastingBar\UI-CastingBar-Spark]]) newSpark:SetBlendMode("ADD") newSpark:Hide() table.insert(sparkContainer, newSpark) end local getSpark = function(index) local spark = sparkContainer[index] if (not spark) then createSpark() spark = sparkContainer[index] end spark:ClearAllPoints() return spark end local hideSparks = function() for _, spark in ipairs(sparkContainer) do spark:Hide() end end local onClickPhase = function(self, button) ---@type combat local combatObject = encounterDetails:GetCombat(encounterDetails._segment) if (button == "LeftButton") then local result = {} local reportFunc = function(IsCurrent, IsReverse, AmtLines) AmtLines = AmtLines + 1 if (#result > AmtLines) then for i = #result, AmtLines+1, -1 do table.remove(result, i) end end encounterDetails:SendReportLines(result) end --need to build here because the mouse will leave the block to click in the send button table.insert(result, "Details!: Damage for Phase " .. self.phase .. " of " .. (combatObject and combatObject.is_boss and combatObject.is_boss.name or "Unknown") .. ":") for i = 1, #self.damage_actors do table.insert(result, encounterDetails:GetOnlyName(self.damage_actors[i][1]) .. ": " .. Details:ToK(math.floor(self.damage_actors[i][2]))) end encounterDetails:SendReportWindow(reportFunc, nil, nil, true) elseif (button == "RightButton") then local result = {} local reportFunc = function(IsCurrent, IsReverse, AmtLines) AmtLines = AmtLines + 1 if (#result > AmtLines) then for i = #result, AmtLines+1, -1 do table.remove(result, i) end end encounterDetails:SendReportLines(result) end table.insert(result, "Details!: Healing for Phase " .. self.phase .. " of " ..(combatObject and combatObject.is_boss and combatObject.is_boss.name or "Unknown") .. ":") for i = 1, #self.heal_actors do table.insert(result, encounterDetails:GetOnlyName(self.heal_actors[i][1]) .. ": " .. Details:ToK(math.floor(self.heal_actors[i][2]))) end encounterDetails:SendReportWindow(reportFunc, nil, nil, true) end end local onEnterPhase = function(self) local leftSpark = getSpark(1) local rightSpark = getSpark(2) leftSpark:SetPoint("left", self.texture, "left", -16, 0) rightSpark:SetPoint("right", self.texture, "right", 16, 0) leftSpark:Show() rightSpark:Show() self.texture:SetBlendMode("ADD") local phase = self.phase local sparkIndex = 3 self.texture:SetVertexColor(1, 1, 1) for _, thisPhaseFrame in ipairs(encounterDetails.chartFrameAux.PhaseFrames) do if (thisPhaseFrame ~= self and thisPhaseFrame.phase == phase) then local thisPhaseLeftSpark = getSpark(sparkIndex) local thisPhaseRightSpark = getSpark(sparkIndex+1) thisPhaseLeftSpark:SetPoint("left", thisPhaseFrame.texture, "left", -16, 0) thisPhaseRightSpark:SetPoint("right", thisPhaseFrame.texture, "right", 16, 0) thisPhaseLeftSpark:Show() thisPhaseRightSpark:Show() thisPhaseFrame.texture:SetBlendMode("ADD") thisPhaseFrame.texture:SetVertexColor(1, 1, 1) sparkIndex = sparkIndex + 2 end end ---@type combat local combatObject = encounterDetails:GetCombat(encounterDetails._segment) if (combatObject) then phaseTooltip:ClearLabels() --damage ---@type table> local listOfPlayers = {} for playerName, damageDone in pairs(combatObject.PhaseData.damage[self.phase]) do table.insert(listOfPlayers, {playerName, damageDone}) end table.sort(listOfPlayers, Details.Sort2) local topDamage = listOfPlayers[1] and listOfPlayers[1][2] for index, playerTable in ipairs(listOfPlayers) do local playerName = playerTable[1] local damageDone = playerTable[2] local tooltipBar = phaseTooltip:GetTooltipBar(index, "damage") tooltipBar:SetValue(damageDone / topDamage) tooltipBar.lefttext.text = encounterDetails:GetOnlyName(playerName) tooltipBar.righttext.text = Details:ToK(math.floor(damageDone)) ---@type actor local actor = combatObject:GetActor(DETAILS_ATTRIBUTE_DAMAGE, playerName) local class = encounterDetails:GetClass(playerName) local spec = encounterDetails:GetSpec(playerName) or actor and actor.spec --get the class color for the actor local red, green, blue = Details:GetClassColor(class) tooltipBar:SetStatusBarColor(red, green, blue) if (spec) then tooltipBar.icon.texture = [[Interface\AddOns\Details\images\spec_icons_normal]] tooltipBar.icon.texcoord = encounterDetails.class_specs_coords[spec] elseif (class) then tooltipBar.icon.texture = [[Interface\AddOns\Details\images\classes_small_alpha]] tooltipBar.icon.texcoord = Details.class_coords[class] else tooltipBar.icon.texture = [[Interface\LFGFRAME\LFGROLE_BW]] tooltipBar.icon:SetTexCoord(.25, .5, 0, 1) end tooltipBar:Show() end local damage_players = #listOfPlayers self.damage_actors = listOfPlayers --healing ---@type table> local listOfPlayersHeal = {} for playerName, heal in pairs(combatObject.PhaseData.heal[self.phase]) do table.insert(listOfPlayersHeal, {playerName, heal}) end table.sort(listOfPlayersHeal, Details.Sort2) local topHealing = listOfPlayersHeal[1] and listOfPlayersHeal[1][2] for index, playerTable in ipairs(listOfPlayersHeal) do local playerName = playerTable[1] local healingDone = playerTable[2] local tooltipBar = phaseTooltip:GetTooltipBar(index, "healing") tooltipBar:SetValue(healingDone / topHealing) tooltipBar.lefttext.text = encounterDetails:GetOnlyName(playerName) tooltipBar.righttext.text = Details:ToK(math.floor(healingDone)) ---@type actor local actor = combatObject:GetActor(DETAILS_ATTRIBUTE_DAMAGE, playerName) local class = encounterDetails:GetClass(playerName) local spec = encounterDetails:GetSpec(playerName) or actor and actor.spec --get the class color for the actor local red, green, blue = Details:GetClassColor(class) tooltipBar:SetStatusBarColor(red, green, blue) if (spec) then tooltipBar.icon.texture = [[Interface\AddOns\Details\images\spec_icons_normal]] tooltipBar.icon.texcoord = encounterDetails.class_specs_coords[spec] elseif (class) then tooltipBar.icon:SetTexture([[Interface\AddOns\Details\images\classes_small_alpha]]) tooltipBar.icon:SetTexCoord(unpack(Details.class_coords[class])) else tooltipBar.icon:SetTexture([[Interface\LFGFRAME\LFGROLE_BW]]) tooltipBar.icon:SetTexCoord(.25, .5, 0, 1) end tooltipBar:Show() end local heal_players = #listOfPlayersHeal self.heal_actors = listOfPlayersHeal --show the panel phaseTooltip:SetHeight((math.max(damage_players, heal_players) * 16) + 60) phaseTooltip:SetPoint("bottom", self, "top", 0, 10) phaseTooltip:Show() phaseTooltip.phase_label.text = "|cFFffb400Phase|r: " .. self.phase local m, s = math.floor(self.elapsed / 60), math.floor(self.elapsed % 60) phaseTooltip.time_label.text = "|cFFffb400Elapsed|r: " .. m .. "m " .. s .. "s" end end local onLeavePhase = function(self) wipe(self.damage_actors) wipe(self.heal_actors) for _, phaseTextureFrame in ipairs(encounterDetails.chartFrameAux.PhaseFrames) do phaseTextureFrame.texture:SetBlendMode("BLEND") phaseTextureFrame.texture:SetVertexColor(unpack(phaseTextureFrame.texture.original_color)) end hideSparks() phaseTooltip:Hide() end function encounterDetails:GetPhaseIndicator(index, phase) local phaseIndicatorFrame = encounterDetails.chartFrameAux.PhaseFrames[index] if (not phaseIndicatorFrame) then ---@type ed_phaseframe phaseIndicatorFrame = CreateFrame("frame", "EncounterDetailsPhaseTexture" .. index, chartPanel, "BackdropTemplate") phaseIndicatorFrame:SetHeight(CONST_PHASE_BAR_HEIGHT) local phaseTexture = phaseIndicatorFrame:CreateTexture(nil, "artwork") phaseTexture:SetAllPoints() phaseTexture:SetColorTexture(1, 1, 1, phaseAlpha) phaseTexture.original_color = {1, 1, 1} phaseIndicatorFrame.texture = phaseTexture phaseIndicatorFrame:SetScript("OnEnter", onEnterPhase) phaseIndicatorFrame:SetScript("OnLeave", onLeavePhase) phaseIndicatorFrame:SetScript("OnMouseUp", onClickPhase) phaseIndicatorFrame = phaseIndicatorFrame table.insert(encounterDetails.chartFrameAux.PhaseFrames, phaseIndicatorFrame) end phaseIndicatorFrame:ClearAllPoints() phase = math.min(phase, 5) if (not phaseColors[phase]) then Details:Msg("Phase out of range:", phase) phase = math.max(phase, 1) end local phaseColor = phaseColors[phase] if (not phaseColor) then phaseColor = {1, 1, 1} end phaseIndicatorFrame.texture:SetVertexColor(unpack(phaseColor)) local originalColor = phaseIndicatorFrame.texture.original_color originalColor[1], originalColor[2], originalColor[3] = unpack(phaseColors[phase]) phaseIndicatorFrame:Show() return phaseIndicatorFrame end function encounterDetails:ClearPhaseIndicators() for i, texture in pairs(encounterDetails.chartFrameAux.PhaseFrames) do texture:Hide() end end end ---not in use at the moment ---@param self any ---@param chartPanel df_chart ---@param detailsGraphicData any ---@param combatObject combat ---@param drawDeathsCombat combat function encounterDetails:DrawSegmentGraphic(chartPanel, detailsGraphicData, combatObject, drawDeathsCombat) --> add death icons for the first deaths in the segment if (drawDeathsCombat) then local mortes = drawDeathsCombat.last_events_tables local scaleG = CONST_CHART_LENGTH / drawDeathsCombat:GetCombatTime() for _, row in ipairs(encounterDetails.chartFrameAux.VerticalLines) do row:Hide() end for i = 1, math.min(CONST_CHART_MAX_DEATHS_ICONS, #mortes) do local vRowFrame = encounterDetails.chartFrameAux.VerticalLines[i] if (not vRowFrame) then vRowFrame = CreateFrame("frame", "DetailsEncountersVerticalLine"..i, chartPanel, "BackdropTemplate") vRowFrame:SetWidth(20) vRowFrame:SetHeight(43) vRowFrame:SetFrameLevel(chartPanel:GetFrameLevel()+2) vRowFrame:SetScript("OnEnter", function(frame) if (vRowFrame.dead[1] and vRowFrame.dead[1][3] and vRowFrame.dead[1][3][2]) then GameCooltip:Reset() --time of death and player name GameCooltip:AddLine(vRowFrame.dead[6].." "..vRowFrame.dead[3]) local class, l, r, t, b = Details:GetClass(vRowFrame.dead[3]) if (class) then GameCooltip:AddIcon([[Interface\AddOns\Details\images\classes_small]], 1, 1, 12, 12, l, r, t, b) end GameCooltip:AddLine("") --last hits: local death = vRowFrame.dead local amt = 0 for i = #death[1], 1, -1 do local this_hit = death[1][i] if (type(this_hit[1]) == "boolean" and this_hit[1]) then local spellname, _, spellicon = _GetSpellInfo(this_hit[2]) local t = death[2] - this_hit[4] GameCooltip:AddLine("-" .. string.format("%.1f", t) .. " " .. spellname .. "(" .. this_hit[6] .. ")", encounterDetails:comma_value(this_hit[3])) GameCooltip:AddIcon(spellicon, 1, 1, 12, 12, 0.1, 0.9, 0.1, 0.9) amt = amt + 1 if (amt == 3) then break end end end GameCooltip:SetOption("TextSize", 9.5) GameCooltip:SetOption("HeightAnchorMod", -15) GameCooltip:SetWallpaper(1,[[Interface\SPELLBOOK\Spellbook-Page-1]], {.6, 0.1, 0, 0.64453125}, {1, 1, 1, 0.1}, true) GameCooltip:ShowCooltip(frame, "tooltip") end end) vRowFrame:SetScript("OnLeave", function(frame) Details.popup:ShowMe(false) end) vRowFrame.texture = vRowFrame:CreateTexture(nil, "overlay") vRowFrame.texture:SetTexture("Interface\\AddOns\\Details\\images\\verticalline") vRowFrame.texture:SetWidth(3) vRowFrame.texture:SetHeight(20) vRowFrame.texture:SetPoint("center", "DetailsEncountersVerticalLine"..i, "center") vRowFrame.texture:SetPoint("bottom", "DetailsEncountersVerticalLine"..i, "bottom", 0, 0) vRowFrame.texture:SetVertexColor(1, 1, 1, .5) vRowFrame.icon = vRowFrame:CreateTexture(nil, "overlay") vRowFrame.icon:SetTexture("Interface\\WorldStateFrame\\SkullBones") vRowFrame.icon:SetTexCoord(0.046875, 0.453125, 0.046875, 0.46875) vRowFrame.icon:SetWidth(16) vRowFrame.icon:SetHeight(16) vRowFrame.icon:SetPoint("center", "DetailsEncountersVerticalLine"..i, "center") vRowFrame.icon:SetPoint("bottom", "DetailsEncountersVerticalLine"..i, "bottom", 0, 20) encounterDetails.chartFrameAux.VerticalLines[i] = vRowFrame end local deadTime = mortes[i].dead_at vRowFrame:SetPoint("topleft", encounterDetails.Frame, "topleft",(deadTime*scaleG)+70, -CONST_CHART_HEIGHT-22) vRowFrame.dead = mortes[i] vRowFrame:Show() end end end function encounterDetails:CreateGraphPanel() --not in use --bloodlust indicators chartPanel.bloodlustIndicators = {} for i = 1, 5 do local bloodlustTexture = chartPanel:CreateTexture(nil, "overlay") bloodlustTexture:SetColorTexture(0, 1, 0, 0,6) chartPanel.bloodlustIndicators[#chartPanel.bloodlustIndicators+1] = bloodlustTexture end end