--DISPLAY EVERY FRAME SMH function() --- CPU benchmarking --- local start local aura_env = aura_env local Debug = aura_env.Debug if Debug then aura_env.count = aura_env.count or 1 aura_env.count = (aura_env.count + 1) % 600 start = debugprofilestop() end -- Setting some aura_env to local variables to improve performance -- local ClassID = aura_env.ClassID local SpecID = aura_env.SpecID local AoE = aura_env.AoE local Mode = aura_env.Mode local ColorFunction = aura_env.Color local Threshold = aura_env.Threshold local BasicReductions = aura_env.BasicReductions -- Armor calulation // Armor scales differently depending on the enemy level, this makes sure is stays accurate -- local Armor = select(2, UnitArmor("player")) Armor = 1 - C_PaperDollInfo.GetArmorEffectiveness(Armor, aura_env.TargetLevel) -- Gets the reduction percentage and makes it usable -- All Classes local CurrentHealth = UnitHealth("player") local MaxHealth = UnitHealthMax("player") local Vers = 1 - (GetCombatRatingBonus(31) / 100) local Avoid = 1 local ScanTarget = false if AoE then Avoid = 1 - (GetAvoidance() / 100) end local Elusive = 1 local StaggerP, StaggerM = 1, 1 local Absorbs = UnitGetTotalAbsorbs("player") local AbsorbsP, AbsorbsM = Absorbs, Absorbs -- Initialize some variables -- local ClassDRP, ClassDRM = 1, 1 local PImmunity, MImmunity = 0, 0 ----- General damage reduction buffs ----- local n = 1 local BuffID = select(10, UnitBuff("player", n)) while BuffID do local Reduction = 1 local PhysicalReduction = 1 local MagicReduction = 1 if BasicReductions[BuffID] then ClassDRP = ClassDRP * BasicReductions[BuffID][1] ClassDRM = ClassDRM * BasicReductions[BuffID][2] end ---- More complex tracking ---- local AMS, BloodS = 0, 0 --- Death Knight --- if BuffID == 48792 then Reduction = 1 + (tonumber(select(18, UnitBuff("player", n)) or 0)) / 100 -- Icebound Fortitude // using plus since the tooltip returns a negative value elseif BuffID == 48707 then AMS = (select(16, UnitBuff("player", n)) or 0) -- Anti-Magic Shell elseif BuffID == 77535 then BloodS = (select(16, UnitBuff("player", n)) or 0) -- Blood Shield --- Demon Hunter --- elseif BuffID == 212800 then if IsPlayerSpell(205411) then Reduction = 0.50 -- Blur else Reduction = 0.65 end elseif BuffID == 196555 then PImmunity = 1 -- Netherwalk --- Druid --- elseif BuffID == 102342 then Reduction = 1 + (tonumber(select(16, UnitBuff("player", n)) or 0)) / 100 -- Ironbark // using plus since the tooltip returns a negative value --- Hunter --- elseif BuffID == 186265 then -- Aspect of the Turtle PImmunity = 1 MImmunity = 1 --- Mage --- elseif BuffID == 45438 then -- Ice Block PImmunity = 1 MImmunity = 1 --- Monk --- elseif BuffID == 261769 then Reduction = 1 + (select(16, UnitBuff("player", n)) or 0) / 100 -- Inner Strength // using plus since the tooltip returns a negative value elseif BuffID == 115295 then Absorbs = Absorbs - select(16, UnitBuff("player", n)) -- Guard // prevents Guard from counting as a normal absorb --- Paladin --- elseif BuffID == 210320 then Reduction = 1 + (tonumber(select(16, UnitBuff("player", n)) or 0)) / 100 -- Devotion Aura // using plus since the tooltip returns a negative value elseif BuffID == 1022 then PImmunity = 1 -- Blessing of Protection elseif BuffID == 204018 then MImmunity = 1 -- Blessing of Spellwarding elseif BuffID == 188370 then Reduction = 1 - (GetMasteryEffect() / 2.85) / 100 -- Consecration // May not be 100% accurate, but it's good enough for now if IsEquippedItem(137047) then Reduction = Reduction * 0.96 end -- Consecration (Legendary Ring) elseif BuffID == 642 then -- Divine Shield PImmunity = 1 MImmunity = 1 --- Priest --- elseif BuffID == 45242 then Reduction = 1 - (select(3, UnitBuff("player", n)) or 0) * 15 / 100 -- Focused Will elseif BuffID == 139 then if IsPlayerSpell(235189) and UnitBuff("player", n, nil, "player") then Reduction = 0.90 -- Perseverance - Talent end --- Rogue --- elseif BuffID == 1966 then if not AoE and IsPlayerSpell(79008) then Elusive = 0.70 -- Elusiveness else -- Feint if AoE then Avoid = Avoid * 0.50 end end elseif BuffID == 31224 then MImmunity = 1 -- Cloak of Shadows --- Shaman --- elseif BuffID == 260881 then Reduction = 1 - (tonumber(select(3, UnitBuff("player", n)) or 0)) * 5 / 100 -- Ghost in the Mist - Talent --- Warlock --- --- Warrior --- elseif BuffID == 184362 and IsPlayerSpell(208154) then -- Enrage Reduction = 0.90 -- War Paint - Talent end AbsorbsP = Absorbs - AMS AbsorbsM = Absorbs - BloodS ClassDRP = ClassDRP * Reduction * PhysicalReduction ClassDRM = ClassDRM * Reduction * MagicReduction n = n + 1 BuffID = select(10, UnitBuff("player", n)) end ----- Damage reductions with special calculations ----- --- Death Knight --- if ClassID == 6 then local Necropolis = 1 if IsPlayerSpell(206967) then -- Will of the Necropolis - Talent if CurrentHealth / MaxHealth < 0.35 then Necropolis = 0.65 end end ClassDRP = ClassDRP * Necropolis ClassDRM = ClassDRM * Necropolis end --- Demon Hunter --- if ClassID == 12 then local HavocDemWards = 1 local VengDemWards = 1 if SpecID == 1 then HavocDemWards = 0.90 -- Demonic Wards - Passive elseif SpecID == 2 then VengDemWards = 0.90 -- Demonic Wards - Passive ScanTarget = true end ClassDRP = ClassDRP * VengDemWards ClassDRM = ClassDRM * VengDemWards * HavocDemWards end --- Druid --- if ClassID == 11 then local GuardA = 1 if IsEquippedItem(137015) and IsPlayerSpell(16931) then GuardA = 0.895 -- Legendary chest elseif IsPlayerSpell(16931) then GuardA = 0.94 -- Thick Hide (Guardian Affinity) end if SpecID == 3 then if IsPlayerSpell(204053) then ScanTarget = true end end ClassDRP = ClassDRP * GuardA ClassDRM = ClassDRM * GuardA end --- Hunter --- if ClassID == 3 then end --- Mage --- if ClassID == 8 then end --- Monk --- if ClassID == 10 then if SpecID == 1 then ScanTarget = true -- Gets stagger agaist current target, if no target is found use base -- local StaggerBase, StaggerTarget = C_PaperDollInfo.GetStaggerPercentage("player") if not StaggerTarget then StaggerTarget = StaggerBase end StaggerM = StaggerTarget * 0.35 StaggerP = 1 - StaggerTarget / 100 StaggerM = 1 - StaggerM / 100 -- Stagger cap -- local Stagger = UnitStagger("player") or 0 -- Calculate MaxHealth effective reduction for Stagger local StaggerCapP = (CurrentHealth + AbsorbsP) / (CurrentHealth + AbsorbsP + 100 * MaxHealth - Stagger * 10) local StaggerCapM = (CurrentHealth + AbsorbsM) / (CurrentHealth + AbsorbsM + 100 * MaxHealth - Stagger * 10) if StaggerCapP < 0.01 then StaggerCapP = 0.01 end -- Stagger caps at 99% if StaggerCapM < 0.01 then StaggerCapM = 0.01 end if StaggerP < StaggerCapP then StaggerP = StaggerCapP end if StaggerM < StaggerCapM then StaggerM = StaggerCapM end end if SpecID == 3 then local Karma = 0 aura_env.GoodKarma = IsPlayerSpell(280195) -- Talent Karma = aura_env.TouchOfKarma Absorbs = Absorbs + Karma AbsorbsP = AbsorbsP + Karma AbsorbsM = AbsorbsM + Karma end ClassDRP = ClassDRP * StaggerP ClassDRM = ClassDRM * StaggerM end --- Paladin --- if ClassID == 2 then local LastDefender = 1 if SpecID == 2 then -- Protection LastDefender = 1 - (1 - 0.97 ^ aura_env.NameplateCounter) end ClassDRP = ClassDRP * LastDefender ClassDRM = ClassDRM * LastDefender end --- Priest --- if ClassID == 5 then end --- Rogue --- if ClassID == 4 then end --- Shaman --- if ClassID == 7 then end --- Warlock --- if ClassID == 9 then local SoulLink = 1 local DestructionMastery = 1 if SpecID == 2 then -- Soul Link passive for Demonology Warlocks if UnitExists("pet") then SoulLink = 0.80 end elseif SpecID == 3 then DestructionMastery = 1 - ((GetMasteryEffect() / 9) / 100) -- Destruction mastery effect end ClassDRP = ClassDRP * SoulLink * DestructionMastery ClassDRM = ClassDRM * SoulLink * DestructionMastery end --- Warrior --- if ClassID == 1 then if SpecID == 3 then ScanTarget = true end ClassDRP = ClassDRP ClassDRM = ClassDRM end --- Miscellaneous --- if aura_env.HighmountainTauren then local Stamina = UnitStat("player", 3) local RuggedTenacity = floor((Stamina * 0.0003 * 20) + 0.5) Absorbs = Absorbs + RuggedTenacity end --- Checking debuffs on target if needed --- if ScanTarget then local TD = 1 local DebuffID = select(10, UnitDebuff("target", TD)) while DebuffID do local DebuffTarget = 1 local DebuffTargetP = 1 local DebuffTargetM = 1 --- Demon Hunter --- if DebuffID == 207744 and select(3, UnitDebuff("target", TD, nil, "player")) then DebuffTarget = 0.60 -- Fiery Brand elseif DebuffID == 268178 and select(3, UnitDebuff("target", TD, nil, "player")) then DebuffTarget = 0.94 -- Void Reaver -- Talent --- Druid --- elseif DebuffID == 192090 and select(3, UnitDebuff("target", TD, nil, "player")) then DebuffTarget = 1 - 0.02 * (select(3, UnitDebuff("target", TD, nil, "player")) or 0) -- Rend and Tear - Talent --- Monk --- elseif DebuffID == 123725 then DebuffTarget = 1 + 0.01 * (select(17, UnitDebuff("target", TD, nil, "player")) or 0) -- Breath of Fire // using plus since the tooltip returns a negative value --- Warrior --- elseif DebuffID == 1160 and select(7, UnitDebuff("target", TD)) == "player" then DebuffTarget = 0.80 -- Demoralizing Shout end ClassDRP = ClassDRP * DebuffTarget * DebuffTargetP ClassDRM = ClassDRM * DebuffTarget * DebuffTargetM TD = TD + 1 DebuffID = select(10, UnitDebuff("target", TD)) end end -- Damage taken modifiers -- local ReductionP = Vers * Avoid * ClassDRP * Armor * Elusive local ReductionM = Vers * Avoid * ClassDRM * Elusive -- CurrentHealth health and shields -- local EHP = (CurrentHealth + AbsorbsP) / ReductionP local EHM = (CurrentHealth + AbsorbsM) / ReductionM -- Export pre-avoidance EHP, EHM and immunity status as global variables -- if aura_env.GlobalExport then -- Calculate max effective health (no absorbs) -- local EHPMaxHealth = (MaxHealth + AbsorbsP) / ReductionP local EHMMaxHealth = (MaxHealth + AbsorbsM) / ReductionM -- Export to globals -- local Export = WA_ZELER_EH Export.EHPMAX, Export.EHMMAX = EHPMaxHealth * Avoid * Elusive, EHMMaxHealth * Avoid * Elusive Export.EHP, Export.EHM = EHP * Avoid * Elusive, EHM * Avoid * Elusive Export.REDP, Export.REDM = ReductionP / Avoid / Elusive, ReductionM / Avoid / Elusive Export.ABS, Export.ABSP, Export.ABSM = Absorbs, AbsorbsP, AbsorbsM Export.EHPIMMUNITY, Export.EHMIMMUNITY = PImmunity, MImmunity Export.EHARMOR = Armor Export.STAGGERP, Export.STAGGERM = StaggerP, StaggerM end -- Formatting numbers -- local DivideP, DivideM = 1, 1 local ImportDecimal = aura_env.DisplayDecimals local EHPdecimal, EHMdecimal = ImportDecimal, ImportDecimal local letterP, letterM = "", "" if EHP > 10 ^ 9 then EHP = EHP / 10 ^ 9 DivideP = 10 ^ 9 letterP = "b" EHPdecimal = 2 elseif EHP > 10 ^ 8 then EHP = EHP / 10 ^ 6 DivideP = 10 ^ 6 letterP = "m" EHPdecimal = 0 elseif EHP > 10 ^ 7 then EHP = EHP / 10 ^ 6 DivideP = 10 ^ 6 letterP = "m" elseif EHP > 10 ^ 6 then EHP = EHP / 10 ^ 6 DivideP = 10 ^ 6 letterP = "m" EHPdecimal = 2 elseif EHP > 10 ^ 5 then EHP = EHP / 10 ^ 3 DivideP = 10 ^ 3 letterP = "k" EHPdecimal = 0 elseif EHP > 10 ^ 4 then EHP = EHP / 10 ^ 3 DivideP = 10 ^ 3 letterP = "k" elseif EHP > 10 ^ 3 then EHP = EHP / 10 ^ 3 DivideP = 10 ^ 3 letterP = "k" EHPdecimal = 2 elseif EHP > -1 then EHP = EHP / 1 DivideP = 1 EHPdecimal = 0 end if EHM > 10 ^ 9 then EHM = EHM / 10 ^ 9 DivideM = 10 ^ 9 letterM = "b" EHMdecimal = 2 elseif EHM > 10 ^ 8 then EHM = EHM / 10 ^ 6 DivideM = 10 ^ 6 letterM = "m" EHMdecimal = 0 elseif EHM > 10 ^ 7 then EHM = EHM / 10 ^ 6 DivideM = 10 ^ 6 letterM = "m" elseif EHM > 10 ^ 6 then EHM = EHM / 10 ^ 6 DivideM = 10 ^ 6 letterM = "m" EHMdecimal = 2 elseif EHM > 10 ^ 5 then EHM = EHM / 10 ^ 3 DivideM = 10 ^ 3 letterM = "k" EHMdecimal = 0 elseif EHM > 10 ^ 4 then EHM = EHM / 10 ^ 3 DivideM = 10 ^ 3 letterM = "k" elseif EHM > 10 ^ 3 then EHM = EHM / 10 ^ 3 DivideM = 10 ^ 3 letterM = "k" EHMdecimal = 2 elseif EHM > -1 then EHM = EHM / 1 DivideM = 1 EHMdecimal = 0 end -- Format displayed text with appropriate colors -- local Color = "" if Mode ~= "magic" then for i = 1, 6 do if EHP >= Threshold[1][i] / DivideP then Color = ColorFunction[i] end end if PImmunity == 1 then Color = ColorFunction[7] end EHP = string.format("P:|c%s%." .. EHPdecimal .. "f" .. letterP .. "|r", Color, EHP) else EHP = "" end if Mode ~= "physical" then for i = 1, 6 do if EHM >= Threshold[2][i] / DivideM then Color = ColorFunction[i] end end if MImmunity == 1 then Color = ColorFunction[7] end EHM = string.format("M:|c%s%." .. EHMdecimal .. "f" .. letterM .. "|r", Color, EHM) else EHM = "" end local separator = "" if Mode == "both" and aura_env.Align == "horizontal" then separator = " | " elseif Mode == "both" and aura_env.Align == "vertical" then separator = "\n" end --- CPU Benchmarking --- if Debug then aura_env.time = (aura_env.time or 0) + debugprofilestop() - start if aura_env.count == 0 then print(aura_env.time) aura_env.time = 0 end return "P: " .. ReductionP .. "\n" .. "M: " .. ReductionM end return EHP .. separator .. EHM end --CUSTOM TRIGGER function(t) return t[1] end --TRIGGER 1 - ALIVE --ACTIVE_TALENT_GROUP_CHANGED function() aura_env.SpecID = GetSpecialization() end --COMBAT_LOG_EVENT_UNFILTERED function(event) -- Original code from https://wago.io/B1M5OqeFb if aura_env.ClassID == 10 and aura_env.SpecID == 3 then local CLEU = {CombatLogGetCurrentEventInfo()} local message = CLEU[2] local destName = CLEU[9] local Multiplier = 0.5 if aura_env.GoodKarma then Multiplier = 1 end if destName and UnitIsUnit("player", destName) then if message == "SPELL_ABSORBED" then local chk = CLEU[9] local spellID, absorbed = 0, 0 if type(chk) == "number" then -- Spell spellID = CLEU[19] absorbed = CLEU[22] else -- Swing spellID = CLEU[16] absorbed = CLEU[19] end if spellID == 122470 then aura_env.TouchOfKarma = math.max(aura_env.TouchOfKarma - absorbed, 0) end elseif message == "SPELL_AURA_APPLIED" then local spellID = CLEU[12] if spellID == 122470 then aura_env.maxValue = UnitHealthMax("player") * Multiplier aura_env.TouchOfKarma = aura_env.maxValue end elseif message == "SPELL_AURA_REMOVED" then local spellID = CLEU[12] if spellID == 122470 then aura_env.TouchOfKarma = 0 end end end end end --PLAYER_TARGET_CHANGED,ENCOUNTER_START,INSTANCE_ENCOUNTER_ENGAGE_UNIT function() local PlayerLevel = aura_env.PlayerLevel local TargetLevel = PlayerLevel if UnitExists("boss1") then TargetLevel = UnitLevel("boss1") elseif UnitExists("target") then TargetLevel = UnitLevel("target") end if TargetLevel == -1 then -- Raid boss TargetLevel = PlayerLevel + 3 -- elseif TargetLevel < aura_env.PlayerLevel then -- TargetLevel = PlayerLevel -- Prevents the armor scaling from looking too strange. Currently disabled end aura_env.TargetLevel = TargetLevel end --PLAYER_LEVEL_UP function(event, NewLevel) aura_env.PlayerLevel = NewLevel end --EVERY FRAME?? (For last defender - delet?) function() if aura_env.ClassID == 2 and aura_env.SpecID == 2 then -- Enable for Protection Paladins only if IsPlayerSpell(203791) then -- Last Defender - talent local now = GetTime() if now - aura_env.NameplateCheck >= 0.1 then -- Throttle aura_env.NameplateCheck = now local counter = 0 local i for i = 1, 40 do local unit = "nameplate" .. i if UnitExists(unit) and not UnitIsFriend("player", unit) then if WeakAuras.GetRange(unit) < 8 then -- 8y range check counter = counter + 1 end end end aura_env.NameplateCounter = counter end else aura_env.NameplateCounter = 0 -- Reset counter if the talent is not selected end end end --INIT-- Made by Zeler-Ravencrest EU, with great help from Stryer-Ravencrest EU aura_env.Mode = "both" -- Choose from "physical", "magic", "both" to change the value(s) displayed aura_env.Align = "vertical" -- Choose which alignment you want. "vertical" for vertical alignment, "horizontal" for horizontal alignment aura_env.AoE = true -- Enable avoidance with true and disable it with false aura_env.GlobalExport = true -- Enable export of certain variables as global variables for use in other weakauras aura_env.Debug = false -- Enable debug with true. It will then return the damage reduction multipliers local text = true -- Disable the 'P:' and the 'M:' with false aura_env.DisplayDecimals = 1 -- The number of decimals displayed aura_env.PlayerLevel = UnitLevel("player") aura_env.TargetLevel = aura_env.PlayerLevel aura_env.TouchOfKarma = 0 aura_env.GoodKarma = IsPlayerSpell(280195) -- Wind Walker Monk - Talent aura_env.HighmountainTauren = IsPlayerSpell(255659) -- Rugged Tenacity - Passive aura_env.NameplateCheck = 0 -- Protection Paladin - Last Defender - talent aura_env.NameplateCounter = 0 -- Protection Paladin - Last Defender - talent -- Color values, the accepted values are from 0 to 255 -- {red, green, blue} aura_env.Color = { {0, 255, 0}, -- Lowest HP {0, 255, 0}, {0, 255, 0}, {0, 255, 0}, {0, 255, 0}, {0, 255, 0}, -- Highest HP {0, 255, 0}, -- Immunity color } -- Thresholds at which the color changes (leave the first 0) aura_env.Threshold = { {0, 1, 2, 3, 4, 5}, -- Physical EH {0, 1, 2, 3, 4, 5}, -- Magic EH } local function RGBtoHex(rgb) return string.format("ff%02x%02x%02x", rgb[1], rgb[2], rgb[3]) end for i = 1, #aura_env.Color do aura_env.Color[i] = RGBtoHex(aura_env.Color[i]) end -- Check player class and spec aura_env.ClassID = select(3, UnitClass("player")) aura_env.SpecID = GetSpecialization() -- Class self-buffs: [Spell ID] = {Phys Reduction, Magic Reduction} aura_env.BasicReductions = { --- Death Knight --- [194679] = {0.70, 0.70}, -- Rune Tap --- Demon Hunter --- --- Druid --- [158792] = {0.91, 0.91}, -- Pulverize [22812] = {0.80, 0.80}, -- Barkskin [61336] = {0.50, 0.50}, -- Survival Instincts --- Hunter --- [186265] = {0.70, 0.70}, -- Aspect of the Turtle [264735] = {0.80, 0.80}, -- Survival of the Fittest --- Mage --- [113862] = {0.40, 0.40}, -- Greater Invisibility [235450] = {1, 0.85}, -- Prismatic Barrier --- Monk --- [120954] = {0.80, 0.80}, -- Fortifying Brew (BrM) [243435] = {0.80, 0.80}, -- Fortifying Brew (MW) [122278] = {0.80, 0.80}, -- Dampen Harm, assumed at minimum reduction [122783] = {1, 0.40}, -- Diffuse Magic [115176] = {0.40, 0.40}, -- Zen Meditation --- Paladin --- [498] = {0.80, 0.80}, -- Divine Protection [31850] = {0.80, 0.80}, -- Ardent Defender [205191] = {0.65, 1}, -- Eye for an Eye - talent [86659] = {0.50, 0.50}, -- Guardian of Ancient Kings [212641] = {0.50, 0.50}, -- Guardian of Ancient Kings - Glyph of the Queen [183436] = {0.70, 0.70}, -- Retribution - passive [6940] = {0.70, 0.70}, -- Blessing of Sacrifice [204335] = {0.80, 0.80}, -- Aegis of Light - talent --- Priest --- [47585] = {0.40, 0.40}, -- Dispersion [193065] = {0.90, 0.90}, -- Masochism - talent [232698] = {0.90, 1}, -- Shadowform [33206] = {0.60, 0.60}, -- Pain Suppression -- [194384] = {0.97, 0.97}, -- Leniece - talent -- Currently disabled due to being unable to track if the casting priest has the talent or not [81782] = {0.75, 0.75}, -- Power Word: Barrier --- Rogue --- [45182] = {0.15, 0.15}, -- Cheating Death - Cheat Death talent --- Shaman --- [108271] = {0.60, 0.60}, -- Astral Shift [98007] = {0.90, 0.90}, -- Spirit Link Totem --- Warlock --- [104773] = {0.60, 0.60}, -- Unending Resolve --- Warrior --- [197690] = {0.80, 0.80}, -- Defensive Stance [118038] = {0.70, 0.70}, -- Die by the Sword [184364] = {0.70, 0.70}, -- Enraged Regeneration [871] = {0.60, 0.60}, -- Shield Wall [23920] = {1, 0.80}, -- Spell Reflection [223658] = {0.70, 0.70}, -- Safeguard --- Miscellaneous --- [241836] = {0.95, 0.95}, -- Shadow of Celumbra [65116] = {0.90, 1}, -- Stoneform [211080] = {0.90, 0.90}, -- Comforting light (Court of Stars) [273809] = {1.30, 1.30} -- Idol of Rage } if aura_env.GlobalExport then WA_ZELER_EH = {} end