From af91b3d388fef6158b3e2d39832f3ad35b25c222 Mon Sep 17 00:00:00 2001
From: EsreverWoW <49285632+EsreverWoW@users.noreply.github.com>
Date: Sun, 17 Dec 2023 17:08:09 -0600
Subject: [PATCH] [Libs] Add LibClassicCasterino back for the limited use of
channel spells
---
README-zhCN.md | 2 +-
README.md | 2 +-
.../LibClassicCasterino.lua | 3560 +++++++++++++++++
ShestakUI/Libs/oUF/Elements/CastBar.lua | 40 +-
ShestakUI/ShestakUI.toc | 2 +-
ShestakUI/ShestakUI_Mainline.toc | 2 +-
ShestakUI/ShestakUI_TBC.toc | 2 +-
ShestakUI/ShestakUI_Vanilla.toc | 2 +-
ShestakUI/ShestakUI_Vanilla.xml | 1 +
ShestakUI/ShestakUI_Wrath.toc | 2 +-
10 files changed, 3605 insertions(+), 10 deletions(-)
create mode 100644 ShestakUI/Libs/LibClassicCasterino/LibClassicCasterino.lua
diff --git a/README-zhCN.md b/README-zhCN.md
index 283670a9e..b77a05541 100644
--- a/README-zhCN.md
+++ b/README-zhCN.md
@@ -86,7 +86,7 @@ ShestakUI supports and contains language specific code for the following game cl
- [Changelog](https://github.com/EsreverWoW/ShestakUI_Classic/commits)
## Credits:
-AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
+AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, d87, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
## Translation:
Aelb, AlbertDuval, Alwa, Baine, Chubidu, Cranan, eXecrate, F5Hellbound, Ianchan, Joe, Leg883, Mania, Nanjiqq, Oz, Puree, Sakaras, Seal, Sinaris, Skyzo-be, Spacedragon, Tat2dawn, Tibles, Vienchen, Wetxius
diff --git a/README.md b/README.md
index 4109420ec..03ae41a4d 100644
--- a/README.md
+++ b/README.md
@@ -86,7 +86,7 @@ ShestakUI supports and contains language specific code for the following game cl
- [Changelog](https://github.com/EsreverWoW/ShestakUI_Classic/commits)
## Credits:
-AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
+AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, d87, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
## Translation:
Aelb, AlbertDuval, Alwa, Baine, Chubidu, Cranan, eXecrate, F5Hellbound, Ianchan, Joe, Leg883, Mania, Nanjiqq, Oz, Puree, Sakaras, Seal, Sinaris, Skyzo-be, Spacedragon, Tat2dawn, Tibles, Vienchen, Wetxius
diff --git a/ShestakUI/Libs/LibClassicCasterino/LibClassicCasterino.lua b/ShestakUI/Libs/LibClassicCasterino/LibClassicCasterino.lua
new file mode 100644
index 000000000..840c03417
--- /dev/null
+++ b/ShestakUI/Libs/LibClassicCasterino/LibClassicCasterino.lua
@@ -0,0 +1,3560 @@
+--[================[
+LibClassicCasterino
+Author: d87
+--]================]
+if WOW_PROJECT_ID ~= WOW_PROJECT_CLASSIC then return end
+
+local apiLevel = math.floor(select(4,GetBuildInfo())/10000)
+local isClassic = apiLevel <= 2
+local isVanilla = apiLevel == 1
+local isBC = apiLevel == 2
+
+local MAJOR, MINOR = "LibClassicCasterino-ShestakUI", 37
+local lib = LibStub:NewLibrary(MAJOR, MINOR)
+if not lib then return end
+
+
+lib.callbacks = lib.callbacks or LibStub("CallbackHandler-1.0"):New(lib)
+
+lib.frame = lib.frame or CreateFrame("Frame")
+
+local f = lib.frame
+local callbacks = lib.callbacks
+
+lib.casters = lib.casters or {} -- setmetatable({}, { __mode = "v" })
+local casters = lib.casters
+
+lib.movecheckGUIDs = lib.movecheckGUIDs or {}
+local movecheckGUIDs = lib.movecheckGUIDs
+local MOVECHECK_TIMEOUT = 4
+
+local UnitGUID = UnitGUID
+local bit_band = bit.band
+
+local GetSpellInfo = GetSpellInfo
+local GetTime = GetTime
+local CastingInfo = CastingInfo
+local ChannelInfo = ChannelInfo
+local GetUnitSpeed = GetUnitSpeed
+local UnitIsUnit = UnitIsUnit
+
+local COMBATLOG_OBJECT_REACTION_FRIENDLY = COMBATLOG_OBJECT_REACTION_FRIENDLY
+local COMBATLOG_OBJECT_TYPE_PLAYER_OR_PET = COMBATLOG_OBJECT_TYPE_PLAYER + COMBATLOG_OBJECT_TYPE_PET
+local classCasts
+local classChannelsByAura
+local classChannelsByCast
+local talentDecreased
+local crowdControlAuras
+local FireToUnits
+
+f:SetScript("OnEvent", function(self, event, ...)
+ return self[event](self, event, ...)
+end)
+
+
+local spellNameToID = {}
+local NPCspellNameToID = {}
+local NPCSpells
+
+local function makeCastUIDFromSpellID(npcID, spellID)
+ return tostring(npcID)..GetSpellInfo(spellID)
+end
+local castTimeCache = {
+ [makeCastUIDFromSpellID(15990, 8407)] = 2, -- Kel'Thuzad, "Frostbolt"
+}
+local castTimeCacheStartTimes = setmetatable({}, { __mode = "v" })
+
+local AIMED_SHOT = GetSpellInfo(19434)
+local MULTI_SHOT = GetSpellInfo(25294)
+local AimedDelay = 1
+local castingAimedShot = false
+local playerGUID = UnitGUID("player")
+
+--[[
+function DUMPCASTS()
+ local castedSpells = {}
+ local counter = 0
+ for id=1,40000 do
+ local name, _, texture, castTime = GetSpellInfo(id)
+ 136235 -- interface/icons/temp.blp -- Samwise Didier Icon aka missing icon
+ if name and castTime > 500 and texture ~= 136235 then
+ castedSpells[id] = true
+ counter = counter + 1
+ end
+ end
+ print(counter)
+ NugHealthDB.LCDDUMP = castedSpells
+end
+]]
+
+local refreshCastTable = function(tbl, ...)
+ local numArgs = select("#", ...)
+ for i=1, numArgs do
+ tbl[i] = select(i, ...)
+ end
+end
+
+local makeCastUID = function(guid, spellName)
+ local _, _, _, _, _, npcID = strsplit("-", guid);
+ npcID = npcID or "Unknown"
+ return npcID..spellName
+end
+
+local function CastStart(srcGUID, castType, spellName, spellID, overrideCastTime, isSrcEnemyPlayer )
+ -- This cast time can't be used reliably because it's changing depending on player's own haste
+ local _, _, icon, castTime = GetSpellInfo(spellID)
+ if castType == "CAST" then
+ local knownCastDuration = classCasts[spellID]
+ if knownCastDuration then
+ castTime = knownCastDuration*1000
+ end
+ end
+ if castType == "CHANNEL" then
+ local channelDuration = classChannelsByAura[spellID] or classChannelsByCast[spellID]
+ castTime = channelDuration*1000
+ end
+ local decreased = talentDecreased[spellID]
+ if decreased then
+ castTime = castTime - decreased*1000
+ end
+ if overrideCastTime then
+ castTime = overrideCastTime
+ end
+ local now = GetTime()*1000
+ local startTime = now
+ local endTime = now + castTime
+ local currentCast = casters[srcGUID]
+
+ if currentCast then
+ refreshCastTable(currentCast, castType, spellName, icon, startTime, endTime, spellID )
+ else
+ casters[srcGUID] = { castType, spellName, icon, startTime, endTime, spellID }
+ end
+
+ if isSrcEnemyPlayer then
+ if not (spellID == 4068 or spellID == 19769) then -- Iron Grenade, Thorium Grenade
+ movecheckGUIDs[srcGUID] = MOVECHECK_TIMEOUT
+ end
+ end
+
+ if castType == "CAST" then
+ if srcGUID == playerGUID and (spellName == AIMED_SHOT or spellName == MULTI_SHOT) then
+ castingAimedShot = true
+ AimedDelay = 1
+ movecheckGUIDs[srcGUID] = MOVECHECK_TIMEOUT
+ if spellName == MULTI_SHOT then
+ casters[srcGUID][5] = startTime + 500
+ end
+ callbacks:Fire("UNIT_SPELLCAST_START", "player")
+ end
+ FireToUnits("UNIT_SPELLCAST_START", srcGUID)
+ else
+ FireToUnits("UNIT_SPELLCAST_CHANNEL_START", srcGUID)
+ end
+end
+
+local function CastStop(srcGUID, castType, suffix, suffix2 )
+ local currentCast = casters[srcGUID]
+ if currentCast then
+ castType = castType or currentCast[1]
+
+ casters[srcGUID] = nil
+ movecheckGUIDs[srcGUID] = nil
+
+ if castType == "CAST" then
+ local event = "UNIT_SPELLCAST_"..suffix
+ if srcGUID == playerGUID and castingAimedShot then
+ castingAimedShot = false
+ callbacks:Fire(event, "player")
+ end
+ FireToUnits(event, srcGUID)
+ if suffix2 then
+ FireToUnits("UNIT_SPELLCAST_"..suffix2, srcGUID)
+ end
+ else
+ FireToUnits("UNIT_SPELLCAST_CHANNEL_STOP", srcGUID)
+ end
+ end
+end
+
+function f:COMBAT_LOG_EVENT_UNFILTERED(event)
+
+ local timestamp, eventType, hideCaster,
+ srcGUID, srcName, srcFlags, srcFlags2,
+ dstGUID, dstName, dstFlags, dstFlags2,
+ spellID, spellName, arg3, arg4, arg5,
+ arg6, resisted, blocked, absorbed = CombatLogGetCurrentEventInfo()
+
+ local isSrcPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_TYPE_PLAYER_OR_PET) > 0
+ if isSrcPlayer and spellID == 0 then
+ spellID = spellNameToID[spellName]
+ end
+ if eventType == "SPELL_CAST_START" then
+ if isSrcPlayer then
+ local isCasting = classCasts[spellID]
+ if isCasting then
+ local isSrcFriendlyPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) > 0
+ CastStart(srcGUID, "CAST", spellName, spellID, nil, not isSrcFriendlyPlayer)
+ end
+ else
+ local castUID = makeCastUID(srcGUID, spellName)
+ local cachedTime = castTimeCache[castUID]
+ local spellID = NPCspellNameToID[spellName] -- just for the icon
+ if not spellID then
+ spellID = 4036 -- Engineering Icon
+ end
+ if cachedTime then
+ CastStart(srcGUID, "CAST", spellName, spellID, cachedTime*1000)
+ else
+ castTimeCacheStartTimes[srcGUID..castUID] = GetTime()
+ CastStart(srcGUID, "CAST", spellName, spellID, 1500) -- using default 1.5s cast time for now
+ end
+ end
+ elseif eventType == "SPELL_CAST_FAILED" then
+
+ CastStop(srcGUID, "CAST", "INTERRUPTED", "STOP")
+
+ elseif eventType == "SPELL_CAST_SUCCESS" then
+ if isSrcPlayer then
+ if classChannelsByAura[spellID] then
+ -- SPELL_CAST_SUCCESS can come right after AURA_APPLIED, so ignoring it
+ return
+ elseif classChannelsByCast[spellID] then
+ -- Channels fire SPELL_CAST_SUCCESS at their start
+ local isChanneling = classChannelsByCast[spellID]
+ if isChanneling then
+ local isSrcFriendlyPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) > 0
+ CastStart(srcGUID, "CHANNEL", spellName, spellID, nil, not isSrcFriendlyPlayer)
+ end
+ return
+ end
+ end
+ if not isSrcPlayer then
+ local castUID = makeCastUID(srcGUID, spellName)
+ local cachedTime = castTimeCache[castUID]
+ if not cachedTime then
+ local restoredStartTime = castTimeCacheStartTimes[srcGUID..castUID]
+ if restoredStartTime then
+ local now = GetTime()
+ local castTime = now - restoredStartTime
+ if castTime < 10 then
+ castTimeCache[castUID] = castTime
+ end
+ end
+ end
+ end
+ CastStop(srcGUID, nil, "SUCCEEDED", "STOP")
+
+ elseif eventType == "SPELL_INTERRUPT" then
+
+ CastStop(dstGUID, nil, "INTERRUPTED", "STOP")
+ elseif eventType == "UNIT_DIED" then
+ CastStop(dstGUID, nil, "INTERRUPTED", "STOP")
+
+ elseif eventType == "SPELL_AURA_APPLIED" or
+ eventType == "SPELL_AURA_REFRESH" or
+ eventType == "SPELL_AURA_APPLIED_DOSE"
+ then
+ if isSrcPlayer then
+ if crowdControlAuras[spellName] then
+ CastStop(dstGUID, nil, "INTERRUPTED", "STOP")
+ return
+ end
+
+ local isChanneling = classChannelsByAura[spellID]
+ if isChanneling then
+ local isSrcFriendlyPlayer = bit_band(srcFlags, COMBATLOG_OBJECT_REACTION_FRIENDLY) > 0
+ CastStart(srcGUID, "CHANNEL", spellName, spellID, nil, not isSrcFriendlyPlayer)
+ end
+ end
+ elseif eventType == "SPELL_AURA_REMOVED" then
+ if isSrcPlayer then
+ local isChanneling = classChannelsByAura[spellID]
+ if isChanneling then
+ CastStop(srcGUID, "CHANNEL", "STOP")
+ end
+ end
+ elseif castingAimedShot and dstGUID == UnitGUID("player") then
+ if eventType == "SWING_DAMAGE" or
+ eventType == "ENVIRONMENTAL_DAMAGE" or
+ eventType == "RANGE_DAMAGE" or
+ eventType == "SPELL_DAMAGE"
+ then
+ if resisted or blocked or absorbed then return end
+ local currentCast = casters[UnitGUID("player")]
+ if currentCast then
+ refreshCastTable(currentCast, currentCast[1], currentCast[2], currentCast[3], currentCast[4], currentCast[5] + (AimedDelay *1000))
+ if AimedDelay > 0.2 then
+ AimedDelay = AimedDelay - 0.2
+ end
+ callbacks:Fire("UNIT_SPELLCAST_DELAYED", "player")
+ end
+ end
+ end
+
+end
+
+local castTimeIncreases = {
+ [1714] = 1.5, -- Curse of Tongues (Rank 1) (50%)
+ [11719] = 1.6, -- Curse of Tongues (Rank 2) (60%)
+ [5760] = 1.4, -- Mind-Numbing Poison (Rank 1) (40%)
+ [8692] = 1.5, -- Mind-Numbing Poison (Rank 2) (50%)
+ [11398] = 1.6, -- Mind-Numbing Poison (Rank 3) (60%)
+ [1098] = 1.3, -- Enslave Demon (Rank 1) (30%)
+ [11725] = 1.3, -- Enslave Demon (Rank 2) (30%)
+ [11726] = 1.3, -- Enslave Demon (Rank 3) (30%)
+}
+local attackTimeDecreases = {
+ [6150] = 1.3, -- Quick Shots/ Imp Aspect of the Hawk (Aimed)
+ [3045] = 1.4, -- Rapid Fire (Aimed)
+ [28866] = 1.2, -- Kiss of the Spider (Increases your _attack speed_ by 20% for 15 sec.) -- For Aimed
+}
+
+local function GetTrollBerserkHaste(unit)
+ local perc = UnitHealth(unit)/UnitHealthMax(unit)
+ local speed = min((1.3 - perc)/3, .3) + 1
+ return speed
+end
+local function GetRangedHaste(unit)
+ local positiveMul = 1
+ for i=1, 100 do
+ local name, _, _, _, _, _, _, _, _, spellID = UnitAura(unit, i, "HELPFUL")
+ if not name then return positiveMul end
+ if attackTimeDecreases[spellID] or spellID == 26635 then
+ positiveMul = positiveMul * (attackTimeDecreases[spellID] or GetTrollBerserkHaste(unit))
+ end
+ end
+ return positiveMul
+end
+local function GetCastSlowdown(unit)
+ local negativeEx = 1
+ for i=1, 100 do
+ local name, _, _, _, _, _, _, _, _, spellID = UnitAura(unit, i, "HARMFUL")
+ if not name then return negativeEx end
+ if castTimeIncreases[spellID] then
+ negativeEx = math.max(negativeEx, castTimeIncreases[spellID])
+ end
+ end
+ return negativeEx
+end
+
+function lib:UnitCastingInfo(unit)
+ if UnitIsUnit(unit,"player") then
+ if not castingAimedShot then
+ return CastingInfo()
+ end
+ end
+ local guid = UnitGUID(unit)
+ local cast = casters[guid]
+ if cast then
+ local castType, name, icon, startTimeMS, endTimeMS, spellID = unpack(cast)
+ if castingAimedShot and spellID ~= 25294 then -- Multi-Shot spellID
+ local haste = GetRangedHaste(unit)
+ local duration = endTimeMS - startTimeMS
+ endTimeMS = startTimeMS + duration/haste
+ end
+
+ local slowdown = GetCastSlowdown(unit)
+ if slowdown ~= 1 then
+ local duration = endTimeMS - startTimeMS
+ endTimeMS = startTimeMS + duration * slowdown
+ end
+
+ if castType == "CAST" and endTimeMS > GetTime()*1000 then
+ local castID = nil
+ return name, nil, icon, startTimeMS, endTimeMS, nil, castID, false, spellID
+ end
+ end
+end
+
+function lib:UnitChannelInfo(unit)
+ if UnitIsUnit(unit, "player") then return ChannelInfo() end
+ local guid = UnitGUID(unit)
+ local cast = casters[guid]
+ if cast then
+ local castType, name, icon, startTimeMS, endTimeMS, spellID = unpack(cast)
+ -- Curse of Tongues doesn't matter that much for channels, skipping
+ if castType == "CHANNEL" and endTimeMS > GetTime()*1000 then
+ return name, nil, icon, startTimeMS, endTimeMS, nil, false, spellID
+ end
+ end
+end
+
+
+local Passthrough = function(self, event, unit, ...)
+ if unit == "player" or UnitIsUnit(unit, "player") then
+ callbacks:Fire(event, unit, ...)
+ end
+end
+if isBC then
+ Passthrough = function(self, event, unit, ...)
+ callbacks:Fire(event, unit, ...)
+ end
+ lib.UnitChannelInfo = function(self, ...)
+ return _G.UnitChannelInfo(...)
+ end
+ lib.UnitCastingInfo = function(self, ...)
+ return _G.UnitCastingInfo(...)
+ end
+end
+f.UNIT_SPELLCAST_START = Passthrough
+f.UNIT_SPELLCAST_DELAYED = Passthrough
+f.UNIT_SPELLCAST_STOP = Passthrough
+f.UNIT_SPELLCAST_FAILED = Passthrough
+f.UNIT_SPELLCAST_INTERRUPTED = Passthrough
+f.UNIT_SPELLCAST_CHANNEL_START = Passthrough
+f.UNIT_SPELLCAST_CHANNEL_UPDATE = Passthrough
+f.UNIT_SPELLCAST_CHANNEL_STOP = Passthrough
+f.UNIT_SPELLCAST_SUCCEEDED = Passthrough
+
+function callbacks.OnUsed()
+ if isVanilla then
+ f:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
+ -- for unit lookup
+ f:RegisterEvent("GROUP_ROSTER_UPDATE")
+ f:RegisterEvent("NAME_PLATE_UNIT_ADDED")
+ f:RegisterEvent("NAME_PLATE_UNIT_REMOVED")
+ end
+
+ f:RegisterEvent("UNIT_SPELLCAST_START")
+ f:RegisterEvent("UNIT_SPELLCAST_DELAYED")
+ f:RegisterEvent("UNIT_SPELLCAST_STOP")
+ f:RegisterEvent("UNIT_SPELLCAST_FAILED")
+ f:RegisterEvent("UNIT_SPELLCAST_INTERRUPTED")
+ f:RegisterEvent("UNIT_SPELLCAST_CHANNEL_START")
+ f:RegisterEvent("UNIT_SPELLCAST_CHANNEL_UPDATE")
+ f:RegisterEvent("UNIT_SPELLCAST_CHANNEL_STOP")
+ f:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
+end
+
+function callbacks.OnUnused()
+ f:UnregisterAllEvents()
+end
+
+talentDecreased = {
+ [25311] = 0.8, -- Corruption (while leveling)
+ [17924] = 2, -- Soul Fire
+ [25307] = 0.5, -- Shadow Bolt
+ [25309] = 0.5, -- Immolate
+ [691] = 4, -- Summon Felhunter
+ [688] = 4, -- Summon Imp
+ [697] = 4, -- Summon Voidwalker
+ [712] = 4, -- Summon Succubus
+
+ [15208] = 1, -- Lightning Bolt
+ [10605] = 1, -- Chain Lightning
+ [25357] = 0.5, -- Healing Wave
+ [2645] = 2, -- Ghost Wolf
+
+ [25304] = 0.5, -- Frostbolt
+ [25306] = 0.5, -- Fireball
+
+ [10934] = 0.5, -- Smite
+ [15261] = 0.5, -- Holy Fire
+ [6064] = 0.5, -- Heal
+ [25314] = 0.5, -- Greater Heal
+ [10876] = 0.5, -- Mana Burn
+
+ [9912] = 0.5, -- Wrath
+ [25298] = 0.5, -- Starfire
+ [25297] = 0.5, -- Healing Touch
+}
+
+classCasts = {
+ [25311] = 2, -- Corruption
+ [6215] = 1.5, -- Fear
+ [17928] = 2, -- Howl of Terror
+ [18647] = 1.5, -- Banish
+ [6366] = 3, -- Create Firestone (Lesser)
+ [17951] = 3, -- Create Firestone
+ [17952] = 3, -- Create Firestone (Greater)
+ [17953] = 3, -- Create Firestone (Major)
+ [28023] = 3, -- Create Healthstone
+ [11729] = 3, -- Create Healthstone (Greater)
+ [6202] = 3, -- Create Healthstone (Lesser)
+ [11730] = 3, -- Create Healthstone (Major)
+ [6201] = 3, -- Create Healthstone (Minor)
+ [20755] = 3, -- Create Soulstone
+ [20756] = 3, -- Create Soulstone (Greater)
+ [20752] = 3, -- Create Soulstone (Lesser)
+ [20757] = 3, -- Create Soulstone (Major)
+ [693] = 3, -- Create Soulstone (Minor)
+ [2362] = 5, -- Create Spellstone
+ [17727] = 5, -- Create Spellstone (Greater)
+ [17728] = 5, -- Create Spellstone (Major)
+ [11726] = 3, -- Enslave Demon
+ [126] = 5, -- Eye of Kilrogg
+ [1122] = 2, -- Inferno
+ [23161] = 3, -- Summon Dreadsteed
+ [5784] = 3, -- Summon Felsteed
+ [691] = 10, -- Summon Felhunter
+ [688] = 10, -- Summon Imp
+ [697] = 10, -- Summon Voidwalker
+ [712] = 10, -- Summon Succubus
+ [25309] = 2, -- Immolate
+ [17923] = 1.5, -- Searing Pain
+ [25307] = 3, -- Shadow Bolt
+ [17924] = 4, -- Soul Fire
+ [6358] = 1.5, -- Seduction
+ [11763] = 2, -- Firebolt (Imp)
+
+ [9853] = 1.5, -- Entangling Roots
+ [18658] = 1.5, -- Hibernate
+ [9901] = 1.5, -- Soothe Animal
+ [25298] = 3.5, -- Starfire
+ [18960] = 10, -- Teleport: Moonglade
+ [9912] = 2, -- Wrath
+ [25297] = 3.5, -- Healing Touch
+ [20748] = 2, -- Rebirth
+ [9858] = 2, -- Regrowth
+
+ [28612] = 3, -- Conjure Food
+ [759] = 3, -- Conjure Mana Agate
+ [10053] = 3, -- Conjure Mana Citrine
+ [3552] = 3, -- Conjure Mana Jade
+ [10054] = 3, -- Conjure Mana Ruby
+ [10140] = 3, -- Conjure Water
+ [12826] = 1.5, -- Polymorph
+ [25306] = 3.5, -- Fireball
+ [10216] = 3, -- Flamestrike
+ [10207] = 1.5, -- Scorch
+ [25304] = 3, -- Frostbolt
+ [3561] = 10, -- Teleport: Stormwind
+ [3562] = 10, -- Teleport: Ironforge
+ [3563] = 10, -- Teleport: Undercity
+ [3565] = 10, -- Teleport: Darnassus
+ [3566] = 10, -- Teleport: Thuner Bluff
+ [3567] = 10, -- Teleport: Orgrimmar
+ [10059] = 10, -- Portal: Stormwind
+ [11416] = 10, -- Portal: Ironforge
+ [11418] = 10, -- Portal: Undercity
+ [11419] = 10, -- Portal: Darnassus
+ [11420] = 10, -- Portal: Thuner Bluff
+ [11417] = 10, -- Portal: Orgrimmar
+
+ [10876] = 3, -- Mana Burn
+ [10955] = 1.5, -- Shackle Undead
+ [10917] = 1.5, -- Flash Heal
+ [25314] = 3, -- Greater Heal
+ [6064] = 3, -- Heal
+ [15261] = 3.5, -- Holy Fire
+ [2053] = 2.5, -- Lesser Heal
+ [25316] = 3, -- Prayer of Healing
+ [20770] = 10, -- Resurrection
+ [10934] = 2.5, -- Smite
+ [10947] = 1.5, -- Mind Blast
+ [10912] = 3, -- Mind Control
+
+ [19943] = 1.5, -- Flash of Light
+ [24239] = 1, -- Hammer of Wrath
+ [25292] = 2.5, -- Holy Light
+ [10318] = 2, -- Holy Wrath
+ [20773] = 10, -- Redemption
+ [23214] = 3, -- Summon Charger
+ [13819] = 3, -- Summon Warhorse
+ [10326] = 1.5, -- Turn Undead
+
+ [10605] = 2.5, -- Chain Lightning
+ [15208] = 3, -- Lightning Bolt
+ [556] = 10, -- Astral Recall
+ [6196] = 2, -- Far Sight
+ [2645] = 3, -- Ghost Wolf
+ [20777] = 10, -- Ancestral Spirit
+ [10623] = 2.5, -- Chain Heal
+ [25357] = 3, -- Healing Wave
+ [10468] = 1.5, -- Lesser Healing Wave
+
+ [1842] = 2, -- Disarm Trap
+ -- missing poison creation
+
+ [11605] = 1.5, -- Slam
+
+ [20904] = 3, -- Aimed Shot
+ [25294] = 0.5, -- Multi-Shot
+ [1002] = 2, -- Eyes of the Beast
+ [2641] = 5, -- Dismiss pet
+ [982] = 10, -- Revive Pet
+ [14327] = 1.5, -- Scare Beast
+
+ [8690] = 10, -- Hearthstone
+ [4068] = 1, -- Iron Grenade
+ [19769] = 1, -- Thorium Grenade
+ [20589] = 0.5, -- Escape Artist
+
+ -- Munts do not generate SPELL_CAST_START
+ -- [8394] = 3, -- Striped Frostsaber
+ -- [10793] = 3, -- Striped Nightsaber
+}
+
+classChannelsByAura = {
+ [746] = 6, -- First Aid
+ [20577] = 10, -- Cannibalize
+ [19305] = 6, -- Starshards
+
+ -- DRUID
+ [17402] = 10, -- Hurricane
+ [9863] = 10, -- Tranquility
+
+ -- HUNTER
+ [6197] = 60, -- Eagle Eye
+ [13544] = 5, -- Mend Pet
+ [1515] = 20, -- Tame Beast
+ [1002] = 60, -- Eyes of the Beast
+ [14295] = 6, -- Volley
+
+ [10187] = 8, -- Blizzard
+ [12051] = 8, -- Evocation
+
+ -- PRIEST
+ [18807] = 3, -- Mind Flay
+ [2096] = 60, -- Mind Vision
+ [10912] = 3, -- Mind Control
+
+ -- WARLOCK
+ [126] = 45, -- Eye of Kilrogg
+ [11700] = 5, -- Drain Life
+ [11704] = 5, -- Drain Mana
+ [11675] = 15, -- Drain Soul
+ [11678] = 8, -- Rain of Fire
+ [11684] = 15, -- Hellfire
+ [11695] = 10, -- Health Funnel
+ [6358] = 15, -- Seduction
+ [17854] = 10, -- Consume Shadows (Voidwalker)
+}
+
+classChannelsByCast = {
+ [13278] = 4, -- Gnomish Death Ray
+
+ -- MAGE
+ [25345] = 5, -- Arcane Missiles
+}
+
+
+for id in pairs(classCasts) do
+ spellNameToID[GetSpellInfo(id)] = id
+end
+for id in pairs(classChannelsByAura) do
+ spellNameToID[GetSpellInfo(id)] = id
+end
+for id in pairs(classChannelsByCast) do
+ spellNameToID[GetSpellInfo(id)] = id
+end
+
+local partyGUIDtoUnit = {}
+local raidGUIDtoUnit = {}
+local nameplateGUIDtoUnit = {}
+local commonUnits = {
+ -- "player",
+ "target",
+ "targettarget",
+ "pet",
+}
+
+function f:NAME_PLATE_UNIT_ADDED(event, unit)
+ local unitGUID = UnitGUID(unit)
+ nameplateGUIDtoUnit[unitGUID] = unit
+end
+
+
+function f:NAME_PLATE_UNIT_REMOVED(event, unit)
+ local unitGUID = UnitGUID(unit) -- Unit still exists at this point
+ nameplateGUIDtoUnit[unitGUID] = nil
+end
+
+function f:GROUP_ROSTER_UPDATE()
+ table.wipe(partyGUIDtoUnit)
+ table.wipe(raidGUIDtoUnit)
+ if IsInGroup() then
+ for i=1,4 do
+ local unit = "party"..i
+ local guid = UnitGUID(unit)
+ if guid then
+ partyGUIDtoUnit[guid] = unit
+ end
+ end
+ end
+ if IsInRaid() then
+ for i=1,40 do
+ local unit = "raid"..i
+ local guid = UnitGUID(unit)
+ if guid then
+ raidGUIDtoUnit[guid] = unit
+ end
+ end
+ end
+end
+
+FireToUnits = function(event, guid, ...)
+ for _, unit in ipairs(commonUnits) do
+ if UnitGUID(unit) == guid then
+ callbacks:Fire(event, unit, ...)
+ end
+ end
+
+ local partyUnit = partyGUIDtoUnit[guid]
+ if partyUnit then
+ callbacks:Fire(event, partyUnit, ...)
+ end
+
+ local raidUnit = raidGUIDtoUnit[guid]
+ if raidUnit then
+ callbacks:Fire(event, raidUnit, ...)
+ end
+
+ local nameplateUnit = nameplateGUIDtoUnit[guid]
+ if nameplateUnit then
+ callbacks:Fire(event, nameplateUnit, ...)
+ end
+end
+
+crowdControlAuras = { -- from ClassicCastbars
+ [GetSpellInfo(5211)] = true, -- Bash
+ [GetSpellInfo(24394)] = true, -- Intimidation
+ [GetSpellInfo(853)] = true, -- Hammer of Justice
+ [GetSpellInfo(22703)] = true, -- Inferno Effect (Summon Infernal)
+ [GetSpellInfo(408)] = true, -- Kidney Shot
+ [GetSpellInfo(12809)] = true, -- Concussion Blow
+ [GetSpellInfo(20253)] = true, -- Intercept Stun
+ [GetSpellInfo(20549)] = true, -- War Stomp
+ [GetSpellInfo(2637)] = true, -- Hibernate
+ [GetSpellInfo(3355)] = true, -- Freezing Trap
+ [GetSpellInfo(19386)] = true, -- Wyvern Sting
+ [GetSpellInfo(118)] = true, -- Polymorph
+ [GetSpellInfo(28271)] = true, -- Polymorph: Turtle
+ [GetSpellInfo(28272)] = true, -- Polymorph: Pig
+ [GetSpellInfo(20066)] = true, -- Repentance
+ [GetSpellInfo(1776)] = true, -- Gouge
+ [GetSpellInfo(6770)] = true, -- Sap
+ [GetSpellInfo(1513)] = true, -- Scare Beast
+ [GetSpellInfo(8122)] = true, -- Psychic Scream
+ [GetSpellInfo(2094)] = true, -- Blind
+ [GetSpellInfo(5782)] = true, -- Fear
+ [GetSpellInfo(5484)] = true, -- Howl of Terror
+ [GetSpellInfo(6358)] = true, -- Seduction
+ [GetSpellInfo(5246)] = true, -- Intimidating Shout
+ [GetSpellInfo(6789)] = true, -- Death Coil
+ [GetSpellInfo(9005)] = true, -- Pounce
+ [GetSpellInfo(1833)] = true, -- Cheap Shot
+ [GetSpellInfo(16922)] = true, -- Improved Starfire
+ [GetSpellInfo(19410)] = true, -- Improved Concussive Shot
+ [GetSpellInfo(12355)] = true, -- Impact
+ [GetSpellInfo(20170)] = true, -- Seal of Justice Stun
+ [GetSpellInfo(15269)] = true, -- Blackout
+ [GetSpellInfo(18093)] = true, -- Pyroclasm
+ [GetSpellInfo(12798)] = true, -- Revenge Stun
+ [GetSpellInfo(5530)] = true, -- Mace Stun
+ [GetSpellInfo(19503)] = true, -- Scatter Shot
+ [GetSpellInfo(605)] = true, -- Mind Control
+ [GetSpellInfo(7922)] = true, -- Charge Stun
+ [GetSpellInfo(18469)] = true, -- Counterspell - Silenced
+ [GetSpellInfo(15487)] = true, -- Silence
+ [GetSpellInfo(18425)] = true, -- Kick - Silenced
+ [GetSpellInfo(24259)] = true, -- Spell Lock
+ [GetSpellInfo(18498)] = true, -- Shield Bash - Silenced
+
+ -- ITEMS
+ [GetSpellInfo(13327)] = true, -- Reckless Charge
+ [GetSpellInfo(1090)] = true, -- Sleep
+ [GetSpellInfo(5134)] = true, -- Flash Bomb Fear
+ [GetSpellInfo(19821)] = true, -- Arcane Bomb Silence
+ [GetSpellInfo(4068)] = true, -- Iron Grenade
+ [GetSpellInfo(19769)] = true, -- Thorium Grenade
+ [GetSpellInfo(13808)] = true, -- M73 Frag Grenade
+ [GetSpellInfo(4069)] = true, -- Big Iron Bomb
+ [GetSpellInfo(12543)] = true, -- Hi-Explosive Bomb
+ [GetSpellInfo(4064)] = true, -- Rough Copper Bomb
+ [GetSpellInfo(12421)] = true, -- Mithril Frag Bomb
+ [GetSpellInfo(19784)] = true, -- Dark Iron Bomb
+ [GetSpellInfo(4067)] = true, -- Big Bronze Bomb
+ [GetSpellInfo(4066)] = true, -- Small Bronze Bomb
+ [GetSpellInfo(4065)] = true, -- Large Copper Bomb
+ [GetSpellInfo(13237)] = true, -- Goblin Mortar
+ [GetSpellInfo(835)] = true, -- Tidal Charm
+ [GetSpellInfo(13181)] = true, -- Gnomish Mind Control Cap
+ [GetSpellInfo(12562)] = true, -- The Big One
+ [GetSpellInfo(15283)] = true, -- Stunning Blow (Weapon Proc)
+ [GetSpellInfo(56)] = true, -- Stun (Weapon Proc)
+ [GetSpellInfo(26108)] = true, -- Glimpse of Madness
+}
+
+------------------------------
+-- Cast Interruption Checker
+------------------------------
+
+-- There's an issue that if you start a cast and immediately after cancel it, CAST_FAILED event won't ever come for it
+-- This leads to zombie casts that have to run until completion
+-- So for 4s after non-friendly player controlled guid started a cast we're watching if it's moving and cancel
+
+do
+ local GetUnitForFreshGUID = function(guid)
+ local targetGUID = UnitGUID('target')
+ if guid == targetGUID then
+ return "target"
+ end
+
+ return nameplateGUIDtoUnit[guid]
+ end
+
+ f:SetScript("OnUpdate", function(self, elapsed)
+ local guid, timeout = next(movecheckGUIDs)
+ while guid ~= nil do
+ -- Removing while iterating here, but it doesn't matter
+
+ local timeStart = MOVECHECK_TIMEOUT - timeout
+ if timeStart > 0.25 then
+ local unit = GetUnitForFreshGUID(guid)
+ if unit then
+ if GetUnitSpeed(unit) ~= 0 then
+ CastStop(guid, nil, "INTERRUPTED")
+ movecheckGUIDs[guid] = nil
+ return
+ end
+ end
+ end
+
+ movecheckGUIDs[guid] = timeout - elapsed
+ if timeout - elapsed < 0 then
+ movecheckGUIDs[guid] = nil
+ end
+ -- print(guid, movecheckGUIDs[guid])
+
+ guid, timeout = next(movecheckGUIDs, guid)
+ end
+ end)
+end
+
+------------------------------
+
+if lib.NPCSpellsTimer then
+ lib.NPCSpellsTimer:Cancel()
+end
+
+local prevID
+local counter = 0
+local function processNPCSpellTable()
+ counter = 0
+ local index, id = next(NPCSpells, prevID)
+ while (id and counter < 150) do
+ local spellName = GetSpellInfo(id)
+ if spellName then
+ NPCspellNameToID[spellName] = id
+ end
+
+ counter = counter + 1
+ prevID = index
+ index, id = next(NPCSpells, prevID)
+ end
+ if (id) then
+ C_Timer.After(1, processNPCSpellTable)
+ end
+end
+if isVanilla then
+ lib.NPCSpellsTimer = C_Timer.NewTimer(6.5, processNPCSpellTable)
+end
+
+NPCSpells = {
+ 10215,
+ 16587,
+ 16651,
+ 20874,
+ 16971,
+ 10695,
+ 7428,
+ 30152,
+ 7588,
+ 15238,
+ 11399,
+ 11431,
+ 7828,
+ 23242,
+ 7892,
+ 15910,
+ 8004,
+ 11975,
+ 16102,
+ 12039,
+ 12071,
+ 12167,
+ 20299,
+ 20427,
+ 513,
+ 16588,
+ 4165,
+ 20811,
+ 20875,
+ 25034,
+ 529,
+ 21067,
+ 21131,
+ 8552,
+ 8712,
+ 547,
+ 8776,
+ 555,
+ 8936,
+ 569,
+ 9224,
+ 4629,
+ 581,
+ 585,
+ 587,
+ 591,
+ 2371,
+ 13607,
+ 2387,
+ 2395,
+ 9672,
+ 27658,
+ 27722,
+ 13895,
+ 9928,
+ 4981,
+ 19980,
+ 14119,
+ 635,
+ 2547,
+ 639,
+ 10248,
+ 2579,
+ 647,
+ 5189,
+ 20876,
+ 16973,
+ 2667,
+ 17293,
+ 10792,
+ 17613,
+ 2739,
+ 11016,
+ 11048,
+ 693,
+ 15207,
+ 697,
+ 2795,
+ 5605,
+ 18445,
+ 707,
+ 2835,
+ 711,
+ 11400,
+ 22924,
+ 5781,
+ 23308,
+ 15783,
+ 735,
+ 27659,
+ 23628,
+ 19725,
+ 16071,
+ 19981,
+ 12072,
+ 28299,
+ 759,
+ 3067,
+ 3075,
+ 3083,
+ 3091,
+ 16590,
+ 6213,
+ 3115,
+ 8489,
+ 25292,
+ 8617,
+ 17294,
+ 8681,
+ 6405,
+ 6421,
+ 8809,
+ 6469,
+ 8873,
+ 8905,
+ 6517,
+ 3275,
+ 26444,
+ 3323,
+ 3331,
+ 837,
+ 6725,
+ 13480,
+ 6757,
+ 3387,
+ 9481,
+ 9513,
+ 13640,
+ 855,
+ 857,
+ 3443,
+ 6917,
+ 867,
+ 6949,
+ 3491,
+ 3507,
+ 9961,
+ 9993,
+ 24141,
+ 7077,
+ 3563,
+ 895,
+ 7221,
+ 16655,
+ 3635,
+ 25037,
+ 913,
+ 915,
+ 25357,
+ 17231,
+ 10697,
+ 10793,
+ 939,
+ 15048,
+ 943,
+ 11017,
+ 15208,
+ 26381,
+ 26445,
+ 11209,
+ 959,
+ 3843,
+ 3851,
+ 3859,
+ 22798,
+ 11433,
+ 18831,
+ 15592,
+ 7861,
+ 23310,
+ 7893,
+ 27725,
+ 8005,
+ 16072,
+ 12073,
+ 4067,
+ 20431,
+ 1026,
+ 16528,
+ 16656,
+ 8362,
+ 16784,
+ 12521,
+ 1062,
+ 8618,
+ 12745,
+ 8682,
+ 1090,
+ 1094,
+ 1098,
+ 1106,
+ 30093,
+ 8938,
+ 1122,
+ 9002,
+ 13225,
+ 22415,
+ 18448,
+ 18576,
+ 22799,
+ 22991,
+ 9482,
+ 23247,
+ 4950,
+ 24399,
+ 5110,
+ 5174,
+ 16657,
+ 20816,
+ 29134,
+ 5270,
+ 17169,
+ 10698,
+ 25807,
+ 17745,
+ 15049,
+ 26063,
+ 11082,
+ 15241,
+ 15305,
+ 22480,
+ 18449,
+ 11338,
+ 15497,
+ 5782,
+ 1450,
+ 23248,
+ 23312,
+ 15785,
+ 23632,
+ 12074,
+ 24208,
+ 20433,
+ 16402,
+ 16594,
+ 16658,
+ 8363,
+ 8395,
+ 12522,
+ 6278,
+ 16978,
+ 6310,
+ 6358,
+ 6422,
+ 17618,
+ 6470,
+ 6518,
+ 9003,
+ 13226,
+ 6630,
+ 13322,
+ 13482,
+ 6758,
+ 9483,
+ 13642,
+ 23249,
+ 23313,
+ 9739,
+ 9771,
+ 6950,
+ 19666,
+ 6982,
+ 9931,
+ 9995,
+ 14122,
+ 10059,
+ 20434,
+ 16531,
+ 10347,
+ 16659,
+ 24913,
+ 25297,
+ 1842,
+ 17235,
+ 10699,
+ 10795,
+ 10955,
+ 15114,
+ 15242,
+ 7638,
+ 18451,
+ 11339,
+ 15498,
+ 15530,
+ 7782,
+ 23250,
+ 11659,
+ 23442,
+ 19667,
+ 2006,
+ 2010,
+ 12075,
+ 8102,
+ 24274,
+ 20435,
+ 2052,
+ 2060,
+ 20627,
+ 16596,
+ 16660,
+ 8364,
+ 12491,
+ 12523,
+ 16980,
+ 25298,
+ 21331,
+ 12747,
+ 8780,
+ 8812,
+ 8940,
+ 9004,
+ 13227,
+ 13323,
+ 13419,
+ 22867,
+ 9484,
+ 23187,
+ 2396,
+ 9612,
+ 13899,
+ 13931,
+ 19860,
+ 9964,
+ 28242,
+ 28306,
+ 24275,
+ 2540,
+ 2548,
+ 14379,
+ 5159,
+ 10348,
+ 16661,
+ 16725,
+ 2660,
+ 2668,
+ 10700,
+ 10796,
+ 2740,
+ 2812,
+ 18453,
+ 11340,
+ 2860,
+ 15659,
+ 2908,
+ 11660,
+ 23508,
+ 2948,
+ 15915,
+ 19669,
+ 16075,
+ 12044,
+ 12076,
+ 3068,
+ 3084,
+ 3092,
+ 6199,
+ 6215,
+ 8365,
+ 12492,
+ 3132,
+ 3140,
+ 29331,
+ 12684,
+ 21397,
+ 8717,
+ 25748,
+ 6471,
+ 6487,
+ 8941,
+ 6535,
+ 3276,
+ 3292,
+ 13228,
+ 6631,
+ 3324,
+ 3332,
+ 22677,
+ 3356,
+ 3364,
+ 3372,
+ 13548,
+ 9485,
+ 13612,
+ 13644,
+ 3420,
+ 9613,
+ 3436,
+ 23509,
+ 13836,
+ 13868,
+ 6951,
+ 27860,
+ 3492,
+ 9901,
+ 9933,
+ 9997,
+ 28244,
+ 7079,
+ 3564,
+ 14380,
+ 20630,
+ 7223,
+ 16663,
+ 20822,
+ 3636,
+ 3644,
+ 3652,
+ 16983,
+ 29332,
+ 10605,
+ 7383,
+ 10701,
+ 10733,
+ 17559,
+ 3748,
+ 26069,
+ 11021,
+ 11085,
+ 18199,
+ 7639,
+ 7655,
+ 3844,
+ 3852,
+ 3860,
+ 3868,
+ 7751,
+ 22870,
+ 7799,
+ 7863,
+ 11661,
+ 11725,
+ 23510,
+ 23638,
+ 15980,
+ 19863,
+ 12045,
+ 8087,
+ 8103,
+ 4068,
+ 16,
+ 16408,
+ 8238,
+ 16600,
+ 16664,
+ 16728,
+ 8398,
+ 12525,
+ 16984,
+ 21143,
+ 12653,
+ 8686,
+ 17496,
+ 17560,
+ 8814,
+ 26006,
+ 26070,
+ 26134,
+ 4520,
+ 13229,
+ 18392,
+ 18456,
+ 18584,
+ 13421,
+ 13485,
+ 22999,
+ 23063,
+ 9614,
+ 23639,
+ 13901,
+ 13933,
+ 27990,
+ 19864,
+ 9966,
+ 20312,
+ 16409,
+ 20568,
+ 10318,
+ 5176,
+ 16665,
+ 16729,
+ 16985,
+ 21144,
+ 10702,
+ 10798,
+ 17561,
+ 21848,
+ 26071,
+ 15117,
+ 22168,
+ 15245,
+ 18457,
+ 11342,
+ 22744,
+ 15533,
+ 23000,
+ 11534,
+ 5784,
+ 27287,
+ 11726,
+ 15853,
+ 11790,
+ 19865,
+ 24024,
+ 12046,
+ 12078,
+ 28311,
+ 20313,
+ 20377,
+ 16410,
+ 16730,
+ 8399,
+ 12526,
+ 25112,
+ 16986,
+ 29335,
+ 25304,
+ 8687,
+ 17434,
+ 25688,
+ 17562,
+ 21913,
+ 26072,
+ 18138,
+ 13230,
+ 13262,
+ 6648,
+ 18458,
+ 6728,
+ 22937,
+ 13582,
+ 13646,
+ 27608,
+ 9743,
+ 27992,
+ 9935,
+ 20314,
+ 20378,
+ 7224,
+ 16667,
+ 16731,
+ 16795,
+ 7288,
+ 16987,
+ 10703,
+ 17435,
+ 10799,
+ 17563,
+ 17883,
+ 15118,
+ 11343,
+ 7752,
+ 15534,
+ 22938,
+ 7800,
+ 15662,
+ 7896,
+ 7928,
+ 7960,
+ 15982,
+ 8008,
+ 19867,
+ 12047,
+ 12079,
+ 8104,
+ 20315,
+ 20379,
+ 2053,
+ 2061,
+ 8272,
+ 4153,
+ 20763,
+ 16732,
+ 8400,
+ 16988,
+ 12655,
+ 17180,
+ 21403,
+ 8688,
+ 17564,
+ 21787,
+ 8880,
+ 17820,
+ 9200,
+ 9232,
+ 13519,
+ 9456,
+ 13583,
+ 2389,
+ 2397,
+ 9616,
+ 19484,
+ 13935,
+ 19868,
+ 9968,
+ 24091,
+ 10096,
+ 2541,
+ 2549,
+ 16413,
+ 5161,
+ 5177,
+ 20764,
+ 5273,
+ 2645,
+ 25307,
+ 2661,
+ 10704,
+ 10768,
+ 5401,
+ 17565,
+ 2741,
+ 11024,
+ 18205,
+ 2837,
+ 15535,
+ 11568,
+ 27291,
+ 2941,
+ 3013,
+ 6041,
+ 20317,
+ 20381,
+ 16367,
+ 8209,
+ 3085,
+ 3093,
+ 6201,
+ 3109,
+ 3117,
+ 16798,
+ 12528,
+ 8465,
+ 16990,
+ 12624,
+ 8593,
+ 3205,
+ 17566,
+ 3229,
+ 3237,
+ 6521,
+ 17950,
+ 3277,
+ 3293,
+ 3325,
+ 3333,
+ 22749,
+ 22813,
+ 3373,
+ 6777,
+ 9489,
+ 13648,
+ 3421,
+ 3429,
+ 6905,
+ 3477,
+ 3493,
+ 3501,
+ 9937,
+ 10001,
+ 7081,
+ 20318,
+ 20382,
+ 16415,
+ 3605,
+ 20702,
+ 20830,
+ 16799,
+ 7289,
+ 16991,
+ 25309,
+ 10673,
+ 10705,
+ 17503,
+ 17567,
+ 7481,
+ 10961,
+ 17951,
+ 7641,
+ 22430,
+ 18399,
+ 3845,
+ 3861,
+ 15472,
+ 7753,
+ 15536,
+ 7801,
+ 7817,
+ 15664,
+ 15728,
+ 11665,
+ 15792,
+ 11729,
+ 15856,
+ 11921,
+ 11985,
+ 12049,
+ 12081,
+ 8105,
+ 4061,
+ 4069,
+ 20319,
+ 16336,
+ 24670,
+ 20831,
+ 8402,
+ 66,
+ 16992,
+ 8690,
+ 8786,
+ 17952,
+ 4506,
+ 18656,
+ 1179,
+ 13617,
+ 13745,
+ 13841,
+ 13905,
+ 13937,
+ 4954,
+ 14033,
+ 9970,
+ 20320,
+ 20384,
+ 10258,
+ 10322,
+ 5178,
+ 25055,
+ 16993,
+ 25311,
+ 10674,
+ 10706,
+ 17505,
+ 30046,
+ 15057,
+ 30174,
+ 17953,
+ 18081,
+ 1403,
+ 18401,
+ 18657,
+ 11410,
+ 15537,
+ 11538,
+ 15665,
+ 1451,
+ 23392,
+ 11730,
+ 11762,
+ 27871,
+ 11922,
+ 16081,
+ 12050,
+ 12082,
+ 20321,
+ 20385,
+ 16418,
+ 8275,
+ 6202,
+ 12466,
+ 20897,
+ 16866,
+ 12562,
+ 16994,
+ 8595,
+ 8691,
+ 17506,
+ 6490,
+ 18082,
+ 18402,
+ 26656,
+ 18658,
+ 13522,
+ 6778,
+ 13746,
+ 9811,
+ 9875,
+ 14034,
+ 10003,
+ 7098,
+ 28448,
+ 20322,
+ 20386,
+ 7162,
+ 16419,
+ 113,
+ 20770,
+ 10451,
+ 16995,
+ 17187,
+ 10675,
+ 10707,
+ 116,
+ 7434,
+ 25953,
+ 10963,
+ 118,
+ 18211,
+ 22434,
+ 18403,
+ 7754,
+ 11443,
+ 7786,
+ 7802,
+ 7818,
+ 15730,
+ 11667,
+ 15794,
+ 11763,
+ 7962,
+ 7978,
+ 7994,
+ 11923,
+ 16082,
+ 126,
+ 12083,
+ 8106,
+ 8138,
+ 20323,
+ 12243,
+ 2054,
+ 20707,
+ 16868,
+ 21027,
+ 133,
+ 8532,
+ 134,
+ 8596,
+ 12883,
+ 8820,
+ 25954,
+ 8980,
+ 4539,
+ 143,
+ 18404,
+ 145,
+ 18596,
+ 22883,
+ 22947,
+ 2366,
+ 2406,
+ 13939,
+ 9876,
+ 4971,
+ 9972,
+ 2542,
+ 20388,
+ 10228,
+ 10324,
+ 5179,
+ 5195,
+ 14515,
+ 10452,
+ 16869,
+ 5275,
+ 2662,
+ 10676,
+ 10708,
+ 5403,
+ 21668,
+ 10964,
+ 172,
+ 18149,
+ 26403,
+ 5627,
+ 2838,
+ 11444,
+ 2878,
+ 11604,
+ 11668,
+ 184,
+ 23652,
+ 11892,
+ 19877,
+ 19941,
+ 12052,
+ 12084,
+ 20389,
+ 3070,
+ 24612,
+ 8245,
+ 8277,
+ 3110,
+ 12468,
+ 20901,
+ 25124,
+ 25316,
+ 8693,
+ 3206,
+ 17510,
+ 8789,
+ 8949,
+ 205,
+ 18086,
+ 3294,
+ 18214,
+ 22373,
+ 6635,
+ 3326,
+ 3334,
+ 22757,
+ 13524,
+ 9461,
+ 3398,
+ 13620,
+ 13748,
+ 23461,
+ 6907,
+ 23653,
+ 9813,
+ 3494,
+ 3502,
+ 19942,
+ 10005,
+ 20326,
+ 14292,
+ 3606,
+ 20902,
+ 25125,
+ 7355,
+ 10677,
+ 10709,
+ 3718,
+ 14900,
+ 10837,
+ 10869,
+ 3750,
+ 10933,
+ 10965,
+ 26085,
+ 15124,
+ 7643,
+ 18407,
+ 22566,
+ 3854,
+ 3862,
+ 7739,
+ 7755,
+ 7771,
+ 15668,
+ 11605,
+ 7867,
+ 7931,
+ 11829,
+ 16084,
+ 19943,
+ 12053,
+ 12085,
+ 4054,
+ 4062,
+ 8139,
+ 20327,
+ 16340,
+ 4094,
+ 8246,
+ 16552,
+ 8342,
+ 16744,
+ 8406,
+ 25126,
+ 21159,
+ 8598,
+ 271,
+ 8694,
+ 8758,
+ 25958,
+ 8950,
+ 18088,
+ 13237,
+ 18408,
+ 22567,
+ 22695,
+ 22759,
+ 13653,
+ 9654,
+ 9750,
+ 9814,
+ 13941,
+ 19816,
+ 9942,
+ 9974,
+ 20008,
+ 24359,
+ 10166,
+ 14293,
+ 10326,
+ 5180,
+ 5196,
+ 16745,
+ 20904,
+ 25127,
+ 5276,
+ 331,
+ 332,
+ 10678,
+ 10710,
+ 21544,
+ 339,
+ 21736,
+ 10934,
+ 5484,
+ 26087,
+ 15125,
+ 18089,
+ 348,
+ 18217,
+ 18409,
+ 5676,
+ 15797,
+ 5884,
+ 23592,
+ 16053,
+ 20009,
+ 12086,
+ 6060,
+ 20201,
+ 20329,
+ 20393,
+ 24680,
+ 16554,
+ 20777,
+ 16746,
+ 6252,
+ 25128,
+ 21097,
+ 21161,
+ 17194,
+ 6412,
+ 25704,
+ 403,
+ 25960,
+ 8951,
+ 22313,
+ 9143,
+ 18410,
+ 22761,
+ 421,
+ 6780,
+ 13622,
+ 9591,
+ 19434,
+ 13846,
+ 13878,
+ 9879,
+ 10007,
+ 7068,
+ 7084,
+ 7132,
+ 20394,
+ 14326,
+ 20714,
+ 10391,
+ 455,
+ 29160,
+ 457,
+ 458,
+ 459,
+ 17195,
+ 10679,
+ 10711,
+ 7420,
+ 7484,
+ 17707,
+ 470,
+ 471,
+ 472,
+ 474,
+ 15254,
+ 18411,
+ 11479,
+ 27241,
+ 491,
+ 15734,
+ 11671,
+ 19435,
+ 7948,
+ 11895,
+ 19755,
+ 12055,
+ 12087,
+ 507,
+ 12151,
+ 509,
+ 20395,
+ 12279,
+ 2055,
+ 4141,
+ 12471,
+ 8408,
+ 4221,
+ 25130,
+ 21099,
+ 536,
+ 8600,
+ 25514,
+ 8760,
+ 17708,
+ 556,
+ 21931,
+ 26218,
+ 18412,
+ 578,
+ 18540,
+ 13399,
+ 13463,
+ 18796,
+ 13527,
+ 23083,
+ 596,
+ 598,
+ 13687,
+ 23339,
+ 606,
+ 13815,
+ 13943,
+ 9912,
+ 14103,
+ 2543,
+ 20396,
+ 14327,
+ 16429,
+ 2575,
+ 10328,
+ 20716,
+ 10392,
+ 5213,
+ 2663,
+ 10680,
+ 10712,
+ 17453,
+ 10840,
+ 17709,
+ 25963,
+ 686,
+ 15095,
+ 690,
+ 692,
+ 698,
+ 700,
+ 18413,
+ 2823,
+ 18541,
+ 710,
+ 712,
+ 11416,
+ 11480,
+ 18989,
+ 724,
+ 11672,
+ 15799,
+ 15863,
+ 2951,
+ 19821,
+ 3007,
+ 12056,
+ 12088,
+ 16247,
+ 12248,
+ 12280,
+ 3079,
+ 3087,
+ 3095,
+ 20717,
+ 25004,
+ 29163,
+ 3143,
+ 3207,
+ 8793,
+ 6461,
+ 25964,
+ 3263,
+ 818,
+ 9081,
+ 6637,
+ 6653,
+ 3335,
+ 6717,
+ 13464,
+ 13528,
+ 18990,
+ 9657,
+ 6909,
+ 6925,
+ 19566,
+ 6957,
+ 3495,
+ 14008,
+ 3511,
+ 10009,
+ 20078,
+ 7101,
+ 20270,
+ 3567,
+ 20398,
+ 3583,
+ 3607,
+ 7277,
+ 3655,
+ 10681,
+ 10713,
+ 7421,
+ 930,
+ 932,
+ 10841,
+ 10873,
+ 25965,
+ 10969,
+ 15128,
+ 18159,
+ 7629,
+ 7645,
+ 18351,
+ 18415,
+ 3847,
+ 3855,
+ 3863,
+ 968,
+ 11417,
+ 7821,
+ 7853,
+ 984,
+ 7901,
+ 990,
+ 7949,
+ 996,
+ 1002,
+ 16056,
+ 19887,
+ 20015,
+ 12089,
+ 4055,
+ 28461,
+ 20399,
+ 8282,
+ 24942,
+ 12505,
+ 12537,
+ 29229,
+ 1064,
+ 25262,
+ 4286,
+ 1084,
+ 1088,
+ 12825,
+ 8762,
+ 8858,
+ 1112,
+ 21935,
+ 1124,
+ 22127,
+ 4526,
+ 18416,
+ 13529,
+ 18992,
+ 13657,
+ 13689,
+ 9658,
+ 13817,
+ 23663,
+ 9818,
+ 13945,
+ 4974,
+ 20016,
+ 28270,
+ 24239,
+ 10138,
+ 28526,
+ 20400,
+ 16497,
+ 16561,
+ 20720,
+ 20848,
+ 5262,
+ 17009,
+ 25263,
+ 17137,
+ 10682,
+ 10714,
+ 17393,
+ 10842,
+ 10874,
+ 25967,
+ 18417,
+ 18609,
+ 11418,
+ 23088,
+ 1452,
+ 11642,
+ 15801,
+ 27567,
+ 15865,
+ 11802,
+ 23664,
+ 11962,
+ 19889,
+ 20017,
+ 12090,
+ 16249,
+ 28463,
+ 20401,
+ 1536,
+ 1540,
+ 16498,
+ 8283,
+ 6222,
+ 20849,
+ 6254,
+ 6270,
+ 17138,
+ 6350,
+ 6366,
+ 21425,
+ 6414,
+ 12890,
+ 25968,
+ 6510,
+ 8955,
+ 6638,
+ 18418,
+ 22705,
+ 13530,
+ 23089,
+ 6814,
+ 6894,
+ 27632,
+ 13882,
+ 19890,
+ 9979,
+ 10011,
+ 28272,
+ 10139,
+ 20402,
+ 1804,
+ 10395,
+ 25073,
+ 17203,
+ 10683,
+ 10715,
+ 17459,
+ 7454,
+ 10875,
+ 25969,
+ 17843,
+ 26097,
+ 11067,
+ 11131,
+ 7630,
+ 1916,
+ 18419,
+ 11355,
+ 11419,
+ 27057,
+ 23090,
+ 11643,
+ 15802,
+ 7918,
+ 7934,
+ 23666,
+ 11899,
+ 16058,
+ 12059,
+ 12091,
+ 24242,
+ 16250,
+ 8142,
+ 20403,
+ 28785,
+ 16564,
+ 8348,
+ 8444,
+ 2120,
+ 21171,
+ 12667,
+ 8604,
+ 17460,
+ 8764,
+ 30001,
+ 25970,
+ 26098,
+ 8988,
+ 18420,
+ 22643,
+ 27058,
+ 2368,
+ 23091,
+ 9532,
+ 13659,
+ 13819,
+ 23667,
+ 13915,
+ 9852,
+ 9916,
+ 9980,
+ 20020,
+ 10140,
+ 2544,
+ 20404,
+ 2576,
+ 16565,
+ 16629,
+ 10396,
+ 24947,
+ 20916,
+ 17141,
+ 2664,
+ 10684,
+ 10716,
+ 17461,
+ 10844,
+ 10876,
+ 25971,
+ 15067,
+ 5567,
+ 26419,
+ 18421,
+ 2824,
+ 11356,
+ 11420,
+ 27059,
+ 15611,
+ 11548,
+ 23220,
+ 2912,
+ 11836,
+ 19701,
+ 23860,
+ 16059,
+ 12060,
+ 12092,
+ 6063,
+ 6127,
+ 3072,
+ 3080,
+ 3088,
+ 3096,
+ 6223,
+ 3120,
+ 6255,
+ 8445,
+ 17142,
+ 6351,
+ 6415,
+ 8797,
+ 6463,
+ 25972,
+ 3256,
+ 3264,
+ 9053,
+ 3296,
+ 3320,
+ 3328,
+ 6671,
+ 22709,
+ 3368,
+ 3376,
+ 3400,
+ 3408,
+ 23221,
+ 13692,
+ 27572,
+ 3472,
+ 9853,
+ 3496,
+ 3504,
+ 28148,
+ 10013,
+ 3552,
+ 10205,
+ 3584,
+ 20790,
+ 7279,
+ 7295,
+ 7359,
+ 3696,
+ 10717,
+ 7439,
+ 3728,
+ 7487,
+ 25973,
+ 15228,
+ 15292,
+ 3840,
+ 3848,
+ 3856,
+ 3864,
+ 3872,
+ 22902,
+ 7791,
+ 15612,
+ 23094,
+ 7855,
+ 7919,
+ 7935,
+ 7951,
+ 7967,
+ 27829,
+ 23862,
+ 16060,
+ 24054,
+ 20023,
+ 12093,
+ 4064,
+ 24374,
+ 20407,
+ 20535,
+ 8286,
+ 20791,
+ 12509,
+ 8446,
+ 21047,
+ 21175,
+ 8606,
+ 4320,
+ 17464,
+ 8766,
+ 25974,
+ 26102,
+ 30732,
+ 30156,
+ 30096,
+ 30091,
+ 18424,
+ 9472,
+ 30047,
+ 16742,
+ 29334,
+ 29333,
+ 13501,
+ 5272,
+ 28995,
+ 18153,
+ 28739,
+ 13661,
+ 13693,
+ 7489,
+ 8467,
+ 28505,
+ 28487,
+ 9758,
+ 28482,
+ 13917,
+ 23799,
+ 6297,
+ 4960,
+ 9950,
+ 3693,
+ 14109,
+ 20698,
+ 28462,
+ 461,
+ 28328,
+ 28305,
+ 10206,
+ 28304,
+ 20536,
+ 6651,
+ 28286,
+ 16633,
+ 20792,
+ 28271,
+ 28243,
+ 25079,
+ 5264,
+ 5280,
+ 28210,
+ 10622,
+ 28209,
+ 10686,
+ 10718,
+ 28208,
+ 17465,
+ 28207,
+ 28205,
+ 28146,
+ 28133,
+ 15037,
+ 28089,
+ 5504,
+ 1096,
+ 27891,
+ 18105,
+ 27890,
+ 15261,
+ 15293,
+ 27870,
+ 21160,
+ 22945,
+ 3243,
+ 11358,
+ 27830,
+ 27794,
+ 15549,
+ 27760,
+ 27724,
+ 27723,
+ 27721,
+ 23224,
+ 9435,
+ 27660,
+ 3503,
+ 27637,
+ 15869,
+ 27624,
+ 15933,
+ 27831,
+ 23800,
+ 19769,
+ 28023,
+ 27588,
+ 18440,
+ 12062,
+ 5186,
+ 6064,
+ 4065,
+ 27527,
+ 27106,
+ 27100,
+ 16381,
+ 27098,
+ 24696,
+ 16570,
+ 26616,
+ 20793,
+ 19851,
+ 4983,
+ 12542,
+ 16168,
+ 26437,
+ 26436,
+ 26435,
+ 8607,
+ 17274,
+ 12766,
+ 26434,
+ 6416,
+ 26433,
+ 8799,
+ 26432,
+ 26431,
+ 25976,
+ 21945,
+ 26430,
+ 26429,
+ 26407,
+ 9055,
+ 12066,
+ 23246,
+ 26298,
+ 24093,
+ 6656,
+ 26192,
+ 26103,
+ 26086,
+ 13438,
+ 3108,
+ 26055,
+ 16724,
+ 20035,
+ 26010,
+ 23161,
+ 23225,
+ 25985,
+ 691,
+ 25983,
+ 6896,
+ 13822,
+ 20819,
+ 25981,
+ 27832,
+ 23801,
+ 25979,
+ 24139,
+ 25183,
+ 9983,
+ 10015,
+ 25966,
+ 25962,
+ 25961,
+ 7120,
+ 25959,
+ 10207,
+ 25849,
+ 25841,
+ 25839,
+ 25808,
+ 25804,
+ 20794,
+ 25722,
+ 25664,
+ 25081,
+ 20821,
+ 7328,
+ 23316,
+ 10623,
+ 25424,
+ 10687,
+ 10719,
+ 16006,
+ 25347,
+ 25314,
+ 25306,
+ 7488,
+ 10911,
+ 25977,
+ 25181,
+ 25180,
+ 25178,
+ 25177,
+ 25162,
+ 15230,
+ 15262,
+ 15294,
+ 18363,
+ 25146,
+ 25129,
+ 20829,
+ 7728,
+ 22336,
+ 23085,
+ 7776,
+ 23391,
+ 25082,
+ 23098,
+ 25080,
+ 25078,
+ 25074,
+ 25072,
+ 25054,
+ 25052,
+ 27641,
+ 7952,
+ 11839,
+ 25030,
+ 8000,
+ 8016,
+ 25018,
+ 16094,
+ 24997,
+ 12063,
+ 24995,
+ 16969,
+ 24314,
+ 24914,
+ 24912,
+ 24903,
+ 24902,
+ 24901,
+ 8256,
+ 24801,
+ 24706,
+ 8352,
+ 24668,
+ 4209,
+ 12543,
+ 2121,
+ 16652,
+ 24418,
+ 24358,
+ 24334,
+ 23102,
+ 24209,
+ 24189,
+ 8736,
+ 8768,
+ 8800,
+ 24173,
+ 24140,
+ 25978,
+ 24138,
+ 10329,
+ 24136,
+ 26234,
+ 18108,
+ 24092,
+ 24011,
+ 7395,
+ 23954,
+ 5274,
+ 23804,
+ 13375,
+ 23803,
+ 13439,
+ 23802,
+ 13503,
+ 23787,
+ 2369,
+ 23665,
+ 13631,
+ 2393,
+ 13695,
+ 23662,
+ 23650,
+ 23637,
+ 19452,
+ 23636,
+ 13887,
+ 23633,
+ 9856,
+ 9888,
+ 9920,
+ 9952,
+ 23629,
+ 20028,
+ 23531,
+ 23530,
+ 6413,
+ 10144,
+ 2545,
+ 3336,
+ 10771,
+ 5137,
+ 2577,
+ 5169,
+ 5185,
+ 2601,
+ 3570,
+ 8153,
+ 25083,
+ 5265,
+ 2641,
+ 23381,
+ 23338,
+ 2665,
+ 2673,
+ 10720,
+ 17405,
+ 25659,
+ 23315,
+ 23314,
+ 10880,
+ 10912,
+ 2737,
+ 23309,
+ 5505,
+ 23252,
+ 23251,
+ 26299,
+ 23243,
+ 15263,
+ 15295,
+ 23241,
+ 15119,
+ 23239,
+ 23238,
+ 2841,
+ 15451,
+ 23228,
+ 23227,
+ 23223,
+ 5761,
+ 15647,
+ 19069,
+ 5809,
+ 15743,
+ 23222,
+ 23219,
+ 23214,
+ 23206,
+ 23189,
+ 15935,
+ 19645,
+ 15999,
+ 16031,
+ 23130,
+ 19862,
+ 20773,
+ 20029,
+ 12096,
+ 24252,
+ 23093,
+ 23092,
+ 23087,
+ 6129,
+ 3073,
+ 3081,
+ 23086,
+ 3097,
+ 3105,
+ 20797,
+ 3121,
+ 6257,
+ 25084,
+ 23084,
+ 6305,
+ 17086,
+ 23030,
+ 6353,
+ 23013,
+ 23012,
+ 22990,
+ 6417,
+ 22989,
+ 22949,
+ 3233,
+ 22946,
+ 25980,
+ 22909,
+ 22876,
+ 22869,
+ 22868,
+ 22866,
+ 3297,
+ 18238,
+ 22796,
+ 3321,
+ 22790,
+ 3337,
+ 18166,
+ 22717,
+ 13440,
+ 22750,
+ 6753,
+ 13536,
+ 9473,
+ 22724,
+ 9744,
+ 23229,
+ 3513,
+ 20405,
+ 7448,
+ 6897,
+ 22718,
+ 22710,
+ 22686,
+ 22678,
+ 13952,
+ 9889,
+ 3505,
+ 19902,
+ 9985,
+ 7057,
+ 3537,
+ 22665,
+ 22662,
+ 7121,
+ 22661,
+ 22651,
+ 22539,
+ 22478,
+ 22458,
+ 22425,
+ 16639,
+ 22421,
+ 22414,
+ 22357,
+ 25085,
+ 3657,
+ 22334,
+ 22275,
+ 22167,
+ 13900,
+ 3697,
+ 10721,
+ 22048,
+ 21971,
+ 7457,
+ 10849,
+ 10881,
+ 17727,
+ 15040,
+ 8791,
+ 17919,
+ 16080,
+ 3695,
+ 18111,
+ 15232,
+ 18239,
+ 15296,
+ 21807,
+ 18431,
+ 3849,
+ 3857,
+ 7729,
+ 7745,
+ 7761,
+ 21667,
+ 7793,
+ 21565,
+ 15648,
+ 21559,
+ 7857,
+ 21549,
+ 21402,
+ 21369,
+ 19391,
+ 21367,
+ 5514,
+ 21162,
+ 27837,
+ 21096,
+ 19775,
+ 21073,
+ 12001,
+ 21072,
+ 20031,
+ 21071,
+ 21068,
+ 8129,
+ 21066,
+ 19774,
+ 21048,
+ 20903,
+ 20543,
+ 4130,
+ 20900,
+ 16640,
+ 20890,
+ 10696,
+ 16083,
+ 25086,
+ 16960,
+ 20827,
+ 20826,
+ 20825,
+ 20824,
+ 12737,
+ 8674,
+ 20823,
+ 25662,
+ 8770,
+ 8802,
+ 20820,
+ 17728,
+ 25982,
+ 20817,
+ 17920,
+ 8994,
+ 20815,
+ 18112,
+ 20813,
+ 18240,
+ 15859,
+ 5188,
+ 17509,
+ 3210,
+ 18560,
+ 22719,
+ 6576,
+ 3694,
+ 20787,
+ 20776,
+ 9474,
+ 23103,
+ 20772,
+ 20765,
+ 20762,
+ 20757,
+ 20756,
+ 20755,
+ 20752,
+ 13857,
+ 20748,
+ 20747,
+ 9858,
+ 20742,
+ 4962,
+ 9954,
+ 9986,
+ 20032,
+ 5026,
+ 20739,
+ 20733,
+ 28478,
+ 20696,
+ 5106,
+ 20695,
+ 20692,
+ 20685,
+ 16965,
+ 16641,
+ 20800,
+ 20669,
+ 10466,
+ 20665,
+ 5266,
+ 20657,
+ 20656,
+ 20629,
+ 20626,
+ 20012,
+ 20609,
+ 20604,
+ 17473,
+ 20565,
+ 10850,
+ 2672,
+ 20432,
+ 10946,
+ 20430,
+ 17921,
+ 20429,
+ 1385,
+ 20428,
+ 20426,
+ 15265,
+ 11202,
+ 18617,
+ 20408,
+ 20406,
+ 5666,
+ 22720,
+ 20397,
+ 20392,
+ 20391,
+ 15585,
+ 20390,
+ 20387,
+ 20383,
+ 1453,
+ 3065,
+ 3069,
+ 5669,
+ 8366,
+ 3133,
+ 18439,
+ 6296,
+ 11986,
+ 14106,
+ 16033,
+ 17140,
+ 6352,
+ 15267,
+ 20033,
+ 1513,
+ 10685,
+ 20324,
+ 8782,
+ 19859,
+ 12258,
+ 24576,
+ 16450,
+ 8259,
+ 20316,
+ 16642,
+ 20801,
+ 6632,
+ 11341,
+ 6274,
+ 8483,
+ 6306,
+ 11357,
+ 16597,
+ 3361,
+ 13321,
+ 3377,
+ 20296,
+ 6418,
+ 17196,
+ 3397,
+ 13628,
+ 20051,
+ 25984,
+ 26048,
+ 17922,
+ 20014,
+ 15979,
+ 13948,
+ 3497,
+ 18242,
+ 6626,
+ 4961,
+ 18434,
+ 11981,
+ 6690,
+ 22721,
+ 13442,
+ 12061,
+ 18818,
+ 13538,
+ 12077,
+ 20030,
+ 20026,
+ 20025,
+ 13698,
+ 3565,
+ 20024,
+ 13794,
+ 19750,
+ 13858,
+ 13890,
+ 10254,
+ 16502,
+ 16662,
+ 3658,
+ 8367,
+ 9987,
+ 20034,
+ 14146,
+ 28352,
+ 7106,
+ 28480,
+ 10179,
+ 20006,
+ 7408,
+ 20013,
+ 20610,
+ 17462,
+ 16643,
+ 20802,
+ 10435,
+ 10467,
+ 3729,
+ 3733,
+ 468,
+ 20011,
+ 20010,
+ 3506,
+ 1849,
+ 19982,
+ 7426,
+ 10787,
+ 14914,
+ 17229,
+ 7648,
+ 10915,
+ 10947,
+ 21954,
+ 17923,
+ 8368,
+ 19970,
+ 3841,
+ 15234,
+ 15266,
+ 19968,
+ 3869,
+ 18435,
+ 3873,
+ 14807,
+ 22722,
+ 9487,
+ 19940,
+ 19939,
+ 15586,
+ 7992,
+ 23106,
+ 19874,
+ 8040,
+ 19873,
+ 8088,
+ 19866,
+ 27585,
+ 18327,
+ 15906,
+ 512,
+ 15970,
+ 18163,
+ 2005,
+ 19861,
+ 16098,
+ 19971,
+ 12067,
+ 15253,
+ 19848,
+ 14621,
+ 28481,
+ 17273,
+ 12259,
+ 2050,
+ 18438,
+ 4131,
+ 8292,
+ 12419,
+ 8356,
+ 6620,
+ 548,
+ 8784,
+ 21059,
+ 19772,
+ 8912,
+ 12675,
+ 19668,
+ 12739,
+ 579,
+ 580,
+ 15453,
+ 8772,
+ 8804,
+ 16601,
+ 10688,
+ 30081,
+ 9488,
+ 17924,
+ 2386,
+ 9552,
+ 18960,
+ 9092,
+ 13219,
+ 17450,
+ 605,
+ 9220,
+ 18500,
+ 18564,
+ 22723,
+ 12064,
+ 17454,
+ 18991,
+ 2362,
+ 2538,
+ 2546,
+ 13635,
+ 2394,
+ 18702,
+ 9636,
+ 2738,
+ 27586,
+ 18763,
+ 2742,
+ 18809,
+ 8401,
+ 23811,
+ 18647,
+ 18241,
+ 9956,
+ 19972,
+ 20036,
+ 2670,
+ 1056,
+ 18444,
+ 10148,
+ 10180,
+ 20420,
+ 20484,
+ 28738,
+ 2578,
+ 10340,
+ 16645,
+ 2602,
+ 10436,
+ 10468,
+ 688,
+ 5267,
+ 5506,
+ 21188,
+ 17157,
+ 2666,
+ 2674,
+ 695,
+ 7633,
+ 5395,
+ 701,
+ 17501,
+ 705,
+ 10916,
+ 15043,
+ 7769,
+ 18455,
+ 7865,
+ 18454,
+ 18452,
+ 18450,
+ 18245,
+ 7929,
+ 18447,
+ 18437,
+ 18446,
+ 9857,
+ 18629,
+ 5699,
+ 9921,
+ 3018,
+ 15587,
+ 5763,
+ 8089,
+ 7788,
+ 8137,
+ 10145,
+ 15779,
+ 23428,
+ 27587,
+ 3066,
+ 3074,
+ 16412,
+ 14847,
+ 3086,
+ 3094,
+ 19845,
+ 16099,
+ 19973,
+ 12068,
+ 18436,
+ 10945,
+ 18423,
+ 18422,
+ 8010,
+ 12260,
+ 16390,
+ 3082,
+ 3090,
+ 8293,
+ 16646,
+ 20805,
+ 29059,
+ 5208,
+ 18414,
+ 3146,
+ 6530,
+ 3278,
+ 17158,
+ 8613,
+ 12740,
+ 8677,
+ 18405,
+ 6419,
+ 6650,
+ 3330,
+ 877,
+ 14053,
+ 8901,
+ 13028,
+ 849,
+ 8090,
+ 18244,
+ 18243,
+ 6898,
+ 18246,
+ 6627,
+ 15855,
+ 9221,
+ 18502,
+ 13380,
+ 18630,
+ 22789,
+ 3370,
+ 6755,
+ 4979,
+ 12065,
+ 885,
+ 3562,
+ 9573,
+ 13700,
+ 3566,
+ 23429,
+ 6899,
+ 20380,
+ 13860,
+ 7322,
+ 8211,
+ 5187,
+ 3498,
+ 19846,
+ 9957,
+ 19974,
+ 5219,
+ 10053,
+ 8435,
+ 3722,
+ 10149,
+ 10181,
+ 28612,
+ 3586,
+ 28740,
+ 1050,
+ 20678,
+ 16647,
+ 20806,
+ 14532,
+ 928,
+ 3650,
+ 16967,
+ 15264,
+ 2539,
+ 1042,
+ 3690,
+ 17287,
+ 3866,
+ 3870,
+ 10789,
+ 3561,
+ 7794,
+ 3064,
+ 10917,
+ 982,
+ 17639,
+ 9795,
+ 597,
+ 1004,
+ 9939,
+ 26373,
+ 18247,
+ 12098,
+ 4066,
+ 3842,
+ 3850,
+ 3858,
+ 11365,
+ 11397,
+ 17463,
+ 7779,
+ 7795,
+ 17458,
+ 7827,
+ 17456,
+ 7859,
+ 17455,
+ 15780,
+ 23430,
+ 27589,
+ 19463,
+ 6499,
+ 19903,
+ 15972,
+ 17290,
+ 15575,
+ 19847,
+ 24006,
+ 19975,
+ 12069,
+ 28293,
+ 17204,
+ 8131,
+ 20295,
+ 13378,
+ 17181,
+ 12824,
+ 16997,
+ 4132,
+ 20297,
+ 4164,
+ 20807,
+ 24966,
+ 8422,
+ 12549,
+ 3515,
+ 19886,
+ 2671,
+ 2675,
+ 7443,
+ 7451,
+ 16788,
+ 7483,
+ 16783,
+ 8774,
+ 8806,
+ 1366,
+ 30021,
+ 16726,
+ 26054,
+ 17928,
+ 7418,
+ 16654,
+ 16653,
+ 1464,
+ 26438,
+ 16648,
+ 18376,
+ 9222,
+ 16644,
+ 11988,
+ 3015,
+ 16599,
+ 10165,
+ 16598,
+ 1538,
+ 13626,
+ 12826,
+ 13637,
+ 9574,
+ 16533,
+ 3211,
+ 23431,
+ 27590,
+ 9734,
+ 6500,
+ 13140,
+ 3295,
+ 13220,
+ 19784,
+ 9926,
+ 4980,
+ 3319,
+ 16055,
+ 10054,
+ 3359,
+ 3363,
+ 10150,
+ 3371,
+ 16741,
+ 3611,
+ 1698,
+ 3399,
+ 20680,
+ 16649,
+ 20808,
+ 20872,
+ 25031,
+ 5252,
+ 5268,
+ 7124,
+ 3071,
+ 25351,
+ 8407,
+ 7437,
+ 1980,
+ 3651,
+ 17481,
+ 5269,
+ 10854,
+ 15861,
+ 21832,
+ 10790,
+ 21960,
+ 16396,
+ 22088,
+ 8778,
+ 3815,
+ 18406,
+ 26439,
+ 3871,
+ 7748,
+ 18441,
+ 15596,
+ 5668,
+ 11366,
+ 15493,
+ 15495,
+ 2008,
+ 6741,
+ 8092,
+ 15653,
+ 10151,
+ 23240,
+ 15050,
+ 15781,
+ 23432,
+ 14887,
+ 14871,
+ 14810,
+ 6501,
+ 15973,
+ 14809,
+ 14200,
+ 19849,
+ 16101,
+ 13947,
+ 12070,
+ 13912,
+ 2392,
+ 7054,
+ 12198,
+ 13898,
+ 2480,
+ 13663,
+ 7213,
+ 13655,
+ 6196,
+ 16650,
+ 7389,
+ 20873,
+ 8423,
+ 9918,
+ 16970,
+ 18442,
+ 2840,
+ 17162,
+ 12524,
+ 12742,
+ 8679,
+ 12421,
+ 9945,
+ 3016,
+ 12199,
+ 9820,
+ 17738,
+ 8903,
+ 26056,
+ 3116,
+ 8394,
+ 12080,
+ 3204,
+ 9095,
+ 26440,
+ 8986,
+ 12058,
+ 9223,
+ 12048,
+ 6692,
+ 11963,
+ 6766,
+ 3396,
+ 6918,
+ 3488,
+ 3500,
+ 3508,
+ 11993,
+ 9575,
+ 13702,
+ 7078,
+ 7222,
+ 8331,
+ 6654,
+ 27720,
+ 10960,
+ 8795,
+ 8939,
+ 10788,
+ 7766,
+ 9959,
+ 15800,
+ 24137,
+ 7076,
+ 10216,
+ 6639,
+ 20298,
+ 2637,
+ 15066,
+}
diff --git a/ShestakUI/Libs/oUF/Elements/CastBar.lua b/ShestakUI/Libs/oUF/Elements/CastBar.lua
index 1532389be..cd6438ea9 100644
--- a/ShestakUI/Libs/oUF/Elements/CastBar.lua
+++ b/ShestakUI/Libs/oUF/Elements/CastBar.lua
@@ -7,6 +7,16 @@ local FAILED = _G.FAILED or 'Failed'
local INTERRUPTED = _G.INTERRUPTED or 'Interrupted'
local CASTBAR_STAGE_DURATION_INVALID = -1 -- defined in FrameXML/CastingBarFrame.lua
+local UnitChannelInfo = UnitChannelInfo
+local EventFunctions = {}
+
+local LibClassicCasterino = (oUF:IsVanilla() and LibStub('LibClassicCasterino-ShestakUI', true))
+if(LibClassicCasterino) then
+ UnitChannelInfo = function(unit)
+ return LibClassicCasterino:UnitChannelInfo(unit)
+ end
+end
+
-- Tradeskill block
local tradeskillCurrent, tradeskillTotal, mergeTradeskill = 0, 0, false
-- end block
@@ -192,6 +202,10 @@ local function CastStart(self, event, unit)
rank = rank and strmatch(rank, "%d+")
end
+ if(not text or text == '' or text == CHANNELING) then
+ text = name
+ end
+
element.casting = event == 'UNIT_SPELLCAST_START'
element.channeling = event == 'UNIT_SPELLCAST_CHANNEL_START'
element.empowering = event == 'UNIT_SPELLCAST_EMPOWER_START'
@@ -548,13 +562,23 @@ local function Enable(self, unit)
element.ForceUpdate = ForceUpdate
self:RegisterEvent('UNIT_SPELLCAST_START', CastStart)
- self:RegisterEvent('UNIT_SPELLCAST_CHANNEL_START', CastStart)
self:RegisterEvent('UNIT_SPELLCAST_STOP', CastStop)
- self:RegisterEvent('UNIT_SPELLCAST_CHANNEL_STOP', CastStop)
self:RegisterEvent('UNIT_SPELLCAST_DELAYED', CastUpdate)
- self:RegisterEvent('UNIT_SPELLCAST_CHANNEL_UPDATE', CastUpdate)
self:RegisterEvent('UNIT_SPELLCAST_FAILED', CastFail)
self:RegisterEvent('UNIT_SPELLCAST_INTERRUPTED', CastFail)
+ self:RegisterEvent('UNIT_SPELLCAST_CHANNEL_UPDATE', CastUpdate)
+
+ if(not oUF:IsVanilla() or self.unit == 'player') then
+ self:RegisterEvent('UNIT_SPELLCAST_CHANNEL_START', CastStart)
+ self:RegisterEvent('UNIT_SPELLCAST_CHANNEL_STOP', CastStop)
+ elseif(LibClassicCasterino) then
+ local CastbarEventHandler = function(event, ...)
+ return EventFunctions[event](self, event, ...)
+ end
+ LibClassicCasterino.RegisterCallback(self, 'UNIT_SPELLCAST_CHANNEL_START', CastbarEventHandler)
+ LibClassicCasterino.RegisterCallback(self, 'UNIT_SPELLCAST_CHANNEL_STOP', CastbarEventHandler)
+ end
+
if(oUF:IsMainline()) then
self:RegisterEvent('UNIT_SPELLCAST_EMPOWER_START', CastStart)
self:RegisterEvent('UNIT_SPELLCAST_EMPOWER_STOP', CastStop)
@@ -624,6 +648,11 @@ local function Disable(self)
self:UnregisterEvent('UNIT_SPELLCAST_INTERRUPTIBLE', CastInterruptible)
self:UnregisterEvent('UNIT_SPELLCAST_NOT_INTERRUPTIBLE', CastInterruptible)
+ if(LibClassicCasterino) then
+ LibClassicCasterino.UnregisterCallback(self, 'UNIT_SPELLCAST_CHANNEL_START')
+ LibClassicCasterino.UnregisterCallback(self, 'UNIT_SPELLCAST_CHANNEL_STOP')
+ end
+
element:SetScript('OnUpdate', nil)
if(self.unit == 'player' and not (self.hasChildren or self.isChild or self.isNamePlate)) then
@@ -638,6 +667,11 @@ local function Disable(self)
end
end
+if(LibClassicCasterino) then
+ EventFunctions['UNIT_SPELLCAST_CHANNEL_START'] = CastStart
+ EventFunctions['UNIT_SPELLCAST_CHANNEL_STOP'] = CastStop
+end
+
-- Tradeskill block
if(oUF:IsClassic()) then
hooksecurefunc('DoTradeSkill', function(_, num)
diff --git a/ShestakUI/ShestakUI.toc b/ShestakUI/ShestakUI.toc
index 782093bd7..28b8c02bd 100644
--- a/ShestakUI/ShestakUI.toc
+++ b/ShestakUI/ShestakUI.toc
@@ -18,7 +18,7 @@
## X-oUF: oUFShestakUI
## X-Website: https://github.com/EsreverWoW/ShestakUI_Classic
-## X-Credits: AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
+## X-Credits: AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, d87, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
## X-Translation: Aelb, AlbertDuval, Alwa, Baine, Chubidu, Cranan, eXecrate, F5Hellbound, Ianchan, Joe, Leg883, Mania, Nanjiqq, Oz, Puree, Sakaras, Seal, Sinaris, Skyzo-be, Spacedragon, Tat2dawn, Tibles, Vienchen, Wetxius
## X-Thanks: Akimba, Antthemage, Crunching, Dandruff, DesFolk, Elfrey, Ente, Erratic, Falchior, Gromcha, Halogen, Homicidal Retribution, ILF7, Illusion, Ipton, k07n, Kazarl, Lanseb, Leots, m2jest1c, MoLLIa, Nefrit, Noobolov, Obakol, Oz, PterOs, Sart, Scorpions, Sitatunga, Sw2rT1, Tryllemann, Wetxius, Yakodzuna, UI Users and Russian Community
diff --git a/ShestakUI/ShestakUI_Mainline.toc b/ShestakUI/ShestakUI_Mainline.toc
index f998eadaa..c675054aa 100755
--- a/ShestakUI/ShestakUI_Mainline.toc
+++ b/ShestakUI/ShestakUI_Mainline.toc
@@ -14,7 +14,7 @@
## X-oUF: oUFShestakUI
## X-Website: https://github.com/EsreverWoW/ShestakUI_Classic
-## X-Credits: AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
+## X-Credits: AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, d87, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
## X-Translation: Aelb, AlbertDuval, Alwa, Baine, Chubidu, Cranan, eXecrate, F5Hellbound, Ianchan, Joe, Leg883, Mania, Nanjiqq, Oz, Puree, Sakaras, Seal, Sinaris, Skyzo-be, Spacedragon, Tat2dawn, Tibles, Vienchen, Wetxius
## X-Thanks: Akimba, Antthemage, Crunching, Dandruff, DesFolk, Elfrey, Ente, Erratic, Falchior, Gromcha, Halogen, Homicidal Retribution, ILF7, Illusion, Ipton, k07n, Kazarl, Lanseb, Leots, m2jest1c, MoLLIa, Nefrit, Noobolov, Obakol, Oz, PterOs, Sart, Scorpions, Sitatunga, Sw2rT1, Tryllemann, Wetxius, Yakodzuna, UI Users and Russian Community
diff --git a/ShestakUI/ShestakUI_TBC.toc b/ShestakUI/ShestakUI_TBC.toc
index 17de49a4b..2eb3c55c5 100755
--- a/ShestakUI/ShestakUI_TBC.toc
+++ b/ShestakUI/ShestakUI_TBC.toc
@@ -14,7 +14,7 @@
## X-oUF: oUFShestakUI
## X-Website: https://github.com/EsreverWoW/ShestakUI_Classic
-## X-Credits: AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
+## X-Credits: AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, d87, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
## X-Translation: Aelb, AlbertDuval, Alwa, Baine, Chubidu, Cranan, eXecrate, F5Hellbound, Ianchan, Joe, Leg883, Mania, Nanjiqq, Oz, Puree, Sakaras, Seal, Sinaris, Skyzo-be, Spacedragon, Tat2dawn, Tibles, Vienchen, Wetxius
## X-Thanks: Akimba, Antthemage, Crunching, Dandruff, DesFolk, Elfrey, Ente, Erratic, Falchior, Gromcha, Halogen, Homicidal Retribution, ILF7, Illusion, Ipton, k07n, Kazarl, Lanseb, Leots, m2jest1c, MoLLIa, Nefrit, Noobolov, Obakol, Oz, PterOs, Sart, Scorpions, Sitatunga, Sw2rT1, Tryllemann, Wetxius, Yakodzuna, UI Users and Russian Community
diff --git a/ShestakUI/ShestakUI_Vanilla.toc b/ShestakUI/ShestakUI_Vanilla.toc
index 4db20b92c..e110636aa 100755
--- a/ShestakUI/ShestakUI_Vanilla.toc
+++ b/ShestakUI/ShestakUI_Vanilla.toc
@@ -14,7 +14,7 @@
## X-oUF: oUFShestakUI
## X-Website: https://github.com/EsreverWoW/ShestakUI_Classic
-## X-Credits: AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
+## X-Credits: AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, d87, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
## X-Translation: Aelb, AlbertDuval, Alwa, Baine, Chubidu, Cranan, eXecrate, F5Hellbound, Ianchan, Joe, Leg883, Mania, Nanjiqq, Oz, Puree, Sakaras, Seal, Sinaris, Skyzo-be, Spacedragon, Tat2dawn, Tibles, Vienchen, Wetxius
## X-Thanks: Akimba, Antthemage, Crunching, Dandruff, DesFolk, Elfrey, Ente, Erratic, Falchior, Gromcha, Halogen, Homicidal Retribution, ILF7, Illusion, Ipton, k07n, Kazarl, Lanseb, Leots, m2jest1c, MoLLIa, Nefrit, Noobolov, Obakol, Oz, PterOs, Sart, Scorpions, Sitatunga, Sw2rT1, Tryllemann, Wetxius, Yakodzuna, UI Users and Russian Community
diff --git a/ShestakUI/ShestakUI_Vanilla.xml b/ShestakUI/ShestakUI_Vanilla.xml
index c550fe86e..3d729f15f 100644
--- a/ShestakUI/ShestakUI_Vanilla.xml
+++ b/ShestakUI/ShestakUI_Vanilla.xml
@@ -21,6 +21,7 @@
+
diff --git a/ShestakUI/ShestakUI_Wrath.toc b/ShestakUI/ShestakUI_Wrath.toc
index d6588d07f..af15f4642 100644
--- a/ShestakUI/ShestakUI_Wrath.toc
+++ b/ShestakUI/ShestakUI_Wrath.toc
@@ -14,7 +14,7 @@
## X-oUF: oUFShestakUI
## X-Website: https://github.com/EsreverWoW/ShestakUI_Classic
-## X-Credits: AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
+## X-Credits: AcidWeb, Aezay, Affli, Ailae, Allez, ALZA, Ammo, Astromech, Beoko, Bitbyte, Blamdarot, Bozo, Caellian, Califpornia, Camealion, Cloudyfa, Chiril, CrusaderHeimdall, Cybey, d87, Dawn, Don Kaban, Dridzt, Duffed, Durcyn, Eclipse, Egingell, Elv22, Es (EsreverWoW), Evilpaul, Evl, Favorit, Fernir, Foof, Freebaser, g0st, Gethe, Gorlasch, Gsuz, Haleth, Haste, Hoochie, Hungtar, Hydra, HyPeRnIcS, Ildyria, iSpawnAtHome, Jaslm, Kanegasi, Karl_w_w, Karudon, Katae, Kellett, Kemayo, Ketho, Killakhan, Kraftman, Leatrix, m2jest1c, Magdain, mitch0, Monolit, MrRuben5, Nathanyel, Nefarion, Nightcracker, Nils Ruesch, p3lim, Partha, Phanx, Renstrom, RustamIrzaev, Safturento, Sanex, Sara.Festung, SDPhantom, Semlar, Sildor, Silverwind, SinaC, siweia, Slakah, Soeters, Starlon, Suicidal Katt, Syzgyn, Tekkub, Telroth, Thalyra, Thizzelle, Tia Lynn, Tohveli, Tukz, Tuller, Urtgard, Veev, Villiv, Wetxius, Woffle of Dark Iron, WoWUIDev Community, Wrug, Xuerian, Yleaf, Zork
## X-Translation: Aelb, AlbertDuval, Alwa, Baine, Chubidu, Cranan, eXecrate, F5Hellbound, Ianchan, Joe, Leg883, Mania, Nanjiqq, Oz, Puree, Sakaras, Seal, Sinaris, Skyzo-be, Spacedragon, Tat2dawn, Tibles, Vienchen, Wetxius
## X-Thanks: Akimba, Antthemage, Crunching, Dandruff, DesFolk, Elfrey, Ente, Erratic, Falchior, Gromcha, Halogen, Homicidal Retribution, ILF7, Illusion, Ipton, k07n, Kazarl, Lanseb, Leots, m2jest1c, MoLLIa, Nefrit, Noobolov, Obakol, Oz, PterOs, Sart, Scorpions, Sitatunga, Sw2rT1, Tryllemann, Wetxius, Yakodzuna, UI Users and Russian Community