Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local major = "DRData-1.0"
- local minor = 1003
- assert(LibStub, string.format("%s requires LibStub.", major))
- local Data = LibStub:NewLibrary(major, minor)
- if( not Data ) then return end
- local L = {
- ["Banish"] = "Banish",
- ["Charge"] = "Charge",
- ["Cheap Shot"] = "Cheap Shot",
- ["Controlled stuns"] = "Controlled stuns",
- ["Cyclone"] = "Cyclone",
- ["Disarms"] = "Disarms",
- ["Disorients"] = "Disorients",
- ["Entrapment"] = "Entrapment",
- ["Fears"] = "Fears",
- ["Horrors"] = "Horrors",
- ["Mind Control"] = "Mind Control",
- ["Random roots"] = "Random roots",
- ["Random stuns"] = "Random stuns",
- ["Controlled roots"] = "Controlled roots",
- ["Scatter Shot"] = "Scatter Shot",
- ["Silences"] = "Silences",
- ["Hibernate"] = "Hibernate",
- ["Taunts"] = "Taunts",
- }
- if GetLocale() == "frFR" then
- L["Banish"] = "Bannissement"
- L["Charge"] = "Charge"
- L["Cheap Shot"] = "Coup bas"
- L["Controlled stuns"] = "Etourdissements contrôlés"
- L["Cyclone"] = "Cyclone"
- L["Disarms"] = "Désarmements"
- L["Disorients"] = "Désorientations"
- L["Entrapment"] = "Piège"
- L["Fears"] = "Peurs"
- L["Horrors"] = "Horreurs"
- L["Mind Control"] = "Contrôle mental"
- L["Random roots"] = "Immobilisations aléatoires"
- L["Random stuns"] = "Etourdissemensts aléatoires"
- L["Controlled roots"] = "Immobilisations contrôlées"
- L["Scatter Shot"] = "Flèche de dispersion"
- L["Silences"] = "Silences"
- L["Hibernate"] = "Hibernation"
- L["Taunts"] = "Provocations"
- end
- -- How long before DR resets
- -- While everyone will tell you it's 15 seconds, it's actually 16 - 20 seconds with 18 being a decent enough average
- Data.RESET_TIME = 15
- -- List of spellID -> DR category
- Data.spells = {
- --[[ TAUNT ]]--
- -- Taunt (Warrior)
- [355] = "taunt",
- -- Taunt (Pet)
- [53477] = "taunt",
- -- Mocking Blow
- [694] = "taunt",
- -- Growl (Druid)
- [6795] = "taunt",
- -- Dark Command
- [56222] = "taunt",
- -- Hand of Reckoning
- [62124] = "taunt",
- -- Righteous Defense
- [31790] = "taunt",
- -- Distracting Shot
- [20736] = "taunt",
- -- Challenging Shout
- [1161] = "taunt",
- -- Challenging Roar
- [5209] = "taunt",
- -- Death Grip
- [49560] = "taunt",
- -- Challenging Howl
- [59671] = "taunt",
- -- Angered Earth
- [36213] = "taunt",
- --[[ DISORIENTS ]]--
- -- Dragon's Breath
- [31661] = "disorient",
- [33041] = "disorient",
- [33042] = "disorient",
- [33043] = "disorient",
- [42949] = "disorient",
- [42950] = "disorient",
- -- Hungering Cold
- [49203] = "disorient",
- -- Sap
- [6770] = "disorient",
- [2070] = "disorient",
- [11297] = "disorient",
- [51724] = "disorient",
- -- Gouge
- [1776] = "disorient",
- -- Hex (Guessing)
- [51514] = "disorient",
- -- Shackle
- [9484] = "disorient",
- [9485] = "disorient",
- [10955] = "disorient",
- -- Polymorph
- [118] = "disorient",
- [12824] = "disorient",
- [12825] = "disorient",
- [28272] = "disorient",
- [28271] = "disorient",
- [12826] = "disorient",
- [61305] = "disorient",
- [61025] = "disorient",
- [61721] = "disorient",
- [61780] = "disorient",
- -- Freezing Trap
- [3355] = "disorient",
- [14308] = "disorient",
- [14309] = "disorient",
- -- Freezing Arrow
- [60210] = "disorient",
- -- Wyvern Sting
- [19386] = "disorient",
- [24132] = "disorient",
- [24133] = "disorient",
- [27068] = "disorient",
- [49011] = "disorient",
- [49012] = "disorient",
- -- Repentance
- [20066] = "disorient",
- --[[ SILENCES ]]--
- -- Nether Shock
- [53588] = "silence",
- [53589] = "silence",
- -- Garrote
- [1330] = "silence",
- -- Arcane Torrent (Energy version)
- [25046] = "silence",
- -- Arcane Torrent (Mana version)
- [28730] = "silence",
- -- Arcane Torrent (Runic power version)
- [50613] = "silence",
- -- Silence
- [15487] = "silence",
- -- Silencing Shot
- [34490] = "silence",
- -- Improved Kick
- [18425] = "silence",
- -- Improved Counterspell
- [18469] = "silence",
- -- Spell Lock
- [19244] = "silence",
- [19647] = "silence",
- -- Shield of the Templar
- [63529] = "silence",
- -- Strangulate
- [47476] = "silence",
- [49913] = "silence",
- [49914] = "silence",
- [49915] = "silence",
- [49916] = "silence",
- -- Gag Order (Warrior talent)
- [18498] = "silence",
- --[[ DISARMS ]]--
- -- Snatch
- [53542] = "disarm",
- [53543] = "disarm",
- -- Dismantle
- [51722] = "disarm",
- -- Disarm
- [676] = "disarm",
- -- Chimera Shot - Scorpid
- [53359] = "disarm",
- -- Psychic Horror (Disarm effect)
- [64058] = "disarm",
- --[[ FEARS ]]--
- -- Blind
- [2094] = "fear",
- -- Fear (Warlock)
- [5782] = "fear",
- [6213] = "fear",
- [6215] = "fear",
- -- Seduction (Pet)
- [6358] = "fear",
- -- Howl of Terror
- [5484] = "fear",
- [17928] = "fear",
- -- Psychic scream
- [8122] = "fear",
- [8124] = "fear",
- [10888] = "fear",
- [10890] = "fear",
- -- Scare Beast
- [1513] = "fear",
- [14326] = "fear",
- [14327] = "fear",
- -- Turn Evil
- [10326] = "fear",
- -- Intimidating Shout
- [5246] = "fear",
- --[[ CONTROL STUNS ]]--
- -- Intercept (Felguard)
- [30153] = "ctrlstun",
- [30195] = "ctrlstun",
- [30197] = "ctrlstun",
- [47995] = "ctrlstun",
- -- Ravage
- [50518] = "ctrlstun",
- [53558] = "ctrlstun",
- [53559] = "ctrlstun",
- [53560] = "ctrlstun",
- [53561] = "ctrlstun",
- [53562] = "ctrlstun",
- -- Sonic Blast
- [50519] = "ctrlstun",
- [53564] = "ctrlstun",
- [53565] = "ctrlstun",
- [53566] = "ctrlstun",
- [53567] = "ctrlstun",
- [53568] = "ctrlstun",
- -- Concussion Blow
- [12809] = "ctrlstun",
- -- Shockwave
- [46968] = "ctrlstun",
- -- Hammer of Justice
- [853] = "ctrlstun",
- [5588] = "ctrlstun",
- [5589] = "ctrlstun",
- [10308] = "ctrlstun",
- -- Bash
- [5211] = "ctrlstun",
- [6798] = "ctrlstun",
- [8983] = "ctrlstun",
- -- Intimidation
- [19577] = "ctrlstun",
- -- Maim
- [22570] = "ctrlstun",
- [49802] = "ctrlstun",
- -- Kidney Shot
- [408] = "ctrlstun",
- [8643] = "ctrlstun",
- -- War Stomp
- [20549] = "ctrlstun",
- -- Intercept
- [20252] = "ctrlstun",
- -- Deep Freeze
- [44572] = "ctrlstun",
- -- Shadowfury
- [30283] = "ctrlstun",
- [30413] = "ctrlstun",
- [30414] = "ctrlstun",
- -- Holy Wrath
- [2812] = "ctrlstun",
- -- Inferno Effect
- [22703] = "ctrlstun",
- -- Demon Charge
- [60995] = "ctrlstun",
- -- Gnaw (Ghoul)
- [47481] = "ctrlstun",
- --[[ RANDOM STUNS ]]--
- -- Impact
- [12355] = "rndstun",
- -- Stoneclaw Stun
- [39796] = "rndstun",
- -- Seal of Justice
- [20170] = "rndstun",
- -- Revenge Stun
- [12798] = "rndstun",
- --[[ CYCLONE ]]--
- -- Cyclone
- [33786] = "cyclone",
- --[[ ROOTS ]]--
- -- Freeze (Water Elemental)
- [33395] = "ctrlroot",
- -- Pin (Crab)
- [50245] = "ctrlroot",
- [53544] = "ctrlroot",
- [53545] = "ctrlroot",
- [53546] = "ctrlroot",
- [53547] = "ctrlroot",
- [53548] = "ctrlroot",
- -- Frost Nova
- [122] = "ctrlroot",
- [865] = "ctrlroot",
- [6131] = "ctrlroot",
- [10230] = "ctrlroot",
- [27088] = "ctrlroot",
- [42917] = "ctrlroot",
- -- Entangling Roots
- [339] = "ctrlroot",
- [1062] = "ctrlroot",
- [5195] = "ctrlroot",
- [5196] = "ctrlroot",
- [9852] = "ctrlroot",
- [9853] = "ctrlroot",
- [26989] = "ctrlroot",
- [53308] = "ctrlroot",
- -- Nature's Grasp (Uses different spellIDs than Entangling Roots for the same spell)
- [19970] = "ctrlroot",
- [19971] = "ctrlroot",
- [19972] = "ctrlroot",
- [19973] = "ctrlroot",
- [19974] = "ctrlroot",
- [19975] = "ctrlroot",
- [27010] = "ctrlroot",
- [53313] = "ctrlroot",
- -- Earthgrab (Storm, Earth and Fire talent)
- [8377] = "ctrlroot",
- [31983] = "ctrlroot",
- -- Web (Spider)
- [4167] = "ctrlroot",
- -- Venom Web Spray (Silithid)
- [54706] = "ctrlroot",
- [55505] = "ctrlroot",
- [55506] = "ctrlroot",
- [55507] = "ctrlroot",
- [55508] = "ctrlroot",
- [55509] = "ctrlroot",
- --[[ RANDOM ROOTS ]]--
- -- Improved Hamstring
- [23694] = "rndroot",
- -- Frostbite
- [12494] = "rndroot",
- -- Shattered Barrier
- [55080] = "rndroot",
- --[[ SLEEPS ]]--
- -- Hibernate
- [2637] = "sleep",
- [18657] = "sleep",
- [18658] = "sleep",
- --[[ HORROR ]]--
- -- Death Coil
- [6789] = "horror",
- [17925] = "horror",
- [17926] = "horror",
- [27223] = "horror",
- [47859] = "horror",
- [47860] = "horror",
- -- Psychic Horror
- [64044] = "horror",
- --[[ MISC ]]--
- -- Scatter Shot
- [19503] = "scatters",
- -- Cheap Shot
- [1833] = "cheapshot",
- -- Pounce
- [9005] = "cheapshot",
- [9823] = "cheapshot",
- [9827] = "cheapshot",
- [27006] = "cheapshot",
- [49803] = "cheapshot",
- -- Charge
- [7922] = "charge",
- -- Mind Control
- [605] = "mc",
- -- Banish
- [710] = "banish",
- [18647] = "banish",
- -- Entrapment
- [64804] = "entrapment",
- [64804] = "entrapment",
- [19185] = "entrapment",
- }
- -- DR Category names
- Data.categoryNames = {
- ["banish"] = L["Banish"],
- ["charge"] = L["Charge"],
- ["cheapshot"] = L["Cheap Shot"],
- ["ctrlstun"] = L["Controlled stuns"],
- ["cyclone"] = L["Cyclone"],
- ["disarm"] = L["Disarms"],
- ["disorient"] = L["Disorients"],
- ["entrapment"] = L["Entrapment"],
- ["fear"] = L["Fears"],
- ["horror"] = L["Horrors"],
- ["mc"] = L["Mind Control"],
- ["rndroot"] = L["Random roots"],
- ["rndstun"] = L["Random stuns"],
- ["ctrlroot"] = L["Controlled roots"],
- ["scatters"] = L["Scatter Shot"],
- ["silence"] = L["Silences"],
- ["sleep"] = L["Hibernate"],
- ["taunt"] = L["Taunts"],
- }
- -- Categories that have DR in PvE as well as PvP
- Data.pveDR = {
- ["ctrlstun"] = true,
- ["rndstun"] = true,
- ["taunt"] = true,
- ["cyclone"] = true,
- }
- -- Public APIs
- -- Category name in something usable
- function Data:GetCategoryName(cat)
- return cat and Data.categoryNames[cat] or nil
- end
- -- Spell list
- function Data:GetSpells()
- return Data.spells
- end
- -- Seconds before DR resets
- function Data:GetResetTime()
- return Data.RESET_TIME
- end
- -- Get the category of the spellID
- function Data:GetSpellCategory(spellID)
- return spellID and Data.spells[spellID] or nil
- end
- -- Does this category DR in PvE?
- function Data:IsPVE(cat)
- return cat and Data.pveDR[cat] or nil
- end
- -- List of categories
- function Data:GetCategories()
- return Data.categoryNames
- end
- -- Next DR, if it's 1.0, next is 0.50, if it's 0.[50] = "ctrlroot",next is 0.[25] = "ctrlroot",and such
- function Data:NextDR(diminished)
- if( diminished == 1 ) then
- return 0.50
- elseif( diminished == 0.50 ) then
- return 0.25
- end
- return 0
- end
- --[[ EXAMPLES ]]--
- -- This is how you would track DR easily, you're welcome to do whatever you want with the below functions
- --[[
- local trackedPlayers = {}
- local function debuffGained(spellID, destName, destGUID, isEnemy, isPlayer)
- -- Not a player, and this category isn't diminished in PVE, as well as make sure we want to track NPCs
- local drCat = DRData:GetSpellCategory(spellID)
- if( not isPlayer and not DRData:IsPVE(drCat) ) then
- return
- end
- if( not trackedPlayers[destGUID] ) then
- trackedPlayers[destGUID] = {}
- end
- -- See if we should reset it back to undiminished
- local tracked = trackedPlayers[destGUID][drCat]
- if( tracked and tracked.reset <= GetTime() ) then
- tracked.diminished = 1.0
- end
- end
- local function debuffFaded(spellID, destName, destGUID, isEnemy, isPlayer)
- local drCat = DRData:GetSpellCategory(spellID)
- if( not isPlayer and not DRData:IsPVE(drCat) ) then
- return
- end
- if( not trackedPlayers[destGUID] ) then
- trackedPlayers[destGUID] = {}
- end
- if( not trackedPlayers[destGUID][drCat] ) then
- trackedPlayers[destGUID][drCat] = { reset = 0, diminished = 1.0 }
- end
- local time = GetTime()
- local tracked = trackedPlayers[destGUID][drCat]
- tracked.reset = time + DRData:GetResetTime()
- tracked.diminished = DRData:NextDR(tracked.diminished)
- -- Diminishing returns changed, now you can do an update
- end
- local function resetDR(destGUID)
- -- Reset the tracked DRs for this person
- if( trackedPlayers[destGUID] ) then
- for cat in pairs(trackedPlayers[destGUID]) do
- trackedPlayers[destGUID][cat].reset = 0
- trackedPlayers[destGUID][cat].diminished = 1.0
- end
- end
- end
- local COMBATLOG_OBJECT_TYPE_PLAYER = COMBATLOG_OBJECT_TYPE_PLAYER
- local COMBATLOG_OBJECT_REACTION_HOSTILE = COMBATLOG_OBJECT_REACTION_HOSTILE
- local COMBATLOG_OBJECT_CONTROL_PLAYER = COMBATLOG_OBJECT_CONTROL_PLAYER
- local eventRegistered = {["SPELL_AURA_APPLIED"] = true, ["SPELL_AURA_REFRESH"] = true, ["SPELL_AURA_REMOVED"] = true, ["PARTY_KILL"] = true, ["UNIT_DIED"] = true}
- local function COMBAT_LOG_EVENT_UNFILTERED(self, event, timestamp, eventType, sourceGUID, sourceName, sourceFlags, destGUID, destName, destFlags, spellID, spellName, spellSchool, auraType)
- if( not eventRegistered[eventType] ) then
- return
- end
- -- Enemy gained a debuff
- if( eventType == "SPELL_AURA_APPLIED" ) then
- if( auraType == "DEBUFF" and DRData:GetSpellCategory(spellID) ) then
- local isPlayer = ( bit.band(destFlags, COMBATLOG_OBJECT_TYPE_PLAYER) == COMBATLOG_OBJECT_TYPE_PLAYER or bit.band(destFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) == COMBATLOG_OBJECT_CONTROL_PLAYER )
- debuffGained(spellID, destName, destGUID, (bit.band(destFlags, COMBATLOG_OBJECT_REACTION_HOSTILE) == COMBATLOG_OBJECT_REACTION_HOSTILE), isPlayer)
- end
- -- Enemy had a debuff refreshed before it faded, so fade + gain it quickly
- elseif( eventType == "SPELL_AURA_REFRESH" ) then
- if( auraType == "DEBUFF" and DRData:GetSpellCategory(spellID) ) then
- local isPlayer = ( bit.band(destFlags, COMBATLOG_OBJECT_TYPE_PLAYER) == COMBATLOG_OBJECT_TYPE_PLAYER or bit.band(destFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) == COMBATLOG_OBJECT_CONTROL_PLAYER )
- local isHostile = (bit.band(destFlags, COMBATLOG_OBJECT_REACTION_HOSTILE) == COMBATLOG_OBJECT_REACTION_HOSTILE)
- debuffFaded(spellID, destName, destGUID, isHostile, isPlayer)
- debuffGained(spellID, destName, destGUID, isHostile, isPlayer)
- end
- -- Buff or debuff faded from an enemy
- elseif( eventType == "SPELL_AURA_REMOVED" ) then
- if( auraType == "DEBUFF" and DRData:GetSpellCategory(spellID) ) then
- local isPlayer = ( bit.band(destFlags, COMBATLOG_OBJECT_TYPE_PLAYER) == COMBATLOG_OBJECT_TYPE_PLAYER or bit.band(destFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) == COMBATLOG_OBJECT_CONTROL_PLAYER )
- debuffFaded(spellID, destName, destGUID, (bit.band(destFlags, COMBATLOG_OBJECT_REACTION_HOSTILE) == COMBATLOG_OBJECT_REACTION_HOSTILE), isPlayer)
- end
- -- Don't use UNIT_DIED inside arenas due to accuracy issues, outside of arenas we don't care too much
- elseif( ( eventType == "UNIT_DIED" and select(2, IsInInstance()) ~= "arena" ) or eventType == "PARTY_KILL" ) then
- resetDR(destGUID)
- end
- end]]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement