📄 damagemeters_report.lua
字号:
end
end
end
function DamageMeters_DoReport(reportQuantity, destination, invert, start, count, tellTarget)
local msg;
if (destination == "BUFFER") then
DamageMeters_reportBuffer = "";
elseif (destination == "PARTY") then
if (GetNumPartyMembers() == 0) then
DMPrint(DM_ERROR_NOPARTY);
return;
end
elseif (destination == "RAID") then
if (GetNumRaidMembers() == 0) then
DMPrint(DM_ERROR_NORAID);
return;
end
end
local tableIx = DMT_ACTIVE;
if (DamageMeters_IsQuantityFight(reportQuantity)) then
tableIx = DMT_FIGHT;
end
-- Determine bounds.
local finish = start + count - 1;
if (finish > table.getn(DamageMeters_tables[tableIx])) then
finish = table.getn(DamageMeters_tables[tableIx]);
end
local step = 1;
if (invert) then
start = finish;
finish = 1;
step = -1;
end
------------
-- Header --
------------
if (reportQuantity == DamageMeters_ReportQuantity_Total) then
msg = string.format(DM_MSG_FULLREPORTHEADER1, count, table.getn(DamageMeters_tables[tableIx]));
DamageMeters_SendReportMsg(msg, destination, tellTarget);
DamageMeters_SendReportMsg(DM_MSG_FULLREPORTHEADER2, destination, tellTarget);
msg = DM_MSG_FULLREPORTHEADER3;
elseif (reportQuantity == DamageMeters_ReportQuantity_Leaders) then
local header = string.format(DM_MSG_LEADERREPORTHEADER, count, table.getn(DamageMeters_tables[tableIx]));
local q;
for q = 1, DMI_REPORT_MAX do
header = string.format("%s| %-21s", header, DM_QUANTDEFS[q].name);
end
msg = header.."\n-------------------------------------------------------------------------------------------";
elseif (reportQuantity == DamageMeters_ReportQuantity_Events) then
msg = string.format(DM_MSG_EVENTREPORTHEADER, count, table.getn(DamageMeters_tables[tableIx]));
else
msg = string.format(DM_MSG_REPORTHEADER, DamageMeters_GetQuantityString(reportQuantity), count, table.getn(DamageMeters_tables[tableIx]));
end
DamageMeters_SendReportMsg(msg, destination, tellTarget);
if (reportQuantity > 0) then
DamageMeters_DoSort(DamageMeters_tables[tableIx], reportQuantity);
end
local reportQuantityDMI = nil;
if (reportQuantity > 0) then
reportQuantityDMI = DamageMeters_GetQuantityDMI(reportQuantity);
end
-- Calculate totals.
local totalValue = 0;
local index;
local info;
local totals = {0, 0, 0, 0, 0, 0, 0};
if (reportQuantity > 0) then
if (DamageMeters_Quantity_TIME ~= reportQuantity) then
local playerIndex;
for playerIndex = 1, table.getn(DamageMeters_tables[tableIx]) do
totalValue = totalValue + DamageMeters_GetQuantityValue(reportQuantity, tableIx, playerIndex);
end
end
elseif (reportQuantity == DamageMeters_ReportQuantity_Total or
reportQuantity == DamageMeters_ReportQuantity_Leaders) then
for index,info in DamageMeters_tables[tableIx] do
totals[1] = totals[1] + info.dmiData[DMI_1].q;
totals[2] = totals[2] + info.dmiData[DMI_2].q;
totals[3] = totals[3] + info.dmiData[DMI_3].q;
totals[4] = totals[4] + info.dmiData[DMI_4].q;
totals[5] = totals[5] + info.dmiData[DMI_DAMAGE].hitCount;
totals[6] = totals[6] + info.dmiData[DMI_DAMAGE].critCount;
end
DamageMeters_DetermineRanks(tableIx);
end
---------------
-- Main Loop --
---------------
local formatStrTotalMain_A = "%-12s %7d[%2d] %7d[%2d] %7d[%2d] %7d[%2d] %7d %7d";
local formatStrTotalTotals = "%-12s %11d %11d %11d %11d %7d %7d";
-- Careful here--if there isn't a space after each | it can lock up.
local formatStrTotalMain_B = "%2d| %8d %-12s| %8d %-12s| %8d %-12s| %8d %-12s";
local formatStrLeaderTotals= " =| %-20d | %-20d | %-20d | %-20d";
local currentTime = GetTime();
local i;
local showThis;
local visibleTotal = 0;
--DMPrintD("start = "..start..", finish = "..finish..", quantity = "..reportQuantity);
if (count > 0) then
for i = start, finish, step do
local value;
msg = "";
if (reportQuantity == DamageMeters_ReportQuantity_Total) then
msg = string.format(formatStrTotalMain_A, DamageMeters_tables[tableIx][i].player,
DamageMeters_tables[tableIx][i].dmiData[DMI_1].q, DamageMeters_rankTables[tableIx][DamageMeters_tables[tableIx][i].player][1],
DamageMeters_tables[tableIx][i].dmiData[DMI_2].q, DamageMeters_rankTables[tableIx][DamageMeters_tables[tableIx][i].player][2],
DamageMeters_tables[tableIx][i].dmiData[DMI_3].q, DamageMeters_rankTables[tableIx][DamageMeters_tables[tableIx][i].player][3],
DamageMeters_tables[tableIx][i].dmiData[DMI_4].q, DamageMeters_rankTables[tableIx][DamageMeters_tables[tableIx][i].player][4],
DamageMeters_tables[tableIx][i].dmiData[DMI_DAMAGE].hitCount, DamageMeters_tables[tableIx][i].dmiData[DMI_DAMAGE].critCount);
elseif(reportQuantity == DamageMeters_ReportQuantity_Leaders) then
local leaders = {};
local leaderIndexes = {};
local qIx;
for qIx = 2, DMI_MAX do
local leaderName, rank;
for leaderName, rank in DamageMeters_rankTables[tableIx] do
--DMPrint(i.." "..leaderName.." "..rank[qIx]);
if (rank[qIx] == i) then
leaders[qIx] = leaderName;
leaderIndexes[qIx] = DamageMeters_GetPlayerIndex(leaderName);
break;
end
end
end
msg = string.format(formatStrTotalMain_B, i,
DamageMeters_tables[tableIx][i].dmiData[DMI_1].q, DamageMeters_tables[tableIx][i].player,
DamageMeters_tables[tableIx][leaderIndexes[2]].dmiData[DMI_2].q, leaders[2],
DamageMeters_tables[tableIx][leaderIndexes[3]].dmiData[DMI_3].q, leaders[3],
DamageMeters_tables[tableIx][leaderIndexes[4]].dmiData[DMI_4].q, leaders[4]);
elseif (reportQuantity == DamageMeters_ReportQuantity_Events) then
DamageMeters_DumpPlayerEvents(DamageMeters_tables[tableIx][i].player, destination, true, i, totals);
else
if (DamageMeters_Quantity_TIME == reportQuantity) then
local idleTime = currentTime - DamageMeters_tables[tableIx][i].lastTime;
msg = string.format("#%.2d: %-16s %d:%.02d", i, DamageMeters_tables[tableIx][i].player, idleTime / 60, math.mod(idleTime, 60));
else
local value = DamageMeters_GetQuantityValue(reportQuantity, tableIx, i);
-- 4/2/06: Removed this check. Was never necessary, and now that some quantitites can be
-- negative its detrimental.
--if (value > 0) then
visibleTotal = visibleTotal + value;
if (DamageMeters_IsQuantityPS(reportQuantity)) then
msg = string.format("#%.2d: %-16s %.1f", i, DamageMeters_tables[tableIx][i].player, value);
else
local percentage = (totalValue > 0) and (100 * value / totalValue) or 0;
msg = string.format("#%.2d: %.2f%% %-16s %d", i, percentage, DamageMeters_tables[tableIx][i].player, value);
end
--end
end
end
if (msg ~= "") then
DamageMeters_SendReportMsg(msg, destination, tellTarget);
end
end
end
------------
-- Totals --
------------
if (reportQuantity == DamageMeters_ReportQuantity_Total or
reportQuantity == DamageMeters_ReportQuantity_Leaders) then
if (reportQuantity == DamageMeters_ReportQuantity_Total) then
msg = string.format(formatStrTotalTotals, DM_MSG_TOTAL, totals[1], totals[2], totals[3], totals[4], totals[5], totals[6]);
else
msg = string.format(formatStrLeaderTotals, totals[1], totals[2], totals[3], totals[4], totals[5], totals[6]);
end
DamageMeters_SendReportMsg(msg, destination, tellTarget);
-- Print a list of contributors.
if (DamageMeters_flags[DMFLAG_haveContributors]) then
msg = string.format(DM_MSG_COLLECTORS, UnitName("Player"));
for contrib, unused in DamageMeters_contributorList do
msg = msg..", "..contrib;
end
DamageMeters_SendReportMsg(msg, destination, tellTarget);
end
elseif (DamageMeters_Quantity_DPS == reportQuantity) then
msg = string.format(DM_MSG_COMBATDURATION, DamageMeters_combatEndTime - DamageMeters_combatStartTime);
DamageMeters_SendReportMsg(msg, destination, tellTarget);
end
if (reportQuantity > 0) then
if (DamageMeters_Quantity_TIME == reportQuantity) then
-- No total.
elseif (DamageMeters_Quantity_DPS == reportQuantity) then
msg = string.format(DM_MSG_REPORTTOTALDPS, totalValue, visibleTotal);
DamageMeters_SendReportMsg(msg, destination, tellTarget);
else
msg = string.format(DM_MSG_REPORTTOTAL, totalValue, visibleTotal);
DamageMeters_SendReportMsg(msg, destination, tellTarget);
end
end
end
function DamageMeters_DumpPlayerEvents(player, destination, bIncludeName, index, totals, singleQuantity)
local tellTarget = nil;
local playerIndex = DamageMeters_GetPlayerIndex(player, DMT_VISIBLE);
--[[ removed when changed event system
local playerEventStruct = DamageMeters_tables[DMT_VISIBLE][playerIndex].events;
if (nil == playerEventStruct) then
-- Makes spam.
--DMPrintD("Player "..player.." not found.", nil, true);
return;
end
]]--
local prefix = "";
if (bIncludeName) then
if (index) then
str = index..": "..player..":";
else
str = player..":";
end
prefix = " ";
DamageMeters_SendReportMsg(str, destination, tellTarget);
end
if (totals == nil) then
totals = {};
local ii;
for ii = 1, table.getn(DamageMeters_tables[DMT_VISIBLE]) do
local q;
for q = 1, DMI_MAX do
if (totals[q] == nil) then
totals[q] = 0;
end
totals[q] = totals[q] + DamageMeters_tables[DMT_VISIBLE][ii].dmiData[q].q;
end
end
end
--[[ Remove firstMsg functionality. Pounds the GC.
if (DamageMeters_debugEnabled) then
if (playerIndex and DamageMeters_tables[DMT_VISIBLE][playerIndex].firstMsg and DamageMeters_tables[DMT_VISIBLE][playerIndex].firstMsg["event"]) then
local msg = "Last message: "..DamageMeters_tables[DMT_VISIBLE][playerIndex].firstMsg.event.." ("..DamageMeters_tables[DMT_VISIBLE][playerIndex].firstMsg.desc..")";
DamageMeters_SendReportMsg(msg, destination, tellTarget);
msg = " "..DamageMeters_tables[DMT_VISIBLE][playerIndex].firstMsg.fullMsg.."\n";
DamageMeters_SendReportMsg(msg, destination, tellTarget);
end
end
]]--
local headerDest = destination;
if (headerDest == "TOOLTIP") then
headerDest = "TOOLTIP_TITLE";
end
local dmi, eventStruct;
if (singleQuantity) then
dmi = DM_QUANTDEFS[singleQuantity].dmi;
if (dmi) then
eventStruct = DamageMeters_tables[DMT_VISIBLE][playerIndex].dmiData[dmi].events;
if (eventStruct) then
DamageMeters_DumpQuantityEvents(player, dmi, eventStruct, totals, headerDest, destination, tellTarget, prefix);
end
end
else
for dmi = 1, DMI_MAX do
eventStruct = DamageMeters_tables[DMT_VISIBLE][playerIndex].dmiData[dmi].events;
if (eventStruct) then
DamageMeters_DumpQuantityEvents(player, dmi, eventStruct, totals, headerDest, destination, tellTarget, prefix);
end
end
end
DamageMeters_SendReportMsg("", destination, tellTarget);
end
function DamageMeters_DumpQuantityEvents(player, dmi, eventStruct, totals, headerDest, destination, tellTarget, prefix)
if (eventStruct == nil) then
return;
end
-- Calculate total.
local total = 0;
for spell, spellStruct in eventStruct.spellTable do
-- Spells with "*" at the end are duplicates, and are not to be counted towards the total.
if (string.sub(spell, -1) ~= "*") then
total = total + spellStruct.value;
end
end
local percentageOfTotal = (totals[dmi] > 0) and (100 * total / totals[dmi]) or (0);
local rank = (DamageMeters_rankTables[DMT_ACTIVE][player] and DamageMeters_rankTables[DMT_ACTIVE][player][dmi]) and " #"..tostring(DamageMeters_rankTables[DMT_ACTIVE][player][dmi]) or "";
str = string.format("%s = %s (%.1f%%)%s", prefix..DMI_NAMES[dmi], total, percentageOfTotal, rank);
DamageMeters_SendReportMsg(str, headerDest, tellTarget);
-- Cannot sort spells, as that table is indexed by string.
if (eventStruct.dirty) then
DamageMeters_BuildSpellHash(eventStruct);
end
-- Print
for hashIndex = 1, table.getn(eventStruct.hash) do
local spell = eventStruct.hash[hashIndex].spell;
spellStruct = eventStruct.spellTable[spell];
--DMPrint("Hash "..hashIndex.." = "..spell);
local percentageOfTotal = (total > 0) and (100 * spellStruct.value / total) or (0);
local critPercentage = (spellStruct.counts[DM_HIT] > 0) and (100 * spellStruct.counts[DM_CRT] / spellStruct.counts[DM_HIT]) or 0.0;
local average = string.format("%.1f Avg", (spellStruct.counts[DM_HIT] and spellStruct.value / spellStruct.counts[DM_HIT] or 0));
str = string.format(prefix.." %s = %d (%.1f%%) %d/%d %.1f%% %s", spell, spellStruct.value, percentageOfTotal, spellStruct.counts[DM_CRT], spellStruct.counts[DM_HIT], critPercentage, average);
-- Show resistance info.
if (dmi == DMI_DAMAGED and
(spellStruct.damageType <= DM_DMGTYPE_RESISTMAX or spellStruct.resistanceSum > 0)) then
local avgResist = spellStruct.resistanceSum / spellStruct.resistanceCount;
str = string.format("%s (%d %s)", str, avgResist, DM_DMGTYPENAMES[spellStruct.damageType]);
end
DamageMeters_SendReportMsg(str, destination, tellTarget);
end
end
function DamageMeters_BuildSpellHash(eventStruct)
if (DM_Bypass["BuildSpellHash"] == true) then
return;
end
if (nil == eventStruct.hash) then
eventStruct.hash = {};
end
local hashIndex = 1;
for spell, spellStruct in eventStruct.spellTable do
eventStruct.hash[hashIndex] = {};
eventStruct.hash[hashIndex].spell = spell;
eventStruct.hash[hashIndex].value = spellStruct.value;
hashIndex = hashIndex + 1;
end
table.sort(eventStruct.hash,
function(a,b)
return a.value > b.value;
end
);
eventStruct.dirty = false;
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -