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<number, table<string, number>>
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<number, table<string, number>>
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