2019 lines
73 KiB
Lua
2019 lines
73 KiB
Lua
|
|
local addonName, Details222 = ...
|
|
local spellsTab = {}
|
|
local breakdownWindow = Details.BreakdownWindow
|
|
local Loc = LibStub("AceLocale-3.0"):GetLocale ( "Details" )
|
|
local SharedMedia = LibStub:GetLibrary("LibSharedMedia-3.0")
|
|
local unpack = unpack
|
|
local GetTime = GetTime
|
|
local GetCursorPosition = GetCursorPosition
|
|
local CreateFrame = CreateFrame
|
|
local GetSpellLink = GetSpellLink
|
|
local _GetSpellInfo = Details.GetSpellInfo
|
|
local GameTooltip = GameTooltip
|
|
local IsShiftKeyDown = IsShiftKeyDown
|
|
local DF = DetailsFramework
|
|
|
|
--Expose the object to the global namespace
|
|
DetailsSpellBreakdownTab = spellsTab
|
|
|
|
local iconTableSummary = {
|
|
texture = [[Interface\AddOns\Details\images\icons]],
|
|
coords = {238/512, 255/512, 0, 18/512},
|
|
width = 16,
|
|
height = 16,
|
|
}
|
|
|
|
local spellBlockContainerSettings = {
|
|
amount = 6, --amount of block the container have
|
|
lineAmount = 3, --amount of line each block have
|
|
}
|
|
|
|
local spellBreakdownSettings = {}
|
|
|
|
local row_backdrop = {bgFile = "Interface\\Tooltips\\UI-Tooltip-Background",
|
|
insets = {left = 0, right = 0, top = 0, bottom = 0}}
|
|
local row_backdrop_onleave = {bgFile = "", edgeFile = "", tile = true, tileSize = 16, edgeSize = 32,
|
|
insets = {left = 1, right = 1, top = 0, bottom = 1}}
|
|
|
|
local CONST_BAR_HEIGHT = 20
|
|
local CONST_TARGET_HEIGHT = 18
|
|
|
|
local CONST_SPELLSCROLL_WIDTH = 435
|
|
local CONST_SPELLSCROLL_HEIGHT = 311
|
|
local CONST_SPELLSCROLL_AMTLINES = 14
|
|
local CONST_SPELLSCROLL_LINEHEIGHT = 20
|
|
|
|
Details.SpellGroups = {
|
|
[193473] = 15407, --mind flay
|
|
}
|
|
|
|
function spellsTab.GetActor()
|
|
return spellsTab.currentActor
|
|
end
|
|
|
|
function spellsTab.GetCombat()
|
|
return spellsTab.combatObject
|
|
end
|
|
|
|
function spellsTab.GetInstance()
|
|
return spellsTab.instance
|
|
end
|
|
|
|
---return the breakdownspellscrollframe object, there's only one of this in the breakdown window
|
|
---@return breakdownspellscrollframe
|
|
function spellsTab.GetSpellScrollContainer()
|
|
return spellsTab.TabFrame.SpellScrollFrame
|
|
end
|
|
|
|
---return the breakdownspellblockcontainer object, there's only one of this in the breakdown window
|
|
---@return breakdownspellblockcontainer
|
|
function spellsTab.GetSpellBlockContainer()
|
|
return spellsTab.TabFrame.SpellBlockContainer
|
|
end
|
|
|
|
---@type {name: string, width: number, label: string, align: string, enabled: boolean, attribute: number|nil}[]
|
|
local columnInfo = {
|
|
{name = "icon", width = 22, label = "", align = "center", enabled = true,},
|
|
{name = "target", width = 22, label = "", align = "center", enabled = true},
|
|
{name = "rank", label = "#", width = 16, align = "center", enabled = true},
|
|
{name = "expand", label = "^", width = 16, align = "center", enabled = true},
|
|
{name = "name", label = "spell name", width = 246, align = "left", enabled = true},
|
|
{name = "amount", label = "total", width = 50, align = "left", enabled = true},
|
|
{name = "persecond", label = "ps", width = 50, align = "left", enabled = true},
|
|
{name = "percent", label = "%", width = 50, align = "left", enabled = true},
|
|
{name = "casts", label = "casts", width = 40, align = "left", enabled = true},
|
|
{name = "critpercent", label = "crit %", width = 40, align = "left", enabled = true},
|
|
{name = "hits", label = "hits", width = 40, align = "left", enabled = true},
|
|
{name = "castavg", label = "cast avg", width = 50, align = "left", enabled = true},
|
|
{name = "uptime", label = "uptime", width = 45, align = "left", enabled = true},
|
|
{name = "overheal", label = "overheal", width = 45, align = "left", enabled = true, attribute = DETAILS_ATTRIBUTE_HEAL},
|
|
{name = "absorbed", label = "absorbed", width = 45, align = "left", enabled = true, attribute = DETAILS_ATTRIBUTE_HEAL},
|
|
}
|
|
|
|
function spellsTab.BuildHeaderTable()
|
|
---@type {name: string, width: number, label: string, align: string, enabled: boolean}[]
|
|
local headerTable = {}
|
|
|
|
---@type instance
|
|
local instance = spellsTab.GetInstance()
|
|
|
|
---@type number, number
|
|
local mainAttribute, subAttribute = instance:GetDisplay()
|
|
|
|
for i = 1, #columnInfo do
|
|
local columnData = columnInfo[i]
|
|
if (columnData.enabled) then
|
|
local bCanAdd = true
|
|
if (columnData.attribute) then
|
|
if (columnData.attribute ~= mainAttribute) then
|
|
bCanAdd = false
|
|
end
|
|
end
|
|
|
|
if (bCanAdd) then
|
|
headerTable[#headerTable+1] = {
|
|
text = columnData.label,
|
|
width = columnData.width,
|
|
name = columnData.name,
|
|
--align = column.align,
|
|
}
|
|
end
|
|
end
|
|
end
|
|
return headerTable
|
|
end
|
|
|
|
--store the current spellbar selected, this is used to lock the spellblock container to the spellbar selected
|
|
spellsTab.selectedSpellBar = nil
|
|
|
|
---selected a breakdownspellbar, locking into the bar
|
|
---when a breakdownspellbar is selected, all the other breakdownspellbar has it's hover over disabled
|
|
---@param spellBar breakdownspellbar
|
|
function spellsTab.SelectSpellBar(spellBar)
|
|
--if already has a spellbar selected, unselect it
|
|
if (spellsTab.HasSelectedSpellBar()) then --unselect and stop the function if the bar selected is the same as the one being selected
|
|
if (spellsTab.GetSelectedSpellBar() == spellBar) then
|
|
spellsTab.UnSelectSpellBar()
|
|
return
|
|
else
|
|
spellsTab.UnSelectSpellBar()
|
|
end
|
|
end
|
|
|
|
--it is only selecting the bar is the mouse down elapsed 0.4 seconds or more
|
|
|
|
--as the spell block container get an update when hovering over
|
|
--update the spell block container for the breakdownspellbar just selected
|
|
--this is necessary since a previous breakdownspellbar could have been selected and prevented this breakdownspellbar to update on hover over
|
|
---@type function
|
|
local onEnterScript = spellBar:GetScript("OnEnter")
|
|
if (onEnterScript) then
|
|
onEnterScript(spellBar)
|
|
end
|
|
|
|
--set the new breakdownspellbar as selected
|
|
spellsTab.selectedSpellBar = spellBar
|
|
spellsTab.selectedSpellBar.overlayTexture:Show()
|
|
end
|
|
|
|
---deselect the breakdownspellbar
|
|
function spellsTab.UnSelectSpellBar()
|
|
if (spellsTab.selectedSpellBar) then
|
|
spellsTab.selectedSpellBar.overlayTexture:Hide()
|
|
end
|
|
spellsTab.selectedSpellBar = nil
|
|
end
|
|
|
|
---get the spellbar currently selected
|
|
---@return breakdownspellbar
|
|
function spellsTab.GetSelectedSpellBar()
|
|
return spellsTab.selectedSpellBar
|
|
end
|
|
|
|
---return true if there's a spell bar selected
|
|
---@return boolean
|
|
function spellsTab.HasSelectedSpellBar()
|
|
return spellsTab.selectedSpellBar ~= nil
|
|
end
|
|
|
|
function spellsTab.OnShownTab()
|
|
--unselect any selected breakdownspellbar
|
|
spellsTab.UnSelectSpellBar()
|
|
--reset the spell blocks
|
|
spellsTab.GetSpellBlockContainer():ClearBlocks()
|
|
end
|
|
|
|
--called when the tab is getting created
|
|
function spellsTab.OnCreateTabCallback(tabButton, tabFrame)
|
|
spellBreakdownSettings = Details.breakdown_spell_tab
|
|
|
|
--create the scrollbar to show the spells in the breakdown window
|
|
---@type breakdownspellscrollframe
|
|
local spellScrollContainer = spellsTab.CreateSpellScrollContainer(tabFrame) --finished
|
|
|
|
--create the 6 spell blocks in the right side of the breakdown window
|
|
--these blocks show the spell info like normal hits, critical hits, average, etc
|
|
---@type breakdownspellblockcontainer
|
|
local spellBlockContainer = spellsTab.CreateSpellBlockContainer(tabFrame)
|
|
spellsTab.SpellBlockContainer = spellBlockContainer
|
|
spellBlockContainer:SetPoint("topleft", spellScrollContainer, "topright", 26, 0)
|
|
|
|
--create the targets container
|
|
spellsTab.CreateTargetContainer(tabFrame)
|
|
|
|
--craete special backgrounds (still needed?)
|
|
spellsTab.CreateSpecialBackgrounds(tabFrame)
|
|
|
|
--create the report buttons for each container
|
|
spellsTab.CreateReportButtons(tabFrame)
|
|
|
|
--these bars table are kinda deprecated now:
|
|
|
|
--store the spell bars for the spell container
|
|
tabFrame.barras1 = {}
|
|
--store the target bars for the target container
|
|
tabFrame.barras2 = {}
|
|
--store the special bars shown in the right side of the breakdown window, this is only shown when spellBlocks aren't in use
|
|
tabFrame.barras3 = {}
|
|
|
|
spellsTab.TabFrame = tabFrame
|
|
end
|
|
|
|
function spellsTab.TrocaBackgroundInfo(tabFrame) --> spells tab | to be refactored | called fom OpenJanelaInfo function
|
|
tabFrame.bg3_sec_texture:Hide()
|
|
tabFrame.bg2_sec_texture:Hide()
|
|
tabFrame.report_direita:Hide()
|
|
|
|
if (breakdownWindow.atributo == 1) then --damage
|
|
if (breakdownWindow.sub_atributo == 1 or breakdownWindow.sub_atributo == 2) then --damage done / dps
|
|
tabFrame.bg1_sec_texture:SetTexture("")
|
|
tabFrame.tipo = 1
|
|
|
|
if (breakdownWindow.sub_atributo == 2) then
|
|
tabFrame.targets:SetText(Loc ["STRING_TARGETS"] .. " " .. Loc ["STRING_ATTRIBUTE_DAMAGE_DPS"] .. ":")
|
|
tabFrame.target_persecond = true
|
|
else
|
|
tabFrame.targets:SetText(Loc ["STRING_TARGETS"] .. ":")
|
|
end
|
|
|
|
elseif (breakdownWindow.sub_atributo == 3) then --damage taken
|
|
tabFrame.bg1_sec_texture:SetColorTexture(.05, .05, .05, .4)
|
|
tabFrame.bg3_sec_texture:Show()
|
|
tabFrame.bg2_sec_texture:Show()
|
|
tabFrame.tipo = 2
|
|
|
|
for i = 1, spellBlockContainerSettings.amount do
|
|
tabFrame["right_background" .. i]:Hide()
|
|
end
|
|
|
|
tabFrame.targets:SetText(Loc ["STRING_TARGETS"] .. ":")
|
|
tabFrame.no_targets:Show()
|
|
tabFrame.no_targets.text:Show()
|
|
tabFrame.report_direita:Show()
|
|
|
|
elseif (breakdownWindow.sub_atributo == 4) then --friendly fire
|
|
tabFrame.bg1_sec_texture:SetColorTexture(.05, .05, .05, .4)
|
|
tabFrame.bg3_sec_texture:Show()
|
|
tabFrame.bg2_sec_texture:Show()
|
|
tabFrame.tipo = 3
|
|
|
|
for i = 1, spellBlockContainerSettings.amount do
|
|
tabFrame["right_background" .. i]:Hide()
|
|
end
|
|
|
|
tabFrame.targets:SetText(Loc ["STRING_SPELLS"] .. ":")
|
|
tabFrame.report_direita:Show()
|
|
|
|
elseif (breakdownWindow.sub_atributo == 6) then --enemies
|
|
tabFrame.bg1_sec_texture:SetColorTexture(.05, .05, .05, .4)
|
|
tabFrame.bg3_sec_texture:Show()
|
|
tabFrame.bg2_sec_texture:Show()
|
|
tabFrame.tipo = 3
|
|
|
|
for i = 1, spellBlockContainerSettings.amount do
|
|
tabFrame["right_background" .. i]:Hide()
|
|
end
|
|
|
|
tabFrame.targets:SetText(Loc ["STRING_DAMAGE_TAKEN_FROM"])
|
|
end
|
|
|
|
elseif (breakdownWindow.atributo == 2) then --healing
|
|
if (breakdownWindow.sub_atributo == 1 or breakdownWindow.sub_atributo == 2 or breakdownWindow.sub_atributo == 3) then --damage done / dps
|
|
tabFrame.bg1_sec_texture:SetTexture("")
|
|
tabFrame.tipo = 1
|
|
|
|
if (breakdownWindow.sub_atributo == 3) then
|
|
tabFrame.targets:SetText(Loc ["STRING_OVERHEALED"] .. ":")
|
|
tabFrame.target_member = "overheal"
|
|
tabFrame.target_text = Loc ["STRING_OVERHEALED"] .. ":"
|
|
|
|
elseif (breakdownWindow.sub_atributo == 2) then
|
|
tabFrame.targets:SetText(Loc ["STRING_TARGETS"] .. " " .. Loc ["STRING_ATTRIBUTE_HEAL_HPS"] .. ":")
|
|
tabFrame.target_persecond = true
|
|
|
|
else
|
|
tabFrame.targets:SetText(Loc ["STRING_TARGETS"] .. ":")
|
|
end
|
|
|
|
elseif (breakdownWindow.sub_atributo == 4) then --Healing taken
|
|
tabFrame.bg1_sec_texture:SetColorTexture(.05, .05, .05, .4)
|
|
tabFrame.bg3_sec_texture:Show()
|
|
tabFrame.bg2_sec_texture:Show()
|
|
tabFrame.tipo = 2
|
|
|
|
for i = 1, spellBlockContainerSettings.amount do
|
|
tabFrame ["right_background" .. i]:Hide()
|
|
end
|
|
|
|
tabFrame.targets:SetText(Loc ["STRING_TARGETS"] .. ":")
|
|
tabFrame.no_targets:Show()
|
|
tabFrame.no_targets.text:Show()
|
|
tabFrame.report_direita:Show()
|
|
end
|
|
|
|
elseif (breakdownWindow.atributo == 3) then --energy
|
|
tabFrame.bg1_sec_texture:SetTexture("")
|
|
tabFrame.tipo = 2
|
|
tabFrame.targets:SetText("Vindo de:")
|
|
|
|
elseif (breakdownWindow.atributo == 4) then --utility
|
|
tabFrame.bg1_sec_texture:SetTexture("")
|
|
tabFrame.tipo = 2
|
|
|
|
tabFrame.targets:SetText(Loc ["STRING_TARGETS"] .. ":")
|
|
end
|
|
end
|
|
|
|
do --hide bars functions - to be refactored
|
|
--hide all the bars of the skills in the window info
|
|
function spellsTab.HidaAllBarrasInfo()
|
|
local allBars = _detalhes.playerDetailWindow.barras1
|
|
for index = 1, #allBars, 1 do
|
|
allBars[index]:Hide()
|
|
allBars[index].textura:SetStatusBarColor(1, 1, 1, 1)
|
|
allBars[index].on_focus = false
|
|
end
|
|
end
|
|
|
|
--hide all the bars of the player's targets
|
|
function spellsTab.HidaAllBarrasAlvo()
|
|
local allBars = _detalhes.playerDetailWindow.barras2
|
|
for index = 1, #allBars, 1 do
|
|
allBars[index]:Hide()
|
|
end
|
|
end
|
|
|
|
--hide the 5 bars on the right side of the window
|
|
function spellsTab.HidaAllDetalheInfo() --there's a call from the breakdown file yet
|
|
for i = 1, spellBlockContainerSettings.amount do
|
|
spellsTab.HidaDetalheInfo(i)
|
|
end
|
|
|
|
--breakdownWindow.barras3 will not exists anymore soon
|
|
--for _, thisBar in ipairs(breakdownWindow.barras3) do
|
|
-- thisBar:Hide()
|
|
--end
|
|
--_detalhes.playerDetailWindow.spell_icone:SetTexture("")
|
|
end
|
|
|
|
function spellsTab.ResetBars()
|
|
spellsTab.HidaAllBarrasInfo()
|
|
spellsTab.HidaAllBarrasAlvo()
|
|
spellsTab.HidaAllDetalheInfo()
|
|
end
|
|
|
|
function spellsTab.HidaDetalheInfo(index) --> spells tab this is getting called from class damage and heal
|
|
local info = _detalhes.playerDetailWindow.grupos_detalhes[index]
|
|
info.nome:SetText("")
|
|
info.nome2:SetText("")
|
|
info.dano:SetText("")
|
|
info.dano_porcento:SetText("")
|
|
info.dano_media:SetText("")
|
|
info.dano_dps:SetText("")
|
|
info.bg:Hide()
|
|
end
|
|
end
|
|
|
|
--bar scripts
|
|
local onMouseDownCallback = function(self, button)
|
|
local hostFrame = breakdownWindow
|
|
|
|
if (button == "LeftButton") then
|
|
hostFrame:StartMoving()
|
|
hostFrame.isMoving = true
|
|
|
|
elseif (button == "RightButton" and not self.isMoving) then
|
|
Details:CloseBreakdownWindow()
|
|
end
|
|
end
|
|
|
|
local onMouseUpCallback = function(self, button)
|
|
local hostFrame = breakdownWindow
|
|
|
|
if (hostFrame.isMoving) then
|
|
hostFrame:StopMovingOrSizing()
|
|
hostFrame.isMoving = false
|
|
end
|
|
end
|
|
|
|
function spellsTab.ApplyScripts()
|
|
local hostFrame = breakdownWindow --cannot be breakdown window, it should be the frame of the tab
|
|
hostFrame.SpellScrollFrame.gump:SetScript("OnMouseDown", onMouseDownCallback)
|
|
hostFrame.SpellScrollFrame.gump:SetScript("OnMouseUp", onMouseUpCallback)
|
|
|
|
hostFrame.container_detalhes:SetScript("OnMouseDown", onMouseDownCallback)
|
|
hostFrame.container_detalhes:SetScript("OnMouseUp", onMouseUpCallback)
|
|
|
|
hostFrame.container_alvos.gump:SetScript("OnMouseDown", onMouseDownCallback)
|
|
hostFrame.container_alvos.gump:SetScript("OnMouseUp", onMouseUpCallback)
|
|
end
|
|
|
|
function spellsTab.CreateReportButtons(tabFrame)
|
|
--spell list report button
|
|
tabFrame.report_esquerda = Details.gump:NewDetailsButton(tabFrame, tabFrame, nil, _detalhes.Reportar, tabFrame, 1, 16, 16, "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", nil, "DetailsJanelaInfoReport2")
|
|
tabFrame.report_esquerda:SetPoint("bottomleft", tabFrame.SpellScrollFrame, "TOPLEFT", 33, 3)
|
|
tabFrame.report_esquerda:SetFrameLevel(tabFrame:GetFrameLevel()+2)
|
|
tabFrame.topleft_report = tabFrame.report_esquerda
|
|
|
|
--targets report button
|
|
tabFrame.report_alvos = Details.gump:NewDetailsButton(tabFrame, tabFrame, nil, _detalhes.Reportar, tabFrame, 3, 16, 16, "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", nil, "DetailsJanelaInfoReport3")
|
|
tabFrame.report_alvos:SetPoint("bottomright", tabFrame.container_alvos, "TOPRIGHT", -2, -1)
|
|
tabFrame.report_alvos:SetFrameLevel(3) --solved inactive problem
|
|
|
|
--special barras in the right report button
|
|
tabFrame.report_direita = Details.gump:NewDetailsButton(tabFrame, tabFrame, nil, _detalhes.Reportar, tabFrame, 2, 16, 16, "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", nil, "DetailsJanelaInfoReport4")
|
|
tabFrame.report_direita:SetPoint("TOPRIGHT", tabFrame, "TOPRIGHT", -10, -70)
|
|
tabFrame.report_direita:Show()
|
|
end
|
|
|
|
----------------------------------------------------------------------
|
|
--> scripts
|
|
|
|
--create a details bar on the right side of the window
|
|
local onEnterSpellBlock = function(spellBlock) --info background is the 6 bars in the right side of the window?
|
|
Details.FadeHandler.Fader(spellBlock.overlay, "OUT")
|
|
Details.FadeHandler.Fader(spellBlock.reportButton, "OUT")
|
|
end
|
|
|
|
local onLeaveSpellBlock = function(spellBlock)
|
|
Details.FadeHandler.Fader(spellBlock.overlay, "IN")
|
|
Details.FadeHandler.Fader(spellBlock.reportButton, "IN")
|
|
end
|
|
|
|
local onEnterInfoReport = function(self)
|
|
Details.FadeHandler.Fader(self:GetParent().overlay, "OUT")
|
|
Details.FadeHandler.Fader(self, "OUT")
|
|
end
|
|
|
|
local onLeaveInfoReport = function(self)
|
|
Details.FadeHandler.Fader(self:GetParent().overlay, "IN")
|
|
Details.FadeHandler.Fader(self, "IN")
|
|
end
|
|
|
|
---run this function when the mouse hover over a breakdownspellbar
|
|
---@param spellBar breakdownspellbar
|
|
local onEnterBreakdownSpellBar = function(spellBar) --parei aqui: precisa por nomes nas funções e formatar as linhas das funcções
|
|
--all values from spellBar are cached values
|
|
|
|
--check if there's a spellbar selected, if there's one, ignore the mouseover
|
|
if (spellsTab.HasSelectedSpellBar()) then
|
|
return
|
|
end
|
|
|
|
---@type instance
|
|
local instance = spellsTab.GetInstance()
|
|
|
|
---@type number, number
|
|
local mainAttribute, subAttribute = instance:GetDisplay()
|
|
|
|
---@type breakdownspellblockcontainer
|
|
local spellBlockContainer = spellsTab.GetSpellBlockContainer()
|
|
spellBlockContainer:ClearBlocks()
|
|
|
|
---@type number
|
|
local spellId = spellBar.spellId
|
|
|
|
---@type number
|
|
local elapsedTime = spellBar.combatTime --this should be actorObject:Tempo()
|
|
|
|
---@type spelltable
|
|
local spellTable = spellBar.spellTable
|
|
|
|
if (IsShiftKeyDown()) then
|
|
if (type(spellId) == "number") then
|
|
GameCooltip:Preset(2)
|
|
GameCooltip:SetOwner(spellBar, "ANCHOR_TOPRIGHT")
|
|
GameCooltip:AddLine(Loc ["ABILITY_ID"] .. ": " .. spellBar.spellId)
|
|
GameCooltip:Show()
|
|
end
|
|
end
|
|
|
|
if (spellId == 98021) then --spirit link totem
|
|
GameTooltip:SetOwner(spellBar, "ANCHOR_TOPLEFT")
|
|
GameTooltip:AddLine(Loc ["STRING_SPIRIT_LINK_TOTEM_DESC"])
|
|
GameTooltip:Show()
|
|
end
|
|
|
|
if (mainAttribute == DETAILS_ATTRIBUTE_DAMAGE) then --this should run within the damage class
|
|
local bShowDamageDone = subAttribute == DETAILS_SUBATTRIBUTE_DAMAGEDONE or subAttribute == DETAILS_SUBATTRIBUTE_DPS
|
|
|
|
---@type number
|
|
local blockIndex = 1
|
|
|
|
---@type number
|
|
local totalHits = spellTable.counter
|
|
|
|
--damage section showing damage done sub section
|
|
--get the first spell block to use as summary
|
|
---@type breakdownspellblock
|
|
local summaryBlock = spellBlockContainer:GetBlock(blockIndex)
|
|
summaryBlock:Show()
|
|
blockIndex = blockIndex + 1
|
|
|
|
do --update the texts in the summary block
|
|
local blockLine1, blockLine2, blockLine3 = summaryBlock:GetLines()
|
|
|
|
blockLine1.leftText:SetText(Loc ["STRING_CAST"] .. ": " .. spellBar.amountCasts) --total amount of casts
|
|
blockLine1.rightText:SetText(Loc ["STRING_HITS"]..": " .. totalHits) --hits and uptime
|
|
|
|
blockLine2.leftText:SetText(Loc ["STRING_DAMAGE"]..": " .. Details:Format(spellTable.total)) --total damage
|
|
blockLine2.rightText:SetText(Details:GetSpellSchoolFormatedName(spellTable.spellschool)) --spell school
|
|
|
|
blockLine3.leftText:SetText(Loc ["STRING_AVERAGE"] .. ": " .. Details:Format(spellBar.average)) --average damage
|
|
blockLine3.rightText:SetText(Loc ["STRING_DPS"] .. ": " .. Details:CommaValue(spellBar.perSecond)) --dps
|
|
end
|
|
|
|
--check if there's normal hits and build the block
|
|
---@type number
|
|
local normalHitsAmt = spellTable.n_amt
|
|
|
|
if (normalHitsAmt > 0) then
|
|
---@type breakdownspellblock
|
|
local normalHitsBlock = spellBlockContainer:GetBlock(blockIndex)
|
|
normalHitsBlock:Show()
|
|
blockIndex = blockIndex + 1
|
|
|
|
local percent = normalHitsAmt / math.max(totalHits, 0.0001) * 100
|
|
normalHitsBlock:SetValue(percent)
|
|
normalHitsBlock.sparkTexture:SetPoint("left", normalHitsBlock, "left", percent / 100 * normalHitsBlock:GetWidth() + spellBreakdownSettings.blockspell_spark_offset, 0)
|
|
normalHitsBlock:SetStatusBarColor(1, 1, 1, .5)
|
|
|
|
local blockLine1, blockLine2, blockLine3 = normalHitsBlock:GetLines()
|
|
blockLine1.leftText:SetText(Loc ["STRING_NORMAL_HITS"])
|
|
blockLine1.rightText:SetText(normalHitsAmt .. " [|cFFC0C0C0" .. string.format("%.1f", normalHitsAmt / math.max(totalHits, 0.0001) * 100) .. "%|r]")
|
|
|
|
blockLine2.leftText:SetText(Loc ["STRING_MINIMUM_SHORT"] .. ": " .. Details:CommaValue(spellTable.n_min))
|
|
blockLine2.rightText:SetText(Loc ["STRING_MAXIMUM_SHORT"] .. ": " .. Details:CommaValue(spellTable.n_max))
|
|
|
|
local normalAverage = spellTable.n_total / math.max(normalHitsAmt, 0.0001)
|
|
blockLine3.leftText:SetText(Loc ["STRING_AVERAGE"] .. ": " .. Details:CommaValue(normalAverage))
|
|
|
|
local tempo = (elapsedTime * spellTable.n_total) / math.max(spellTable.total, 0.001)
|
|
local normalAveragePercent = spellBar.average / normalAverage * 100
|
|
local normalTempoPercent = normalAveragePercent * tempo / 100
|
|
blockLine3.rightText:SetText(Loc ["STRING_DPS"] .. ": " .. Details:CommaValue(spellTable.n_total / normalTempoPercent))
|
|
end
|
|
|
|
---@type number
|
|
local criticalHitsAmt = spellTable.c_amt
|
|
if (criticalHitsAmt > 0) then
|
|
---@type breakdownspellblock
|
|
local critHitsBlock = spellBlockContainer:GetBlock(blockIndex)
|
|
critHitsBlock:Show()
|
|
blockIndex = blockIndex + 1
|
|
|
|
local percent = criticalHitsAmt / math.max(totalHits, 0.0001) * 100
|
|
critHitsBlock:SetValue(percent)
|
|
critHitsBlock.sparkTexture:SetPoint("left", critHitsBlock, "left", percent / 100 * critHitsBlock:GetWidth() + spellBreakdownSettings.blockspell_spark_offset, 0)
|
|
critHitsBlock:SetStatusBarColor(1, 1, 1, .5)
|
|
|
|
local blockLine1, blockLine2, blockLine3 = critHitsBlock:GetLines()
|
|
blockLine1.leftText:SetText(Loc ["STRING_CRITICAL_HITS"])
|
|
blockLine1.rightText:SetText(criticalHitsAmt .. " [|cFFC0C0C0" .. string.format("%.1f", criticalHitsAmt / math.max(totalHits, 0.0001) * 100) .. "%|r]")
|
|
|
|
blockLine2.leftText:SetText(Loc ["STRING_MINIMUM_SHORT"] .. ": " .. Details:CommaValue(spellTable.c_min))
|
|
blockLine2.rightText:SetText(Loc ["STRING_MAXIMUM_SHORT"] .. ": " .. Details:CommaValue(spellTable.c_max))
|
|
|
|
local critAverage = spellTable.c_total / math.max(criticalHitsAmt, 0.0001)
|
|
blockLine3.leftText:SetText(Loc ["STRING_AVERAGE"] .. ": " .. Details:CommaValue(critAverage))
|
|
|
|
local tempo = (elapsedTime * spellTable.c_total) / math.max(spellTable.total, 0.001)
|
|
local critAveragePercent = spellBar.average / critAverage * 100
|
|
local critTempoPercent = critAveragePercent * tempo / 100
|
|
blockLine3.rightText:SetText(Loc ["STRING_DPS"] .. ": " .. Details:CommaValue(spellTable.c_total / critTempoPercent))
|
|
end
|
|
|
|
elseif (mainAttribute == DETAILS_ATTRIBUTE_HEAL) then --this should run within the heal class
|
|
---@type number
|
|
local blockIndex = 1
|
|
|
|
---@type number
|
|
local totalHits = spellTable.counter
|
|
|
|
--damage section showing damage done sub section
|
|
--get the first spell block to use as summary
|
|
---@type breakdownspellblock
|
|
local summaryBlock = spellBlockContainer:GetBlock(blockIndex)
|
|
summaryBlock:Show()
|
|
blockIndex = blockIndex + 1
|
|
|
|
do --update the texts in the summary block
|
|
local blockLine1, blockLine2, blockLine3 = summaryBlock:GetLines()
|
|
|
|
blockLine1.leftText:SetText(Loc ["STRING_CAST"] .. ": " .. spellBar.amountCasts) --total amount of casts
|
|
blockLine1.rightText:SetText(Loc ["STRING_HITS"]..": " .. totalHits) --hits and uptime
|
|
|
|
blockLine2.leftText:SetText(Loc ["STRING_DAMAGE"]..": " .. Details:Format(spellTable.total)) --total damage
|
|
blockLine2.rightText:SetText(Details:GetSpellSchoolFormatedName(spellTable.spellschool)) --spell school
|
|
|
|
blockLine3.leftText:SetText(Loc ["STRING_AVERAGE"] .. ": " .. Details:Format(spellBar.average)) --average damage
|
|
blockLine3.rightText:SetText(Loc ["STRING_DPS"] .. ": " .. Details:CommaValue(spellBar.perSecond)) --dps
|
|
end
|
|
|
|
--check if there's normal hits and build the block
|
|
---@type number
|
|
local normalHitsAmt = spellTable.n_amt
|
|
|
|
if (normalHitsAmt > 0) then
|
|
---@type breakdownspellblock
|
|
local normalHitsBlock = spellBlockContainer:GetBlock(blockIndex)
|
|
normalHitsBlock:Show()
|
|
blockIndex = blockIndex + 1
|
|
|
|
local percent = normalHitsAmt / math.max(totalHits, 0.0001) * 100
|
|
normalHitsBlock:SetValue(percent)
|
|
normalHitsBlock.sparkTexture:SetPoint("left", normalHitsBlock, "left", percent / 100 * normalHitsBlock:GetWidth() + spellBreakdownSettings.blockspell_spark_offset, 0)
|
|
normalHitsBlock:SetStatusBarColor(1, 1, 1, .5)
|
|
|
|
local blockLine1, blockLine2, blockLine3 = normalHitsBlock:GetLines()
|
|
blockLine1.leftText:SetText(Loc ["STRING_NORMAL_HITS"])
|
|
blockLine1.rightText:SetText(normalHitsAmt .. " [|cFFC0C0C0" .. string.format("%.1f", normalHitsAmt / math.max(totalHits, 0.0001) * 100) .. "%|r]")
|
|
|
|
blockLine2.leftText:SetText(Loc ["STRING_MINIMUM_SHORT"] .. ": " .. Details:CommaValue(spellTable.n_min))
|
|
blockLine2.rightText:SetText(Loc ["STRING_MAXIMUM_SHORT"] .. ": " .. Details:CommaValue(spellTable.n_max))
|
|
|
|
local normalAverage = spellTable.n_total / math.max(normalHitsAmt, 0.0001)
|
|
blockLine3.leftText:SetText(Loc ["STRING_AVERAGE"] .. ": " .. Details:CommaValue(normalAverage))
|
|
|
|
local tempo = (elapsedTime * spellTable.n_total) / math.max(spellTable.total, 0.001)
|
|
local normalAveragePercent = spellBar.average / normalAverage * 100
|
|
local normalTempoPercent = normalAveragePercent * tempo / 100
|
|
blockLine3.rightText:SetText(Loc ["STRING_DPS"] .. ": " .. Details:CommaValue(spellTable.n_total / normalTempoPercent))
|
|
end
|
|
|
|
---@type number
|
|
local criticalHitsAmt = spellTable.c_amt
|
|
if (criticalHitsAmt > 0) then
|
|
---@type breakdownspellblock
|
|
local critHitsBlock = spellBlockContainer:GetBlock(blockIndex)
|
|
critHitsBlock:Show()
|
|
blockIndex = blockIndex + 1
|
|
|
|
local percent = criticalHitsAmt / math.max(totalHits, 0.0001) * 100
|
|
critHitsBlock:SetValue(percent)
|
|
critHitsBlock.sparkTexture:SetPoint("left", critHitsBlock, "left", percent / 100 * critHitsBlock:GetWidth() + spellBreakdownSettings.blockspell_spark_offset, 0)
|
|
critHitsBlock:SetStatusBarColor(1, 1, 1, .5)
|
|
|
|
local blockLine1, blockLine2, blockLine3 = critHitsBlock:GetLines()
|
|
blockLine1.leftText:SetText(Loc ["STRING_CRITICAL_HITS"])
|
|
blockLine1.rightText:SetText(criticalHitsAmt .. " [|cFFC0C0C0" .. string.format("%.1f", criticalHitsAmt / math.max(totalHits, 0.0001) * 100) .. "%|r]")
|
|
|
|
blockLine2.leftText:SetText(Loc ["STRING_MINIMUM_SHORT"] .. ": " .. Details:CommaValue(spellTable.c_min))
|
|
blockLine2.rightText:SetText(Loc ["STRING_MAXIMUM_SHORT"] .. ": " .. Details:CommaValue(spellTable.c_max))
|
|
|
|
local critAverage = spellTable.c_total / math.max(criticalHitsAmt, 0.0001)
|
|
blockLine3.leftText:SetText(Loc ["STRING_AVERAGE"] .. ": " .. Details:CommaValue(critAverage))
|
|
|
|
local tempo = (elapsedTime * spellTable.c_total) / math.max(spellTable.total, 0.001)
|
|
local critAveragePercent = spellBar.average / critAverage * 100
|
|
local critTempoPercent = critAveragePercent * tempo / 100
|
|
blockLine3.rightText:SetText(Loc ["STRING_DPS"] .. ": " .. Details:CommaValue(spellTable.c_total / critTempoPercent))
|
|
end
|
|
end
|
|
|
|
--effects on entering the bar line
|
|
spellBar:SetHeight(CONST_SPELLSCROLL_LINEHEIGHT + 1)
|
|
spellBar:SetAlpha(1)
|
|
spellBar.spellIcon:SetSize(CONST_SPELLSCROLL_LINEHEIGHT + 2, CONST_SPELLSCROLL_LINEHEIGHT + 2)
|
|
spellBar.spellIcon:SetAlpha(1)
|
|
end
|
|
|
|
---run this function when the mouse leaves a breakdownspellbar
|
|
---@param spellBar breakdownspellbar
|
|
local onLeaveBreakdownSpellBar = function(spellBar)
|
|
--diminui o tamanho da barra
|
|
spellBar:SetHeight(CONST_SPELLSCROLL_LINEHEIGHT)
|
|
--volta com o alfa antigo da barra que era de 0.9
|
|
spellBar:SetAlpha(0.9)
|
|
|
|
--volto o background ao normal
|
|
spellBar:SetBackdrop(row_backdrop_onleave)
|
|
spellBar:SetBackdropBorderColor(0, 0, 0, 0)
|
|
spellBar:SetBackdropColor(0, 0, 0, 0)
|
|
|
|
GameTooltip:Hide()
|
|
GameCooltip:Hide()
|
|
|
|
if (spellBar.isMain) then
|
|
--retira o zoom no icone
|
|
spellBar.spellIcon:SetSize(CONST_SPELLSCROLL_LINEHEIGHT, CONST_SPELLSCROLL_LINEHEIGHT)
|
|
spellBar.spellIcon:SetAlpha(1)
|
|
|
|
--remover o conte�do que estava sendo mostrado na direita
|
|
if (breakdownWindow.mostrando_mouse_over) then
|
|
breakdownWindow.mostrando = nil
|
|
breakdownWindow.mostrando_mouse_over = false
|
|
breakdownWindow.showing = nil
|
|
breakdownWindow.jogador.detalhes = nil
|
|
spellsTab.HidaAllDetalheInfo()
|
|
end
|
|
|
|
elseif (spellBar.isAlvo) then
|
|
spellBar:SetHeight(CONST_TARGET_HEIGHT)
|
|
|
|
elseif (spellBar.isDetalhe) then
|
|
spellBar:SetHeight(16)
|
|
end
|
|
end
|
|
|
|
---on mouse down a breakdownspellbar in the breakdown window
|
|
---@param spellBar breakdownspellbar
|
|
---@param button string
|
|
local onMouseDownBreakdownSpellBar = function(spellBar, button)
|
|
local x, y = _G.GetCursorPosition()
|
|
spellBar.cursorPosX = math.floor(x)
|
|
spellBar.cursorPosY = math.floor(y)
|
|
Details222.PlayerBreakdown.OnMouseDown(spellBar, button)
|
|
end
|
|
|
|
---on mouse up a breakdownspellbar in the breakdown window
|
|
---@param spellBar breakdownspellbar
|
|
---@param button string
|
|
local onMouseUpBreakdownSpellBar = function(spellBar, button)
|
|
if (spellBar.onMouseUpTime == GetTime()) then
|
|
return
|
|
end
|
|
|
|
spellBar.onMouseUpTime = GetTime()
|
|
|
|
---@type number, number
|
|
local x, y = _G.GetCursorPosition()
|
|
x = math.floor(x)
|
|
y = math.floor(y)
|
|
|
|
---@type boolean
|
|
local bIsMouseInTheSamePosition = (x == spellBar.cursorPosX) and (y == spellBar.cursorPosY)
|
|
|
|
--if the mouse is in the same position, then the user clicked the bar
|
|
--clicking the bar activate the lock mechanism
|
|
if (bIsMouseInTheSamePosition) then
|
|
spellsTab.SelectSpellBar(spellBar)
|
|
end
|
|
end
|
|
|
|
|
|
local onEnterSpellIconFrame = function(self)
|
|
local line = self:GetParent()
|
|
if (line.spellId and type(line.spellId) == "number") then
|
|
local spellName = _GetSpellInfo(line.spellId)
|
|
if (spellName) then
|
|
GameTooltip:SetOwner(self, "ANCHOR_TOPLEFT")
|
|
Details:GameTooltipSetSpellByID(line.spellId)
|
|
GameTooltip:Show()
|
|
end
|
|
end
|
|
line:GetScript("OnEnter")(line)
|
|
end
|
|
|
|
local onLeaveSpellIconFrame = function(self)
|
|
GameTooltip:Hide()
|
|
self:GetParent():GetScript("OnLeave")(self:GetParent())
|
|
end
|
|
|
|
--------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
local spellBlockMixin = {
|
|
---get one of the three lines containing fontstrings to show data
|
|
---line 1 is the top line, line 2 is the middle line and line 3 is the bottom line
|
|
---@param self breakdownspellblock
|
|
---@param lineIndex number
|
|
---@return breakdownspellblockline
|
|
GetLine = function(self, lineIndex)
|
|
---@type breakdownspellblockline
|
|
local line = self.Lines[lineIndex]
|
|
return line
|
|
end,
|
|
|
|
---return all lines in the spell block, all spell block have 3 lines
|
|
---@param self breakdownspellblock
|
|
---@return breakdownspellblockline, breakdownspellblockline, breakdownspellblockline
|
|
GetLines = function(self)
|
|
return unpack(self.Lines)
|
|
end,
|
|
}
|
|
|
|
---create a spell block into the spellcontainer
|
|
---@param spellBlockContainer breakdownspellblockcontainer
|
|
---@param index number
|
|
---@return breakdownspellblock
|
|
function spellsTab.CreateSpellBlock(spellBlockContainer, index) --~breakdownspellblock ~create ~spellblocks
|
|
---@type breakdownspellblock
|
|
local spellBlock = CreateFrame("statusbar", "$parentBlock" .. index, spellBlockContainer, "BackdropTemplate")
|
|
DetailsFramework:Mixin(spellBlock, spellBlockMixin)
|
|
local t = spellBlock:CreateTexture(nil, "artwork")
|
|
t:SetColorTexture(1, 1, 1, 1)
|
|
spellBlock:SetStatusBarTexture(t) --debug
|
|
--spellBlock:SetStatusBarTexture("Interface\\AddOns\\Details\\images\\bar_background")
|
|
spellBlock:SetStatusBarColor(1, 1, 1, .84)
|
|
spellBlock:SetMinMaxValues(0, 100)
|
|
spellBlock:SetValue(100)
|
|
spellBlock:SetScript("OnEnter", onEnterSpellBlock)
|
|
spellBlock:SetScript("OnLeave", onLeaveSpellBlock)
|
|
|
|
--create the lines which will host the texts
|
|
spellBlock.Lines = {}
|
|
for i = 1, spellBlockContainerSettings.lineAmount do
|
|
---@type breakdownspellblockline
|
|
local line = CreateFrame("frame", "$parentLine" .. i, spellBlock)
|
|
--DetailsFramework:ApplyStandardBackdrop(line)
|
|
spellBlock.Lines[i] = line
|
|
|
|
line.leftText = line:CreateFontString("$parentLeftText", "overlay", "GameFontHighlightSmall")
|
|
line.centerText = line:CreateFontString("$parentLeftText", "overlay", "GameFontHighlightSmall")
|
|
line.rightText = line:CreateFontString("$parentLeftText", "overlay", "GameFontHighlightSmall")
|
|
|
|
line.leftText:SetPoint("left", line, "left", 2, 0)
|
|
line.leftText:SetJustifyH("left")
|
|
line.centerText:SetPoint("center", line, "center", 0, 0)
|
|
line.centerText:SetJustifyH("center")
|
|
line.rightText:SetPoint("right", line, "right", -2, 0)
|
|
line.rightText:SetJustifyH("right")
|
|
end
|
|
|
|
--overlay texture which fade in and out when the spell block is hovered over
|
|
--is only possible to hover over a spell block when the spellbar is selected
|
|
spellBlock.overlay = spellBlock:CreateTexture("$parentOverlay", "artwork")
|
|
spellBlock.overlay:SetTexture("Interface\\AddOns\\Details\\images\\overlay_detalhes")
|
|
spellBlock.overlay:SetColorTexture(1, 0, 0, 1)
|
|
spellBlock.overlay:SetAllPoints()
|
|
Details.FadeHandler.Fader(spellBlock.overlay, 1) --hide
|
|
|
|
--report button, also only shown when the spell block is hovered over
|
|
spellBlock.reportButton = Details.gump:NewDetailsButton(spellBlock, nil, nil, Details.Reportar, Details.playerDetailWindow, 10 + index, 16, 16,
|
|
"Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", "Interface\\COMMON\\VOICECHAT-ON", nil, "DetailsJanelaInfoReport1")
|
|
Details.FadeHandler.Fader(spellBlock.reportButton, 1) --hide
|
|
spellBlock.reportButton:SetScript("OnEnter", onEnterInfoReport)
|
|
spellBlock.reportButton:SetScript("OnLeave", onLeaveInfoReport)
|
|
|
|
--spark texture
|
|
spellBlock.sparkTexture = spellBlock:CreateTexture("$parentOverlaySparkTexture", "overlay")
|
|
spellBlock.sparkTexture:SetTexture("Interface\\AddOns\\Details\\images\\bar_detalhes2_end")
|
|
spellBlock.sparkTexture:SetBlendMode("ADD")
|
|
|
|
local gradientDown = DetailsFramework:CreateTexture(spellBlock, {gradient = "vertical", fromColor = {0, 0, 0, 0.1}, toColor = "transparent"}, 1, 43, "background", {0, 1, 0, 1})
|
|
gradientDown:SetPoint("bottoms")
|
|
spellBlock.gradientTexture = gradientDown
|
|
|
|
return spellBlock
|
|
end
|
|
|
|
local spellBlockContainerMixin = {
|
|
---refresh all the spellblocks in the container ~UpdateBlocks
|
|
---this function adjust the frame properties, does not update the data shown on them
|
|
---@param self breakdownspellblockcontainer
|
|
UpdateBlocks = function(self) --~update
|
|
---@type number, number
|
|
local width, height = spellBreakdownSettings.blockcontainer_width, spellBreakdownSettings.blockcontainer_height
|
|
local blockHeight = spellBreakdownSettings.blockspell_height
|
|
self:SetSize(width, height)
|
|
|
|
for i = 1, #self.SpellBlocks do
|
|
---@type breakdownspellblock
|
|
local spellBlock = self.SpellBlocks[i]
|
|
|
|
spellBlock:SetSize(width - 2, blockHeight)
|
|
spellBlock:SetPoint("topleft", self, "topleft", 1, (blockHeight * (i - 1) - i) * -1 - (i*2))
|
|
spellBlock.sparkTexture:SetSize(spellBreakdownSettings.blockspell_spark_width, blockHeight)
|
|
spellBlock.sparkTexture:SetShown(spellBreakdownSettings.blockspell_spark_show)
|
|
spellBlock.sparkTexture:SetVertexColor(unpack(spellBreakdownSettings.blockspell_spark_color))
|
|
spellBlock.reportButton:SetPoint("bottomright", spellBlock.overlay, "bottomright", -2, 2)
|
|
spellBlock.gradientTexture:SetHeight(blockHeight)
|
|
|
|
--update the lines
|
|
local previousLine
|
|
for o = 1, spellBlockContainerSettings.lineAmount do
|
|
---@type breakdownspellblockline
|
|
local line = spellBlock.Lines[o]
|
|
line:SetSize(width - 2, spellBreakdownSettings.blockspellline_height)
|
|
if (previousLine) then
|
|
line:SetPoint("topleft", previousLine, "bottomleft", 0, -2)
|
|
else
|
|
line:SetPoint("topleft", spellBlock, "topleft", 1, -2)
|
|
end
|
|
previousLine = line
|
|
end
|
|
end
|
|
end,
|
|
|
|
---@param self breakdownspellblockcontainer
|
|
ClearBlocks = function(self)
|
|
for i = 1, #self.SpellBlocks do
|
|
---@type breakdownspellblock
|
|
local spellBlock = self.SpellBlocks[i]
|
|
spellBlock:Hide()
|
|
|
|
--clear the text shown in their lines
|
|
for o = 1, 3 do
|
|
spellBlock.Lines[o].leftText:SetText("")
|
|
spellBlock.Lines[o].centerText:SetText("")
|
|
spellBlock.Lines[o].rightText:SetText("")
|
|
end
|
|
end
|
|
end,
|
|
|
|
---get a breakdownspellblock from the container
|
|
---@param self breakdownspellblockcontainer
|
|
---@param index number
|
|
---@return breakdownspellblock
|
|
GetBlock = function(self, index)
|
|
return self.SpellBlocks[index]
|
|
end,
|
|
}
|
|
|
|
---create the spell blocks which shows the critical hits, normal hits, etc
|
|
---@param tabFrame tabframe
|
|
---@return breakdownspellblockcontainer
|
|
function spellsTab.CreateSpellBlockContainer(tabFrame)
|
|
--create the container which will hold the spell blocks
|
|
---@type breakdownspellblockcontainer
|
|
local spellBlockContainer = CreateFrame("Frame", "$parentSpellBlockContainer", tabFrame, "BackdropTemplate")
|
|
spellBlockContainer:EnableMouse(true)
|
|
spellBlockContainer:SetResizable(false)
|
|
spellBlockContainer:SetMovable(true)
|
|
DetailsFramework:Mixin(spellBlockContainer, spellBlockContainerMixin)
|
|
DetailsFramework:ApplyStandardBackdrop(spellBlockContainer)
|
|
tabFrame.SpellBlockContainer = spellBlockContainer
|
|
|
|
spellBlockContainer.SpellBlocks = {}
|
|
|
|
for i = 1, spellBlockContainerSettings.amount do
|
|
---@type breakdownspellblock
|
|
local spellBlock = spellsTab.CreateSpellBlock(spellBlockContainer, i)
|
|
table.insert(spellBlockContainer.SpellBlocks, spellBlock)
|
|
--size and point are set on ~UpdateBlocks
|
|
end
|
|
|
|
spellBlockContainer:UpdateBlocks()
|
|
|
|
return spellBlockContainer
|
|
end
|
|
|
|
function spellsTab.CreateTargetContainer(tabFrame)
|
|
local container_alvos_window = CreateFrame("ScrollFrame", "Details_Info_ContainerAlvosScroll", tabFrame, "BackdropTemplate")
|
|
local container_alvos = CreateFrame("Frame", "Details_Info_ContainerAlvos", container_alvos_window, "BackdropTemplate")
|
|
|
|
container_alvos:SetAllPoints(container_alvos_window)
|
|
container_alvos:SetSize(300, 100)
|
|
container_alvos:EnableMouse(true)
|
|
container_alvos:SetMovable(true)
|
|
|
|
container_alvos_window:SetSize(300, 100)
|
|
container_alvos_window:SetScrollChild(container_alvos)
|
|
container_alvos_window:SetPoint("bottomleft", tabFrame, "bottomleft", 20, 6) --56 default
|
|
|
|
container_alvos_window:SetScript("OnSizeChanged", function(self)
|
|
container_alvos:SetSize(self:GetSize())
|
|
end)
|
|
|
|
_detalhes.gump:NewScrollBar(container_alvos_window, container_alvos, 7, 4)
|
|
container_alvos_window.slider:Altura(88)
|
|
container_alvos_window.slider:cimaPoint(0, 1)
|
|
container_alvos_window.slider:baixoPoint(0, -3)
|
|
|
|
container_alvos_window.gump = container_alvos
|
|
tabFrame.container_alvos = container_alvos_window
|
|
|
|
tabFrame.targets = tabFrame:CreateFontString(nil, "OVERLAY", "QuestFont_Large")
|
|
tabFrame.targets:SetPoint("TOPLEFT", tabFrame, "TOPLEFT", 24, -273)
|
|
tabFrame.targets:SetText(Loc ["STRING_TARGETS"] .. ":")
|
|
end
|
|
|
|
--logistics: class_damage build the list of spells, send it to window_playerbreakdown, which gets the current summary tab and send the data for it
|
|
--in this tab, the data is sent to the refresh function
|
|
|
|
local onClickExpandButton = function(expandButton, button)
|
|
---@type breakdownspellbar
|
|
local spellBar = expandButton:GetParent()
|
|
---@type table
|
|
local scrolFrame = spellBar:GetParent()
|
|
---@type boolean
|
|
local bIsSpellExpaded = expandButton.bIsSpellExpaded
|
|
|
|
--check if the one of the expanded bars was a selected spellbar and deselect
|
|
--get the current selected spellbar
|
|
---@type breakdownspellbar
|
|
local selectedSpellBar = spellsTab.GetSelectedSpellBar()
|
|
|
|
if (bIsSpellExpaded) then --it's already expended, it'll close the expanded spellbars
|
|
--check if the selected spellbar is one of the expanded spellbars and deselect it
|
|
for i = 1, #spellBar.ExpandedChildren do
|
|
---@type breakdownspellbar
|
|
local expandedSpellBar = spellBar.ExpandedChildren[i]
|
|
if (expandedSpellBar == selectedSpellBar) then
|
|
--deselect the spellbar
|
|
spellsTab.UnSelectSpellBar()
|
|
break
|
|
end
|
|
end
|
|
else
|
|
spellsTab.UnSelectSpellBar()
|
|
end
|
|
|
|
--todo: check is any other bar has expanded state true, and close the expand (or not)
|
|
|
|
--toggle this spell expand mode
|
|
Details222.BreakdownWindow.SetSpellAsExpanded(expandButton.spellId, not bIsSpellExpaded)
|
|
--refresh the scrollFrame
|
|
scrolFrame:Refresh()
|
|
end
|
|
|
|
---update a line using the data passed
|
|
---@param spellBar breakdownspellbar
|
|
---@param index number spell position (from best to wrost)
|
|
---@param actorName string
|
|
---@param combatObject combat
|
|
---@param scrollFrame table
|
|
---@param headerTable table
|
|
---@param bkSpellData breakdownspelldata
|
|
---@param bkSpellStableIndex number
|
|
---@param totalValue number
|
|
---@param maxValue number
|
|
---@param bIsMainLine boolean if true this is the line which has all the values of the spell merged
|
|
local updateSpellBar = function(spellBar, index, actorName, combatObject, scrollFrame, headerTable, bkSpellData, bkSpellStableIndex, totalValue, maxValue, bIsMainLine)
|
|
--scrollFrame is defined as a table which is false, scrollFrame is a frame
|
|
|
|
local textIndex = 1
|
|
for headerIndex = 1, #headerTable do
|
|
---@type number
|
|
local spellId
|
|
---@type number
|
|
local value
|
|
---@type spelltable
|
|
local spellTable
|
|
|
|
local petName = ""
|
|
|
|
spellBar.bkSpellData = bkSpellData
|
|
|
|
if (bIsMainLine) then
|
|
spellTable = bkSpellData
|
|
value = bkSpellData.total
|
|
spellId = bkSpellData.id
|
|
petName = bkSpellData.petNames[bkSpellStableIndex]
|
|
else
|
|
spellTable = bkSpellData.spellTables[bkSpellStableIndex]
|
|
value = spellTable.total
|
|
spellId = spellTable.id
|
|
petName = bkSpellData.petNames[bkSpellStableIndex]
|
|
spellBar.bIsExpandedSpell = true
|
|
end
|
|
|
|
spellBar.spellId = spellId
|
|
|
|
---@cast spellTable spelltable
|
|
spellBar.spellTable = spellTable
|
|
|
|
---@type number
|
|
local amtCasts = combatObject:GetSpellCastAmount(actorName, spellId)
|
|
spellBar.amountCasts = amtCasts
|
|
---@type number
|
|
local uptime = combatObject:GetSpellUptime(actorName, spellId)
|
|
---@type number
|
|
local combatTime = combatObject:GetCombatTime()
|
|
---@type string, number, string
|
|
local spellName, _, spellIcon = Details.GetSpellInfo(spellId)
|
|
|
|
if (petName ~= "") then
|
|
spellName = spellName .. " (" .. petName .. ")"
|
|
end
|
|
|
|
spellBar.spellId = spellId
|
|
spellBar.spellIconFrame.spellId = spellId
|
|
|
|
--statusbar size by percent, statusbar color by school
|
|
spellBar.statusBar:SetValue(value / maxValue * 100)
|
|
local r, g, b = Details:GetSpellSchoolColor(spellTable.spellschool or 1)
|
|
spellBar.statusBar:SetStatusBarColor(r, g, b, 1)
|
|
|
|
spellBar.average = value / spellTable.counter
|
|
spellBar.combatTime = combatTime
|
|
|
|
---@type fontstring
|
|
local text = spellBar.InLineTexts[textIndex]
|
|
local header = headerTable[headerIndex]
|
|
|
|
if (header.name == "icon") then --ok
|
|
spellBar.spellIcon:Show()
|
|
spellBar.spellIcon:SetTexture(spellIcon)
|
|
spellBar:AddFrameToHeaderAlignment(spellBar.spellIconFrame)
|
|
|
|
elseif (header.name == "target") then --the tab does not have knownledge about the targets of the spell, it must be passed over
|
|
---@type breakdowntargetframe
|
|
local targetsSquareFrame = spellBar.targetsSquareFrame
|
|
targetsSquareFrame:Show()
|
|
targetsSquareFrame.spellId = spellId
|
|
targetsSquareFrame.bkSpellData = spellTable
|
|
targetsSquareFrame.spellTable = spellTable
|
|
targetsSquareFrame.bIsMainLine = bIsMainLine
|
|
spellBar:AddFrameToHeaderAlignment(targetsSquareFrame)
|
|
|
|
elseif (header.name == "rank") then --ok
|
|
text:SetText(index)
|
|
spellBar:AddFrameToHeaderAlignment(text)
|
|
spellBar.rank = index
|
|
textIndex = textIndex + 1
|
|
|
|
elseif (header.name == "expand") then
|
|
text:SetText("")
|
|
spellBar:AddFrameToHeaderAlignment(spellBar.expandButton)
|
|
textIndex = textIndex + 1
|
|
|
|
if (bkSpellData.bCanExpand and bIsMainLine) then
|
|
spellBar.expandButton:Show()
|
|
local bIsSpellExpaded = Details222.BreakdownWindow.IsSpellExpanded(spellId)
|
|
|
|
spellBar.expandButton.spellId = spellId
|
|
spellBar.expandButton.bIsSpellExpaded = bIsSpellExpaded
|
|
spellBar.expandButton:SetScript("OnClick", onClickExpandButton)
|
|
|
|
--update the texture taking the state of the expanded value
|
|
spellBar.expandButton.texture:SetTexture(bIsSpellExpaded and [[Interface\BUTTONS\Arrow-Up-Down]] or [[Interface\BUTTONS\Arrow-Down-Down]])
|
|
end
|
|
|
|
elseif (header.name == "name") then --ok
|
|
text:SetText(spellName)
|
|
spellBar.name = spellName
|
|
spellBar:AddFrameToHeaderAlignment(text)
|
|
textIndex = textIndex + 1
|
|
|
|
elseif (header.name == "amount") then --ok
|
|
text:SetText(Details:Format(value))
|
|
spellBar:AddFrameToHeaderAlignment(text)
|
|
textIndex = textIndex + 1
|
|
|
|
elseif (header.name == "persecond") then --ok
|
|
spellBar.perSecond = value / combatTime
|
|
|
|
---@type string
|
|
local perSecondFormatted = Details:Format(spellBar.perSecond)
|
|
text:SetText(perSecondFormatted)
|
|
|
|
spellBar:AddFrameToHeaderAlignment(text)
|
|
textIndex = textIndex + 1
|
|
|
|
elseif (header.name == "percent") then --ok
|
|
spellBar.percent = value / totalValue * 100
|
|
---@type string
|
|
local percentFormatted = string.format("%.1f", spellBar.percent) .. "%"
|
|
text:SetText(percentFormatted)
|
|
|
|
spellBar:AddFrameToHeaderAlignment(text)
|
|
textIndex = textIndex + 1
|
|
|
|
elseif (header.name == "casts") then --the tab doesn't have information about the amount of casts
|
|
text:SetText(amtCasts)
|
|
spellBar:AddFrameToHeaderAlignment(text)
|
|
textIndex = textIndex + 1
|
|
|
|
elseif (header.name == "critpercent") then --the tab does not have this information
|
|
text:SetText(string.format("%.1f", spellTable.c_amt / (spellTable.counter) * 100) .. "%")
|
|
spellBar:AddFrameToHeaderAlignment(text)
|
|
textIndex = textIndex + 1
|
|
|
|
elseif (header.name == "hits") then
|
|
text:SetText(spellTable.counter)
|
|
spellBar:AddFrameToHeaderAlignment(text)
|
|
textIndex = textIndex + 1
|
|
|
|
elseif (header.name == "castavg") then
|
|
spellBar.castAverage = value / amtCasts
|
|
text:SetText(Details:Format(spellBar.castAverage))
|
|
spellBar:AddFrameToHeaderAlignment(text)
|
|
textIndex = textIndex + 1
|
|
|
|
elseif (header.name == "uptime") then --need to get the uptime of the spell with the biggest uptime
|
|
text:SetText(string.format("%.1f", uptime / combatTime * 100) .. "%")
|
|
spellBar:AddFrameToHeaderAlignment(text)
|
|
textIndex = textIndex + 1
|
|
|
|
elseif (header.name == "overheal") then
|
|
text:SetText(Details:Format(spellTable.overheal or 0))
|
|
spellBar:AddFrameToHeaderAlignment(text)
|
|
textIndex = textIndex + 1
|
|
|
|
elseif (header.name == "absorbed") then
|
|
text:SetText(Details:Format(spellTable.absorbed or 0))
|
|
spellBar:AddFrameToHeaderAlignment(text)
|
|
textIndex = textIndex + 1
|
|
|
|
end
|
|
end
|
|
|
|
spellBar:AlignWithHeader(scrollFrame.Header, "left")
|
|
end
|
|
|
|
---get a spell bar from the scroll box, if it doesn't exist, return nil
|
|
---@param scrollFrame table
|
|
---@param lineIndex number
|
|
---@return breakdownspellbar
|
|
local getSpellBar = function(scrollFrame, lineIndex)
|
|
---@type breakdownspellbar
|
|
local spellBar = scrollFrame:GetLine(lineIndex)
|
|
|
|
spellBar.bIsExpandedSpell = false
|
|
|
|
table.wipe(spellBar.ExpandedChildren)
|
|
|
|
--reset header alignment
|
|
spellBar:ResetFramesToHeaderAlignment()
|
|
|
|
--reset columns, hiding them
|
|
spellBar.spellIcon:Hide()
|
|
spellBar.expandButton:Hide()
|
|
spellBar.targetsSquareFrame:Hide()
|
|
for inLineIndex = 1, #spellBar.InLineTexts do
|
|
spellBar.InLineTexts[inLineIndex]:SetText("")
|
|
end
|
|
|
|
return spellBar
|
|
end
|
|
|
|
---refresh the data shown in the spells scroll box
|
|
---@param scrollFrame table
|
|
---@param scrollData breakdownscrolldata
|
|
---@param offset number
|
|
---@param totalLines number
|
|
local refreshFunc = function(scrollFrame, scrollData, offset, totalLines) --~refresh spells
|
|
---@type number
|
|
local maxValue = scrollData[1] and scrollData[1].total
|
|
---@type number
|
|
local totalValue = scrollData.totalValue
|
|
|
|
---@type actor
|
|
local actorObject = spellsTab.GetActor()
|
|
---@type string
|
|
local actorName = actorObject:Name()
|
|
|
|
---@type combat
|
|
local combatObject = spellsTab.GetCombat()
|
|
---@type instance
|
|
local instanceObject = spellsTab.GetInstance()
|
|
|
|
local headerTable = spellsTab.BuildHeaderTable()
|
|
scrollFrame.Header:SetHeaderTable(headerTable)
|
|
|
|
local lineIndex = 1
|
|
for i = 1, totalLines do
|
|
local index = i + offset
|
|
|
|
---@type breakdownspelldata
|
|
local bkSpellData = scrollData[index]
|
|
|
|
if (bkSpellData) then
|
|
--before getting a line, check if the data for the line is a expanded line and if the spell is expanded
|
|
local expandedIndex = bkSpellData.expandedIndex
|
|
local spellId = bkSpellData.id
|
|
local value = math.floor(bkSpellData.total)
|
|
|
|
---@type number[]
|
|
local spellIds = bkSpellData.spellIds --array with spellIds
|
|
---@type spelltable[]
|
|
local spellTables = bkSpellData.spellTables --array with spellTables
|
|
---@type number
|
|
local spellTablesAmount = #spellTables
|
|
---@type string[]
|
|
local petNames = bkSpellData.petNames --array with pet names
|
|
---@type boolean
|
|
|
|
---called mainSpellBar because it is the line that shows the sum of all spells merged (if any)
|
|
---@type breakdownspellbar
|
|
local mainSpellBar = getSpellBar(scrollFrame, lineIndex)
|
|
do
|
|
--main line of the spell, where the sum of all spells merged is shown
|
|
if (mainSpellBar) then
|
|
lineIndex = lineIndex + 1
|
|
local bIsMainLine = true
|
|
updateSpellBar(mainSpellBar, index, actorName, combatObject, scrollFrame, headerTable, bkSpellData, 1, totalValue, maxValue, bIsMainLine)
|
|
end
|
|
end
|
|
|
|
--then it adds the lines for each spell merged, but it cannot use the bkSpellData, it needs the spellTable
|
|
if (bkSpellData.bIsExpanded and spellTablesAmount > 1) then
|
|
---@type number spellTableIndex is the same counter as bkSpellStableIndex
|
|
for spellTableIndex = 1, spellTablesAmount do
|
|
---@type breakdownspellbar
|
|
local spellBar = getSpellBar(scrollFrame, lineIndex)
|
|
if (spellBar) then
|
|
lineIndex = lineIndex + 1
|
|
---@type string
|
|
local petName = petNames[spellTableIndex]
|
|
---@type string
|
|
local nameToUse = petName ~= "" and petName or actorName
|
|
local bIsMainLine = false
|
|
updateSpellBar(spellBar, index, nameToUse, combatObject, scrollFrame, headerTable, bkSpellData, spellTableIndex, totalValue, maxValue, bIsMainLine)
|
|
mainSpellBar.ExpandedChildren[#mainSpellBar.ExpandedChildren + 1] = spellBar
|
|
end
|
|
end
|
|
end
|
|
|
|
if (lineIndex > totalLines) then
|
|
break
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
---creates a scrollframe which show breakdownspellbar to show the spells used by an actor
|
|
---@param tabFrame tabframe
|
|
---@return breakdownspellscrollframe
|
|
function spellsTab.CreateSpellScrollContainer(tabFrame)
|
|
--replace this with a framework scrollframe
|
|
local scrollFrame = DF:CreateScrollBox(tabFrame, "$parentSpellScroll", refreshFunc, {}, CONST_SPELLSCROLL_WIDTH, CONST_SPELLSCROLL_HEIGHT, CONST_SPELLSCROLL_AMTLINES, CONST_SPELLSCROLL_LINEHEIGHT)
|
|
DF:ReskinSlider(scrollFrame)
|
|
DF:ApplyStandardBackdrop(scrollFrame)
|
|
scrollFrame:SetPoint("topleft", tabFrame, "topleft", 5, -5) --need to set the points
|
|
scrollFrame:EnableMouse(true)
|
|
scrollFrame:SetMovable(true)
|
|
tabFrame.SpellScrollFrame = scrollFrame
|
|
|
|
function scrollFrame:RefreshMe(data)
|
|
self:SetData(data)
|
|
self:Refresh()
|
|
end
|
|
|
|
--~header
|
|
local headerOptions = {
|
|
padding = 2,
|
|
header_height = 14,
|
|
}
|
|
|
|
local headerTable = {}
|
|
|
|
scrollFrame.Header = DetailsFramework:CreateHeader(scrollFrame, headerTable, headerOptions)
|
|
scrollFrame.Header:SetPoint("topleft", scrollFrame, "topleft", 0, 0)
|
|
|
|
--create the scroll lines
|
|
for i = 1, CONST_SPELLSCROLL_AMTLINES do
|
|
scrollFrame:CreateLine(spellsTab.CreateSpellBar)
|
|
end
|
|
|
|
return scrollFrame
|
|
end
|
|
|
|
--special backgrounds -- fundos especiais de friendly fire e outros
|
|
function spellsTab.CreateSpecialBackgrounds(tabFrame)
|
|
tabFrame.no_targets = tabFrame:CreateTexture("DetailsBreakdownWindow_no_targets", "overlay")
|
|
tabFrame.no_targets:SetPoint("bottomleft", tabFrame, "bottomleft", 20, 6)
|
|
tabFrame.no_targets:SetSize(301, 100)
|
|
tabFrame.no_targets:SetTexture([[Interface\QUESTFRAME\UI-QUESTLOG-EMPTY-TOPLEFT]])
|
|
tabFrame.no_targets:SetTexCoord(0.015625, 1, 0.01171875, 0.390625)
|
|
tabFrame.no_targets:SetDesaturated(true)
|
|
tabFrame.no_targets:SetAlpha(.7)
|
|
tabFrame.no_targets.text = tabFrame:CreateFontString(nil, "overlay", "GameFontNormal")
|
|
tabFrame.no_targets.text:SetPoint("center", tabFrame.no_targets, "center")
|
|
tabFrame.no_targets.text:SetText(Loc ["STRING_NO_TARGET_BOX"])
|
|
tabFrame.no_targets.text:SetTextColor(1, 1, 1, .4)
|
|
tabFrame.no_targets:Hide()
|
|
end
|
|
|
|
---on enter function for the spell target frame
|
|
---@param targetFrame breakdowntargetframe
|
|
local onEnterSpellTarget = function(targetFrame)
|
|
--the spell target frame is created in the statusbar which is placed above the line frame
|
|
local lineBar = targetFrame:GetParent():GetParent()
|
|
local spellId = targetFrame.spellId
|
|
|
|
---@type actor
|
|
local actorObject = Details:GetPlayerObjectFromBreakdownWindow()
|
|
|
|
local targets
|
|
if (targetFrame.bIsMainLine) then
|
|
---@type breakdownspelldata
|
|
local bkSpellData = targetFrame.bkSpellData
|
|
targets = actorObject:BuildSpellTargetFromBreakdownSpellData(bkSpellData)
|
|
else
|
|
local spellTable = targetFrame.spellTable
|
|
targets = actorObject:BuildSpellTargetFromSpellTable(spellTable)
|
|
end
|
|
|
|
---@type number the top value of targets
|
|
local topValue = targets[1] and targets[1][2] or 0
|
|
|
|
local cooltip = GameCooltip
|
|
cooltip:Preset(2)
|
|
|
|
for targetIndex, targetTable in ipairs(targets) do
|
|
local targetName = targetTable[1]
|
|
local value = targetTable[2]
|
|
cooltip:AddLine(targetIndex .. ". " .. targetName, Details:Format(value))
|
|
GameCooltip:AddIcon([[Interface\MINIMAP\TRACKING\Target]], 1, 1, 14, 14)
|
|
Details:AddTooltipBackgroundStatusbar(false, value / topValue * 100)
|
|
end
|
|
|
|
cooltip:SetOwner(targetFrame)
|
|
cooltip:Show()
|
|
|
|
if true then return end
|
|
|
|
do
|
|
if (spellId and type(spellId) == "number") then
|
|
---@type actor
|
|
local actorObject = lineBar.other_actor or breakdownWindow.jogador
|
|
local spellTable = actorObject.spells and actorObject.spells:GetSpell(spellId)
|
|
|
|
if (spellTable) then
|
|
local spellsSortedResult = {}
|
|
local targetContainer
|
|
local total = 0
|
|
|
|
if (spellTable.isReflection) then
|
|
targetContainer = spellTable.extra
|
|
else
|
|
local attribute, subAttribute = breakdownWindow.instancia:GetDisplay()
|
|
if (attribute == 1 or attribute == 3) then
|
|
targetContainer = spellTable.targets
|
|
else
|
|
if (subAttribute == 3) then --overheal
|
|
targetContainer = spellTable.targets_overheal
|
|
|
|
elseif (subAttribute == 6) then --absorbs
|
|
targetContainer = spellTable.targets_absorbs
|
|
|
|
else
|
|
targetContainer = spellTable.targets
|
|
end
|
|
end
|
|
end
|
|
|
|
--add and sort
|
|
for targetName, amount in pairs(targetContainer) do
|
|
if (amount > 0) then
|
|
spellsSortedResult[#spellsSortedResult+1] = {targetName, amount}
|
|
total = total + amount
|
|
end
|
|
end
|
|
table.sort(spellsSortedResult, Details.Sort2)
|
|
|
|
local spellName, _, spellIcon = _GetSpellInfo(spellId)
|
|
|
|
GameTooltip:SetOwner(targetFrame, "ANCHOR_TOPRIGHT")
|
|
GameTooltip:AddLine(lineBar.index .. ". " .. spellName)
|
|
GameTooltip:AddLine(Loc ["STRING_TARGETS"] .. ":")
|
|
GameTooltip:AddLine(" ")
|
|
|
|
--get time type
|
|
local timeElapsed
|
|
if (Details.time_type == 1 or not actorObject.grupo) then
|
|
timeElapsed = actorObject:Tempo()
|
|
elseif (Details.time_type == 2) then
|
|
timeElapsed = breakdownWindow.instancia.showing:GetCombatTime()
|
|
end
|
|
|
|
local abbreviationFunction = Details.ToKFunctions[Details.ps_abbreviation]
|
|
|
|
if (spellTable.isReflection) then
|
|
Details:FormatCooltipForSpells()
|
|
GameCooltip:SetOwner(targetFrame, "bottomright", "top", 4, -2)
|
|
|
|
Details:AddTooltipSpellHeaderText("Spells Reflected", {1, 0.9, 0.0, 1}, 1, select(3, _GetSpellInfo(spellTable.id)), 0.1, 0.9, 0.1, 0.9) --localize-me
|
|
Details:AddTooltipHeaderStatusbar(1, 1, 1, 0.4)
|
|
|
|
GameCooltip:AddIcon(select(3, _GetSpellInfo(spellTable.id)), 1, 1, 16, 16, .1, .9, .1, .9)
|
|
Details:AddTooltipHeaderStatusbar(1, 1, 1, 0.5)
|
|
|
|
local topAmount = spellsSortedResult[1] and spellsSortedResult[1][2]
|
|
|
|
for index, targetTable in ipairs(spellsSortedResult) do
|
|
local targetName = targetTable[1]
|
|
local amount = targetTable[2]
|
|
|
|
GameCooltip:AddLine(spellName, abbreviationFunction(_, amount) .. " (" .. math.floor(amount / topAmount * 100) .. "%)")
|
|
GameCooltip:AddIcon(spellIcon, 1, 1, 16, 16, .1, .9, .1, .9)
|
|
Details:AddTooltipBackgroundStatusbar(false, amount / topAmount * 100)
|
|
end
|
|
|
|
GameCooltip:Show()
|
|
|
|
targetFrame.texture:SetAlpha(1)
|
|
targetFrame:SetAlpha(1)
|
|
lineBar:GetScript("OnEnter")(lineBar)
|
|
return
|
|
else
|
|
for index, targetTable in ipairs(spellsSortedResult) do
|
|
local targetName = targetTable[1]
|
|
local amount = targetTable[2]
|
|
|
|
local class = Details:GetClass(targetName)
|
|
if (class and Details.class_coords[class]) then
|
|
local cords = Details.class_coords[class]
|
|
if (breakdownWindow.target_persecond) then
|
|
GameTooltip:AddDoubleLine(index .. ". |TInterface\\AddOns\\Details\\images\\classes_small_alpha:14:14:0:0:128:128:"..cords[1]*128 ..":"..cords[2]*128 ..":"..cords[3]*128 ..":"..cords[4]*128 .."|t " .. targetName, Details:comma_value(math.floor(amount / timeElapsed)), 1, 1, 1, 1, 1, 1)
|
|
else
|
|
GameTooltip:AddDoubleLine(index .. ". |TInterface\\AddOns\\Details\\images\\classes_small_alpha:14:14:0:0:128:128:"..cords[1]*128 ..":"..cords[2]*128 ..":"..cords[3]*128 ..":"..cords[4]*128 .."|t " .. targetName, abbreviationFunction(_, amount), 1, 1, 1, 1, 1, 1)
|
|
end
|
|
else
|
|
if (breakdownWindow.target_persecond) then
|
|
GameTooltip:AddDoubleLine(index .. ". " .. targetName, Details:comma_value(math.floor(amount / timeElapsed)), 1, 1, 1, 1, 1, 1)
|
|
else
|
|
GameTooltip:AddDoubleLine(index .. ". " .. targetName, abbreviationFunction(_, amount), 1, 1, 1, 1, 1, 1)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
GameTooltip:Show()
|
|
else
|
|
GameTooltip:SetOwner(targetFrame, "ANCHOR_TOPRIGHT")
|
|
GameTooltip:AddLine(lineBar.index .. ". " .. lineBar.spellId)
|
|
GameTooltip:AddLine(breakdownWindow.target_text)
|
|
GameTooltip:AddLine(Loc ["STRING_NO_TARGET"], 1, 1, 1)
|
|
GameTooltip:AddLine(Loc ["STRING_MORE_INFO"], 1, 1, 1)
|
|
GameTooltip:Show()
|
|
end
|
|
else
|
|
GameTooltip:SetOwner(targetFrame, "ANCHOR_TOPRIGHT")
|
|
GameTooltip:AddLine(lineBar.index .. ". " .. lineBar.spellId)
|
|
GameTooltip:AddLine(breakdownWindow.target_text)
|
|
GameTooltip:AddLine(Loc ["STRING_NO_TARGET"], 1, 1, 1)
|
|
GameTooltip:AddLine(Loc ["STRING_MORE_INFO"], 1, 1, 1)
|
|
GameTooltip:Show()
|
|
end
|
|
|
|
targetFrame.texture:SetAlpha(.7)
|
|
targetFrame:SetAlpha(1)
|
|
lineBar:GetScript("OnEnter")(lineBar)
|
|
end
|
|
end
|
|
|
|
local onLeaveSpellTarget = function(self)
|
|
GameTooltip:Hide()
|
|
GameCooltip:Hide()
|
|
self:GetParent():GetParent():GetScript("OnLeave")(self:GetParent():GetParent())
|
|
self.texture:SetAlpha(.7)
|
|
self:SetAlpha(.7)
|
|
end
|
|
|
|
---create a spellbar within the spell scroll
|
|
---@param self breakdownspellscrollframe
|
|
---@param index number
|
|
---@return breakdownspellbar
|
|
function spellsTab.CreateSpellBar(self, index) --~spellbar ~spellline ~spell ~create ~createline
|
|
---@type breakdownspellbar
|
|
local spellBar = CreateFrame("button", self:GetName() .. "SpellBar" .. index, self, "BackdropTemplate")
|
|
spellBar:SetHeight(CONST_SPELLSCROLL_LINEHEIGHT)
|
|
spellBar.index = index
|
|
local y = (index-1) * CONST_SPELLSCROLL_LINEHEIGHT * -1 + (1 * -index) - 15
|
|
spellBar:SetPoint("topleft", self, "topleft", 0, y)
|
|
spellBar:SetPoint("topright", self, "topright", 0, y)
|
|
spellBar:SetFrameLevel(self:GetFrameLevel() + 1)
|
|
spellBar:EnableMouse(true)
|
|
spellBar:RegisterForClicks("LeftButtonDown", "RightButtonUp")
|
|
spellBar:SetScript("OnEnter", onEnterBreakdownSpellBar)
|
|
spellBar:SetScript("OnLeave", onLeaveBreakdownSpellBar)
|
|
spellBar:SetScript("OnMouseDown", onMouseDownBreakdownSpellBar)
|
|
spellBar:SetScript("OnMouseUp", onMouseUpBreakdownSpellBar)
|
|
spellBar.onMouseUpTime = 0
|
|
spellBar.ExpandedChildren = {}
|
|
|
|
DF:Mixin(spellBar, DF.HeaderFunctions)
|
|
|
|
---@type statusbar
|
|
local statusBar = CreateFrame("StatusBar", "$parentStatusBar", spellBar, "BackdropTemplate")
|
|
statusBar:SetFrameLevel(spellBar:GetFrameLevel()-1)
|
|
statusBar:SetAllPoints()
|
|
statusBar:SetAlpha(0.5)
|
|
statusBar:SetMinMaxValues(0, 100)
|
|
statusBar:SetValue(50)
|
|
spellBar.statusBar = statusBar
|
|
|
|
---@type texture
|
|
local statusBarTexture = statusBar:CreateTexture("$parentTexture", "artwork")
|
|
statusBarTexture:SetTexture(SharedMedia:Fetch("statusbar", "Details Hyanda"))
|
|
statusBar:SetStatusBarTexture(statusBarTexture)
|
|
statusBar:SetStatusBarColor(1, 1, 1, 1)
|
|
|
|
---create the overlay texture to use when the spellbar is selected
|
|
---@type texture
|
|
local statusBarOverlayTexture = statusBar:CreateTexture("$parentTextureOverlay", "overlay", nil, 7)
|
|
statusBarOverlayTexture:SetTexture([[Interface/AddOns/Details/images/overlay_indicator_1]])
|
|
statusBarOverlayTexture:SetVertexColor(1, 1, 1, 0.2)
|
|
statusBarOverlayTexture:SetAllPoints()
|
|
statusBarOverlayTexture:Hide()
|
|
spellBar.overlayTexture = statusBarOverlayTexture
|
|
statusBar.overlayTexture = statusBarOverlayTexture
|
|
|
|
---@type texture
|
|
local hightlightTexture = statusBar:CreateTexture("$parentTextureHighlight", "highlight")
|
|
hightlightTexture:SetColorTexture(1, 1, 1, 0.2)
|
|
hightlightTexture:SetAllPoints()
|
|
statusBar.highlightTexture = hightlightTexture
|
|
|
|
---@type texture
|
|
local backgroundTexture = statusBar:CreateTexture("$parentTextureBackground", "background")
|
|
backgroundTexture:SetAllPoints()
|
|
backgroundTexture:SetColorTexture(.1, .1, .1, 0.38)
|
|
statusBar.backgroundTexture = backgroundTexture
|
|
|
|
--button to expand the bar when there's spells merged
|
|
---@type breakdownexpandbutton
|
|
local expandButton = CreateFrame("button", "$parentExpandButton", spellBar, "BackdropTemplate")
|
|
expandButton:SetSize(CONST_BAR_HEIGHT, CONST_BAR_HEIGHT)
|
|
expandButton:RegisterForClicks("LeftButtonDown")
|
|
spellBar.expandButton = expandButton
|
|
|
|
---@type texture
|
|
local expandButtonTexture = expandButton:CreateTexture("$parentTexture", "artwork")
|
|
expandButtonTexture:SetPoint("center", expandButton, "center", 0, 0)
|
|
expandButtonTexture:SetSize(CONST_BAR_HEIGHT-2, CONST_BAR_HEIGHT-2)
|
|
expandButton.texture = expandButtonTexture
|
|
|
|
--frame which will show the spell tooltip
|
|
---@type frame
|
|
local spellIconFrame = CreateFrame("frame", "$parentIconFrame", spellBar, "BackdropTemplate")
|
|
spellIconFrame:SetSize(CONST_BAR_HEIGHT - 2, CONST_BAR_HEIGHT - 2)
|
|
spellIconFrame:SetScript("OnEnter", onEnterSpellIconFrame)
|
|
spellIconFrame:SetScript("OnLeave", onLeaveSpellIconFrame)
|
|
spellBar.spellIconFrame = spellIconFrame
|
|
|
|
--create the icon to show the spell texture
|
|
---@type texture
|
|
local spellIcon = spellIconFrame:CreateTexture("$parentTexture", "overlay")
|
|
spellIcon:SetAllPoints()
|
|
spellIcon:SetTexCoord(.1, .9, .1, .9)
|
|
spellBar.spellIcon = spellIcon
|
|
|
|
--create a square frame which is placed at the right side of the line to show which targets for damaged by the spell
|
|
---@type breakdowntargetframe
|
|
local targetsSquareFrame = CreateFrame("frame", "$parentTargetsFrame", statusBar, "BackdropTemplate")
|
|
targetsSquareFrame:SetSize(CONST_SPELLSCROLL_LINEHEIGHT, CONST_SPELLSCROLL_LINEHEIGHT)
|
|
targetsSquareFrame:SetAlpha(.7)
|
|
targetsSquareFrame:SetScript("OnEnter", onEnterSpellTarget)
|
|
targetsSquareFrame:SetScript("OnLeave", onLeaveSpellTarget)
|
|
targetsSquareFrame:SetFrameLevel(statusBar:GetFrameLevel()+2)
|
|
spellBar.targetsSquareFrame = targetsSquareFrame
|
|
|
|
---@type texture
|
|
local targetTexture = targetsSquareFrame:CreateTexture("$parentTexture", "overlay")
|
|
targetTexture:SetTexture([[Interface\MINIMAP\TRACKING\Target]])
|
|
targetTexture:SetAllPoints()
|
|
targetTexture:SetDesaturated(true)
|
|
spellBar.targetsSquareTexture = targetTexture
|
|
targetsSquareFrame.texture = targetTexture
|
|
|
|
spellBar:AddFrameToHeaderAlignment(spellIconFrame)
|
|
spellBar:AddFrameToHeaderAlignment(targetsSquareFrame)
|
|
|
|
--create texts
|
|
---@type fontstring[]
|
|
spellBar.InLineTexts = {}
|
|
|
|
for i = 1, 16 do
|
|
---@type fontstring
|
|
local fontString = spellBar:CreateFontString("$parentFontString" .. i, "overlay", "GameFontHighlightSmall")
|
|
fontString:SetJustifyH("left")
|
|
fontString:SetTextColor(1, 1, 1, 1)
|
|
fontString:SetNonSpaceWrap(true)
|
|
fontString:SetWordWrap(false)
|
|
spellBar["lineText" .. i] = fontString
|
|
spellBar.InLineTexts[i] = fontString
|
|
fontString:SetTextColor(1, 1, 1, 1)
|
|
spellBar:AddFrameToHeaderAlignment(fontString)
|
|
end
|
|
|
|
spellBar:AlignWithHeader(self.Header, "left")
|
|
|
|
spellBar.on_focus = false
|
|
|
|
return spellBar
|
|
end
|
|
|
|
|
|
--[=[
|
|
function gump:CriaNovaBarraInfo2(instance, index) --not used on this file, used on class damage, heal, etc
|
|
if (_detalhes.playerDetailWindow.barras2[index]) then
|
|
return
|
|
end
|
|
|
|
local janela = info.container_alvos.gump
|
|
|
|
local newBar = CreateFrame("Button", "Details_infobox2_bar_" .. index, info.container_alvos.gump, "BackdropTemplate")
|
|
newBar:SetHeight(CONST_TARGET_HEIGHT)
|
|
|
|
local y = (index-1) * (CONST_TARGET_HEIGHT + 1)
|
|
y = y* - 1
|
|
|
|
newBar:SetPoint("LEFT", janela, "LEFT", CONST_TARGET_HEIGHT, 0)
|
|
newBar:SetPoint("RIGHT", janela, "RIGHT", 0, 0)
|
|
newBar:SetPoint("TOP", janela, "TOP", 0, y)
|
|
newBar:SetFrameLevel(janela:GetFrameLevel() + 1)
|
|
newBar:EnableMouse(true)
|
|
newBar:RegisterForClicks("LeftButtonDown","RightButtonUp")
|
|
|
|
--icon
|
|
newBar.icone = newBar:CreateTexture(nil, "OVERLAY")
|
|
newBar.icone:SetWidth(CONST_TARGET_HEIGHT)
|
|
newBar.icone:SetHeight(CONST_TARGET_HEIGHT)
|
|
newBar.icone:SetPoint("RIGHT", newBar, "LEFT", 0, 0)
|
|
|
|
CriaTexturaBarra(newBar)
|
|
|
|
newBar:SetAlpha(ALPHA_BLEND_AMOUNT)
|
|
newBar.icone:SetAlpha(1)
|
|
|
|
newBar.isAlvo = true
|
|
|
|
SetBarraScripts(newBar, instance, index)
|
|
|
|
info.barras2[index] = newBar --barra adicionada
|
|
|
|
return newBar
|
|
end
|
|
|
|
function gump:CriaNovaBarraInfo3(instance, index) --not used on this file, used on class damage, heal, etc
|
|
if (_detalhes.playerDetailWindow.barras3[index]) then
|
|
return
|
|
end
|
|
|
|
local janela = info.container_detalhes
|
|
|
|
local newBar = CreateFrame("button", "Details_infobox3_bar_" .. index, janela, "BackdropTemplate")
|
|
newBar:SetHeight(16)
|
|
|
|
local y = (index-1) * 17
|
|
y = y*-1
|
|
|
|
container3_bars_pointFunc(newBar, index) --what this fun does?
|
|
newBar:EnableMouse(true)
|
|
|
|
--icon
|
|
newBar.icone = newBar:CreateTexture(nil, "OVERLAY")
|
|
newBar.icone:SetWidth(14)
|
|
newBar.icone:SetHeight(14)
|
|
newBar.icone:SetPoint("LEFT", newBar, "LEFT", 0, 0)
|
|
|
|
CriaTexturaBarra(newBar)
|
|
|
|
newBar:SetAlpha(0.9)
|
|
newBar.icone:SetAlpha(1)
|
|
|
|
newBar.isDetalhe = true
|
|
|
|
SetBarraScripts(newBar, instance, index)
|
|
|
|
info.barras3[index] = newBar
|
|
|
|
return newBar
|
|
end
|
|
--]=]
|
|
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
--> report data
|
|
|
|
function spellsTab.monta_relatorio(botao)
|
|
---@type attributeid
|
|
local mainSection = breakdownWindow.atributo
|
|
---@type attributeid
|
|
local subSection = breakdownWindow.sub_atributo
|
|
---@type actor
|
|
local player = breakdownWindow.jogador
|
|
---@type instance
|
|
local instance = breakdownWindow.instancia
|
|
---@type number
|
|
local amt = _detalhes.report_lines
|
|
|
|
local tabFrame = spellsTab.TabFrame
|
|
|
|
if (not player) then
|
|
_detalhes:Msg("Player not found.")
|
|
return
|
|
end
|
|
|
|
local report_lines
|
|
|
|
if (botao == 1) then --spell data
|
|
if (mainSection == 1 and subSection == 4) then --friendly fire
|
|
report_lines = {"Details!: " .. player.nome .. " " .. Loc ["STRING_ATTRIBUTE_DAMAGE_FRIENDLYFIRE"] .. ":"}
|
|
|
|
elseif (mainSection == 1 and subSection == 3) then --damage taken
|
|
report_lines = {"Details!: " .. player.nome .. " " .. Loc ["STRING_ATTRIBUTE_DAMAGE_TAKEN"] .. ":"}
|
|
|
|
else
|
|
report_lines = {"Details!: " .. player.nome .. " - " .. _detalhes.sub_atributos [mainSection].lista [subSection] .. ""}
|
|
end
|
|
|
|
for index, barra in ipairs(tabFrame.barras1) do
|
|
if (barra:IsShown()) then
|
|
local spellid = barra.show
|
|
if (mainSection == 1 and subSection == 4) then --friendly fire
|
|
report_lines [#report_lines+1] = barra.lineText1:GetText() .. ": " .. barra.lineText4:GetText()
|
|
|
|
elseif (type(spellid) == "number" and spellid > 10) then
|
|
local link = GetSpellLink(spellid)
|
|
report_lines [#report_lines+1] = index .. ". " .. link .. ": " .. barra.lineText4:GetText()
|
|
else
|
|
local spellname = barra.lineText1:GetText():gsub((".*%."), "")
|
|
spellname = spellname:gsub("|c%x%x%x%x%x%x%x%x", "")
|
|
spellname = spellname:gsub("|r", "")
|
|
report_lines [#report_lines+1] = index .. ". " .. spellname .. ": " .. barra.lineText4:GetText()
|
|
end
|
|
end
|
|
|
|
if (index == amt) then
|
|
break
|
|
end
|
|
end
|
|
|
|
elseif (botao == 3) then --targets
|
|
if (mainSection == 1 and subSection == 3) then
|
|
print(Loc ["STRING_ACTORFRAME_NOTHING"])
|
|
return
|
|
end
|
|
|
|
report_lines = {"Details! " .. Loc ["STRING_ACTORFRAME_REPORTTARGETS"] .. " " .. _detalhes.sub_atributos [1].lista [1] .. " " .. Loc ["STRING_ACTORFRAME_REPORTOF"] .. " " .. player.nome}
|
|
|
|
for index, barra in ipairs(tabFrame.barras2) do
|
|
if (barra:IsShown()) then
|
|
report_lines[#report_lines+1] = barra.lineText1:GetText().. " -> " .. barra.lineText4:GetText()
|
|
end
|
|
if (index == amt) then
|
|
break
|
|
end
|
|
end
|
|
|
|
elseif (botao == 2) then --spell blocks
|
|
--dano --damage done --dps --heal
|
|
if ((mainSection == 1 and (subSection == 1 or subSection == 2)) or (mainSection == 2)) then
|
|
if (not player.detalhes) then
|
|
print(Loc ["STRING_ACTORFRAME_NOTHING"])
|
|
return
|
|
end
|
|
|
|
local nome = _GetSpellInfo(player.detalhes)
|
|
|
|
report_lines = {"Details! " .. Loc ["STRING_ACTORFRAME_REPORTTO"] .. " " .. _detalhes.sub_atributos [mainSection].lista [subSection] .. " " .. Loc ["STRING_ACTORFRAME_REPORTOF"] .. " " .. player.nome,
|
|
Loc ["STRING_ACTORFRAME_SPELLDETAILS"] .. ": " .. nome}
|
|
|
|
for i = 1, 5 do
|
|
local caixa = _detalhes.playerDetailWindow.grupos_detalhes[i]
|
|
if (caixa.bg:IsShown()) then
|
|
|
|
local linha = ""
|
|
|
|
local nome2 = caixa.nome2:GetText() --golpes
|
|
if (nome2 and nome2 ~= "") then
|
|
if (i == 1) then
|
|
linha = linha..nome2 .. " / "
|
|
else
|
|
linha = linha .. caixa.nome:GetText() .. " " .. nome2 .. " / "
|
|
end
|
|
end
|
|
|
|
local dano = caixa.dano:GetText() --dano
|
|
if (dano and dano ~= "") then
|
|
linha = linha .. dano .. " / "
|
|
end
|
|
|
|
local media = caixa.dano_media:GetText() --media
|
|
if (media and media ~= "") then
|
|
linha = linha..media .. " / "
|
|
end
|
|
|
|
local dano_dps = caixa.dano_dps:GetText()
|
|
if (dano_dps and dano_dps ~= "") then
|
|
linha = linha..dano_dps.." / "
|
|
end
|
|
|
|
local dano_porcento = caixa.dano_porcento:GetText()
|
|
if (dano_porcento and dano_porcento ~= "") then
|
|
linha = linha..dano_porcento.." "
|
|
end
|
|
|
|
report_lines [#report_lines+1] = linha
|
|
end
|
|
|
|
if (i == amt) then
|
|
break
|
|
end
|
|
end
|
|
|
|
--dano --damage tanken
|
|
elseif ( (mainSection == 1 and subSection == 3) or mainSection == 3) then
|
|
if (player.detalhes) then
|
|
report_lines = {"Details! " .. Loc ["STRING_ACTORFRAME_REPORTTO"] .. " " .. _detalhes.sub_atributos [1].lista [1] .. " " .. Loc ["STRING_ACTORFRAME_REPORTOF"] .. " " .. player.detalhes.. " " .. Loc ["STRING_ACTORFRAME_REPORTAT"] .. " " .. player.nome}
|
|
for index, barra in ipairs(tabFrame.barras3) do
|
|
if (barra:IsShown()) then
|
|
report_lines [#report_lines+1] = barra.lineText1:GetText() .. " ....... " .. barra.lineText4:GetText()
|
|
end
|
|
if (index == amt) then
|
|
break
|
|
end
|
|
end
|
|
else
|
|
report_lines = {}
|
|
end
|
|
end
|
|
|
|
elseif (botao >= 11) then --primeira caixa dos detalhes
|
|
botao = botao - 10
|
|
|
|
local nome
|
|
if (type(spellid) == "string") then --unknown spellid value
|
|
--is a pet
|
|
else
|
|
nome = _GetSpellInfo(player.detalhes)
|
|
local spelllink = GetSpellLink(player.detalhes)
|
|
if (spelllink) then
|
|
nome = spelllink
|
|
end
|
|
end
|
|
|
|
if (not nome) then
|
|
nome = ""
|
|
end
|
|
|
|
report_lines = {"Details! " .. Loc ["STRING_ACTORFRAME_REPORTTO"] .. " " .. _detalhes.sub_atributos [mainSection].lista [subSection].. " " .. Loc ["STRING_ACTORFRAME_REPORTOF"] .. " " .. player.nome,
|
|
Loc ["STRING_ACTORFRAME_SPELLDETAILS"] .. ": " .. nome}
|
|
|
|
local caixa = _detalhes.playerDetailWindow.grupos_detalhes[botao]
|
|
|
|
local linha = ""
|
|
local nome2 = caixa.nome2:GetText() --golpes
|
|
if (nome2 and nome2 ~= "") then
|
|
if (botao == 1) then
|
|
linha = linha .. nome2 .. " / "
|
|
else
|
|
linha = linha .. caixa.nome:GetText() .. " " .. nome2 .. " / "
|
|
end
|
|
end
|
|
|
|
local dano = caixa.dano:GetText() --dano
|
|
if (dano and dano ~= "") then
|
|
linha = linha..dano.." / "
|
|
end
|
|
|
|
local media = caixa.dano_media:GetText() --media
|
|
if (media and media ~= "") then
|
|
linha = linha..media.." / "
|
|
end
|
|
|
|
local dano_dps = caixa.dano_dps:GetText()
|
|
if (dano_dps and dano_dps ~= "") then
|
|
linha = linha..dano_dps.." / "
|
|
end
|
|
|
|
local dano_porcento = caixa.dano_porcento:GetText()
|
|
if (dano_porcento and dano_porcento ~= "") then
|
|
linha = linha..dano_porcento.." "
|
|
end
|
|
|
|
--remove a cor da school
|
|
linha = linha:gsub("|c%x?%x?%x?%x?%x?%x?%x?%x?", "")
|
|
linha = linha:gsub("|r", "")
|
|
|
|
report_lines [#report_lines+1] = linha
|
|
end
|
|
|
|
return instance:envia_relatorio(report_lines)
|
|
end
|
|
|
|
-----------------------------------------------------------------------------------------------------------------------
|
|
--> create the new tab
|
|
function Details.InitializeSpellBreakdownTab()
|
|
local tabButton, tabFrame = Details:CreatePlayerDetailsTab(
|
|
"Summary", --[1] tab name
|
|
Loc ["STRING_SPELLS"], --[2] localized name
|
|
function(tabOBject, playerObject) --[3] condition
|
|
if (playerObject) then
|
|
return true
|
|
else
|
|
return false
|
|
end
|
|
end,
|
|
|
|
function() --[4] fill function
|
|
--spellsTab.JI_AtualizaContainerBarras(-1) --not in use anymore
|
|
spellsTab.TabFrame.no_targets:Hide() --this is nil
|
|
spellsTab.TabFrame.no_targets.text:Hide()
|
|
|
|
spellsTab.OnShownTab()
|
|
--spellsTab.TrocaBackgroundInfo(spellsTab.TabFrame)
|
|
end,
|
|
|
|
function(tabButton, tabFrame) --[5] onclick
|
|
tabFrame:Show()
|
|
end,
|
|
|
|
spellsTab.OnCreateTabCallback, --[6] oncreate
|
|
iconTableSummary, --[7] icon table
|
|
nil, --[8] replace tab
|
|
true --[9] is default tab
|
|
)
|
|
|
|
spellsTab.TabButton = tabButton
|
|
spellsTab.TabFrame = tabFrame
|
|
|
|
---on receive data from a class
|
|
---@param data table
|
|
---@param actorObject actor
|
|
---@param combatObject combat
|
|
---@param instance instance
|
|
function tabButton.OnReceiveSpellData(data, actorObject, combatObject, instance)
|
|
spellsTab.currentActor = actorObject
|
|
spellsTab.combatObject = combatObject
|
|
spellsTab.instance = instance
|
|
spellsTab.TabFrame.SpellScrollFrame:RefreshMe(data)
|
|
end
|
|
end
|
|
|