diff --git a/Definitions.lua b/Definitions.lua index 3d8f59c6..31b0318d 100644 --- a/Definitions.lua +++ b/Definitions.lua @@ -51,6 +51,7 @@ ---@class point : string @string(topleft, topright, bottomleft, bottomright, top, bottom, left, right, center) is a string that represents a point on a frame. Points are used to position frames relative to each other. ---@class uiobject +---@field GetObjectType fun(self: uiobject) : string ---@field Show fun(self: uiobject) make the object be shown on the user screen ---@field Hide fun(self: uiobject) make the object be hidden from the user screen ---@field SetShown fun(self: uiobject, state: boolean) show or hide the object @@ -142,7 +143,6 @@ ---@field GetNumPoints fun(self: frame) : number ---@field GetNumRegions fun(self: frame) : number ---@field GetName fun(self: frame) : string ----@field GetObjectType fun(self: frame) : string ---@field GetChildren fun(self: frame) : frame[] ---@field GetRegions fun(self: frame) : region[] ---@field CreateTexture fun(self: frame, name: string|nil, layer: "background"|"border"|"artwork"|"overlay"|"highlight", inherits: string|nil, subLayer: number|nil) : texture diff --git a/Libs/DF/fw.lua b/Libs/DF/fw.lua index 1245843e..e4bfe072 100644 --- a/Libs/DF/fw.lua +++ b/Libs/DF/fw.lua @@ -1,6 +1,6 @@ -local dversion = 423 +local dversion = 424 local major, minor = "DetailsFramework-1.0", dversion local DF, oldminor = LibStub:NewLibrary(major, minor) diff --git a/Libs/DF/header.lua b/Libs/DF/header.lua index eceab551..5ccf1cb8 100644 --- a/Libs/DF/header.lua +++ b/Libs/DF/header.lua @@ -93,8 +93,9 @@ detailsFramework.HeaderFunctions = { ---@cast self df_headerchild for i = 1, #self.FramesToAlign do - local frame = self.FramesToAlign[i] - frame:ClearAllPoints() + ---@type uiobject + local uiObject = self.FramesToAlign[i] + uiObject:ClearAllPoints() ---@type df_headercolumnframe local columnHeader = columnHeaderFrames[i] @@ -103,12 +104,20 @@ detailsFramework.HeaderFunctions = { if (columnHeader.columnAlign == "right") then offset = columnHeader:GetWidth() - if (frame:GetObjectType() == "FontString") then - frame:SetJustifyH("right") + end + + if (uiObject:GetObjectType() == "FontString") then + ---@cast uiObject fontstring + if (columnHeader.columnAlign == "right") then + uiObject:SetJustifyH("right") + elseif (columnHeader.columnAlign == "left") then + uiObject:SetJustifyH("left") + elseif (columnHeader.columnAlign == "center") then + uiObject:SetJustifyH("center") end end - frame:SetPoint(columnHeader.columnAlign, self, anchor, columnHeader.XPosition + columnHeader.columnOffset + offset, 0) + uiObject:SetPoint(columnHeader.columnAlign, self, anchor, columnHeader.XPosition + columnHeader.columnOffset + offset, 0) end end end, diff --git a/classes/class_damage.lua b/classes/class_damage.lua index 9de38b11..dbfdf44b 100644 --- a/classes/class_damage.lua +++ b/classes/class_damage.lua @@ -1104,7 +1104,7 @@ end thisLine.icone_classe:SetTexture(spellIcon) thisLine.icone_classe:SetTexCoord(0.078125, 0.921875, 0.078125, 0.921875) thisLine.icone_classe:SetVertexColor(1, 1, 1) - if(thisLine.mouse_over and not instancia.baseframe.isMoving) then + if(thisLine.mouse_over and not instance.baseframe.isMoving) then local classIcon = thisLine:GetClassIcon() thisLine.iconHighlight:SetTexture(classIcon:GetTexture()) thisLine.iconHighlight:SetTexCoord(classIcon:GetTexCoord()) diff --git a/classes/class_spelltable.lua b/classes/class_spelltable.lua index 286a008c..7fbbbaf7 100644 --- a/classes/class_spelltable.lua +++ b/classes/class_spelltable.lua @@ -28,6 +28,11 @@ local spellTable_FieldsToSum = { ["absorbed"] = true, ["overheal"] = true, ["totaldenied"] = true, + ["e_amt"] = true, + ["e_dmg"] = true, + ["e_heal"] = true, + ["e_lvl"] = true, + ["e_total"] = true, } ---@class spelltablemixin @@ -90,16 +95,21 @@ Details.SpellTableMixin = { local spellTable = spellTables[i] if (spellTable) then for key, value in pairs(spellTable) do - ---@cast key string - ---@cast value number if (spellTable_FieldsToSum[key]) then - targetTable[key] = (targetTable[key] or 0) + value + --evoker empowerment levels + if (key == "e_lvl" or key == "e_heal" or key == "e_dmg") then + targetTable[key] = targetTable[key] or {} + for level, amount in pairs(value) do + targetTable[key][level] = (targetTable[key][level] or 0) + amount + end + else + targetTable[key] = (targetTable[key] or 0) + value + end end end end end end, - } --detailsFramework:Mixin(Details, Details.SpellTableMixin) \ No newline at end of file diff --git a/frames/window_playerbreakdown.lua b/frames/window_playerbreakdown.lua index ba065f13..217659cb 100644 --- a/frames/window_playerbreakdown.lua +++ b/frames/window_playerbreakdown.lua @@ -94,6 +94,7 @@ function Details:OpenBreakdownWindow(instanceObject, actorObject, bFromAttribute --create the player list frame in the left side of the window Details.PlayerBreakdown.CreatePlayerListFrame() + Details.PlayerBreakdown.CreateDumpDataFrame() if (not Details.row_singleclick_overwrite[mainAttribute] or not Details.row_singleclick_overwrite[mainAttribute][subAttribute]) then Details:CloseBreakdownWindow() @@ -337,6 +338,25 @@ function Details:CloseBreakdownWindow() end end +function Details.PlayerBreakdown.CreateDumpDataFrame() + breakdownWindow.dumpDataFrame = CreateFrame("frame", "$parentDumpTableFrame", DetailsBreakdownWindowPlayerScrollBox, "BackdropTemplate") + breakdownWindow.dumpDataFrame:SetPoint("topleft", DetailsBreakdownWindowPlayerScrollBox, "topleft", 0, 0) + breakdownWindow.dumpDataFrame:SetPoint("bottomright", DetailsBreakdownWindowPlayerScrollBox, "bottomright", 0, 0) + breakdownWindow.dumpDataFrame:SetFrameLevel(DetailsBreakdownWindowPlayerScrollBox:GetFrameLevel() + 10) + detailsFramework:ApplyStandardBackdrop(breakdownWindow.dumpDataFrame, true) + breakdownWindow.dumpDataFrame:Hide() + + --create a details framework special lua editor + breakdownWindow.dumpDataFrame.luaEditor = detailsFramework:NewSpecialLuaEditorEntry(breakdownWindow.dumpDataFrame, 1, 1, "text", "$parentCodeEditorWindow") + breakdownWindow.dumpDataFrame.luaEditor:SetPoint("topleft", breakdownWindow.dumpDataFrame, "topleft", 2, -2) + breakdownWindow.dumpDataFrame.luaEditor:SetPoint("bottomright", breakdownWindow.dumpDataFrame, "bottomright", -2, 2) + breakdownWindow.dumpDataFrame.luaEditor:SetFrameLevel(breakdownWindow.dumpDataFrame:GetFrameLevel()+1) + breakdownWindow.dumpDataFrame.luaEditor:SetBackdrop({}) + + --hide the scroll bar + DetailsBreakdownWindowPlayerScrollBoxDumpTableFrameCodeEditorWindowScrollBar:Hide() +end + function breakdownWindow:CreateRightSideBar() --not enabled breakdownWindow.RightSideBar = CreateFrame("frame", nil, breakdownWindow, "BackdropTemplate") breakdownWindow.RightSideBar:SetWidth(20) diff --git a/frames/window_playerbreakdown_spells.lua b/frames/window_playerbreakdown_spells.lua index 41f5ecf8..ca2dde4c 100644 --- a/frames/window_playerbreakdown_spells.lua +++ b/frames/window_playerbreakdown_spells.lua @@ -130,8 +130,8 @@ local spellContainerColumnData = { --the align seems to be bugged as the left is aligning in the center and center is on the left side {name = "icon", width = 22, label = "", align = "left", enabled = true, offset = columnOffset}, {name = "target", width = 22, label = "", align = "left", enabled = true, offset = columnOffset}, - {name = "rank", label = "#", width = 16, align = "left", enabled = true, offset = columnOffset, dataType = "number"}, - {name = "expand", label = "^", width = 16, align = "center", enabled = true, offset = columnOffset}, + {name = "rank", label = "#", width = 16, align = "center", enabled = true, offset = 6, dataType = "number"}, + {name = "expand", label = "^", width = 16, align = "left", enabled = true, offset = -4}, --maybe -3 {name = "name", label = "spell name", width = 246, align = "left", enabled = true, offset = columnOffset}, {name = "amount", label = "total", key = "total", selected = true, width = 50, align = "left", enabled = true, canSort = true, sortKey = "total", dataType = "number", order = "DESC", offset = columnOffset}, {name = "persecond", label = "ps", key = "total", width = 50, align = "left", enabled = false, canSort = true, sortKey = "ps", offset = columnOffset, order = "DESC", dataType = "number"}, @@ -503,10 +503,27 @@ local onEnterSpellBar = function(spellBar, motion) --parei aqui: precisa por nom if (IsShiftKeyDown()) then if (type(spellId) == "number") then GameCooltip:Preset(2) - GameCooltip:SetOwner(spellBar, "ANCHOR_TOPRIGHT") + GameCooltip:SetOwner(spellBar) GameCooltip:AddLine(Loc ["ABILITY_ID"] .. ": " .. spellBar.spellId) GameCooltip:Show() + + local t = combatObject:GetActor(1, actorName).spells._ActorTable[spellId] + + local textToEditor = "" + for key, value in pairs(t) do + if (type(value) ~= "function" and type(value) ~= "table") then + textToEditor = textToEditor .. key .. " = " .. tostring(value) .. "\n" + end + end + + breakdownWindow.dumpDataFrame:Show() + breakdownWindow.dumpDataFrame.luaEditor:SetText(textToEditor) + --hide the scroll bar + DetailsBreakdownWindowPlayerScrollBoxDumpTableFrameCodeEditorWindowScrollBar:Hide() end + + elseif (breakdownWindow.dumpDataFrame:IsShown()) then + breakdownWindow.dumpDataFrame:Hide() end if (spellId == 98021) then --spirit link totem @@ -562,6 +579,69 @@ local onEnterSpellBar = function(spellBar, motion) --parei aqui: precisa por nom blockLine3.rightText:SetText(Loc ["STRING_DPS"] .. ": " .. Details:CommaValue(spellBar.perSecond)) --dps end + local emporwerSpell = spellTable.e_total + if (emporwerSpell) then + local empowerLevelSum = spellTable.e_total --total sum of empower levels + local empowerAmount = spellTable.e_amt --amount of casts with empower + local empowerAmountPerLevel = spellTable.e_lvl --{[1] = 4; [2] = 9; [3] = 15} + local empowerDamagePerLevel = spellTable.e_dmg --{[1] = 54548745, [2] = 74548745} + + ---@type breakdownspellblock + local empowerBlock = spellBlockContainer:GetBlock(blockIndex) + blockIndex = blockIndex + 1 + + local level1AverageDamage = "0" + local level2AverageDamage = "0" + local level3AverageDamage = "0" + local level4AverageDamage = "0" + local level5AverageDamage = "0" + + if (empowerDamagePerLevel[1]) then + level1AverageDamage = Details:Format(empowerDamagePerLevel[1] / empowerAmountPerLevel[1]) + end + if (empowerDamagePerLevel[2]) then + level2AverageDamage = Details:Format(empowerDamagePerLevel[2] / empowerAmountPerLevel[2]) + end + if (empowerDamagePerLevel[3]) then + level3AverageDamage = Details:Format(empowerDamagePerLevel[3] / empowerAmountPerLevel[3]) + end + if (empowerDamagePerLevel[4]) then + level4AverageDamage = Details:Format(empowerDamagePerLevel[4] / empowerAmountPerLevel[4]) + end + if (empowerDamagePerLevel[5]) then + level5AverageDamage = Details:Format(empowerDamagePerLevel[5] / empowerAmountPerLevel[5]) + end + + empowerBlock:Show() + empowerBlock:SetValue(100) + + empowerBlock.sparkTexture:SetPoint("left", empowerBlock, "left", empowerBlock:GetWidth() + spellBreakdownSettings.blockspell_spark_offset, 0) + empowerBlock:SetColor(0.200, 0.576, 0.498, 0.6) + + local blockLine1, blockLine2, blockLine3 = empowerBlock:GetLines() + blockLine1.leftText:SetText("Spell Empower Average Level: " .. string.format("%.2f", empowerLevelSum / empowerAmount)) + + if (level1AverageDamage ~= "0") then + blockLine2.leftText:SetText("Level 1 Avg: " .. level1AverageDamage .. " (" .. (empowerAmountPerLevel[1] or 0) .. ")") + end + + if (level2AverageDamage ~= "0") then + blockLine2.centerText:SetText("Level 2 Avg: " .. level2AverageDamage .. " (" .. (empowerAmountPerLevel[2] or 0) .. ")") + end + + if (level3AverageDamage ~= "0") then + blockLine2.rightText:SetText("Level 3 Avg: " .. level3AverageDamage .. " (" .. (empowerAmountPerLevel[3] or 0) .. ")") + end + + if (level4AverageDamage ~= "0") then + blockLine3.leftText:SetText("Level 4 Avg: " .. level4AverageDamage .. " (" .. (empowerAmountPerLevel[4] or 0) .. ")") + end + + if (level5AverageDamage ~= "0") then + blockLine3.rightText:SetText("Level 5 Avg: " .. level5AverageDamage .. " (" .. (empowerAmountPerLevel[5] or 0) .. ")") + end + end + --check if there's normal hits and build the block ---@type number local normalHitsAmt = spellTable.n_amt @@ -620,68 +700,6 @@ local onEnterSpellBar = function(spellBar, motion) --parei aqui: precisa por nom blockLine3.rightText:SetText(Loc ["STRING_DPS"] .. ": " .. Details:CommaValue(spellTable.c_total / critTempoPercent)) end - local emporwerSpell = spellTable.e_total - if (emporwerSpell) then - local empowerLevelSum = spellTable.e_total --total sum of empower levels - local empowerAmount = spellTable.e_amt --amount of casts with empower - local empowerAmountPerLevel = spellTable.e_lvl --{[1] = 4; [2] = 9; [3] = 15} - local empowerDamagePerLevel = spellTable.e_dmg --{[1] = 54548745, [2] = 74548745} - - ---@type breakdownspellblock - local empowerBlock = spellBlockContainer:GetBlock(blockIndex) - empowerBlock:Show() - blockIndex = blockIndex + 1 - - local level1AverageDamage = "0" - local level2AverageDamage = "0" - local level3AverageDamage = "0" - local level4AverageDamage = "0" - local level5AverageDamage = "0" - - if (empowerDamagePerLevel[1]) then - level1AverageDamage = Details:Format(empowerDamagePerLevel[1] / empowerAmountPerLevel[1]) - end - if (empowerDamagePerLevel[2]) then - level2AverageDamage = Details:Format(empowerDamagePerLevel[2] / empowerAmountPerLevel[2]) - end - if (empowerDamagePerLevel[3]) then - level3AverageDamage = Details:Format(empowerDamagePerLevel[3] / empowerAmountPerLevel[3]) - end - if (empowerDamagePerLevel[4]) then - level4AverageDamage = Details:Format(empowerDamagePerLevel[4] / empowerAmountPerLevel[4]) - end - if (empowerDamagePerLevel[5]) then - level5AverageDamage = Details:Format(empowerDamagePerLevel[5] / empowerAmountPerLevel[5]) - end - - empowerBlock:SetValue(100) - empowerBlock.sparkTexture:SetPoint("left", empowerBlock, "left", empowerBlock:GetWidth() + spellBreakdownSettings.blockspell_spark_offset, 0) - empowerBlock:SetColor(0.200, 0.576, 0.498, 0.6) - - local blockLine1, blockLine2, blockLine3 = empowerBlock:GetLines() - blockLine1.leftText:SetText("Spell Empower Average Level: " .. string.format("%.2f", empowerLevelSum / empowerAmount)) - - if (level1AverageDamage ~= "0") then - blockLine2.leftText:SetText("Level 1 Avg: " .. level1AverageDamage .. " (" .. (empowerAmountPerLevel[1] or 0) .. ")") - end - - if (level2AverageDamage ~= "0") then - blockLine2.centerText:SetText("Level 2 Avg: " .. level2AverageDamage .. " (" .. (empowerAmountPerLevel[2] or 0) .. ")") - end - - if (level3AverageDamage ~= "0") then - blockLine2.rightText:SetText("Level 3 Avg: " .. level3AverageDamage .. " (" .. (empowerAmountPerLevel[3] or 0) .. ")") - end - - if (level4AverageDamage ~= "0") then - blockLine3.leftText:SetText("Level 4 Avg: " .. level4AverageDamage .. " (" .. (empowerAmountPerLevel[4] or 0) .. ")") - end - - if (level5AverageDamage ~= "0") then - blockLine3.rightText:SetText("Level 5 Avg: " .. level5AverageDamage .. " (" .. (empowerAmountPerLevel[5] or 0) .. ")") - end - end - if (trinketData[spellId]) then ---@type trinketdata local trinketInfo = trinketData[spellId] @@ -838,6 +856,10 @@ local onLeaveSpellBar = function(spellBar) if (not spellsTab.HasSelectedSpellBar()) then spellsTab.GetSpellBlockFrame():ClearBlocks() end + + if (breakdownWindow.dumpDataFrame:IsShown()) then + breakdownWindow.dumpDataFrame:Hide() + end end ---on mouse down a breakdownspellbar in the breakdown window @@ -1619,7 +1641,7 @@ local updateSpellBar = function(spellBar, index, actorName, combatObject, scroll --statusbar color by school local r, g, b = Details:GetSpellSchoolColor(spellTable.spellschool or 1) - spellBar.statusBar:SetStatusBarColor(r, g, b, 1) + spellBar.statusBar:SetStatusBarColor(r, g, b, 0.963) spellBar.average = value / spellTable.counter spellBar.combatTime = combatTime @@ -1631,6 +1653,7 @@ local updateSpellBar = function(spellBar, index, actorName, combatObject, scroll if (header.name == "icon") then --ok spellBar.spellIcon:Show() spellBar.spellIcon:SetTexture(spellIcon) + spellBar.spellIcon:SetAlpha(0.92) 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 @@ -1663,7 +1686,16 @@ local updateSpellBar = function(spellBar, index, actorName, combatObject, scroll 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]]) + if (bIsSpellExpaded) then + spellBar.expandButton.texture:SetTexture([[Interface\AddOns\Details\images\arrow_face_down]]) + spellBar.expandButton.texture:SetTexCoord(0, 1, 1, 0) + else + spellBar.expandButton.texture:SetTexture([[Interface\AddOns\Details\images\arrow_face_down]]) + spellBar.expandButton.texture:SetTexCoord(0, 1, 0, 1) + end + + spellBar.expandButton.texture:SetAlpha(0.7) + spellBar.expandButton.texture:SetSize(16, 16) end elseif (header.name == "name") then --ok diff --git a/images/arrow_face_down.tga b/images/arrow_face_down.tga new file mode 100644 index 00000000..7ba32929 Binary files /dev/null and b/images/arrow_face_down.tga differ