From 989cba5cc95ed79e5418738fa0e601e38a37cdce Mon Sep 17 00:00:00 2001 From: onechiporenko Date: Mon, 2 Nov 2020 21:34:55 +0200 Subject: [PATCH] #15 Track all damage done by party members --- CHANGELOG.md | 1 + Events.lua | 10 +- Locales/enUS.lua | 8 + Mechanics/Common.lua | 70 ++++- MyDungeonsBook.toc | 3 + MyDungeonsBook.wowproj | 13 +- Options.lua | 3 + .../Tabs/Mechanics/Tabs/Damage/Tabs.lua | 4 + .../Damage/Tabs/DamageDoneByPartyMembers.lua | 22 ++ .../Tabs/DamageDoneByPartyMembers/Tabs.lua | 30 +++ .../Tabs/DamageDoneByPartyMember.lua | 241 ++++++++++++++++++ Utils/Table.lua | 25 +- Utils/Utils.lua | 11 + 13 files changed, 432 insertions(+), 9 deletions(-) create mode 100644 UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers.lua create mode 100644 UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers/Tabs.lua create mode 100644 UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers/Tabs/DamageDoneByPartyMember.lua diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ff8ce7..25fb4a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### v1.3.0 +* #15 Track all damage done by party members * #7 Add trackable own casts ("OwnCastsDoneByPartyMembers") for party members * #26 Add icons for the new affixes diff --git a/Events.lua b/Events.lua index b35253d..2edda18 100644 --- a/Events.lua +++ b/Events.lua @@ -69,29 +69,33 @@ function MyDungeonsBook:COMBAT_LOG_EVENT_UNFILTERED() self:TrackOwnCastDoneByPartyMembers(srcName, spellId, dstName); end if ((subEventPrefix:match("^SPELL") or subEventPrefix:match("^RANGE")) and subEventSuffix == "DAMAGE") then - local spellId, _, _, amount, overkill = select(12, CombatLogGetCurrentEventInfo()); + local spellId, _, _, amount, overkill, _, _, _, _, crit = select(12, CombatLogGetCurrentEventInfo()); self:TrackAllDamageDoneToPartyMembers(dstName, spellId, amount); + self:TrackAllDamageDoneByPartyMembers(srcName, srcGUID, spellId, amount, overkill, crit); self:TrackBfAAvoidableSpells(dstName, spellId, amount); self:TrackSLAvoidableSpells(dstName, spellId, amount); self:TrackBfADamageDoneToSpecificUnits(srcName, srcGUID, spellId, amount, overkill, dstName, dstGUID); self:TrackSLDamageDoneToSpecificUnits(srcName, srcGUID, spellId, amount, overkill, dstName, dstGUID); end if (subEventName == "SWING_DAMAGE") then - local amount, overkill = select(12, CombatLogGetCurrentEventInfo()); + local amount, overkill, _, _, _, _, crit = select(12, CombatLogGetCurrentEventInfo()); self:TrackAllDamageDoneToPartyMembers(dstName, -2, amount); + self:TrackAllDamageDoneByPartyMembers(srcName, srcGUID, -2, amount, overkill, crit); self:TrackBfADamageDoneToSpecificUnits(srcName, srcGUID, -2, amount, overkill, dstName, dstGUID); self:TrackSLDamageDoneToSpecificUnits(srcName, srcGUID, -2, amount, overkill, dstName, dstGUID); end if (subEventName == "SPELL_EXTRA_ATTACKS") then local amount = select(12, CombatLogGetCurrentEventInfo()); self:TrackAllDamageDoneToPartyMembers(dstName, -2, amount); + self:TrackAllDamageDoneByPartyMembers(srcName, srcGUID, -2, amount, 0, false); end if (subEventPrefix:match("^SPELL") and subEventSuffix == "MISSED") then - local spellId, _, _, _, _, amount = select(12, CombatLogGetCurrentEventInfo()); + local spellId, _, _, _, _, amount, overkill, _, _, _, _, crit = select(12, CombatLogGetCurrentEventInfo()); self:TrackBfAAvoidableSpells(dstName, spellId, amount); self:TrackSLAvoidableSpells(dstName, spellId, amount); self:TrackAllDamageDoneToPartyMembers(dstName, spellId, amount); + self:TrackAllDamageDoneByPartyMembers(srcName, srcGUID, spellId, amount, overkill or -1, crit or false); end if (subEventName == "SPELL_AURA_APPLIED" or subEventName == "SPELL_AURA_APPLIED_DOSE") then diff --git a/Locales/enUS.lua b/Locales/enUS.lua index a496139..9c7aa76 100644 --- a/Locales/enUS.lua +++ b/Locales/enUS.lua @@ -86,10 +86,18 @@ L["Target?"] = "Target?"; L["Swing Damage"] = "Swing Damage"; L["Result"] = "Result"; L["All damage taken"] = "All damage taken"; +L["All damage done"] = "All damage done"; L["Dispels"] = "Dispels"; L["Casts"] = "Casts"; L["Are you sure you want to delete info about challenge?"] = "Are you sure you want to delete info about challenge?"; L["Challenge #%s is deleted successfully"] = "Challenge #%s is deleted successfully"; +L["Min Not Crit"] = "Min Not Crit"; +L["Hits Not Crit"] = "Hits Not Crit"; +L["Max Not Crit"] = "Max Not Crit"; +L["Min Crit"] = "Min Crit"; +L["Max Crit"] = "Max Crit"; +L["Crit, %"] = "Crit, %"; +L["Hits Crit"] = "Hits Crit"; -- UI end -- Help start diff --git a/Mechanics/Common.lua b/Mechanics/Common.lua index 1075efd..5469f0e 100644 --- a/Mechanics/Common.lua +++ b/Mechanics/Common.lua @@ -317,6 +317,74 @@ function MyDungeonsBook:TrackAllDamageDoneToPartyMembers(unit, spellId, amount) end end +--[[-- +Track all damage done by party members (including pets) + +@param[type=string] sourceUnitName +@param[type=GUID] sourceUnitGUID +@param[type=number] spellId +@param[type=number] amount +@param[type=number] overkill +@param[type=bool] crit +]] +function MyDungeonsBook:TrackAllDamageDoneByPartyMembers(sourceUnitName, sourceUnitGUID, spellId, amount, overkill, crit) + local id = self.db.char.activeChallengeId; + local type = strsplit("-", sourceUnitGUID); + if ((type ~= "Pet") and (type ~= "Player")) then + return; + end + if (type == "Pet") then + local petOwnerId = getPetOwnerWithTooltip(sourceUnitGUID); + if (petOwnerId) then + sourceUnitName = string.format("%s (%s)", sourceUnitName, UnitName(petOwnerId)); + end + end + local key = "ALL-DAMAGE-DONE-BY-PARTY-MEMBERS"; + self:InitMechanics3Lvl(key, sourceUnitName, spellId); + if (not self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].hits) then + self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId] = { + hits = 0, + amount = 0, + overkill = 0, + hitsCrit = 0, + maxCrit = 0, + minCrit = math.huge, + amountCrit = 0, + hitsNotCrit = 0, + maxNotCrit = 0, + minNotCrit = math.huge, + amountNotCrit = 0, + }; + end + local realAmount = amount or 0; + local realOverkill = 0; + if (overkill and overkill > 0) then + realOverkill = overkill; + end + self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].hits = self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].hits + 1; + self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].amount = self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].amount + realAmount; + self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].overkill = self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].overkill + realOverkill; + if (crit) then + self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].hitsCrit = self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].hitsCrit + 1; + self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].amountCrit = self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].amountCrit + realAmount; + if (realAmount > self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].maxCrit) then + self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].maxCrit = realAmount; + end + if (realAmount < self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].minCrit) then + self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].minCrit = realAmount; + end + else + self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].hitsNotCrit = self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].hitsNotCrit + 1; + self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].amountNotCrit = self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].amountNotCrit + realAmount; + if (realAmount > self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].maxNotCrit) then + self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].maxNotCrit = realAmount; + end + if (realAmount < self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].minNotCrit) then + self.db.char.challenges[id].mechanics[key][sourceUnitName][spellId].minNotCrit = realAmount; + end + end +end + --[[-- @local @param[type=string] key db key @@ -328,7 +396,7 @@ function MyDungeonsBook:SaveTrackedDamageToPartyMembers(key, unit, spellId, amou local amountInPercents = amount and amount / UnitHealthMax(unit) * 100 or 0; if (amountInPercents >= 40) then local spellLink = GetSpellLink(spellId); - self:LogPrint(string.format(L["%s got hit by %s for %s (%s)"], unit, spellLink, self:FormatNumber(amount), string.format("%.1f%%", amountInPercents))); + self:LogPrint(string.format(L["%s got hit by %s for %s (%s)"], unit, spellLink or spellId, self:FormatNumber(amount), string.format("%.1f%%", amountInPercents))); end local id = self.db.char.activeChallengeId; self:InitMechanics2Lvl(key, unit); diff --git a/MyDungeonsBook.toc b/MyDungeonsBook.toc index ba2a0a3..b1a879d 100644 --- a/MyDungeonsBook.toc +++ b/MyDungeonsBook.toc @@ -36,6 +36,9 @@ UI/ChallengeDetails/Tabs/Mechanics/Tabs/Casts/Tabs/OwnCastsByPartyMembers/Tabs/O UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage.lua UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs.lua UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/AvoidableDamage.lua +UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers.lua +UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers/Tabs.lua +UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers/Tabs/DamageDoneByPartyMember.lua UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneToPartyMembers.lua UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneToUnits.lua UI/ChallengeDetails/Tabs/Mechanics/Tabs/Heal.lua diff --git a/MyDungeonsBook.wowproj b/MyDungeonsBook.wowproj index af2d53f..6f3bfe3 100644 --- a/MyDungeonsBook.wowproj +++ b/MyDungeonsBook.wowproj @@ -21,7 +21,7 @@ Code - + Code @@ -121,12 +121,21 @@ Code + + Code + + + Code + Code Code + + Code + Code @@ -205,6 +214,8 @@ + + diff --git a/Options.lua b/Options.lua index df6fc29..ccbfea6 100644 --- a/Options.lua +++ b/Options.lua @@ -64,6 +64,9 @@ MyDungeonsBook.OptionsDefaults = { ["ALL-CASTS-DONE-BY-PARTY-MEMBERS"] = { id = "ALL-CASTS-DONE-BY-PARTY-MEMBERS" }, + ["ALL-DAMAGE-DONE-BY-PARTY-MEMBERS"] = { + id = "ALL-DAMAGE-DONE-BY-PARTY-MEMBERS" + }, ["ALL-ENEMY-PASSED-CASTS"] = { id = "ALL-ENEMY-PASSED-CASTS", internal = true diff --git a/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs.lua b/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs.lua index e3976bc..38eb0c2 100644 --- a/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs.lua +++ b/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs.lua @@ -20,6 +20,7 @@ function MyDungeonsBook:DamageFrame_CreateTabButtonsFrame(parentFrame) tabs:SetTabs({ {value = "avoidableDamage", text = L["Avoidable Damage"]}, {value = "damageDoneToPartyMembers", text = L["All damage taken"]}, + {value = "damageDoneByPartyMembers", text = L["All damage done"]}, {value = "damageDoneToUnits", text = L["Damage Done To Units"]}, }); tabs:SetCallback("OnGroupSelected", function (container, _, tabId) @@ -30,6 +31,9 @@ function MyDungeonsBook:DamageFrame_CreateTabButtonsFrame(parentFrame) if (tabId == "damageDoneToPartyMembers") then self:DamageDoneToPartyMembersFrame_Create(container, self.activeChallengeId); end + if (tabId == "damageDoneByPartyMembers") then + self:DamageDoneByPartyMembersFrame_Create(container, self.activeChallengeId); + end if (tabId == "damageDoneToUnits") then self:DamageDoneToUnitsFrame_Create(container, self.activeChallengeId); end diff --git a/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers.lua b/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers.lua new file mode 100644 index 0000000..8f59a9c --- /dev/null +++ b/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers.lua @@ -0,0 +1,22 @@ +--[[-- +@module MyDungeonsBook +]] + +--[[-- +UI +@section UI +]] + +--[[-- +Creates a frame for Damage Done By Party Members tab + +@param[type=Frame] parentFrame +@param[type=number] challengeId +@return[type=Frame] +]] +function MyDungeonsBook:DamageDoneByPartyMembersFrame_Create(parentFrame, challengeId) + local damageDoneByPartyMembersFrame = self:TabContentWrapperWidget_Create(parentFrame); + damageDoneByPartyMembersFrame.tabButtonsFrame = self:DamageDoneByPartyMembersFrame_CreateTabButtonsFrame(damageDoneByPartyMembersFrame, challengeId); + damageDoneByPartyMembersFrame.tabButtonsFrame:SelectTab("player"); + return damageDoneByPartyMembersFrame; +end diff --git a/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers/Tabs.lua b/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers/Tabs.lua new file mode 100644 index 0000000..a30e55c --- /dev/null +++ b/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers/Tabs.lua @@ -0,0 +1,30 @@ +--[[-- +@module MyDungeonsBook +]] + +--[[-- +UI +@section UI +]] + +--[[-- +Creates tabs (with click-handlers) for Own Casts frame. + +@param[type=Frame] parentFrame +@param[type=number] challengeId +@return[type=Frame] tabsButtonsFrame +]] +function MyDungeonsBook:DamageDoneByPartyMembersFrame_CreateTabButtonsFrame(parentFrame, challengeId) + local tabs = self:TabsWidget_Create(parentFrame); + local tabsConfig = {}; + for _, unitId in pairs(self:GetPartyRoster()) do + tinsert(tabsConfig, {value = unitId, text = self:GetNameByPartyUnit(challengeId, unitId)}); + end + tabs:SetTabs(tabsConfig); + tabs:SetCallback("OnGroupSelected", function (container, _, tabId) + container:ReleaseChildren(); + self:DamageDoneByPartyMemberFrame_Create(container, self.activeChallengeId, tabId); + end); + tabs:SetHeight(510); + return tabs; +end diff --git a/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers/Tabs/DamageDoneByPartyMember.lua b/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers/Tabs/DamageDoneByPartyMember.lua new file mode 100644 index 0000000..77beebe --- /dev/null +++ b/UI/ChallengeDetails/Tabs/Mechanics/Tabs/Damage/Tabs/DamageDoneByPartyMembers/Tabs/DamageDoneByPartyMember.lua @@ -0,0 +1,241 @@ +--[[-- +@module MyDungeonsBook +]] + +--[[-- +UI +@section UI +]] + +local L = LibStub("AceLocale-3.0"):GetLocale("MyDungeonsBook"); + +--[[-- +@param[type=Frame] parentFrame +@param[type=number] challengeId +@param[type=unitId] unitId +@return[type=Frame] +]] +function MyDungeonsBook:DamageDoneByPartyMemberFrame_Create(parentFrame, challengeId, unitId) + local ownCastsByPartyMemberFrame = self:TabContentWrapperWidget_Create(parentFrame); + local data = self:DamageDoneByPartyMemberFrame_GetDataForTable(challengeId, "ALL-DAMAGE-DONE-BY-PARTY-MEMBERS", unitId); + local columns = self:DamageDoneByPartyMemberFrame_GetHeadersForTable(challengeId, unitId); + local table = self:TableWidget_Create(columns, 10, 40, nil, ownCastsByPartyMemberFrame, "all-damage-done-by-" .. unitId); + table:SetData(data); + table:RegisterEvents({ + OnEnter = function (_, cellFrame, data, _, _, realrow, column) + if (realrow) then + if (column == 2 or column == 3) then + self:Table_Cell_SpellMouseHover(cellFrame, data[realrow].cols[1].value); + end + end + end, + OnLeave = function (_, _, _, _, _, realrow, column) + if (realrow) then + if (column == 2 or column == 3) then + self:Table_Cell_MouseOut(); + end + end + end + }); + return ownCastsByPartyMemberFrame; +end + +--[[-- +@return[type=table] +]] +function MyDungeonsBook:DamageDoneByPartyMemberFrame_GetHeadersForTable() + return { + { + name = " ", + width = 1, + align = "LEFT" + }, + { + name = L["Spell"], + width = 40, + align = "LEFT", + DoCellUpdate = function(...) + self:Table_Cell_FormatAsSpellIcon(...); + end + }, + { + name = "", + width = 120, + align = "LEFT", + DoCellUpdate = function(...) + self:Table_Cell_FormatAsSpellLink(...); + end + }, + { + name = L["Hits"], + width = 60, + align = "RIGHT" + }, + { + name = L["Amount"], + width = 60, + align = "RIGHT", + sort = "asc", + DoCellUpdate = function(...) + self:Table_Cell_FormatAsNumber(...); + end + }, + { + name = L["Over"], + width = 50, + align = "RIGHT", + DoCellUpdate = function(...) + self:Table_Cell_FormatAsNumber(...); + end + }, + { + name = L["Crit, %"], + width = 50, + align = "RIGHT", + bgcolor = { + r = 0, + g = 0, + b = 0, + a = 0.4 + }, + color = { + r = 1, + g = 0, + b = 0, + a = 1 + }, + DoCellUpdate = function(...) + self:Table_Cell_FormatAsPercents(...); + end + }, + { + name = L["Hits Crit"], + width = 50, + align = "RIGHT", + bgcolor = { + r = 0, + g = 0, + b = 0, + a = 0.4 + }, + }, + { + name = L["Max Crit"], + width = 50, + align = "RIGHT", + bgcolor = { + r = 0, + g = 0, + b = 0, + a = 0.4 + }, + DoCellUpdate = function(...) + self:Table_Cell_FormatAsNumber(...); + end + }, + { + name = L["Min Crit"], + width = 50, + align = "RIGHT", + bgcolor = { + r = 0, + g = 0, + b = 0, + a = 0.4 + }, + DoCellUpdate = function(...) + self:Table_Cell_FormatAsNumber(...); + end + }, + { + name = L["Max Not Crit"], + width = 50, + align = "RIGHT", + DoCellUpdate = function(...) + self:Table_Cell_FormatAsNumber(...); + end + }, + { + name = L["Min Not Crit"], + width = 50, + align = "RIGHT", + DoCellUpdate = function(...) + self:Table_Cell_FormatAsNumber(...); + end + } + }; +end + +--[[-- +Map data about own casts by party member `unitId` for challenge with id `challengeId`. + +@param[type=number] challengeId +@param[type=string] key for mechanics table +@param[type=unitId] unitId +@return[type=table] +]] +function MyDungeonsBook:DamageDoneByPartyMemberFrame_GetDataForTable(challengeId, key, unitId) + local tableData = {}; + if (not challengeId) then + return nil; + end + local challenge = self.db.char.challenges[challengeId]; + local mechanics = challenge.mechanics[key]; + if (not mechanics) then + self:DebugPrint(string.format("No Damage Done By Party Members data for challenge #%s", challengeId)); + return tableData; + end + local name, nameAndRealm = self:GetNameByPartyUnit(challengeId, unitId); + local mechanicsData = mechanics[name] or mechanics[nameAndRealm]; + if (not mechanicsData) then + self:DebugPrint(string.format("No Damage found for %s or %s", name, nameAndRealm)); + return tableData; + end + local summaryRow = { + color = { + r = 0, + g = 100, + b = 0, + a = 1 + }, + cols = { + {value = -1}, + {value = -1}, + {value = -1}, + {value = 0}, + {value = 0}, + {value = 0}, + {value = 0}, + {value = 0}, + {value = ""}, + {value = ""}, + {value = ""}, + {value = ""} + } + }; + for spellId, spellStats in pairs(mechanicsData) do + tinsert(tableData, { + cols = { + {value = spellId}, + {value = spellId}, + {value = spellId}, + {value = spellStats.hits}, + {value = spellStats.amount}, + {value = spellStats.overkill}, + {value = (spellStats.hitsCrit or 0) / spellStats.hits * 100}, + {value = spellStats.hitsCrit or 0}, + {value = spellStats.maxCrit or 0}, + {value = spellStats.minCrit or 0}, + {value = spellStats.maxNotCrit or 0}, + {value = spellStats.minNotCrit or 0}, + } + }); + summaryRow.cols[4].value = summaryRow.cols[4].value + spellStats.hits; + summaryRow.cols[5].value = summaryRow.cols[5].value + spellStats.amount; + summaryRow.cols[6].value = summaryRow.cols[6].value + spellStats.overkill; + summaryRow.cols[8].value = summaryRow.cols[8].value + spellStats.hitsCrit; + end + summaryRow.cols[7].value = summaryRow.cols[8].value / summaryRow.cols[4].value * 100; + tinsert(tableData, summaryRow); + return tableData; +end diff --git a/Utils/Table.lua b/Utils/Table.lua index 9efb23f..bf15d8a 100644 --- a/Utils/Table.lua +++ b/Utils/Table.lua @@ -51,6 +51,19 @@ function MyDungeonsBook:Table_Cell_FormatAsNumber(rowFrame, cellFrame, data, col updateCellTextColor(rowFrame, cellFrame, data, cols, row, realrow, column, fShow, table); end +--[[-- +Wrapper for cells with formatted percents. Uses `MyDungeonsBook:FormatPercents` to format cell value. + +Original value (number) is left "as is" for sorting purposes. + +Params are similar to [ScrollingTable:DoCellUpdate](https://www.wowace.com/projects/lib-st/pages/docell-update) +]] +function MyDungeonsBook:Table_Cell_FormatAsPercents(rowFrame, cellFrame, data, cols, row, realrow, column, fShow, table) + local val = data[realrow].cols[column].value; + (cellFrame.text or cellFrame):SetText((val and self:FormatPercents(val)) or "-"); + updateCellTextColor(rowFrame, cellFrame, data, cols, row, realrow, column, fShow, table); +end + --[[-- Wrapper for cells with formatted date. @@ -122,11 +135,15 @@ function MyDungeonsBook:Table_Cell_FormatAsSpellLink(rowFrame, cellFrame, data, if (spellId == -2) then (cellFrame.text or cellFrame):SetText(L["Swing Damage"]); else - if (spellId > 0) then - local spellLink = GetSpellLink(spellId); - (cellFrame.text or cellFrame):SetText(spellLink); + if (spellId == -1) then + (cellFrame.text or cellFrame):SetText(L["Sum"]); else - (cellFrame.text or cellFrame):SetText(""); + if (spellId > 0) then + local spellLink = GetSpellLink(spellId); + (cellFrame.text or cellFrame):SetText(spellLink); + else + (cellFrame.text or cellFrame):SetText(""); + end end end else diff --git a/Utils/Utils.lua b/Utils/Utils.lua index e68bfec..969cad4 100644 --- a/Utils/Utils.lua +++ b/Utils/Utils.lua @@ -83,6 +83,17 @@ function MyDungeonsBook:RoundNumber(n) return floor(n); end +--[[-- +@param[type=number] n number to format +@return[type=string] formatted string +]] +function MyDungeonsBook:FormatPercents(n) + if (type(n) ~= "number") then + return n; + end + return string.format("%.2f", n); +end + --[[-- Print message with DEBUG prefix. Mostly used for debugging (and it's used a lot). It can be disabled in the addon settings.