-Fixed a bug:

The DR Frames now properly reposition themself after the frames are locked, without the need
for a relog or /reload. (I have no idea how I didn't catch this earlier).
Also, when the frames are unlocked, the DR frames properly hide their contents.
-Fixed a bug:
On the server I tested this I noticed that SPELL_AURA_REFRESH event is sent even on the first
CC apply, this made the DR frasem break, but was hard to catch in action.
Ported from the TBC version.
This commit is contained in:
Relintai 2016-05-11 11:51:55 +02:00
parent 6e932b8993
commit 6423c69476
3 changed files with 118 additions and 25 deletions

View File

@ -322,7 +322,7 @@ function Rekt:COMBAT_LOG_EVENT_UNFILTERED(_, timestamp, eventType, srcGUID, srcN
end
--DR stuff
if( eventType == "SPELL_AURA_APPLIED" ) then
if (eventType == "SPELL_AURA_APPLIED") then
if(detail1 == "DEBUFF" and libDRData:GetSpellCategory(spellID)) then
local isPlayer = (bit.band(dstFlags, COMBATLOG_OBJECT_TYPE_PLAYER) == COMBATLOG_OBJECT_TYPE_PLAYER or bit.band(dstFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) == COMBATLOG_OBJECT_CONTROL_PLAYER)
@ -335,7 +335,7 @@ function Rekt:COMBAT_LOG_EVENT_UNFILTERED(_, timestamp, eventType, srcGUID, srcN
end
-- Enemy had a debuff refreshed before it faded, so fade + gain it quickly
elseif(eventType == "SPELL_AURA_REFRESH" ) then
elseif (eventType == "SPELL_AURA_REFRESH") then
if(detail1 == "DEBUFF" and libDRData:GetSpellCategory(spellID)) then
local isPlayer = (bit.band(dstFlags, COMBATLOG_OBJECT_TYPE_PLAYER) == COMBATLOG_OBJECT_TYPE_PLAYER or bit.band(dstFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) == COMBATLOG_OBJECT_CONTROL_PLAYER)
@ -343,12 +343,11 @@ function Rekt:COMBAT_LOG_EVENT_UNFILTERED(_, timestamp, eventType, srcGUID, srcN
return
end
Rekt:DRDebuffFaded(spellID, dstGUID, isPlayer);
Rekt:DRDebuffGained(spellID, dstGUID, isPlayer);
Rekt:DRDebuffRefreshed(spellID, dstGUID, isPlayer);
end
-- Buff or debuff faded from an enemy
elseif(eventType == "SPELL_AURA_REMOVED" ) then
elseif (eventType == "SPELL_AURA_REMOVED") then
if(detail1 == "DEBUFF" and libDRData:GetSpellCategory(spellID)) then
local isPlayer = (bit.band(dstFlags, COMBATLOG_OBJECT_TYPE_PLAYER) == COMBATLOG_OBJECT_TYPE_PLAYER or bit.band(dstFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) == COMBATLOG_OBJECT_CONTROL_PLAYER)

View File

@ -26,6 +26,8 @@ function Rekt:DRDebuffGained(spellID, dstGUID, isPlayer)
local endTime = currentTime + cd;
local diminished = 1;
local isDiminishingStarted = false;
local lastTimeApplied = GetTime();
Rekt.drs[dstGUID][drCat] = {
currentTime,
endTime,
@ -34,9 +36,15 @@ function Rekt:DRDebuffGained(spellID, dstGUID, isPlayer)
spellID,
diminished,
isDiminishingStarted,
drCat
drCat,
lastTimeApplied
}
else
--self:Print("asd");
if Rekt:ShouldIgnoreDRApply(Rekt.drs[dstGUID][drCat]) then
return;
end
local cd = 18;
local currentTime = GetTime();
local endTime = currentTime + cd;
@ -46,6 +54,7 @@ function Rekt:DRDebuffGained(spellID, dstGUID, isPlayer)
Rekt.drs[dstGUID][drCat][5] = spellID;
Rekt.drs[dstGUID][drCat][6] = Rekt.drs[dstGUID][drCat][6] + 1;
Rekt.drs[dstGUID][drCat][7] = false;
Rekt.drs[dstGUID][drCat][9] = GetTime();
--reset it back to 1, x > 3 means, the server updated the dr in less than 18 sec.
if Rekt.drs[dstGUID][drCat][6] > 3 then
@ -73,7 +82,7 @@ function Rekt:DRDebuffFaded(spellID, dstGUID, isPlayer)
if not db["enabled"] then return end;
if not Rekt.drs[dstGUID] then
Rekt.drs[dstGUID] = {}
Rekt:DRDebuffGained(spellID, dstGUID, isPlayer);
end
local drCat = libDRData:GetSpellCategory(spellID);
@ -83,21 +92,7 @@ function Rekt:DRDebuffFaded(spellID, dstGUID, isPlayer)
if not Rekt.drs[dstGUID][drCat] then
--means we didn't see it applied
local cd = 18;
local currentTime = GetTime();
local endTime = currentTime + cd;
local diminished = 1;
local isDiminishingStarted = true;
Rekt.drs[dstGUID][drCat] = {
currentTime,
endTime,
cd,
spellIcon,
spellID,
diminished,
isDiminishingStarted,
drCat
}
Rekt:DRDebuffGained(spellID, dstGUID, isPlayer);
else
local cd = 18;
local currentTime = GetTime();
@ -105,6 +100,7 @@ function Rekt:DRDebuffFaded(spellID, dstGUID, isPlayer)
Rekt.drs[dstGUID][drCat][1] = currentTime;
Rekt.drs[dstGUID][drCat][2] = endTime;
Rekt.drs[dstGUID][drCat][7] = true;
--Rekt.drs[dstGUID][drCat][9] = GetTime();
end
--self:Print(Rekt.cds[srcGUID][spellID][1] .. " " .. Rekt.cds[srcGUID][spellID][2] .. " " .. Rekt.cds[srcGUID][spellID][3]);
@ -122,17 +118,95 @@ function Rekt:DRDebuffFaded(spellID, dstGUID, isPlayer)
end
end
function Rekt:DRDebuffRefreshed(spellID, dstGUID, isPlayer)
local db = Rekt.db.profile;
if not db["enabled"] then return end;
if not Rekt.drs[dstGUID] then
Rekt:DRDebuffGained(spellID, dstGUID, isPlayer);
return;
end
local drCat = libDRData:GetSpellCategory(spellID);
local spellName, spellRank, spellIcon = GetSpellInfo(spellID);
Rekt:UpdateDRs(dstGUID);
if not Rekt.drs[dstGUID][drCat] then
--means we didn't see it applied
Rekt:DRDebuffGained(spellID, dstGUID, isPlayer);
return;
else
local cd = 18;
local currentTime = GetTime();
local endTime = currentTime + cd;
Rekt.drs[dstGUID][drCat][1] = currentTime;
Rekt.drs[dstGUID][drCat][2] = currentTime + cd;
Rekt.drs[dstGUID][drCat][4] = spellIcon;
Rekt.drs[dstGUID][drCat][5] = spellID;
Rekt.drs[dstGUID][drCat][6] = Rekt.drs[dstGUID][drCat][6] + 1;
Rekt.drs[dstGUID][drCat][7] = false;
Rekt.drs[dstGUID][drCat][9] = GetTime();
--reset it back to 1, x > 3 means, the server updated the dr in less than 18 sec.
if Rekt.drs[dstGUID][drCat][6] > 3 then
Rekt.drs[dstGUID][drCat][6] = 1;
end
end
--self:Print(Rekt.cds[srcGUID][spellID][1] .. " " .. Rekt.cds[srcGUID][spellID][2] .. " " .. Rekt.cds[srcGUID][spellID][3]);
if self.targets["target"] == dstGUID then
self:ReassignDRs("targetdr");
end
if self.targets["focus"] == dstGUID then
self:ReassignDRs("focusdr");
end
if self.targets["self"] == dstGUID then
self:ReassignDRs("selfdr");
end
end
-- Is the DR registered?
function Rekt:IsDRRegistered(spellID, dstGUID, isPlayer)
if not Rekt.drs[dstGUID][drCat] then
return false;
else
return true;
end
end
-- This function is needed, because TBC servers fire SPELL_AURA_REFRESH, then SPELL_AURA_APPLIED, even if this is the first
-- time the buff is applied.
function Rekt:ShouldIgnoreDRApply(drData)
local delta = GetTime() - drData[9];
--self:Print(delta .. " " .. GetTime() .. " " .. drData[9]);
--This Might still have false positives, but I guess this is the right tradeoff
--it's still better that to just ignore refreshed alltogether if the player didn't see the first apply
if (delta < 0.1) then
return true;
end
return false;
end
function Rekt:ReassignDRs(which)
local db = Rekt.db.profile;
--bail out early, if frames are disabled
if not db[which]["enabled"] or not db["enabled"] then return end;
--first hide all
for i = 1, 18 do
local frame = Rekt.frames[which][i]["frame"];
frame:Hide();
end
--check if frames are unlocked
if not db["locked"] then return end;
--check if we have cooldown for that unit
local whichs = "";
if which == "targetdr" then
@ -144,14 +218,17 @@ function Rekt:ReassignDRs(which)
end
if not self.drs[self.targets[whichs]] then return end;
--update then
Rekt:UpdateDRs(self.targets[whichs]);
--sort them
local tmp = Rekt:SortDRs(whichs);
--let's fill them up
local i = 1;
for k, v in ipairs(tmp) do
--self:Print(v["spellID"]);
--self:Print(v["diminished"]);
local frame = Rekt.frames[which][i]["frame"];
local text = Rekt.frames[which][i]["texture"];
text:SetTexture(v["spellIcon"]);
@ -171,6 +248,7 @@ function Rekt:ReassignDRs(which)
frame:Show();
i = i + 1;
end
--self:Print("--------");
end
function Rekt:SortDRs(which)
@ -187,7 +265,8 @@ function Rekt:SortDRs(which)
spellIcon = v[4],
spellID = v[5],
diminished = v[6],
isDiminishingStarted = v[7]
isDiminishingStarted = v[7],
lastTimeApplied = v[8]
};
--self:Print(v[1] .. v[2] .. v[3] .. v[4] .. v[5])
@ -213,6 +292,7 @@ function Rekt:SortDRs(which)
table.sort(tmp, function(a, b) return Rekt:ComparerRecentLast(a, b) end);
end
--["7"] = "No order"
return tmp;
end

View File

@ -136,15 +136,29 @@ end
function Rekt:LockFrames()
self:MoveTimersStop("target");
self:MoveTimersStop("focus");
self:MoveDRTimersStop("targetdr");
self:MoveDRTimersStop("focusdr");
self:MoveDRTimersStop("selfdr");
self:HideMovableFrames()
self:ReassignCds("target");
self:ReassignCds("focus");
self:ReassignDRs("targetdr");
self:ReassignDRs("focusdr");
self:ReassignDRs("selfdr");
end
function Rekt:UnlockFrames()
--this will hide the frames
self:ReassignCds("target");
self:ReassignCds("focus");
self:ReassignDRs("targetdr");
self:ReassignDRs("focusdr");
self:ReassignDRs("selfdr");
Rekt:ShowMovableFrames();
end