Code:
function NextDR(diminished)
if( diminished == 0 ) then
return 1
elseif( diminished == 1 ) then
return 2
end
return 3
end
--------------------------------------------------
if not trackedPlayers then trackedPlayers = {} end
if not EventHandlerLog then
EventHandlerLog = CreateFrame('Frame')
EventHandlerLog:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
local function OnSuccessfulCast(self, event, ...)
local timestamp, type, _, sourceGUID, sourceName, sourceFlags, _, destGUID, destName, destFlags, _ = select(1, ...)
--print("timestamp = ".._, " type = "..type, " sourceGUID = "..sourceGUID, " sourceName = "..sourceName, " sourceFlags = "..sourceFlags, " sourceflags2 = ".._, " destGUID = "..destGUID, " destName = "..destName, " destFlags = "..destFlags, " destFlag2 = ".._)
local COMBATLOG_OBJECT_TYPE_PLAYER = COMBATLOG_OBJECT_TYPE_PLAYER
local COMBATLOG_OBJECT_CONTROL_PLAYER = COMBATLOG_OBJECT_CONTROL_PLAYER
local COMBATLOG_OBJECT_REACTION_HOSTILE = COMBATLOG_OBJECT_REACTION_HOSTILE
local COMBATLOG_OBJECT_REACTION_FRIENDLY = COMBATLOG_OBJECT_REACTION_FRIENDLY
local COMBATLOG_OBJECT_REACTION_NEUTRAL = COMBATLOG_OBJECT_REACTION_NEUTRAL
local isFriendlyDest = (bit.band(destFlags,COMBATLOG_OBJECT_REACTION_FRIENDLY) == COMBATLOG_OBJECT_REACTION_FRIENDLY)
local isPlayerDest = (bit.band(destFlags, COMBATLOG_OBJECT_TYPE_PLAYER) == COMBATLOG_OBJECT_TYPE_PLAYER) or (bit.band(destFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) == COMBATLOG_OBJECT_CONTROL_PLAYER)
local isHostileDest = (bit.band(destFlags,COMBATLOG_OBJECT_REACTION_HOSTILE) == COMBATLOG_OBJECT_REACTION_HOSTILE)
local isNeutralDest = (bit.band(destFlags,COMBATLOG_OBJECT_REACTION_NEUTRAL) == COMBATLOG_OBJECT_REACTION_NEUTRAL)
local isFriendlySource = (bit.band(sourceFlags,COMBATLOG_OBJECT_REACTION_FRIENDLY) == COMBATLOG_OBJECT_REACTION_FRIENDLY)
local isPlayerSource = (bit.band(sourceFlags, COMBATLOG_OBJECT_TYPE_PLAYER) == COMBATLOG_OBJECT_TYPE_PLAYER) or (bit.band(sourceFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) == COMBATLOG_OBJECT_CONTROL_PLAYER)
local isHostileSource = (bit.band(sourceFlags,COMBATLOG_OBJECT_REACTION_HOSTILE) == COMBATLOG_OBJECT_REACTION_HOSTILE)
local isNeutralSource = (bit.band(sourceFlags,COMBATLOG_OBJECT_REACTION_NEUTRAL) == COMBATLOG_OBJECT_REACTION_NEUTRAL)
if (event=="COMBAT_LOG_EVENT_UNFILTERED") then
local DRtrack = {
{DR = "poly",SpellID={49203,6770,1776,51514,9484,118,28272,28271,61305,61025,61721,61780,3355,19386,20066,2637,82676}},
{DR = "root",SpellID={33395,50245,122,339,19975,64695,4167,54706,19306,90327,11190,12489}},
{DR = "stun",SpellID={58861,89766,50519,12809,46968,853,5211,24394,22570,408,2812,20549,44572,30283,22703,54785,47481,93433,56626,85388,1833,9005,88625,91800,91797,90337}},
{DR = "fear",SpellID={2094,5782,6358,5484,8122,65545,1513,10326,5246,20511}},
{DR = "disarm",SpellID={91644,51722,676,64058,50541,64404}},
{DR = "silence",SpellID={50479,1330,25046,28730,50613,69179,80483,15487,34490,18425,86759,18469,55021,24259,47476,18498,81261,31935}},
{DR = "cyclone",SpellID={33786}}
}
for i=1,#DRtrack do
for j=1, #DRtrack[i].SpellID do
if DRtrack[i].SpellID[j]==select(12, ...) then
if (type=="SPELL_AURA_APPLIED") then
if select(15,...) == "DEBUFF" then
if isFriendlyDest and not isNeutralDest then return end
if not isHostileDest and not isNeutralDest then return end
if not isPlayerDest and not isNeutralDest then return end
local DRCatagory = DRtrack[i].DR
-- trackedPlayer = {}
if( not trackedPlayers[destGUID] ) then
trackedPlayers[destGUID] = {}
end
-- trackedPlayers = {destGUID1 = {}, destGUID2 = {}}
if( not trackedPlayers[destGUID][DRCatagory] ) then
trackedPlayers[destGUID][DRCatagory] = { time = GetTime(), reset = 0, diminished = 0 }
end
if trackedPlayers[destGUID][DRCatagory] and trackedPlayers[destGUID][DRCatagory].reset <= GetTime() and trackedPlayers[destGUID][DRCatagory].reset ~= 15 then
trackedPlayers[destGUID][DRCatagory].diminished = 0
end
trackedPlayers[destGUID][DRCatagory].diminished = NextDR(trackedPlayers[destGUID][DRCatagory].diminished)
trackedPlayers[destGUID][DRCatagory].reset = 15
end
end
if (type=="SPELL_AURA_REFRESH") and select(15,...) == "DEBUFF" then
print("SPELL_AURA_REFRESH found")
end
if (type=="SPELL_CAST_SUCCESS") then
--print("SPELL SUCCESS")
local SpellID = select(12, ...)
local AllTargets = {"target","focus","mouseover",
"arena1","arena2","arena3","arena4","arena5",
"arenapet1","arenapet2","arenapet3","arenapet4","arenapet5","pettarget",
"arena1pet","arena2pet","arena3pet","arena4pet","arena5pet",
"party1target","party2target","party3target","party4target",
"raid1target","raid2target","raid3target","raid4target","raid5target","raid6target",
"raid7target","raid8target","raid9target","raid10target",
"raid11target","raid12target","raid13target","raid14target","raid15target",
"raid16target","raid17target","raid18target","raid19target","raid20target",
"raid21target","raid22target","raid23target","raid24target","raid25target",
"raid26target","raid27target","raid28target","raid29target","raid30target",
"raid31target","raid32target","raid33target","raid34target","raid35target",
"raid36target","raid37target","raid38target","raid39target","raid40target"}
for k = 1,#AllTargets do
if UnitDebuffID(AllTargets[k],SpellID) ~= nil then --if the debuff is already existing
if isFriendlyDest and not isNeutralDest then return end
if not isHostileDest and not isNeutralDest then return end
if not isPlayerDest and not isNeutralDest then return end
local DRCatagory = DRtrack[i].DR
if( not trackedPlayers[destGUID] ) then
trackedPlayers[destGUID] = {}
end
-- trackedPlayers = {destGUID1 = {}, destGUID2 = {}}
if( not trackedPlayers[destGUID][DRCatagory] ) then
trackedPlayers[destGUID][DRCatagory] = { time = GetTime(), reset = 0, diminished = 0 }
end
if trackedPlayers[destGUID][DRCatagory] and trackedPlayers[destGUID][DRCatagory].reset <= GetTime() and trackedPlayers[destGUID][DRCatagory].reset ~= 15 then
trackedPlayers[destGUID][DRCatagory].diminished = 0
end
trackedPlayers[destGUID][DRCatagory].diminished = NextDR(trackedPlayers[destGUID][DRCatagory].diminished)
trackedPlayers[destGUID][DRCatagory].reset = 15
--print("SPELL_CAST_SUCCESS registered")
break
end
end
end
if (type=="SPELL_AURA_REMOVED") then
if select(15,...) == "DEBUFF" then
if isFriendlyDest and not isNeutralDest then return end
if not isHostileDest and not isNeutralDest then return end
if not isPlayerDest and not isNeutralDest then return end
local DRCatagory = DRtrack[i].DR
if( not trackedPlayers[destGUID] ) then
trackedPlayers[destGUID] = {}
end
if( not trackedPlayers[destGUID][DRCatagory] ) then
trackedPlayers[destGUID][DRCatagory] = { time = GetTime(), reset = 0, diminished = 1.0 }
end
trackedPlayers[destGUID][DRCatagory].reset = GetTime() + 15
end
end
end
end
end
end
end
EventHandlerLog:SetScript('OnEvent', OnSuccessfulCast)
EventHandlerLog = true
end
function DRInfo(Target,DR)
if trackedPlayers[UnitGUID(Target)] == nil then return 0 end
if trackedPlayers[UnitGUID(Target)][DR] == nil then return 0 end
if trackedPlayers[UnitGUID(Target)][DR].reset == 15 then
return trackedPlayers[UnitGUID(Target)][DR].diminished
elseif trackedPlayers[UnitGUID(Target)][DR].reset >= GetTime() then
return trackedPlayers[UnitGUID(Target)][DR].diminished
else return 0
end
end
function DRTimer(Target,DR)
if trackedPlayers[UnitGUID(Target)] == nil then return 0 end
if trackedPlayers[UnitGUID(Target)][DR] == nil then return 0 end
if trackedPlayers[UnitGUID(Target)][DR].reset == 15 then
return 15
elseif trackedPlayers[UnitGUID(Target)][DR].reset >= GetTime() then
return trackedPlayers[UnitGUID(Target)][DR].reset - GetTime()
else return 0
end
end
One function returns the time left for a DR, and another returns the info of the dr (0 = no dr, 1 = 1/2 dr, 2 = 1/4 dr, 3 = immune)