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.