You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3559 lines
56 KiB

--[================[
LibClassicCasterino
Author: d87
--]================]
local apiLevel = math.floor(select(4,GetBuildInfo())/10000)
local isClassic = apiLevel <= 2
local isVanilla = apiLevel == 1
local isBC = apiLevel == 2
local MAJOR, MINOR = "LibClassicCasterino", 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,
}