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.

417 lines
17 KiB

local addonId, edTable = ...
local Details = _G._detalhes
local AceLocale = LibStub("AceLocale-3.0")
local Loc = AceLocale:GetLocale("Details_EncounterDetails")
local Graphics = LibStub:GetLibrary("LibGraph-2.0")
local ipairs = ipairs
local _GetSpellInfo = Details.getspellinfo
local unpack = unpack
local detailsFramework = DetailsFramework
local CreateFrame = CreateFrame
local GameCooltip = GameCooltip
local GameTooltip = GameTooltip
local wipe = table.wipe
local _
local encounterDetails = _G.EncounterDetailsGlobal
local edFrame = encounterDetails.Frame
edFrame.EnemySpellsWidgets = {}
local CONST_MAX_AURA_LINES = 21
local aurasButtonTemplate = {
backdrop = {edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true},
backdropcolor = {.3, .3, .3, .5},
onentercolor = {1, 1, 1, .5},
backdropbordercolor = {0, 0, 0, 1},
}
local spell_blocks = {}
local bossmods_blocks = {}
local on_focus_gain = function(self)
self:HighlightText()
end
local on_focus_lost = function(self)
self:HighlightText(0, 0)
end
local on_enter_spell = function(self)
if (self.MyObject._spellid) then
GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT")
if (type(self.MyObject._spellid) == "string") then
local spellId = self.MyObject._spellid:gsub("%a", "")
spellId = tonumber(spellId)
if (spellId) then
GameTooltip:SetSpellByID(spellId)
end
else
GameTooltip:SetSpellByID(self.MyObject._spellid)
end
GameTooltip:Show()
self:SetBackdropColor(1, 1, 1, .5)
self:SetBackdropBorderColor(0, 0, 0, 1)
return true
end
end
local on_leave_spell = function(self, capsule)
GameTooltip:Hide()
self:SetBackdropColor(.3, .3, .3, .5)
end
local create_aura_func = function(self, button, spellid, encounter_id)
local name, _, icon = encounterDetails.getspellinfo(spellid)
encounterDetails:OpenAuraPanel(spellid, name, self and self.MyObject._icon.texture, encounter_id)
end
local info_onenter = function(self)
local spellid = self._spellid
local info = encounterDetails.EnemySpellPool[spellid]
if (info) then
Details:CooltipPreset(2)
GameCooltip:SetOption("FixedWidth", false)
for token, _ in pairs(info.token) do
GameCooltip:AddLine("event:", token, 1, nil, "white")
end
GameCooltip:AddLine("source:", info.source, 1, nil, "white")
GameCooltip:AddLine("school:", encounterDetails:GetSpellSchoolFormatedName(info.school), 1, nil, "white")
if (info.type) then
GameCooltip:AddLine("aura type:", info.type, 1, nil, "white")
end
GameCooltip:ShowCooltip(self, "tooltip")
end
self:SetBackdropColor(1, 1, 1, .5)
end
local info_onleave = function(self)
GameCooltip:Hide()
self:SetBackdropColor(.3, .3, .3, .5)
end
local bossModsTitle = detailsFramework:CreateLabel(edFrame, "Boss Mods Time Bars:", 12, "orange")
bossModsTitle:SetPoint(10, -85)
table.insert(edFrame.EnemySpellsWidgets, bossModsTitle)
bossModsTitle:Hide()
local bossSpellsTitle = detailsFramework:CreateLabel(edFrame, "Boss Spells and Auras:", 12, "orange")
bossSpellsTitle:SetPoint(444, -85)
table.insert(edFrame.EnemySpellsWidgets, bossSpellsTitle)
bossSpellsTitle:Hide()
--create boss mods list
for i = 1, CONST_MAX_AURA_LINES do
local anchor_frame = CreateFrame("frame", "BossFrameBossModsAnchor" .. i, edFrame, "BackdropTemplate")
local spellicon = detailsFramework:NewImage(anchor_frame, [[Interface\ICONS\TEMP]], 19, 19, "background", nil, "icon", "$parentIcon")
--timerId
local spellid = detailsFramework:CreateTextEntry(anchor_frame, encounterDetails.empty_function, 80, 20, nil, "$parentSpellId")
spellid:SetTemplate(aurasButtonTemplate)
spellid:SetHook("OnEditFocusGained", on_focus_gain)
spellid:SetHook("OnEditFocusLost", on_focus_lost)
spellid:SetHook("OnEnter", on_enter_spell)
spellid:SetHook("OnLeave", on_leave_spell)
--ability name
local spellname = detailsFramework:CreateTextEntry(anchor_frame, encounterDetails.empty_function, 180, 20, nil, "$parentSpellName")
spellname:SetTemplate(aurasButtonTemplate)
spellname:SetHook("OnEditFocusGained", on_focus_gain)
spellname:SetHook("OnEditFocusLost", on_focus_lost)
spellname:SetHook("OnEnter", on_enter_spell)
spellname:SetHook("OnLeave", on_leave_spell)
local create_aura = detailsFramework:NewButton(anchor_frame, nil, "$parentCreateAuraButton", "AuraButton", 90, 18, create_aura_func, nil, nil, nil, "Make Aura")
create_aura:SetTemplate(aurasButtonTemplate)
spellicon:SetPoint("topleft", edFrame, "topleft", 10, -85 +(i * 21 * -1))
spellid:SetPoint("left", spellicon, "right", 4, 0)
spellname:SetPoint("left", spellid, "right", 4, 0)
create_aura:SetPoint("left", spellname, "right", 4, 0)
spellid:SetBackdropBorderColor(0, 0, 0)
spellname:SetBackdropBorderColor(0, 0, 0)
anchor_frame.icon = spellicon
anchor_frame.spellid = spellid
anchor_frame.spellname = spellname
anchor_frame.aurabutton = create_aura
anchor_frame.aurabutton._icon = spellicon
table.insert(bossmods_blocks, anchor_frame)
table.insert(edFrame.EnemySpellsWidgets, anchor_frame)
anchor_frame:Hide()
end
--create buff list
for i = 1, CONST_MAX_AURA_LINES do
local anchor_frame = CreateFrame("frame", "BossFrameSpellAnchor" .. i, edFrame, "BackdropTemplate")
local spellicon = detailsFramework:NewImage(anchor_frame, [[Interface\ICONS\TEMP]], 19, 19, "background", nil, "icon", "$parentIcon")
local spellid = detailsFramework:CreateTextEntry(anchor_frame, encounterDetails.empty_function, 80, 20)
spellid:SetTemplate(aurasButtonTemplate)
spellid:SetHook("OnEditFocusGained", on_focus_gain)
spellid:SetHook("OnEditFocusLost", on_focus_lost)
spellid:SetHook("OnEnter", on_enter_spell)
spellid:SetHook("OnLeave", on_leave_spell)
local spellname = detailsFramework:CreateTextEntry(anchor_frame, encounterDetails.empty_function, 160, 20)
spellname:SetTemplate(aurasButtonTemplate)
spellname:SetHook("OnEditFocusGained", on_focus_gain)
spellname:SetHook("OnEditFocusLost", on_focus_lost)
spellname:SetHook("OnEnter", on_enter_spell)
spellname:SetHook("OnLeave", on_leave_spell)
--spellicon_button:SetPoint("topleft", BossFrame, "topleft", 255, -65 +(i * 21 * -1))
spellicon:SetPoint("topleft", edFrame, "topleft", 443, -85 +(i * 21 * -1))
spellid:SetPoint("left", spellicon, "right", 4, 0)
spellname:SetPoint("left", spellid, "right", 4, 0)
local spellinfo = CreateFrame("frame", nil, anchor_frame,"BackdropTemplate")
spellinfo:SetBackdrop({edgeFile = [[Interface\Buttons\WHITE8X8]], edgeSize = 1, bgFile = [[Interface\Tooltips\UI-Tooltip-Background]], tileSize = 64, tile = true})
spellinfo:SetBackdropColor(.3, .3, .3, .5)
spellinfo:SetBackdropBorderColor(0, 0, 0, 1)
spellinfo:SetSize(80, 20)
spellinfo:SetScript("OnEnter", info_onenter)
spellinfo:SetScript("OnLeave", info_onleave)
local spellinfotext = spellinfo:CreateFontString(nil, "overlay", "GameFontNormal")
spellinfotext:SetPoint("center", spellinfo, "center")
spellinfotext:SetText("info")
spellinfo:SetPoint("left", spellname.widget, "right", 4, 0)
local create_aura = detailsFramework:NewButton(anchor_frame, nil, "$parentCreateAuraButton", "AuraButton", 90, 18, create_aura_func, nil, nil, nil, "Make Aura")
create_aura:SetPoint("left", spellinfo, "right", 4, 0)
create_aura:SetTemplate(aurasButtonTemplate)
anchor_frame.icon = spellicon
anchor_frame.spellid = spellid
anchor_frame.spellname = spellname
anchor_frame.aurabutton = create_aura
anchor_frame.aurabutton._icon = spellicon
anchor_frame.info = spellinfo
table.insert(spell_blocks, anchor_frame)
table.insert(edFrame.EnemySpellsWidgets, anchor_frame)
anchor_frame:Hide()
end
local update_enemy_spells = function()
local combat = encounterDetails:GetCombat(encounterDetails._segment)
local spell_list = {}
if (combat) then
for i, npc in combat[1]:ListActors() do
--damage
if (npc:IsNeutralOrEnemy()) then
for spellid, spell in pairs(npc.spells._ActorTable) do
if (spellid > 10) then
local name, _, icon = encounterDetails.getspellinfo(spellid)
table.insert(spell_list, {spellid, name, icon, nil, npc.serial})
end
end
end
end
for i, npc in combat[2]:ListActors() do
--heal
if (npc:IsNeutralOrEnemy()) then
for spellid, spell in pairs(npc.spells._ActorTable) do
if (spellid > 10) then
local name, _, icon = encounterDetails.getspellinfo(spellid)
table.insert(spell_list, {spellid, name, icon, true, npc.serial})
end
end
end
end
table.sort(spell_list, function(t1, t2)
return t1[2] < t2[2]
end)
encounterDetails.SpellScrollframe.spell_pool = spell_list
encounterDetails.SpellScrollframe.encounter_id = combat.is_boss and combat.is_boss.id
encounterDetails.SpellScrollframe:Update()
end
end
local refresh_bossmods_timers = function(self)
local combat = encounterDetails:GetCombat(encounterDetails._segment)
local offset = FauxScrollFrame_GetOffset(self)
local already_added = {}
local db = Details.boss_mods_timers
local encounter_id = combat.is_boss and combat.is_boss.id
if (db) then
wipe(already_added)
local timersToAdd = {}
for timerId, timerTable in pairs(db.encounter_timers_dbm) do
if (timerTable.id == encounter_id) then
local spellId = timerTable [7]
local spellIcon = timerTable [5]
local spellName
local spell = timerId
spell = spell:gsub("ej", "")
spell = tonumber(spell)
if (spell and not already_added[spell]) then
if (spell > 40000) then
local spellname, _, spellicon = _GetSpellInfo(spell)
table.insert(timersToAdd, {label = spellname, value = {timerTable[2], spellname, spellIcon or spellicon, timerTable.id, timerTable[7]}, icon = spellIcon or spellicon})
else
local sectionInfo = C_EncounterJournal.GetSectionInfo(spell)
table.insert(timersToAdd, {label = sectionInfo.title, value = {timerTable[2], sectionInfo.title, spellIcon or sectionInfo.abilityIcon, timerTable.id, timerTable[7]}, icon = spellIcon or sectionInfo.abilityIcon})
end
already_added[spell] = true
end
end
end
table.sort(timersToAdd, function(t1, t2)
return t1.label < t2.label
end)
local offset = FauxScrollFrame_GetOffset(self)
for barIndex = 1, CONST_MAX_AURA_LINES do
local data = timersToAdd[barIndex + offset]
local bar = bossmods_blocks[barIndex]
if (data) then
bar:Show()
bar.icon.texture = data.icon
bar.icon:SetTexCoord(.1, .9, .1, .9)
bar.spellid.text = data.value[1] or "--x--x--"
bar.spellname.text = data.label or "--x--x--"
bar.spellid._spellid = data.value[1]
bar.spellname._spellid = data.value[1]
local func = function()
local timerId, spellname, spellicon, encounterid, spellid = unpack(data.value)
encounterDetails:OpenAuraPanel(timerId, spellname, spellicon, encounterid, DETAILS_WA_TRIGGER_DBM_TIMER, DETAILS_WA_AURATYPE_TEXT, {dbm_timer_id = timerId, spellid = spellid, text = "Next " .. spellname .. " In", text_size = 72, icon = spellicon})
end
bar.aurabutton:SetClickFunction(func)
else
bar:Hide()
end
end
FauxScrollFrame_Update(self, #timersToAdd, CONST_MAX_AURA_LINES, 20)
if (#timersToAdd > 0) then
self:Show()
end
end
end
local refresh_spellauras = function(self)
local pool = encounterDetails.SpellScrollframe.spell_pool
local encounter_id = encounterDetails.SpellScrollframe.encounter_id
local offset = FauxScrollFrame_GetOffset(self)
for bar_index = 1, CONST_MAX_AURA_LINES do
local data = pool[bar_index + offset]
local bar = spell_blocks[bar_index]
if (data) then
bar:Show()
bar.icon.texture = data[3]
bar.icon:SetTexCoord(.1, .9, .1, .9)
bar.spellid.text = data[1]
bar.spellname.text = data[2]
bar.spellid._spellid = data[1]
bar.spellname._spellid = data[1]
bar.info._spellid = data[1]
local is_heal = data[4]
if (is_heal) then
bar.spellid:SetBackdropBorderColor(0, 1, 0)
bar.spellname:SetBackdropBorderColor(0, 1, 0)
else
bar.spellid:SetBackdropBorderColor(0, 0, 0)
bar.spellname:SetBackdropBorderColor(0, 0, 0)
end
bar.aurabutton:SetClickFunction(create_aura_func, data [1], encounter_id)
else
bar:Hide()
end
end
FauxScrollFrame_Update(self, #pool, CONST_MAX_AURA_LINES, 20)
end
local spellScrollFrame = CreateFrame("ScrollFrame", "EncounterDetails_SpellAurasScroll", edFrame, "FauxScrollFrameTemplate, BackdropTemplate")
spellScrollFrame:SetScript("OnVerticalScroll", function(self, offset) FauxScrollFrame_OnVerticalScroll(self, offset, 14, refresh_spellauras) end)
spellScrollFrame:SetPoint("topleft", edFrame, "topleft", 200, -75)
spellScrollFrame:SetPoint("bottomright", edFrame, "bottomright", -33, 42)
spellScrollFrame.Update = refresh_spellauras
spellScrollFrame:Hide()
encounterDetails.SpellScrollframe = spellScrollFrame
detailsFramework:ReskinSlider(spellScrollFrame)
table.insert(edFrame.EnemySpellsWidgets, spellScrollFrame)
encounterDetails.update_enemy_spells = update_enemy_spells
local bossmodsScrollFrame = CreateFrame("ScrollFrame", "EncounterDetails_BossModsScroll", edFrame, "FauxScrollFrameTemplate, BackdropTemplate")
bossmodsScrollFrame:SetScript("OnVerticalScroll", function(self, offset) FauxScrollFrame_OnVerticalScroll(self, offset, 14, refresh_bossmods_timers) end)
bossmodsScrollFrame:SetPoint("topleft", edFrame, "topleft", 10, -75)
bossmodsScrollFrame:SetPoint("bottomleft", edFrame, "bottomleft", 250, 42)
bossmodsScrollFrame.Update = refresh_bossmods_timers
bossmodsScrollFrame:Hide()
encounterDetails.BossModsScrollframe = bossmodsScrollFrame
table.insert(edFrame.EnemySpellsWidgets, bossmodsScrollFrame)
encounterDetails.update_bossmods = function() bossmodsScrollFrame:Update() end
local build_bigwigs_bars = function()
local t = {}
local db = Details.boss_mods_timers
if (db) then
wipe(already_added)
local encounter_id = encounterDetails.SpellScrollframe.encounter_id
for timer_id, timer_table in pairs(db.encounter_timers_bw) do
if (timer_table.id == encounter_id) then
local spell = timer_id
if (spell and not already_added [spell]) then
local int_spell = tonumber(spell)
if (not int_spell) then
local spellname = timer_table [2]:gsub(" %(.%)", "")
table.insert(t, {label = spellname, value = {timer_table [2], spellname, timer_table [5], timer_table.id}, icon = timer_table [5], onclick = on_select_bw_bar})
elseif (int_spell < 0) then
local title, description, depth, abilityIcon, displayInfo, siblingID, nextSectionID, filteredByDifficulty, link, startsOpen, flag1, flag2, flag3, flag4 = C_EncounterJournal.GetSectionInfo(abs(int_spell))
table.insert(t, {label = title, value = {timer_table [2], title, timer_table [5] or abilityIcon, timer_table.id}, icon = timer_table [5] or abilityIcon, onclick = on_select_bw_bar})
else
local spellname, _, spellicon = _GetSpellInfo(int_spell)
table.insert(t, {label = spellname, value = {timer_table [2], spellname, timer_table [5] or spellicon, timer_table.id}, icon = timer_table [5] or spellicon, onclick = on_select_bw_bar})
end
already_added [spell] = true
end
end
end
end
return t
end