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.
3222 lines
110 KiB
3222 lines
110 KiB
|
|
do
|
|
|
|
local wipe = _G.wipe
|
|
local Details = _G.Details
|
|
local _detalhes = _G._detalhes
|
|
|
|
|
|
_detalhes.DeathGraphsWindowBuilder = function (DeathGraphs)
|
|
|
|
local tinsert = tinsert
|
|
local GetSpellInfo = GetSpellInfo
|
|
local unpack = unpack
|
|
|
|
local f = DeathGraphs.Frame
|
|
|
|
local framework = _G._detalhes:GetFramework()
|
|
local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0")
|
|
|
|
local CONST_DBTYPE_DEATH = "deaths"
|
|
local CONST_DBTYPE_ENDURANCE = "endurance"
|
|
local CONST_COORDS_NO_BORDER = {5/64, 59/64, 5/64, 59/64}
|
|
|
|
local BUTTON_BACKGROUND_COLOR = {.2, .2, .2, .75}
|
|
local BUTTON_BACKGROUND_COLORHIGHLIGHT = {.5, .5, .5, .8}
|
|
|
|
local CONST_MIN_HEALINGDONE_DEATHLOG = 100
|
|
local CONST_MAX_DEATH_EVENTS = 29
|
|
local CONST_MAX_DEATH_PLAYERS = 25
|
|
|
|
local Loc = LibStub ("AceLocale-3.0"):GetLocale ("Details_DeathGraphs")
|
|
|
|
local debugmode = false
|
|
local cooltip_block_bg = {0, 0, 0, 1}
|
|
local _
|
|
|
|
framework.button_templates ["ADL_BUTTON_TEMPLATE"] = {
|
|
backdrop = {edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true},
|
|
backdropcolor = {.3, .3, .3, .9},
|
|
onentercolor = {.6, .6, .6, .9},
|
|
backdropbordercolor = {0, 0, 0, 1},
|
|
onenterbordercolor = {0, 0, 0, 1},
|
|
}
|
|
|
|
framework:InstallTemplate ("button", "ADL_MENUBUTTON_TEMPLATE", {width = 160}, "DETAILS_PLUGIN_BUTTON_TEMPLATE")
|
|
framework:InstallTemplate ("button", "ADL_MENUBUTTON_SELECTED_TEMPLATE", {width = 160}, "DETAILS_PLUGIN_BUTTONSELECTED_TEMPLATE")
|
|
|
|
local options_text_template = framework:GetTemplate ("font", "OPTIONS_FONT_TEMPLATE")
|
|
local options_dropdown_template = framework:GetTemplate ("dropdown", "OPTIONS_DROPDOWN_TEMPLATE")
|
|
local options_switch_template = framework:GetTemplate ("switch", "OPTIONS_CHECKBOX_TEMPLATE")
|
|
local options_slider_template = framework:GetTemplate ("slider", "OPTIONS_SLIDER_TEMPLATE")
|
|
local options_button_template = framework:GetTemplate ("button", "OPTIONS_BUTTON_TEMPLATE")
|
|
|
|
local mode_buttons_width = 140
|
|
local mode_buttons_height = 20
|
|
local mode_buttons_y_pos = 10
|
|
|
|
--> main frame
|
|
|
|
f:SetFrameStrata ("HIGH")
|
|
f:SetToplevel (true)
|
|
f:SetPoint ("center", UIParent, "center")
|
|
|
|
f:SetSize (925, 498)
|
|
|
|
f:EnableMouse (true)
|
|
f:SetResizable (false)
|
|
f:SetMovable (true)
|
|
f:SetScript ("OnMouseDown",
|
|
function (self, botao)
|
|
if (botao == "LeftButton") then
|
|
if (self.isMoving) then
|
|
return
|
|
end
|
|
self:StartMoving()
|
|
self.isMoving = true
|
|
elseif (botao == "RightButton") then
|
|
if (self.isMoving) then
|
|
return
|
|
end
|
|
DeathGraphs:CloseWindow()
|
|
end
|
|
end)
|
|
|
|
f:SetScript ("OnMouseUp",
|
|
function (self)
|
|
if (self.isMoving) then
|
|
self:StopMovingOrSizing()
|
|
self.isMoving = false
|
|
end
|
|
end)
|
|
|
|
f:SetBackdrop (_detalhes.PluginDefaults and _detalhes.PluginDefaults.Backdrop or {bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16,
|
|
edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1,
|
|
insets = {left = 1, right = 1, top = 1, bottom = 1}})
|
|
|
|
f:SetBackdropColor (unpack (_detalhes.PluginDefaults and _detalhes.PluginDefaults.BackdropColor or {0, 0, 0, .6}))
|
|
f:SetBackdropBorderColor (unpack (_detalhes.PluginDefaults and _detalhes.PluginDefaults.BackdropBorderColor or {0, 0, 0, 1}))
|
|
|
|
f.bg1 = f:CreateTexture (nil, "background")
|
|
f.bg1:SetTexture ([[Interface\AddOns\Details\images\background]], true)
|
|
f.bg1:SetAlpha (0.7)
|
|
f.bg1:SetVertexColor (0.27, 0.27, 0.27)
|
|
f.bg1:SetVertTile (true)
|
|
f.bg1:SetHorizTile (true)
|
|
f.bg1:SetAllPoints()
|
|
|
|
local bottom_texture = framework:NewImage (f, nil, 922, 25, "background", nil, nil, "$parentBottomTexture")
|
|
bottom_texture:SetColorTexture (0, 0, 0, .6)
|
|
bottom_texture:SetPoint ("bottomleft", f, "bottomleft", 2, 7)
|
|
|
|
local c = CreateFrame ("Button", nil, f, "UIPanelCloseButton")
|
|
c:SetWidth (20)
|
|
c:SetHeight (20)
|
|
c:SetPoint ("TOPRIGHT", f, "TOPRIGHT", -2, -3)
|
|
c:SetFrameLevel (f:GetFrameLevel()+1)
|
|
c:GetNormalTexture():SetDesaturated (true)
|
|
c:SetAlpha (1)
|
|
|
|
C_Timer.After (0.05, function()
|
|
f:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true})
|
|
f:SetBackdropColor (0.2, 0.2, 0.2, .6)
|
|
f:SetBackdropBorderColor (0, 0, 0, 1)
|
|
|
|
--title bar
|
|
local titlebar = CreateFrame ("frame", nil, f, "BackdropTemplate")
|
|
titlebar:SetPoint ("topleft", f, "topleft", 2, -3)
|
|
titlebar:SetPoint ("topright", f, "topright", -2, -3)
|
|
titlebar:SetHeight (20)
|
|
titlebar:SetBackdrop ({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\AddOns\Details\images\background]], tileSize = 64, tile = true})
|
|
titlebar:SetBackdropColor (.5, .5, .5, 1)
|
|
titlebar:SetBackdropBorderColor (0, 0, 0, 1)
|
|
|
|
local name_bg_texture = f:CreateTexture (nil, "background")
|
|
name_bg_texture:SetTexture ([[Interface\PetBattles\_PetBattleHorizTile]], true)
|
|
name_bg_texture:SetHorizTile (true)
|
|
name_bg_texture:SetTexCoord (0, 1, 126/256, 19/256)
|
|
name_bg_texture:SetPoint ("topleft", f, "topleft", 2, -22)
|
|
name_bg_texture:SetPoint ("bottomright", f, "bottomright")
|
|
name_bg_texture:SetHeight (54)
|
|
name_bg_texture:SetVertexColor (0, 0, 0, 0.2)
|
|
|
|
--window title
|
|
local titleLabel = _detalhes.gump:NewLabel (titlebar, titlebar, nil, "titulo", "Advanced Death Logs", "GameFontHighlightLeft", 12, {227/255, 186/255, 4/255})
|
|
titleLabel:SetPoint ("center", f, "center")
|
|
titleLabel:SetPoint ("top", f, "top", 0, -7)
|
|
end)
|
|
|
|
DeathGraphs.selected_texture_boss = framework:NewImage (f, "Interface\\SPELLBOOK\\Spellbook-Parts", 190, 50, "border", {0.31250000, 0.96484375, 0.37109375, 0.52343750})
|
|
DeathGraphs.selected_texture_boss:SetBlendMode ("ADD")
|
|
DeathGraphs.selected_texture_boss2 = framework:NewImage (f, "Interface\\SPELLBOOK\\Spellbook-Parts", 190, 50, "border", {0.31250000, 0.96484375, 0.37109375, 0.52343750})
|
|
DeathGraphs.selected_texture_boss2:SetBlendMode ("ADD")
|
|
DeathGraphs.selected_texture_boss2:SetAllPoints (DeathGraphs.selected_texture_boss.widget)
|
|
|
|
|
|
|
|
--> boss scroll
|
|
|
|
--
|
|
local dicon, dL, dR, dT, dB = [[Interface\GossipFrame\IncompleteQuestIcon]], 0, 1, 0, 1
|
|
local get_texture = function (t)
|
|
if (t.boss_table) then
|
|
return DeathGraphs:GetBossIcon (t.boss_table.mapid, t.boss_table.index)
|
|
else
|
|
return dL, dR, dT, dB, dicon
|
|
end
|
|
end
|
|
local get_bd_table = function()
|
|
if (DeathGraphs.db.showing_type == 1) then
|
|
return DeathGraphs.deaths_database
|
|
elseif (DeathGraphs.db.showing_type == 2) then
|
|
return DeathGraphs.endurance_database
|
|
end
|
|
end
|
|
|
|
--boss dropdowns:
|
|
local dropdown_label_rf = framework:NewLabel (f, nil, "$parentRFLabel", nil, "Raid Finder:", "GameFontNormal")
|
|
local dropdown_label_normal = framework:NewLabel (f, nil, "$parentNormalLabel", nil, "Normal:", "GameFontNormal")
|
|
local dropdown_label_heroic = framework:NewLabel (f, nil, "$parentHeroicLabel", nil, "Heroic:", "GameFontNormal")
|
|
local dropdown_label_mythic = framework:NewLabel (f, nil, "$parentMythicLabel", nil, "Mythic:", "GameFontNormal")
|
|
|
|
local OnSelectBoss = function (_, _, boss)
|
|
DeathGraphs.db.last_boss = boss
|
|
if (DeathGraphs.db.showing_type == 1) then
|
|
DeathGraphs:RefreshPlayerScroll()
|
|
elseif (DeathGraphs.db.showing_type == 2) then
|
|
DeathGraphs:ShowEndurance (boss, true)
|
|
end
|
|
|
|
DeathGraphs:RefreshBossScroll()
|
|
end
|
|
|
|
local build_rf_bosses = function()
|
|
local db_table = get_bd_table() or {}
|
|
|
|
local output = {}
|
|
for hash, t in pairs (db_table) do
|
|
if (t.diff == 17) then
|
|
local l, r, tt, b, texture = get_texture (t)
|
|
tinsert (output, {value = t.hash, label = t.name, onclick = OnSelectBoss, icon = texture, texcoord = {l, r, tt, b}})
|
|
end
|
|
end
|
|
|
|
return output
|
|
end
|
|
|
|
local build_normal_bosses = function()
|
|
local db_table = get_bd_table() or {}
|
|
local output = {}
|
|
|
|
for hash, t in pairs (db_table) do
|
|
if (t.diff == 14) then
|
|
local l, r, tt, b, texture = get_texture (t)
|
|
tinsert (output, {value = t.hash, label = t.name, onclick = OnSelectBoss, icon = texture, texcoord = {l, r, tt, b}})
|
|
end
|
|
end
|
|
|
|
return output
|
|
end
|
|
local build_heroic_bosses = function()
|
|
local db_table = get_bd_table() or {}
|
|
local output = {}
|
|
|
|
for hash, t in pairs (db_table) do
|
|
if (t.diff == 15) then
|
|
local l, r, tt, b, texture = get_texture (t)
|
|
tinsert (output, {value = t.hash, label = t.name, onclick = OnSelectBoss, icon = texture, texcoord = {l, r, tt, b}})
|
|
end
|
|
end
|
|
|
|
return output
|
|
end
|
|
local build_mythic_bosses = function()
|
|
local db_table = get_bd_table() or {}
|
|
local output = {}
|
|
|
|
for hash, t in pairs (db_table) do
|
|
if (t.diff == 16) then
|
|
local l, r, tt, b, texture = get_texture (t)
|
|
tinsert (output, {value = t.hash, label = t.name, onclick = OnSelectBoss, icon = texture, texcoord = {l, r, tt, b}})
|
|
end
|
|
end
|
|
|
|
return output
|
|
end
|
|
|
|
--> align the menus at the same point as the current deaths dropdown and timeline dropdowns
|
|
local enduranceFrameMenuAnchor = CreateFrame ("frame", "DeathGraphsEnduranceFrameMenuAnchor", f, "BackdropTemplate")
|
|
enduranceFrameMenuAnchor:SetPoint ("topleft", 10, -50)
|
|
enduranceFrameMenuAnchor:SetSize (1, 1)
|
|
|
|
local select_dropdown_rf = framework:NewDropDown (f, nil, "$parentRFDropdown", "RFDropdown", 150, 20, build_rf_bosses) -- , nil, options_dropdown_template
|
|
local select_dropdown_normal = framework:NewDropDown (f, nil, "$parentNormalDropdown", "NormalDropdown", 150, 20, build_normal_bosses)
|
|
local select_dropdown_heroic = framework:NewDropDown (f, nil, "$parentHeroicDropdown", "HeroicDropdown", 150, 20, build_heroic_bosses)
|
|
local select_dropdown_mythic = framework:NewDropDown (f, nil, "$parentMythicDropdown", "MythicDropdown", 150, 20, build_mythic_bosses)
|
|
|
|
local y = -5
|
|
--dropdown_label_mythic:SetPoint ("topleft", f, "topleft", 10, -60)
|
|
dropdown_label_mythic:SetPoint ("topleft", enduranceFrameMenuAnchor, "topleft", 0, 1)
|
|
select_dropdown_mythic:SetPoint ("topleft", dropdown_label_mythic, "bottomleft", 0, y)
|
|
dropdown_label_heroic:SetPoint ("topleft", select_dropdown_mythic, "bottomleft", 0, y)
|
|
select_dropdown_heroic:SetPoint ("topleft", dropdown_label_heroic, "bottomleft", 0, y)
|
|
dropdown_label_normal:SetPoint ("topleft", select_dropdown_heroic, "bottomleft", 0, y)
|
|
select_dropdown_normal:SetPoint ("topleft", dropdown_label_normal, "bottomleft", 0, y)
|
|
dropdown_label_rf:SetPoint ("topleft", select_dropdown_normal, "bottomleft", 0, y)
|
|
select_dropdown_rf:SetPoint ("topleft", dropdown_label_rf, "bottomleft", 0, y)
|
|
|
|
local backdrop = {bgFile = "Interface\\AddOns\\Details\\images\\background", tile = true, tileSize = 16,
|
|
edgeFile=[[Interface\AddOns\Details\images\border_2]], edgeSize=16,
|
|
insets = {left = 0, right = 0, top = 0, bottom = 0}}
|
|
local backdrop_color = {0, 0, 0, 0.3}
|
|
|
|
select_dropdown_rf:SetBackdrop (backdrop)
|
|
select_dropdown_normal:SetBackdrop (backdrop)
|
|
select_dropdown_heroic:SetBackdrop (backdrop)
|
|
select_dropdown_mythic:SetBackdrop (backdrop)
|
|
|
|
select_dropdown_rf:SetBackdropColor (unpack (backdrop_color))
|
|
select_dropdown_normal:SetBackdropColor (unpack (backdrop_color))
|
|
select_dropdown_heroic:SetBackdropColor (unpack (backdrop_color))
|
|
select_dropdown_mythic:SetBackdropColor (unpack (backdrop_color))
|
|
|
|
select_dropdown_mythic.onleave_backdrop = backdrop_color
|
|
select_dropdown_heroic.onleave_backdrop = backdrop_color
|
|
select_dropdown_normal.onleave_backdrop = backdrop_color
|
|
select_dropdown_rf.onleave_backdrop = backdrop_color
|
|
|
|
function DeathGraphs:RefreshBossScroll()
|
|
select_dropdown_rf:Refresh()
|
|
select_dropdown_normal:Refresh()
|
|
select_dropdown_heroic:Refresh()
|
|
select_dropdown_mythic:Refresh()
|
|
|
|
select_dropdown_rf:SetBackdropBorderColor (1, 1, 1, 0.3)
|
|
select_dropdown_normal:SetBackdropBorderColor (1, 1, 1, 0.3)
|
|
select_dropdown_heroic:SetBackdropBorderColor (1, 1, 1, 0.3)
|
|
select_dropdown_mythic:SetBackdropBorderColor (1, 1, 1, 0.3)
|
|
|
|
dropdown_label_mythic:SetTextColor (1, 1 , 1, 0.5)
|
|
dropdown_label_heroic:SetTextColor (1, 1 , 1, 0.5)
|
|
dropdown_label_normal:SetTextColor (1, 1 , 1, 0.5)
|
|
dropdown_label_rf:SetTextColor (1, 1 , 1, 0.5)
|
|
|
|
local hash = DeathGraphs.db.last_boss
|
|
local diff
|
|
|
|
if (hash) then
|
|
diff = hash:gsub ("%d%d%d%d", "")
|
|
else
|
|
if (DeathGraphs.db.showing_type == 1) then
|
|
DeathGraphs:RefreshPlayerScroll()
|
|
elseif (DeathGraphs.db.showing_type == 2) then
|
|
|
|
end
|
|
end
|
|
|
|
local rf_value = select_dropdown_rf.value
|
|
local normal_value = select_dropdown_normal.value
|
|
local heroic_value = select_dropdown_heroic.value
|
|
local mythic_value = select_dropdown_mythic.value
|
|
|
|
if (DeathGraphs.db.showing_type == 1) then
|
|
|
|
elseif (DeathGraphs.db.showing_type == 2) then
|
|
if (not DeathGraphs.endurance_database [rf_value]) then
|
|
for _hash, t in pairs (DeathGraphs.endurance_database) do
|
|
if (t.diff == 17) then
|
|
select_dropdown_rf:Select (t.hash)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
if (not DeathGraphs.endurance_database [normal_value]) then
|
|
for _hash, t in pairs (DeathGraphs.endurance_database) do
|
|
if (t.diff == 14) then
|
|
select_dropdown_normal:Select (t.hash)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
if (not DeathGraphs.endurance_database [heroic_value]) then
|
|
for _hash, t in pairs (DeathGraphs.endurance_database) do
|
|
if (t.diff == 15) then
|
|
select_dropdown_heroic:Select (t.hash)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
if (not DeathGraphs.endurance_database [mythic_value]) then
|
|
for _hash, t in pairs (DeathGraphs.endurance_database) do
|
|
if (t.diff == 16) then
|
|
select_dropdown_mythic:Select (t.hash)
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
if (diff == "14") then --normal
|
|
select_dropdown_normal:SetBackdropBorderColor (1, 1, 0, 1)
|
|
select_dropdown_normal:Select (hash)
|
|
dropdown_label_normal:SetTextColor (1, 0.8 , 0, 1)
|
|
|
|
elseif (diff == "15") then --heroic
|
|
select_dropdown_heroic:SetBackdropBorderColor (1, 1, 0, 1)
|
|
select_dropdown_heroic:Select (hash)
|
|
dropdown_label_heroic:SetTextColor (1, 0.8 , 0, 1)
|
|
|
|
elseif (diff == "16") then --mythic
|
|
select_dropdown_mythic:SetBackdropBorderColor (1, 1, 0, 1)
|
|
select_dropdown_mythic:Select (hash)
|
|
dropdown_label_mythic:SetTextColor (1, 0.8 , 0, 1)
|
|
|
|
elseif (diff == "17") then --rf
|
|
select_dropdown_rf:SetBackdropBorderColor (1, 1, 0, 1)
|
|
select_dropdown_rf:Select (hash)
|
|
dropdown_label_rf:SetTextColor (1, 0.8 , 0, 1)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
local clear_func = function()
|
|
|
|
local hash = DeathGraphs.db.last_boss
|
|
|
|
if (DeathGraphs.db.showing_type == 1) then
|
|
local db_table = DeathGraphs.deaths_database
|
|
if (db_table and db_table [hash]) then
|
|
table.wipe (db_table [hash])
|
|
end
|
|
db_table [hash] = nil
|
|
|
|
if (DeathGraphs.db.last_boss == hash) then
|
|
DeathGraphs.db.last_player = false
|
|
DeathGraphs.db.last_segment = false
|
|
DeathGraphs.db.last_boss = false
|
|
|
|
for hash, _ in pairs (DeathGraphs.deaths_database) do
|
|
DeathGraphs.db.last_boss = hash
|
|
if (DeathGraphs.db.last_boss) then
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
DeathGraphs.graphic_frame:Reset()
|
|
DeathGraphs:ClearOverall()
|
|
DeathGraphs:Refresh()
|
|
|
|
elseif (DeathGraphs.db.showing_type == 2) then
|
|
local db_table = DeathGraphs.endurance_database
|
|
table.wipe (db_table [hash])
|
|
db_table [hash] = nil
|
|
DeathGraphs:ShowEndurance()
|
|
end
|
|
|
|
--> add
|
|
|
|
end
|
|
|
|
local AMOUNT_PLAYER_DEATH_LABELS = 17
|
|
|
|
--> player scroll
|
|
local player_refresh = function (self)
|
|
--> pega a lista de player
|
|
local boss_hash = DeathGraphs.db.last_boss
|
|
local players = DeathGraphs.deaths_database [boss_hash]
|
|
|
|
if (debugmode) then
|
|
print ("player refresh (boss_hash, players):", boss_hash, players)
|
|
end
|
|
|
|
DeathGraphs.selected_texture_player:Hide()
|
|
DeathGraphs.selected_texture_player2:Hide()
|
|
|
|
if (players) then
|
|
local players_list = players.player_db
|
|
|
|
local amount = 0
|
|
local numeric = {}
|
|
|
|
for playername, t in pairs (players_list) do
|
|
if (#t.deaths > 0) then
|
|
amount = amount+1
|
|
tinsert (numeric, t)
|
|
end
|
|
end
|
|
table.sort (numeric, function(t1, t2) return t1.name < t2.name end)
|
|
|
|
FauxScrollFrame_Update (self, amount, 16, 21)
|
|
|
|
local offset = FauxScrollFrame_GetOffset (self)
|
|
|
|
for bar_index = 1, AMOUNT_PLAYER_DEATH_LABELS do
|
|
local data = numeric [bar_index + offset]
|
|
local button = self.buttons [bar_index]
|
|
if (data) then
|
|
|
|
button:SetText (DeathGraphs:GetOnlyName (data.name))
|
|
|
|
if (data.class) then
|
|
local r, g, b = DeathGraphs:GetClassColor (data.class)
|
|
button.text_overlay:SetTextColor (.9, .9, .9)
|
|
local _, l, r, t, b = DeathGraphs:GetClassIcon (data.class)
|
|
button:SetIcon ([[Interface\AddOns\Details\images\classes_small_alpha]], 16, 16, "overlay", {l, r, t, b})
|
|
else
|
|
button.text_overlay:SetTextColor (1, 1, 1)
|
|
button:SetIcon ([[Interface\AddOns\Details\images\classes_small_alpha]], 16, 16, "overlay", {0.75, 1, 0.5, 0.75})
|
|
end
|
|
|
|
button.player_table = data
|
|
button.player_name = data.name
|
|
|
|
if (DeathGraphs.db.last_player == data.name) then
|
|
DeathGraphs.selected_texture_player:SetPoint ("topleft", button, "topleft", -2, 1)
|
|
DeathGraphs.selected_texture_player:SetPoint ("bottomleft", button, "bottomleft", -2, -3)
|
|
DeathGraphs.selected_texture_player:Show()
|
|
DeathGraphs.selected_texture_player2:Show()
|
|
end
|
|
|
|
button:Show()
|
|
else
|
|
button:Hide()
|
|
end
|
|
end
|
|
else
|
|
for bar_index = 1, AMOUNT_PLAYER_DEATH_LABELS do
|
|
local button = self.buttons [bar_index]
|
|
button:Hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
local player_overall_anchor = CreateFrame ("frame", "DeathGraphsPlayerOverallAnchor", f, "BackdropTemplate")
|
|
player_overall_anchor:SetPoint ("topleft", enduranceFrameMenuAnchor, "topleft", 170, -45)
|
|
player_overall_anchor:SetSize (1, 1)
|
|
|
|
DeathGraphs.selected_texture_player = framework:NewImage (player_overall_anchor, "Interface\\SPELLBOOK\\Spellbook-Parts", 100, 50, "border", {0.31250000, 0.96484375, 0.37109375, 0.52343750})
|
|
DeathGraphs.selected_texture_player:SetBlendMode ("ADD")
|
|
DeathGraphs.selected_texture_player2 = framework:NewImage (player_overall_anchor, "Interface\\SPELLBOOK\\Spellbook-Parts", 100, 50, "border", {0.31250000, 0.96484375, 0.37109375, 0.52343750})
|
|
DeathGraphs.selected_texture_player2:SetBlendMode ("ADD")
|
|
DeathGraphs.selected_texture_player2:SetAllPoints (DeathGraphs.selected_texture_player.widget)
|
|
|
|
DeathGraphs.selected_texture_segment = framework:NewImage (player_overall_anchor, "Interface\\SPELLBOOK\\Spellbook-Parts", 90, 50, "border", {0.31250000, 0.96484375, 0.37109375, 0.52343750})
|
|
DeathGraphs.selected_texture_segment:SetBlendMode ("ADD")
|
|
DeathGraphs.selected_texture_segment2 = framework:NewImage (player_overall_anchor, "Interface\\SPELLBOOK\\Spellbook-Parts", 90, 50, "border", {0.31250000, 0.96484375, 0.37109375, 0.52343750})
|
|
DeathGraphs.selected_texture_segment2:SetBlendMode ("ADD")
|
|
DeathGraphs.selected_texture_segment2:SetAllPoints (DeathGraphs.selected_texture_segment.widget)
|
|
|
|
local player_scroll = CreateFrame ("scrollframe", "DeathGraphsPlayerScroll", f, "FauxScrollFrameTemplate, BackdropTemplate")
|
|
player_scroll:SetScript ("OnVerticalScroll", function (self, offset) FauxScrollFrame_OnVerticalScroll (self, offset, 20, player_refresh) end)
|
|
player_scroll:SetPoint ("topleft", player_overall_anchor, "topleft", 0, 0)
|
|
player_scroll:SetSize (100, 360)
|
|
player_scroll:SetFrameLevel (f:GetFrameLevel()+2)
|
|
|
|
local player_bg_frame = CreateFrame ("frame", "DeathGraphsPlayerScrollBgFrame", f, "BackdropTemplate")
|
|
player_bg_frame:SetPoint ("topleft", player_scroll, "topleft")
|
|
player_bg_frame:SetPoint ("bottomright", player_scroll, "bottomright", -2, 0)
|
|
player_bg_frame:SetFrameLevel (f:GetFrameLevel()+1)
|
|
|
|
local clear_players_deaths = framework:NewButton (player_bg_frame, _, "$parentCleaPlayersDeathsButton", "CleaPlayersDeathsButton", 70, mode_buttons_height, clear_func, nil, nil, nil, "Clear", 1, options_dropdown_template)
|
|
clear_players_deaths:SetPoint ("bottomleft", endurance_frame, "topleft", 0, 9)
|
|
|
|
player_scroll:SetScript ("OnHide", function()
|
|
for i = 1, AMOUNT_PLAYER_DEATH_LABELS do
|
|
player_scroll.buttons[i]:Hide()
|
|
end
|
|
end)
|
|
|
|
player_scroll.buttons = {}
|
|
|
|
local player_button_on_click = function (self, button, param1, param2)
|
|
--> carrega lista de segmentos para este jogador
|
|
DeathGraphs.db.last_player = self.MyObject.player_name
|
|
DeathGraphs:RefreshSegmentScroll()
|
|
|
|
DeathGraphs:Select (nil, nil, 1)
|
|
|
|
DeathGraphs.selected_texture_player:SetPoint ("topleft", self, "topleft", -2, 1)
|
|
DeathGraphs.selected_texture_player:SetPoint ("bottomleft", self, "bottomleft", -2, -3)
|
|
DeathGraphs.selected_texture_player:Show()
|
|
DeathGraphs.selected_texture_player2:Show()
|
|
end
|
|
|
|
local player_on_enter = function (self, capsule)
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLORHIGHLIGHT))
|
|
capsule.textcolor = {1, 1, 1}
|
|
end
|
|
local player_on_leave = function (self, capsule)
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
capsule.textcolor = {.9, .9, .9}
|
|
end
|
|
|
|
for i = 1, AMOUNT_PLAYER_DEATH_LABELS do
|
|
local button = framework:NewButton (f, nil, "$parentPlayerButton" .. i, "PlayerButton" .. i, 94, 20, player_button_on_click, 1, nil, nil, "Player " .. i)
|
|
button:SetPoint ("topleft", player_scroll, "topleft", 0, -(i-1) * 21)
|
|
button.textalign = "left"
|
|
button.textsize = 10
|
|
tinsert (player_scroll.buttons, button)
|
|
button:Hide()
|
|
button:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
|
|
button:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
button:SetHook ("OnEnter", player_on_enter)
|
|
button:SetHook ("OnLeave", player_on_leave)
|
|
end
|
|
|
|
function DeathGraphs:RefreshPlayerScroll()
|
|
player_refresh (player_scroll)
|
|
end
|
|
|
|
--> segment scroll
|
|
local segment_refresh = function (self)
|
|
--> pega a lista de segmentos
|
|
|
|
local boss_hash = DeathGraphs.db.last_boss
|
|
local player_name = DeathGraphs.db.last_player
|
|
|
|
if (debugmode) then
|
|
print ("refresh segments:", boss_hash, player_name)
|
|
end
|
|
|
|
DeathGraphs.selected_texture_segment:Hide()
|
|
DeathGraphs.selected_texture_segment2:Hide()
|
|
|
|
if (player_name) then
|
|
|
|
local player_container = DeathGraphs.deaths_database [boss_hash] and DeathGraphs.deaths_database [boss_hash].player_db [player_name]
|
|
|
|
if (debugmode) then
|
|
print ("refresh segments:", player_container)
|
|
end
|
|
|
|
if (player_container) then
|
|
local amount = #player_container.deaths
|
|
|
|
FauxScrollFrame_Update (self, amount, 8, 41)
|
|
|
|
local offset = FauxScrollFrame_GetOffset (self)
|
|
|
|
for bar_index = 1, 8 do
|
|
local data = player_container.deaths [bar_index + offset]
|
|
local button = self.buttons [bar_index]
|
|
if (data) then
|
|
-- data [8] --combat_id
|
|
|
|
local minutos, segundos = math.floor (data[3]/60), math.floor (data[3]%60)
|
|
button.text1:SetText ("#" .. bar_index + offset .. " (" .. minutos .. "m " .. segundos .. "s)")
|
|
button.text2:SetText ("Try #" .. (data [8] or "0"))
|
|
|
|
button.death_table = data
|
|
button.index = bar_index + offset
|
|
button:Show()
|
|
|
|
if (DeathGraphs.db.last_segment == bar_index + offset) then
|
|
DeathGraphs.selected_texture_segment:SetPoint ("topleft", button, "topleft", -1, 1)
|
|
DeathGraphs.selected_texture_segment:SetPoint ("bottomleft", button, "bottomleft", -1, -3)
|
|
DeathGraphs.selected_texture_segment:Show()
|
|
DeathGraphs.selected_texture_segment2:Show()
|
|
end
|
|
else
|
|
button:Hide()
|
|
end
|
|
end
|
|
else
|
|
for bar_index = 1, 8 do
|
|
local button = self.buttons [bar_index]
|
|
button:Hide()
|
|
end
|
|
end
|
|
else
|
|
for bar_index = 1, 8 do
|
|
local button = self.buttons [bar_index]
|
|
button:Hide()
|
|
end
|
|
end
|
|
end
|
|
|
|
local segments_scroll = CreateFrame ("scrollframe", "DeathGraphsSegmentScroll", f, "FauxScrollFrameTemplate, BackdropTemplate")
|
|
segments_scroll:SetScript ("OnVerticalScroll", function (self, offset) FauxScrollFrame_OnVerticalScroll (self, offset, 20, segment_refresh) end)
|
|
segments_scroll:SetPoint ("topleft", enduranceFrameMenuAnchor, "topleft", 320, -45)
|
|
segments_scroll:SetSize (100, 360)
|
|
segments_scroll:SetFrameLevel (f:GetFrameLevel()+2)
|
|
|
|
local segments_bg_frame = CreateFrame ("frame", nil, f, "BackdropTemplate")
|
|
segments_bg_frame:SetPoint ("topleft", segments_scroll, "topleft")
|
|
segments_bg_frame:SetPoint ("bottomright", segments_scroll, "bottomright", -5, 0)
|
|
segments_bg_frame:SetFrameLevel (f:GetFrameLevel()+1)
|
|
|
|
segments_scroll:SetScript ("OnHide", function()
|
|
for i = 1, 8 do
|
|
segments_scroll.buttons[i]:Hide()
|
|
end
|
|
end)
|
|
|
|
segments_scroll.buttons = {}
|
|
|
|
local segment_button_on_click = function (self, button, param1, param2)
|
|
--> mostra o gr�fico para este segmento
|
|
if (debugmode) then
|
|
print ("on click segment:", self.MyObject.death_table, self.MyObject.index, DeathGraphs.db.last_boss)
|
|
end
|
|
DeathGraphs.db.last_segment = self.MyObject.index
|
|
|
|
local death_table = DeathGraphs:GetBossTable (DeathGraphs.db.last_boss , nil, CONST_DBTYPE_DEATH)
|
|
local player_table = DeathGraphs:GetPlayerTable (death_table, DeathGraphs.db.last_player)
|
|
|
|
DeathGraphs:ShowGraphicForDeath (player_table.deaths [DeathGraphs.db.last_segment])
|
|
|
|
DeathGraphs.selected_texture_segment:SetPoint ("topleft", self, "topleft", -1, 1)
|
|
DeathGraphs.selected_texture_segment:SetPoint ("bottomleft", self, "bottomleft", -1, -3)
|
|
DeathGraphs.selected_texture_segment:Show()
|
|
DeathGraphs.selected_texture_segment2:Show()
|
|
end
|
|
|
|
local segments_on_enter = function (self)
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLORHIGHLIGHT))
|
|
end
|
|
local segments_on_leave = function (self)
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
end
|
|
|
|
for i = 1, 8 do
|
|
local button = framework:NewButton (f, nil, "$parentSegmentButton" .. i, "SegmentButton" .. i, 95, 40, segment_button_on_click, i)
|
|
|
|
button:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
|
|
button:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
|
|
button:SetHook ("OnEnter", segments_on_enter)
|
|
button:SetHook ("OnLeave", segments_on_leave)
|
|
|
|
button:SetPoint ("topleft", segments_scroll, "topleft", 0, -(i-1) * 41)
|
|
button.textalign = "left"
|
|
|
|
framework:CreateLabel (button, "label 1", nil, "white", "GameFontHighlightSmall", "text1")
|
|
framework:CreateLabel (button, "label 2", nil, "white", "GameFontHighlightSmall", "text2")
|
|
|
|
button.text1:SetPoint ("topleft", button, "topleft", 5, -10)
|
|
button.text2:SetPoint ("topleft", button, "topleft", 5, -20)
|
|
|
|
--button:InstallCustomTexture()
|
|
tinsert (segments_scroll.buttons, button)
|
|
button:Hide()
|
|
end
|
|
|
|
function DeathGraphs:RefreshSegmentScroll()
|
|
segment_refresh (segments_scroll)
|
|
end
|
|
|
|
--> ~endurance box
|
|
local endurance_frame = CreateFrame ("frame", "DeathGraphsEnduranceFrame", f, "BackdropTemplate")
|
|
endurance_frame:SetFrameLevel (f:GetFrameLevel()+5)
|
|
endurance_frame:SetPoint ("topleft", enduranceFrameMenuAnchor, "topleft", 170, -45)
|
|
|
|
endurance_frame:SetSize (718, 470)
|
|
endurance_frame:SetResizable (false)
|
|
endurance_frame:SetMovable (true)
|
|
|
|
local CONST_ENDURANCE_BREAKLINE = 450
|
|
|
|
--
|
|
local greenPercent = endurance_frame:CreateTexture (nil, "overlay")
|
|
greenPercent:SetColorTexture (.2, 1, .2, .7)
|
|
greenPercent:SetSize (6, 20)
|
|
greenPercent:SetPoint ("topleft", dropdown_label_rf.widget, "bottomleft", 0, -40)
|
|
|
|
local tutorialLabel3 = framework:CreateLabel (endurance_frame)
|
|
tutorialLabel3:SetPoint ("topleft", greenPercent, "topright", 4, 1)
|
|
tutorialLabel3.text = "Good, player never was one of the first three players dead"
|
|
tutorialLabel3.width = 140
|
|
tutorialLabel3:SetJustifyV ("top")
|
|
|
|
local redPercent = endurance_frame:CreateTexture (nil, "overlay")
|
|
redPercent:SetColorTexture (1, .2, .2, .7)
|
|
redPercent:SetSize (6, 20)
|
|
redPercent:SetPoint ("topleft", greenPercent, "bottomleft", 0, -20)
|
|
|
|
local tutorialLabel4 = framework:CreateLabel (endurance_frame)
|
|
tutorialLabel4:SetPoint ("topleft", redPercent, "topright", 4, 1)
|
|
tutorialLabel4.text = "Bad, player often was one of the first three players dead"
|
|
tutorialLabel4.width = 140
|
|
tutorialLabel4:SetJustifyV ("top")
|
|
--
|
|
|
|
if (not DetailsPluginContainerWindow) then
|
|
endurance_frame:EnableMouse (true)
|
|
endurance_frame:SetScript ("OnMouseDown",
|
|
function (self, botao)
|
|
if (botao == "LeftButton") then
|
|
if (f.isMoving) then
|
|
return
|
|
end
|
|
f:StartMoving()
|
|
f.isMoving = true
|
|
elseif (botao == "RightButton") then
|
|
if (f.isMoving) then
|
|
return
|
|
end
|
|
DeathGraphs:CloseWindow()
|
|
end
|
|
end)
|
|
|
|
endurance_frame:SetScript ("OnMouseUp",
|
|
function (self)
|
|
if (f.isMoving) then
|
|
f:StopMovingOrSizing()
|
|
f.isMoving = false
|
|
end
|
|
end)
|
|
else
|
|
endurance_frame:EnableMouse (false)
|
|
end
|
|
|
|
endurance_frame.labels = {}
|
|
endurance_frame:Hide()
|
|
|
|
endurance_frame.x = 0
|
|
endurance_frame.y = 0
|
|
endurance_frame.y_original = 0
|
|
|
|
--> erase current endurance shown
|
|
|
|
local clear_endurance_func = function()
|
|
local boss = DeathGraphs.db.last_boss
|
|
if (not boss) then
|
|
return
|
|
end
|
|
local boss_table = DeathGraphs.endurance_database [boss]
|
|
if (not boss_table) then
|
|
return
|
|
end
|
|
|
|
table.wipe (boss_table.player_db)
|
|
DeathGraphs.endurance_database [boss] = nil
|
|
endurance_frame:Clear()
|
|
|
|
for hash, _ in pairs (DeathGraphs.endurance_database) do
|
|
DeathGraphs.db.last_boss = hash
|
|
DeathGraphs:Refresh()
|
|
break
|
|
end
|
|
end
|
|
local clear_endurance = framework:NewButton (endurance_frame, _, "$parentClearEnduranceButton", "ClearEnduranceButton", 120, mode_buttons_height, clear_endurance_func, nil, nil, nil, "Clear", 1, options_dropdown_template)
|
|
clear_endurance:SetPoint ("bottomleft", endurance_frame, "topleft", 0, 9)
|
|
|
|
--> report
|
|
local report_endurance_func = function()
|
|
local boss = DeathGraphs.db.last_boss
|
|
if (not boss) then
|
|
return
|
|
end
|
|
local boss_table = DeathGraphs.endurance_database [boss]
|
|
if (not boss_table) then
|
|
return
|
|
end
|
|
|
|
local reportFunc = function (IsCurrent, IsReverse, AmtLines)
|
|
DeathGraphs.report_lines = {"Details!: Endurance for " .. (boss_table.name or "Unknown") .. " (A.D.L (plugin)):"}
|
|
for i = 1, math.min (#endurance_frame.labels, AmtLines) do
|
|
local label = endurance_frame.labels [i]
|
|
if (label.panel:IsShown() and not label.gray_player) then
|
|
tinsert (DeathGraphs.report_lines, label.name.text .. ": " .. label.points.text)
|
|
end
|
|
end
|
|
DeathGraphs:SendReportLines (DeathGraphs.report_lines)
|
|
end
|
|
|
|
local use_slider = true
|
|
DeathGraphs:SendReportWindow (reportFunc, nil, nil, use_slider)
|
|
end
|
|
local report_endurance = framework:NewButton (endurance_frame, _, "$parentReportEnduranceButton", "ReportEnduranceButton", 120, mode_buttons_height, report_endurance_func, nil, nil, nil, "Report", 1, options_dropdown_template)
|
|
report_endurance:SetPoint ("left", clear_endurance, "right", 2, 0)
|
|
|
|
function endurance_frame:Clear()
|
|
for _, label in ipairs (self.labels) do
|
|
label.points:Hide()
|
|
label.name:Hide()
|
|
label.panel:Hide()
|
|
end
|
|
end
|
|
|
|
local label_on_mouseup = function (self, button, capsule)
|
|
|
|
if (button == "RightButton") then
|
|
if (DeathGraphs.Frame.isMoving) then
|
|
return
|
|
end
|
|
DeathGraphs:CloseWindow()
|
|
end
|
|
|
|
local reportFunc = function (IsCurrent, IsReverse, AmtLines)
|
|
DeathGraphs.report_lines = {"Details!: Endurance Deaths for " .. capsule.label2.text .. " (A.D.L (plugin)):"}
|
|
local deaths = capsule.deaths
|
|
if (deaths) then
|
|
if (#deaths > 0) then
|
|
for i, death in ipairs (deaths) do
|
|
local minutos, segundos = math.floor (death[2]/60), math.floor (death[2]%60)
|
|
local damage = death[3]:gsub ("|c%x?%x?%x?%x?%x?%x?%x?%x?", ""):gsub ("|r", "")
|
|
DeathGraphs.report_lines [#DeathGraphs.report_lines+1] = "#" .. death[1] .. ": " .. damage .. " (" .. minutos .. "m " .. segundos .. "s)"
|
|
end
|
|
end
|
|
end
|
|
DeathGraphs:SendReportLines (DeathGraphs.report_lines)
|
|
end
|
|
|
|
local use_slider = true
|
|
DeathGraphs:SendReportWindow (reportFunc, nil, nil, use_slider)
|
|
|
|
end
|
|
|
|
local label_on_enter = function (self, capsule)
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLORHIGHLIGHT))
|
|
capsule.label2:SetTextColor (1, 1, 1)
|
|
|
|
GameCooltip:Preset (2)
|
|
GameCooltip:SetOwner (self, "topleft", "topright")
|
|
|
|
GameCooltip:SetOption ("FixedWidth", 300)
|
|
|
|
local total_encounters = capsule.encounters
|
|
local points_earned = capsule.points
|
|
|
|
GameCooltip:AddLine ("|cFFFFFF00Records: |r" .. total_encounters, "|cFFFFFF00Deaths: |r" .. #capsule.deaths .. (#capsule.deaths > 0 and " |cFFFFFF00(|r|cFFA0A0A01 each " .. format ("%.1f", total_encounters / #capsule.deaths) .. " tries|r|cFFFFFF00)|r" or ""), 1, "orange", "orange", 12, SharedMedia:Fetch ("font", "Friz Quadrata TT"))
|
|
GameCooltip:AddLine (" ")
|
|
|
|
local deaths = capsule.deaths
|
|
if (deaths) then
|
|
if (#deaths > 0) then
|
|
for i, death in ipairs (deaths) do
|
|
--[1] = combat_id [2] = dead_at [3] = last_hit
|
|
local minutos, segundos = math.floor (death[2]/60), math.floor (death[2]%60)
|
|
GameCooltip:AddLine ("|cFFFFFF00#" .. death[1] .. "|r " .. minutos .. "m " .. segundos .. "s", death [3], 1, "orange", nil, 12, SharedMedia:Fetch ("font", "Friz Quadrata TT"))
|
|
--GameCooltip:AddIcon (spellicon, 1, 1, 16, 16)
|
|
end
|
|
else
|
|
GameCooltip:AddLine (Loc ["STRING_FLAWLESS"])
|
|
GameCooltip:AddIcon ([[Interface\COMMON\ReputationStar]], 1, 1, nil, nil, 0, 0.5, 0.03125, 0.5)
|
|
end
|
|
end
|
|
|
|
GameCooltip:Show()
|
|
end
|
|
|
|
local label_on_leave = function (self, capsule)
|
|
if (capsule.ignored) then
|
|
capsule.label2:SetTextColor (.5, .5, .5)
|
|
else
|
|
capsule.label2:SetTextColor (.9, .9, .9)
|
|
end
|
|
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
GameCooltip:Hide()
|
|
end
|
|
|
|
local backdrop = {bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16}
|
|
|
|
function endurance_frame:SetPlayer (index, player_name, player_class, points, percent, encounters, deaths, min, max)
|
|
local label = self.labels [index]
|
|
|
|
if (not label) then
|
|
|
|
local panel = framework:CreatePanel (endurance_frame, 200, 16)
|
|
panel:SetBackdrop (backdrop)
|
|
panel:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
panel:SetPoint (self.x, self.y)
|
|
panel:SetHook ("OnEnter", label_on_enter)
|
|
panel:SetHook ("OnLeave", label_on_leave)
|
|
panel:SetHook ("OnMouseUp", label_on_mouseup)
|
|
|
|
local str1 = framework:NewLabel (panel, nil, "$parentLabel1" .. index, "label1", "", "GameFontHighlightSmall", 11)
|
|
local str2 = framework:NewLabel (panel, nil, "$parentLabel2" .. index, "label2", "", "GameFontHighlightSmall", 11)
|
|
local str3 = framework:NewLabel (panel, nil, "$parentLabel3" .. index, "label3", "", "GameFontHighlightSmall", 11)
|
|
str2:SetWidth (120)
|
|
str2:SetHeight (16)
|
|
str3:SetHeight (16)
|
|
str3:SetWidth (40)
|
|
|
|
local icon1 = framework:NewImage (panel, nil, 14, 14, nil, nil, "icon")
|
|
|
|
str1:SetPoint ("left", panel, "left")
|
|
str3:SetPoint ("left", str1, "right", 6, 0)
|
|
icon1:SetPoint ("left", str3, "right", 4, 0)
|
|
str2:SetPoint ("left", icon1, "right", 4, 0)
|
|
|
|
endurance_frame.y = endurance_frame.y - 17
|
|
if (endurance_frame.y < -CONST_ENDURANCE_BREAKLINE) then
|
|
endurance_frame.y = endurance_frame.y_original
|
|
endurance_frame.x = endurance_frame.x + 220
|
|
end
|
|
self.labels [index] = {points = str1, name = str2, panel = panel, icon = icon1, recordsXdeaths = str3}
|
|
label = self.labels [index]
|
|
end
|
|
|
|
label.gray_player = nil
|
|
|
|
if (percent == 101) then
|
|
|
|
label.points:SetTextColor (.5, .5, .5)
|
|
label.points.text = string.format ("%.1f", math.abs ((#deaths / encounters * 100) - 100)) .. "%"
|
|
|
|
label.name.text = DeathGraphs:GetOnlyName (player_name)
|
|
local r, g, b = DeathGraphs:GetClassColor (player_class)
|
|
label.name:SetTextColor (.5, .5, .5)
|
|
|
|
label.gray_player = true
|
|
|
|
local file, l, r, t, b = DeathGraphs:GetClassIcon (player_class)
|
|
label.icon.texture = [[Interface\AddOns\Details\images\classes_small_alpha]]
|
|
label.icon:SetTexCoord (l, r, t, b)
|
|
label.icon:SetDesaturated (true)
|
|
|
|
label.points:Show()
|
|
label.name:Show()
|
|
label.panel:Show()
|
|
label.panel.deaths = deaths
|
|
label.panel.encounters = encounters
|
|
label.panel.points = points
|
|
label.panel.ignored = true
|
|
else
|
|
local percent_scaled = DeathGraphs:Scale (min, max, 0, 100, percent)
|
|
|
|
local r, g
|
|
if (percent_scaled < 50) then
|
|
r = 255
|
|
else
|
|
r = math.floor ( 255 - (percent_scaled * 2 - 100) * 255 / 100)
|
|
end
|
|
|
|
if (percent_scaled > 50) then
|
|
g = 255
|
|
else
|
|
g = math.floor ( (percent_scaled * 2) * 255 / 100)
|
|
end
|
|
|
|
label.points:SetTextColor (r/255, g/255, 0)
|
|
--label.recordsXdeaths:SetTextColor (r/255, g/255, 0)
|
|
|
|
label.points.text = string.format ("%.1f", percent) .. "%"
|
|
|
|
label.name.text = DeathGraphs:GetOnlyName (player_name)
|
|
local r, g, b = DeathGraphs:GetClassColor (player_class)
|
|
label.name:SetTextColor (.9, .9, .9)
|
|
|
|
local file, l, r, t, b = DeathGraphs:GetClassIcon (player_class)
|
|
label.icon.texture = [[Interface\AddOns\Details\images\classes_small_alpha]]
|
|
label.icon:SetTexCoord (l, r, t, b)
|
|
label.icon:SetDesaturated (false)
|
|
|
|
label.points:Show()
|
|
label.name:Show()
|
|
label.panel:Show()
|
|
|
|
label.panel.deaths = deaths
|
|
label.panel.encounters = encounters
|
|
label.panel.points = points
|
|
label.panel.recordsXdeaths = #deaths .. " / " .. encounters
|
|
|
|
label.recordsXdeaths.text = label.panel.recordsXdeaths
|
|
label.recordsXdeaths:SetTextColor (.7, .7, .7)
|
|
|
|
label.panel.ignored = nil
|
|
end
|
|
end
|
|
|
|
function endurance_frame:Cancel()
|
|
endurance_frame:Hide()
|
|
DeathGraphs.db.showing_type = 1
|
|
|
|
return
|
|
end
|
|
|
|
local reverse_sort = function (t1, t2)
|
|
return t1[4] < t2[4]
|
|
end
|
|
|
|
--> if from dropdown, ignore all auto boss selection
|
|
function DeathGraphs:ShowEndurance (boss, fromDropdown)
|
|
|
|
player_scroll:Show()
|
|
player_scroll:Hide()
|
|
segments_scroll:Show()
|
|
segments_scroll:Hide()
|
|
segments_bg_frame:Hide()
|
|
player_bg_frame:Hide()
|
|
DeathGraphs.overall_bg:Hide()
|
|
|
|
select_dropdown_rf:Show()
|
|
select_dropdown_normal:Show()
|
|
select_dropdown_heroic:Show()
|
|
select_dropdown_mythic:Show()
|
|
dropdown_label_rf:Show()
|
|
dropdown_label_normal:Show()
|
|
dropdown_label_heroic:Show()
|
|
dropdown_label_mythic:Show()
|
|
|
|
DeathGraphs.graphic_frame:Hide()
|
|
|
|
--> refresh
|
|
DeathGraphs.db.showing_type = 2
|
|
DeathGraphs:RefreshBossScroll()
|
|
endurance_frame:Clear()
|
|
|
|
--> get boss table
|
|
boss = boss or DeathGraphs.showing_endurance or DeathGraphs.db.last_boss
|
|
if (debugmode) then
|
|
print (":ShowEndurance", boss)
|
|
end
|
|
|
|
if (not boss) then
|
|
for hash, _ in pairs (DeathGraphs.endurance_database) do
|
|
boss = hash
|
|
if (boss) then
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
--> get the boss from the latest segment
|
|
if (not fromDropdown) then
|
|
local currentCombat = Details:GetCurrentCombat()
|
|
if (currentCombat) then
|
|
if (currentCombat.is_boss) then
|
|
--> get the map index
|
|
local mapID = currentCombat.is_boss.mapid
|
|
--> get the boss index within the raid
|
|
local bossIndex = Details:GetBossIndex (mapID, currentCombat.is_boss.id, nil, currentCombat.is_boss.name)
|
|
if (bossIndex) then
|
|
--> get the EJID
|
|
local EJID = Details.EncounterInformation [mapID] and _detalhes.EncounterInformation [mapID].encounter_ids [bossIndex]
|
|
if (EJID) then
|
|
--> if the EJID exists build the hash
|
|
local bossDificulty = currentCombat.is_boss.diff
|
|
local hash = tostring (EJID) .. tostring (bossDificulty)
|
|
if (hash) then
|
|
boss = hash
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
--
|
|
|
|
if (not boss) then
|
|
return
|
|
end
|
|
|
|
local boss_table = DeathGraphs.endurance_database [boss]
|
|
if (debugmode) then
|
|
print (":ShowEndurance", boss_table)
|
|
end
|
|
|
|
if (not boss_table) then
|
|
for hash, _ in pairs (DeathGraphs.endurance_database) do
|
|
boss = hash
|
|
boss_table = DeathGraphs.endurance_database [hash]
|
|
if (boss_table) then
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
if (not boss_table) then
|
|
return
|
|
end
|
|
|
|
DeathGraphs.db.last_boss = boss
|
|
DeathGraphs:RefreshBossScroll()
|
|
|
|
local sorted = {}
|
|
local min_encounters = 9999
|
|
local max_encounters = 0
|
|
local min_points = 999999
|
|
local max_points = 0
|
|
local min_deaths, max_deaths = 999, 0
|
|
|
|
for player_name, t in pairs (boss_table.player_db) do
|
|
tinsert (sorted, {player_name, t.class, t.points, 0, t.encounters, t.deaths})
|
|
|
|
if (min_encounters > t.encounters) then
|
|
min_encounters = t.encounters
|
|
end
|
|
if (max_encounters < t.encounters) then
|
|
max_encounters = t.encounters
|
|
end
|
|
if (min_points > t.points) then
|
|
min_points = t.points
|
|
end
|
|
if (max_points < t.points) then
|
|
max_points = t.points
|
|
end
|
|
if (min_deaths > #t.deaths) then
|
|
min_deaths = #t.deaths
|
|
end
|
|
if (max_deaths < #t.deaths) then
|
|
max_deaths = #t.deaths
|
|
end
|
|
end
|
|
|
|
for i, t in ipairs (sorted) do
|
|
if (t[5] / max_encounters * 100 < 35) then
|
|
t[4] = 101
|
|
else
|
|
d_percent = math.abs ((#t[6] / t[5] * 100) - 100)
|
|
t[4] = d_percent
|
|
end
|
|
end
|
|
|
|
table.sort (sorted, reverse_sort)
|
|
|
|
local min = sorted [1] and sorted [1] [4]
|
|
local max = sorted [#sorted] and sorted [#sorted] [4]
|
|
|
|
for index, t in ipairs (sorted) do
|
|
endurance_frame:SetPlayer (index, t[1], t[2], t[3], t[4], t[5], t[6], min, max)
|
|
end
|
|
|
|
--> show
|
|
endurance_frame:Show()
|
|
end
|
|
|
|
|
|
function DeathGraphs:HideAll()
|
|
|
|
--boss selectors
|
|
select_dropdown_rf:Hide()
|
|
select_dropdown_normal:Hide()
|
|
select_dropdown_heroic:Hide()
|
|
select_dropdown_mythic:Hide()
|
|
dropdown_label_rf:Hide()
|
|
dropdown_label_normal:Hide()
|
|
dropdown_label_heroic:Hide()
|
|
dropdown_label_mythic:Hide()
|
|
|
|
player_scroll:Show()
|
|
player_scroll:Hide()
|
|
segments_scroll:Show()
|
|
segments_scroll:Hide()
|
|
|
|
--endurance
|
|
endurance_frame:Hide()
|
|
|
|
--overall
|
|
player_scroll:Hide()
|
|
segments_scroll:Hide()
|
|
segments_bg_frame:Hide()
|
|
player_bg_frame:Hide()
|
|
DeathGraphs.graphic_frame:Hide()
|
|
DeathGraphs.overall_bg:Hide()
|
|
player_overall_anchor:Hide()
|
|
|
|
--current
|
|
DeathGraphsCurrentFrameDeaths:Hide()
|
|
|
|
--timeline
|
|
DeathGraphsPlayerGraphicDeaths:Hide()
|
|
end
|
|
|
|
function DeathGraphs:ShowCurrent()
|
|
DeathGraphs.db.showing_type = 3
|
|
DeathGraphsCurrentFrameDeaths:Show()
|
|
DeathGraphsCurrentFrameDeaths.Refresh()
|
|
end
|
|
|
|
function DeathGraphs:ShowTimeline()
|
|
DeathGraphs.db.showing_type = 4
|
|
DeathGraphsPlayerGraphicDeaths:Show()
|
|
DeathGraphsPlayerGraphicDeaths.Refresh()
|
|
end
|
|
|
|
function DeathGraphs:ShowOverall()
|
|
player_scroll:Show()
|
|
segments_scroll:Show()
|
|
segments_bg_frame:Show()
|
|
player_bg_frame:Show()
|
|
|
|
select_dropdown_rf:Show()
|
|
select_dropdown_normal:Show()
|
|
select_dropdown_heroic:Show()
|
|
select_dropdown_mythic:Show()
|
|
dropdown_label_rf:Show()
|
|
dropdown_label_normal:Show()
|
|
dropdown_label_heroic:Show()
|
|
dropdown_label_mythic:Show()
|
|
|
|
player_overall_anchor:Show()
|
|
|
|
DeathGraphs.db.showing_type = 1
|
|
|
|
local boss = DeathGraphs.db.last_boss
|
|
if (not DeathGraphs.deaths_database [boss]) then
|
|
for hash, _ in pairs (DeathGraphs.deaths_database) do
|
|
DeathGraphs.db.last_boss = hash
|
|
if (DeathGraphs.db.last_boss) then
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
DeathGraphs:RefreshBossScroll()
|
|
DeathGraphs:RefreshPlayerScroll()
|
|
DeathGraphs:RefreshSegmentScroll()
|
|
|
|
if (DeathGraphs.db.last_segment) then
|
|
DeathGraphs.graphic_frame:Show()
|
|
DeathGraphs.overall_bg:Show()
|
|
end
|
|
end
|
|
|
|
function DeathGraphs:HideEndurance()
|
|
DeathGraphs.db.showing_type = 1
|
|
endurance_frame:Hide()
|
|
|
|
player_scroll:Show()
|
|
segments_scroll:Show()
|
|
segments_bg_frame:Show()
|
|
player_bg_frame:Show()
|
|
|
|
local boss = DeathGraphs.db.last_boss
|
|
if (not DeathGraphs.deaths_database [boss]) then
|
|
for hash, _ in pairs (DeathGraphs.deaths_database) do
|
|
DeathGraphs.db.last_boss = hash
|
|
if (DeathGraphs.db.last_boss) then
|
|
break
|
|
end
|
|
end
|
|
end
|
|
|
|
DeathGraphs:RefreshBossScroll()
|
|
DeathGraphs:RefreshPlayerScroll()
|
|
DeathGraphs:RefreshSegmentScroll()
|
|
|
|
if (DeathGraphs.db.last_segment) then
|
|
DeathGraphs.graphic_frame:Show()
|
|
DeathGraphs.overall_bg:Show()
|
|
end
|
|
end
|
|
|
|
function DeathGraphs:HideEnduranceAndDeaths()
|
|
endurance_frame:Hide()
|
|
player_scroll:Hide()
|
|
segments_scroll:Hide()
|
|
segments_bg_frame:Hide()
|
|
player_bg_frame:Hide()
|
|
DeathGraphs.graphic_frame:Hide()
|
|
DeathGraphs.overall_bg:Hide()
|
|
end
|
|
|
|
--> bottom menu bar
|
|
|
|
--> dropdown select type
|
|
local select_type_label = framework:NewLabel (f, nil, "$parentTypeLabel", nil, "Showing:", "GameFontNormal")
|
|
|
|
local OnSelectType = function (_, _, type)
|
|
--> mostrar ou esconder o box de endurance
|
|
if (type == 2) then
|
|
DeathGraphs:ShowEndurance()
|
|
|
|
elseif (type == 1) then
|
|
DeathGraphs:HideEndurance()
|
|
end
|
|
end
|
|
|
|
local death_desc = Loc ["STRING_DEATH_DESC"]
|
|
local endurance_desc = Loc ["STRING_ENDURANCE_DESC"]
|
|
|
|
local type_menu = {
|
|
{value = 1, label = Loc ["STRING_DEATHS"], onclick = OnSelectType, icon = [[Interface\GROUPFRAME\UI-GROUP-MAINASSISTICON]], desc = death_desc},
|
|
{value = 2, label = Loc ["STRING_ENDURANCE"], onclick = OnSelectType, icon = [[Interface\GROUPFRAME\UI-GROUP-MAINASSISTICON]], desc = endurance_desc},
|
|
{value = 4, label = Loc ["STRING_OVERTIME"], onclick = OnSelectType, icon = [[Interface\GROUPFRAME\UI-GROUP-MAINASSISTICON]], desc = endurance_desc},
|
|
{value = 3, label = Loc ["STRING_LATEST"], onclick = OnSelectType, icon = [[Interface\GROUPFRAME\UI-GROUP-MAINASSISTICON]], desc = endurance_desc},
|
|
}
|
|
|
|
local select_type_dropdown = framework:NewDropDown (f, nil, "$parentSegmentDropdown", "ModeDropdown", 150, 20, function() return type_menu end, DeathGraphs.db.showing_type)
|
|
select_type_label:SetPoint ("bottomleft", f, "bottomleft", 15, 14)
|
|
select_type_dropdown:SetPoint ("left", select_type_label, "right", 2, 0)
|
|
|
|
select_type_label:Hide()
|
|
select_type_dropdown:Hide()
|
|
|
|
--> mode buttons:
|
|
|
|
local BUTTON_INDEX_CURRENT = 1
|
|
local BUTTON_INDEX_TIMELINE = 2
|
|
local BUTTON_INDEX_OVERALL = 3
|
|
local BUTTON_INDEX_ENDURANCE = 4
|
|
local options_button_template = framework:GetTemplate ("button", "ADL_BUTTON_TEMPLATE")
|
|
|
|
|
|
local change_mode = function (self, button, selected_mode)
|
|
DeathGraphs:HideAll()
|
|
|
|
if (selected_mode == BUTTON_INDEX_CURRENT) then
|
|
--> current
|
|
DeathGraphs:ShowCurrent() --internal index: 3
|
|
|
|
elseif (selected_mode == BUTTON_INDEX_TIMELINE) then
|
|
--> timeline
|
|
DeathGraphs:ShowTimeline() --internal index: 4
|
|
|
|
elseif (selected_mode == BUTTON_INDEX_OVERALL) then
|
|
--> overall
|
|
DeathGraphs:ShowOverall() --internal index: 1
|
|
|
|
elseif (selected_mode == BUTTON_INDEX_ENDURANCE) then
|
|
--> endurance
|
|
DeathGraphs:ShowEndurance() --internal index: 2
|
|
end
|
|
|
|
DeathGraphs:RefreshButtons()
|
|
end
|
|
|
|
--> current encounter
|
|
local current_encounter_button = framework:NewButton (f, _, "$parentModeCurrentEncounterButton", "ModeCurrentEncounterButton", mode_buttons_width, mode_buttons_height, change_mode, BUTTON_INDEX_CURRENT, nil, nil, "Current Encounter", 1)
|
|
current_encounter_button:SetTemplate (framework:GetTemplate ("button", "ADL_MENUBUTTON_TEMPLATE"))
|
|
current_encounter_button:SetIcon ([[Interface\WORLDSTATEFRAME\SkullBones]], nil, nil, nil, {4/64, 28/64, 4/64, 28/64}, "orange", nil, 2)
|
|
--current_encounter_button:SetTextColor ("orange")
|
|
|
|
--> timeline
|
|
local timeline_button = framework:NewButton (f, _, "$parentModeTimelineButton", "ModeTimelineButton", mode_buttons_width, mode_buttons_height, change_mode, BUTTON_INDEX_TIMELINE, nil, nil, "Timeline", 1, options_button_template)
|
|
timeline_button:SetTemplate (framework:GetTemplate ("button", "ADL_MENUBUTTON_TEMPLATE"))
|
|
timeline_button:SetIcon ([[Interface\CHATFRAME\ChatFrameExpandArrow]], nil, nil, nil, {0, 1, 0, 1}, "orange", nil, 2)
|
|
--timeline_button:SetTextColor ("orange")
|
|
|
|
--> endurance
|
|
local endurance_button = framework:NewButton (f, _, "$parentModeEnduranceButton", "ModeEnduranceButton", mode_buttons_width, mode_buttons_height, change_mode, BUTTON_INDEX_ENDURANCE, nil, nil, "Endurance", 1, options_button_template)
|
|
endurance_button:SetTemplate (framework:GetTemplate ("button", "ADL_MENUBUTTON_TEMPLATE"))
|
|
endurance_button:SetIcon ([[Interface\RAIDFRAME\Raid-Icon-Rez]], nil, nil, nil, {0, 1, 0, 1}, "orange", nil, 2)
|
|
|
|
endurance_button:SetPoint ("bottomleft", f, "bottomleft", 10, mode_buttons_y_pos)
|
|
timeline_button:SetPoint ("bottomleft", endurance_button, "bottomright", 5, 0)
|
|
current_encounter_button:SetPoint ("bottomleft", timeline_button, "bottomright", 5, 0)
|
|
|
|
--endurance_button:SetTextColor ("orange")
|
|
|
|
--> overall ~overall
|
|
--local overall_button = framework:NewButton (f, _, "$parentModeOverallButton", "ModeOverallButton", mode_buttons_width, mode_buttons_height, change_mode, BUTTON_INDEX_OVERALL, nil, nil, "Overall", 1, options_button_template)
|
|
--overall_button:SetPoint ("bottomleft", endurance_button, "bottomright", 5, 0)
|
|
--overall_button:SetIcon ([[Interface\Buttons\UI-MicroButton-Spellbook-Up]], nil, nil, nil, {0, 1, 0.4, 1}, nil, nil, 2)
|
|
--overall_button:SetTextColor ("orange")
|
|
|
|
--> highlight buttons when the mouse hoverover // change the color of button for the current selected module
|
|
local all_buttons = {current_encounter_button, timeline_button, endurance_button} --overall_button,
|
|
|
|
local set_button_as_pressed = function (button)
|
|
|
|
--[=[
|
|
local onenter = button.onenter_backdrop
|
|
local onleave = button.onleave_backdrop
|
|
onenter[1], onenter[2], onenter[3], onenter[4] = .8, .8, .8, 1
|
|
onleave[1], onleave[2], onleave[3], onleave[4] = .1, .1, .1, 1
|
|
|
|
local border_onenter = button.onenter_backdrop_border_color
|
|
border_onenter[1], border_onenter[2], border_onenter[3], border_onenter[4] = 1, 1, 0, 1
|
|
local border_onleave = button.onleave_backdrop_border_color
|
|
border_onleave[1], border_onleave[2], border_onleave[3], border_onleave[4] = 1, .8, 0, 1
|
|
|
|
if (button:IsMouseOver()) then
|
|
button:SetBackdropColor (onenter[1], onenter[2], onenter[3], onenter[4])
|
|
button:SetBackdropBorderColor (border_onenter[1], border_onenter[2], border_onenter[3], border_onenter[4])
|
|
else
|
|
button:SetBackdropColor (onleave[1], onleave[2], onleave[3], onleave[4])
|
|
button:SetBackdropBorderColor (border_onleave[1], border_onleave[2], border_onleave[3], border_onleave[4])
|
|
end
|
|
--]=]
|
|
|
|
button:SetTemplate (framework:GetTemplate ("button", "ADL_MENUBUTTON_SELECTED_TEMPLATE"))
|
|
end
|
|
|
|
function DeathGraphs:RefreshButtons()
|
|
--> reset endurance button
|
|
for _, button in ipairs (all_buttons) do
|
|
--[=[
|
|
local onenter = button.onenter_backdrop
|
|
onenter[1], onenter[2], onenter[3], onenter[4] = .6, .6, .6, .9
|
|
local onleave = button.onleave_backdrop
|
|
onleave[1], onleave[2], onleave[3], onleave[4] = .3, .3, .3, .9
|
|
local border_onenter = button.onenter_backdrop_border_color
|
|
border_onenter[1], border_onenter[2], border_onenter[3], border_onenter[4] = 0, 0, 0, 1
|
|
local border_onleave = button.onleave_backdrop_border_color
|
|
border_onleave[1], border_onleave[2], border_onleave[3], border_onleave[4] = 0, 0, 0, 1
|
|
|
|
button:SetBackdropColor (onleave[1], onleave[2], onleave[3], onleave[4])
|
|
button:SetBackdropBorderColor (border_onleave[1], border_onleave[2], border_onleave[3], border_onleave[4])
|
|
--]=]
|
|
|
|
button:SetTemplate (framework:GetTemplate ("button", "ADL_MENUBUTTON_TEMPLATE"))
|
|
end
|
|
|
|
if (DeathGraphs.db.showing_type == 1) then --overall
|
|
set_button_as_pressed (overall_button)
|
|
|
|
elseif (DeathGraphs.db.showing_type == 2) then --endurance
|
|
set_button_as_pressed (endurance_button)
|
|
|
|
elseif (DeathGraphs.db.showing_type == 3) then --current
|
|
set_button_as_pressed (current_encounter_button)
|
|
|
|
elseif (DeathGraphs.db.showing_type == 4) then --timeline
|
|
set_button_as_pressed (timeline_button)
|
|
|
|
end
|
|
end
|
|
|
|
local w = 120
|
|
|
|
--> erase data button
|
|
local wipe_data = function (self)
|
|
|
|
table.wipe (DeathGraphs.deaths_database)
|
|
table.wipe (DeathGraphs.endurance_database)
|
|
table.wipe (DeathGraphs.current_database)
|
|
table.wipe (DeathGraphs.graph_database)
|
|
|
|
DeathGraphs.db.last_player = false
|
|
DeathGraphs.db.last_segment = false
|
|
DeathGraphs.db.last_boss = false
|
|
DeathGraphs.graphic_frame:Reset()
|
|
DeathGraphs:ClearOverall()
|
|
DeathGraphs:Refresh()
|
|
DeathGraphs:CanShowIcon()
|
|
|
|
DeathGraphsCurrentFrameDeaths.OnResetAllData()
|
|
DeathGraphsPlayerGraphicDeaths.OnResetAllData()
|
|
|
|
if (DeathGraphs.db.showing_type == 3) then --current
|
|
DeathGraphs:ShowCurrent()
|
|
elseif (DeathGraphs.db.showing_type == 4) then --timeline
|
|
DeathGraphs:ShowTimeline()
|
|
end
|
|
|
|
end
|
|
|
|
local delete = framework:NewButton (f, _, "$parentDeleteButton", "DeleteButton", w, mode_buttons_height, wipe_data, nil, nil, nil, Loc ["STRING_RESET"], 1, framework:GetTemplate ("button", "DETAILS_PLUGIN_BUTTON_TEMPLATE"))
|
|
delete:SetPoint ("bottomright", f, "bottomright", -10, 10)
|
|
delete:SetIcon ([[Interface\Buttons\UI-StopButton]], nil, nil, nil, {0, 1, 0, 1}, nil, nil, 2)
|
|
--delete:SetTextColor ("orange")
|
|
|
|
--> configure threshold
|
|
local threshold_config = framework:NewButton (f, _, "$parentOptionsPanelButton", "OptionsPanelButton", w, mode_buttons_height, DeathGraphs.OpenOptionsPanel, nil, nil, nil, Loc ["STRING_OPTIONS"], 1, framework:GetTemplate ("button", "DETAILS_PLUGIN_BUTTON_TEMPLATE"))
|
|
threshold_config:SetPoint ("right", delete, "left", 2, 0)
|
|
threshold_config:SetIcon ([[Interface\Buttons\UI-OptionsButton]], nil, nil, nil, {0, 1, 0, 1}, nil, nil, 2)
|
|
--threshold_config:SetTextColor ("orange")
|
|
|
|
--> refresh on open
|
|
function DeathGraphs:Refresh()
|
|
|
|
DeathGraphs:RefreshBossScroll()
|
|
DeathGraphs:HideAll()
|
|
|
|
if (DeathGraphs.db.showing_type == 1) then --overall
|
|
DeathGraphs:ShowOverall()
|
|
|
|
elseif (DeathGraphs.db.showing_type == 2) then --endurance
|
|
DeathGraphs:ShowEndurance()
|
|
|
|
elseif (DeathGraphs.db.showing_type == 3) then --current
|
|
DeathGraphs:ShowCurrent()
|
|
|
|
elseif (DeathGraphs.db.showing_type == 4) then --timeline
|
|
DeathGraphs:ShowTimeline()
|
|
|
|
end
|
|
|
|
DeathGraphs:RefreshButtons()
|
|
|
|
if (DeathGraphs.db.showing_type == 1) then --else or nothing to show on endurance
|
|
|
|
local last_boss = DeathGraphs.db.last_boss
|
|
|
|
if (last_boss) then
|
|
--> check if the last table exists
|
|
if (DeathGraphs.deaths_database [last_boss]) then
|
|
local last_player = DeathGraphs.db.last_player
|
|
local last_segment = DeathGraphs.db.last_segment
|
|
else
|
|
local last_encounter = DeathGraphs.last_encounter_hash
|
|
if (last_encounter and DeathGraphs.deaths_database [last_encounter]) then
|
|
DeathGraphs.db.last_boss = DeathGraphs.last_encounter_hash
|
|
else
|
|
DeathGraphs.db.last_boss = false
|
|
end
|
|
|
|
DeathGraphs.db.last_player = false
|
|
DeathGraphs.db.last_segment = false
|
|
end
|
|
else
|
|
local last_encounter = DeathGraphs.last_encounter_hash
|
|
if (last_encounter and DeathGraphs.deaths_database [last_encounter]) then
|
|
DeathGraphs.db.last_boss = DeathGraphs.last_encounter_hash
|
|
else
|
|
DeathGraphs.db.last_boss = false
|
|
end
|
|
|
|
DeathGraphs.db.last_player = false
|
|
DeathGraphs.db.last_segment = false
|
|
end
|
|
|
|
DeathGraphs:RefreshBossScroll()
|
|
DeathGraphs:RefreshPlayerScroll()
|
|
DeathGraphs:RefreshSegmentScroll()
|
|
|
|
--> show graphic
|
|
DeathGraphs:Select()
|
|
|
|
--> show damage taken
|
|
|
|
end
|
|
end
|
|
|
|
--> select boss / player / segment
|
|
function DeathGraphs:Select (boss, player, segment)
|
|
if (not boss) then
|
|
boss = DeathGraphs.db.last_boss
|
|
else
|
|
DeathGraphs.db.last_boss = boss
|
|
end
|
|
if (not player) then
|
|
player = DeathGraphs.db.last_player
|
|
else
|
|
DeathGraphs.db.last_player = player
|
|
end
|
|
if (not segment) then
|
|
segment = DeathGraphs.db.last_segment
|
|
else
|
|
DeathGraphs.db.last_segment = segment
|
|
end
|
|
|
|
if (boss and player and segment) then
|
|
local death_table = DeathGraphs:GetBossTable (boss , nil, CONST_DBTYPE_DEATH)
|
|
local player_table = DeathGraphs:GetPlayerTable (death_table, player)
|
|
DeathGraphs:ShowGraphicForDeath (player_table.deaths [segment])
|
|
end
|
|
|
|
DeathGraphs:RefreshBossScroll()
|
|
DeathGraphs:RefreshPlayerScroll()
|
|
DeathGraphs:RefreshSegmentScroll()
|
|
end
|
|
|
|
--> graphic
|
|
|
|
local log
|
|
local loglines = {}
|
|
local linhas = {}
|
|
local gradeframes = {}
|
|
local gradelinhas = {}
|
|
|
|
local gballs = {}
|
|
|
|
local GetSpellInfo = _detalhes.getspellinfo
|
|
local flag_logmouseover = false
|
|
|
|
local gframe = CreateFrame ("frame", nil, f, "BackdropTemplate")
|
|
gframe:SetSize (475, 160)
|
|
gframe:SetPoint ("topleft", f, "topleft", 449, -95)
|
|
gframe.CustomLine = [[Interface\AddOns\Details\Libs\LibGraph-2.0\line]]
|
|
DeathGraphs.graphic_frame = gframe
|
|
|
|
local g = LibStub:GetLibrary ("LibGraph-2.0")
|
|
|
|
--> graphic lines on enter and leave
|
|
local on_enter = function (self)
|
|
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLORHIGHLIGHT))
|
|
local ball = gballs [self.id]
|
|
ball:SetBlendMode ("ADD")
|
|
local line = ball.line
|
|
|
|
if (not line) then
|
|
return
|
|
end
|
|
|
|
if (self.data [2] ~= 0) then
|
|
GameCooltip:Reset()
|
|
|
|
GameCooltip:SetOption ("ButtonsYMod", 0)
|
|
GameCooltip:SetOption ("YSpacingMod", -5)
|
|
GameCooltip:SetOption ("IgnoreButtonAutoHeight", true)
|
|
GameCooltip:SetColor (1, 0.5, 0.5, 0.5, 0.5)
|
|
|
|
local spellname, _, spellicon = GetSpellInfo (self.data [2])
|
|
|
|
GameCooltip:AddLine (spellname, nil, 1, "orange", nil, 12, SharedMedia:Fetch ("font", "Friz Quadrata TT"))
|
|
GameCooltip:AddIcon (spellicon, 1, 1, 16, 16)
|
|
|
|
--> death parser
|
|
if (type (self.data [1]) == "boolean") then --> damage or heal
|
|
if (self.data [1]) then
|
|
|
|
if (self.data [7] and self.data [7] > 0) then
|
|
GameCooltip:AddLine ("-" .. DeathGraphs:comma_value (self.data [3]) .. " |cFF11FF11(|r" .. DeathGraphs:comma_value (self.data [7]) .. " |cFFFFFFBBabsorbed|r|cFF11FF11)|r") --> damage with absorb
|
|
else
|
|
GameCooltip:AddLine ("-" .. DeathGraphs:comma_value (self.data [3])) --> damage
|
|
end
|
|
|
|
GameCooltip:AddLine ("School: " .. DeathGraphs:GetSpellSchoolFormatedName (self.data [8]))
|
|
else
|
|
GameCooltip:AddLine ("+" .. DeathGraphs:comma_value (self.data [3]))
|
|
end
|
|
|
|
elseif (type (self.data [1]) == "number") then
|
|
if (self.data [1] == 1) then --cooldown
|
|
GameCooltip:AddLine ("Cooldown")
|
|
elseif (self.data [1] == 2) then --battle ress
|
|
GameCooltip:AddLine ("Battleress")
|
|
end
|
|
end
|
|
|
|
GameCooltip:AddLine ("Source: " .. self.data [6])
|
|
|
|
if (type (self.data [1]) == "boolean" and self.data [1] and self.data [9]) then --> damage or heal
|
|
GameCooltip:AddLine ("|cFFFF0000Friendly Fire|r")
|
|
end
|
|
|
|
GameCooltip:SetBackdrop (1, _detalhes.tooltip_backdrop, cooltip_block_bg, _detalhes.tooltip_border_color)
|
|
|
|
GameCooltip:SetOwner (ball.tooltip_anchor, "bottomleft", "topright")
|
|
GameCooltip:Show()
|
|
end
|
|
|
|
end
|
|
local on_leave = function (self)
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
local ball = gballs [self.id]
|
|
ball:SetBlendMode ("BLEND")
|
|
local line = ball.line
|
|
if (line) then
|
|
line:SetBlendMode ("BLEND")
|
|
end
|
|
GameCooltip:Hide()
|
|
end
|
|
|
|
--> graphic lines
|
|
for i = 1, 16 do
|
|
linhas [i] = g:DrawLine (gframe, 400, 500, 600, 700, 20, {1, 1, 1, 1}, "artwork")
|
|
|
|
local f = CreateFrame ("frame", nil, gframe, "BackdropTemplate")
|
|
f:SetPoint ("left", gframe, "left", (i-1)*29, 0)
|
|
f:SetSize (29, 160)
|
|
gradeframes [i] = f
|
|
f.id = i
|
|
f:SetScript ("OnEnter", on_enter)
|
|
f:SetScript ("OnLeave", on_leave)
|
|
|
|
f:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
|
|
f:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
|
|
local t = gframe:CreateTexture (nil, "background")
|
|
t:SetSize (1, 160)
|
|
t:SetPoint ("left", gframe, "left", i*29, 0)
|
|
t:SetColorTexture (1, 1, 1, .1)
|
|
gradelinhas [i] = t
|
|
|
|
local b = f:CreateTexture (nil, "overlay")
|
|
b:SetTexture ([[Interface\COMMON\Indicator-Yellow]])
|
|
b:SetSize (16, 16)
|
|
local anchor = CreateFrame ("frame", nil, f, "BackdropTemplate")
|
|
anchor:SetAllPoints (b)
|
|
b.tooltip_anchor = anchor
|
|
gballs [i] = b
|
|
|
|
local spellicon = f:CreateTexture (nil, "artwork")
|
|
spellicon:SetPoint ("bottom", b, "bottom", 0, 10)
|
|
spellicon:SetSize (16, 16)
|
|
b.spellicon = spellicon
|
|
end
|
|
|
|
function gframe:ShowGrid()
|
|
for _, frame in ipairs (gradeframes) do
|
|
frame:Show()
|
|
end
|
|
for _, line in ipairs (gradelinhas) do
|
|
line:Show()
|
|
end
|
|
for _, bola in ipairs (gballs) do
|
|
bola:Show()
|
|
end
|
|
gframe.timeline:Show()
|
|
end
|
|
function gframe:HideGrid()
|
|
for _, frame in ipairs (gradeframes) do
|
|
frame:Hide()
|
|
end
|
|
for _, line in ipairs (gradelinhas) do
|
|
line:Hide()
|
|
end
|
|
for _, bola in ipairs (gballs) do
|
|
bola:Hide()
|
|
end
|
|
gframe.timeline:Hide()
|
|
end
|
|
|
|
function gframe:Reset()
|
|
for i = #gframe.GraphLib_Lines_Used, 1, -1 do
|
|
local line = tremove (gframe.GraphLib_Lines_Used)
|
|
tinsert (gframe.GraphLib_Lines, line)
|
|
line:Hide()
|
|
end
|
|
end
|
|
|
|
--> timeline
|
|
local timeline_bg = CreateFrame ("frame", nil, gframe, "BackdropTemplate")
|
|
gframe.timeline = timeline_bg
|
|
timeline_bg:SetPoint ("topleft", gframe, "bottomleft", 0, -1)
|
|
timeline_bg:SetPoint ("topright", gframe, "bottomright", -11, -1)
|
|
timeline_bg:SetHeight (20)
|
|
timeline_bg:SetBackdrop ({bgFile = "Interface\\AddOns\\Details\\images\\background", tile = true, tileSize = 16,
|
|
insets = {left = 0, right = 0, top = 0, bottom = 0}})
|
|
timeline_bg:SetBackdropColor (.1, .1, .1, .3)
|
|
timeline_bg.labels = {}
|
|
for i = 1, 16 do
|
|
local l = timeline_bg:CreateFontString (nil, "overlay", "GameFontNormal")
|
|
DeathGraphs:SetFontSize (l, 9)
|
|
DeathGraphs:SetFontColor (l, "silver")
|
|
l:SetPoint ("left", timeline_bg, "left", (i-1) * 29, 0)
|
|
timeline_bg.labels [i] = l
|
|
end
|
|
|
|
local red = {.9, .1, .1, 1}
|
|
local green = {.1, .9, .1, 1}
|
|
local white = {1, 1, 1, 1}
|
|
local gray = {.5, .5, .5, 1}
|
|
local orange = {1, .6, 0, 1}
|
|
|
|
function DeathGraphs:ShowGraphicForDeath (data)
|
|
|
|
gframe:Reset()
|
|
gframe:ShowGrid()
|
|
gframe:Show()
|
|
|
|
if (not data) then
|
|
return
|
|
end
|
|
|
|
local timeline = data [1]
|
|
local max_health = data[4]
|
|
|
|
if (#timeline < 16) then
|
|
while (#timeline < 16) do
|
|
table.insert (timeline, 1, {false, 0, 0, data[6], max_health, "-1"})
|
|
end
|
|
end
|
|
|
|
log = timeline
|
|
|
|
local h = gframe:GetHeight()/100
|
|
|
|
local o = 1
|
|
local lastlife = 156
|
|
|
|
--for i = 16, 1, -1 do
|
|
for i = 1, 16, 1 do
|
|
local t = timeline [i]
|
|
if (type (t) == "table") then
|
|
|
|
--> death parser
|
|
|
|
local evtype = t [1] --event type
|
|
local spellid = t [2] --spellid
|
|
local amount = t [3] --amount healed or damaged
|
|
local time = t [4] --time
|
|
local life = t [5] --health
|
|
local source = t [6] --source
|
|
|
|
local plife = life / max_health * 100
|
|
if (plife > 98) then
|
|
plife = 98
|
|
end
|
|
plife = plife*h
|
|
|
|
local line
|
|
|
|
if (source == "-1") then
|
|
--> neutral line
|
|
line = g:DrawLine (gframe, (o-1)*29, lastlife, o*29, plife, 50, gray, "overlay")
|
|
|
|
elseif (type (evtype) == "boolean") then
|
|
--> damage or heal
|
|
if (evtype) then
|
|
--> damage
|
|
if (t [9]) then
|
|
--> friendly fire
|
|
line = g:DrawLine (gframe, (o-1)*29, lastlife, o*29, plife, 50, orange, "overlay")
|
|
else
|
|
--> normal damage
|
|
line = g:DrawLine (gframe, (o-1)*29, lastlife, o*29, plife, 50, red, "overlay")
|
|
end
|
|
elseif (not evtype) then
|
|
--> heal
|
|
line = g:DrawLine (gframe, (o-1)*29, lastlife, o*29, plife, 50, green, "overlay")
|
|
end
|
|
|
|
elseif (type (evtype) == "number") then
|
|
--> cooldown / bres / last cooldown
|
|
if (evtype == 1) then
|
|
--> cooldown
|
|
line = g:DrawLine (gframe, (o-1)*29, lastlife, o*29, plife, 50, white, "overlay")
|
|
|
|
elseif (evtype == 2 and not battleress) then
|
|
--> battle ress
|
|
local p = plife
|
|
local next = timeline [i+1]
|
|
if (next) then
|
|
local plife = next [5] / max_health * 100
|
|
if (plife > 98) then
|
|
plife = 98
|
|
end
|
|
p = plife*h
|
|
end
|
|
line = g:DrawLine (gframe, (o-1)*29, lastlife, o*29, p, 50, white, "overlay")
|
|
plife = p
|
|
|
|
elseif (evtype == 3) then
|
|
--> last cooldown used
|
|
line = g:DrawLine (gframe, (o-1)*29, lastlife, o*29, plife, 50, gray, "overlay")
|
|
end
|
|
end
|
|
|
|
local ball = gballs [o]
|
|
ball:SetPoint ("bottomleft", gframe, "bottomleft", (o*29)-8, plife-8)
|
|
if (type (evtype) == "boolean" and evtype) then --> damage
|
|
ball.spellicon:SetTexture (select (3, GetSpellInfo (spellid)))
|
|
ball.spellicon:SetTexCoord (4/64, 60/64, 4/64, 60/64)
|
|
else
|
|
ball.spellicon:SetTexture (nil)
|
|
end
|
|
|
|
ball.line = line
|
|
|
|
local clock = data[6] - time
|
|
if (type (evtype) == "number" and evtype == 2) then
|
|
if (clock <= 100) then
|
|
timeline_bg.labels [o]:SetText (math.floor (clock))
|
|
else
|
|
timeline_bg.labels [o]:SetText (string.format ("%.1f", clock))
|
|
end
|
|
else
|
|
timeline_bg.labels [o]:SetText ("-" .. string.format ("%.1f", clock))
|
|
end
|
|
|
|
local frame = gradeframes [o]
|
|
frame.data = t
|
|
|
|
lastlife = plife
|
|
o = o + 1
|
|
end
|
|
end
|
|
|
|
DeathGraphs:UpdateOverall()
|
|
|
|
end
|
|
|
|
local overall = {}
|
|
local amount_of_overall_blocks = 16
|
|
|
|
local overall_bg = CreateFrame ("frame", "DeathGraphsOverallDamageBackground", f, "BackdropTemplate")
|
|
DeathGraphs.overall_bg = overall_bg
|
|
|
|
overall_bg:SetPoint ("topleft", gframe, "bottomleft", 0, -30)
|
|
overall_bg:SetSize (464, 148)
|
|
framework:CreateLabel (overall_bg, "Overall Damage Taken Before All Deaths:", nil, nil, "GameFontNormal", "overall")
|
|
overall_bg.overall:SetPoint ("topleft", gframe, "bottomleft", 5, -38)
|
|
|
|
local overall_on_enter = function (self)
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLORHIGHLIGHT))
|
|
if (self.spell) then
|
|
GameTooltip:SetOwner (self, "ANCHOR_TOPLEFT")
|
|
if (self.spell == 1) then
|
|
GameTooltip:SetSpellByID (6603)
|
|
else
|
|
GameTooltip:SetSpellByID (self.spell)
|
|
end
|
|
GameTooltip:Show()
|
|
end
|
|
end
|
|
local overall_on_leave = function (self)
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
GameTooltip:Hide()
|
|
end
|
|
|
|
local x, y = 0, -7
|
|
for i = 1, amount_of_overall_blocks do
|
|
local frame = CreateFrame ("frame", nil, overall_bg, "BackdropTemplate")
|
|
frame:SetSize (220, 19)
|
|
|
|
local icon = framework:NewImage (frame, "", 18, 18)
|
|
local label = framework:CreateLabel (frame, ""..i)
|
|
icon:SetPoint ("left", frame, "left")
|
|
label:SetPoint ("left", icon, "right", 2, 0)
|
|
|
|
local label2 = framework:CreateLabel (frame, ""..i)
|
|
label2:SetPoint ("right", frame, "right")
|
|
|
|
tinsert (overall, {frame = frame, icon = icon, label = label, label2 = label2})
|
|
|
|
frame:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
|
|
frame:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
|
|
frame:SetScript ("OnEnter", overall_on_enter)
|
|
frame:SetScript ("OnLeave", overall_on_leave)
|
|
|
|
frame:SetPoint ("topleft", overall_bg.overall.widget, "bottomleft", x, y)
|
|
y = y - 20
|
|
|
|
if (y < -150) then
|
|
x = x + 232
|
|
y = -7
|
|
end
|
|
end
|
|
|
|
--> report overall
|
|
local report_overall_func = function()
|
|
local boss = DeathGraphs.db.last_boss
|
|
if (not boss) then
|
|
return
|
|
end
|
|
local boss_table = DeathGraphs.endurance_database [boss]
|
|
if (not boss_table) then
|
|
return
|
|
end
|
|
|
|
local reportFunc = function (IsCurrent, IsReverse, AmtLines)
|
|
|
|
local boss_table = DeathGraphs:GetBossTable (DeathGraphs.db.last_boss , nil, CONST_DBTYPE_DEATH)
|
|
local player_table = DeathGraphs:GetPlayerTable (boss_table, DeathGraphs.db.last_player)
|
|
|
|
if (not boss_table or not player_table) then
|
|
DeathGraphs:Msg ("Nothing to report.")
|
|
return
|
|
end
|
|
|
|
DeathGraphs.report_lines = {"Details!: overall damage taken before death for " .. (player_table.name or "Unknown") .. " on " .. (boss_table.name or "Unknown") .. " (A.D.L (plugin)):"}
|
|
for i = 1, math.min (#overall, AmtLines) do
|
|
local label = overall [i]
|
|
if (label.frame:IsShown()) then
|
|
|
|
local spellid = label.frame.spell
|
|
local spelllink
|
|
if (spellid > 10) then
|
|
spelllink = GetSpellLink (spellid)
|
|
else
|
|
spelllink = label.label.text
|
|
end
|
|
|
|
tinsert (DeathGraphs.report_lines, spelllink .. ": " .. label.label2.text)
|
|
end
|
|
end
|
|
DeathGraphs:SendReportLines (DeathGraphs.report_lines)
|
|
end
|
|
|
|
local use_slider = true
|
|
DeathGraphs:SendReportWindow (reportFunc, nil, nil, use_slider)
|
|
end
|
|
|
|
local report_overall = framework:NewButton (overall_bg, _, "$parentReportOverallDamageButton", "ReportOverallDamageButton", 70, mode_buttons_height, report_overall_func, nil, nil, nil, "Report", 1, options_dropdown_template)
|
|
report_overall:SetPoint ("topright", overall_bg, "topright", -6, -3)
|
|
|
|
function DeathGraphs:UpdateOverall()
|
|
DeathGraphs:ClearOverall()
|
|
|
|
local death_table = DeathGraphs:GetBossTable (DeathGraphs.db.last_boss , nil, CONST_DBTYPE_DEATH)
|
|
local player_table = DeathGraphs:GetPlayerTable (death_table, DeathGraphs.db.last_player)
|
|
|
|
local numeric = {}
|
|
for spellid, amount in pairs (player_table.overall) do
|
|
tinsert (numeric, {spellid, amount})
|
|
end
|
|
table.sort (numeric, DeathGraphs.Sort2) --> sort by index 2
|
|
|
|
for i, spelltable in ipairs (numeric) do
|
|
local t = overall[i]
|
|
|
|
if (t) then
|
|
local spellname, _, spellicon = DeathGraphs.GetSpellInfo (spelltable[1])
|
|
t.frame:Show()
|
|
t.frame.spell = spelltable[1]
|
|
t.icon.texture = spellicon
|
|
t.icon.texcoord = CONST_COORDS_NO_BORDER
|
|
t.label.text = spellname .. ": "
|
|
t.label2.text = DeathGraphs:comma_value (spelltable [2])
|
|
end
|
|
end
|
|
|
|
overall_bg:Show()
|
|
end
|
|
|
|
function DeathGraphs:ClearOverall()
|
|
for i = 1, amount_of_overall_blocks do
|
|
local t = overall[i]
|
|
t.icon.texture = ""
|
|
t.label.text = ""
|
|
t.frame.spell = nil
|
|
t.frame:Hide()
|
|
end
|
|
end
|
|
|
|
gframe:Reset()
|
|
gframe:HideGrid()
|
|
DeathGraphs:ClearOverall()
|
|
|
|
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
--> search keys: ~current
|
|
--> current deaths of latest try
|
|
local MAX_SUMMARY_SPELLS = 5
|
|
local BUTTON_TEXT_SIZE = 10
|
|
local BUTTON_TEXT_COLOR = {.9, .9, .9, 1}
|
|
local BUTTON_TEXT_HIGHLIGHT = "white"
|
|
local BUTTON_TEXT_PRESSED = "orange"
|
|
local BUTTON_BACKGROUND_COLOR = {.2, .2, .2, .75}
|
|
local BUTTON_BACKGROUND_COLORHIGHLIGHT = {.5, .5, .5, .8}
|
|
|
|
local currentFrame = CreateFrame ("frame", "DeathGraphsCurrentFrameDeaths", f, "BackdropTemplate")
|
|
currentFrame:SetPoint ("topleft", 10, -50)
|
|
currentFrame:SetSize (800, 400)
|
|
|
|
f.CurrentDeathFrame = currentFrame
|
|
|
|
local segment_label = framework:NewLabel (currentFrame, nil, "$parentSegmentLabel", nil, "Segment:", "GameFontNormal")
|
|
|
|
local OnSelectEncounter = function (_, _, index)
|
|
--> selected the segment
|
|
currentFrame.Refresh (index)
|
|
end
|
|
|
|
local build_segments_menu = function()
|
|
local list = {}
|
|
local db = DeathGraphs.current_database
|
|
for i, encounter in ipairs (db) do
|
|
tinsert (list, {value = i, label = "#" .. i .. " " .. encounter.bossname, onclick = OnSelectEncounter, icon = encounter.bossicon[5], texcoord = {encounter.bossicon[1], encounter.bossicon[2], encounter.bossicon[3], encounter.bossicon[4]}})
|
|
end
|
|
return list
|
|
end
|
|
|
|
local segment_dropdown = framework:NewDropDown (currentFrame, nil, "$parentSegmentDropdown", "SegmentDropdown", 150, 20, build_segments_menu, 1, options_dropdown_template)
|
|
segment_label:SetPoint ("topleft", currentFrame, "topleft", 0, 1)
|
|
segment_dropdown:SetPoint ("topleft", segment_label, "bottomleft", 0, -5)
|
|
|
|
--create the player frame to host buttons
|
|
local playerListFrame = CreateFrame ("frame", "DeathGraphsCurrentFrameDeathsPlayerList", currentFrame, "BackdropTemplate")
|
|
playerListFrame:SetPoint ("topleft", currentFrame, "topleft", -9, -45)
|
|
playerListFrame:SetSize (170, 400)
|
|
|
|
--create the panel to show the death timeline
|
|
local deathPanel = CreateFrame ("frame", "DeathGraphsCurrentFrameDeathsDeathTimeline", currentFrame, "BackdropTemplate")
|
|
deathPanel:SetPoint ("topleft", playerListFrame, "topright", 2, 0)
|
|
deathPanel:SetSize (750, 400)
|
|
|
|
--colunms:
|
|
local deathColumns = {}
|
|
local summaryColumns = {}
|
|
|
|
local column_onenter = function (self)
|
|
--show the tooltip for this spell
|
|
local spellid = self.spellid
|
|
if (spellid) then
|
|
GameTooltip:SetOwner (self, "ANCHOR_TOPLEFT")
|
|
if (spellid == 1) then
|
|
GameTooltip:SetSpellByID (6603)
|
|
else
|
|
GameTooltip:SetSpellByID (spellid)
|
|
end
|
|
GameTooltip:Show()
|
|
end
|
|
local r, g, b = self:GetBackdropColor()
|
|
self:SetBackdropColor (r, g, b, 1)
|
|
end
|
|
local column_onleave = function (self)
|
|
--hide the spell tooltip
|
|
GameTooltip:Hide()
|
|
--> set back the backdrop alpha
|
|
local r, g, b = self:GetBackdropColor()
|
|
self:SetBackdropColor (r, g, b, self.backdropAlpha)
|
|
end
|
|
|
|
--> create the lines for the death log
|
|
for i = 1, CONST_MAX_DEATH_EVENTS do
|
|
local column_frame = CreateFrame ("frame", nil, deathPanel, "BackdropTemplate")
|
|
--time before death
|
|
column_frame.hitTime = framework:CreateLabel (column_frame, "-10s", nil, "white", "GameFontHighlightSmall")
|
|
|
|
--hit strength
|
|
column_frame.hitStrength = framework:CreateLabel (column_frame, "100k", nil, "white", "GameFontHighlightSmall")
|
|
|
|
--spell
|
|
column_frame.hitSpell = framework:CreateLabel (column_frame, "[Melee]", nil, "white", "GameFontHighlightSmall")
|
|
column_frame.hitSpellIcon = framework:CreateImage (column_frame, nil, 12, 12, "overlay")
|
|
|
|
--source
|
|
column_frame.hitSource = framework:CreateLabel (column_frame, "Sargeras", nil, "white", "GameFontHighlightSmall")
|
|
|
|
--hp bar
|
|
column_frame.healthBarBackground = framework:CreateImage (column_frame, nil, 150, 12, "artwork")
|
|
column_frame.healthBarBackground:SetColorTexture (0, 0, 0, 0.5)
|
|
column_frame.healthBar = framework:CreateImage (column_frame, nil, 150, 12, "overlay")
|
|
column_frame.healthBar:SetColorTexture (.8, .8, .8, 0.7)
|
|
|
|
--> set points, height and script
|
|
column_frame:SetPoint ("topleft", deathPanel, "topleft", 0, (i-1)*16*-1)
|
|
column_frame:SetPoint ("topright", deathPanel, "topright", 0, (i-1)*16*-1)
|
|
column_frame:SetHeight (16)
|
|
column_frame:SetScript ("OnEnter", column_onenter)
|
|
column_frame:SetScript ("OnLeave", column_onleave)
|
|
|
|
--> set the point off all widgets
|
|
column_frame.hitTime:SetPoint ("left", column_frame, "left", 2, 0)
|
|
column_frame.hitStrength:SetPoint ("left", column_frame, "left", 100, 0)
|
|
|
|
column_frame.hitSpellIcon:SetPoint ("left", column_frame, "left", 176, 0)
|
|
column_frame.hitSpell:SetPoint ("left", column_frame, "left", 190, 0)
|
|
|
|
column_frame.hitSource:SetPoint ("left", column_frame, "left", 355, 0)
|
|
|
|
column_frame.healthBar:SetPoint ("left", column_frame, "left", 520, 0)
|
|
column_frame.healthBarBackground:SetPoint ("left", column_frame, "left", 520, 0)
|
|
|
|
--> column backdrop
|
|
column_frame:SetBackdrop ({bgFile = [[Interface\AddOns\Details\images\background]], tile = true, tileSize = 16})
|
|
|
|
tinsert (deathColumns, column_frame)
|
|
|
|
column_frame:Hide()
|
|
end
|
|
|
|
local summary_onenter = function (self)
|
|
--show the tooltip for this spell
|
|
local spellid = self.spellid
|
|
if (spellid) then
|
|
GameTooltip:SetOwner (self, "ANCHOR_TOPLEFT")
|
|
if (spellid == 1) then
|
|
GameTooltip:SetSpellByID (6603)
|
|
else
|
|
GameTooltip:SetSpellByID (spellid)
|
|
end
|
|
GameTooltip:Show()
|
|
end
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLORHIGHLIGHT))
|
|
end
|
|
local summary_onleave = function (self)
|
|
GameTooltip:Hide()
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
end
|
|
|
|
--> create the summary blocks
|
|
for i = 1, MAX_SUMMARY_SPELLS do
|
|
local summary_frame = CreateFrame ("frame", nil, deathPanel, "BackdropTemplate")
|
|
|
|
summary_frame:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
|
|
summary_frame:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
|
|
--> set points, height and script
|
|
summary_frame:SetPoint ("bottomleft", deathPanel, "topleft", (i-1) * 142, 10)
|
|
summary_frame:SetWidth (140)
|
|
summary_frame:SetHeight (20)
|
|
summary_frame:SetScript ("OnEnter", summary_onenter)
|
|
summary_frame:SetScript ("OnLeave", summary_onleave)
|
|
|
|
--> create icon, spellname and amount widges
|
|
summary_frame.spellIcon = framework:CreateImage (summary_frame, nil, 20, 20, "overlay")
|
|
summary_frame.spellName = framework:CreateLabel (summary_frame, "place holder string", nil, "white", "GameFontHighlightSmall")
|
|
summary_frame.spellAmount = framework:CreateLabel (summary_frame, "place holder string", nil, "white", "GameFontHighlightSmall")
|
|
--> set theirs points
|
|
summary_frame.spellIcon:SetPoint ("left", summary_frame, "left", 2, 0)
|
|
summary_frame.spellName:SetPoint ("left",summary_frame.spellIcon, "right", 2, 0)
|
|
summary_frame.spellAmount:SetPoint ("left", summary_frame.spellName, "right", 2, 0)
|
|
|
|
--> add to the container
|
|
tinsert (summaryColumns, summary_frame)
|
|
summary_frame:Hide()
|
|
end
|
|
|
|
local temp_summary_table = {}
|
|
|
|
--<
|
|
function deathPanel.ShowPlayerScaleByDamage (index)
|
|
local encounter = currentFrame.current_encounter
|
|
if (encounter) then
|
|
local deaths = encounter.deaths
|
|
local player = deaths [index]
|
|
if (player) then
|
|
local events = player.events
|
|
local total_damage = 0
|
|
local total_time = 0
|
|
local max_health = player.maxhealth
|
|
local time_death = player.time
|
|
|
|
for _, event in ipairs (player.events) do
|
|
total_time = total_time + (event [4] - time_death)
|
|
total_damage = total_damage + event [3]
|
|
end
|
|
|
|
local damage_per_second = total_damage / total_time
|
|
damage_per_second = floor (damage_per_second)
|
|
|
|
return damage_per_second
|
|
end
|
|
end
|
|
end
|
|
|
|
--> build the death events for the selected player
|
|
function deathPanel.ShowPlayerDeath (index)
|
|
|
|
deathPanel.HidePlayerDeathEvents()
|
|
deathPanel.HideDeathEventsSummary()
|
|
|
|
local encounter = currentFrame.current_encounter
|
|
if (encounter) then
|
|
local deaths = encounter.deaths
|
|
local player = deaths [index]
|
|
if (player) then
|
|
local events = player.events
|
|
|
|
--> death parser
|
|
local maxhealth = player.maxhealth
|
|
local time = player.time or events [1][4]
|
|
|
|
local added = 1
|
|
local number_format_func = Details:GetCurrentToKFunction()
|
|
--local NumOfEvents = min (#events, CONST_MAX_DEATH_EVENTS)
|
|
|
|
wipe (temp_summary_table)
|
|
--local eventIndex = min (#events - NumOfEvents) + 1
|
|
|
|
local eventsToShow = {}
|
|
for i = #events, 1, -1 do
|
|
|
|
local ev = events [i]
|
|
local evtype = ev and ev [1]
|
|
|
|
if (type (evtype) == "boolean" and evtype) then
|
|
--> damage
|
|
tinsert (eventsToShow, {"damage", ev})
|
|
|
|
elseif (type (evtype) == "boolean" and not evtype) then
|
|
--> healing
|
|
if (ev [3] > CONST_MIN_HEALINGDONE_DEATHLOG) then
|
|
tinsert (eventsToShow, {"healing", ev})
|
|
end
|
|
|
|
elseif (type (evtype) == "number" and evtype == 4) then
|
|
--> debuff applied on the player
|
|
tinsert (eventsToShow, {"debuff", ev})
|
|
|
|
end
|
|
end
|
|
|
|
for i = CONST_MAX_DEATH_EVENTS+1, #eventsToShow do
|
|
table.remove (eventsToShow, CONST_MAX_DEATH_EVENTS+1)
|
|
end
|
|
|
|
local EventsList = Details.table.reverse (eventsToShow)
|
|
|
|
for i = 1, #EventsList do
|
|
local t = EventsList [i]
|
|
local evtype_string = t [1]
|
|
local ev = t [2]
|
|
|
|
local column = deathColumns [i]
|
|
|
|
local spellid = ev [2] --spellid
|
|
local amount = ev [3] --amount healed or damaged
|
|
local clock = ev [4] --time
|
|
local life = ev [5] --health
|
|
local sourceName = ev [6] --source
|
|
|
|
column.hitTime.text = "-" .. string.format ("%.1f", time - clock)
|
|
|
|
if (evtype_string == "damage") then
|
|
column.hitStrength.text = "-" .. number_format_func (_, amount)
|
|
column.hitStrength.textcolor = "white"
|
|
column.hitStrength.textsize = 11
|
|
column:SetBackdropColor (1, 0, 0, 1)
|
|
column.backdropAlpha = 0.7
|
|
column:SetAlpha (1)
|
|
temp_summary_table [spellid] = (temp_summary_table [spellid] or 0) + amount
|
|
|
|
elseif (evtype_string == "healing") then
|
|
column.hitStrength.text = "+" .. number_format_func (_, amount)
|
|
column.hitStrength.textcolor = {0.8, 1, 0.8, 0.9}
|
|
column.hitStrength.textsize = 10
|
|
column.backdropAlpha = 0.25
|
|
column:SetBackdropColor (.2, 1, .2, column.backdropAlpha)
|
|
column:SetAlpha (.75)
|
|
|
|
elseif (evtype_string == "debuff") then
|
|
column.hitStrength.text = "x" .. amount
|
|
column.hitStrength.textcolor = "silver"
|
|
column.hitStrength.textsize = 10
|
|
column:SetBackdropColor (.8, .2, .8, 1)
|
|
column.backdropAlpha = 0.7
|
|
column:SetAlpha (1)
|
|
|
|
end
|
|
|
|
--> set the spellname with the link
|
|
local spelllink = DeathGraphs:GetSpellLink (spellid)
|
|
local _, _, spellicon = DeathGraphs.GetSpellInfo (spellid)
|
|
column.hitSpell.text = spelllink
|
|
column.hitSpellIcon.texture = spellicon
|
|
column.hitSpellIcon.texcoord = CONST_COORDS_NO_BORDER
|
|
|
|
--> the source name
|
|
sourceName = framework:RemoveRealmName (sourceName)
|
|
column.hitSource.text = sourceName
|
|
|
|
--> set the life statusbar
|
|
column.healthBar.width = math.min (life, maxhealth) / maxhealth * 100 * 1.5
|
|
|
|
--> set the spell id
|
|
column.spellid = spellid
|
|
|
|
column:Show()
|
|
|
|
end
|
|
|
|
--> set the summary widgets
|
|
local t = {}
|
|
for spellid, amount in pairs (temp_summary_table) do
|
|
tinsert (t, {spellid, amount})
|
|
end
|
|
table.sort (t, Details.Sort2)
|
|
for i = 1, min (#t, 5) do
|
|
--> get the data from the table
|
|
local spellid, amount = unpack (t[i])
|
|
--> get the summary widget
|
|
local summaryColumn = summaryColumns [i]
|
|
--> get the icon and the spell name
|
|
local spellname, _, spellicon = DeathGraphs.GetSpellInfo (spellid)
|
|
summaryColumn.spellName.text = spellname
|
|
|
|
for o = 1, 20 do
|
|
if (summaryColumn.spellName:GetStringWidth() > 80) then
|
|
spellname = strsub (spellname, 1, #spellname-1)
|
|
summaryColumn.spellName.text = spellname
|
|
else
|
|
break
|
|
end
|
|
end
|
|
|
|
summaryColumn.spellName.text = summaryColumn.spellName.text .. ":"
|
|
summaryColumn.spellIcon.texture = spellicon
|
|
summaryColumn.spellIcon.texcoord = CONST_COORDS_NO_BORDER
|
|
--> set the hit amount
|
|
summaryColumn.spellAmount.text = number_format_func (_, amount)
|
|
--> show the widget
|
|
summaryColumn.spellid = spellid
|
|
summaryColumn:Show()
|
|
end
|
|
wipe (t)
|
|
end
|
|
end
|
|
end
|
|
|
|
--> clear the death events and the summary widgets
|
|
function deathPanel.HidePlayerDeathEvents()
|
|
for index, column in ipairs (deathColumns) do
|
|
column:Hide()
|
|
column.spellid = nil
|
|
end
|
|
end
|
|
function deathPanel.HideDeathEventsSummary()
|
|
for index, column in ipairs (summaryColumns) do
|
|
column:Hide()
|
|
column.spellid = nil
|
|
end
|
|
end
|
|
|
|
--hold all player buttons
|
|
local playerButtons = {}
|
|
|
|
--> button on enter and on leave
|
|
local button_onenter = function (self, capsule)
|
|
if (not currentFrame.locked_on_player) then
|
|
deathPanel.ShowPlayerDeath (capsule.player_index)
|
|
end
|
|
--> change the text color
|
|
capsule.textcolor = BUTTON_TEXT_HIGHLIGHT
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLORHIGHLIGHT))
|
|
end
|
|
local button_onleave = function (self, capsule)
|
|
if (not currentFrame.locked_on_player) then
|
|
deathPanel.HidePlayerDeathEvents()
|
|
deathPanel.HideDeathEventsSummary()
|
|
end
|
|
|
|
--> change the text color
|
|
if (not currentFrame.locked_on_player or currentFrame.locked_on_player ~= capsule.player_index) then
|
|
capsule.textcolor = BUTTON_TEXT_COLOR
|
|
else
|
|
capsule.textcolor = BUTTON_TEXT_PRESSED
|
|
end
|
|
|
|
self:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
end
|
|
|
|
--> remove the orange color from a button
|
|
function deathPanel.UnpressButton()
|
|
local oldbutton = currentFrame.locked_on_player
|
|
if (oldbutton) then
|
|
oldbutton = playerButtons [oldbutton]
|
|
if (oldbutton) then
|
|
oldbutton.textcolor = BUTTON_TEXT_COLOR
|
|
end
|
|
end
|
|
end
|
|
|
|
--> button is pressed
|
|
local playerSelected = function (self, button, index)
|
|
deathPanel.UnpressButton()
|
|
|
|
if (not currentFrame.locked_on_player or currentFrame.locked_on_player ~= index) then
|
|
currentFrame.locked_on_player = index
|
|
deathPanel.ShowPlayerDeath (index)
|
|
else
|
|
currentFrame.locked_on_player = nil
|
|
end
|
|
end
|
|
|
|
--> create player selection buttons
|
|
for i = 1, CONST_MAX_DEATH_PLAYERS do
|
|
local button = framework:CreateButton (playerListFrame, playerSelected, 140, 16, "", i, nil, nil, nil, nil, 1)
|
|
button:SetPoint (5, (i-1)*17*-1)
|
|
button.textcolor = BUTTON_TEXT_COLOR
|
|
button.textsize = BUTTON_TEXT_SIZE
|
|
|
|
--on enter leave scripts
|
|
button:SetHook ("OnEnter", button_onenter)
|
|
button:SetHook ("OnLeave", button_onleave)
|
|
|
|
button:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
|
|
button:SetBackdropColor (unpack (BUTTON_BACKGROUND_COLOR))
|
|
|
|
--add to the table
|
|
tinsert (playerButtons, button)
|
|
end
|
|
--> hide all player buttons
|
|
function deathPanel.HideAllPlayerButtons()
|
|
for i = 1, CONST_MAX_DEATH_PLAYERS do
|
|
local button = playerButtons [i]
|
|
button:Hide()
|
|
end
|
|
end
|
|
|
|
local format_time = function (v) return "" .. format ("%02.f", floor (v/60)) .. ":" .. format ("%02.f", v%60) end
|
|
|
|
function playerListFrame.RefreshPlayers()
|
|
--> hide all buttons
|
|
deathPanel.HideAllPlayerButtons()
|
|
|
|
--> get all deaths
|
|
local encounter = currentFrame.current_encounter
|
|
local deaths = encounter.deaths
|
|
|
|
--> get the list of players of this segment and add them to the buttons
|
|
for i = 1, min (CONST_MAX_DEATH_PLAYERS, #deaths) do
|
|
local player = deaths [i]
|
|
local button = playerButtons [i]
|
|
|
|
local playerName = player.name
|
|
playerName = framework:RemoveRealmName (playerName)
|
|
|
|
local s = format_time (player.timeofdeath)
|
|
local color = RAID_CLASS_COLORS [player.class]
|
|
|
|
if (color) then
|
|
button:SetText ("" .. s .. " |c" .. color.colorStr .. playerName .. "|r")
|
|
else
|
|
button:SetText ("" .. s .. " " .. playerName)
|
|
end
|
|
|
|
local _, l, r, t, b = DeathGraphs:GetClassIcon (player.class)
|
|
--button:SetIcon ([[Interface\AddOns\Details\images\classes_small_alpha]], 16, 16, "overlay", {l, r, t, b}, nil, 2, 2)
|
|
button:SetIcon ([[]], 1, 1, "overlay", {l, r, t, b}, nil, 2, 2)
|
|
|
|
button.player_index = i
|
|
|
|
button:Show()
|
|
end
|
|
end
|
|
|
|
function currentFrame.OnResetAllData()
|
|
DeathGraphsCurrentFrameDeathsDeathTimeline.HidePlayerDeathEvents()
|
|
DeathGraphsCurrentFrameDeathsDeathTimeline.HideDeathEventsSummary()
|
|
DeathGraphsCurrentFrameDeathsDeathTimeline.HideAllPlayerButtons()
|
|
end
|
|
|
|
--refresh the panel
|
|
function currentFrame.Refresh (index)
|
|
|
|
deathPanel.UnpressButton()
|
|
|
|
local encounter = DeathGraphs.current_database [index]
|
|
if (encounter) then
|
|
--encounter found
|
|
currentFrame.current_encounter = encounter
|
|
|
|
--refresh the list of players
|
|
playerListFrame.RefreshPlayers()
|
|
--clear the graphic (if any)
|
|
deathPanel.HidePlayerDeathEvents()
|
|
deathPanel.HideDeathEventsSummary()
|
|
|
|
--clear player selection
|
|
currentFrame.locked_on_player = nil
|
|
else
|
|
--encounter doesn't exist
|
|
segment_dropdown:Refresh()
|
|
end
|
|
end
|
|
|
|
currentFrame:SetScript ("OnShow", function (self)
|
|
segment_dropdown:Refresh()
|
|
segment_dropdown:Select (1, true)
|
|
OnSelectEncounter (_, _, 1)
|
|
end)
|
|
|
|
------------------------------------------------------------------------------------------------------------------------------------
|
|
--> search keys: ~timeline
|
|
--> graphic of enemy abilities and players deaths
|
|
|
|
local CONST_TIMELINE_WIGHT = 905
|
|
local CONST_TIMELINE_HEIGHT = 505
|
|
|
|
local deathAbilityGraph = CreateFrame ("frame", "DeathGraphsPlayerGraphicDeaths", f, "BackdropTemplate")
|
|
deathAbilityGraph:SetPoint ("topleft", 10, -50)
|
|
deathAbilityGraph:SetSize (CONST_TIMELINE_WIGHT, CONST_TIMELINE_HEIGHT)
|
|
|
|
f.deathAbilityGraph = deathAbilityGraph
|
|
|
|
--> dropdown:
|
|
|
|
local boss_label = framework:NewLabel (deathAbilityGraph, nil, "$parentBossLabel", nil, "Boss Encounter:", "GameFontNormal")
|
|
local OnSelectBossEncounter = function (_, _, type)
|
|
--> selected the segment
|
|
deathAbilityGraph.Refresh (type)
|
|
end
|
|
|
|
local build_boss_menu = function()
|
|
local list = {}
|
|
local db = DeathGraphs.graph_database
|
|
|
|
--> hierarchy for the graph
|
|
-- Database -> [combat hash (EncounterId + Boss Diff Id)] = DataTable hash{ }
|
|
-- DataTable = { .deaths = hash{}, .spells = hash{}, .ids = hash{} }
|
|
|
|
for hash, infoTable in pairs (db) do
|
|
|
|
local EI, diff = hash:match ("(%d%d%d%d.-)(%d%d)")
|
|
EI, diff = tonumber (EI), tonumber (diff)
|
|
|
|
local mapId = DeathGraphs:GetInstanceIdFromEncounterId (EI)
|
|
|
|
if (mapId) then
|
|
|
|
local diffName = DeathGraphs:GetEncounterDiffString (diff) or ""
|
|
|
|
local bossDetails, bossIndex = DeathGraphs:GetBossEncounterDetailsFromEncounterId (mapId, EI)
|
|
local bossName = DeathGraphs:GetBossName (mapId, bossIndex)
|
|
|
|
local L, R, T, B, icon = DeathGraphs:GetBossIcon (mapId, bossIndex)
|
|
|
|
if (not bossName) then
|
|
bossName = "Unknown Boss"
|
|
end
|
|
|
|
local latestTime = 0
|
|
local spellTable = infoTable.spells
|
|
|
|
for spellName, spellTimers in pairs (spellTable) do
|
|
for index, spell in ipairs (spellTimers) do
|
|
local combatTime, timeAt = unpack (spell)
|
|
if (timeAt > latestTime) then
|
|
latestTime = timeAt
|
|
end
|
|
end
|
|
end
|
|
|
|
tinsert (list, {value = hash, label = bossName .. " (" .. diffName .. ")", onclick = OnSelectBossEncounter, icon = icon, texcoord = {L, R, T, B}, when = latestTime})
|
|
end
|
|
end
|
|
|
|
table.sort (list, function (t1, t2) return t1.when > t2.when end)
|
|
|
|
return list
|
|
end
|
|
|
|
local boss_dropdown = framework:NewDropDown (deathAbilityGraph, nil, "$parentBossDropdown", "BossDropdown", 150, 20, build_boss_menu, 1, options_dropdown_template)
|
|
boss_label:SetPoint ("topleft", deathAbilityGraph, "topleft", 0, 1)
|
|
boss_dropdown:SetPoint ("topleft", boss_label, "bottomleft", 0, -5)
|
|
|
|
function boss_dropdown:SelectLastEncounter()
|
|
local currentCombat = Details:GetCurrentCombat()
|
|
if (currentCombat) then
|
|
if (currentCombat.is_boss) then
|
|
--> get the map index
|
|
local mapID = currentCombat.is_boss.mapid
|
|
--> get the boss index within the raid
|
|
local bossIndex = Details:GetBossIndex (mapID, currentCombat.is_boss.id, nil, currentCombat.is_boss.name)
|
|
if (bossIndex) then
|
|
--> get the EJID
|
|
local EJID = Details.EncounterInformation [mapID] and _detalhes.EncounterInformation [mapID].encounter_ids [bossIndex]
|
|
if (EJID) then
|
|
--> if the EJID exists build the hash
|
|
local bossDificulty = currentCombat.is_boss.diff
|
|
local hash = tostring (EJID) .. tostring (bossDificulty)
|
|
if (hash) then
|
|
boss_dropdown:Select (hash)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
--> graph frame:
|
|
local graphFrame = CreateFrame ("frame", "DeathGraphsPlayerGraphicDeaths_graphFrame", deathAbilityGraph, "BackdropTemplate")
|
|
|
|
graphFrame.Width = 738
|
|
graphFrame.Height = 516
|
|
graphFrame.LineHeight = 440 --> how hight the death bars goes
|
|
graphFrame.LineWidth = 900 --> width of spellbars
|
|
graphFrame.MaxSpellLines = 25 --> max os spell lines, they auto resize the height according to the amount shown
|
|
graphFrame.SpellBlockAlpha = 0.3 --> the alpha of the little red spell blocks
|
|
graphFrame.SpellLineBackground = {.5, .5, .5, .3} --> spell line default color
|
|
graphFrame.SpellLineBackgroundHighlight = {.5, .5, .5, .8} --> color when hover over a spell line
|
|
|
|
graphFrame:SetPoint ("topleft", deathAbilityGraph, "topleft", 170, 0)
|
|
graphFrame:SetSize (graphFrame.Width, graphFrame.Height)
|
|
graphFrame:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
|
|
graphFrame:SetBackdropColor (0, 0, 0, 0)
|
|
|
|
--> death lines
|
|
local deathLinesFrame = CreateFrame ("frame", "DeathGraphsPlayerGraphicDeaths_deathLinesFrame", graphFrame, "BackdropTemplate")
|
|
deathLinesFrame:SetFrameLevel (graphFrame:GetFrameLevel()+4)
|
|
|
|
--> spells lines
|
|
local spellLinesFrame = CreateFrame ("frame", "DeathGraphsPlayerGraphicDeaths_spellLinesFrame", graphFrame, "BackdropTemplate")
|
|
spellLinesFrame:SetPoint ("topright", graphFrame, "topleft")
|
|
spellLinesFrame:SetPoint ("bottomright", graphFrame, "bottomleft")
|
|
spellLinesFrame:SetWidth (160)
|
|
spellLinesFrame:SetFrameLevel (graphFrame:GetFrameLevel()+1)
|
|
|
|
--> tutorial text
|
|
local whiteLine = graphFrame:CreateTexture (nil, "overlay")
|
|
whiteLine:SetColorTexture (1, 1, 1, .7)
|
|
whiteLine:SetSize (6, 20)
|
|
whiteLine:SetPoint ("topleft", deathAbilityGraph, "topleft", 0, -55)
|
|
|
|
local tutorialLabel1 = framework:CreateLabel (graphFrame)
|
|
tutorialLabel1:SetPoint ("left", whiteLine, "right", 4, 1)
|
|
tutorialLabel1.text = "White vertical lines are\noccurences of deaths during tries"
|
|
|
|
local redBlock = graphFrame:CreateTexture (nil, "overlay")
|
|
redBlock:SetColorTexture (1, .2, .2, .7)
|
|
redBlock:SetSize (6, 20)
|
|
redBlock:SetPoint ("topleft", deathAbilityGraph, "topleft", 0, -85)
|
|
|
|
local tutorialLabel2 = framework:CreateLabel (graphFrame)
|
|
tutorialLabel2:SetPoint ("left", redBlock, "right", 4, 1)
|
|
tutorialLabel2.text = "Red squares are occurences\nof enemy spells"
|
|
|
|
local y = -100
|
|
graphFrame.SpellsLines = {}
|
|
|
|
local spellLineOnEnter = function (self)
|
|
--> show the spell tooltip when hover over the line
|
|
GameTooltip:SetOwner (self, "ANCHOR_TOPLEFT")
|
|
GameTooltip:SetSpellByID (self.spellid)
|
|
self:SetBackdropColor (unpack (graphFrame.SpellLineBackgroundHighlight))
|
|
GameTooltip:Show()
|
|
end
|
|
local spellLineOnLeave = function (self)
|
|
self:SetBackdropColor (unpack (graphFrame.SpellLineBackground))
|
|
GameTooltip:Hide()
|
|
end
|
|
|
|
--> get a spell block for the giving line spell
|
|
local getSpellBlock = function (self)
|
|
--get an already existing block
|
|
local block = self.SpellBlocks [self.NextSpellBlock]
|
|
if (block) then
|
|
self.NextSpellBlock = self.NextSpellBlock + 1
|
|
return block
|
|
end
|
|
|
|
--create a new block
|
|
block = self:CreateTexture (nil, "overlay") --no framework
|
|
block:SetColorTexture (1, 0, 0, graphFrame.SpellBlockAlpha)
|
|
self.SpellBlocks [self.NextSpellBlock] = block
|
|
self.NextSpellBlock = self.NextSpellBlock + 1
|
|
return block
|
|
end
|
|
|
|
local setSpellBlockPosition = function (self, block, time)
|
|
local startTime = graphFrame.currentStartTime
|
|
local endTime = graphFrame.currentEndTime
|
|
|
|
--> get the position
|
|
time = time - startTime
|
|
local pixelSize = graphFrame.pixelPerSecond
|
|
local where = time * pixelSize
|
|
|
|
--> how large is the block
|
|
local blockWidth = graphFrame.spellBlockWidth
|
|
|
|
block:SetPoint ("topleft", self, "topleft", 170 + where, 0)
|
|
block:SetPoint ("bottomright", self, "bottomleft", 170 + where + blockWidth, 0)
|
|
block:Show()
|
|
end
|
|
|
|
--> reset the spell block counter and hide all spell blocks
|
|
local resetSpellBlocks = function (self)
|
|
for i = 1, #self.SpellBlocks do
|
|
self.SpellBlocks[i]:Hide()
|
|
end
|
|
self.icon.texture = ""
|
|
self.label.text = ""
|
|
self.NextSpellBlock = 1
|
|
end
|
|
|
|
--> set the spell name and icon
|
|
local texcoord = {5/64, 59/64, 5/64, 59/64}
|
|
local setIconAndSpell = function (self)
|
|
--> spellid is a member .spellid
|
|
local spellname, _, icon = DeathGraphs.GetSpellInfo (self.spellid)
|
|
self.icon.texture = icon
|
|
self.icon.texcoord = texcoord
|
|
self.label.text = spellname
|
|
end
|
|
|
|
function graphFrame.ResetAllSpellLines()
|
|
for i = 1, #graphFrame.SpellsLines do
|
|
local line = graphFrame.SpellsLines[i]
|
|
line:ResetSpell()
|
|
line:Hide()
|
|
end
|
|
for i = 1, #graphFrame.DeathLines do
|
|
local line = graphFrame.DeathLines[i]
|
|
line:Hide()
|
|
end
|
|
end
|
|
|
|
--> create the spell labels on the left side of the frame
|
|
for i = 1, graphFrame.MaxSpellLines do
|
|
local line = CreateFrame ("frame", nil, spellLinesFrame, "BackdropTemplate")
|
|
|
|
line:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
|
|
line:SetBackdropColor (unpack (graphFrame.SpellLineBackground))
|
|
|
|
line:SetSize (graphFrame.LineWidth, 25)
|
|
line:SetScript ("OnEnter", spellLineOnEnter)
|
|
line:SetScript ("OnLeave", spellLineOnLeave)
|
|
line.spellid = 1
|
|
line.SpellBlocks = {}
|
|
line.ResetSpell = resetSpellBlocks
|
|
line.GetSpellBlock = getSpellBlock
|
|
line.SetIconAndSpellName = setIconAndSpell
|
|
line.SetSpellBlockPositionInTime = setSpellBlockPosition
|
|
line.NextSpellBlock = 1
|
|
local label = framework:CreateLabel (line)
|
|
local icon = framework:CreateImage (line, nil, 22, 22)
|
|
icon:SetPoint ("left", line, "left", 2, 0)
|
|
label:SetPoint ("left", icon, "right", 2, 0)
|
|
line.icon = icon
|
|
line.label = label
|
|
line:Hide()
|
|
tinsert (graphFrame.SpellsLines, line)
|
|
end
|
|
|
|
--> death lines
|
|
graphFrame.DeathLines = {}
|
|
|
|
--> time line
|
|
local timeLine = CreateFrame ("frame", nil, graphFrame, "BackdropTemplate")
|
|
timeLine:SetPoint ("bottomleft", graphFrame, "bottomleft", 0, 0)
|
|
timeLine:SetPoint ("bottomright", graphFrame, "bottomright", 6, 0)
|
|
timeLine:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
|
|
timeLine:SetBackdropColor (0, 0, 0, .4)
|
|
timeLine:SetHeight (20)
|
|
local timeLineExtension = CreateFrame ("frame", nil, graphFrame, "BackdropTemplate")
|
|
timeLineExtension:SetPoint ("right", timeLine, "left", 0, 0)
|
|
timeLineExtension:SetWidth (178)
|
|
timeLineExtension:SetBackdrop ({bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16})
|
|
timeLineExtension:SetBackdropColor (0, 0, 0, .4)
|
|
timeLineExtension:SetHeight (20)
|
|
|
|
timeLine.Labels = {}
|
|
--> build timeline labels
|
|
for i = 1, 20 do
|
|
local label = framework:CreateLabel (timeLine)
|
|
tinsert (timeLine.Labels, label)
|
|
label:SetPoint ("bottomleft", timeLine, "bottomleft", (i-1) * 37, 4)
|
|
label.text = "00:00"
|
|
end
|
|
|
|
--> cut off events by time
|
|
local OnSelectTimeCutOff = function (_, _, time)
|
|
DeathGraphs.db.timeline_cutoff_time = time
|
|
if (deathAbilityGraph.LastBoss) then
|
|
deathAbilityGraph.Refresh (deathAbilityGraph.LastBoss)
|
|
else
|
|
--print ("boss not found")
|
|
end
|
|
end
|
|
local timeCutOffMenu = {
|
|
{value = 1, label = "Last 30 Minutes", onclick = OnSelectTimeCutOff},
|
|
{value = 2, label = "Last 1 Hours", onclick = OnSelectTimeCutOff},
|
|
{value = 3, label = "Last 2 Hours", onclick = OnSelectTimeCutOff},
|
|
{value = 4, label = "Last 3 Hours", onclick = OnSelectTimeCutOff},
|
|
{value = 5, label = "Last 4 Hours", onclick = OnSelectTimeCutOff},
|
|
{value = 6, label = "Last 5 Hours", onclick = OnSelectTimeCutOff},
|
|
{value = 7, label = "Everything", onclick = OnSelectTimeCutOff},
|
|
}
|
|
local build_events_by_time_menu = function()
|
|
return timeCutOffMenu
|
|
end
|
|
|
|
local events_by_time_label = framework:NewLabel (deathLinesFrame, nil, "$parentEventsByTimeLabel", nil, "Time Sample:", "GameFontNormal")
|
|
local events_by_time_dropdown = framework:NewDropDown (deathLinesFrame, nil, "$parentEventsByTimeDropdown", "EventsByTimeDropdown", 150, 20, build_events_by_time_menu, 1, options_dropdown_template)
|
|
events_by_time_label:SetPoint ("topleft", deathAbilityGraph, "topleft", 170, 1)
|
|
events_by_time_dropdown:SetPoint ("topleft", events_by_time_label, "bottomleft", 0, -5)
|
|
--> set the default value from the database
|
|
events_by_time_dropdown:Select (DeathGraphs.db.timeline_cutoff_time, true)
|
|
|
|
--> erase events by time
|
|
local OnSelectEraseTimeCutOff = function (_, _, time)
|
|
DeathGraphs.db.timeline_cutoff_delete_time = time
|
|
end
|
|
|
|
local EraseTimeCutOffMenu = {
|
|
{value = 1, label = "Older Than 30 Minutes", onclick = OnSelectEraseTimeCutOff},
|
|
{value = 2, label = "Older Than 1 Hours", onclick = OnSelectEraseTimeCutOff},
|
|
{value = 3, label = "Older Than 2 Hour", onclick = OnSelectEraseTimeCutOff},
|
|
{value = 4, label = "Older Than 3 Hour", onclick = OnSelectEraseTimeCutOff},
|
|
{value = 5, label = "Older Than 4 Hour", onclick = OnSelectEraseTimeCutOff},
|
|
{value = 6, label = "Older Than 5 Hour", onclick = OnSelectEraseTimeCutOff},
|
|
{value = 7, label = "Everything", onclick = OnSelectEraseTimeCutOff},
|
|
}
|
|
local build_erase_events_by_time_menu = function()
|
|
return EraseTimeCutOffMenu
|
|
end
|
|
|
|
local erase_events_by_time_label = framework:NewLabel (deathLinesFrame, nil, "$parentErase_EventsByTimeLabel", nil, "Erase Samples:", "GameFontNormal")
|
|
local erase_events_by_time_dropdown = framework:NewDropDown (deathLinesFrame, nil, "$parentErase_EventsByTimeDropdown", "Erase_EventsByTimeDropdown", 170, 20, build_erase_events_by_time_menu, 1, options_dropdown_template)
|
|
erase_events_by_time_label:SetPoint ("topleft", deathAbilityGraph, "topleft", 350, 1)
|
|
erase_events_by_time_dropdown:SetPoint ("topleft", erase_events_by_time_label, "bottomleft", 0, -5)
|
|
--> set the default value
|
|
erase_events_by_time_dropdown:Select (DeathGraphs.db.timeline_cutoff_delete_time, true)
|
|
|
|
local erase_by_time = function()
|
|
deathAbilityGraph.EraseByTime (DeathGraphs.db.timeline_cutoff_delete_time)
|
|
end
|
|
local confirm_erase_button = framework:NewButton (deathAbilityGraph, _, "$parentEraseEventsByTimeButton", "EraseEventsByTimeButton", 70, mode_buttons_height, erase_by_time, nil, nil, nil, "Erase", 1, options_dropdown_template)
|
|
confirm_erase_button:SetPoint ("left", erase_events_by_time_dropdown, "right", 2, 0)
|
|
|
|
function timeLine.ResetTimeline()
|
|
for i = 1, 20 do
|
|
local label = timeLine.Labels [i]
|
|
label.text = "00:00"
|
|
end
|
|
end
|
|
|
|
--> update the bottom time elapsed line
|
|
function timeLine.UpdateTimers (length)
|
|
if (length <= 0) then
|
|
timeLine.ResetTimeline()
|
|
return
|
|
end
|
|
|
|
local interval = length / 20
|
|
local startTime = graphFrame.currentStartTime - graphFrame.currentStartTimeDiff
|
|
startTime = max (0, startTime)
|
|
|
|
--print ("interval", interval, "startTime", startTime)
|
|
|
|
for i = 1, 20 do
|
|
local time = floor (interval * i) + startTime
|
|
local label = timeLine.Labels [i]
|
|
label.text = format_time (time)
|
|
end
|
|
end
|
|
|
|
--> update the graphic lines to fit in the time of the encounter
|
|
function graphFrame.SetTimePeriod()
|
|
|
|
local startTime, endTime = graphFrame.currentStartTime, graphFrame.currentEndTime
|
|
|
|
local deathLines = graphFrame.DeathLines
|
|
|
|
--> how many lines we will need
|
|
local length = endTime - startTime
|
|
--> update the bottom time elapsed bar (timeline)
|
|
timeLine.UpdateTimers (length)
|
|
--> we want integers to iterate on the for loop
|
|
local lengthFloor = floor (length)
|
|
graphFrame.timePeriod = lengthFloor
|
|
|
|
--> create the required lines
|
|
for i = #deathLines + 1, lengthFloor do
|
|
local newLine = deathLinesFrame:CreateTexture (nil, "overlay") --no framework here
|
|
newLine:SetColorTexture (.7, .7, .7)
|
|
deathLines [i] = newLine
|
|
end
|
|
|
|
--> format size and set point
|
|
local width = graphFrame.Width / length
|
|
for i = 1, lengthFloor do
|
|
local line = deathLines [i]
|
|
line:SetWidth (width)
|
|
line:SetPoint ("bottomleft", graphFrame, "bottomleft", (i-1)*width, 20)
|
|
--> reset the height
|
|
line:SetHeight (0)
|
|
end
|
|
|
|
--> hide all lines
|
|
for i = 1, #deathLines do
|
|
deathLines [i]:Hide()
|
|
end
|
|
end
|
|
|
|
--> get the time to filter events
|
|
function deathAbilityGraph.GetTimeToCutOff (cutoff_override)
|
|
local now = time()
|
|
local time_cutoff = cutoff_override or DeathGraphs.db.timeline_cutoff_time
|
|
local cutoff
|
|
|
|
if (time_cutoff == 1) then --30m
|
|
cutoff = now - 1800
|
|
elseif (time_cutoff == 2) then --1h
|
|
cutoff = now - 3600
|
|
elseif (time_cutoff == 3) then --2h
|
|
cutoff = now - (3600*2)
|
|
elseif (time_cutoff == 4) then --3h
|
|
cutoff = now - (3600*3)
|
|
elseif (time_cutoff == 5) then --4h
|
|
cutoff = now - (3600*4)
|
|
elseif (time_cutoff == 6) then --5h
|
|
cutoff = now - (3600*5)
|
|
elseif (time_cutoff == 7) then --everything
|
|
cutoff = 0
|
|
end
|
|
|
|
return cutoff
|
|
end
|
|
|
|
--> erase spells and deaths
|
|
local CurrentBossTable
|
|
function deathAbilityGraph.EraseByTime (t)
|
|
if (CurrentBossTable) then
|
|
local bossTable = CurrentBossTable
|
|
local cutoffTime = deathAbilityGraph.GetTimeToCutOff (t)
|
|
if (t == 7) then
|
|
cutoffTime = time()
|
|
end
|
|
|
|
for second, deaths in pairs (bossTable.deaths) do
|
|
for i = #deaths, 1, -1 do
|
|
local deathTime = deaths [i]
|
|
if (deathTime < cutoffTime) then
|
|
tremove (deaths, i)
|
|
end
|
|
end
|
|
end
|
|
|
|
if (deathAbilityGraph.LastBoss) then
|
|
deathAbilityGraph.Refresh (deathAbilityGraph.LastBoss)
|
|
else
|
|
--print ("boss not found")
|
|
end
|
|
else
|
|
--print ("CurrentBossTable not found")
|
|
end
|
|
end
|
|
|
|
--> build the graphic
|
|
function deathAbilityGraph.BuildGraph (bossTable)
|
|
|
|
CurrentBossTable = bossTable
|
|
|
|
local startTime, endTime = 9999, 0
|
|
local highestDeathStack = 0
|
|
|
|
local cutoffTime = deathAbilityGraph.GetTimeToCutOff()
|
|
|
|
--> get the start and end time
|
|
for second, deaths in pairs (bossTable.deaths) do
|
|
local validStackOfDeaths = 0
|
|
for i, deathTime in ipairs (deaths) do
|
|
if (deathTime > cutoffTime) then
|
|
validStackOfDeaths = validStackOfDeaths + 1
|
|
end
|
|
end
|
|
|
|
if (validStackOfDeaths > 0) then
|
|
--> check if the time of this death is lower than all other deaths
|
|
if (second < startTime) then
|
|
startTime = second
|
|
end
|
|
--> check if the time of this death is higher than all other deaths
|
|
if (second > endTime) then
|
|
endTime = second
|
|
end
|
|
--> check if this 'second' has more deaths
|
|
local deathStack = validStackOfDeaths
|
|
if (highestDeathStack < deathStack) then
|
|
highestDeathStack = deathStack
|
|
end
|
|
end
|
|
end
|
|
|
|
--> startTimeDiff is the size of the space added before startTime, saving this value to be able to get the line of the death second.
|
|
local startTimeDiff
|
|
if (startTime > 20) then
|
|
startTime = startTime - 20
|
|
startTimeDiff = 20
|
|
else
|
|
startTimeDiff = startTime - 1
|
|
startTime = 1
|
|
end
|
|
|
|
--> add a little of space after the last death
|
|
endTime = endTime + 20
|
|
|
|
--> save the start and end time state inte the graph
|
|
graphFrame.currentStartTime = startTime
|
|
graphFrame.currentStartTimeDiff = startTimeDiff
|
|
graphFrame.currentEndTime = endTime
|
|
|
|
--> set the graph width and the time period / hide all lines
|
|
graphFrame.SetTimePeriod()
|
|
--> timePeriod = total of secods between start and end time, also the total of lines shown in the graph
|
|
local timePeriod = graphFrame.timePeriod
|
|
|
|
--> calculate how much in time value one pixel
|
|
local pixelPerSecond = graphFrame.Width / timePeriod
|
|
graphFrame.pixelPerSecond = pixelPerSecond
|
|
|
|
--> calculate the width of each spell block
|
|
local spellBlockWidth = graphFrame.Width / timePeriod * 3.5
|
|
graphFrame.spellBlockWidth = spellBlockWidth
|
|
|
|
--> build the spells and set them into the spells frame
|
|
local spellFrameIndex = 1
|
|
graphFrame.ResetAllSpellLines()
|
|
|
|
for spellName, indexSpellTable in pairs (bossTable.spells) do
|
|
--> get the next available spellLine
|
|
local spellId = bossTable.ids [spellName]
|
|
local spellLine = graphFrame.SpellsLines [spellFrameIndex]
|
|
--> set the spellid for internal functions
|
|
spellLine.spellid = spellId
|
|
--> hide all block, clear name and icon
|
|
spellLine:ResetSpell()
|
|
--> set the name and icon from the spellLine.spellid
|
|
spellLine:SetIconAndSpellName()
|
|
|
|
--> show the spell block timers in the line
|
|
for index, spellTable in ipairs (indexSpellTable) do
|
|
local combatTime, time = unpack (spellTable)
|
|
if (time > cutoffTime) then
|
|
--> cut off all spells casted before the first death and after the last death
|
|
if (combatTime >= startTime and combatTime <= endTime-10) then
|
|
--> get the next available block
|
|
local spellBlock = spellLine:GetSpellBlock()
|
|
--> set it's position in the graph
|
|
spellLine:SetSpellBlockPositionInTime (spellBlock, combatTime)
|
|
end
|
|
end
|
|
end
|
|
|
|
spellLine:Show()
|
|
|
|
--> limit the shown spells in - graphFrame.MaxSpellLines (default 20)
|
|
spellFrameIndex = spellFrameIndex + 1
|
|
if (spellFrameIndex > graphFrame.MaxSpellLines) then
|
|
break
|
|
end
|
|
end
|
|
|
|
--> total of spell lines shown is
|
|
local totalOfSpellLinesShown = spellFrameIndex - 1
|
|
|
|
--> set the height of all spellLines shown
|
|
local spellLinesY = 16 --to be defined
|
|
--> get the size of the lines
|
|
local height = 326 / totalOfSpellLinesShown --256 estimativa
|
|
--> limit the line height in 20 pixels
|
|
height = min (20, height)
|
|
--height = 20
|
|
|
|
--> build the spellLines height
|
|
for i = 1, totalOfSpellLinesShown do
|
|
local spellLine = graphFrame.SpellsLines [i]
|
|
spellLine:SetPoint ("bottomleft", deathAbilityGraph, "bottomleft", 0, spellLinesY)
|
|
spellLine:SetHeight (height)
|
|
spellLine.icon:SetSize (height, height)
|
|
spellLinesY = spellLinesY + height + 1
|
|
end
|
|
|
|
--> build the death lines height
|
|
for second, deaths in pairs (bossTable.deaths) do
|
|
--> get the line, we need to subtract the 'second' with startTime
|
|
local line = graphFrame.DeathLines [second - startTime] -- + 1 - startTimeDiff
|
|
if (not line) then
|
|
--print ("ADL:TimeLine) Line not found.") --debug
|
|
else
|
|
local validStackOfDeaths = 0
|
|
for i, deathTime in ipairs (deaths) do
|
|
if (deathTime > cutoffTime) then
|
|
validStackOfDeaths = validStackOfDeaths + 1
|
|
end
|
|
end
|
|
|
|
if (validStackOfDeaths > 0) then
|
|
--> amount of deaths on this 'second'
|
|
local deathStack = validStackOfDeaths
|
|
--> percent comparent within the highest deaths on a single second
|
|
local percent = deathStack / highestDeathStack
|
|
--> set the line height
|
|
line:SetHeight (graphFrame.LineHeight * percent)
|
|
line:Show()
|
|
end
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
function deathAbilityGraph.OnResetAllData()
|
|
graphFrame.ResetAllSpellLines()
|
|
timeLine.ResetTimeline()
|
|
end
|
|
|
|
--> refresh the main frame:
|
|
function deathAbilityGraph.Refresh (boss)
|
|
local db = DeathGraphs.graph_database
|
|
local bossTable = db [boss]
|
|
|
|
if (bossTable) then
|
|
deathAbilityGraph.LastBoss = boss
|
|
deathAbilityGraph.BuildGraph (bossTable)
|
|
end
|
|
end
|
|
|
|
--> OnShow Timeline - refresh the dropdown and show the first boss // should be show the last boss
|
|
deathAbilityGraph:SetScript ("OnShow", function (self)
|
|
boss_dropdown:Refresh()
|
|
|
|
boss_dropdown:Select (1, true)
|
|
boss_dropdown:SelectLastEncounter()
|
|
|
|
local currentValue = boss_dropdown:GetValue()
|
|
|
|
if (type (currentValue) == "string") then
|
|
OnSelectBossEncounter (_, _, currentValue)
|
|
end
|
|
end)
|
|
|
|
end
|
|
|
|
end
|
|
--doo
|