You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

471 lines
16 KiB

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
local detailsFramework = DetailsFramework
local CreateFrame = CreateFrame
local GameCooltip = GameCooltip
local wipe = table.wipe
local _
local encounterDetails = _G.EncounterDetailsGlobal
local edFrame = encounterDetails.Frame
local phaseFrame = CreateFrame("frame", "EncounterDetailsPhaseFrame", edFrame, "BackdropTemplate")
phaseFrame:SetAllPoints()
phaseFrame:SetFrameLevel(edFrame:GetFrameLevel()+1)
phaseFrame.DamageTable = {}
phaseFrame.HealingTable = {}
phaseFrame.LastPhaseSelected = 1
phaseFrame.CurrentSegment = {}
phaseFrame.PhaseButtons = {}
EncounterDetailsPhaseFrame:Hide()
local phaseButtonTemplateHighlight = {
backdrop = {edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true},
backdropcolor = {.7, .7, .7, .5},
onentercolor = {1, 1, 1, .5},
backdropbordercolor = {.70, .70, .70, 1},
}
local phaseButtonTemplate = {
backdrop = {edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true},
backdropcolor = {.7, .7, .7, .5},
onentercolor = {1, 1, 1, .5},
backdropbordercolor = {0, 0, 0, 1},
}
local scrollWidth, scrollHeight, scrollLineAmount, scrollLineHeight = 250, 420, 20, 20
local phasesY = -88
local anchorY = -120
phaseFrame:SetScript("OnShow", function()
phaseFrame.OnSelectPhase(1)
end)
function phaseFrame:ClearAll()
--disable all buttons
for i = 1, #phaseFrame.PhaseButtons do
phaseFrame.PhaseButtons[i]:SetTemplate(phaseButtonTemplate)
phaseFrame.PhaseButtons[i]:Disable()
end
--update damage and healing scrolls
wipe(phaseFrame.DamageTable)
wipe(phaseFrame.HealingTable)
--refresh the scroll
phaseFrame.Damage_Scroll:Refresh()
phaseFrame.Heal_Scroll:Refresh()
--clear phase bars
phaseFrame:ClearPhaseBars()
end
local selectSegment = function(_, _, phaseSelected)
phaseFrame["OnSelectPhase"](phaseSelected)
end
function phaseFrame.OnSelectPhase(phaseSelected)
phaseFrame:ClearAll()
--get the selected segment
phaseFrame.CurrentSegment = encounterDetails:GetCombat(encounterDetails._segment)
if (not phaseFrame.CurrentSegment) then
return
end
--get the heal and damage for phase selected
local phaseData = phaseFrame.CurrentSegment.PhaseData
if (not phaseData) then
return
end
phaseSelected = phaseSelected or phaseFrame.LastPhaseSelected
phaseFrame.LastPhaseSelected = phaseSelected
local phases = phaseFrame:GetPhaseTimers(phaseFrame.CurrentSegment, true)
for buttonIndex, phase in ipairs(phases) do
local button = phaseFrame.PhaseButtons[buttonIndex]
if (phase == phaseSelected) then
button:SetTemplate(phaseButtonTemplateHighlight)
else
button:SetTemplate(phaseButtonTemplate)
if (phaseFrame.CurrentSegment.PhaseData.damage[phase]) then
button:Enable()
else
button:Disable()
end
end
button:SetText(phase)
button:SetClickFunction(selectSegment, phase)
end
if (not phaseData.damage[phaseSelected]) then
phaseFrame:ClearAll()
return
end
--update damage and healing scrolls
wipe(phaseFrame.DamageTable)
for charName, amount in pairs(phaseData.damage[phaseSelected]) do
table.insert(phaseFrame.DamageTable, {charName, amount})
end
table.sort(phaseFrame.DamageTable, function(a, b) return a[2] > b[2] end)
wipe(phaseFrame.HealingTable)
for charName, amount in pairs(phaseData.heal[phaseSelected]) do
table.insert(phaseFrame.HealingTable, {charName, amount})
end
table.sort(phaseFrame.HealingTable, function(a, b) return a[2] > b[2] end)
--refresh the scroll
phaseFrame.Damage_Scroll:Refresh()
phaseFrame.Heal_Scroll:Refresh()
phaseFrame:UpdatePhaseBars()
end
local PhaseSelectLabel = detailsFramework:CreateLabel(phaseFrame, "Select Phase:", 12, "orange")
local DamageLabel = detailsFramework:CreateLabel(phaseFrame, "Damage Done")
local HealLabel = detailsFramework:CreateLabel(phaseFrame, "Healing Done")
local PhaseTimersLabel = detailsFramework:CreateLabel(phaseFrame, "Time Spent on Each Phase")
local report_damage = function(IsCurrent, IsReverse, AmtLines)
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!: Damage for Phase " .. phaseFrame.LastPhaseSelected .. " of " ..(phaseFrame.CurrentSegment and phaseFrame.CurrentSegment.is_boss and phaseFrame.CurrentSegment.is_boss.name or "Unknown") .. ":")
for i = 1, #phaseFrame.DamageTable do
table.insert(result, encounterDetails:GetOnlyName(phaseFrame.DamageTable[i][1]) .. ": " .. Details:ToK(math.floor(phaseFrame.DamageTable[i][2])))
end
encounterDetails:SendReportWindow(reportFunc, nil, nil, true)
end
local Report_DamageButton = detailsFramework:CreateButton(phaseFrame, report_damage, 16, 16, "report")
Report_DamageButton:SetPoint("left", DamageLabel, "left", scrollWidth-44, 0)
Report_DamageButton.textcolor = "gray"
Report_DamageButton.textsize = 9
local report_healing = function()
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 " .. phaseFrame.LastPhaseSelected .. " of " ..(phaseFrame.CurrentSegment and phaseFrame.CurrentSegment.is_boss and phaseFrame.CurrentSegment.is_boss.name or "Unknown") .. ":")
for i = 1, #phaseFrame.HealingTable do
table.insert(result, encounterDetails:GetOnlyName(phaseFrame.HealingTable[i][1]) .. ": " .. Details:ToK(math.floor(phaseFrame.HealingTable[i][2])))
end
encounterDetails:SendReportWindow(reportFunc, nil, nil, true)
end
local Report_HealingButton = detailsFramework:CreateButton(phaseFrame, report_healing, 16, 16, "report")
Report_HealingButton:SetPoint("left", HealLabel, "left", scrollWidth-44, 0)
Report_HealingButton.textcolor = "gray"
Report_HealingButton.textsize = 9
PhaseSelectLabel:SetPoint("topleft", phaseFrame, "topleft", 10, phasesY)
DamageLabel:SetPoint("topleft", phaseFrame, "topleft", 10, anchorY)
HealLabel:SetPoint("topleft", phaseFrame, "topleft", scrollWidth + 40, anchorY)
PhaseTimersLabel:SetPoint("topleft", phaseFrame, "topleft",(scrollWidth * 2) +(40*2), anchorY)
for i = 1, 10 do
local button = detailsFramework:CreateButton(phaseFrame, phaseFrame.OnSelectPhase, 60, 20, "", i)
button:SetPoint("left", PhaseSelectLabel, "right", 8 +((i-1) * 61), 0)
table.insert(phaseFrame.PhaseButtons, button)
end
local ScrollRefresh = function(self, data, offset, total_lines)
local formatToK = Details:GetCurrentToKFunction()
local removeRealm = Details.GetOnlyName
local topValue = data[1] and data[1][2]
for i = 1, scrollLineAmount do
local index = i + offset
local player = data[index]
if (player) then
local line = self:GetLine(i)
local texture, L, R, T, B = Details:GetPlayerIcon(player[1], phaseFrame.CurrentSegment)
line.icon:SetTexture(texture)
line.icon:SetTexCoord(L, R, T, B)
line.name:SetText(index .. ". " .. removeRealm(_, player[1]))
line.done:SetText(formatToK(_, player[2]) .. " (" .. string.format("%.1f", player[2] / topValue * 100) .. "%)")
line.statusbar:SetValue(player[2] / topValue * 100)
local actorClass = Details:GetClass(player[1])
if (actorClass) then
line.statusbar:SetColor(actorClass)
else
line.statusbar:SetColor("silver")
end
end
end
end
local onEnterLine = function(self)
self:SetBackdropColor(unpack(edTable.defaultBackgroundColor_OnEnter))
end
local onLeaveLine = function(self)
self:SetBackdropColor(unpack(edTable.defaultBackgroundColor))
end
local scrollCreateLine = function(self, index)
local line = CreateFrame("button", "$parentLine" .. index, self,"BackdropTemplate")
line:SetPoint("topleft", self, "topleft", 0, -((index-1)*(scrollLineHeight+1)))
line:SetSize(scrollWidth, scrollLineHeight)
line:SetScript("OnEnter", onEnterLine)
line:SetScript("OnLeave", onLeaveLine)
line:SetScript("OnClick", line_onclick)
line:SetBackdrop({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
line:SetBackdropColor(unpack(edTable.defaultBackgroundColor))
local statusBar = detailsFramework:CreateBar(line, encounterDetails.Frame.DefaultBarTexture, 1, 1, 100)
statusBar:SetAllPoints(line)
statusBar.backgroundtexture = encounterDetails.Frame.DefaultBarTexture
statusBar.backgroundcolor = {.3, .3, .3, .3}
local icon = statusBar:CreateTexture("$parentIcon", "overlay")
icon:SetSize(scrollLineHeight, scrollLineHeight)
local name = statusBar:CreateFontString("$parentName", "overlay", "GameFontNormal")
detailsFramework:SetFontSize(name, 10)
icon:SetPoint("left", line, "left", 2, 0)
name:SetPoint("left", icon, "right", 2, 0)
detailsFramework:SetFontColor(name, "white")
local done = statusBar:CreateFontString("$parentDone", "overlay", "GameFontNormal")
detailsFramework:SetFontSize(done, 10)
detailsFramework:SetFontColor(done, "white")
done:SetPoint("right", line, "right", -2, 0)
line.icon = icon
line.name = name
line.done = done
line.statusbar = statusBar
name:SetHeight(10)
name:SetJustifyH("left")
return line
end
local damageScroll = detailsFramework:CreateScrollBox(phaseFrame, "$parentDamageScroll", ScrollRefresh, phaseFrame.DamageTable, scrollWidth, scrollHeight, scrollLineAmount, scrollLineHeight)
local healScroll = detailsFramework:CreateScrollBox(phaseFrame, "$parentHealScroll", ScrollRefresh, phaseFrame.HealingTable, scrollWidth, scrollHeight, scrollLineAmount, scrollLineHeight)
damageScroll:SetPoint("topleft", DamageLabel.widget, "bottomleft", 0, -4)
healScroll:SetPoint("topleft", HealLabel.widget, "bottomleft", 0, -4)
detailsFramework:ReskinSlider(damageScroll, 4)
detailsFramework:ReskinSlider(healScroll, 4)
for i = 1, scrollLineAmount do
damageScroll:CreateLine(scrollCreateLine)
end
phaseFrame.Damage_Scroll = damageScroll
damageScroll:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
damageScroll:SetBackdropColor(0, 0, 0, .4)
for i = 1, scrollLineAmount do
healScroll:CreateLine(scrollCreateLine)
end
phaseFrame.Heal_Scroll = healScroll
healScroll:SetBackdrop({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
healScroll:SetBackdropColor(0, 0, 0, .4)
phaseFrame.PhasesBars = {}
phaseFrame.PhasesSegmentCompare = {}
local PhaseBarOnEnter = function(self)
phaseFrame:UpdateSegmentCompareBars(self.phase)
self:SetBackdropColor(unpack(edTable.defaultBackgroundColor_OnEnter))
end
local PhaseBarOnLeave = function(self)
phaseFrame:ClearSegmentCompareBars()
self:SetBackdropColor(unpack(edTable.defaultBackgroundColor))
end
local PhaseBarOnClick = function(self)
--report
end
--cria as linhas mostrando o tempo decorride de cada phase
for i = 1, 10 do
local line = CreateFrame("button", "$parentPhaseBar" .. i, phaseFrame,"BackdropTemplate")
line:SetPoint("topleft", PhaseTimersLabel.widget, "bottomleft", 0, -((i-1)*(31)) - 4)
line:SetSize(175, 30)
line:SetScript("OnEnter", PhaseBarOnEnter)
line:SetScript("OnLeave", PhaseBarOnLeave)
line:SetScript("OnClick", PhaseBarOnClick)
line:SetBackdrop({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
line:SetBackdropColor(unpack(edTable.defaultBackgroundColor))
local icon = line:CreateTexture("$parentIcon", "overlay")
icon:SetSize(16, 16)
icon:SetTexture([[Interface\AddOns\Details\images\clock]])
local name = line:CreateFontString("$parentName", "overlay", "GameFontNormal")
detailsFramework:SetFontSize(name, 10)
local done = line:CreateFontString("$parentDone", "overlay", "GameFontNormal")
detailsFramework:SetFontSize(done, 10)
icon:SetPoint("left", line, "left", 2, 0)
name:SetPoint("left", icon, "right", 2, 0)
done:SetPoint("right", line, "right", -3, 0)
line.icon = icon
line.name = name
line.done = done
name:SetHeight(10)
name:SetJustifyH("left")
table.insert(phaseFrame.PhasesBars, line)
end
--cria a linha do segmento para a compara��o, � o que fica na parte direita da tela
--ele � acessado para mostrar quando passar o mouse sobre uma das barras de phase
for i = 1, 20 do
local line = CreateFrame("button", "$parentSegmentCompareBar" .. i, phaseFrame,"BackdropTemplate")
line:SetPoint("topleft", PhaseTimersLabel.widget, "bottomleft", 175+10, -((i-1)*(scrollLineHeight+1)) - 4)
line:SetSize(150, scrollLineHeight)
line:SetBackdrop({bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
line:SetBackdropColor(unpack(edTable.defaultBackgroundColor))
line:Hide()
local name = line:CreateFontString("$parentName", "overlay", "GameFontNormal")
detailsFramework:SetFontSize(name, 9)
name:SetPoint("left", line, "left", 2, 0)
local done = line:CreateFontString("$parentDone", "overlay", "GameFontNormal")
detailsFramework:SetFontSize(done, 9)
done:SetPoint("right", line, "right", -2, 0)
line.name = name
line.done = done
name:SetHeight(10)
name:SetJustifyH("left")
table.insert(phaseFrame.PhasesSegmentCompare, line)
end
function phaseFrame:ClearPhaseBars()
for i = 1, #phaseFrame.PhasesBars do
local bar = phaseFrame.PhasesBars[i]
bar.name:SetText("")
bar.done:SetText("")
bar.phase = nil
bar:Hide()
end
end
function phaseFrame:ClearSegmentCompareBars()
for i = 1, #phaseFrame.PhasesSegmentCompare do
phaseFrame.PhasesSegmentCompare[i]:Hide()
end
end
function phaseFrame:GetPhaseTimers(segment, ordered)
local t = {}
segment = segment or phaseFrame.CurrentSegment
for phaseIT = 1, #segment.PhaseData do
local phase, startAt = unpack(segment.PhaseData[phaseIT]) --phase iterator
local endAt = segment.PhaseData[phaseIT+1] and segment.PhaseData[phaseIT+1][2] or segment:GetCombatTime()
local elapsed = endAt - startAt
t[phase] = (t[phase] or 0) + elapsed
end
if (ordered) then
local order = {}
for phase, _ in pairs(t) do
table.insert(order, phase)
end
table.sort(order, function(a, b) return a < b end)
return order, t
end
return t
end
--executa quando atualizar o segment geral
function phaseFrame:UpdatePhaseBars()
local timers, hash = phaseFrame:GetPhaseTimers(phaseFrame.CurrentSegment, true)
local i = 1
for index, phase in ipairs(timers) do
local timer = hash[phase]
phaseFrame.PhasesBars[i].name:SetText("|cFFC0C0C0Phase:|r |cFFFFFFFF" .. phase)
phaseFrame.PhasesBars[i].done:SetText(detailsFramework:IntegerToTimer(timer))
phaseFrame.PhasesBars[i].phase = phase
phaseFrame.PhasesBars[i]:Show()
i = i + 1
end
end
--executa quando passar o mouse sobre uma bnarra de phase
function phaseFrame:UpdateSegmentCompareBars(phase)
--segmento atual(numero)
local segmentNumber = encounterDetails._segment
local segmentTable = phaseFrame.CurrentSegment
local bossID = segmentTable:GetBossInfo() and segmentTable:GetBossInfo().id
local index = 1
for i, segment in ipairs(Details:GetCombatSegments()) do
if (segment:GetBossInfo() and segment:GetBossInfo().id == bossID) then
local bar = phaseFrame.PhasesSegmentCompare [index]
local timers = phaseFrame:GetPhaseTimers(segment)
if (timers [phase]) then
if (segment ~= segmentTable) then
bar.name:SetText("Segment " .. i .. ":")
detailsFramework:SetFontColor(bar.name, "orange")
bar.done:SetText(detailsFramework:IntegerToTimer(timers [phase]))
detailsFramework:SetFontColor(bar.done, "orange")
else
bar.name:SetText("Segment " .. i .. ":")
detailsFramework:SetFontColor(bar.name, "white")
bar.done:SetText(detailsFramework:IntegerToTimer(timers [phase]))
detailsFramework:SetFontColor(bar.done, "white")
end
else
bar.name:SetText("Segment " .. i .. ":")
detailsFramework:SetFontColor(bar.name, "red")
bar.done:SetText("--x--x--")
end
bar:Show()
index = index + 1
end
end
end