📄 damagemeters.lua
字号:
itemText:SetPoint("LEFT", itemButton:GetName(), "LEFT", 0, 0);
itemText:SetPoint("TOP", itemButton:GetName(), "TOP", 0, 0);
itemText:SetPoint("RIGHT", itemButton:GetName(), "RIGHT", 0, 0);
itemText:SetPoint("BOTTOM", itemButton:GetName(), "BOTTOM", 0, 0);
-- Justify text
if (DMVIEW_MIN == DamageMeters_viewMode or DamageMeters_flags[DMFLAG_justifyTextLeft]) then
itemText:SetJustifyH("LEFT");
else
itemText:SetJustifyH("CENTER");
end
end
end
end
DamageMeters_SetBackgroundColor();
DamageMeters_frameNeedsToBeGenerated = false;
DamageMeters_firstGeneration = false;
end
function DamageMetersFrame_SetBarInfo(barIndex, tableIndex, totalValue, maxValue, isMax, playerValue)
if (DM_Bypass["SetBarInfo All"] == true) then
return;
end
--DMPrintD("DamageMetersFrame_SetBarInfo, barIndex = "..barIndex..", totalValue = "..totalValue..", maxValue = "..maxValue);
local red = 0.00;
local green = 0.00;
local blue = 0.00;
local barString = "";
local tableEntry = DamageMeters_tables[DMT_VISIBLE][tableIndex];
local player = tableEntry.player;
local dmi = DamageMeters_GetQuantityDMI(DamageMeters_quantity);
local age;
if (DamageMeters_Quantity_TIME == DamageMeters_quantity) then
age = GetTime() - tableEntry.lastTime;
elseif (dmi ~= nil) then
age = GetTime() - tableEntry.dmiData[dmi].lastQuantTime;
else
-- This case covers quantities without dmis (and hence no last times).
-- Could put a system in for calculating it, but I doubt we really care.
age = 60;
end
local relationship = tableEntry.relationship;
if (DMVIEW_MIN == DamageMeters_viewMode) then
local color = DamageMeters_quantityColor[DamageMeters_quantity];
red = color[1];
green = color[2]
blue = color[3];
else
if (DamageMeters_colorScheme == 1) then
if (DamageMeters_Relation_SELF == relationship) then
green = 1.00;
elseif (DamageMeters_Relation_PET == relationship) then
green = 0.80;
elseif (DamageMeters_Relation_PARTY == relationship) then
blue = 1.00;
elseif (DamageMeters_Relation_FRIENDLY == relationship) then
red = 1.00;
green = 0.50;
end
else
local class = tableEntry.class;
if (class) then
local color = DamageMeters_GetClassColor(class);
red = color.r;
green = color.g;
blue = color.b;
elseif (DamageMeters_Relation_PET == relationship) then
red = 0.00;
green = 0.80;
blue = 0.00;
else
red = 0.70;
green = 0.70;
blue = 0.70;
end
end
end
-- Bar color pulse magnitude.
local pulseMag = 0.00;
if (DamageMeters_flags[DMFLAG_constantVisualUpdate]) then
if (age < DamageMeters_PULSE_TIME) then
pulseMag = 1.00 - age / DamageMeters_PULSE_TIME;
end
end
-- Calc value
local value;
local dmi = DamageMeters_GetQuantityDMI(DamageMeters_quantity);
if (DamageMeters_quantity == DamageMeters_Quantity_TIME) then
value = age;
else
value = DamageMeters_GetQuantityValue(DamageMeters_quantity, DMT_VISIBLE, tableIndex);
end
-- TEXT --
local stateAge = GetTime() - DamageMeters_textStateStartTime;
local barAge = stateAge - (barIndex / DamageMeters_barCount) * (DamageMeters_BARFADEINMINTIME + DamageMeters_BARFADEINTIME * DamageMeters_barCount);
if ((barAge > 0) or (not DamageMeters_flags[DMFLAG_constantVisualUpdate])) then
-- DamageMeters_Text_MAX many entries.
local rankString = nil;
local nameString = nil;
local totalPercentString = nil;
local leaderPercentString = nil;
local valueString = nil;
local deltaString = nil;
-- Rank
if (DMVIEW_MIN == DamageMeters_viewMode or
((DamageMeters_textState > 0 and DamageMeters_textState == DamageMeters_Text_RANK) or
(DamageMeters_textState <= 0 and DamageMeters_textOptions[DamageMeters_Text_RANK]))) then
rankString = tostring(tableIndex);
end
-- Name
if (not (DMVIEW_MIN == DamageMeters_viewMode)) then
if ((DamageMeters_textState > 0 and DamageMeters_textState == DamageMeters_Text_NAME) or
(DamageMeters_textState <= 0 and DamageMeters_textOptions[DamageMeters_Text_NAME])) then
nameString = player;
end
end
-- Total Percentage
if (DamageMeters_Quantity_TIME ~= DamageMeters_quantity and totalValue ~= nil and (not DamageMeters_IsQuantityPS(DamageMeters_quantity) or (not DamageMeters_flags[DMFLAG_showFightAsPS]))) then
if ((DamageMeters_textState > 0 and DamageMeters_textState == DamageMeters_Text_TOTALPERCENTAGE) or
(DamageMeters_textState <= 0 and DamageMeters_textOptions[DamageMeters_Text_TOTALPERCENTAGE])) then
local percent = (totalValue > 0) and ((value / totalValue) * 100) or 0;
totalPercentString = string.format("%.2f%%", percent);
end
end
-- Leader Percentage
if (DamageMeters_Quantity_TIME ~= DamageMeters_quantity and totalValue ~= nil and (not DamageMeters_IsQuantityPS(DamageMeters_quantity) or (not DamageMeters_flags[DMFLAG_showFightAsPS]))) then
if ((DamageMeters_textState > 0 and DamageMeters_textState == DamageMeters_Text_LEADERPERCENTAGE) or
(DamageMeters_textState <= 0 and DamageMeters_textOptions[DamageMeters_Text_LEADERPERCENTAGE])) then
local percent = (maxValue > 0) and ((value / maxValue) * 100) or 0;
leaderPercentString = format("%.2f%%", percent);
end
end
-- Value
local buildValueString = false;
if (DamageMeters_textState > 0 and DamageMeters_textState == DamageMeters_Text_VALUE) then
buildValueString = true;
elseif (DamageMeters_textState <= 0 and DamageMeters_textOptions[DamageMeters_Text_VALUE]) then
buildValueString = true;
elseif (DamageMeters_textState == 0 and
(DamageMeters_quantity == DamageMeters_Quantity_TIME or DamageMeters_IsQuantityPS(DamageMeters_quantity))) then
buildValueString = true;
end
-- Delta
if (DamageMeters_Quantity_TIME ~= DamageMeters_quantity and totalValue ~= nil and (not DamageMeters_IsQuantityPS(DamageMeters_quantity) or (not DamageMeters_flags[DMFLAG_showFightAsPS]))) then
if ((DamageMeters_textState > 0 and DamageMeters_textState == DamageMeters_Text_DELTA) or
(DamageMeters_textState <= 0 and DamageMeters_textOptions[DamageMeters_Text_DELTA])) then
local delta = value - playerValue;
deltaString = string.format("%s%d", (delta >= 0 and "+" or ""), delta);
end
end
if (buildValueString) then
if (DamageMeters_quantity == DamageMeters_Quantity_TIME) then
valueString = string.format("%d:%.2d", value / 60, math.mod(value, 60));
elseif (DamageMeters_IsQuantityPS(DamageMeters_quantity)) then
valueString = string.format("%.1f", value);
else
valueString = tostring(value);
end
end
-- Concatenate strings.
local strIx;
local first = true;
if (rankString) then
barString = barString..rankString.." ";
end
if (nameString) then
barString = barString..nameString.." ";
end
if (totalPercentString) then
barString = barString..totalPercentString.." ";
end
if (leaderPercentString) then
barString = barString..leaderPercentString.." ";
end
if (valueString) then
barString = barString..valueString.." ";
end
if (deltaString) then
barString = barString..deltaString;
end
if (string.sub(barString, -1) == " ") then
barString = string.sub(barString, 1, -2);
end
end
if (DamageMeters_flags[DMFLAG_constantVisualUpdate]) then
-- Apply pulse.
if (red == 1.00 and green == 1.00 and blue == 1.00) then
red = 0.5 + 0.5 * (1.0 - pulseMag);
green = red;
blue = red;
else
red = pulseMag > red and pulseMag or red;
green = pulseMag > green and pulseMag or green;
blue = pulseMag > blue and pulseMag or blue;
end
end
-------
if (DamageMeters_flags[DMFLAG_constantVisualUpdate]) then
if (barAge > 0) then
local charsToShow = floor(barAge / DamageMeters_BARCHARTIME);
local strLen = string.len(barString);
if (strLen > charsToShow) then
local charsToRemove = strLen - charsToShow;
local leftToRemove, rightToRemove;
if (DMVIEW_MIN == DamageMeters_viewMode) then
leftToRemove = 0;
rightToRemove = charsToRemove;
else
leftToRemove = floor(charsToRemove / 2);
rightToRemove = charsToRemove - leftToRemove;
end
barString = string.sub(barString, leftToRemove, -rightToRemove);
end
end
end
if (DMVIEW_MIN == DamageMeters_viewMode) then
local titleText = DamageMeters_GetPausedTitleText();
if (titleText) then
barString = titleText.." "..barString;
end
end
DamageMeters_bars[barIndex]:Show();
DamageMeters_bars[barIndex]:SetStatusBarColor(red, green, blue);
DamageMeters_bars[barIndex]:SetValue(value);
DamageMeters_text[barIndex]:SetText(barString);
-- After 1300 patch text wouldn't appear without this.
DamageMeters_text[barIndex]:Show();
end
-------------------------------------------------------------------------------
function DamageMeters_Clear(leave, silent)
-- Clear contributor list full: on a partical clear it is impossible to
-- tell who contributed what.
DamageMeters_contributorList = {};
DamageMeters_flags[DMFLAG_haveContributors] = false;
DamageMetersPlugin_Clear();
DamageMeters_DoClear(DMT_ACTIVE, leave, silent)
DamageMeters_DoClear(DMT_FIGHT, 0, true)
end
function DamageMeters_DoClear(tableIndex, leave, silent)
--DMPrintD("DamageMeters_DoClear("..tableIndex..")");
DamageMeters_tablesDirty = true;
-- In case we get a clear call between ticks.
DamageMeters_queuedChainHealCount = 0;
local last = table.getn(DamageMeters_tables[tableIndex]);
if (last == 0) then
-- This line just to ensure its really wiped out.
DamageMeters_tables[tableIndex] = {};
return;
end
local first = 1;
if (leave ~= nil) then
--DMPrint("leave = '"..leave.."'");
local c = tonumber(leave);
if (c) then
first = leave + 1;
if (first < 1) then
first = 1;
end
end
end
if (not silent) then
DMPrint(format(DM_MSG_CLEAR, first, last));
end
local i;
for i = last,first,-1 do
if (DamageMeters_flags[DMFLAG_constantVisualUpdate]) then
if (tableIndex == DMT_VISIBLE) then
if (DamageMeters_bars[i]) then
DamageMeters_bars[i]:SetValue(0);
DamageMeters_text[i]:SetText("");
end
end
end
table.remove(DamageMeters_tables[tableIndex]);
end
--if (not silent) then
-- DMPrint(format(DM_MSG_REMAINING, table.getn(DamageMeters_tables[DMT_ACTIVE])));
--end
end
function DamageMeters_Test(countArg)
DamageMeters_Clear();
local count = DamageMeters_barCount;
if (countArg) then
count = tonumber(countArg);
if (not count) then
count = DamageMeters_barCount
end
if (count > DamageMeters_barCount) then
count = DamageMeters_barCount;
end
end
DamageMeters_lastEvent = {};
DMPrintD("Adding "..count.." test entries...");
local index;
local groupMembersOnlySave = DamageMeters_flags[DMFLAG_groupMembersOnly];
DamageMeters_flags[DMFLAG_groupMembersOnly] = false;
for index = 1,count do
DamageMeters_AddValue("Test"..index, 1*index, DM_HIT, DamageMeters_Relation_FRIENDLY, DamageMeters_Quantity_DAMAGE, "[Test]");
DamageMeters_AddValue("Test"..index, 2*index, DM_HIT, DamageMeters_Relation_FRIENDLY, DamageMeters_Quantity_HEALING, "[Test]");
DamageMeters_AddValue("Test"..index, 3*(count - index), DM_HIT, DamageMeters_Relation_FRIENDLY, DamageMeters_Quantity_DAMAGED, "[Test]");
DamageMeters_AddValue("Test"..index, 4*(count - index), DM_HIT, DamageMeters_Relation_FRIENDLY, DamageMeters_Quantity_HEALINGRECEIVED, "[Test]");
end
DamageMeters_flags[DMFLAG_groupMembersOnly] = groupMembersOnlySave;
end
function DamageMeters_Add(player)
if (player) then
DamageMeters_AddDamage(player, 0, DM_HIT, DamageMeters_Relation_FRIENDLY, "[Test]");
end
end
function DamageMeters_SetSort(sortArg)
local usage = true;
if (sortArg) then
local sort = tonumber(sortArg);
if (sor
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -