Files
coa-elvui/ElvUI_Enhanced/Modules/Misc/LoseControl.lua
T
Andrew6810 8ad40722a0 Fixes Enhanced character frame
Update nameplate coloring.
Fix world map blips
2022-10-30 16:41:03 -07:00

358 lines
10 KiB
Lua

local E, L, V, P, G = unpack(ElvUI)
local LC = E:NewModule("Enhanced_LoseControl", "AceEvent-3.0")
local GetSpellInfo = GetSpellInfo
local GetTime = GetTime
local UnitDebuff = UnitDebuff
local spellNameList = {}
local spellIDList = {
-- Death Knight
[47481] = "CC", -- Gnaw (Ghoul)
[51209] = "CC", -- Hungering Cold
[47476] = "Silence", -- Strangulate
[45524] = "Snare", -- Chains of Ice
[55666] = "Snare", -- Desecration
[58617] = "Snare", -- Glyph of Heart Strike
[50436] = "Snare", -- Icy Clutch
-- Druid
[5211] = "CC", -- Bash
[33786] = "CC", -- Cyclone
[2637] = "CC", -- Hibernate
[22570] = "CC", -- Maim
[9005] = "CC", -- Pounce
[339] = "Root", -- Entangling Roots
[19675] = "Root", -- Feral Charge Effect
[58179] = "Snare", -- Infected Wounds
[61391] = "Snare", -- Typhoon
-- Hunter
[60210] = "CC", -- Freezing Arrow Effect
[3355] = "CC", -- Freezing Trap Effect
[24394] = "CC", -- Intimidation
[1513] = "CC", -- Scare Beast
[19503] = "CC", -- Scatter Shot
[19386] = "CC", -- Wyvern Sting
[34490] = "Silence", -- Silencing Shot
[53359] = "Disarm", -- Chimera Shot - Scorpid
[19306] = "Root", -- Counterattack
[19185] = "Root", -- Entrapment
[35101] = "Snare", -- Concussive Barrage
[5116] = "Snare", -- Concussive Shot
[13810] = "Snare", -- Frost Trap Aura
[61394] = "Snare", -- Glyph of Freezing Trap
[2974] = "Snare", -- Wing Clip
-- Hunter Pets
[50519] = "CC", -- Sonic Blast
[50541] = "Disarm", -- Snatch
[54644] = "Snare", -- Froststorm Breath
[50245] = "Root", -- Pin
[50271] = "Snare", -- Tendon Rip
[50518] = "CC", -- Ravage
[54706] = "Root", -- Venom Web Spray
[4167] = "Root", -- Web
-- Mage
[44572] = "CC", -- Deep Freeze
[31661] = "CC", -- Dragon's Breath
[12355] = "CC", -- Impact
[118] = "CC", -- Polymorph
[18469] = "Silence", -- Silenced - Improved Counterspell
[64346] = "Disarm", -- Fiery Payback
[33395] = "Root", -- Freeze
[122] = "Root", -- Frost Nova
[11071] = "Root", -- Frostbite
[55080] = "Root", -- Shattered Barrier
[11113] = "Snare", -- Blast Wave
[6136] = "Snare", -- Chilled
[120] = "Snare", -- Cone of Cold
[116] = "Snare", -- Frostbolt
[47610] = "Snare", -- Frostfire Bolt
[31589] = "Snare", -- Slow
-- Paladin
[853] = "CC", -- Hammer of Justice
[2812] = "CC", -- Holy Wrath
[20066] = "CC", -- Repentance
[20170] = "CC", -- Stun
[10326] = "CC", -- Turn Evil
[63529] = "Silence", -- Silenced - Shield of the Templar
[20184] = "Snare", -- Judgement of Justice
-- Priest
[605] = "CC", -- Mind Control
[64044] = "CC", -- Psychic Horror
[8122] = "CC", -- Psychic Scream
[9484] = "CC", -- Shackle Undead
[15487] = "Silence", -- Silence
[64058] = "Disarm", -- Psychic Horror
[15407] = "Snare", -- Mind Flay
-- Rogue
[2094] = "CC", -- Blind
[1833] = "CC", -- Cheap Shot
[1776] = "CC", -- Gouge
[408] = "CC", -- Kidney Shot
[6770] = "CC", -- Sap
[1330] = "Silence", -- Garrote - Silence
[18425] = "Silence", -- Silenced - Improved Kick
[51722] = "Disarm", -- Dismantle
[31125] = "Snare", -- Blade Twisting
[3409] = "Snare", -- Crippling Poison
[26679] = "Snare", -- Deadly Throw
-- Shaman
[39796] = "CC", -- Stoneclaw Stun
[51514] = "CC", -- Hex
[64695] = "Root", -- Earthgrab
[63685] = "Root", -- Freeze
[3600] = "Snare", -- Earthbind
[8056] = "Snare", -- Frost Shock
[8034] = "Snare", -- Frostbrand Attack
-- Warlock
[710] = "CC", -- Banish
[6789] = "CC", -- Death Coil
[5782] = "CC", -- Fear
[5484] = "CC", -- Howl of Terror
[6358] = "CC", -- Seduction
[30283] = "CC", -- Shadowfury
[24259] = "Silence", -- Spell Lock
[18118] = "Snare", -- Aftermath
[18223] = "Snare", -- Curse of Exhaustion
-- Warrior
[7922] = "CC", -- Charge Stun
[12809] = "CC", -- Concussion Blow
[20253] = "CC", -- Intercept
[5246] = "CC", -- Intimidating Shout
[12798] = "CC", -- Revenge Stun
[46968] = "CC", -- Shockwave
[18498] = "Silence", -- Silenced - Gag Order
[676] = "Disarm", -- Disarm
[58373] = "Root", -- Glyph of Hamstring
[23694] = "Root", -- Improved Hamstring
[1715] = "Snare", -- Hamstring
[12323] = "Snare", -- Piercing Howl
-- Other
[30217] = "CC", -- Adamantite Grenade
[67769] = "CC", -- Cobalt Frag Bomb
[30216] = "CC", -- Fel Iron Bomb
[20549] = "CC", -- War Stomp
[25046] = "Silence", -- Arcane Torrent
[39965] = "Root", -- Frost Grenade
[55536] = "Root", -- Frostweave Net
[13099] = "Root", -- Net-o-Matic
[29703] = "Snare", -- Dazed
-- PvE
[28169] = "PvE", -- Mutating Injection
[28059] = "PvE", -- Positive Charge
[28084] = "PvE", -- Negative Charge
[27819] = "PvE", -- Detonate Mana
[63024] = "PvE", -- Gravity Bomb
[63018] = "PvE", -- Searing Light
[62589] = "PvE", -- Nature's Fury
[63276] = "PvE", -- Mark of the Faceless
[66770] = "PvE", -- Ferocious Butt
[71340] = "PvE", -- Pact of the Darkfallen
[70126] = "PvE", -- Frost Beacon
[73785] = "PvE", -- Necrotic Plague
}
local priorities = {
["CC"] = 60,
["PvE"] = 50,
["Silence"] = 40,
["Disarm"] = 30,
["Root"] = 20,
["Snare"] = 10,
}
function LC:OnUpdate(elapsed)
self.timeLeft = self.timeLeft - elapsed
if self.timeLeft > 10 then
self.cooldownTime:SetFormattedText("%d", self.timeLeft)
elseif self.timeLeft > 0 then
self.cooldownTime:SetFormattedText("%.1f", self.timeLeft)
else
self:SetScript("OnUpdate", nil)
self.timeLeft = nil
self.cooldownTime:SetText("0")
end
end
local function CheckPriority(priority, ccPriority, expirationTime, ccExpirationTime)
if not ccPriority then
return true
end
if priorities[priority] > priorities[ccPriority] then
return true
elseif priorities[priority] == priorities[ccPriority] and expirationTime > ccExpirationTime then
return true
end
end
function LC:UNIT_AURA(event, unit)
if unit ~= "player" then return end
local ccExpirationTime = 0
local ccName, ccIcon, ccDuration, ccPriority, wyvernSting
local _, name, icon, duration, expirationTime, priority
for i = 1, 40 do
name, _, icon, _, _, duration, expirationTime = UnitDebuff("player", i)
if not name then break end
if name == self.wyvernStingName then
wyvernSting = 1
if not self.wyvernSting then
self.wyvernSting = 1
elseif expirationTime > self.wyvernStingExpirationTime then
self.wyvernSting = 2
end
self.wyvernStingExpirationTime = expirationTime
if self.wyvernSting == 2 then
name = nil
end
elseif name == self.psychicHorrorName and icon ~= "Interface\\Icons\\Ability_Warrior_Disarm" then
name = nil
end
priority = self.db[spellNameList[name]]
if priority and CheckPriority(priority, ccPriority, expirationTime, ccExpirationTime) then
ccName = name
ccIcon = icon
ccDuration = duration
ccExpirationTime = expirationTime
ccPriority = priorities[priority]
end
end
if self.wyvernSting == 2 and not wyvernSting then
self.wyvernSting = nil
end
if ccExpirationTime == 0 then
if self.ccExpirationTime ~= 0 then
self.ccExpirationTime = 0
self.frame.timeLeft = nil
self.frame:SetScript("OnUpdate", nil)
self.frame:Hide()
end
elseif ccExpirationTime ~= self.ccExpirationTime then
self.ccExpirationTime = ccExpirationTime
self.frame.icon:SetTexture(ccIcon)
self.frame.spellName:SetText(ccName)
if ccDuration > 0 then
self.frame.cooldown:SetCooldown(ccExpirationTime - ccDuration, ccDuration)
local timeLeft = ccExpirationTime - GetTime()
if self.frame.timeLeft then
self.frame.timeLeft = timeLeft
else
self.frame.timeLeft = timeLeft
self.frame:SetScript("OnUpdate", self.OnUpdate)
end
end
self.frame:Show()
end
end
function LC:UpdateSpellNames()
local spellName
for spellID, ccType in pairs(spellIDList) do
spellName = GetSpellInfo(spellID)
if spellName then
spellNameList[spellName] = ccType
end
end
end
function LC:ToggleState()
if E.private.enhanced.loseControl.enable then
if not self.initialized then
self:Initialize()
return
end
E:EnableMover(self.frame.mover:GetName())
self:RegisterEvent("UNIT_AURA")
else
self.ccExpirationTime = 0
self.frame.timeLeft = nil
self.frame:SetScript("OnUpdate", nil)
self.frame:Hide()
E:DisableMover(self.frame.mover:GetName())
self:UnregisterEvent("UNIT_AURA")
end
end
function LC:UpdateSettings()
if not self.db then return end
self.frame:Size(self.db.iconSize)
if self.db.compactMode then
self.frame.cooldownTime:FontTemplate(E.media.normFont, E:Round(self.db.iconSize / 3), "OUTLINE")
self.frame.cooldownTime:ClearAllPoints()
self.frame.cooldownTime:SetPoint("CENTER")
self.frame.spellName:Hide()
self.frame.secondsText:Hide()
else
self.frame.cooldownTime:FontTemplate(E.media.normFont, 20, "OUTLINE")
self.frame.cooldownTime:SetPoint("BOTTOM", 0, -50)
self.frame.spellName:Show()
self.frame.secondsText:Show()
end
end
function LC:Initialize()
if not E.private.enhanced.loseControl.enable then return end
self.db = E.db.enhanced.loseControl
self.frame = CreateFrame("Frame", "ElvUI_LoseControl", UIParent)
self.frame:SetPoint("CENTER")
self.frame:SetTemplate()
self.frame:Hide()
self.frame.icon = self.frame:CreateTexture(nil, "ARTWORK")
self.frame.icon:SetInside()
self.frame.icon:SetTexCoord(unpack(E.TexCoords))
self.frame.cooldown = CreateFrame("Cooldown", "$parent_Cooldown", self.frame, "CooldownFrameTemplate")
self.frame.cooldown:SetInside()
self.frame.spellName = self.frame:CreateFontString(nil, "OVERLAY")
self.frame.spellName:FontTemplate(E.media.normFont, 20, "OUTLINE")
self.frame.spellName:SetPoint("BOTTOM", 0, -25)
self.frame.cooldownTime = self.frame.cooldown:CreateFontString(nil, "OVERLAY")
self.frame.secondsText = self.frame.cooldown:CreateFontString(nil, "OVERLAY")
self.frame.secondsText:FontTemplate(E.media.normFont, 20, "OUTLINE")
self.frame.secondsText:SetPoint("BOTTOM", 0, -75)
self.frame.secondsText:SetText(L["seconds"])
self:UpdateSettings()
E:CreateMover(self.frame, "LossControlMover", L["Loss Control"], nil, nil, nil, "ALL,ARENA")
self:UpdateSpellNames()
self.wyvernStingName = GetSpellInfo(19386)
self.psychicHorrorName = GetSpellInfo(64058)
self:RegisterEvent("UNIT_AURA")
self.initialized = true
end
local function InitializeCallback()
LC:Initialize()
end
E:RegisterModule(LC:GetName(), InitializeCallback)