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.

15208 lines
562 KiB

local GlobalAddonName, ExRT = ...
local GetTime, IsEncounterInProgress, RAID_CLASS_COLORS, GetInstanceInfo, GetSpellCharges, SecondsToTime, IsInJailersTower = GetTime, IsEncounterInProgress, RAID_CLASS_COLORS, GetInstanceInfo, ExRT.F.GetSpellCharges or GetSpellCharges, SecondsToTime, IsInJailersTower
local string_gsub, wipe, tonumber, pairs, ipairs, string_trim, format, floor, ceil, abs, type, sort, select, Enum = string.gsub, table.wipe, tonumber, pairs, ipairs, string.trim, format, floor, ceil, abs, type, sort, select, Enum
local UnitIsDeadOrGhost, UnitIsConnected, UnitName, UnitCreatureFamily, UnitIsDead, UnitIsGhost, UnitGUID, UnitInRange, UnitPhaseReason = UnitIsDeadOrGhost, UnitIsConnected, UnitName, UnitCreatureFamily, UnitIsDead, UnitIsGhost, UnitGUID, UnitInRange, UnitPhaseReason
local RaidInCombat, ClassColorNum, GetDifficultyForCooldownReset, DelUnitNameServer, NumberInRange, FireCallback = ExRT.F.RaidInCombat, ExRT.F.classColorNum, ExRT.F.GetDifficultyForCooldownReset, ExRT.F.delUnitNameServer, ExRT.F.NumberInRange, ExRT.F.FireCallback
local GetEncounterTime, UnitCombatlogname, GetUnitInfoByUnitFlag, ScheduleTimer, CancelTimer, GetRaidDiffMaxGroup, table_wipe2, dtime, utf8sub = ExRT.F.GetEncounterTime, ExRT.F.UnitCombatlogname, ExRT.F.GetUnitInfoByUnitFlag, ExRT.F.ScheduleTimer, ExRT.F.CancelTimer, ExRT.F.GetRaidDiffMaxGroup, ExRT.F.table_wipe, ExRT.F.dtime, ExRT.F.utf8sub
local C_PvP_IsWarModeDesired = C_PvP.IsWarModeDesired
local C_UnitAuras_GetAuraDataByIndex = C_UnitAuras.GetAuraDataByIndex
local GetSpellCooldown = ExRT.F.GetSpellCooldown or GetSpellCooldown
local GetSpellInfo = ExRT.F.GetSpellInfo or GetSpellInfo
local GetSpellLink = C_Spell and C_Spell.GetSpellLink or GetSpellLink
local GetSpellTexture = C_Spell and C_Spell.GetSpellTexture or GetSpellTexture
local GetItemInfo, GetItemInfoInstant, GetItemSpell = C_Item and C_Item.GetItemInfo or GetItemInfo, C_Item and C_Item.GetItemInfoInstant or GetItemInfoInstant, C_Item and C_Item.GetItemSpell or GetItemSpell
local GetCVar = C_CVar and C_CVar.GetCVar or C_CVar
local UnitGroupRolesAssigned = UnitGroupRolesAssigned or ExRT.NULLfunc
local GetSpellLevelLearned = C_Spell and C_Spell.GetSpellLevelLearned or GetSpellLevelLearned
if ExRT.isClassic then
GetSpellLevelLearned = function () return 1 end
IsInJailersTower = function() end
end
local VMRT = nil
local module = ExRT:New("ExCD2",ExRT.L.cd2)
local ELib,L = ExRT.lib,ExRT.L
local LibDeflate = LibStub:GetLibrary("LibDeflate")
module._C = {}
module.db.spellDB = {}
module.db.Cmirror = module._C
module.db.dbCountDef = #module.db.spellDB
module.db.findspecspells = {
[30451] = 62, [5143] = 62,
[11366] = 63, [133] = 63,
[30455] = 64, [44614] = 64,
[20473] = 65, [85222] = 65,
[31935] = 66, [204019] = 66, [53595] = 66,
[85256] = 70, [184575] = 70,
[12294] = 71, [7384] = 71,
[23881] = 72, [184367] = 72,
[6572] = 73, [6343] = 73,
[202770] = 102, [102560] = 102, [194223] = 102,
[202028] = 103, [5217] = 103,
[50334] = 104,
[145205] = 105, [157982] = 105,
[50842] = 250, [206930] = 250,
[49020] = 251, [49143] = 251,
[55090] = 252, [85948] = 252,
[272790] = 253, [193455] = 253,
[19434] = 254, [56641] = 254,
[186270] = 255, [259491] = 255,
[194509] = 256, [47540] = 256,
[596] = 257, [204883] = 257,
[335467] = 258, [34914] = 258,
[1329] = 259, [32645] = 259,
[193315] = 260, [2098] = 260,
[185438] = 261, [53] = 261,
[8042] = 262, [198067] = 262,
[17364] = 263, [60103] = 263,
[61295] = 264, [73920] = 264,
[198590] = 265, [324536] = 265,
[105174] = 266, [264178] = 266,
[29722] = 267, [116858] = 267,
[121253] = 268, [124506] = 268,
[113656] = 269, [122470] = 269,
[115151] = 270, [191837] = 270,
[162243] = 577, [162794] = 577, [195072] = 577,
[209795] = 581, [228478] = 581,
}
module.db.classNames = ExRT.GDB.ClassList
module.db.specByClass = {}
for class,classData in pairs(ExRT.GDB.ClassSpecializationList) do
local newData = {0}
for i=1,#classData do
newData[#newData + 1] = classData[i]
end
module.db.specByClass[class] = newData
end
module.db.specIcons = ExRT.GDB.ClassSpecializationIcons
module.db.specInDBase = {
[253] = 5, [254] = 6, [255] = 7,
[71] = 5, [72] = 6, [73] = 7,
[65] = 5, [66] = 6, [70] = 7,
[62] = 5, [63] = 6, [64] = 7,
[256] = 5, [257] = 6, [258] = 7,
[265] = 5, [266] = 6, [267] = 7,
[250] = 5, [251] = 6, [252] = 7,
[259] = 5, [260] = 6, [261] = 7,
[102] = 5, [103] = 6, [104] = 7, [105] = 8,
[268] = 5, [269] = 6, [270] = 7,
[262] = 5, [263] = 6, [264] = 7,
[577] = 5, [581] = 6,
[1467] = 5, [1468] = 6, [1473] = 7,
[0] = 4,
}
if ExRT.isCata then
module.db.specInDBase = {
[746] = 5, [815] = 6, [845] = 7,
[831] = 5, [839] = 6, [855] = 7,
[811] = 5, [807] = 6, [809] = 7,
[182] = 5, [181] = 6, [183] = 7,
[760] = 5, [813] = 6, [795] = 7,
[398] = 5, [399] = 6, [400] = 7,
[261] = 5, [263] = 6, [262] = 7,
[799] = 5, [851] = 6, [823] = 7,
[871] = 5, [867] = 6, [865] = 7,
[752] = 5, [750] = 6, [748] = 7,
[0] = 4,
}
end
do
local specList = {
[62] = "MAGEDPS1", --Arcane
[63] = "MAGEDPS2", --Fire
[64] = "MAGEDPS3", --Frost
[65] = "PALADINHEAL",
[66] = "PALADINTANK",
[70] = "PALADINDPS",
[71] = "WARRIORDPS1", --Arms
[72] = "WARRIORDPS2", --Fury
[73] = "WARRIORTANK",
[102] = "DRUIDDPS1", --Owl
[103] = "DRUIDDPS2", --Cat
[104] = "DRUIDTANK",
[105] = "DRUIDHEAL",
[250] = "DEATHKNIGHTTANK",
[251] = "DEATHKNIGHTDPS1", --Frost
[252] = "DEATHKNIGHTDPS2", --Unholy
[253] = "HUNTERDPS1", --BM
[254] = "HUNTERDPS2", --MM
[255] = "HUNTERDPS3", --Survival
[256] = "PRIESTHEAL1", --Disc
[257] = "PRIESTHEAL2", --Holy
[258] = "PRIESTDPS",
[259] = "ROGUEDPS1", --Assassination
[260] = "ROGUEDPS2", --Combat
[261] = "ROGUEDPS3", --Subtlety
[262] = "SHAMANDPS1", --Elemental
[263] = "SHAMANDPS2", --Enhancement
[264] = "SHAMANHEAL",
[265] = "WARLOCKDPS1", --Affliction
[266] = "WARLOCKDPS2", --Demonology
[267] = "WARLOCKDPS3", --Destruction
[268] = "MONKTANK",
[269] = "MONKDPS",
[270] = "MONKHEAL",
[577] = "DEMONHUNTERDPS",
[581] = "DEMONHUNTERTANK",
[1467] = "EVOKERDPS1", --Devastation
[1468] = "EVOKERHEAL",
[1473] = "EVOKERDPS2", --Augmentation
[0] = "NO",
}
if ExRT.isCata then
specList = {
[746] = "WARRIORDPS1", --Arms
[815] = "WARRIORDPS2", --Fury
[845] = "WARRIORTANK", --Protection
[831] = "PALADINHEAL", --Holy
[839] = "PALADINTANK", --Protection
[855] = "PALADINDPS", --Retribution
[811] = "HUNTERDPS1", --Beast Mastery
[807] = "HUNTERDPS2", --Marksmanship
[809] = "HUNTERDPS3", --Survival
[182] = "ROGUEDPS1", --Assassination
[181] = "ROGUEDPS2", --Combat
[183] = "ROGUEDPS3", --Subtlety
[760] = "PRIESTHEAL1", --Discipline
[813] = "PRIESTHEAL2", --Holy
[795] = "PRIESTDPS", --Shadow
[398] = "DEATHKNIGHTTANK", --Blood
[399] = "DEATHKNIGHTDPS1", --Frost
[400] = "DEATHKNIGHTDPS2", --Unholy
[261] = "SHAMANDPS1", --Elemental
[263] = "SHAMANDPS2", --Enhancement
[262] = "SHAMANHEAL", --Restoration
[799] = "MAGEDPS1", --Arcane
[851] = "MAGEDPS2", --Fire
[823] = "MAGEDPS3", --Frost
[871] = "WARLOCKDPS1", --Affliction
[867] = "WARLOCKDPS2", --Demonology
[865] = "WARLOCKDPS3", --Destruction
[752] = "DRUIDDPS1", --Balance
[750] = "DRUIDDPS2", --Feral Combat
[748] = "DRUIDHEAL", --Restoration
[0] = "NO",
}
end
module.db.specInLocalizate = setmetatable({},{__index = function (t,k)
if tonumber(k) then
return specList[k]
else
for i,val in pairs(specList) do
if val == k then
return i
end
end
end
end})
end
module.db.historyUsage = {}
module.db.testMode = false
module.db.isEncounter = nil
local cdsNav_wipe,cdsNav_set = nil
do
local cdsNavData = {}
local nilData = {}
module.db.cdsNavData = cdsNavData
module.db.cdsNav = setmetatable({}, {
__index = function (t,k)
return cdsNavData[k] or nilData
end
})
function cdsNav_wipe()
wipe(cdsNavData)
end
function cdsNav_set(playerName,spellID,pos)
local e = cdsNavData[playerName]
if not e then
e = {}
cdsNavData[playerName] = e
end
e[spellID] = pos
end
if ExRT.isClassic and not ExRT.isCata then
function cdsNav_set(playerName,spellID,pos)
local e = cdsNavData[playerName]
if not e then
e = {}
cdsNavData[playerName] = e
end
e[pos.spellName] = pos
end
end
end
do
local sessionData = {}
local nilData = {}
module.db.session_gGUIDs = setmetatable({}, {
__index = function (t,k)
return sessionData[k] or nilData
end,
__newindex = function (t,k,v)
local e = sessionData[k]
if not e then
e = {}
sessionData[k] = e
end
local reason = true
if type(v) == 'table' then
if v[3] then
reason = {v[3],v[2]}
else
reason = v[2]
end
v = v[1]
end
if v > 0 then
e[v] = reason
else
e[-v] = nil
end
end
})
module.db.session_gGUIDs_DEBUG = sessionData
if ExRT.isClassic and not ExRT.isCata then
module.db.session_gGUIDs = setmetatable({}, {
__index = function (t,k)
return sessionData[k] or nilData
end,
__newindex = function (t,k,v)
local e = sessionData[k]
if not e then
local n = {}
e = setmetatable({},{
__index = function (t1,k1)
return n[k1] or type(k1) == "number" and k1 > 0 and n[GetSpellInfo(k1) or ""]
end,
__newindex = function (t1,k1,v1)
n[k1] = v1
end
})
sessionData[k] = e
end
local reason = true
if type(v) == 'table' then
if v[3] then
reason = {v[3],v[2]}
else
reason = v[2]
end
v = v[1]
end
if type(v)=='string' or v > 0 then
e[v] = reason
else
e[-v] = nil
end
end
})
end
function module:ClearSessionDataReason(name,...)
local e = sessionData[name]
if not e then
return
end
local reasons = {}
for i=1,select("#",...) do
reasons[ select(i,...) ] = true
end
for k,v in pairs(e) do
if (type(v) == "table" and reasons[ v[2] ]) or (type(v) ~= "table" and reasons[v]) then
e[k] = nil
end
end
end
function module:ClearFullSessionDataReason(...)
local reasons = {}
for i=1,select("#",...) do
reasons[ select(i,...) ] = true
end
for _,e in pairs(sessionData) do
for k,v in pairs(e) do
if (type(v) == "table" and reasons[ v[2] ]) or (type(v) ~= "table" and reasons[v]) then
e[k] = nil
end
end
end
end
end
module.db.session_Pets = {}
module.db.session_PetOwner = {}
module.db.spell_isTalent = {
[845]=true, [315720]=true, [206940]=true, [194913]=true, [343294]=true, [117014]=true, [265046]=true, [117014]=true, [265046]=true,
[265046]=true, [205022]=true, [235870]=true, [205030]=true, [116847]=true, [196725]=true, [116847]=true,
--Other & items
[311203]=true, [311302]=true, [311303]=true, [312725]=true, [313921]=true, [313922]=true, [310592]=true, [310601]=true, [310602]=true, [310690]=true, [311194]=true, [311195]=true, [295046]=true, [299984]=true, [299988]=true, [303823]=true, [304088]=true, [304121]=true, [299376]=true, [299378]=true, [299372]=true, [299374]=true, [299273]=true, [299275]=true, [297375]=true, [298309]=true, [298312]=true, [298628]=true, [299334]=true, [299336]=true, [299338]=true, [299958]=true, [299959]=true, [299943]=true, [299944]=true, [300009]=true, [300010]=true, [298080]=true, [298081]=true, [299932]=true, [299933]=true, [299882]=true, [299883]=true, [300002]=true, [300003]=true, [299345]=true, [299347]=true, [299355]=true, [299358]=true, [302982]=true, [302983]=true, [296036]=true, [310425]=true, [310442]=true, [299875]=true, [299876]=true, [300015]=true, [300016]=true, [299349]=true, [299353]=true, [296325]=true, [299368]=true, [299370]=true, [298273]=true, [298277]=true,
}
module.db.spell_autoTalent = { --Для маркировки базовых заклинаний спека, которые являются талантами у других спеков [spellID] = specID
[273048]=104,
[88]=104,
[288826]=104
}
module.db.spell_talentProvideAnotherTalents = {
[197492] = {102793},
[197488] = {132469},
[197632] = {132469},
[197491] = {99,22842},
[217615] = {99,22842},
}
module.db.spell_talentsList = {}
module.db.spell_isPvpTalent = {}
module.db.spell_isAzeriteTalent = {}
module.db.spell_covenant = {}
do
local cache = {}
for k,v in pairs(module.db.spell_covenant) do
module.db.spell_isTalent[k] = true
end
function module:AddCovenant(player,covenant)
if not player or cache[player] == covenant then
return
end
cache[player] = covenant
module:ClearSessionDataReason(player,"covenant")
for spellID,cov in pairs(module.db.spell_covenant) do
if cov == covenant then
module.db.session_gGUIDs[player] = {spellID,"covenant"}
end
end
end
end
local SOULBIND_DEF_RANK_NOW = 15
do
local nilData = {}
local soulbindData = {}
module.db.soulbind_rank_debug = soulbindData
module.db.soulbind_rank = setmetatable({}, {
__index = function (t,k)
return soulbindData[k] or nilData
end
})
function module:SetSoulbindRank(player,spellID,rank)
if not player then
return
end
soulbindData[player] = soulbindData[player] or {}
if rank and type(rank) == 'number' and rank > 15 then
rank = 15
end
soulbindData[player][spellID] = rank
end
end
do
local nilData = {}
local talentRankData = {}
module.db.talent_classic_rank_debug = talentRankData
module.db.talent_classic_rank = setmetatable({}, {
__index = function (t,k)
return talentRankData[k] or nilData
end
})
function module:SetTalentClassicRank(player,spellID,rank)
if not player then
return
end
talentRankData[player] = talentRankData[player] or {}
talentRankData[player][spellID] = rank
end
end
do
local nilData = {}
local talentEntriesData = {}
module.db.talent_entries_debug = talentEntriesData
module.db.talent_entries = setmetatable({}, {
__index = function (t,k)
return talentEntriesData[k] or nilData
end
})
function module:SetTalentEntries(player,entries)
if not player then
return
end
talentEntriesData[player] = entries
end
--/dump GetMouseFocus().entryID
end
module.db.spell_charge_fix = { --Спелы с зарядами
[51505]=108283,
[204019]=1,
[53600]=1,
[35395]=1,
[205629]=1,
[205234]=1,
[61295]=108283,
[19758]=1,
[198304]=1,
[193786]=1,
[7384]=262150,
[108839]=1,
[115151]=1,
[259495]=264332,
[115308]=1,
[108853]=205029,
[275779]=204023,
[210191]=1,
[217200]=1,
[259489]=269737,
[212436]=1,
[19434]=1,
--[17]=1,
}
module.db.spell_durationByTalent_fix = { --Изменение длительности талантом\глифом вид: [спелл] = {spellid глифа\таланта, изменение времени (-10;10;*0.5;*1.5)}
[52174]={202163,3},
}
module.db.spell_cdByTalent_fix = { --Изменение кд талантом\глифом вид: [спелл] = {spellid глифа\таланта, изменение времени (-60;60);spellid2,time2;spellid3,time3;...}
[30449]={198100,30},
[77761]={288826,-60},
[52174]={202163,-15},
[77764]={288826,-60},
[6343]={275336,{"*0.5",107574}},
[187827]={296320,"*0.80"},
[339]={202226,6},
}
module.db.spell_cdByTalent_scalable_data = {
[296320] = {
[1] = "*0.75",
},
}
module.db.spell_cdByTalent_isScalable = {
[296320] = true,
}
module.db.tierSetsSpells = {} --[specID.tierID.tierMark] = {2P Bonus Spell ID, 4P Bonus Spell ID}
module.db.tierSetsList = {} -- [itemID] = specID.tierID.tierMark
module.db.spell_talentReplaceOther = { --Спелы, показ которых нужно убрать при наличии таланта (талант заменяет эти спелы) [spellID] = [talent Spell ID]
[34428]=202168,
[35395]=204019,
}
module.db.spell_aura_list = { --Спелы, время действия которых отменять при отмене бафа [buff_sid] = spellID
}
module.db.spell_speed_list = { --Спелы, которым менять время действия на основании спелхасты
}
module.db.spell_afterCombatReset = { --Принудительный сброс кд после боя с боссом (для спелов с кд менее 5 мин., 3мин после 6.1, 2мин после 9.0)
}
module.db.spell_afterCombatNotReset = { --Запрещать сброс кд после боя с боссом (для петов, например; для спелов с кд 5 и более мин., для анха)
[21169]=true,
[199740]=true,
[126393]=true,
[160452]=true,
[159956]=true,
[159931]=true,
}
module.db.spell_reduceCdByHaste = { --Заклинания, кд которых уменьшается хастой
[12294]=true,
[184575]=true,
[24275]=true,
[108853]=true,
[204019]=true,
[35395]=true,
[121253]=true,
[116847]=true,
[6343]=true,
[17364]=true,
[275773]=true,
[53500]=true,
[115308]=true,
[33917]=true,
[20271]=true,
[85222]=true,
[845]=true,
[193786]=true,
[184092]=true,
[213652]=true,
[275779]=true,
[23881]=true,
[193796]=true,
[6572]=true,
[19434]=true,
[187874]=true,
[23922]=true,
}
module.db.spell_resetOtherSpells = { --Заклинания, которые откатывают другие заклинания
[204035]={53600},
[217200]={{34026,336830}},
}
module.db.spell_sharingCD = { --Заклинания, которые запускают кд на другие заклинания [spellID] = {[otherSpellID] = CD}
}
module.db.spell_runningSameSpell = {} --Схожие заклинания
do
module.db.spell_runningSameSpell2 = {
{187611,187614,187615}, --Legendary Ring
{202767,202771,202768}, --New moon [Balance Druid artifact]
{330325,5308}, --warrior: Execute
}
if ExRT.isBC then
module.db.spell_runningSameSpell2[#module.db.spell_runningSameSpell2+1] = {2894,2062}
end
for i=1,#module.db.spell_runningSameSpell2 do
local list = module.db.spell_runningSameSpell2[i]
for j=1,#list do
module.db.spell_runningSameSpell[ list[j] ] = list
end
end
end
module.db.spell_runningSameTalent = {} --Схожие таланты
module.db.spell_reduceCdCast = { --Заклинания, применение которых уменьшает время восстановления других заклинаний [spellID] = {reduceSpellID,time;{reduceSpellID2,talentID},time2;{reduceSpellID3,talentID,specID,effectOnlyDuringBuffActive},time3}
}
module.db.spell_increaseDurationCast = { --Заклинания, продляющие время действия
}
module.db.spell_dispellsFix = {}
module.db.spell_dispellsList = { --Заклинания-диспелы (мгновенно откатываются, если ничего не диспелят)
[115450]=true,
[360823]=true,
}
module.db.spell_startCDbyAuraFade = { --Заклинания, кд которых запускается только при спадении ауры (вида [aura_spellID] = CD_spellID)
[5215]=5215,
}
module.db.spell_startCDbyAuraFadeExt = { --Заклинания, кд которых запускается также при спадении ауры (вида [aura_spellID] = CD_spellID)
}
module.db.spell_startCDbyAuraApplied = { --Заклинания, кд которых запускается только при наложении ауры (вида [aura_spellID] = CD_spellID)
}
module.db.spell_startCDbyAuraApplied_fix = {}
for _,spellID in pairs(module.db.spell_startCDbyAuraApplied) do module.db.spell_startCDbyAuraApplied_fix[spellID] = true end
module.db.spell_reduceCdByAuraFade = { --Заклинания, кд которых уменьшается при спадении ауры по окончании времени действия. !Важно обязательное время действия для таких заклинаний
}
module.db.spell_reduceCdByAuraFadeBefore = { --Заклинания, кд которых уменьшается при спадении ауры до окончания времени действия. !Важно обязательное время действия для таких заклинаний
}
module.db.spell_reduceCdByAura = { --Изменение кд если активна аура
}
module.db.spell_ignoreUseWithAura = {
}
module.db.spell_battleRes = { --Заклинания-воскрешения [WOD]
}
module.db.isResurectDisabled = nil
module.db.spell_isRacial = { --Расовые заклинания
[80483]="BloodElf",
[69179]="BloodElf",
[28880]="Draenei",
[59542]="Draenei",
[59544]="Draenei",
[129597]="BloodElf",
[59548]="Draenei",
[202719]="BloodElf",
[33697]="Orc",
[50613]="BloodElf",
[25046]="BloodElf",
[155145]="BloodElf",
[33702]="Orc",
[59543]="Draenei",
[59545]="Draenei",
[59547]="Draenei",
[69046]="Goblin",
}
module.db.aura_grant_talent = { --Бафф, который дает талант [buff_spell_id] = talent_spell_id
[108293] = 273048,
}
module.db.def_col = { --Стандартные положения в колонках
}
module.db.petsAbilities = { --> PetTypes = HUNTERS[ Tenacity [1], Cunning = [2], Ferocity[3] ]
[0] = {},
[L.creatureNames["Basilisk"]] = {1, {159733,45}, },
[L.creatureNames["Bat"]] = {2, },
[L.creatureNames["Bear"]] = {1, {50256,10}, },
[L.creatureNames["Beetle"]] = {1, {90339,60,12}, },
[L.creatureNames["Bird of Prey"]] = {2, },
[L.creatureNames["Boar"]] = {1, },
[L.creatureNames["Carrion Bird"]] = {3, {24423,6}, },
[L.creatureNames["Cat"]] = {3, {24450,10}, {93435,45}, },
[L.creatureNames["Chimaera"]] = {2, {54644,10}, },
[L.creatureNames["Core Hound"]] = {3, {90355,360,40}, },
[L.creatureNames["Crab"]] = {1, {159926,60,12}, },
[L.creatureNames["Crane"]] = {2, {159931,600}, },
[L.creatureNames["Crocolisk"]] = {1, {50433,10}, },
[L.creatureNames["Devilsaur"]] = {3, {159953,60}, {54680,8}, },
[L.creatureNames["Direhorn"]] = {1, {137798,30}, },
[L.creatureNames["Dog"]] = {3, },
[L.creatureNames["Dragonhawk"]] = {2, },
[L.creatureNames["Fox"]] = {3, {160011,120}, },
[L.creatureNames["Goat"]] = {3, },
[L.creatureNames["Gorilla"]] = {1, },
[L.creatureNames["Hyena"]] = {3, {128432,90}, },
[L.creatureNames["Monkey"]] = {2, {160044,120}, },
[L.creatureNames["Moth"]] = {3, {159956,600}, },
--[L.creatureNames["Nether Ray"]] = {2, {90355,360,40}, },
[L.creatureNames["Nether Ray"]] = {2, {160452,360,40}, },
[L.creatureNames["Porcupine"]] = {1, },
[L.creatureNames["Quilen"]] = {3, {126393,600}, },
[L.creatureNames["Raptor"]] = {3, {160052,45}, },
[L.creatureNames["Ravager"]] = {2, },
["Clefthoof"] = {1, }, -- Clefthoof[WOD] = Rhino
[L.creatureNames["Scorpid"]] = {1, {160060,6}, },
[L.creatureNames["Serpent"]] = {2, {128433,90}, },
[L.creatureNames["Shale Spider"]] = {1, {160063,60,12}, },
[L.creatureNames["Silithid"]] = {2, {160065,10}, },
[L.creatureNames["Spider"]] = {2, {160067,10}, },
[L.creatureNames["Spirit Beast"]] = {3, {90328,10}, {90361,30}, },
[L.creatureNames["Sporebat"]] = {2, },
[L.creatureNames["Tallstrider"]] = {3, {160073,45}, },
[L.creatureNames["Turtle"]] = {1, {26064,60,12}, },
[L.creatureNames["Warp Stalker"]] = {1, {35346,15}, },
[L.creatureNames["Wasp"]] = {3, },
[L.creatureNames["Water Strider"]] = {2, },
[L.creatureNames["Wind Serpent"]] = {2, },
[L.creatureNames["Wolf"]] = {3, {24604,45}, },
[L.creatureNames["Worm"]] = {1, {93433,14}, },
[1] = {0, {53478,360,20}, {61685,25}, {63900,10}, },
[2] = {0, {53490,180,12}, {61684,32,16}, },
[3] = {0, {61684,32,16}, {55709,480}, },
[L.creatureNames["Ghoul"]] = {0, {91837,45,10}, {91802,30}, {91797,60}, },
[L.creatureNames["Felguard"]] = {0, {89751,45,6}, {89766,30}, {30151,15}, },
[L.creatureNames["Felhunter"]] = {0, {19647,24}, {19505,15}, },
[L.creatureNames["Fel Imp"]] = {0, {115276,10}, },
[L.creatureNames["Imp"]] = {0, {89808,10}, {119899,30,12}, {89792,20}, },
[L.creatureNames["Observer"]] = {0, {19647,24}, {115284,15}, },
[L.creatureNames["Shivarra"]] = {0, {115770,25}, {115268,30}, },
[L.creatureNames["Succubus"]] = {0, {6360,25}, {6358,30}, },
[L.creatureNames["Voidlord"]] = {0, {115236,10} },
[L.creatureNames["Voidwalker"]] = {0, {17735,10}, {17767,120,20}, {115232,10}, },
[L.creatureNames["Wrathguard"]] = {0, {115831,45,6}, },
[L.creatureNames["Water Elemental"]] = {0, {135029,20,4}, {33395,25}, },
}
module.db.spell_isPetAbility = {}
for petName,petData in pairs(module.db.petsAbilities) do
for i=2,#petData do
if module.db.spell_isPetAbility[petData[i][1]] then
if type(module.db.spell_isPetAbility[petData[i][1]]) ~= "table" then
module.db.spell_isPetAbility[petData[i][1]] = {module.db.spell_isPetAbility[petData[i][1]]}
end
module.db.spell_isPetAbility[petData[i][1]][ #module.db.spell_isPetAbility[petData[i][1]] + 1 ] = petName
else
module.db.spell_isPetAbility[petData[i][1]] = petName
end
end
end
module.db.differentIcons = { --Другие иконки заклинаниям
[176875]="Interface\\Icons\\Inv_misc_trinket6oOG_Isoceles1",
[176873]="Interface\\Icons\\Inv_misc_trinket6oIH_orb4",
[184270]="Interface\\Icons\\spell_nature_mirrorimage",
[183929]="Interface\\Icons\\spell_mage_presenceofmind",
[187614]="Interface\\Icons\\inv_60legendary_ring1c",
[187613]="Interface\\Icons\\inv_60legendary_ring1b",
[187612]="Interface\\Icons\\inv_60legendary_ring1a",
}
module.db.itemsToSpells = { -- Тринкеты вида [item ID] = spellID
[113931] = 176878,
[113969] = 176874,
[118876] = 177597, --Coin
[118878] = 177594, --Couplend
[118880] = 177592, --Candle
[118882] = 177189, --Kyanos
[118884] = 176460, --Kyb
[113905] = 176873, --Tank BRF
[113834] = 176876,
[113835] = 176875, --Shard of nothing
[113842] = 176879,
[110002] = 165531,
[110003] = 165543,
[110008] = 165535,
[110012] = 165532,
[110013] = 165543,
[110017] = 165534,
[110018] = 165535,
[114488] = 176883,
[114489] = 176882,
[114490] = 176884,
[114491] = 176881,
[114492] = 176885,
[109997] = 165485,
[109998] = 165542,
[110007] = 165532,
[124224] = 184270, --Mirror of the Blademaster
[124232] = 183929, --Intuition's Gift
[137105] = 206338,
[137059] = 206380,
[137017] = 207628,
[137089] = 215176,
[137054] = 215057,
[137101] = 206332,
[137033] = 206889,
[137227] = 212278,
[137100] = 208892,
[137030] = 208895,
[132436] = 214576,
[132367] = 208706,
[132376] = 210852,
[137058] = 210604,
[137097] = 209256,
[137027] = 224489,
[137096] = 206902,
[137039] = 208199,
[137061] = 215149,
[137071] = 210867,
[138949] = 210970,
[144279] = 209354,
[64399] = 90628,
[64398] = 90626,
[63359] = 89479,
[133642] = 215956,
[137541] = 215648,
[137539] = 214962,
[137538] = 215936,
[137537] = 215658,
[137486] = 214980,
[137462] = 215206,
[137440] = 214584,
[137433] = 215467,
[137369] = 214971,
[137344] = 214423,
[137338] = 214366,
[137329] = 215670,
[133647] = 214203,
[133646] = 214198,
[139322] = 221837,
[139333] = 221992,
[139327] = 221695,
[139326] = 222046,
[139320] = 221803,
[144280] = 235556,
[143728] = 208091,
[144274] = 235273,
[144293] = 235605,
[144355] = 235940,
[144242] = 235039,
}
--/run for _,q in pairs({188255,188272,188271,188268,188266,188263,188261}) do _,e=GetItemSpell(q) JJBox("["..q.."]="..e..",") end
--/run for _,q in pairs({188255,188272,188271,188268,188266,188263,188261}) do _,e=GetItemSpell(q)t=GetSpellBaseCooldown(e) JJBox("{"..e..',"ITEMS", 3, {'..e..','..((t or 0)/1000)..', 0}, },') end
for itemID,spellID in pairs(module.db.itemsToSpells) do
module.db.spell_isTalent[spellID] = true
if spellID > 330000 and not module.db.differentIcons[spellID] then
local icon = select(5,GetItemInfoInstant(itemID))
if icon ~= GetSpellTexture(spellID) then
module.db.differentIcons[spellID] = icon
end
end
end
ExRT.F.table_add2(module.db.itemsToSpells,{
[124634] = 187614, --Legendary Ring
[124636] = 187615, --Legendary Ring
[124635] = 187611, --Legendary Ring
[124637] = 187613, --Legendary Ring
[124638] = 187612, --Legendary Ring
})
module.db.itemsBonusToSpell = {
[6972] = 336470,
[6979] = 336133,
[6977] = 336314,
[6948] = 334724,
[6943] = 334580,
[6941] = 334525,
[6946] = 334692,
[6952] = 334949,
[6951] = 334898,
[7051] = 337685,
[7109] = 340053,
[7095] = 339062,
[7003] = 336742,
[7006] = 336747,
[7009] = 336830,
[7081] = 337296,
[7070] = 337481,
[7054] = 337594,
[7053] = 337600,
[7060] = 337831,
[7114] = 340080,
[6989] = 336734,
[6995] = 335897,
[7025] = 337020,
[7118] = 340084,
[6955] = 335214,
[6965] = 335582,
[6957] = 335239,
[6956] = 335229,
[7061] = 337838,
[7011] = 336849,
[7470] = 354131,
[7730] = 357996,
[7474] = 354109,
[7571] = 354118,
[7703] = 356391,
[7728] = 356395,
[7701] = 355447,
[7573] = 354731,
[7708] = 356218,
}
if UnitLevel'player' > 60 then --not work outside sl
for _,bonusID in pairs({6972,6979,6977,6948,6943,6941,6946,6952,6951,7051,7109,7095,7003,7006,7009,7081,7070,7054,7053,7060,7114,6989,6995,7025,7118,6955,6965,6957,6956,7061,7011,7470,7730,7474,7571,7703,7728,7701,7573,7708}) do
module.db.itemsBonusToSpell[bonusID] = nil
end
end
module.db.spellCDSync = {}
module.db.spellCDSyncToSpell = {}
do
local c,scd,scsts = select(2,UnitClass'player'),module.db.spellCDSync,module.db.spellCDSyncToSpell
if not ExRT.isClassic and c == "SHAMAN" then ExRT.F.table_add(scd,{157153,324386,5394,108280,16191,98008,192058,2484,8143,207399,198838}) end
--if c == "DEMONHUNTER" then ExRT.F.table_add(scd,{204596,207684,202137,202138,390163}) end
end
module.db.spellIgnoreAfterFirstUse = {}
local CLEU = {}
module.db.CLEU = CLEU
if ExRT.isClassic then
module.db.findspecspells = {}
module.db.spell_isTalent = {}
module.db.spell_autoTalent = {}
module.db.spell_charge_fix = {}
module.db.spell_talentReplaceOther = {}
module.db.spell_aura_list = {}
module.db.spell_speed_list = {}
module.db.spell_afterCombatReset = {}
module.db.spell_afterCombatNotReset = {}
module.db.spell_reduceCdByHaste = {}
module.db.spell_resetOtherSpells = {}
module.db.spell_reduceCdCast = {}
module.db.itemsBonusToSpell = {}
module.db.itemsToSpells = {}
module.db.spell_cdByTalent_fix = {}
module.db.spell_durationByTalent_fix = {}
end
if ExRT.isLK then
local spellToLvl = {
[31884] = 70,
[642] = 34,
[10310] = 10,
[1022] = 10,
[19752] = 30,
[34477] = 70,
[64901] = 80,
[64843] = 80,
[6346] = 20,
[42650] = 80,
[61999] = 72,
[2825] = 70,
[32182] = 70,
[55694] = 75,
[20765] = 18,
[55342] = 80,
[45438] = 30,
}
GetSpellLevelLearned = function (spell)
if spellToLvl[spell] then
return spellToLvl[spell]
end
return 1
end
end
module.db.vars = {
isWarlock = {},
isRogue = {},
isPaladin = {},
isMage = {},
isHunter = {}
}
module.db.plugin = {}
module.db.rframes = {
{text = L.cd2Autoselect},
{name = "VuhDo", opts = {"^Vd1", "^Vd2", "^Vd3", "^Vd4", "^Vd5", "^Vd"}},
{name = "HealBot", opts = {"^HealBot"}},
{name = "Grid", opts = {"^GridLayout","^Grid2Layout"}},
{name = "ElvUI", opts = {"^ElvUF_RaidGroup","^ElvUF_PartyGroup"}},
{name = "SUF", opts = {"^SUFHeaderraid","^SUFHeaderparty"}},
{name = "Blizzard", opts = {"^CompactRaid","^CompactParty"}},
}
module.db.rframes_def = { --copy from LibGetFrame
-- raid frames
"^Vd1", -- vuhdo
"^Vd2", -- vuhdo
"^Vd3", -- vuhdo
"^Vd4", -- vuhdo
"^Vd5", -- vuhdo
"^Vd", -- vuhdo
"^HealBot", -- healbot
"^GridLayout", -- grid
"^Grid2Layout", -- grid2
"^PlexusLayout", -- plexus
"^ElvUF_RaidGroup", -- elv
"^oUF_bdGrid", -- bdgrid
"^oUF_.-Raid", -- generic oUF
"^LimeGroup", -- lime
"^SUFHeaderraid", -- suf
-- party frames
"^AleaUI_GroupHeader", -- Alea
"^SUFHeaderparty", --suf
"^ElvUF_PartyGroup", -- elv
"^oUF_.-Party", -- generic oUF
"^PitBull4_Groups_Party", -- pitbull4
"^CompactRaid", -- blizz
"^CompactParty", -- blizz
-- player frame
"^SUFUnitplayer",
"^PitBull4_Frames_Player",
"^ElvUF_Player",
"^oUF_.-Player",
"^PlayerFrame",
}
module.db.notAClass = { r = 0.8, g = 0.8, b = 0.8, colorStr = "ffcccccc" }
local colorSetupFrameColorsNames = {"Default","Active","Cooldown"}
local colorSetupFrameColorsObjectsNames = {"Text","Background","TimeLine"}
local globalGUIDs = nil
module.db.maxLinesInCol = 100
module.db.maxColumns = 10
module.db.colsDefaults = {
iconSize = 16,
iconGray = true,
iconPosition = 1,
textureFile = ExRT.F.barImg,
textureBorderSize = 0,
fontSize = 12,
fontName = ExRT.F.defFont,
fontCDSize = 16,
frameLines = 15,
frameAlpha = 100,
frameScale = 100,
frameWidth = 130,
frameColumns = 1,
frameBetweenLines = 0,
frameBlackBack = 0,
frameStrata = "MEDIUM",
methodsStyleAnimation = 1,
methodsTimeLineAnimation = 1,
methodsSortingRules = 1,
methodsAlphaNotInRangeNum = 90,
textureBorderColorR = 0, textureBorderColorG = 0, textureBorderColorB = 0, textureBorderColorA = 1,
textureColorTextDefaultR = 1, textureColorTextDefaultG = 1, textureColorTextDefaultB = 1,
textureColorTextActiveR = 1, textureColorTextActiveG = 1, textureColorTextActiveB = 1,
textureColorTextCooldownR = 1, textureColorTextCooldownG = 1, textureColorTextCooldownB = 1,
textureColorBackgroundDefaultR = 0, textureColorBackgroundDefaultG = 1, textureColorBackgroundDefaultB = 0,
textureColorBackgroundActiveR = 0, textureColorBackgroundActiveG = 1, textureColorBackgroundActiveB = 0,
textureColorBackgroundCooldownR = 1, textureColorBackgroundCooldownG = 0, textureColorBackgroundCooldownB = 0,
textureColorTimeLineDefaultR = 0, textureColorTimeLineDefaultG = 1, textureColorTimeLineDefaultB = 0,
textureColorTimeLineActiveR = 0, textureColorTimeLineActiveG = 1, textureColorTimeLineActiveB = 0,
textureColorTimeLineCooldownR = 1, textureColorTimeLineCooldownG = 0, textureColorTimeLineCooldownB = 0,
textureAlphaBackground = 0.3,
textureAlphaTimeLine = 0.8,
textureAlphaCooldown = 1,
textureSmoothAnimationDuration = 50,
textTemplateLeft = "%name%",
textTemplateRight = "%time%",
textTemplateCenter = "",
textIconNameChars = 50,
textIconCDStyle = 7,
blacklistText = "",
whitelistText = "",
ATFCol = 6,
ATFLines = 2,
ATFOffsetX = 0,
ATFOffsetY = 0,
ATFGrowth = 1,
iconGlowType = 4,
}
module.db.colsInit = {
iconGeneral = true,
textureGeneral = true,
methodsGeneral = true,
frameGeneral = true,
fontGeneral = true,
textGeneral = true,
blacklistGeneral = true,
visibilityGeneral = true,
iconGray = true,
textureAnimation = true,
fontOutline = true,
fontShadow = false,
--textureSmoothAnimation = true,
}
module.db.status_UnitsToCheck = {}
module.db.status_UnitIsDead = {}
module.db.status_UnitIsDisconnected = {}
module.db.status_UnitIsOutOfRange = {}
-- Local functions vaules; other upvaules
local UpdateAllData = nil
local SaveCDtoVar = nil
local CLEUstartCD = nil
local L_Offline,L_Dead = L.cd2StatusOffline, L.cd2StatusDead
local _C, _db = module._C, module.db
local status_UnitsToCheck,status_UnitIsDead,status_UnitIsDisconnected,status_UnitIsOutOfRange = module.db.status_UnitsToCheck,module.db.status_UnitIsDead,module.db.status_UnitIsDisconnected,module.db.status_UnitIsOutOfRange
do
local key_to_table = {
["isTalent"]={module.db.spell_isTalent,0},
["isCovenant"]={module.db.spell_covenant,0},
["baseForSpec"]={module.db.spell_autoTalent,0},
["hasCharges"]={module.db.spell_charge_fix,0},
["durationDiff"]={module.db.spell_durationByTalent_fix,0},
["cdDiff"]={module.db.spell_cdByTalent_fix,0},
["isScalable"]={module.db.spell_cdByTalent_isScalable,0},
["hideWithTalent"]={module.db.spell_talentReplaceOther,0},
["changeDurWithHaste"]={module.db.spell_speed_list,0},
["afterCombatReset"]={module.db.spell_afterCombatReset,0},
["afterCombatNotReset"]={module.db.spell_afterCombatNotReset,0},
["changeCdWithHaste"]={module.db.spell_reduceCdByHaste,0},
["sameSpell"]={module.db.spell_runningSameSpell2,0},
["sameTalent"]={module.db.spell_runningSameTalent,0},
["isDispel"]={module.db.spell_dispellsList,0},
["isBattleRes"]={module.db.spell_battleRes,0},
["isRacial"]={module.db.spell_isRacial,0},
["icon"]={module.db.differentIcons,0},
["ignoreUseWithAura"]={module.db.spell_ignoreUseWithAura,0},
["stopDurWithAuraFade"]={module.db.spell_aura_list,"S"},
["resetBy"]={module.db.spell_resetOtherSpells,1},
["startCdAfterUse"]={module.db.spell_sharingCD,"K"},
["reduceCdAfterCast"]={module.db.spell_reduceCdCast,2},
["increaseDurAfterCast"]={module.db.spell_increaseDurationCast,2},
["startCdAfterAuraFade"]={module.db.spell_startCDbyAuraFade,"S"},
["startCdAfterAuraFadeExt"]={module.db.spell_startCDbyAuraFadeExt,"S"},
["startCdAfterAuraApply"]={module.db.spell_startCDbyAuraApplied,"S"},
["changeCdAfterAuraFullDur"]={module.db.spell_reduceCdByAuraFade,2},
["changeCdBeforeAuraFullDur"]={module.db.spell_reduceCdByAuraFadeBefore,2},
["item"]={module.db.itemsToSpells,"S"},
["changeCdWithAura"]={module.db.spell_reduceCdByAura,2},
}
local function cmp(a,b)
if type(a) == "table" and type(b) == "table" then
return ExRT.F.table_compare(a,b) == 1
else
return a == b
end
end
function module:CreateSpellData(forceAll)
CLEU:Reset()
for i=1,#module.db.AllSpells do
local spell = module.db.AllSpells[i]
local on = VMRT.ExCD2.CDE[ spell[1] ]
if on or forceAll then
for k,v in pairs(spell) do
local t = key_to_table[k]
if t then
local it = t[2]
if t[2] == 0 then
t[1][ spell[1] ] = v
elseif t[2] == "K" then
for i=1,#v do
local st = t[1][ v[i][1] ]
if not st then
st = {}
t[1][ v[i][1] ] = st
end
st[ spell[1] ] = v[i][2]
end
elseif t[2] == "S" then
for i=1,(type(v)~="table" and 1 or #v) do
t[1][ (type(v)~="table" and v or v[i]) ]=spell[1]
end
else
for i=1,(type(v)~="table" and 1 or #v),it do
local sk = type(v)~="table" and v or v[i]
local st
local vAdd
if type(sk) == "table" then
local n = ExRT.F.table_copy2(sk)
st = t[1][ n[1] ]
if not st then
st = {}
t[1][ n[1] ] = st
end
n[1] = spell[1]
vAdd = n
else
st = t[1][sk]
if not st then
st = {}
t[1][sk] = st
end
vAdd = spell[1]
end
for o=1,#st,it do
if cmp(st[o],vAdd) then
vAdd = nil
break
end
end
if vAdd then
st[#st+1] = vAdd
for l=2,it do
st[#st+1] = v[i+l-1]
end
end
end
end
elseif type(k)=="string" and k:find("^CLEU_") and on then
CLEU:Add(k,v)
elseif type(k)=="string" then
--print("ExCD2: CreateSpellData: Found wrong key",k)
end
end
end
end
for _,list in pairs(module.db.spell_runningSameSpell2) do
for j=1,#list do
module.db.spell_runningSameSpell[ list[j] ] = list
end
end
for _,spellID in pairs(module.db.spell_startCDbyAuraApplied) do module.db.spell_startCDbyAuraApplied_fix[spellID] = true end
for itemID,spellID in pairs(module.db.itemsToSpells) do
module.db.spell_isTalent[spellID] = true
if spellID > 330000 and not module.db.differentIcons[spellID] then
local icon = select(5,GetItemInfoInstant(itemID))
if icon ~= GetSpellTexture(spellID) then
module.db.differentIcons[spellID] = icon
end
end
end
for k in pairs(module.db.spell_cdByTalent_isScalable) do
if not module.db.spell_cdByTalent_scalable_data[k] then
module.db.spell_cdByTalent_scalable_data[k]={[1]="*0.75"}
end
end
if ExRT.isClassic and not ExRT.isCata then
local n = {}
for k in pairs(module.db.spell_isTalent) do
if type(k) == "number" then
n[#n+1] = GetSpellInfo(k) or "spell:"..k
end
end
for _,v in pairs(n) do
module.db.spell_isTalent[v] = true
end
end
CLEU:Recreate()
end
function module:CreateSpellDB()
local spellDB, AllSpells = module.db.spellDB, module.db.AllSpells
local isTestMode = module.db.testMode
local spellInMainDB = {}
wipe(spellDB)
for i=1,#AllSpells do
local data = AllSpells[i]
if VMRT.ExCD2.CDE[ data[1] ] or isTestMode then
spellDB[#spellDB+1] = data
spellInMainDB[ data[1] ] = true
end
end
for i=1,#VMRT.ExCD2.userDB do
local data = VMRT.ExCD2.userDB[i]
if --Prevent any errors for userbased cds
VMRT.ExCD2.CDE[ data[1] ] and
not spellInMainDB[ data[1] ] and
type(data[2]) == "string" and
type(data[3]) == "number" and
(data[4] or data[5] or data[6] or data[7] or data[8]) and
((data[4] and data[4][1] and data[4][2] and data[4][3]) or not data[4]) and
((data[5] and data[5][1] and data[5][2] and data[5][3]) or not data[5]) and
((data[6] and data[6][1] and data[6][2] and data[6][3]) or not data[6]) and
((data[7] and data[7][1] and data[7][2] and data[7][3]) or not data[7]) and
((data[8] and data[8][1] and data[8][2] and data[8][3]) or not data[8])
then
spellDB[#spellDB+1] = data
if data.itemID and data[2] and strsplit(",",data[2]) == "ITEMS" then
_db.itemsToSpells[data.itemID] = data[1]
if data.isEquip then
_db.spell_isTalent[ data[1] ] = true
end
end
if data.isTalent then
_db.spell_isTalent[ data[1] ] = true
end
end
end
module:CreateSpellData()
end
end
function module:UpdateSpellDB(fullUpdate)
if fullUpdate then
module:CreateSpellDB()
module:UpdateRoster()
end
UpdateAllData()
end
do
local frame = CreateFrame("Frame",nil,UIParent)
module.frame = frame
frame:Hide()
frame:SetPoint("CENTER",UIParent, "CENTER", 0, 0)
frame:EnableMouse(true)
frame:SetMovable(true)
frame:RegisterForDrag("LeftButton")
frame:SetScript("OnDragStart", function(self)
if self:IsMovable() then
self:StartMoving()
end
end)
frame:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing()
VMRT.ExCD2.Left = self:GetLeft()
VMRT.ExCD2.Top = self:GetTop()
end)
frame.texture = frame:CreateTexture(nil, "BACKGROUND")
frame.texture:SetColorTexture(0,0,0,0.3)
frame.texture:SetAllPoints()
module:RegisterHideOnPetBattle(frame)
frame.colFrame = {}
end
local gsub_data = {}
local gsub_func = function(a)
return gsub_data[a]
end
local callback_upvalue_text_names, callback_upvalue_text, callback_upvalue_status
ExRT.F:RegisterCallback("CallbackRegistered", function(_,eventName)
if eventName == "RaidCooldowns_Bar_TextName" then
callback_upvalue_text_names = true
module:ReloadAllSplits()
elseif eventName == "RaidCooldowns_Bar_UpdateText" then
callback_upvalue_text = true
module:ReloadAllSplits()
elseif eventName == "RaidCooldowns_Bar_UpdateStatus" then
callback_upvalue_status = true
module:ReloadAllSplits()
end
end)
ExRT.F:RegisterCallback("CallbackUnregistered", function(_,eventName,_,callbacks)
if callbacks ~= 0 then
return
elseif eventName == "RaidCooldowns_Bar_TextName" then
callback_upvalue_text_names = nil
module:ReloadAllSplits()
elseif eventName == "RaidCooldowns_Bar_UpdateText" then
callback_upvalue_text = nil
module:ReloadAllSplits()
elseif eventName == "RaidCooldowns_Bar_UpdateStatus" then
callback_upvalue_status = nil
module:ReloadAllSplits()
end
end)
local function BarUpdateText(self)
local barParent = self.parent
local barData = self.data
if not barData then
--self.textLeft:SetText(" ")
--self.textRight:SetText(" ")
--self.textCenter:SetText(" ")
--self.textIcon:SetText("")
--self.textIconCD:SetText("")
return
end
--if not barParent:IsVisible() then return end
local time = (self.curr_end or 0) - GetTime() + 1
if barParent.methodsTextIgnoreActive then
time = (self.curr_end_cd or 0) - GetTime() + 1
end
if barData.specialTimer then
local newTime = barData.specialTimer()
time = newTime and newTime+1 or time
end
local name = barData.name
local spellName = barData.spellName
local longtime,shorttime = nil
if time > 3600 then
longtime = "1+hour"
shorttime = "1+hour"
elseif time < 1 then
longtime = ""
shorttime = ""
else
longtime = format("%1.1d:%2.2d",time/60,time%60)
if time < 11 then
shorttime = format("%.01f",time - 1)
elseif time < 60 then
shorttime = format("%d",time)
else
shorttime = longtime
end
end
if barParent.textShowTargetName and barData.targetName and time >= 1 then
local _,targetClass = UnitClass(barData.targetName)
if targetClass then
local classColorsTable = type(CUSTOM_CLASS_COLORS)=="table" and CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS
name = name .. " > |c"..classColorsTable[targetClass].colorStr..barData.targetName.."|r"
else
name = name .. " > "..barData.targetName
end
end
if barData.specialAddText then
name = name .. (barData.specialAddText() or "")
end
local name_time = time >= 1 and longtime or name
local name_stime = time >= 1 and shorttime or name
local offStatus = self.disStatus or ""
local chargesCount = self.curr_charges and "("..self.curr_charges..")" or ""
gsub_data.time = longtime
gsub_data.stime = shorttime
gsub_data.name = name
gsub_data.name_time = name_time
gsub_data.name_stime = name_stime
gsub_data.spell = spellName
gsub_data.status = offStatus
gsub_data.charge = chargesCount
if callback_upvalue_text_names then
FireCallback(nil,"RaidCooldowns_Bar_TextName",self,gsub_data,barData)
end
local left = string_trim(barParent.textTemplateLeft:gsub("%%([^%%]+)%%",gsub_func),nil)
if self.textLeft.text ~= left then
self.textLeft.text = left
if left == "" then left = " " end
self.textLeft:SetText(left)
end
local right = string_trim(barParent.textTemplateRight:gsub("%%([^%%]+)%%",gsub_func),nil)
if self.textRight.text ~= right then
self.textRight.text = right
if right == "" then right = " " end
self.textRight:SetText(right)
end
local center = string_trim(barParent.textTemplateCenter:gsub("%%([^%%]+)%%",gsub_func),nil)
if self.textCenter.text ~= center then
self.textCenter:SetText(center)
self.textCenter.text = center
end
if barParent.optionIconName and (self.textIcon.name ~= gsub_data.name or self.textIcon.numChars ~= barParent.textIconNameChars) then
self.textIcon:SetText(utf8sub(gsub_data.name,1,barParent.textIconNameChars))
self.textIcon.name = gsub_data.name
self.textIcon.numChars = barParent.textIconNameChars
end
local cdText
if barParent.optionCooldownUseExRT then
local style = barParent.textIconCDStyle
time = time - 1
if time <= 0 then
cdText = ""
elseif time < 60 then
if style == 1 or style == 2 or style == 5 or style == 7 or style == 8 or style == 11 then
cdText = ceil(time)
elseif style == 3 or style == 4 or style == 6 or style == 9 or style == 10 then
cdText = format("%.1f",time)
end
elseif style == 1 or style == 3 then
cdText = SecondsToTime(time, true)
elseif style == 2 or style == 4 then
cdText = SecondsToTime(time+60, true)
elseif style == 5 or style == 6 then
cdText = format("%d:%02d",time/60,time%60)
elseif style == 7 or style == 9 then
cdText = format("%dm",time/60)
elseif style == 8 or style == 10 then
cdText = format("%dm",time/60+1)
elseif style == 11 then
if time <= 99 then
cdText = ceil(time)
else
cdText = format("%dm",time/60)
end
end
end
if self.textIconCD.text ~= cdText then
self.textIconCD:SetText(cdText or "")
self.textIconCD.text = cdText
end
if callback_upvalue_text then
FireCallback(nil,"RaidCooldowns_Bar_UpdateText",self)
end
end
local function BarAnimation(self)
local bar = self.bar
local t = GetTime()
if t > bar.curr_end then
bar:Stop()
else
local width = (t - bar.curr_start) / bar.curr_dur
if width > 1 then
width = 1
elseif width < 0 then
width = 0
end
bar.timeline:SetShown(width ~= 0)
bar.timeline:SetWidth(width * bar.timeline.width)
bar.spark:SetPoint("CENTER",bar.statusbar,"LEFT", (t-bar.curr_start) / bar.curr_dur * bar.timeline.width,0)
end
self.c = self.c + 1
if self.c > 2 then
self.c = 0
bar:UpdateText()
end
end
local function BarAnimation_Reverse(self)
local bar = self.bar
local t = GetTime()
if t > bar.curr_end then
bar:Stop()
else
local width = (bar.curr_end - t) / bar.curr_dur
if width > 1 then
width = 1
elseif width < 0 then
width = 0
end
bar.timeline:SetShown(width ~= 0)
bar.timeline:SetWidth(width * bar.timeline.width)
bar.spark:SetPoint("CENTER",bar.statusbar,"LEFT", (bar.curr_dur - (t-bar.curr_start)) / bar.curr_dur * bar.timeline.width,0)
end
self.c = self.c + 1
if self.c > 2 then
self.c = 0
bar:UpdateText()
end
end
local function BarAnimation_NoAnimation(self)
local bar = self.bar
local t = GetTime()
if t > bar.curr_end then
bar:Stop()
end
self.c = self.c + 1
if self.c > 2 then
self.c = 0
bar:UpdateText()
end
end
local function StopBar(self)
if self.curr_end == 0 then
return
end
self.anim:Stop()
self.spark:Hide()
self:UpdateStatus()
if self:IsVisible() then
UpdateAllData()
end
end
local function UpdateBar(self)
local data = self.data
if not data then
self:Hide()
return
end
if not self:IsShown() then
self:Show()
end
self.iconTexture:SetTexture(data.icon)
self:UpdateText()
end
local function BarStateAnimation(self)
local bar = self.bar
local progress = self:GetProgress()
local b = bar.curr_anim_b
if b then
bar.background:SetVertexColor(b.r + bar.curr_anim_b_r*progress,b.g + bar.curr_anim_b_g*progress,b.b + bar.curr_anim_b_b*progress,bar.curr_anim_b_a)
end
local l = bar.curr_anim_l
if l then
bar.timeline:SetVertexColor(l.r + bar.curr_anim_l_r*progress,l.g + bar.curr_anim_l_g*progress,l.b + bar.curr_anim_l_b*progress,bar.curr_anim_l_af+bar.curr_anim_l_a*progress)
end
local t = bar.curr_anim_t
if t then
bar.textLeft:SetTextColor(t.r + bar.curr_anim_t_r*progress,t.g + bar.curr_anim_t_g*progress,t.b + bar.curr_anim_t_b*progress)
bar.textRight:SetTextColor(t.r + bar.curr_anim_t_r*progress,t.g + bar.curr_anim_t_g*progress,t.b + bar.curr_anim_t_b*progress)
bar.textCenter:SetTextColor(t.r + bar.curr_anim_t_r*progress,t.g + bar.curr_anim_t_g*progress,t.b + bar.curr_anim_t_b*progress)
bar.textIcon:SetTextColor(t.r + bar.curr_anim_t_r*progress,t.g + bar.curr_anim_t_g*progress,t.b + bar.curr_anim_t_b*progress)
bar.textIconCD:SetTextColor(t.r + bar.curr_anim_t_r*progress,t.g + bar.curr_anim_t_g*progress,t.b + bar.curr_anim_t_b*progress)
end
end
local function BarStateAnimationFinished(self)
self.bar.afterAnimFix = true
self.bar:UpdateStatus()
end
local function UpdateBarStatus(self,isTitle)
local data = self.data
if not data then
return
end
if self.isTitle then
self:UpdateStyle()
self.isTitle = nil
end
if data.specialUpdateData then --For templates
data.specialUpdateData(data)
end
local parent = self.parent
local currTime = GetTime()
local lastUse = data.lastUse
local active = lastUse + data.duration
local cooldown = lastUse + data.cd
if parent.methodsDisableActive then
active = 0
end
local isActive = (active - currTime) > 0
local isCooldown = (cooldown - currTime) > 0
local t = (isActive and active) or (isCooldown and cooldown)
local tOnlyCD = (isCooldown and cooldown)
local isDisabled = data.disabled
if isDisabled then
isCooldown = true
end
if data.specialStatus then
local var1,var2,var3,var4,var5 = data.specialStatus(data)
if var5 then
isCooldown = true
isDisabled = true
end
if var2 then
if var1 then
isCooldown = true
lastUse = var2
t = var2 + var3
else
isCooldown = false
t = nil
if var4 then
data.charge = var2
data.cd = var3
end
end
end
data.isCharge = var4
end
self.curr_charges = nil
local isCharge = nil
if data.isCharge then
if data.charge then
if data.charge <= currTime and (data.charge+data.cd) > currTime then
isCharge = true
isCooldown = isCooldown and false
self.curr_charges = 1
elseif data.charge > currTime and not isActive then
lastUse = data.charge - data.cd
t = data.charge
tOnlyCD = t
isCooldown = true
self.curr_charges = 0
end
else
self.curr_charges = 2
end
end
if isCharge and not isActive then
self.curr_start = data.charge
self.curr_end = data.charge+data.cd
self.curr_dur = data.cd
if self.curr_dur < 1 then self.curr_dur = 1 end
if parent.optionTimeLineAnimation == 1 then
self.timeline:SetShown(false)
else
self.timeline:SetShown(true)
self.timeline:SetWidth(self.timeline.width)
end
self.timeline.SetWidth = self.timeline.IsShown --Do I really want this shit?
self.timeline.SetShown = self.timeline.IsShown
self.spark:Show()
self.anim:Play()
if not self:IsVisible() then self.anim:Pause() end
elseif t then
self.curr_start = lastUse
self.curr_end = t
self.curr_dur = t - lastUse
if self.curr_dur < 1 then self.curr_dur = 1 end
self.curr_end_cd = tOnlyCD
self.timeline.SetWidth = self.timeline._SetWidth
self.timeline.SetShown = self.timeline._SetShown
self.spark:Show()
self.anim:Play()
if not self:IsVisible() then self.anim:Pause() end
else
self.curr_start = 0
self.curr_end = 1
self.curr_dur = 1
self.curr_end_cd = 1
self.timeline.SetWidth = self.timeline._SetWidth
self.timeline.SetShown = self.timeline._SetShown
self.spark:Hide()
if self.anim:IsPlaying() then self.anim:Stop() end
if isDisabled then
self.timeline:Hide()
else
if parent.optionTimeLineAnimation == 1 then
self.timeline:Hide()
else
self.timeline:SetWidth(self.timeline.width)
self.timeline:Show()
end
end
end
local doStandartColors = true
if parent.optionSmoothAnimation and not self.afterAnimFix then
doStandartColors = false
if not parent.optionClassColorBackground then
local ctFrom, ctTo = nil
if isActive then
ctTo = parent.optionColorBackgroundActive
elseif isCooldown then
ctTo = parent.optionColorBackgroundCooldown
else
ctTo = parent.optionColorBackgroundDefault
end
if self.curr_anim_state == 1 then
ctFrom = parent.optionColorBackgroundActive
elseif self.curr_anim_state == 2 then
ctFrom = parent.optionColorBackgroundCooldown
else
ctFrom = parent.optionColorBackgroundDefault
end
self.curr_anim_b = ctFrom
self.curr_anim_b_r = ctTo.r - ctFrom.r
self.curr_anim_b_g = ctTo.g - ctFrom.g
self.curr_anim_b_b = ctTo.b - ctFrom.b
self.curr_anim_b_a = parent.optionAlphaBackground
else
self.curr_anim_b = nil
local colorTable = data.classColor
self.background:SetVertexColor(colorTable.r,colorTable.g,colorTable.b,parent.optionAlphaBackground)
end
if not parent.optionClassColorTimeLine then
local ctFrom, ctTo = nil
if isActive then
ctTo = parent.optionColorTimeLineActive
elseif isCooldown then
ctTo = parent.optionColorTimeLineCooldown
else
ctTo = parent.optionColorTimeLineDefault
end
if self.curr_anim_state == 1 then
ctFrom = parent.optionColorTimeLineActive
self.curr_anim_l_af = 1
self.curr_anim_l_a = parent.optionAlphaTimeLine - 1
elseif self.curr_anim_state == 2 then
ctFrom = parent.optionColorTimeLineCooldown
self.curr_anim_l_af = 1
self.curr_anim_l_a = parent.optionAlphaTimeLine - 1
else
ctFrom = parent.optionColorTimeLineDefault
self.curr_anim_l_af = 0
self.curr_anim_l_a = parent.optionAlphaTimeLine
end
if not parent.optionAnimation then
self.curr_anim_l_af = 0
self.curr_anim_l_a = 0
end
self.curr_anim_l = ctFrom
self.curr_anim_l_r = ctTo.r - ctFrom.r
self.curr_anim_l_g = ctTo.g - ctFrom.g
self.curr_anim_l_b = ctTo.b - ctFrom.b
else
self.curr_anim_l = data.classColor
if self.curr_anim_state == 1 then
self.curr_anim_l_af = 1
self.curr_anim_l_a = parent.optionAlphaTimeLine - 1
elseif self.curr_anim_state == 2 then
self.curr_anim_l_af = 1
self.curr_anim_l_a = parent.optionAlphaTimeLine - 1
else
self.curr_anim_l_af = 0
self.curr_anim_l_a = parent.optionAlphaTimeLine
end
if not parent.optionAnimation then
self.curr_anim_l_af = 0
self.curr_anim_l_a = 0
end
self.curr_anim_l_r = 0
self.curr_anim_l_g = 0
self.curr_anim_l_b = 0
end
if not parent.optionClassColorText then
local ctFrom, ctTo = nil
if isActive then
ctTo = parent.optionColorTextActive
elseif isCooldown then
ctTo = parent.optionColorTextCooldown
else
ctTo = parent.optionColorTextDefault
end
if self.curr_anim_state == 1 then
ctFrom = parent.optionColorTextActive
elseif self.curr_anim_state == 2 then
ctFrom = parent.optionColorTextCooldown
else
ctFrom = parent.optionColorTextDefault
end
self.curr_anim_t = ctFrom
self.curr_anim_t_r = ctTo.r - ctFrom.r
self.curr_anim_t_g = ctTo.g - ctFrom.g
self.curr_anim_t_b = ctTo.b - ctFrom.b
else
self.curr_anim_t = nil
local colorTable = data.classColor
self.textLeft:SetTextColor(colorTable.r,colorTable.g,colorTable.b)
self.textRight:SetTextColor(colorTable.r,colorTable.g,colorTable.b)
self.textCenter:SetTextColor(colorTable.r,colorTable.g,colorTable.b)
self.textIcon:SetTextColor(colorTable.r,colorTable.g,colorTable.b)
self.textIconCD:SetTextColor(colorTable.r,colorTable.g,colorTable.b)
end
if isActive and self.curr_anim_state ~= 1 then
self.curr_anim_state = 1
if self.anim_state:IsPlaying() then self.anim_state:Stop() end
self.anim_state:Play()
if not self:IsVisible() then self.anim_state:Pause() end
elseif isCooldown and self.curr_anim_state ~= 2 then
self.curr_anim_state = 2
if self.anim_state:IsPlaying() then self.anim_state:Stop() end
self.anim_state:Play()
if not self:IsVisible() then self.anim_state:Pause() end
elseif not isCooldown and not isActive and self.curr_anim_state then
self.curr_anim_state = nil
if self.anim_state:IsPlaying() then self.anim_state:Stop() end
self.anim_state:Play()
if not self:IsVisible() then self.anim_state:Pause() end
else
doStandartColors = true
end
end
if doStandartColors then
local colorTable = nil
if parent.optionClassColorBackground then
colorTable = data.classColor
else
if isActive then
colorTable = parent.optionColorBackgroundActive
elseif isCooldown then
colorTable = parent.optionColorBackgroundCooldown
else
colorTable = parent.optionColorBackgroundDefault
end
end
self.background:SetVertexColor(colorTable.r,colorTable.g,colorTable.b,parent.optionAlphaBackground)
if parent.optionClassColorTimeLine then
colorTable = data.classColor
else
if isActive then
colorTable = parent.optionColorTimeLineActive
elseif isCooldown then
colorTable = parent.optionColorTimeLineCooldown
else
colorTable = parent.optionColorTimeLineDefault
end
end
self.timeline:SetVertexColor(colorTable.r,colorTable.g,colorTable.b,parent.optionAlphaTimeLine)
if parent.optionClassColorText then
colorTable = data.classColor
else
if isActive then
colorTable = parent.optionColorTextActive
elseif isCooldown then
colorTable = parent.optionColorTextCooldown
else
colorTable = parent.optionColorTextDefault
end
end
self.textLeft:SetTextColor(colorTable.r,colorTable.g,colorTable.b)
self.textRight:SetTextColor(colorTable.r,colorTable.g,colorTable.b)
self.textCenter:SetTextColor(colorTable.r,colorTable.g,colorTable.b)
self.textIcon:SetTextColor(colorTable.r,colorTable.g,colorTable.b)
self.textIconCD:SetTextColor(colorTable.r,colorTable.g,colorTable.b)
end
self.afterAnimFix = nil
if parent.optionGray then
if isCooldown and not isActive then
self.iconTexture:SetDesaturated(true)
else
self.iconTexture:SetDesaturated(nil)
end
end
if parent.optionCooldown then
-- BIG NOTE:
-- Cooldown widget is currently bugged
-- You can set time ( CD_end_time - Now_time ) only for number that is bigger than UI session (ie after reloadUI UI session timer will be 0)
-- No way for fix :(
if isActive then
self.cooldown:Show()
self.cooldown:SetReverse(true)
self.cooldown:SetDrawSwipe(true)
self.cooldown:SetCooldown(self.curr_start,self.curr_end-self.curr_start)
self.glowStart(self.icon)
elseif isCharge then
self.cooldown:Show()
self.cooldown:SetReverse(false)
self.cooldown:SetDrawSwipe(false)
self.cooldown:SetCooldown(self.curr_start,self.curr_end-self.curr_start)
self.glowStop(self.icon)
elseif isCooldown then
self.cooldown:Show()
self.cooldown:SetReverse(false)
self.cooldown:SetDrawSwipe(true)
if isDisabled then
self.cooldown:SetCooldown(currTime,0)
else
self.cooldown:SetCooldown(self.curr_start,self.curr_dur)
end
self.glowStop(self.icon)
else
self.cooldown:Hide()
self.glowStop(self.icon)
end
else
self.glowStop(self.icon)
end
local alpha = 1
if parent.methodsAlphaNotInRange then
if data.outofrange then
alpha = parent.methodsAlphaNotInRangeNum
self:SetAlpha(alpha)
else
self:SetAlpha(1)
end
end
if (parent.optionAlphaCooldown or 1) < 1 then
if isCooldown and not isActive then
self:SetAlpha(parent.optionAlphaCooldown)
else
self:SetAlpha(alpha)
end
end
if isDisabled == 2 then
self.disStatus = L_Offline
elseif isDisabled == 1 then
self.disStatus = L_Dead
else
self.disStatus = nil
end
self:UpdateText()
if callback_upvalue_status then
FireCallback(nil,"RaidCooldowns_Bar_UpdateStatus",self)
end
end
local function BarCreateTitle(self)
local parent = self.parent
local height = parent.iconSize or 24
self.statusbar:ClearAllPoints() self.statusbar:SetHeight(height)
self.icon:ClearAllPoints() self.icon:SetSize(height,height)
self.textLeft:SetText("")
self.textLeft.text = nil
self.textRight:SetText("")
self.textRight.text = nil
self.textCenter:SetText("")
self.textCenter.text = nil
self.textIcon:SetText("")
self.textIcon.name = nil
self.textIconCD:SetText("")
if parent.optionIconPosition == 2 then
self.icon:Show()
self.statusbar:SetPoint("LEFT",self,0,0)
self.statusbar:SetPoint("RIGHT",self,-height,0)
self.icon:SetPoint("RIGHT",self,0,0)
self.textRight:SetPoint("LEFT",self,0,0)
self.textRight:SetTextColor(1,1,1)
self.textRight:SetText(self.data.spellName)
elseif parent.optionIconPosition == 1 then
self.icon:Show()
self.statusbar:SetPoint("LEFT",self,height,0)
self.statusbar:SetPoint("RIGHT",self,0,0)
self.icon:SetPoint("LEFT",self,0,0)
self.textLeft:SetTextColor(1,1,1)
self.textLeft:SetText(self.data.spellName)
end
self.curr_start = 0
self.curr_end = 1
self.curr_dur = 1
self.spark:Hide()
self.anim:Stop()
self.timeline:Hide()
self.background:SetVertexColor(0,0,0,parent.optionAlphaTimeLine)
self.iconTexture:SetTexture(self.data.icon)
self.cooldown:Hide()
self:SetAlpha(1)
self:Show()
self.isTitle = true
end
local function LineIconOnHover(self)
local parent = self:GetParent()
if not parent.data then return end
GameTooltip:SetOwner(self, "ANCHOR_LEFT")
GameTooltip:SetHyperlink("spell:"..parent.data.db[1])
GameTooltip:Show()
end
local function LineClickFrameOnHover_OnUpdate(self)
if not self:IsMouseOver() then
self:SetScript("OnUpdate",nil)
if self.IconIsHovered then
GameTooltip_Hide()
self.IconIsHovered = nil
end
return
end
local isHover = self:GetParent().icon:IsMouseOver()
if isHover and not self.IconIsHovered then
LineIconOnHover(self)
self.IconIsHovered = true
elseif not isHover and self.IconIsHovered then
GameTooltip_Hide()
self.IconIsHovered = nil
end
end
local function LineClickFrameOnHover(self)
self.IconIsHovered = nil
self:SetScript("OnUpdate",LineClickFrameOnHover_OnUpdate)
end
local function LineIconOnClick(self)
local parent = self:GetParent()
if not parent.data then return end
if parent.data.specialClick then
parent.data.specialClick(parent.data)
return
end
if (parent:GetParent().methodsLineClickMod == "shift" and not IsShiftKeyDown()) or
(parent:GetParent().methodsLineClickMod == "alt" and not IsAltKeyDown()) or
(parent:GetParent().methodsLineClickMod == "ctrl" and not IsControlKeyDown()) then
return
end
local time = parent.data.lastUse + parent.data.cd - GetTime()
if time < 0 then return end
local text = parent.data.name.." - "..parent.data.spellName..": "..format("%1.1d:%2.2d",time/60,time%60)
local chat_type = ExRT.F.chatType(true)
SendChatMessage(text,chat_type)
end
local function LineIconOnClickWhisper(self)
local parent = self:GetParent()
if not parent.data then return end
if parent.data.specialClick then
parent.data.specialClick(parent.data)
return
end
if (parent:GetParent().methodsLineClickMod == "shift" and not IsShiftKeyDown()) or
(parent:GetParent().methodsLineClickMod == "alt" and not IsAltKeyDown()) or
(parent:GetParent().methodsLineClickMod == "ctrl" and not IsControlKeyDown()) then
return
end
local time = parent.data.lastUse + parent.data.cd - GetTime()
if time > 0 then return end
local spellLink = GetSpellLink(parent.data.db[1])
if not spellLink or spellLink == "" then
spellLink = parent.data.spellName
end
local text = "Use "..spellLink
local chat_type = ExRT.F.chatType(true)
SendChatMessage(text,"WHISPER",nil,parent.data.fullName)
end
local function LineIconOnClickBoth(self)
local parent = self:GetParent()
if not parent.data then return end
local time = parent.data.lastUse + parent.data.cd - GetTime()
if time > 0 then
return LineIconOnClick(self)
else
return LineIconOnClickWhisper(self)
end
end
local function UpdateBarStyle(self)
local parent = self.parent
local width = parent.barWidth or 100
local height = parent.iconSize or 24
self:SetSize(width,height)
self.textLeft:ClearAllPoints() self.textLeft:SetSize(0,height)
self.textRight:ClearAllPoints() self.textRight:SetSize(0,height)
self.textCenter:ClearAllPoints()self.textCenter:SetSize(0,height)
self.textIcon:SetSize(height,height)
self.icon:ClearAllPoints() self.icon:SetSize(height,height)
self.statusbar:ClearAllPoints() self.statusbar:SetHeight(height)
self.spark:SetSize(10,height+10)
self.cooldown:SetSize(height,height)
local iconSize = height
if parent.optionIconPosition == 3 or parent.optionIconTitles then
self.icon:Hide()
self.statusbar:SetPoint("LEFT",self,0,0)
self.statusbar:SetPoint("RIGHT",self,0,0)
iconSize = 0
elseif parent.optionIconPosition == 2 then
self.icon:Show()
self.statusbar:SetPoint("LEFT",self,0,0)
self.statusbar:SetPoint("RIGHT",self,-height,0)
self.icon:SetPoint("RIGHT",self,0,0)
else
self.icon:Show()
self.statusbar:SetPoint("LEFT",self,height,0)
self.statusbar:SetPoint("RIGHT",self,0,0)
self.icon:SetPoint("LEFT",self,0,0)
end
self.timeline.width = width - iconSize
self.timeline:SetSize(width - iconSize,height)
if parent.optionIconHideBlizzardEdges then
self.iconTexture:SetTexCoord(.1,.9,.1,.9)
else
self.iconTexture:SetTexCoord(0,1,0,1)
end
if parent.optionHideSpark then
self.spark:SetTexture("")
else
self.spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark")
end
local fontOutlineFix = parent.fontOutline and 3 or 0
if parent.textTemplateLeft:find("time%%") then
self.textLeft:SetPoint("LEFT",self.statusbar,1,0)
self.textRight:SetPoint("RIGHT",self.statusbar,-1+fontOutlineFix,0)
self.textRight:SetPoint("LEFT",self.textLeft,"RIGHT",0,0)
self.textCenter:SetPoint("LEFT",self.textLeft,"RIGHT",0,0)
self.textCenter:SetPoint("RIGHT",self.statusbar,0,0)
elseif parent.textTemplateCenter:find("time%%") then
self.textLeft:SetPoint("LEFT",self.statusbar,1,0)
self.textRight:SetPoint("RIGHT",self.statusbar,-1+fontOutlineFix,0)
self.textCenter:SetPoint("LEFT",self.statusbar,0,0)
self.textCenter:SetPoint("RIGHT",self.statusbar,0,0)
else
self.textRight:SetPoint("RIGHT",self.statusbar,-1+fontOutlineFix,0)
self.textLeft:SetPoint("LEFT",self.statusbar,1,0)
self.textLeft:SetPoint("RIGHT",self.textRight,"LEFT",0,0)
self.textCenter:SetPoint("LEFT",self.statusbar,0,0)
self.textCenter:SetPoint("RIGHT",self.textRight,"LEFT",0,0)
end
self.barWidth = width
local textureFile = parent.textureFile or module.db.colsDefaults.textureFile
local isValidTexture = self.background:SetTexture(textureFile)
if not isValidTexture then
textureFile = module.db.colsDefaults.textureFile
self.background:SetTexture(textureFile)
end
self.timeline:SetTexture(textureFile)
local isValidFont = nil
self.textLeft:SetFont(parent.fontLeftName,parent.fontLeftSize,parent.fontLeftOutline and "OUTLINE" or "")
self.textRight:SetFont(parent.fontRightName,parent.fontRightSize,parent.fontRightOutline and "OUTLINE" or "")
self.textCenter:SetFont(parent.fontCenterName,parent.fontCenterSize,parent.fontCenterOutline and "OUTLINE" or "")
self.textIcon:SetFont(parent.fontIconName,parent.fontIconSize,parent.fontIconOutline and "OUTLINE" or "")
self.textIconCD:SetFont(parent.fontIconCDName,parent.fontIconCDSize,parent.fontIconCDOutline and "OUTLINE" or "")
local fontOffset = 0
fontOffset = parent.fontLeftShadow and 1 or 0 self.textLeft:SetShadowOffset(1*fontOffset,-1*fontOffset)
fontOffset = parent.fontRightShadow and 1 or 0 self.textRight:SetShadowOffset(1*fontOffset,-1*fontOffset)
fontOffset = parent.fontCenterShadow and 1 or 0 self.textCenter:SetShadowOffset(1*fontOffset,-1*fontOffset)
fontOffset = parent.fontIconShadow and 1 or 0 self.textIcon:SetShadowOffset(1*fontOffset,-1*fontOffset)
fontOffset = parent.fontIconCDShadow and 1 or 0 self.textIconCD:SetShadowOffset(1*fontOffset,-1*fontOffset)
local cdFont = self.cooldown:GetRegions()
cdFont:SetFont(cdFont:GetFont(),parent.fontCDSize or 16,"OUTLINE")
self.iconTexture:SetDesaturated(nil)
self:SetAlpha(1)
self.cooldown:Hide()
self.cooldown:SetHideCountdownNumbers(parent.optionCooldownHideNumbers and true or false)
self.cooldown:SetDrawEdge(parent.optionCooldownShowSwipe and true or false)
if parent.optionCooldownUseExRT or (not parent.optionCooldownHideNumbers and GetCVar("countdownForCooldowns") == "1") then
self.cooldown.noCooldownCount = true --hide OmniCC time on cooldown
else
self.cooldown.noCooldownCount = nil
end
self.textIcon:SetText("")
self.textIcon.name = nil
if parent.optionCooldownUseExRT then
self.textIconCD:Show()
else
self.textIconCD:Hide()
end
if parent.glowStop ~= self.glowStop then
self.glowStop(self.icon)
end
self.glowStart = parent.glowStart or ExRT.NULLfunc
self.glowStop = parent.glowStop or ExRT.NULLfunc
if parent.optionAnimation then
if parent.optionStyleAnimation == 1 then
self.anim:SetScript("OnLoop",BarAnimation_Reverse)
else
self.anim:SetScript("OnLoop",BarAnimation)
end
else
self.anim:SetScript("OnLoop",BarAnimation_NoAnimation)
self.spark:SetTexture("")
self.timeline:Hide()
end
if parent.methodsLineClick and parent.methodsLineClickWhisper then
self.clickFrame:SetScript("OnClick",LineIconOnClickBoth)
self.clickFrame:Show()
self.clickFrame:SetFrameLevel(9000)
elseif parent.methodsLineClick then
self.clickFrame:SetScript("OnClick",LineIconOnClick)
self.clickFrame:Show()
self.clickFrame:SetFrameLevel(9000)
elseif parent.methodsLineClickWhisper then
self.clickFrame:SetScript("OnClick",LineIconOnClickWhisper)
self.clickFrame:Show()
self.clickFrame:SetFrameLevel(9000)
else
self.clickFrame:SetScript("OnClick",nil)
self.clickFrame:Hide()
end
if parent.methodsIconTooltip then
if not self.clickFrame:IsShown() then
self.clickFrame:Show()
self.clickFrame:SetFrameLevel(9000)
end
self.clickFrame:SetScript("OnEnter",LineClickFrameOnHover)
else
self.clickFrame:SetScript("OnEnter",nil)
self.clickFrame:SetScript("OnUpdate",nil)
end
local borderSize = parent.textureBorderSize
if borderSize == 0 then
self.border.top:Hide()
self.border.bottom:Hide()
self.border.left:Hide()
self.border.right:Hide()
else
self.border.top:ClearAllPoints()
self.border.bottom:ClearAllPoints()
self.border.left:ClearAllPoints()
self.border.right:ClearAllPoints()
self.border.top:SetPoint("TOPLEFT",self,"TOPLEFT",-borderSize,borderSize)
self.border.top:SetPoint("BOTTOMRIGHT",self,"TOPRIGHT",borderSize,0)
self.border.bottom:SetPoint("BOTTOMLEFT",self,"BOTTOMLEFT",-borderSize,-borderSize)
self.border.bottom:SetPoint("TOPRIGHT",self,"BOTTOMRIGHT",borderSize,0)
self.border.left:SetPoint("TOPLEFT",self,"TOPLEFT",-borderSize,0)
self.border.left:SetPoint("BOTTOMRIGHT",self,"BOTTOMLEFT",0,0)
self.border.right:SetPoint("TOPLEFT",self,"TOPRIGHT",0,0)
self.border.right:SetPoint("BOTTOMRIGHT",self,"BOTTOMRIGHT",borderSize,0)
self.border.top:SetColorTexture(parent.textureBorderColorR,parent.textureBorderColorG,parent.textureBorderColorB,parent.textureBorderColorA)
self.border.bottom:SetColorTexture(parent.textureBorderColorR,parent.textureBorderColorG,parent.textureBorderColorB,parent.textureBorderColorA)
self.border.left:SetColorTexture(parent.textureBorderColorR,parent.textureBorderColorG,parent.textureBorderColorB,parent.textureBorderColorA)
self.border.right:SetColorTexture(parent.textureBorderColorR,parent.textureBorderColorG,parent.textureBorderColorB,parent.textureBorderColorA)
self.border.top:Show()
self.border.bottom:Show()
self.border.left:Show()
self.border.right:Show()
end
self.anim_state.timer:SetDuration(parent.optionSmoothAnimationDuration)
self.atf = nil
self.atf2 = nil
self.textLeft.text = nil
self.textRight.text = nil
self.textCenter.text = nil
self.textIcon.name = nil
if parent.Masque_Group and self.Masque_Group ~= parent.Masque_Group then
parent.Masque_Group:AddButton(self, {Icon = self.iconTexture, Cooldown = self.cooldown}, "MRT_CD_ICON", true)
self.Masque_Group = parent.Masque_Group
elseif not parent.Masque_Group and self.Masque_Group then
self.Masque_Group = nil
end
if module.db.plugin and type(module.db.plugin.UpdateBarStyle)=="function" then
module.db.plugin.UpdateBarStyle(self)
end
FireCallback(nil,"RaidCooldowns_Bar_UpdateStyle",self)
end
local function AnimationControl_Hide(self)
if self.anim:IsPlaying() then
self.anim:Pause()
end
if self.anim_state:IsPlaying() then
self.anim_state:Pause()
end
end
local function AnimationControl_Show(self)
if self.anim:IsPaused() then
self.anim:Play()
end
if self.anim_state:IsPaused() then
self.anim_state:Play()
end
end
local function AnimationControl_Play(self)
self:SetScript("OnUpdate",BarStateAnimation)
end
local function AnimationControl_Pause(self)
self:SetScript("OnUpdate",nil)
end
local function CreateBar(parent)
local self = CreateFrame("Frame",nil,parent)
self.parent = parent
local statusbar = CreateFrame("StatusBar", nil, self)
statusbar:SetPoint("TOPRIGHT")
statusbar:SetPoint("BOTTOMLEFT")
self.statusbar = statusbar
local timeline = statusbar:CreateTexture(nil, "BACKGROUND")
timeline:SetPoint("LEFT")
timeline._SetWidth = timeline.SetWidth
timeline._SetShown = timeline.SetShown
self.timeline = timeline
local spark = statusbar:CreateTexture(nil, "BACKGROUND", nil, 3)
spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark")
spark:SetBlendMode("ADD")
spark:SetPoint("CENTER",statusbar,"RIGHT", 0,0)
spark:SetAlpha(0.5)
spark:Hide()
self.spark = spark
local anim = self:CreateAnimationGroup()
anim:SetLooping("REPEAT")
anim.c = 0
anim.timer = anim:CreateAnimation()
anim.timer:SetDuration(0.05)
anim:Stop()
anim:SetScript("OnLoop",BarAnimation)
anim.bar = self
self.anim = anim
local anim_state = self:CreateAnimationGroup()
anim_state.timer = anim_state:CreateAnimation()
anim_state.timer:SetDuration(0.5)
anim_state:Stop()
--anim_state:SetScript("OnUpdate",BarStateAnimation)
anim_state:SetScript("OnPlay",AnimationControl_Play)
anim_state:SetScript("OnPause",AnimationControl_Pause)
anim_state:SetScript("OnFinished",BarStateAnimationFinished)
anim_state.bar = self
self.anim_state = anim_state
self:SetScript("OnHide",AnimationControl_Hide)
self:SetScript("OnShow",AnimationControl_Show)
local icon = CreateFrame("Frame",nil,self)
icon:SetPoint("TOPLEFT", 0, 0)
local iconTexture = icon:CreateTexture(nil, "BACKGROUND")
iconTexture:SetAllPoints()
self.icon = icon
self.iconTexture = iconTexture
local cooldown = CreateFrame("Cooldown", nil, icon, "CooldownFrameTemplate")
cooldown:SetDrawEdge(false)
--cooldown:SetAllPoints()
cooldown:SetPoint("CENTER")
cooldown:SetHideCountdownNumbers(false)
cooldown:SetDrawEdge(false)
cooldown:SetDrawSwipe(true)
self.cooldown = cooldown
local background = self:CreateTexture(nil, "BACKGROUND", nil, -7)
background:SetAllPoints()
self.background = background
self.textLeft = ELib:Text(self.statusbar,nil,nil,"GameFontNormal"):Point(1,0):Color()
self.textRight = ELib:Text(self.statusbar,nil,nil,"GameFontNormal"):Size(40,0):Point("TOPRIGHT",1,0):Right():Color()
self.textCenter = ELib:Text(self.statusbar,nil,nil,"GameFontNormal"):Point(0,0):Center():Color()
self.textIcon = ELib:Text(icon,nil,nil,"GameFontNormal"):Point(0,0):Center():Bottom():Color()
self.textIconCD = ELib:Text(cooldown,nil,nil,"GameFontNormal"):Point("CENTER"):Center():Middle():Color()
self.textIcon:SetDrawLayer("ARTWORK",3)
self.textIconCD:SetDrawLayer("ARTWORK",3)
self.glowStart = ExRT.NULLfunc
self.glowStop = ExRT.NULLfunc
--multilinetext fix
self.textLeft:SetMaxLines(1)
self.textRight:SetMaxLines(1)
self.textCenter:SetMaxLines(1)
self.border = {}
self.border.top = self:CreateTexture(nil, "BACKGROUND")
self.border.bottom = self:CreateTexture(nil, "BACKGROUND")
self.border.left = self:CreateTexture(nil, "BACKGROUND")
self.border.right = self:CreateTexture(nil, "BACKGROUND")
self.clickFrame = CreateFrame("Button",nil,self)
self.clickFrame:SetAllPoints()
self.clickFrame:Hide()
self.Stop = StopBar
self.Update = UpdateBar
self.UpdateStyle = UpdateBarStyle
self.UpdateText = BarUpdateText
self.UpdateStatus = UpdateBarStatus
self.CreateTitle = BarCreateTitle
FireCallback(nil,"RaidCooldowns_Bar_Created",self)
return self
end
module.db.debugBarFuncs = {
Stop = StopBar,
Update = UpdateBar,
UpdateStyle = UpdateBarStyle,
UpdateText = BarUpdateText,
UpdateStatus = UpdateBarStatus,
CreateTitle = BarCreateTitle,
BarAnimation = BarAnimation,
BarAnimation_Reverse = BarAnimation_Reverse,
BarAnimation_NoAnimation = BarAnimation_NoAnimation,
BarStateAnimation = BarStateAnimation,
BarStateAnimationFinished = BarStateAnimationFinished,
}
local function FixFontsOnLoad(self)
local defGameFont = GameFontWhite:GetFont()
for i=1,#self.lines do
local bar = self.lines[i]
bar.textLeft:SetFont(defGameFont,self.fontLeftSize - 1,"")
bar.textRight:SetFont(defGameFont,self.fontRightSize - 1,"")
bar.textCenter:SetFont(defGameFont,self.fontCenterSize - 1,"")
bar.textIcon:SetFont(defGameFont,self.fontIconSize - 1,"")
bar.textIconCD:SetFont(defGameFont,self.fontIconSize - 1,"")
bar:UpdateStyle()
end
return true
end
function module:CreateColumn(parent,frameName)
local columnFrame = CreateFrame("Frame",frameName,parent)
columnFrame:EnableMouse(false)
columnFrame:SetMovable(false)
columnFrame.texture = columnFrame:CreateTexture(nil, "BACKGROUND")
columnFrame.texture:SetColorTexture(0,0,0,0)
columnFrame.texture:SetAllPoints()
columnFrame.lockTexture = columnFrame:CreateTexture(nil, "BACKGROUND")
columnFrame.lockTexture:SetColorTexture(0,0,0,0)
columnFrame.lockTexture:SetAllPoints()
columnFrame.lines = {}
columnFrame.BlackList = {}
return columnFrame
end
for i=1,module.db.maxColumns do
local columnFrame = module:CreateColumn(module.frame,"MRTRaidCooldownCol"..i)
module.frame.colFrame[i] = columnFrame
columnFrame:RegisterForDrag("LeftButton")
columnFrame:SetScript("OnDragStart", function(self)
if self:IsMovable() then
self:StartMoving()
end
end)
columnFrame:SetScript("OnDragStop", function(self)
self:StopMovingOrSizing()
if self.ATFenabled then
return
end
VMRT.ExCD2.colSet[i].posX = self:GetLeft()
VMRT.ExCD2.colSet[i].posY = self:GetTop()
end)
columnFrame.colNum = i
module:RegisterHideOnPetBattle(columnFrame)
ELib:FixPreloadFont(columnFrame,FixFontsOnLoad)
end
do
local isInCombat = false
local isInEncounter = false
function module:updateCombatVisibility()
local _, zoneType = GetInstanceInfo()
local inRaid = IsInRaid()
for i=1,module.db.maxColumns do
local columnFrame = module.frame.colFrame[i]
local state = columnFrame.optionIsEnabled
if not columnFrame.methodsOnlyInCombat then
elseif isInCombat and columnFrame.optionIsEnabled then
state = state and true
elseif not isInCombat then
state = false
end
if zoneType == "arena" then
if not columnFrame.visibilityArena then
state = false
end
elseif zoneType == "party" then
if not columnFrame.visibility5ppl then
state = false
end
elseif zoneType == "pvp" then
if not columnFrame.visibilityBG then
state = false
end
elseif zoneType == "raid" then
if not columnFrame.visibilityRaid then
state = false
end
elseif zoneType == "scenario" then
if not columnFrame.visibility3ppl then
state = false
end
else
if not columnFrame.visibilityWorld then
state = false
end
end
if (columnFrame.visibilityPartyType == 2 and not inRaid) or (columnFrame.visibilityPartyType == 1 and inRaid) then
state = false
end
columnFrame:SetShown(state)
end
if not VMRT.ExCD2.SplitOpt then
if VMRT.ExCD2.colSet[module.db.maxColumns+1].methodsOnlyInCombat then
if isInCombat then
module.frame:Show()
else
module.frame:Hide()
end
elseif module.frame.IsEnabled then
module.frame:Show()
end
end
end
function module:toggleCombatVisibility(currState,callType)
local isInstance, instanceType = IsInInstance()
if instanceType == "arena" or instanceType == "pvp" then
currState = true
elseif instanceType == "raid" or instanceType == "party" then
if callType == 1 then
isInEncounter = currState
elseif callType == 2 then
currState = currState or isInEncounter
end
elseif callType == 1 then
return --ignore encounters not in raid/party
end
isInCombat = currState
module:updateCombatVisibility()
end
end
do
local lastSaving = GetTime() - 15
function SaveCDtoVar(overwrite)
local currTime = GetTime()
if ((currTime - lastSaving) < 20 and not overwrite) or module.db.testMode then
return
end
if not VMRT or not VMRT.ExCD2 then
return
end
local VMRT_ExCD2_Save = VMRT.ExCD2.Save
wipe(VMRT_ExCD2_Save)
for i=1,#_C do
local unitSpellData = _C[i]
if unitSpellData.lastUse + unitSpellData.cd - currTime > 0 then
VMRT_ExCD2_Save[ (unitSpellData.fullName or "?")..(unitSpellData.db[1] or 0) ] = {unitSpellData.lastUse,unitSpellData.cd}
else
VMRT_ExCD2_Save[ (unitSpellData.fullName or "?")..(unitSpellData.db[1] or 0) ] = nil
end
end
lastSaving = currTime
end
end
local function AfterCombatResetFunction(isArena)
if not ExRT.isClassic or ExRT.isLK then
for i=1,#_C do
local unitSpellData = _C[i]
local uSpecID = _db.specInDBase[globalGUIDs[unitSpellData.fullName] or 0]
if not unitSpellData.db[uSpecID] and unitSpellData.db[4] then
uSpecID = 4
end
if (unitSpellData.cd > 0 and (_db.spell_afterCombatReset[unitSpellData.db[1]] or (unitSpellData.db[uSpecID] and unitSpellData.db[uSpecID][2] >= (isArena and 0 or 120) or unitSpellData.cd >= (isArena and 0 or 180)))) and (not _db.spell_afterCombatNotReset[unitSpellData.db[1]] or isArena) then
unitSpellData.lastUse = 0
unitSpellData.charge = nil
if unitSpellData.specialAfterCombatReset then
unitSpellData.specialAfterCombatReset(unitSpellData)
end
if unitSpellData.bar and unitSpellData.bar.data == unitSpellData then
unitSpellData.bar:UpdateStatus()
end
end
end
end
SaveCDtoVar(true)
end
local function TestMode(h)
if not h then
for i=1,#_C do
local data = _C[i]
local uSpecID = module.db.specInDBase[VMRT.ExCD2.gnGUIDs[data.fullName] or 0]
if not data.db[uSpecID] then
uSpecID = 4
end
if data.db[uSpecID] then
if fastrandom(0,100) < 80 then
data.cd = data.db[uSpecID][2]
data.lastUse = GetTime() - fastrandom(0,data.db[uSpecID][2]) - fastrandom()
data.duration = data.db[uSpecID][3]
end
end
end
else
for i=1,#_C do
local data = _C[i]
data.lastUse = 0
data.duration = 0
end
end
UpdateAllData()
end
function module.IsPvpTalentsOn(unit)
local _, zoneType = GetInstanceInfo()
if zoneType == 'arena' or zoneType == 'pvp' then
return true
elseif (zoneType == "none" or not zoneType) and (C_PvP_IsWarModeDesired() and UnitPhaseReason(unit) ~= Enum.PhaseReason.WarMode) then
return true
else
return false
end
end
if ExRT.isClassic then
function module.IsPvpTalentsOn(unit)
return false
end
end
do
local inColsCount = {}
--Upvaules
local maxColumns = _db.maxColumns
local maxLinesInCol = _db.maxLinesInCol
local specInDBase = _db.specInDBase
local spell_isTalent = _db.spell_isTalent
local spell_isPvpTalent = _db.spell_isPvpTalent
local session_gGUIDs = _db.session_gGUIDs
local spell_runningSameTalent = _db.spell_runningSameTalent
local spell_isPetAbility = _db.spell_isPetAbility
local session_Pets = _db.session_Pets
local petsAbilities = _db.petsAbilities
local spell_talentReplaceOther = _db.spell_talentReplaceOther
local spell_charge_fix = _db.spell_charge_fix
local def_col = _db.def_col
local columnsTable = module.frame.colFrame
local _CV = {}
local _CV_Len = 0
module.db._CV = _CV
local playerName = ExRT.SDB.charName
local IsPvpTalentsOn = module.IsPvpTalentsOn
local saveDataTimer = 0
local lastBattleResChargesStatus = nil
--[[
local function sort_f(a,b)
if a.column ~= b.column then
return a.column < b.column
elseif a.sorting ~= b.sorting then
if a.rsort then
return (a.sorting or 0) > (b.sorting or 0)
else
return (a.sorting or 0) < (b.sorting or 0)
end
elseif a.rsort then
return (a.sort or 0) > (b.sort or 0)
else
return (a.sort or 0) < (b.sort or 0)
end
end
]]
local function sort_f(a,b)
if a.sorting ~= b.sorting then
return (a.sorting or 0) < (b.sorting or 0)
else
return (a.sort or 0) < (b.sort or 0)
end
end
local function rsort_f(a,b)
if a.sorting ~= b.sorting then
return (a.sorting or 0) > (b.sorting or 0)
else
return (a.sort or 0) > (b.sort or 0)
end
end
local oneSpellPerCol = {} for i=1,maxColumns do oneSpellPerCol[i]={} end
local prevLineForGUID,prevLineForGUID_wiped = {}
local reviewID = 0
local strataToStrata = {
["BACKGROUND"]="LOW",
["LOW"]="MEDIUM",
["MEDIUM"]="HIGH",
["HIGH"]="DIALOG",
["DIALOG"]="FULLSCREEN",
["FULLSCREEN"]="FULLSCREEN_DIALOG",
["FULLSCREEN_DIALOG"]="TOOLTIP",
["TOOLTIP"]="TOOLTIP",
}
local LGF = LibStub("LibGetFrame-1.0",true)
local LGFNullOpt = {}
local needReposAttached
local HiddenOnCD = {} --for "Show only without cd" option, hidden cds can't fire updateall event
local _CV_PerCol,_CV_PerCol_Count = {},{}
local _CV_ATF = {}
for i=1,maxColumns do
_CV_PerCol[i] = {}
_CV_PerCol_Count[i] = 1
end
local function SortAllData()
local currTime = GetTime()
for i=1,_CV_Len do
local data = _CV[i]
local columnFrame = columnsTable[data.column]
if columnFrame.methodsSortByAvailability then
local cd = data.lastUse + data.cd - currTime
local charge = data.charge
if data.isCharge and charge then
if charge <= currTime and (charge+data.cd) > currTime then
cd = -1
elseif charge > currTime then
cd = charge - currTime
end
end
if data.disabled then
cd = cd > 0 and cd or 49999
elseif data.disable_oncd then
cd = 49999
end
if cd > 0 then
cd = cd + 50000
end
local dur = 0
if columnFrame.methodsSortActiveToTop then
dur = data.lastUse + data.duration - currTime
if dur < 0 then
dur = 0
end
end
data.sorting = dur > 0 and dur or cd > 0 and cd or 0
if columnFrame.methodsNewSpellNewLine then
data.sorting = (data.sort2 or data.db[1]) * 100000 + data.sorting
end
else
data.sorting = 0
end
data.rsort = columnFrame.methodsReverseSorting
_CV_PerCol[data.column][ _CV_PerCol_Count[data.column] ] = data
_CV_PerCol_Count[data.column] = _CV_PerCol_Count[data.column] + 1
end
local count = 1
for i=1,maxColumns do
local CV_Col = _CV_PerCol[i]
for j=_CV_PerCol_Count[i],#CV_Col do
CV_Col[j] = nil
end
_CV_PerCol_Count[i] = 1
if columnsTable[i].ATFenabled then
local sort_func = columnsTable[i].methodsReverseSorting and rsort_f or sort_f
for k=1,#CV_Col do
if CV_Col[k] ~= 0 then
for j=2,#_CV_ATF do
_CV_ATF[j] = nil
end
local c = 1
_CV_ATF[1] = CV_Col[k]
for l=k+1,#CV_Col do
if CV_Col[l] ~= 0 and CV_Col[l].guid == CV_Col[k].guid then
c = c + 1
_CV_ATF[c] = CV_Col[l]
CV_Col[l] = 0
end
end
sort(_CV_ATF,sort_func)
for j=1,#_CV_ATF do
_CV[count] = _CV_ATF[j]
count = count + 1
end
end
end
else
sort(CV_Col,columnsTable[i].methodsReverseSorting and rsort_f or sort_f)
for j=1,#CV_Col do
_CV[count] = CV_Col[j]
count = count + 1
end
end
end
end
module.SortAllData = SortAllData
--MRT_CD_TESTMODENUM
local function TalentReplaceOtherCheck(spellID,name)
local spellData = spell_talentReplaceOther[spellID]
if type(spellData) == 'number' then
if not spell_isPvpTalent[spellData] or module.IsPvpTalentsOn(name) then
return session_gGUIDs[name][spellData]
end
else
for i=1,#spellData do
if session_gGUIDs[name][ spellData[i] ] then
return true
end
end
end
return false
end
local function IsOnCD(data)
local currTime = GetTime()
local isOnCD = not data.isCharge and (data.lastUse + data.cd) > currTime
if data.disable_oncd then
isOnCD = true
end
return isOnCD or (data.isCharge and data.charge and data.charge > currTime)
end
local function CheckAllTalents(name,list)
for i=1,#list do
if session_gGUIDs[name][ list[i] ] then
return true
end
end
end
function UpdateAllData()
reviewID = reviewID + 1
--print('UpdateAllData',GetTime())
local isTestMode = _db.testMode
local CDECol = VMRT.ExCD2.CDECol
local VMRT_CDE = VMRT.ExCD2.CDE
local currTime = GetTime()
wipe(_CV)
_CV_Len = 0
for i=1,#_C do
local data = _C[i]
local db = data.db
local name = data.fullName
local spellID = db[1]
local specID = globalGUIDs[name] or 0
local unitSpecID = specInDBase[specID] or 4
if isTestMode or (VMRT_CDE[spellID] and
(db[unitSpecID] or (not db[unitSpecID] and db[4])) and
(not spell_isTalent[spellID] or session_gGUIDs[name][spellID] or (spell_runningSameTalent[spellID] and CheckAllTalents(name,spell_runningSameTalent[spellID]))) and
(not spell_isPvpTalent[spellID] or (session_gGUIDs[name][spellID] and IsPvpTalentsOn(name))) and
(not spell_isPetAbility[spellID] or session_Pets[name] == spell_isPetAbility[spellID] or (session_Pets[name] and petsAbilities[ session_Pets[name] ] and petsAbilities[ session_Pets[name] ][1] == spell_isPetAbility[spellID]) or (type(spell_isPetAbility[spellID]) == "table" and session_Pets[name] and ExRT.F.table_find(spell_isPetAbility[spellID],session_Pets[name]))) and
(not spell_talentReplaceOther[spellID] or not TalentReplaceOtherCheck(spellID,name)) and
(not data.specialCheck or data.specialCheck(data,currTime))
) then
data.vis = true
local unitRole = data.checkRole and UnitGroupRolesAssigned(name)
local col = (data.checkRole and unitRole and CDECol[spellID..";"..unitRole]) or CDECol[spellID..";"..(unitSpecID-3)] or CDECol[spellID..";1"] or def_col[spellID..";"..(unitSpecID-3)] or def_col[spellID..";1"] or db[3] or 1
data.column = col
local forceUpdate
local isCharge = spell_charge_fix[ spellID ]
if isCharge and spell_isPvpTalent[isCharge] and not module.IsPvpTalentsOn(name) then
isCharge = false
end
if isCharge then
if session_gGUIDs[name][isCharge] then
if not data.isCharge then
forceUpdate = true
data.charge = data.lastUse
end
data.isCharge = true
isCharge = true
else
if data.isCharge then
forceUpdate = true
end
data.isCharge = nil
isCharge = nil
end
elseif data.isCharge then
data.isCharge = nil
forceUpdate = true
end
local columnFrame = columnsTable[col]
local isOnCD = not isCharge and (data.lastUse + data.cd) > currTime
if data.disable_oncd then
isOnCD = true
end
local isOnCDWithCharge = isOnCD or (isCharge and data.charge and data.charge > currTime)
if columnFrame.optionShownOnCD and not isOnCDWithCharge then
data.vis = nil
end
if columnFrame.methodsOnlyNotOnCD and isOnCDWithCharge then
data.vis = nil
HiddenOnCD[data] = true
end
if columnFrame.methodsHideOwnSpells and name == playerName then
data.vis = nil
end
local whiteList = columnFrame.WhiteList
if whiteList then
if not whiteList[data.loweredName] then
data.vis = nil
end
else
local blackList = columnFrame.BlackList
if blackList[data.loweredName] or (blackList[spellID] and blackList[spellID][data.loweredName]) then
data.vis = nil
end
end
local prevDisabledStatus = data.disabled
local isDead = status_UnitIsDead[ name ]
local isOffline = status_UnitIsDisconnected[ name ]
if (isDead or isOffline) and not columnFrame.methodsCDOnlyTime then
data.disabled = isOffline and 2 or 1
else
data.disabled = nil
end
local prevOutOfRange = data.outofrange
if status_UnitIsOutOfRange[ name ] then
data.outofrange = true
else
data.outofrange = nil
end
if columnFrame.methodsOneSpellPerCol and data.vis then
local oneSpellPerColCurr = oneSpellPerCol[col][spellID]
if not oneSpellPerColCurr then
oneSpellPerColCurr = {}
oneSpellPerCol[col][spellID] = oneSpellPerColCurr
end
local isOnCD = isOnCD or data.disabled
if oneSpellPerColCurr[1] ~= reviewID then
oneSpellPerColCurr[1] = reviewID
oneSpellPerColCurr[2] = data
oneSpellPerColCurr[3] = isOnCD
elseif oneSpellPerColCurr[3] and not isOnCD then
oneSpellPerColCurr[2].vis = nil
oneSpellPerColCurr[1] = reviewID
oneSpellPerColCurr[2] = data
oneSpellPerColCurr[3] = isOnCD
elseif data.disabled then
data.vis = nil
elseif oneSpellPerColCurr[3] and isOnCD then
local prevData = oneSpellPerColCurr[2]
if (prevData.lastUse + prevData.cd) > (data.lastUse + data.cd) then
prevData.vis = nil
oneSpellPerColCurr[1] = reviewID
oneSpellPerColCurr[2] = data
oneSpellPerColCurr[3] = isOnCD
else
data.vis = nil
end
else
data.vis = nil
end
end
local bar = data.bar
if bar and bar.data == data and (data.disabled ~= prevDisabledStatus or data.outofrange ~= prevOutOfRange or forceUpdate) then
data.bar:UpdateStatus()
end
if columnFrame.ATFenabled then
needReposAttached = true
end
_CV_Len = _CV_Len + 1
_CV[_CV_Len] = data
else
data.vis = nil
end
end
SortAllData()
end
module.UpdateAllData = UpdateAllData
local statusTimer2 = 0
local timerATFRepos = 0
local timerATFReset = 15
local ATFFrames = {}
function module:ATFFrameDataReset()
timerATFReset = 100
end
function module:timer(elapsed)
local forceUpdateAllData
if not _db.isEncounter and IsEncounterInProgress() then
_db.isEncounter = true
local _,_,difficulty = GetInstanceInfo()
if difficulty == 14 or difficulty == 15 or difficulty == 16 or difficulty == 17 or difficulty == 7 then
_db.isResurectDisabled = true
end
module:toggleCombatVisibility(true,1)
elseif _db.isEncounter and not IsEncounterInProgress() then
_db.isEncounter = nil
_db.isResurectDisabled = nil
if GetDifficultyForCooldownReset() and not module.db.disableCDresetting then
AfterCombatResetFunction()
forceUpdateAllData = true
end
module:toggleCombatVisibility(false,1)
end
---------> Check status
statusTimer2 = statusTimer2 + elapsed
if statusTimer2 > 0.25 then
statusTimer2 = 0
for i,unit in pairs(status_UnitsToCheck) do
local inRange,isRange = UnitInRange(unit)
local outOfRange = isRange and not inRange
if status_UnitIsOutOfRange[ unit ] ~= outOfRange then
forceUpdateAllData = true
status_UnitIsOutOfRange[ unit ] = outOfRange
end
local isDead = UnitIsDeadOrGhost(unit)
if isDead ~= status_UnitIsDead[ unit ] then
forceUpdateAllData = true
status_UnitIsDead[ unit ] = isDead
end
local isOffline = not UnitIsConnected(unit)
if isOffline ~= status_UnitIsDisconnected[ unit ] then
forceUpdateAllData = true
status_UnitIsDisconnected[ unit ] = isOffline
end
end
local charges,_,started,duration = GetSpellCharges(20484)
if charges ~= lastBattleResChargesStatus then
local charge = nil
if charges then
if charges > 0 then
charge = started
started = 0
end
else
started = 0
duration = 0
charge = nil
end
for i=1,_CV_Len do
local data = _CV[i]
if module.db.spell_battleRes[ data.db[1] ] then
data.lastUse = started
data.cd = duration
data.charge = charge
local bar = data.bar
if bar and bar.data == data then
bar:UpdateStatus()
end
end
end
forceUpdateAllData = true
if charges and lastBattleResChargesStatus and charges < lastBattleResChargesStatus then --Add resurrect to history
module.db.historyUsage[#module.db.historyUsage + 1] = {time(),20484,"*",GetEncounterTime()}
end
lastBattleResChargesStatus = charges
end
for data in pairs(HiddenOnCD) do
if not IsOnCD(data) then
forceUpdateAllData = true
HiddenOnCD[data] = nil
end
end
end
if forceUpdateAllData then
UpdateAllData()
end
for i=1,maxColumns do
inColsCount[i] = 0
columnsTable[i].lastSpell = nil
end
for i=1,_CV_Len do
local data = _CV[i]
if data.vis then
local col = data.column
local numberInCol = inColsCount[col] + 1
local barParent = columnsTable[col]
if numberInCol <= barParent.optionLinesMax then
local spellID = data.db[1]
if barParent.methodsNewSpellNewLine and barParent.lastSpell ~= spellID then
local fix = 0
for j=numberInCol,maxLinesInCol do
local bar_now = barParent.lines[numberInCol + fix]
if bar_now then
if bar_now.IsNewLine then
break
else
if bar_now.data then
bar_now.data = nil
bar_now:Update()
end
fix = fix + 1
end
end
end
numberInCol = numberInCol + fix
end
if barParent.optionIconTitles and barParent.lastSpell ~= spellID then
local bar = barParent.lines[numberInCol]
if bar and (bar.data ~= data or not bar.isTitle) then
bar.data = data
bar:CreateTitle()
end
numberInCol = numberInCol + 1
end
if barParent.methodsNewSpellNewLine and barParent.optionIconTitles and barParent.frameColumns > 1 and barParent.lastSpell == spellID then
local bar_now = barParent.lines[numberInCol]
if bar_now and bar_now.IsNewLine then
if bar_now.data then
bar_now.data = nil
bar_now:Update()
end
numberInCol = numberInCol + 1
end
end
barParent.lastSpell = spellID
inColsCount[col] = numberInCol
local bar = barParent.lines[numberInCol]
if bar and bar.data ~= data then
bar.data = data
data.bar = bar
bar:Update()
bar:UpdateStatus()
end
end
end
end
timerATFRepos = timerATFRepos + elapsed
local ATFProcess
if timerATFRepos > 1 or needReposAttached then
timerATFRepos = 0
needReposAttached = false
if LGF then
ATFProcess = true
end
end
--Reset data for predefined
timerATFReset = timerATFReset + elapsed
if timerATFReset > 20 then
timerATFReset = 0
for _,v in pairs(ATFFrames) do
wipe(v)
end
end
for i=1,maxColumns do
local col = columnsTable[i]
if col.IsColumnEnabled then
local start = inColsCount[i]
if start > col.optionLinesMax then
start = col.optionLinesMax
end
for j=start+1,col.NumberLastLinesActive do
local bar = col.lines[j]
if bar and bar.data then
bar.data = nil
bar:Update()
end
end
col.NumberLastLinesActive = start
if ATFProcess and col.ATFenabled then
prevLineForGUID_wiped = nil
for j=1,start do
local bar = col.lines[j]
if bar.data then
local guid = bar.data.guid or "unk"
local optList = col.ATFFramePrior or LGFNullOpt
if not ATFFrames[optList] then
ATFFrames[optList] = {}
end
local frame = ATFFrames[optList][guid]
if not frame then
--Try to find frame or set 0 to skip calls for players not on frames (i.e. 6-8 groups)
--Reset db every 20 sec or 1 sec after GROUP_ROSTER_UPDATE
frame = LGF.GetFrame(guid, optList) or 0
ATFFrames[optList][guid] = frame
end
if frame ~= 0 then
if not prevLineForGUID_wiped then
prevLineForGUID_wiped = true
wipe(prevLineForGUID)
end
local prevBar = prevLineForGUID[guid]
if prevBar then
bar.ATFcounter = prevBar.ATFcounter + 1
if bar.ATFcounter > col.ATFMax then
if bar.atf ~= 0 then
bar:ClearAllPoints()
bar:SetPoint("RIGHT",UIParent,"LEFT",-2000,0)
bar.atf = 0
end
elseif (bar.ATFcounter - 1) % col.ATFCol == 0 then
if bar.atf ~= 1 or bar.atf2 ~= prevBar.ATFPrevLine then
bar:ClearAllPoints()
bar:SetPoint(col.ATFPointLine1,prevBar.ATFPrevLine,col.ATFPointLine2,0,col.ATFBetweenLinesLine)
bar.atf = 1
bar.atf2 = prevBar.ATFPrevLine
end
bar.ATFPrevLine = bar
else
if bar.atf ~= 2 or bar.atf2 ~= prevBar then
bar:ClearAllPoints()
bar:SetPoint(col.ATFPointCol1,prevBar,col.ATFPointCol2,col.ATFBetweenLinesCol,0)
bar.atf = 2
bar.atf2 = prevBar
end
bar.ATFPrevLine = prevBar.ATFPrevLine
end
else
bar.ATFcounter = 1
if bar.atf ~= 3 or bar.atf2 ~= frame then
bar:ClearAllPoints()
bar:SetPoint(col.ATFPoint1,frame,col.ATFPoint2,col.ATFOffsetX,col.ATFOffsetY)
bar.atf = 3
bar.atf2 = frame
end
bar.ATFPrevLine = bar
end
prevLineForGUID[guid] = bar
if col.autoStrata then
local strata = frame:GetFrameStrata()
if strata ~= col.FrameStrata then
col:SetFrameStrata(strataToStrata[strata] or strata)
col.FrameStrata = strata
end
end
else
if bar.atf ~= 0 then
bar:ClearAllPoints()
bar:SetPoint("RIGHT",UIParent,"LEFT",-2000,0)
bar.atf = 0
end
end
end
end
end
end
end
saveDataTimer = saveDataTimer + elapsed
if saveDataTimer > 2 then
saveDataTimer = saveDataTimer % 2
SaveCDtoVar()
end
end
end
local function GetNumGroupMembersFix()
local n = GetNumGroupMembers() or 0
if module.db.testMode then
return 20
elseif n == 0 and VMRT.ExCD2.NoRaid then
return 1
else
return n
end
end
local function GetRaidRosterInfoFix(j)
local name, rank, subgroup, level, class, classFileName, zone, online, isDead, role, isML = GetRaidRosterInfo(j)
if j == 1 and not name and VMRT.ExCD2.NoRaid then
name = UnitName("player")
class,classFileName = UnitClass("player")
local _,race = UnitRace("player")
level = UnitLevel("player")
isDead = UnitIsDeadOrGhost("player")
return name,1,classFileName,level,race,true,isDead
elseif not module.db.testMode then
local _,race = UnitRace(name or "?")
return name,subgroup,classFileName,level,race,online,isDead
elseif module.db.testMode then
if name then
local _,race = UnitRace(name)
return name,subgroup,classFileName,level,race,online,isDead
end
local i = math.random(1,11)
local namesList = {}
for unitName, specID in pairs(VMRT.ExCD2.gnGUIDs) do
namesList[#namesList+1] = {unitName}
for className, classSpecs in pairs(module.db.specByClass) do
if ExRT.F.table_find(module.db.classNames,className) then --prevent error at version without DH class
for spec_i=1,#classSpecs do
if classSpecs[spec_i] == specID then
namesList[#namesList][2] = className
end
end
end
end
end
if #namesList == 0 or #namesList < 25 then
name = L.classLocalizate[module.db.classNames[i]]..tostring(j)
classFileName = module.db.classNames[i]
else
i = math.random(1,#namesList)
name = namesList[i][1]
classFileName = namesList[i][2]
end
return name,1,classFileName,100,nil,true,false
end
end
local function RaidResurrectSpecialCheck()
local _,_,difficulty = GetInstanceInfo()
if difficulty == 14 or difficulty == 15 or difficulty == 16 or difficulty == 7 or difficulty == 17 or difficulty == 8 then
return true
end
end
local function RaidResurrectSpecialText()
local charges, maxCharges, started, duration = GetSpellCharges(20484)
if (charges or 0) > 1 then
return " ("..charges..")"
end
end
local function RaidResurrectSpecialStatus()
local charges, maxCharges, started, duration = GetSpellCharges(20484)
if charges then
if charges > 0 then
return false,started,duration,true
elseif started and started > 0 then
return true,started,duration,false
end
end
end
local function StartAfterCombat_SpecialStatus(data)
if data.disable_oncd then
return true,0,0,nil,true
end
end
local function StartAfterCombat_SpecialStart(data)
if data.disable_ticker then
data.disable_ticker:Cancel()
data.disable_ticker = nil
data.disable_oncd = nil
end
if UnitAffectingCombat(data.fullName) then
data.disable_oncd = true
data.disable_ticker = C_Timer.NewTicker(1,function(self)
if not UnitAffectingCombat(data.fullName) then
self.count = (self.count or 0) + 1
end
if self.count and self.count >= 3 then
self:Cancel()
data.disable_ticker = nil
data.disable_oncd = nil
data.lastUse = GetTime()
if data.bar and data.bar.data == data then
data.bar:UpdateStatus()
end
end
end)
end
end
local function StartAfterCombat_SpecialAfterCombatReset(data)
if data.disable_ticker then
data.disable_ticker:Cancel()
data.disable_ticker = nil
data.disable_oncd = nil
end
end
local lineFuncs = {
ChangeCD = function(line,time,delayUpdate)
line.cd = line.cd + time
if line.cd < 0 then
line.cd = 0
end
if line.bar and line.bar.data == line then
line.bar:UpdateStatus()
end
if not delayUpdate then
UpdateAllData()
end
end,
ReduceCD = function(line,time,delayUpdate)
line.lastUse = line.lastUse - time
if line.charge then
line.charge = line.charge - time
end
if time > 0 then
line.duration = line.duration + time
end
if line.bar and line.bar.data == line then
line.bar:UpdateStatus()
end
if not delayUpdate then
UpdateAllData()
end
end,
SetCD = function(line,time,delayUpdate)
line.cd = time
if line.cd < 0 then
line.cd = 0
end
if line.bar and line.bar.data == line then
line.bar:UpdateStatus()
end
if not delayUpdate then
UpdateAllData()
end
end,
SetCDSynq = function(line,time,delayUpdate)
if time == 0 then
return line:ResetCD(delayUpdate)
end
local new = GetTime() - line.cd + time
if not line.lastUse or abs(line.lastUse - new) > 1 then
line.lastUse = new
end
if line.bar and line.bar.data == line then
line.bar:UpdateStatus()
end
if not delayUpdate then
UpdateAllData()
end
end,
ModCD = function(line,modVal,delayUpdate)
if type(modVal) == "number" then
line.cd = line.cd + modVal
elseif type(modVal) == "string" then
line.cd = line.cd * tonumber( modVal:sub(2) )
end
if line.cd < 0 then
line.cd = 0
end
if line.bar and line.bar.data == line then
line.bar:UpdateStatus()
end
if not delayUpdate then
UpdateAllData()
end
end,
ResetCD = function(line,delayUpdate)
line.lastUse = 0
if line.charge then
line.charge = 0
end
if line.bar and line.bar.data == line then
line.bar:UpdateStatus()
end
if not delayUpdate then
UpdateAllData()
end
end,
ChangeDur = function(line,time,delayUpdate)
line.duration = line.duration + time
if line.duration < 0 then
line.duration = 0
end
if line.bar and line.bar.data == line then
line.bar:UpdateStatus()
end
if not delayUpdate then
UpdateAllData()
end
end,
SetDur = function(line,time,delayUpdate)
line.duration = time
if line.duration < 0 then
line.duration = 0
end
if line.bar and line.bar.data == line then
line.bar:UpdateStatus()
end
if not delayUpdate then
UpdateAllData()
end
end,
}
local function UpdateRoster()
wipe(status_UnitsToCheck)
wipe(status_UnitIsDead)
wipe(status_UnitIsDisconnected)
wipe(status_UnitIsOutOfRange)
wipe(_db.vars.isHunter)
wipe(_db.vars.isWarlock)
wipe(_db.vars.isRogue)
wipe(_db.vars.isPaladin)
wipe(_db.vars.isMage)
local n = GetNumGroupMembersFix()
if n > 0 then
local priorCounter = 0
local priorNamesToNumber = {}
if not _db.testMode then
for j=1,n do
local name = GetRaidRosterInfoFix(j)
if name then
priorNamesToNumber[#priorNamesToNumber + 1] = name
end
end
sort(priorNamesToNumber)
end
local classColorsTable = type(CUSTOM_CLASS_COLORS)=="table" and CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS
for i=1,#_C do _C[i].sort = nil end
local gMax = GetRaidDiffMaxGroup()
local isInRaid = IsInRaid()
for j=1,n do
local name,subgroup,class,level,race,online,isDead = GetRaidRosterInfoFix(j)
if name and subgroup <= gMax then
for i,spellData in ipairs(_db.spellDB) do
local SpellID = spellData[1]
local AddThisSpell = true
if level < 60 or ExRT.isLK then
local spellLevel = GetSpellLevelLearned(SpellID)
if level < (spellLevel or 0) then
AddThisSpell = false
end
end
if _db.spell_isRacial[ SpellID ] and race ~= _db.spell_isRacial[ SpellID ] then
AddThisSpell = false
end
if not GetSpellInfo(SpellID) then --non exist, removed spells
AddThisSpell = false
end
local spellClass,spellClass2 = strsplit(",",spellData[2])
if spellClass == "COVENANTS" then
spellClass = spellClass2
end
if not ExRT.GDB.ClassID[spellClass] and spellClass ~= "NO" then
spellClass = "ALL"
end
if AddThisSpell and (spellClass == class or spellClass == "ALL") and (not spellData.specialCheck or spellData.specialCheck(SpellID,name,class,race)) then
if not ExRT.F.table_find(status_UnitsToCheck,name) then
status_UnitsToCheck[#status_UnitsToCheck + 1] = name
status_UnitIsDead[ name ] = isDead
status_UnitIsDisconnected[ name ] = not online
local inRange,isRange = UnitInRange(name)
status_UnitIsOutOfRange[ name ] = isRange and not inRange
end
module:AddCLEUSpellDamage(SpellID)
local alreadyInCds = nil
priorCounter = priorCounter + 1
local _specID = globalGUIDs[name] or 0
local uSpecID = _db.specInDBase[_specID] or 4
local spellColumn = VMRT.ExCD2.CDECol[SpellID..";"..(uSpecID-3)] or VMRT.ExCD2.CDECol[SpellID..";1"] or _db.def_col[SpellID..";"..(uSpecID-3)] or _db.def_col[SpellID..";1"] or spellData[3] or 1
local checkRaidRole = (VMRT.ExCD2.CDECol[SpellID..";HEALER"] or VMRT.ExCD2.CDECol[SpellID..";TANK"] or VMRT.ExCD2.CDECol[SpellID..";DAMAGER"]) and true or false
local getSpellColumn = module.frame.colFrame[spellColumn]
local prior = nil
--[[
1: 00AABBBBBBCCDDDD
2: 00AACCBBBBBBDDDD
3: AAEEBBBBBBCCDDDD
4: AAEECCBBBBBBDDDD
5: 00CCAABBBBBBDDDD
6: EEAACCBBBBBBDDDD
A - priority
B - spell ID
C - name
D - priority counter
E - classID
]]
if not getSpellColumn or getSpellColumn.methodsSortingRules == 1 then
prior = (VMRT.ExCD2.Priority[SpellID] or 50) * 1000000000000 + (SpellID or 0) * 1000000 + (ExRT.F.table_find(priorNamesToNumber,name) or 0) * 10000 + priorCounter
elseif getSpellColumn.methodsSortingRules == 2 then
prior = (VMRT.ExCD2.Priority[SpellID] or 50) * 1000000000000 + (ExRT.F.table_find(priorNamesToNumber,name) or 0) * 10000000000 + (SpellID or 0) * 10000 + priorCounter
elseif getSpellColumn.methodsSortingRules == 3 then
prior = (VMRT.ExCD2.Priority[SpellID] or 50) * 100000000000000 + (ExRT.F.table_find(_db.classNames,class) or 0) * 1000000000000 + (SpellID or 0) * 1000000 + (ExRT.F.table_find(priorNamesToNumber,name) or 0) * 10000 + priorCounter
elseif getSpellColumn.methodsSortingRules == 4 then
prior = (VMRT.ExCD2.Priority[SpellID] or 50) * 100000000000000 + (ExRT.F.table_find(_db.classNames,class) or 0) * 1000000000000 + (ExRT.F.table_find(priorNamesToNumber,name) or 0) * 10000000000 + (SpellID or 0) * 10000 + priorCounter
elseif getSpellColumn.methodsSortingRules == 5 then
prior = (ExRT.F.table_find(priorNamesToNumber,name) or 0) * 1000000000000 + (VMRT.ExCD2.Priority[SpellID] or 50) * 10000000000 + (SpellID or 0) * 10000 + priorCounter
elseif getSpellColumn.methodsSortingRules == 6 then
prior = (ExRT.F.table_find(_db.classNames,class) or 0) * 100000000000000 + (VMRT.ExCD2.Priority[SpellID] or 50) * 1000000000000 + (ExRT.F.table_find(priorNamesToNumber,name) or 0) * 10000000000 + (SpellID or 0) * 10000 + priorCounter
end
local secondPrior = (VMRT.ExCD2.Priority[SpellID] or 50) * 1000000 + (SpellID or 0) --used in columns with option 'new spell - new line'
local sName = format("%s%d",name or "?",SpellID or 0)
local lastUse,nowCd = 0,0
if VMRT.ExCD2.Save[sName] and NumberInRange(VMRT.ExCD2.Save[sName][1] + VMRT.ExCD2.Save[sName][2] - GetTime(),0,2000,false,true) then
lastUse,nowCd = VMRT.ExCD2.Save[sName][1],VMRT.ExCD2.Save[sName][2]
end
local spellName,_,spellTexture = GetSpellInfo(SpellID)
spellTexture = spellTexture or "Interface\\Icons\\INV_MISC_QUESTIONMARK"
spellName = spellName or "unk"
local shownName = DelUnitNameServer(name)
if _db.differentIcons[SpellID] then
spellTexture = _db.differentIcons[SpellID]
end
for l=4,8 do
if spellData[l] then
local h = (ExRT.isClassic and not ExRT.isCata) and _db.cdsNav[name][GetSpellInfo(spellData[l][1])] or _db.cdsNav[name][spellData[l][1]]
if h then
h.db = spellData
if lastUse ~= 0 and nowCd ~= 0 and h.lastUse == 0 and h.cd == 0 then
h.cd = nowCd
h.lastUse = lastUse
end
h.sort = prior
h.sort2 = secondPrior
h.spellName = spellName
h.icon = spellTexture
h.column = spellColumn
h.guid = h.guid or UnitGUID(name)
h.checkRole = checkRaidRole
alreadyInCds = true
if spellClass == "WARLOCK" and h.guid then
_db.vars.isWarlock[h.guid] = true
elseif spellClass == "ROGUE" and h.guid then
_db.vars.isRogue[h.guid] = true
elseif spellClass == "PALADIN" and h.guid then
_db.vars.isPaladin[h.guid] = true
elseif spellClass == "MAGE" and h.guid then
_db.vars.isMage[h.guid] = true
elseif spellClass == "HUNTER" and h.guid then
_db.vars.isHunter[h.guid] = true
end
end
end
end
if not alreadyInCds then
local guid = UnitGUID(name)
if _db.testMode and not guid then
guid = name
end
local new = {
name = shownName,
fullName = name,
loweredName = shownName:lower(),
icon = spellTexture,
spellName = spellName,
db = spellData,
lastUse = lastUse,
cd = nowCd,
duration = 0,
classColor = classColorsTable[class] or _db.notAClass,
sort = prior,
sort2 = secondPrior,
column = spellColumn,
guid = guid,
checkRole = checkRaidRole,
}
_C [#_C + 1] = new
if
SpellID == 323436 or --Kyrian pot
SpellID == 6262 --Healthstone
then
new.specialStatus = StartAfterCombat_SpecialStatus
new.specialStart = StartAfterCombat_SpecialStart
new.specialAfterCombatReset = StartAfterCombat_SpecialAfterCombatReset
end
if spellClass == "WARLOCK" and guid then
_db.vars.isWarlock[guid] = true
elseif spellClass == "ROGUE" and guid then
_db.vars.isRogue[guid] = true
elseif spellClass == "PALADIN" and guid then
_db.vars.isPaladin[guid] = true
elseif spellClass == "MAGE" and guid then
_db.vars.isMage[guid] = true
elseif spellClass == "HUNTER" and guid then
_db.vars.isHunter[guid] = true
end
end
end
end
_db.session_gGUIDs[name] = 1
if isInRaid then
module.main:UNIT_PET("raid"..j)
end
end
end
--WOD Raid resurrect
if not ExRT.isClassic then
local findResSpell = ExRT.F.table_find(_db.spellDB,161642,1)
if findResSpell then
local spellData = _db.spellDB[findResSpell]
local h = _db.cdsNav["*"][spellData[4][1]]
local prior = 0
priorCounter = priorCounter + 1
local spellColumn = VMRT.ExCD2.CDECol["161642;1"] or _db.def_col["161642;1"] or spellData[3] or 1
local getSpellColumn = module.frame.colFrame[spellColumn]
if not getSpellColumn or getSpellColumn.methodsSortingRules == 1 then
prior = (VMRT.ExCD2.Priority[161642] or 50) * 1000000000000 + 161642 * 1000000 + priorCounter
elseif getSpellColumn.methodsSortingRules == 2 then
prior = (VMRT.ExCD2.Priority[161642] or 50) * 1000000000000 + 161642 * 10000 + priorCounter
elseif getSpellColumn.methodsSortingRules == 3 then
prior = (VMRT.ExCD2.Priority[161642] or 50) * 100000000000000 + 161642 * 1000000 + priorCounter
elseif getSpellColumn.methodsSortingRules == 4 then
prior = (VMRT.ExCD2.Priority[161642] or 50) * 100000000000000 + 161642 * 10000 + priorCounter
elseif getSpellColumn.methodsSortingRules == 5 then
prior = (VMRT.ExCD2.Priority[161642] or 50) * 10000000000 + 161642 * 10000 + priorCounter
elseif getSpellColumn.methodsSortingRules == 6 then
prior = (VMRT.ExCD2.Priority[161642] or 50) * 1000000000000 + 161642 * 10000 + priorCounter
end
local secondPrior = (VMRT.ExCD2.Priority[161642] or 50) * 1000000 + (161642 or 0)
if not h then
local spellName,_,spellTexture = GetSpellInfo(spellData[1])
_C [#_C + 1] = {
name = L.cd2Resurrect,
fullName = "*",
loweredName = "*",
icon = spellTexture,
spellName = spellName or "unk",
db = spellData,
lastUse = 0,
cd = 0,
duration = 0,
classColor = _db.notAClass,
sort = prior,
sort2 = secondPrior,
column = spellColumn,
specialCheck = RaidResurrectSpecialCheck,
specialAddText = RaidResurrectSpecialText,
specialStatus = RaidResurrectSpecialStatus,
}
else
h.sort = prior
h.sort2 = secondPrior
h.column = spellColumn
end
_db.session_gGUIDs["*"] = 1
end
end
cdsNav_wipe()
local pluginFunc = module.db.plugin and type(module.db.plugin.UpdateRoster)=="function" and module.db.plugin.UpdateRoster
local j = 0
for i=1,#_C do
j = j + 1
local line = _C[j]
if not line then
break
elseif not line.sort then
tremove(_C,j)
j = j - 1
else
for k,v in pairs(lineFuncs) do
line[k] = v
end
cdsNav_set(line.fullName,line.db[1],line)
for l=4,8 do
if line.db[l] then
cdsNav_set(line.fullName,line.db[l][1],line)
end
end
if pluginFunc then
pluginFunc(line)
end
end
end
else
wipe(_C)
cdsNav_wipe()
end
if module.db.testMode then
TestMode()
for i=1,2 do
local offline = status_UnitsToCheck[fastrandom(1,#status_UnitsToCheck)]
status_UnitIsDisconnected[offline] = true
local dead = status_UnitsToCheck[fastrandom(1,#status_UnitsToCheck)]
status_UnitIsDead[dead] = true
end
for j=#status_UnitsToCheck,1,-1 do
if not UnitName(status_UnitsToCheck[j]) then
tremove(status_UnitsToCheck, j)
end
end
for i=#_C,1,-1 do
local col = _C[i].column
if not (module.frame.colFrame[col] and module.frame.colFrame[col]:IsShown()) then
tremove(_C, i)
end
end
local testModeMax = MRT_CD_TESTMODENUM or 300
while #_C > testModeMax do
tremove(_C, math.random(1,#_C))
end
end
UpdateAllData()
end
module.UpdateRoster = UpdateRoster
do
local function DispellSchedule(data)
if not _db.spell_dispellsFix[ data.fullName ] then
data:SetCD(0)
end
_db.spell_dispellsFix[ data.fullName ] = nil
end
local function IsAuraActive(unit,spellID)
for i=1,60 do
local auraData = C_UnitAuras_GetAuraDataByIndex(unit,i)
if not auraData then
return
elseif spellID == auraData.spellId then
return true
end
end
end
function CLEUstartCD(i,targetName)
local currTime = GetTime()
local data = nil
if type(i) == "table" then
data = i
else
data = _C[i]
end
local fullName = data.fullName
local uSpecID = _db.specInDBase[globalGUIDs[fullName] or 0]
if not data.db[uSpecID] and not data.db[4] then
return
elseif not data.db[uSpecID] then
uSpecID = 4
end
local spellID = data.db[uSpecID][1]
--Raid Battle Res
if _db.spell_battleRes[spellID] and _db.isResurectDisabled then
return
end
--Ignore same use
if _db.spellIgnoreAfterFirstUse[spellID] and data.lastUse then
local t = _db.spellIgnoreAfterFirstUse[spellID]
if currTime - data.lastUse <= t then
return
end
end
data.targetName = targetName
data.cd = data.db[uSpecID][2]
data.duration = data.db[uSpecID][3]
--Talents / Glyphs
local durationTable = _db.spell_durationByTalent_fix[spellID]
if durationTable then
for j=1,#durationTable,2 do
local talentSpellID = durationTable[j]
local session_gGUID = _db.session_gGUIDs[fullName][talentSpellID]
if session_gGUID and (not _db.spell_isPvpTalent[talentSpellID] or module.IsPvpTalentsOn(fullName)) then
local timeReduce = durationTable[j+1]
if type(timeReduce) == 'table' and ExRT.isClassic then
local talent_rank = _db.talent_classic_rank[fullName][talentSpellID] or #timeReduce
timeReduce = timeReduce[talent_rank] or timeReduce[1]
elseif type(timeReduce) == 'table' and #timeReduce <= 5 then
local talent_rank = _db.talent_classic_rank[fullName][talentSpellID] or #timeReduce
timeReduce = timeReduce[talent_rank] or timeReduce[#timeReduce]
elseif type(timeReduce) == 'table' then
local soulbind_rank = _db.soulbind_rank[fullName][talentSpellID] or SOULBIND_DEF_RANK_NOW
timeReduce = timeReduce[soulbind_rank]
end
local mod = type(session_gGUID) == "table" and session_gGUID[1] or 1
if tonumber(timeReduce) then
data.duration = data.duration + timeReduce * mod
else
local timeFix = tonumber( string.sub( timeReduce, 2 ) )
data.duration = data.duration * timeFix * mod
end
end
end
end
local cdTable = _db.spell_cdByTalent_fix[spellID]
if cdTable then
for j=1,#cdTable,2 do
local talentSpellID = cdTable[j]
local passSpecCheck = true
if type(talentSpellID) == "table" then
local specReduceCD = talentSpellID[2]
if (not specReduceCD or (specReduceCD < 0 and globalGUIDs[fullName] ~= specReduceCD or globalGUIDs[fullName] == specReduceCD)) then
passSpecCheck = true
else
passSpecCheck = false
end
talentSpellID = talentSpellID[1]
end
local session_gGUID = _db.session_gGUIDs[fullName][talentSpellID]
if session_gGUID and passSpecCheck and (not _db.spell_isPvpTalent[talentSpellID] or module.IsPvpTalentsOn(fullName)) then
local timeReduce
if _db.spell_cdByTalent_isScalable[talentSpellID] then
local scale_data = _db.spell_cdByTalent_scalable_data[talentSpellID]
timeReduce = scale_data[fullName] or scale_data[1]
else
timeReduce = cdTable[j+1]
if type(timeReduce) == 'table' and ExRT.isClassic then
local talent_rank = _db.talent_classic_rank[fullName][talentSpellID] or #timeReduce
timeReduce = timeReduce[talent_rank] or timeReduce[1]
elseif type(timeReduce) == 'table' and #timeReduce <= 5 then
if type(timeReduce[2]) == "number" and timeReduce[2] > 1000 then
if IsAuraActive(fullName,timeReduce[2]) then
timeReduce = timeReduce[1]
if type(timeReduce[3]) == "number" then
if module.db.talent_entries[fullName][ timeReduce[3] ] then
timeReduce = timeReduce[1]
else
timeReduce = 0
end
end
else
timeReduce = 0
end
else
local talent_rank = _db.talent_classic_rank[fullName][talentSpellID] or #timeReduce
timeReduce = timeReduce[talent_rank] or timeReduce[#timeReduce]
end
elseif type(timeReduce) == 'table' then
local soulbind_rank = _db.soulbind_rank[fullName][talentSpellID] or SOULBIND_DEF_RANK_NOW
timeReduce = timeReduce[soulbind_rank]
end
end
local mod = type(session_gGUID) == "table" and session_gGUID[1] or 1
if tonumber(timeReduce) then
data.cd = data.cd + timeReduce * mod
else
local timeFix = tonumber( string.sub( timeReduce, 2 ) )
data.cd = data.cd * timeFix * mod
end
end
end
end
local cdAura = _db.spell_reduceCdByAura[spellID]
if cdAura then
for j=1,#cdAura,2 do
local auraID = cdAura[j]
if type(auraID) == "table" then
if _db.session_gGUIDs[fullName][ auraID[2] ] and (not _db.spell_isPvpTalent[ auraID[2] ] or module.IsPvpTalentsOn(fullName)) then
auraID = auraID[1]
else
auraID = nil
end
end
if auraID and IsAuraActive(fullName,auraID) then
local timeReduce = cdAura[j+1]
if tonumber(timeReduce) then
data.cd = data.cd + timeReduce
else
local timeFix = tonumber( string.sub( timeReduce, 2 ) )
data.cd = data.cd * timeFix
end
end
end
end
--Charges
local isCharge = _db.spell_charge_fix[ data.db[1] ]
if isCharge and _db.spell_isPvpTalent[isCharge] and not module.IsPvpTalentsOn(fullName) then
isCharge = false
end
if isCharge and (data.lastUse+data.cd) >= currTime then
data.charge = (data.charge or data.lastUse) + data.cd
data.lastUse = currTime
_db.session_gGUIDs[fullName] = isCharge
elseif isCharge and _db.session_gGUIDs[fullName][isCharge] then
data.charge = currTime
data.lastUse = currTime
else
data.lastUse = currTime
end
--Haste/Readiness
if _db.spell_speed_list[spellID] then
data.duration = data.duration / (1 + (UnitSpellHaste(fullName) or 0) /100)
end
if _db.spell_reduceCdByHaste[spellID] then
data.cd = data.cd / (1 + (UnitSpellHaste(fullName) or 0) /100)
end
--Dispels
if _db.spell_dispellsList[spellID] then
ScheduleTimer(DispellSchedule, 0.5, data)
end
-- Fixes
if data.cd > 45000 then data.cd = 45000 end
if data.duration > 45000 then data.duration = 45000 end
if data.specialStart then
data.specialStart(data)
end
if data.bar and data.bar.data == data then
data.bar:UpdateStatus()
end
UpdateAllData()
_db.historyUsage[#_db.historyUsage + 1] = {time(),data.db[uSpecID][1],fullName,GetEncounterTime()}
end
module.CLEUstartCD = CLEUstartCD
end
do
local IGNORE_PROFILE_KEYS = {
["Profiles"] = true,
}
function module:SaveCurrentProfiletoDB()
local profileName = VMRT.ExCD2.Profiles.Now
local saveDB = {}
VMRT.ExCD2.Profiles.List[ profileName ] = saveDB
for key,val in pairs(VMRT.ExCD2) do
if not IGNORE_PROFILE_KEYS[key] then
if type(val) == "table" then
saveDB[key] = ExRT.F.table_copy2(val)
else
saveDB[key] = val
end
end
end
end
function module:SelectProfile(name)
if name == VMRT.ExCD2.Profiles.Now or not name then
return
end
if not VMRT.ExCD2.Profiles.List[name] then
return
end
module:SaveCurrentProfiletoDB()
local savedKeys = {}
for key in pairs(IGNORE_PROFILE_KEYS) do
if VMRT.ExCD2[key] then
savedKeys[key] = VMRT.ExCD2[key]
end
end
ExRT.F.table_rewrite(VMRT.ExCD2,VMRT.ExCD2.Profiles.List[name])
for key,val in pairs(savedKeys) do
VMRT.ExCD2[key] = val
end
VMRT.ExCD2.Profiles.Now = name
module:ReloadProfile()
VMRT.ExCD2.Profiles.List[name] = nil --remove data only if reload is successful
return true
end
function module:ReloadProfile()
module.main:ADDON_LOADED()
if module.options.isLoaded then
module.options.chkLock:SetChecked(VMRT.ExCD2.lock)
module.options.chkEnable:SetChecked(VMRT.ExCD2.enabled)
module.options.chkEnable:ColorState()
module.options.chkSplit:SetChecked(VMRT.ExCD2.SplitOpt)
module.options.chkNoRaid:SetChecked(VMRT.ExCD2.NoRaid)
module.options.categories:Update()
module.options.categories.buttons[1]:Click()
module.options.optColTabs.tabs[module.db.maxColumns+3].currentName:UpdateText()
module.options.optColTabs.tabs[module.db.maxColumns+3]:UpdateAutoTexts()
if module.options.optColTabs.selected <= module.db.maxColumns + 1 then
module.options:selectColumnTab()
end
end
end
function module:CheckZoneProfiles()
local _, zoneType = GetInstanceInfo()
if zoneType == "arena" then
if VMRT.ExCD2.Profiles.Arena then
module:SelectProfile(VMRT.ExCD2.Profiles.Arena)
end
elseif zoneType == "party" then
if VMRT.ExCD2.Profiles.Dung then
module:SelectProfile(VMRT.ExCD2.Profiles.Dung)
end
elseif zoneType == "raid" then
if VMRT.ExCD2.Profiles.Raid then
module:SelectProfile(VMRT.ExCD2.Profiles.Raid)
end
elseif zoneType == "pvp" then
if VMRT.ExCD2.Profiles.BG then
module:SelectProfile(VMRT.ExCD2.Profiles.BG)
end
else
if VMRT.ExCD2.Profiles.Other then
module:SelectProfile(VMRT.ExCD2.Profiles.Other)
end
end
end
end
function module:Enable()
VMRT.ExCD2.enabled = true
module.frame.IsEnabled = true
module:UpdateLockState()
module:SplitExCD2Window()
module:ReloadAllSplits()
module:RegisterTimer()
module:RegisterEvents('SCENARIO_UPDATE','GROUP_ROSTER_UPDATE','COMBAT_LOG_EVENT_UNFILTERED','UNIT_PET','PLAYER_LOGOUT','CHALLENGE_MODE_RESET','PLAYER_REGEN_DISABLED','PLAYER_REGEN_ENABLED','ENCOUNTER_START','ENCOUNTER_END','PLAYER_SPECIALIZATION_CHANGED')
module:CreateSpellDB()
module:ApplyHotfixes()
UpdateRoster()
module.main:ZONE_CHANGED_NEW_AREA()
module:RegisterAddonMessage()
end
function module:Disable()
VMRT.ExCD2.enabled = nil
module.frame.IsEnabled = false
if not VMRT.ExCD2.SplitOpt then
module.frame:Hide()
else
for i=1,module.db.maxColumns do
module.frame.colFrame[i]:Hide()
end
end
module:UnregisterTimer()
module:UnregisterEvents('SCENARIO_UPDATE','GROUP_ROSTER_UPDATE','COMBAT_LOG_EVENT_UNFILTERED','UNIT_PET','PLAYER_LOGOUT','CHALLENGE_MODE_RESET','PLAYER_REGEN_DISABLED','PLAYER_REGEN_ENABLED','ENCOUNTER_START','ENCOUNTER_END','PLAYER_SPECIALIZATION_CHANGED','ARENA_COOLDOWNS_UPDATE','UNIT_AURA')
module:UnregisterAddonMessage()
end
function module:IsEnabled()
if module.frame.IsEnabled then
return true
else
return false
end
end
local NewVMRTTableData = {
NoRaid = true,
upd4380 = true,
upd4525 = true,
}
function module.main:ADDON_LOADED()
VMRT = _G.VMRT
VMRT.ExCD2 = VMRT.ExCD2 or ExRT.F.table_copy2(NewVMRTTableData)
VMRT.ExCD2.Profiles = VMRT.ExCD2.Profiles or {}
VMRT.ExCD2.Profiles.List = VMRT.ExCD2.Profiles.List or {}
VMRT.ExCD2.Profiles.Now = VMRT.ExCD2.Profiles.Now or "default"
if VMRT.Addon.Version < 4235 then
if VMRT.ExCD2.Priority then
for k,v in pairs(VMRT.ExCD2.Priority) do
if type(v) == 'number' then
VMRT.ExCD2.Priority[k] = floor((v - 1) / 29 * 100)
end
end
end
end
if VMRT.Addon.Version < 4240 then
if VMRT.ExCD2.userDB then
for i=#VMRT.ExCD2.userDB,1,-1 do
for j=1,#module.db.AllSpells do
if module.db.AllSpells[j][1] == VMRT.ExCD2.userDB[i][1] then
tremove(VMRT.ExCD2.userDB,i)
break
end
end
end
for i=1,#VMRT.ExCD2.userDB do
if type(VMRT.ExCD2.userDB[i][3]) ~= "number" then
for j=8,4,-1 do
VMRT.ExCD2.userDB[i][j] = VMRT.ExCD2.userDB[i][j-1]
end
VMRT.ExCD2.userDB[i][3] = 1
end
end
end
VMRT.ExCD2.default_userCD = nil
VMRT.ExCD2.default_userDuration = nil
end
if VMRT.ExCD2.Left and VMRT.ExCD2.Top then
module.frame:ClearAllPoints()
module.frame:SetPoint("TOPLEFT",UIParent,"BOTTOMLEFT",VMRT.ExCD2.Left,VMRT.ExCD2.Top)
end
VMRT.ExCD2.CDE = VMRT.ExCD2.CDE or {}
VMRT.ExCD2.CDECol = VMRT.ExCD2.CDECol or {}
if not VMRT.ExCD2.colSet then
VMRT.ExCD2.colSet = {}
for i=1,module.db.maxColumns+1 do
VMRT.ExCD2.colSet[i] = {}
for optName,optVal in pairs(module.db.colsInit) do
VMRT.ExCD2.colSet[i][optName] = optVal
end
if i <= 3 then
VMRT.ExCD2.colSet[i].enabled = true
end
end
end
for i=1,module.db.maxColumns+1 do
VMRT.ExCD2.colSet[i] = VMRT.ExCD2.colSet[i] or {}
end
if not VMRT.ExCD2.upd4380 then
for i=1,module.db.maxColumns+1 do
local colSet = VMRT.ExCD2.colSet[i]
colSet.methodsSortByAvailability = VMRT.ExCD2.SortByAvailability
colSet.methodsSortActiveToTop = VMRT.ExCD2.SortByAvailabilityActiveToTop
colSet.methodsReverseSorting = VMRT.ExCD2.ReverseSorting
end
VMRT.ExCD2.upd4380 = true
end
if not VMRT.ExCD2.upd4525 then
for i=1,module.db.maxColumns do
local colSet = VMRT.ExCD2.colSet[i]
if colSet.ATF then
colSet.frameStrata = nil
end
end
VMRT.ExCD2.upd4525 = true
end
VMRT.ExCD2.userDB = VMRT.ExCD2.userDB or {}
VMRT.ExCD2.Priority = VMRT.ExCD2.Priority or {}
VMRT.ExCD2.gnGUIDs = VMRT.ExCD2.gnGUIDs or {}
if VMRT.ExCD2.gnGUIDs and ExRT.F.table_len(VMRT.ExCD2.gnGUIDs) > 500 then
wipe(VMRT.ExCD2.gnGUIDs)
end
globalGUIDs = VMRT.ExCD2.gnGUIDs
VMRT.ExCD2.OptFav = VMRT.ExCD2.OptFav or {}
VMRT.ExCD2.Save = VMRT.ExCD2.Save or {}
module:RegisterEvents('ZONE_CHANGED_NEW_AREA')
if ExRT.isClassic then
module:RegisterEvents('LOADING_SCREEN_DISABLED')
end
if not VMRT.ExCD2.enabled then
module:Disable()
C_Timer.After(2,module.CheckZoneProfiles)
else
module:Enable()
ScheduleTimer(UpdateRoster,10)
ScheduleTimer(module.ReloadAllSplits,10)
module:RegisterEvents('PLAYER_ENTERING_WORLD')
end
for _ in pairs(module.db.spellCDSync) do
module:RegisterEvents('SPELL_UPDATE_COOLDOWN')
break
end
module:RegisterSlash()
end
function module.main:PLAYER_ENTERING_WORLD()
UpdateRoster()
module:UnregisterEvents('PLAYER_ENTERING_WORLD')
end
function module.main:PLAYER_LOGOUT()
SaveCDtoVar(true)
end
function module.main:SCENARIO_UPDATE()
AfterCombatResetFunction()
UpdateAllData()
end
module.main.CHALLENGE_MODE_RESET = module.main.SCENARIO_UPDATE
function module.main:PLAYER_REGEN_DISABLED()
module:toggleCombatVisibility(true,2)
end
function module.main:PLAYER_REGEN_ENABLED()
module:toggleCombatVisibility(false,2)
end
do
local scheduledUpdateRoster = nil
local function funcScheduledUpdate()
scheduledUpdateRoster = nil
UpdateRoster()
module:updateCombatVisibility()
module:ATFFrameDataReset()
end
function module.main:GROUP_ROSTER_UPDATE()
if not scheduledUpdateRoster then
scheduledUpdateRoster = ScheduleTimer(funcScheduledUpdate,1)
end
end
end
do
local scheduledUpdateRoster = nil
local function funcScheduledUpdate()
scheduledUpdateRoster = nil
if not module:IsEnabled() then --module can be disabled after function already scheduled
return
end
UpdateRoster()
end
local prevDiffID
local scheduledVisibility = nil
local function funcScheduledVisibility()
scheduledVisibility = nil
if not module:IsEnabled() then --module can be disabled after function already scheduled
return
end
module:updateCombatVisibility()
local _,_,diff = GetInstanceInfo()
if diff ~= prevDiffID then
if diff == 167 then --Torghast
module:ClearFullSessionDataReason("torghast")
module:RegisterEvents('UNIT_AURA')
elseif prevDiffID == 167 then
module:UnregisterEvents('UNIT_AURA')
module:ClearFullSessionDataReason("torghast")
end
prevDiffID = diff
end
end
function module.main:ZONE_CHANGED_NEW_AREA()
C_Timer.After(1,module.CheckZoneProfiles)
if module:IsEnabled() then
if select(2, IsInInstance()) == "arena" then
AfterCombatResetFunction(true)
UpdateAllData()
end
if not scheduledVisibility then
scheduledVisibility = ScheduleTimer(funcScheduledVisibility,2)
end
if not scheduledUpdateRoster then
scheduledUpdateRoster = ScheduleTimer(funcScheduledUpdate,10)
end
end
end
module.main.LOADING_SCREEN_DISABLED = module.main.ZONE_CHANGED_NEW_AREA
end
function module.main:PLAYER_SPECIALIZATION_CHANGED(unit)
if unit ~= "player" or not GetSpecialization then
return
end
local spec = GetSpecialization()
if not spec then
return
end
local class = (select(2,UnitClass'player')) or ""
local key = "Spec" .. spec .. class
if VMRT.ExCD2.Profiles[key] then
module:SelectProfile(VMRT.ExCD2.Profiles[key])
end
end
do
local prevStart,prevDur = {},{}
local str
function module.main:SPELL_UPDATE_COOLDOWN()
for _,spellID in pairs(module.db.spellCDSync) do
local start, duration = GetSpellCooldown(spellID)
if (start ~= prevStart[spellID] or duration ~= prevDur[spellID]) and (duration == 0 or duration > 2) then
prevStart[spellID] = start
prevDur[spellID] = duration
if duration > 2 then
str = (str or "") .. spellID .. ":" .. floor(start + duration - GetTime()) .. ";"
elseif duration == 0 then
str = (str or "") .. spellID .. ":0;"
end
end
end
if str then
str = str:sub(1,-2)
ExRT.F.SendExMsg("rcd","SQ\t"..str)
str = nil
end
end
local CDList = _db.cdsNav
function module:addonMessage(sender, prefix, subPrefix, ...)
if prefix == "rcd" then
if subPrefix == "SQ" then
--print(sender, prefix, subPrefix, ...)
local str = ...
local senderFull = sender
sender = strsplit("-",sender)
local updateReq
while str do
local main,next = strsplit(";",str,2)
str = next
if main then
local spellID,spellCD = strsplit(":",main)
spellID = tonumber(spellID or "")
spellCD = tonumber(spellCD or "")
if spellID and spellCD then
local line = CDList[sender][spellID]
if line then
line:SetCDSynq(spellCD,true)
--print('update',sender,spellID,spellCD)
updateReq = true
end
end
end
end
if updateReq then
UpdateAllData()
end
end
end
end
end
local FD_GUIDs = {}
local ScheduledUnitAura
function module.main:UNIT_AURA(unitID)
local isInTorghast = IsInJailersTower()
if isInTorghast then
local name,realm = UnitName(unitID)
if realm then
name = name .. "-" .. realm
end
--cooldownsModule:ClearSessionDataReason(name,"torghast")
for i=1,60 do
local auraData = C_UnitAuras_GetAuraDataByIndex(unitID, i, "MAW")
if not auraData then
break
else
local count = auraData.applications
if count and count < 2 then
count = nil
end
_db.session_gGUIDs[name] = {auraData.spellId,"torghast",count}
end
end
end
local guid = UnitGUID(unitID)
if guid and FD_GUIDs[guid] then
local FD_Found
for i=1,60 do
local auraData = C_UnitAuras_GetAuraDataByIndex(unitID, i)
if not auraData then
break
elseif auraData.spellId == 5384 then
FD_Found = true
end
end
if not FD_Found then
local line = _db.cdsNav[UnitName(unitID)][5384]
if ExRT.isClassic and not ExRT.isCata and not line then
line = _db.cdsNav[UnitName(unitID)][GetSpellInfo(5384)]
end
if line then
CLEUstartCD(line)
end
FD_GUIDs[guid] = nil
if not isInTorghast then
local anyFound
for _ in pairs(FD_GUIDs) do
anyFound = true
break
end
if not anyFound then
if ScheduledUnitAura then
ScheduledUnitAura:Cancel()
ScheduledUnitAura = nil
end
module:UnregisterEvents("UNIT_AURA")
end
end
end
end
end
function module.main:UNIT_PET(arg)
local name = UnitCombatlogname(arg)
if name then
local forceUpdateAllData = nil
local petNow = UnitCreatureFamily(arg.."pet")
if petNow ~= _db.session_Pets[name] then
_db.session_Pets[name] = UnitCreatureFamily(arg.."pet")
forceUpdateAllData = true
end
if _db.session_Pets[name] then
_db.session_PetOwner[UnitGUID(arg.."pet")] = name
end
if forceUpdateAllData then
UpdateAllData()
end
end
end
function module.main:ENCOUNTER_START(encounterID, encounterName, difficultyID, groupSize)
if encounterID == 1866 or encounterID == 2334 then
module.db.disableCDresetting = true
end
end
function module.main:ENCOUNTER_END(encounterID, encounterName, difficultyID, groupSize, success)
if encounterID == 1866 or encounterID == 2334 then
module.db.disableCDresetting = nil
end
end
local hotfixTableNameToType = {
AllSpells = 1,
spell_charge_fix = 2,
spell_talentReplaceOther = 2,
spell_aura_list = 2,
spell_durationByTalent_fix = 3,
spell_cdByTalent_fix = 3,
spell_speed_list = 2,
spell_afterCombatReset = 2,
spell_afterCombatNotReset = 2,
spell_reduceCdByHaste = 2,
spell_resetOtherSpells = 3,
spell_sharingCD = 4,
spell_runningSameSpell = 3,
spell_reduceCdCast = 3,
spell_increaseDurationCast = 3,
spell_dispellsList = 2,
spell_startCDbyAuraFade = 2,
spell_startCDbyAuraFadeExt = 2,
spell_startCDbyAuraApplied = 2,
spell_reduceCdByAuraFade = 3,
spell_reduceCdByAuraFadeBefore = 3,
spell_battleRes = 2,
spell_isRacial = 2,
differentIcons = 2,
itemsToSpells = 2,
spell_autoTalent = 2,
spell_talentProvideAnotherTalents = 3,
spell_isTalent = 2,
spell_isPvpTalent = 2,
findspecspells = 2,
aura_grant_talent = 2,
}
function module:ApplyHotfixes()
local text, line = VMRT.ExCD2.Hotfixes or ""
line, text = strsplit("\n",text,2)
while line do
line = line:trim()
local tableName = strsplit(":",line,2)
if not tableName then
elseif hotfixTableNameToType[tableName] == 1 or tonumber(tableName) then
if tonumber(tableName) then line = ":"..line end
local _,spellID,hotfixType,newData1,newData2 = strsplit(":",line)
if newData1 then
spellID = tonumber(spellID)
if spellID then
local data
for i=1,#module.db.AllSpells do
data = module.db.AllSpells[i]
if data[1] == spellID then
if hotfixType == "dur" then
newData1 = tonumber(newData1)
if newData1 then
for j=4,8 do
if data[j] then
data[j][3] = newData1
end
end
end
elseif hotfixType == "cd" then
newData1 = tonumber(newData1)
if newData1 then
for j=4,8 do
if data[j] then
data[j][2] = newData1
end
end
end
elseif hotfixType == "cleu" then
newData1 = tonumber(newData1)
if newData1 then
for j=4,8 do
if data[j] then
data[j][1] = newData1
end
end
end
elseif tonumber(hotfixType) then
if hotfixType < 4 then
data[hotfixType] = tonumber(newData1) or newData1
elseif data[hotfixType] then
newData1 = tonumber(newData1)
if newData1 and newData2 then
data[hotfixType][newData1] = tonumber(newData2) or newData2
end
end
end
break
end
end
end
end
elseif tableName == "AllSpells2" then
local _,spellID,specNum,cleu,cd,dur = strsplit(":",line,4)
if dur then
specNum = tonumber(specNum)
spellID = tonumber(spellID)
cleu = tonumber(cleu)
cd = tonumber(cd)
dur = tonumber(dur)
if spellID and specNum and cleu and cd and dur then
local data
for i=1,#module.db.AllSpells do
data = module.db.AllSpells[i]
if data[1] == spellID then
data[specNum+4] = {cleu,cd,dur}
break
end
end
end
end
elseif hotfixTableNameToType[tableName] == 2 then
local _,key,var = strsplit(":",line)
key = tonumber(key or "")
if var == "true" then
var = true
elseif var == "false" then
var = false
else
var = tonumber(var or "") or var
end
if key and var then
module.db[tableName][key] = var
end
elseif hotfixTableNameToType[tableName] == 3 then
local _,key,var = strsplit(":",line,3)
key = tonumber(key or "")
if key and var then
local new = {}
local v1,v2 = strsplit(",",var,2)
while v1 do
if v1:find(";") then
local new2 = {}
local b1,b2 = strsplit(";",v1,2)
while b1 do
if b1 == "false" then b1 = false end
if b1 == "true" then b1 = true end
new2[#new2+1] = tonumber(b1) or b1
if not b2 then break end
b1,b2 = strsplit(";",b2,2)
end
v1 = new2
end
if v1 == "false" then v1 = false end
if v1 == "true" then v1 = true end
new[#new+1] = tonumber(v1) or v1
if not v2 then break end
v1,v2 = strsplit(",",v2,2)
end
module.db[tableName][key] = new
end
elseif hotfixTableNameToType[tableName] == 4 then
local _,key,var = strsplit(":",line,3)
key = tonumber(key or "")
if key and var then
local new = {}
local v1,v2 = strsplit(",",var,2)
while v1 do
local b1,b2 = strsplit(":",v1,2)
b1 = tonumber(b1) or b1
b2 = tonumber(b2) or b2
if b1 and b2 then
new[b1] = b2
end
if not v2 then break end
v1,v2 = strsplit(",",v2,2)
end
module.db[tableName][key] = new
end
end
if not text then
break
end
line, text = strsplit("\n",text,2)
end
end
do
local eventsView = {}
local function IsAuraActive(unit,spellID)
for i=1,60 do
local auraData = C_UnitAuras_GetAuraDataByIndex(unit,i)
if not auraData then
return
elseif spellID == auraData.spellId then
return auraData
end
end
end
function module.main.COMBAT_LOG_EVENT_UNFILTERED(timestamp,event,...)
local func = eventsView[event]
if func then
return func(timestamp,event,...)
else
return
end
end
local env = {
module = module,
_db = _db,
eventsView = eventsView,
_C = _C,
spell_startCDbyAuraApplied_fix = _db.spell_startCDbyAuraApplied_fix,
spell_startCDbyAuraApplied = _db.spell_startCDbyAuraApplied,
spell_aura_grant_talent = _db.aura_grant_talent,
spell_isPetAbility = _db.spell_isPetAbility,
spell_covenant = _db.spell_covenant,
spell_startCDbyAuraFade = _db.spell_startCDbyAuraFade,
spell_startCDbyAuraFadeExt = _db.spell_startCDbyAuraFadeExt,
spell_isTalent = _db.spell_isTalent,
spell_resetOtherSpells = _db.spell_resetOtherSpells,
spell_isPvpTalent = _db.spell_isPvpTalent,
spell_sharingCD = _db.spell_sharingCD,
spell_reduceCdCast = _db.spell_reduceCdCast,
spell_increaseDurationCast = _db.spell_increaseDurationCast,
spell_runningSameSpell = _db.spell_runningSameSpell,
spell_reduceCdByAuraFade = _db.spell_reduceCdByAuraFade,
spell_reduceCdByAuraFadeBefore = _db.spell_reduceCdByAuraFadeBefore,
spell_aura_list = _db.spell_aura_list,
spell_dispellsList = _db.spell_dispellsList,
spell_ReincarnationFix = _db.spell_ReincarnationFix,
spell_ignoreUseWithAura = _db.spell_ignoreUseWithAura,
isWarlock = _db.vars.isWarlock,
isRogue = _db.vars.isRogue,
isPaladin = _db.vars.isPaladin,
isMage = _db.vars.isMage,
isHunter = _db.vars.isHunter,
session_gGUIDs = _db.session_gGUIDs,
session_PetOwner = _db.session_PetOwner,
findspecspells = _db.findspecspells,
globalGUIDs = {},
CDList = _db.cdsNav,
bit = bit,
print = print,
abs = abs,
C_Timer = C_Timer,
C_UnitAuras = C_UnitAuras,
GetAuraDataByIndex = C_UnitAuras.GetAuraDataByIndex,
UnitSpellHaste = UnitSpellHaste,
UnitHealthMax = UnitHealthMax,
UnitHealth = UnitHealth,
GetSpellInfo = GetSpellInfo,
type = type,
Gtype = type,
pairs = pairs,
ipairs = ipairs,
strsplit = strsplit,
CLEUstartCD = CLEUstartCD,
UpdateAllData = UpdateAllData,
GetUnitInfoByUnitFlag = GetUnitInfoByUnitFlag,
GetTime = GetTime,
IsAuraActive = IsAuraActive,
ExRT = ExRT,
SOULBIND_DEF_RANK_NOW = SOULBIND_DEF_RANK_NOW,
avengershield_var = {},
}
CLEU.Events = {
SPELL_CAST_SUCCESS = {main=[[
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,spellID,spellName,spellSchool)
if not sourceName then
return
end
$$$2
local forceUpdateAllData
if spell_isPetAbility[spellID] then
sourceName = session_PetOwner[sourceGUID] or sourceName
end
local findSpecSpell = findspecspells[spellID]
if findSpecSpell and (GetUnitInfoByUnitFlag(sourceFlags,4) % 8) > 0 then
if globalGUIDs[sourceName] ~= findSpecSpell then
forceUpdateAllData = true
end
globalGUIDs[sourceName] = findSpecSpell
end
if spell_covenant[spellID] then
module:AddCovenant(sourceName,spell_covenant[spellID])
end
if spell_startCDbyAuraFade[spellID] or spell_startCDbyAuraApplied_fix[spellID] then
if forceUpdateAllData then UpdateAllData() end
return
end
if spell_ignoreUseWithAura[spellID] and IsAuraActive(sourceName,spell_ignoreUseWithAura[spellID]) then
return
end
local line = CDList[sourceName][spellID]
if line then
CLEUstartCD(line,destName)
end
if spell_isTalent[spellID] and not isSpellDuplicateDisabled and not session_gGUIDs[sourceName][spellID] then
forceUpdateAllData = true
session_gGUIDs[sourceName] = {spellID,"talent"}
end
local modifData = spell_resetOtherSpells[spellID]
if modifData then
for i=1,#modifData do
local resetSpellID = modifData[i]
if type(resetSpellID)~='table' or (session_gGUIDs[sourceName][ resetSpellID[2] ] and (not spell_isPvpTalent[ resetSpellID[2] ] or module.IsPvpTalentsOn(sourceName))) then
resetSpellID = type(resetSpellID)=='table' and resetSpellID[1] or resetSpellID
local line = CDList[sourceName][ resetSpellID ]
if line then
line:SetCD(0,true)
forceUpdateAllData = true
end
end
end
end
local modifData = spell_sharingCD[spellID]
if modifData then
local nowTime = GetTime()
for sharingSpellID,timeCD in pairs(modifData) do
local line = CDList[sourceName][sharingSpellID]
if line then
local cd_timer_now = line.lastUse + line.cd - nowTime
if (cd_timer_now > 0 and cd_timer_now < timeCD) or (nowTime - line.lastUse) > line.cd then
line.cd = timeCD
line.lastUse = nowTime
line.duration = 0
if line.bar and line.bar.data == line then
line.bar:UpdateStatus()
end
forceUpdateAllData = true
end
end
end
end
local modifData = spell_reduceCdCast[spellID]
if modifData then
local cdr_mod = 1
for i=1,#modifData,2 do
local reduceSpellID = modifData[i]
if type(reduceSpellID) ~= "table" then
local line = CDList[sourceName][reduceSpellID]
local reduceTime = modifData[i+1]
if line then
line:ReduceCD(-reduceTime * cdr_mod,true)
forceUpdateAllData = true
end
else
local specReduceCD = reduceSpellID[3]
local effectOnlyDuringBuffActive = reduceSpellID[4]
if session_gGUIDs[sourceName][ reduceSpellID[2] ] and (not spell_isPvpTalent[ reduceSpellID[2] ] or module.IsPvpTalentsOn(sourceName)) and (not specReduceCD or (specReduceCD < 0 and globalGUIDs[sourceName] ~= specReduceCD or globalGUIDs[sourceName] == specReduceCD)) and (not effectOnlyDuringBuffActive or IsAuraActive(sourceName,effectOnlyDuringBuffActive)) then
local line = CDList[sourceName][ reduceSpellID[1] ]
local reduceTime = modifData[i+1]
if type(reduceTime) == "table" and #reduceTime <= 5 then
local talent_rank = _db.talent_classic_rank[sourceName][ reduceSpellID[2] ] or #reduceTime
reduceTime = reduceTime[talent_rank] or reduceTime[#reduceTime]
elseif type(reduceTime) == "table" then
local soulbind_rank = _db.soulbind_rank[sourceName][ reduceSpellID[2] ] or SOULBIND_DEF_RANK_NOW
reduceTime = reduceTime[soulbind_rank]
end
if line then
line:ReduceCD(-reduceTime * cdr_mod,true)
forceUpdateAllData = true
end
end
end
end
end
local modifData = spell_increaseDurationCast[spellID]
if modifData then
for i=1,#modifData,2 do
local increaseSpellID = modifData[i]
if type(increaseSpellID) ~= "table" then
local line = CDList[sourceName][increaseSpellID]
if line and (GetTime() - line.lastUse) < line.duration then
line:ChangeDur(modifData[i+1],true)
forceUpdateAllData = true
end
else
if session_gGUIDs[sourceName][ increaseSpellID[2] ] then
local line = CDList[sourceName][ increaseSpellID[1] ]
local incTime = modifData[i+1]
if type(incTime) == "table" then
local soulbind_rank = _db.soulbind_rank[sourceName][ increaseSpellID[2] ] or SOULBIND_DEF_RANK_NOW
incTime = incTime[soulbind_rank]
end
if line and (GetTime() - line.lastUse) < line.duration then
line:ChangeDur(incTime,true)
forceUpdateAllData = true
end
end
end
end
end
local modifData = spell_runningSameSpell[spellID]
if modifData and not isSpellDuplicateDisabled then
for i=1,#modifData do
local sameSpellID = modifData[i]
if sameSpellID ~= spellID then
isSpellDuplicateDisabled = true
eventsView.SPELL_CAST_SUCCESS(timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,sameSpellID,spellName,spellSchool)
isSpellDuplicateDisabled = false
end
end
end
if spellID == 1856 and (session_gGUIDs[sourceName][340080] or session_gGUIDs[sourceName][382523]) then
local talent_rank = _db.talent_classic_rank[sourceName][382523] or 2
local timeReduce = 15 * talent_rank
for j=1,#_C do
local line = _C[j]
if line.fullName == sourceName and line.db[1] ~= 1856 then
line:ReduceCD(timeReduce,true)
forceUpdateAllData = true
end
end
end
$$$1
if forceUpdateAllData then
UpdateAllData()
end
end
]],classic=[[
if spellID == 25937 or spellID == 33667 then
return
end
]]},
SPELL_AURA_APPLIED = {main=[[
blessingcdr = {}
symbolofhope = {}
symbolofhopeSpells = { --SpellLabel LabelID 1284
[22812]=true,[198589]=true,[48792]=true,[204021]=true,[109304]=true,[55342]=true,
[115203]=true,[19236]=true,[108271]=true,[104773]=true,[871]=true,[118038]=true,
[184364]=true,[498]=true,[31850]=true,[185311]=true,[212800]=true,
[403876]=true,[363916]=true,[243435]=true,
}
thundercharge = {}
faerie = {}
faerieCond = {}
faerieSpells = {
[740]=true,[1122]=true,[1719]=true,[12042]=true,[12472]=true,[13750]=true,
[31884]=true,[47536]=true,[47568]=true,[50334]=true,[51533]=true,[55233]=true,
[61336]=true,[64843]=true,[79140]=true,[102543]=true,[102560]=true,[106951]=true,
[107574]=true,[108280]=true,[109964]=true,[115203]=true,[115310]=true,[121471]=true,
[137639]=true,[152173]=true,[152277]=true,[187827]=true,[190319]=true,[191427]=true,
[192249]=true,[193530]=true,[194223]=true,[194249]=true,[198067]=true,[198144]=true,
[205180]=true,[216331]=true,[227847]=true,[228260]=true,[231895]=true,[265187]=true,
[266779]=true,[275699]=true,[288613]=true,[297850]=true,[333957]=true,[335235]=true,
[102558]=true,
}
shiftingpower = {}
timeskip = {}
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,spellID,spellName,school,auraType)
if not sourceName then
return
end
$$$2
local CDspellID = spell_startCDbyAuraApplied[spellID]
if CDspellID then
local line = CDList[sourceName][CDspellID]
if line then
CLEUstartCD(line,destName)
end
end
local talentFromAura = spell_aura_grant_talent[spellID]
if talentFromAura then
if type(talentFromAura) == "table" then
if not talentFromAura[1] or talentFromAura[1]==0 or session_gGUIDs[sourceName][ talentFromAura[1] ] then
for i=2,#talentFromAura do
session_gGUIDs[sourceName] = {talentFromAura[i],"aura"}
end
end
else
session_gGUIDs[sourceName] = {talentFromAura,"aura"}
end
UpdateAllData()
end
if (spellID == 328622 or spellID == 388010) and destName then --Blessing of Autumn
if blessingcdr[sourceName] then
blessingcdr[sourceName]:Cancel()
end
local power
for i=1,60 do
local auraData = C_UnitAuras.GetAuraDataByIndex(destName,i)
if not auraData then
break
elseif auraData.spellId == 328622 or auraData.spellId == 388010 then
power = (auraData.points and auraData.points[1] or 30)/100
break
end
end
blessingcdr[sourceName] = C_Timer.NewTicker(1,function()
local line, updateReq
for j=1,#_C do
line = _C[j]
if line.fullName == destName then
line:ReduceCD(power or 0.3,true)
updateReq = true
end
end
if updateReq then
UpdateAllData()
end
end, 30)
elseif spellID == 64901 and destName and sourceName then --Symbol of Hope
local hymnDur = 5 / (1 + (UnitSpellHaste(sourceName) or 0) /100)
local perSec = 30 / hymnDur
symbolofhope[sourceName..":"..destName] = C_Timer.NewTicker(1,function(self)
local line, updateReq
for j=1,#_C do
line = _C[j]
if line.fullName == destName and line.db and symbolofhopeSpells[ line.db[1] ] then
line:ReduceCD(perSec,true)
updateReq = true
end
end
self.last = GetTime()
if updateReq then
UpdateAllData()
end
end, hymnDur)
symbolofhope[sourceName..":"..destName].OnCancel = function(self)
local now = GetTime()
if not self.last or ((now - self.last) < 0.2) then
return
end
local updateReq
for j=1,#_C do
local line = _C[j]
if line.fullName == destName and line.db and symbolofhopeSpells[ line.db[1] ] then
line:ReduceCD((now - self.last)*perSec,true)
updateReq = true
end
end
if updateReq then
UpdateAllData()
end
end
elseif spellID == 204366 and destName then --Thundercharge
if thundercharge[destName] then
thundercharge[destName]:Cancel()
end
local power
for i=1,60 do
local auraData = C_UnitAuras.GetAuraDataByIndex(destName,i)
if not auraData then
break
elseif auraData.spellId == 204366 then
power = (auraData.points and auraData.points[1] or 30)/100
break
end
end
thundercharge[destName] = C_Timer.NewTicker(1,function()
local line, updateReq
for j=1,#_C do
line = _C[j]
if line.fullName == destName then
line:ReduceCD(power or 0.3,true)
updateReq = true
end
end
if updateReq then
UpdateAllData()
end
end, 10)
elseif (spellID == 327710 or spellID == 345453) and destName and sourceName then --Benevolent Faerie
local db = spellID == 327710 and faerie or faerieCond
local mod = spellID == 327710 and 1 or 0.8
if session_gGUIDs[sourceName][356391] then
mod = mod * 2
end
if db[sourceName..":"..destName] then
db[sourceName..":"..destName]:Cancel()
end
db[sourceName..":"..destName] = C_Timer.NewTicker(1,function(self)
local updateReq
for j=1,#_C do
local line = _C[j]
if line.fullName == destName and line.db and faerieSpells[ line.db[1] ] then
line:ReduceCD(1*mod,true)
updateReq = true
end
end
self.last = GetTime()
if updateReq then
UpdateAllData()
end
end, 30)
db[sourceName..":"..destName].OnCancel = function(self)
local now = GetTime()
if not self.last or ((now - self.last) < 0.2) then
return
end
local updateReq
for j=1,#_C do
local line = _C[j]
if line.fullName == destName and line.db and faerieSpells[ line.db[1] ] then
line:ReduceCD((now - self.last)*mod,true)
updateReq = true
end
end
if updateReq then
UpdateAllData()
end
end
elseif (spellID == 314791 or spellID == 382440) and sourceName then --Shifting Power
if shiftingpower[sourceName] then
shiftingpower[sourceName]:Cancel()
end
local len = 4 / (1 + (UnitSpellHaste(sourceName) or 0) /100)
local changePerTick = 3
if session_gGUIDs[sourceName][336992] then
local soulbind_rank = _db.soulbind_rank[sourceName][336992] or SOULBIND_DEF_RANK_NOW
local change = 0.9 + soulbind_rank * 0.1
changePerTick = changePerTick + change
end
shiftingpower[sourceName] = C_Timer.NewTicker(len / 4,function()
local line, updateReq
for j=1,#_C do
line = _C[j]
if line.fullName == sourceName and line.db[1] ~= spellID then
line:ReduceCD(changePerTick,true)
updateReq = true
end
end
if updateReq then
UpdateAllData()
end
end, 4)
shiftingpower[sourceName].t_end = GetTime() + len
elseif (spellID == 404977) and sourceName then --Time Skip
if timeskip[sourceName] then
timeskip[sourceName]:Cancel()
end
local total_len = 2
if session_gGUIDs[sourceName][412723] then
total_len = 3
end
local len = total_len / (1 + (UnitSpellHaste(sourceName) or 0) /100)
local changePerTick = 10
timeskip[sourceName] = C_Timer.NewTicker(len / total_len,function()
local line, updateReq
for j=1,#_C do
line = _C[j]
if line.fullName == sourceName and line.db[1] ~= spellID then
line:ReduceCD(changePerTick,true)
updateReq = true
end
end
if updateReq then
UpdateAllData()
end
end, total_len)
timeskip[sourceName].t_end = GetTime() + len
end
$$$1
end
]]},
SPELL_AURA_REMOVED = {main=[[
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,spellID,spellName,school,auraType)
if not sourceName then
return
end
$$$2
local forceUpdateAllData
local modifData = spell_reduceCdByAuraFade[spellID]
if modifData then
local CDspellID = modifData[1]
if type(CDspellID) ~= "table" then
local line = CDList[sourceName][CDspellID]
if line and abs(GetTime() - line.lastUse - line.duration) < 0.5 then
line:ModCD(modifData[2],true)
forceUpdateAllData = true
end
else
if session_gGUIDs[sourceName][ CDspellID[2] ] then
local line = CDList[sourceName][ CDspellID[1] ]
if line and abs(GetTime() - line.lastUse - line.duration) < 0.5 then
line:ModCD(modifData[2],true)
forceUpdateAllData = true
end
end
end
end
local modifData = spell_reduceCdByAuraFadeBefore[spellID]
if modifData then
local CDspellID = modifData[1]
if type(CDspellID) ~= "table" then
local line = CDList[sourceName][CDspellID]
if line and abs(GetTime() - line.lastUse - line.duration) > 0.5 then
line:ModCD(modifData[2],true)
forceUpdateAllData = true
end
else
if session_gGUIDs[sourceName][ CDspellID[2] ] then
local line = CDList[sourceName][ CDspellID[1] ]
if line and abs(GetTime() - line.lastUse - line.duration) > 0.5 then
line:ModCD(modifData[2],true)
forceUpdateAllData = true
end
end
end
end
local CDspellID = spell_aura_list[spellID]
if CDspellID then
if CDspellID == 198839 then --Earthen Wall
sourceName = ExRT.F.Pets:getOwnerNameByGUID(destGUID)
end
local line = CDList[sourceName][ CDspellID ]
if line then
line:SetDur(0,true)
forceUpdateAllData = true
end
end
local CDspellID = spell_startCDbyAuraFade[spellID]
if CDspellID then
local line = CDList[sourceName][CDspellID]
if line then
CLEUstartCD(line,destName)
end
end
local CDspellID = spell_startCDbyAuraFadeExt[spellID]
if CDspellID then
local line = CDList[sourceName][CDspellID]
if line then
CLEUstartCD(line,destName)
end
end
local talentFromAura = spell_aura_grant_talent[spellID]
if talentFromAura then
if type(talentFromAura) == "table" then
if not talentFromAura[1] or talentFromAura[1]==0 or session_gGUIDs[sourceName][ talentFromAura[1] ] then
for i=2,#talentFromAura do
session_gGUIDs[sourceName] = -talentFromAura[i]
end
end
else
session_gGUIDs[sourceName] = -talentFromAura
end
forceUpdateAllData = true
end
if (spellID == 328622 or spellID == 388010) and destName then --Blessing of Autumn
C_Timer.After(.5,function()
if blessingcdr[sourceName] then
blessingcdr[sourceName]:Cancel()
end
end)
elseif spellID == 64901 and destName then --Symbol of Hope
C_Timer.After(0.1,function()
if symbolofhope[sourceName..":"..destName] then
symbolofhope[sourceName..":"..destName]:OnCancel()
symbolofhope[sourceName..":"..destName]:Cancel()
end
end)
elseif spellID == 204366 and destName then --Thundercharge
C_Timer.After(.5,function()
if thundercharge[destName] then
thundercharge[destName]:Cancel()
end
end)
elseif (spellID == 327710 or spellID == 345453) and destName then --Benevolent Faerie
local db = spellID == 327710 and faerie or faerieCond
C_Timer.After(0.1,function()
if db[sourceName..":"..destName] then
db[sourceName..":"..destName]:OnCancel()
db[sourceName..":"..destName]:Cancel()
end
end)
elseif (spellID == 314791 or spellID == 382440) then --Shifting Power
if shiftingpower[sourceName] then
local now = GetTime()
if abs(now - shiftingpower[sourceName].t_end) > 0.2 then
shiftingpower[sourceName]:Cancel()
end
end
elseif (spellID == 404977) then --Time Skip
if timeskip[sourceName] then
local now = GetTime()
if abs(now - timeskip[sourceName].t_end) > 0.2 then
timeskip[sourceName]:Cancel()
end
end
elseif spellID == 206005 then --Xavius: Dream Simulacrum
for i=1,#_C do
local unitSpellData = _C[i]
if unitSpellData.fullName == destName then
unitSpellData:SetCD(0,true)
unitSpellData:SetDur(0,true)
forceUpdateAllData = true
end
end
end
$$$1
if forceUpdateAllData then
UpdateAllData()
end
end
]]},
PREP = {main=[[
return function ()
$$$1
end
]]},
SPELL_SUMMON = {isEmpty=true,main=[[
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,spellID,spellName)
$$$2
$$$1
end
]]},
SPELL_AURA_APPLIED_DOSE = {isEmpty=true,main=[[
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,spellID,spellName,_,type,stack)
$$$2
$$$1
end
]]},
SPELL_AURA_REMOVED_DOSE = {isEmpty=true,main=[[
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,spellID,spellName,_,type,stack)
$$$2
$$$1
end
]]},
SPELL_DISPEL = {main=[[
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,spellID,spellName,_,destSpell)
$$$2
if spell_dispellsList[spellID] and sourceName then
_db.spell_dispellsFix[ sourceName ] = true
end
$$$1
end
]]},
SPELL_DAMAGE = {isEmpty=true,main=[[
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,spellID,spellName,_,amount,overkill,school,resisted,blocked,absorbed,critical,glancing,crushing,isOffHand)
$$$2
$$$1
end
]],subevents={RANGE_DAMAGE=true,SPELL_PERIODIC_DAMAGE=true,SWING_DAMAGE=[[
local meleeStr = GetSpellInfo(6603)
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,amount,overkill,school,resisted,blocked,absorbed,critical,glancing,crushing,isOffHand)
if not eventsView.SPELL_DAMAGE then return end
return eventsView.SPELL_DAMAGE(timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,6603,meleeStr,1,amount,overkill,school,resisted,blocked,absorbed,critical,glancing,crushing,isOffHand)
end
]]}},
SPELL_HEAL = {isEmpty=true,main=[[
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,spellID,spellName,_,amount,overhealing,absorbed,critical)
$$$2
$$$1
end
]],subevents={SPELL_PERIODIC_HEAL=true}},
SPELL_ENERGIZE = {isEmpty=true,main=[[
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,spellID,spellName,_,amount,overEnergize,powerType,alternatePowerType)
$$$2
$$$1
end
]],subevents={SPELL_PERIODIC_ENERGIZE=true}},
SPELL_MISSED = {isEmpty=true,main=[[
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,spellID,spellName,_,missType,isOffHand,amountMissed,critical)
$$$2
$$$1
end
]],subevents={RANGE_MISSED=true,SPELL_PERIODIC_MISSED=true,SWING_MISSED=[[
local meleeStr = GetSpellInfo(6603)
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,missType,isOffHand,amountMissed,critical)
if not eventsView.SPELL_MISSED then return end --temp fix
return eventsView.SPELL_MISSED(timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,6603,meleeStr,1,missType,isOffHand,amountMissed,critical)
end
]]}},
SPELL_INTERRUPT = {isEmpty=true,main=[[
return function (timestamp,event,hideCaster,sourceGUID,sourceName,sourceFlags,sourceFlags2,destGUID,destName,destFlags,destFlags2,spellID,spellName,_,destSpell)
$$$2
$$$1
end
]]},
}
function CLEU:Recreate()
env.globalGUIDs = globalGUIDs
for event,db in pairs(CLEU.Events) do
if db.isEmpty and #db == 0 then
eventsView[event] = nil
else
local full = db.main
for i=1,#db do
full = full:gsub("%$%$%$1",db[i].."$$$1")
end
if ExRT.isClassic and not ExRT.isCata then
if db.classic then
full = full:gsub("%$%$%$2",db.classic.."$$$2")
end
full = full:gsub("%$%$%$2","local spellIDClassic = spellID;spellID=spellName")
end
full = full:gsub("%$%$%$%d","")
local f = assert(loadstring(full,"ExCD2:"..event))
setfenv(f,env)
eventsView[event] = f()
if db.subevents then
for subevent,substr in pairs(db.subevents) do
if type(substr) == "string" then
local sf = assert(loadstring(substr,"ExCD2:"..subevent))
setfenv(sf,env)
eventsView[subevent] = sf()
else
eventsView[subevent] = eventsView[event]
end
end
end
db.devstr = full
end
end
eventsView.PREP()
eventsView.PREP = nil
end
function CLEU:Reset()
for event,db in pairs(CLEU.Events) do
if db.main then
for i=1,#db do
db[i] = nil
end
else
CLEU.Events[event] = nil
end
end
end
function CLEU:Add(event,str)
if event:find("^CLEU_") then
event = event:gsub("^CLEU_","")
end
if not CLEU.Events[event] then
return
end
tinsert(CLEU.Events[event],str)
end
local isPaladin = _db.vars.isPaladin
function module.main:ARENA_COOLDOWNS_UPDATE(unitID)
local guid = UnitGUID(unitID)
if not guid then return end
if isPaladin[guid] then
local t = GetTime()
if (t - 0.5) < (env.avengershield_var[guid] or 0) then
local name,realm = UnitName(unitID)
if name then
if realm then
name = name .. "-" .. realm
end
local line = _db.cdsNav[name][31935]
if line then
line:ResetCD()
end
end
end
end
end
local SCSSpells = {}
local SCSBlack = {}
function module.main:UNIT_SPELLCAST_SUCCEEDED(unitID,castGUID,spellID)
if SCSSpells[spellID] then
if SCSBlack[castGUID] then
return
end
SCSBlack[castGUID] = true
local guid = UnitGUID(unitID)
local name = UnitName(unitID)
eventsView.SPELL_CAST_SUCCESS(0,"SPELL_CAST_SUCCESS",false,guid,name,0,0,"","",0,0,spellID,GetSpellInfo(spellID),1)
if spellID == 5384 then
local line = _db.cdsNav[name][5384]
if ExRT.isClassic and not ExRT.isCata and not line then
line = _db.cdsNav[name][GetSpellInfo(5384)]
end
if line then
line:SetCD(360)
end
FD_GUIDs[guid] = true
if not IsInJailersTower() then
module:RegisterEvents('UNIT_AURA')
if ScheduledUnitAura then
ScheduledUnitAura:Cancel()
end
ScheduledUnitAura = ScheduleTimer(function()
ScheduledUnitAura = nil
module:UnregisterEvents('UNIT_AURA')
end,361)
end
end
end
end
function module.main.UNIT_DIED(_,_,_,destGUID,destName,destFlags)
if destName then
local _,class = UnitClass(destName)
if class == "SHAMAN" then
_db.spell_ReincarnationFix[destName] = true
end
end
end
function module.main:SPELL_RESURRECT(_,_,_,destGUID,destName,destFlags)
if destName and _db.spell_ReincarnationFix[destName] then
_db.spell_ReincarnationFix[destName] = nil
end
end
function module.main:UNIT_FLAGS(unitID)
local name = UnitCombatlogname(unitID)
if _db.spell_ReincarnationFix[name] and not UnitIsDead(unitID) then
if not UnitIsGhost(unitID) then
local hp = UnitHealth(unitID) / max(UnitHealthMax(unitID),1)
if hp < 0.45 then
eventsView.SPELL_CAST_SUCCESS(0,"SPELL_CAST_SUCCESS",false,UnitGUID(unitID),name,0,0,"","",0,0,20608,GetSpellInfo(20608),1)
end
end
_db.spell_ReincarnationFix[name] = nil
end
end
local isACUAdded = nil
local isSCSAdded = nil
local isAnkhAdded
function module:AddCLEUSpellDamage(spellID)
if spellID == 31935 and not isACUAdded then
module:RegisterEvents('ARENA_COOLDOWNS_UPDATE')
isACUAdded = true
elseif spellID == 5384 and not isSCSAdded then
module:RegisterEvents('UNIT_SPELLCAST_SUCCEEDED')
isSCSAdded = true
SCSSpells[5384] = true
elseif ExRT.isClassic and spellID == 20608 and not isAnkhAdded then
_db.spell_ReincarnationFix = {}
module:RegisterEvents('UNIT_FLAGS')
eventsView.UNIT_DIED = module.main.UNIT_DIED
eventsView.SPELL_RESURRECT = module.main.SPELL_RESURRECT
isAnkhAdded = true
end
end
end
function module.options:Load()
self:CreateTilte()
self.decorationLine = ELib:DecorationLine(self,true,"BACKGROUND",-5):Point("TOPLEFT",self,0,-25):Point("BOTTOMRIGHT",self,"TOPRIGHT",0,-45)
self.chkEnable = ELib:Check(self,L.Enable,VMRT.ExCD2.enabled):Point(720,-26):Size(18,18):Tooltip("/rt cd"):AddColorState():TextButton():OnClick(function(self)
if self:GetChecked() then
module:Enable()
else
module:Disable()
end
end)
self.chkLock = ELib:Check(self,L.cd2fix,VMRT.ExCD2.lock):Point(590,-26):Size(18,18):OnClick(function(self)
if self:GetChecked() then
VMRT.ExCD2.lock = true
else
VMRT.ExCD2.lock = nil
end
module:UpdateLockState()
end)
self.tab = ELib:Tabs(self,0,L.cd2Spells,L.cd2Appearance,L.cd2History):Point(0,-45):Size(850,589):SetTo(1)
self.tab:SetBackdropBorderColor(0,0,0,0)
self.tab:SetBackdropColor(0,0,0,0)
self.CATEGORIES_DEF = {
"ALL",
"ENABLED",
"FAV",
}
self.CATEGORIES_VIS = {
["ALL"] = {name = L.cd2CatAll,icon = ExRT.isClassic and 133733 or 1495827, sort = 0},
["RAID"] = {name = L.cd2CatMajor,icon = 136107, sort = 10, ignoreSubcats = true},
["DEFTAR"] = {name = L.cd2CatSingleTar,icon = 135928, sort = 15, ignoreSubcats = true},
["RES"] = {name = L.cd2CatRes,icon = 136080, sort = 20, ignoreSubcats = true},
["RAIDSPEED"] = {name = L.cd2CatRaidMove,icon = 464343, sort = 25, ignoreSubcats = true},
["KICK"] = {name = L.cd2CatKicks,icon = 132219, sort = 30, ignoreSubcats = true},
["UTIL"] = {name = L.cd2CatUtil,icon = 458224, sort = 35, ignoreSubcats = true},
["AOECC"] = {name = L.cd2CatMassStun,icon = 136013, sort = 40, ignoreSubcats = true},
["HEALUTIL"] = {name = L.cd2CatHealUtil,icon = 136048, sort = 45, ignoreSubcats = true},
["DISPEL"] = {name = L.cd2CatDispells,icon = 135894, sort = 50, ignoreSubcats = true},
["TAUNT"] = {name = L.cd2CatTaunts,icon = 132270, sort = 55, ignoreSubcats = true},
["DPS"] = {name = L.cd2CatDPS,icon = 135753, sort = 60, ignoreSubcats = true},
["HEAL"] = {name = L.cd2CatHeal,icon = 1060983, sort = 65, ignoreSubcats = true},
["DEFTANK"] = {name = L.cd2CatDefTank,icon = 132361, sort = 70, ignoreSubcats = true},
["DEF"] = {name = L.cd2CatDef,icon = 135896, sort = 75, ignoreSubcats = true},
["CC"] = {name = L.cd2CatCC,icon = 136175, sort = 80, ignoreSubcats = true},
["MOVE"] = {name = L.cd2CatMove,icon = 574574, sort = 85, ignoreSubcats = true},
["WARRIOR"] = {name = L.classLocalizate["WARRIOR"],icon = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES", iconTcoord = CLASS_ICON_TCOORDS["WARRIOR"], sort = 101, isClassCategory = true},
["PALADIN"] = {name = L.classLocalizate["PALADIN"],icon = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES", iconTcoord = CLASS_ICON_TCOORDS["PALADIN"], sort = 102, isClassCategory = true},
["HUNTER"] = {name = L.classLocalizate["HUNTER"],icon = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES", iconTcoord = CLASS_ICON_TCOORDS["HUNTER"], sort = 103, isClassCategory = true},
["ROGUE"] = {name = L.classLocalizate["ROGUE"],icon = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES", iconTcoord = CLASS_ICON_TCOORDS["ROGUE"], sort = 104, isClassCategory = true},
["PRIEST"] = {name = L.classLocalizate["PRIEST"],icon = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES", iconTcoord = CLASS_ICON_TCOORDS["PRIEST"], sort = 105, isClassCategory = true},
["DEATHKNIGHT"] = {name = L.classLocalizate["DEATHKNIGHT"],icon = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES", iconTcoord = CLASS_ICON_TCOORDS["DEATHKNIGHT"], sort = 106, isClassCategory = true},
["SHAMAN"] = {name = L.classLocalizate["SHAMAN"],icon = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES", iconTcoord = CLASS_ICON_TCOORDS["SHAMAN"], sort = 107, isClassCategory = true},
["MAGE"] = {name = L.classLocalizate["MAGE"],icon = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES", iconTcoord = CLASS_ICON_TCOORDS["MAGE"], sort = 108, isClassCategory = true},
["WARLOCK"] = {name = L.classLocalizate["WARLOCK"],icon = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES", iconTcoord = CLASS_ICON_TCOORDS["WARLOCK"], sort = 109, isClassCategory = true},
["MONK"] = {name = L.classLocalizate["MONK"],icon = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES", iconTcoord = CLASS_ICON_TCOORDS["MONK"], sort = 110, isClassCategory = true},
["DRUID"] = {name = L.classLocalizate["DRUID"],icon = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES", iconTcoord = CLASS_ICON_TCOORDS["DRUID"], sort = 111, isClassCategory = true},
["DEMONHUNTER"] = {name = L.classLocalizate["DEMONHUNTER"],icon = "Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES", iconTcoord = CLASS_ICON_TCOORDS["DEMONHUNTER"], sort = 112, isClassCategory = true},
["EVOKER"] = {name = L.classLocalizate["EVOKER"],icon = "interface/icons/classicon_evoker", sort = 113, isClassCategory = true},
["ITEMS"] = {name = L.cd2CatItems,icon = 135918, sort = 140, ignoreSubcats = true},
["ESSENCES"] = {name = L.cd2CatEssences,icon = 2967111, sort = 150, ignoreSubcats = true},
["COVENANTS"] = {name = L.cd2CatCovenants,icon = 3528296, sort = 151, ignoreSubcats = true},
["RACIAL"] = {name = L.cd2CatRacial,icon = 135727, sort = 160, ignoreSubcats = true},
["PET"] = {name = PET,icon = 613074, sort = 185, ignoreSubcats = true},
["PVP"] = {name = CALENDAR_TYPE_PVP,icon = 236396, sort = 190, ignoreSubcats = true},
["NO"] = {name = L.cd2CatOther,icon = 136011, sort = 195, ignoreSubcats = true, isHidden = true},
["OTHER"] = {name = L.cd2CatOther,icon = 136011, sort = 197, ignoreSubcats = true},
["USER"] = {name = L.cd2CatUser,icon = 133667, sort = 199, ignoreOwncat = true},
["ENABLED"] = {name = L.cd2CatEnabled,icon = ExRT.isClassic and 136170 or 236372, sort = 5, ignoreSubcats = true},
["FAV"] = {name = L.cd2Favorite,icon = "Interface\\AddOns\\"..GlobalAddonName.."\\media\\star2", iconTcoord = {0,.5,0,.5}, sort = 310, ignoreSubcats = true},
}
self.categories = ELib:ScrollFrame(self.tab.tabs[1]):Point("TOPLEFT",0,0):Size(100,589)
ELib:Border(self.categories,0)
self.categories.C:SetWidth(100)
self.categories.mouseWheelRange = 200
self.categories.ScrollBar:Size(8,0):Point("TOPRIGHT",0,0):Point("BOTTOMRIGHT",0,0)
self.categories.ScrollBar.thumb:SetHeight(100)
self.categories.ScrollBar.buttonUP:Hide()
self.categories.ScrollBar.buttonDown:Hide()
self.categories.ScrollBar.borderLeft:Hide()
self.categories.ScrollBar.borderRight:Hide()
self.categories.ScrollBar.bg:Hide()
self.categories.buttons = {}
self.categories.border_right = ELib:Texture(self.categories,.24,.25,.30,1,"BORDER"):Point("TOPLEFT",self.categories,"TOPRIGHT",0,0):Point("BOTTOMRIGHT",self.categories,"BOTTOMRIGHT",1,0)
local function CategoriesButtonOnEnter(self)
if not self.isActive then
self.background:Show()
end
end
local function CategoriesButtonOnLeave(self)
self.background:Hide()
end
local function CategoriesButtonOnClick(self)
for i=1,#module.options.categories.buttons do
module.options.categories.buttons[i].isActive = false
end
self.background:Hide()
self.isActive = true
module.options.categories:Update()
module.options.list:UpdateDB(self.category)
module.options.list:Update()
module.options.list.ScrollBar.slider:SetValue(0)
end
local CATEGORIES_INDEX_COUNTER = 200
function self:GetAllSpells(addPvP)
local new = {}
for i=1,#module.db.AllSpells do
if addPvP then
new[i] = module.db.AllSpells[i]
else
local findPvP = false
for cat in string.gmatch(module.db.AllSpells[i][2], "[^,]+") do
if cat == "PVP" then
findPvP = true
break
end
end
if (findPvP and addPvP) or (not findPvP and not addPvP) then
new[#new+1] = module.db.AllSpells[i]
end
end
end
for i=1,#VMRT.ExCD2.userDB do
local line = VMRT.ExCD2.userDB[i]
if type(line[2]) == "string" and type(line[3]) == "number" then
new[#new+1] = line
local findUserCat = false
for cat in string.gmatch(line[2], "[^,]+") do
if cat == "USER" then
findUserCat = true
break
end
end
if not findUserCat then
line[2] = line[2] .. ",USER"
end
end
end
return new
end
local function SortCategoriesButtons(a,b)
return (self.CATEGORIES_VIS[a] and self.CATEGORIES_VIS[a].sort or 200) < (self.CATEGORIES_VIS[b] and self.CATEGORIES_VIS[b].sort or 200)
end
function self.categories:Update()
local cats = ExRT.F.table_copy2(module.options.CATEGORIES_DEF)
local AllSpells = module.options:GetAllSpells(true)
for _,data in pairs(AllSpells) do
for cat in string.gmatch(data[2], "[^,]+") do
if not ExRT.F.table_find(cats,cat) then
cats[#cats+1] = cat
end
end
end
for i=#cats,1,-1 do
if module.options.CATEGORIES_VIS[ cats[i] ] and module.options.CATEGORIES_VIS[ cats[i] ].isHidden then
tremove(cats,i)
end
end
sort(cats,SortCategoriesButtons)
for i=1,#cats do
local button = self.buttons[i]
if not button then
button = CreateFrame("Button",nil,self.C)
self.buttons[i] = button
if i == 1 then
button:SetPoint("TOP",0,0)
else
button:SetPoint("TOP",self.buttons[i-1],"BOTTOM",0,-2)
end
button:SetSize(88,62)
button.icon = button:CreateTexture(nil, "ARTWORK")
button.icon:SetPoint("TOP",0,-3)
button.icon:SetSize(30,30)
button.text = button:CreateFontString(nil,"ARTWORK","ExRTFontNormal")
button.text:SetFont(button.text:GetFont(),11,"")
button.text:SetPoint("TOP",button.icon,"BOTTOM",0,-3)
button.text:SetPoint("BOTTOM",0,1)
button.text:SetPoint("LEFT",2,0)
button.text:SetPoint("RIGHT",-2,0)
button.text:SetJustifyH("CENTER")
button.text:SetJustifyV("TOP")
button.class = button:CreateTexture(nil, "BACKGROUND")
button.class:SetPoint("TOP")
button.class:SetPoint("BOTTOM")
button.class:SetPoint("LEFT",self,0,0)
button.class:SetPoint("RIGHT",self,0,0)
button.class:Hide()
button.background = button:CreateTexture(nil, "BACKGROUND")
button.background:SetPoint("TOP")
button.background:SetPoint("BOTTOM")
button.background:SetPoint("LEFT",self,0,0)
button.background:SetPoint("RIGHT",self,0,0)
button.background:SetColorTexture(1,1,1,.3)
button.background:Hide()
button.active = button:CreateTexture(nil, "BACKGROUND")
button.active:SetPoint("TOP")
button.active:SetPoint("BOTTOM")
button.active:SetPoint("LEFT",self,0,0)
button.active:SetPoint("RIGHT",self,0,0)
button.active:SetColorTexture(.8,.6,0,1)
button.active:Hide()
button:SetScript("OnEnter",CategoriesButtonOnEnter)
button:SetScript("OnLeave",CategoriesButtonOnLeave)
button:SetScript("OnClick",CategoriesButtonOnClick)
end
local cat = cats[i]
local catData = module.options.CATEGORIES_VIS[cat]
button.icon:SetTexture(catData and catData.icon or "Interface\\Icons\\INV_MISC_QUESTIONMARK")
if catData and catData.iconTcoord then
button.icon:SetTexCoord(unpack(catData.iconTcoord))
else
button.icon:SetTexCoord(0,1,0,1)
end
button.text:SetText(catData and catData.name or cat)
button.active:SetShown(button.isActive)
button.category = cat
if cat == "ALL" then
button.category = nil
end
if ExRT.GDB.ClassID[cat] then
local r,g,b = ExRT.F.classColorNum(cat)
button.class:SetColorTexture(r,g,b,.3)
button.class:Show()
else
button.class:Hide()
end
if not catData then
module.options.CATEGORIES_VIS[cat] = {sort = CATEGORIES_INDEX_COUNTER,ignoreSubcats = true}
CATEGORIES_INDEX_COUNTER = CATEGORIES_INDEX_COUNTER + 1
end
button:Show()
end
for i=#cats+1,#self.buttons do
self.buttons[i]:Hide()
end
self:Height(64 * #cats - 2)
end
self.list = ELib:ScrollFrame(self.tab.tabs[1]):Point("TOPLEFT",101,0):Size(749,589)
ELib:Border(self.list,0)
self.list.mouseWheelRange = 50
local SPELL_LINE_HEIGHT = 32
local function SpellsListLineOnUpdate(self)
if module.options.list.colBySpecFrame:IsShown() or module.options.list.colByRoleFrame:IsShown() then
return
end
local alpha = 0.4
if self:IsMouseOver() and not ExRT.lib.ScrollDropDown.DropDownList[1]:IsShown() then
alpha = 0.8
end
self.backClassColor:SetGradient("HORIZONTAL",CreateColor(self.backClassColorR, self.backClassColorG, self.backClassColorB, alpha), CreateColor(self.backClassColorR, self.backClassColorG, self.backClassColorB, 0))
if self:IsMouseOver() and not self.colExpand:IsShown() and self.colBack:IsShown() then
self.colExpand:Show()
elseif not self:IsMouseOver() and self.colExpand:IsShown() then
self.colExpand:Hide()
end
if self:IsMouseOver() and not self.colExpand2:IsShown() then
self.colExpand2:Show()
elseif not self:IsMouseOver() and self.colExpand2:IsShown() then
self.colExpand2:Hide()
end
end
local function SpellsListTooltipFrameOnEnter(self)
local parent = self:GetParent()
if not parent.data then
return
end
ELib.Tooltip.Link(self,self.link or "spell:"..parent.data[1])
local additional = {}
if parent.data[1] == 161642 then
additional[#additional+1] = L.cd2ResurrectTooltip
end
if module.db.spell_isTalent[ parent.data[1] ] and not parent.isItem and not module.db.spell_covenant[ parent.data[1] ] then
additional[#additional+1] = "|cffffffff"..L.cd2AddSpellFrameTalent.."|r"..(ExRT.isClassic and " |cffff8888(*will be shown only after first usage)|r" or "")
end
if module.db.spell_dispellsList[ parent.data[1] ] then
additional[#additional+1] = "|cffffffaa"..L.cd2AddSpellFrameDispel.."|r"
end
if module.db.spell_talentReplaceOther[ parent.data[1] ] then
local spellID = module.db.spell_talentReplaceOther[ parent.data[1] ]
if type(spellID)=='table' then
for i=1,#spellID do
local sname,_,sicon = GetSpellInfo(spellID[i])
additional[#additional+1] = "|cffffaaaa"..L.cd2AddSpellFrameReplace .." "..(sicon and "|T"..sicon..":20|t" or "").. (sname or "???") .."|r"
end
else
local sname,_,sicon = GetSpellInfo(spellID)
additional[#additional+1] = "|cffffaaaa"..L.cd2AddSpellFrameReplace .." "..(sicon and "|T"..sicon..":20|t" or "").. (sname or "???") .."|r"
end
end
if module.db.spell_isPetAbility[ parent.data[1] ] then
additional[#additional+1] = "|cffffffff"..L.BossWatcherBuffsAndDebuffsFilterPets.."|r"
end
if #additional > 0 then
ELib.Tooltip:Add(nil,additional)
end
end
local function SpellsListTooltipFrameOnLeave(self)
GameTooltip_Hide()
ELib.Tooltip:HideAdd()
end
local function SpellsListLineColExpand(self)
module.options.list.colBySpecFrame:Open(self:GetParent(),self)
end
local function SpellsListLineColExpandRole(self)
module.options.list.colByRoleFrame:Open(self:GetParent(),self)
end
local function SpellsListChkOnClick(self)
if self.disabled then
VMRT.ExCD2.CDE[ self:GetParent().data[1] ] = nil
if self:GetChecked() then
self:SetChecked(false)
end
elseif self:GetChecked() then
VMRT.ExCD2.CDE[ self:GetParent().data[1] ] = true
else
VMRT.ExCD2.CDE[ self:GetParent().data[1] ] = nil
end
self:UpdateColors()
module:UpdateSpellDB(true)
module.options.list:Update()
end
local function SpellsListChkUpdateColors(self)
local cR,cG,cB
if self.disabled then
cR,cG,cB = .5,.5,.5
elseif self:GetChecked() then
cR,cG,cB = .2,.8,.2
else
cR,cG,cB = .8,.2,.2
end
self.BorderTop:SetColorTexture(cR,cG,cB,1)
self.BorderLeft:SetColorTexture(cR,cG,cB,1)
self.BorderBottom:SetColorTexture(cR,cG,cB,1)
self.BorderRight:SetColorTexture(cR,cG,cB,1)
end
local function SpellsListCDTooltipFrameOnEnter(self)
local data = self:GetParent().data
if not data then
return
end
GameTooltip:SetOwner(self, "ANCHOR_LEFT")
local className = self:GetParent().data_class
if module.db.specByClass[className] then
for i=1,#module.db.specByClass[className] do
if data[3+i] then
local icon = ""
if module.db.specIcons[module.db.specByClass[className][i]] then
icon = "|T".. module.db.specIcons[module.db.specByClass[className][i]] ..":20|t"
else
icon = ExRT.F.classIconInText(className,20) or ""
end
GameTooltip:AddLine(icon.." |c"..ExRT.F.classColor(className)..L.specLocalizate[module.db.specInLocalizate[module.db.specByClass[className][i]]].. ":|r|cffffffff "..L.cd2AddSpellFrameCDText.." "..format("%d:%02d",data[i+3][2]/60,data[i+3][2]%60).. (data[i+3][3] > 0 and ", "..L.cd2AddSpellFrameDurationText.." "..data[i+3][3] or ""))
end
end
else
GameTooltip:AddLine("|cffffffff"..L.cd2AddSpellFrameCDText.." "..data[4][2].. (data[4][3] > 0 and ", "..L.cd2AddSpellFrameDurationText.." "..data[4][3] or ""))
end
do
local cdByTalent_fix = nil
local readiness_lines = {}
if module.db.spell_cdByTalent_fix[ data[1] ] then
cdByTalent_fix = true
for j=1,#module.db.spell_cdByTalent_fix[ data[1] ],2 do
local spellID = module.db.spell_cdByTalent_fix[ data[1] ][j]
local specInfo
if type(spellID) == "table" then
specInfo = L.specLocalizate[ module.db.specInLocalizate[ spellID[2] ] ]
spellID = spellID[1]
end
local sname,_,sicon = GetSpellInfo(spellID)
local cd = module.db.spell_cdByTalent_fix[ data[1] ][j+1]
local isSoulbind
local isRank
if type(cd) == 'table' and ExRT.isLK then
cd = cd[#cd]
elseif type(cd) == 'table' and #cd > 5 then
cd = cd[5]
isSoulbind = true
elseif type(cd) == 'table' then
isRank = #cd
cd = cd[#cd]
end
if type(cd) == 'table' then
local tal_sid = cd[2]
if not tonumber(cd[1]) then
cd = tonumber(string.sub(cd[1],2))
if cd < 1 then
cd = "-"..( (1-cd)*100 ).."%"
else
cd = "+"..( (cd-1)*100 ).."%"
end
else
cd = "+"..cd
end
local spellname,_,spellicon = GetSpellInfo(tal_sid)
cd = cd .. " during "..(spellicon and "|T"..spellicon..":20|t" or "")..(spellname or tal_sid)
elseif not tonumber(cd) then
cd = tonumber(string.sub(cd,2))
if cd < 1 then
cd = "-"..( (1-cd)*100 ).."%"
else
cd = "+"..( (cd-1)*100 ).."%"
end
end
table.insert(readiness_lines,"|cffffffff - "..(sicon and "|T"..sicon..":20|t" or "")..(sname or "???") .." (".. (tonumber(cd) and cd > 0 and "+" or "").. cd .. (isSoulbind and " [soulbind rank 5]" or "") .. (isRank and " [rank "..isRank.."]" or "") ..")"..(specInfo and " <"..specInfo..">" or "").."|r")
ELib.Tooltip:Add("spell:"..spellID)
end
end
if cdByTalent_fix then
GameTooltip:AddLine("|cffffaaaa"..L.cd2AddSpellFrameCDChange..": |r")
for j=1,#readiness_lines do
GameTooltip:AddLine(readiness_lines[j])
end
end
end
if module.db.spell_charge_fix[ data[1] ] then
if module.db.spell_charge_fix[ data[1] ] == 1 then
GameTooltip:AddLine("|cffffffaa"..L.cd2AddSpellFrameCharge.."|r")
else
GameTooltip:AddLine("|cffffffaa"..L.cd2AddSpellFrameChargeChange..":|r")
local sname = GetSpellInfo(module.db.spell_charge_fix[ data[1] ])
GameTooltip:AddLine("|cffffffff - "..(sname or "???") .."|r")
end
end
if module.db.spell_sharingCD[ data[1] ] then
GameTooltip:AddLine("|cffffffaa"..L.cd2AddSpellFrameSharing..": |r")
for otherID,otherCD in pairs(module.db.spell_sharingCD[ data[1] ]) do
local sname = GetSpellInfo(otherID)
GameTooltip:AddLine("|cffffffff - "..(sname or "???") .." (".. otherCD ..")|r")
end
end
if module.db.spell_reduceCdByHaste[ data[1] ] then
GameTooltip:AddLine("|cffffffaa"..L.cd2AddSpellFrameCDHaste..": |r")
end
for castSpellID,castData in pairs(module.db.spell_reduceCdCast) do
for i=1,#castData,2 do
local sID = castData[i]
if type(sID) == 'table' then
if sID[1] == data[1] then
local spellname,_,spellicon = GetSpellInfo(castSpellID)
if not sID[3] and not sID[4] then
local spellnameT,_,spelliconT = GetSpellInfo(sID[2])
GameTooltip:AddLine("|cffffffaa"..L.cd2AddSpellFrameCasting1.." "..(spellicon and "|T"..spellicon..":20|t" or "")..(spellname or castSpellID).." "..L.cd2AddSpellFrameCasting3.." "..(spelliconT and "|T"..spelliconT..":20|t" or "")..(spellnameT or sID[2]).." "..L.cd2AddSpellFrameCasting2.." "..(type(castData[i+1])=="table" and castData[i+1][#castData[i+1]].." (rank "..#castData[i+1]..")" or castData[i+1]).." |r")
elseif sID[4] then
local spellnameT,_,spelliconT = GetSpellInfo(sID[4])
GameTooltip:AddLine("|cffffffaa"..L.cd2AddSpellFrameCasting1.." "..(spellicon and "|T"..spellicon..":20|t" or "")..(spellname or castSpellID).." "..L.cd2AddSpellFrameCasting4.." "..(spelliconT and "|T"..spelliconT..":20|t" or "")..(spellnameT or sID[2]).." "..L.cd2AddSpellFrameCasting2.." "..(type(castData[i+1])=="table" and castData[i+1][#castData[i+1]].." (rank "..#castData[i+1]..")" or castData[i+1]).." |r")
elseif sID[3] then
local spellnameT,_,spelliconT = GetSpellInfo(sID[2])
GameTooltip:AddLine("|cffffffaa"..L.cd2AddSpellFrameCasting1.." "..(spellicon and "|T"..spellicon..":20|t" or "")..(spellname or castSpellID).." "..L.cd2AddSpellFrameCasting3.." "..(spelliconT and "|T"..spelliconT..":20|t" or "")..(spellnameT or sID[2]).." "..L.cd2AddSpellFrameCasting5.." "..L.specLocalizate[ module.db.specInLocalizate[ sID[3] ] ].." "..L.cd2AddSpellFrameCasting2.." "..(type(castData[i+1])=="table" and castData[i+1][#castData[i+1]].." (rank "..#castData[i+1]..")" or castData[i+1]).." |r")
end
end
elseif sID == data[1] then
local spellname,_,spellicon = GetSpellInfo(castSpellID)
GameTooltip:AddLine("|cffffffaa"..L.cd2AddSpellFrameCasting1.." "..(spellicon and "|T"..spellicon..":20|t" or "")..(spellname or castSpellID).." "..L.cd2AddSpellFrameCasting2.." "..(type(castData[i+1])=="table" and castData[i+1][5].." (soulbind rank 5)" or castData[i+1]).." |r")
end
end
end
GameTooltip:Show()
end
local function SpellsListCDTooltipFrameOnLeave(self)
GameTooltip_Hide()
ELib.Tooltip:HideAdd()
end
local function SpellsListDurTooltipFrameOnEnter(self)
local data = self:GetParent().data
if not data then
return
end
GameTooltip:SetOwner(self, "ANCHOR_LEFT")
local something
if module.db.spell_durationByTalent_fix[ data[1] ] then
GameTooltip:AddLine("|cffaaffaa"..L.cd2AddSpellFrameDuration..":|r")
for j=1,#module.db.spell_durationByTalent_fix[data[1]],2 do
local sname = GetSpellInfo(module.db.spell_durationByTalent_fix[ data[1] ][j]) or "???"
local cd = module.db.spell_durationByTalent_fix[ data[1] ][j+1]
local isRank
if type(cd) == 'table' then
isRank = #cd
cd = cd[#cd]
end
if type(cd) == 'table' then
cd = strjoin(",",unpack(cd))
elseif not tonumber(cd) then
cd = tonumber(string.sub(cd,2))
if cd < 1 then
cd = "-"..( (1-cd)*100 ).."%"
else
cd = "+"..( (cd-1)*100 ).."%"
end
end
GameTooltip:AddLine("|cffffffff - "..sname .." (".. (tonumber(cd) and cd > 0 and "+" or "").. cd .. (isRank and " [rank "..isRank.."]" or "") ..")|r")
ELib.Tooltip:Add("spell:"..module.db.spell_durationByTalent_fix[ data[1] ][j])
end
something = true
end
do
for auraID,sID in pairs(module.db.spell_aura_list) do
if sID == data[1] then
local sname = GetSpellInfo(auraID) or "???"
GameTooltip:AddLine("|cffaaffaa"..L.cd2AddSpellFrameDurationLost..":|r")
GameTooltip:AddLine("|cffffffff - \""..sname.."\"|r")
something = true
end
end
end
if something then
GameTooltip:Show()
end
end
local function SpellsListDurTooltipFrameOnLeave(self)
GameTooltip_Hide()
ELib.Tooltip:HideAdd()
end
local function SpellsListColSetValue(self,value)
local isEnabled = VMRT.ExCD2.colSet[value] and VMRT.ExCD2.colSet[value].enabled
if value == 0 and self.zeroToNil then value = nil end
self.text:SetText(value and (L.cd2AddSpellFrameColumnText.." "..(not isEnabled and "|cffff0000" or "|cffffffff")..value) or UNUSED)
if self.lock then return end
if type(self.keystr) == "table" then
for i=1,#self.keystr do
VMRT.ExCD2.CDECol[ self.keystr[i] ] = value
end
else
VMRT.ExCD2.CDECol[self.keystr] = value
end
module.options.list:Update()
module:UpdateSpellDB()
end
local priorChangeDelay
local function SpellsListPrioritySetValue(self,value)
self.text:SetText(L.cd2Priority.." |cffffffff"..(100-value).."%")
if self.lock then return end
VMRT.ExCD2.Priority[ self:GetParent().data[1] ] = value
if not priorChangeDelay then
priorChangeDelay = C_Timer.NewTimer(.5,function()
priorChangeDelay = nil
UpdateRoster()
module:UpdateSpellDB()
end)
end
end
local function SpellsListButtonModifyOnClick(self)
if module.options.addModSpellFrame:IsShown() then
module.options.addModSpellFrame:Hide()
end
module.options.addModSpellFrame.data = self:GetParent().data
module.options.addModSpellFrame:Show()
end
local function SpellsListButtonAddOnClick(self)
if module.options.addModSpellFrame:IsShown() then
module.options.addModSpellFrame:Hide()
end
module.options.addModSpellFrame.data = nil
module.options.addModSpellFrame.new_class = self.new_class
module.options.addModSpellFrame:Show()
end
local function SpellsListButtonStarButOnClick(self)
local spellID = self:GetParent().data[1]
VMRT.ExCD2.OptFav[spellID] = not VMRT.ExCD2.OptFav[spellID]
self:Update(VMRT.ExCD2.OptFav[spellID] and 2 or 1)
end
local function SpellsListButtonStarButUpdate(self,type)
if type == 1 or not type then
self.NormalTexture:TexCoord(.5,1,.5,1):Color(.25,.25,.3,1)
self.HighlightTexture:TexCoord(0,.5,.5,1):Color(.25,.25,.3,1)
self.PushedTexture:TexCoord(0,.5,.5,1):Color(.5,.5,.3,1)
elseif type == 2 then
self.NormalTexture:TexCoord(0,.5,0,.5):Color(1,1,1,1)
self.HighlightTexture:TexCoord(0,.5,0,.5):Color(.5,.5,1,1)
self.PushedTexture:TexCoord(0,.5,0,.5):Color(.5,.5,1,1)
end
end
local function SpellsListButtonSortByCol()
module.options.list.sortByCol = true
module.options.list:UpdateDB(module.options.list.current)
module.options.list:Update()
end
local function SpellsListButtonSortByColOnEnter(self)
self.text:Color()
end
local function SpellsListButtonSortByColOnLeave(self)
self.text:Color(1,.82,0,1)
end
self.list.lines = {}
for i=1,ceil(589/SPELL_LINE_HEIGHT)+2 do
local line = CreateFrame("Frame",nil,self.list.C)
self.list.lines[i] = line
line:SetPoint("TOPLEFT",0,-(i-1)*SPELL_LINE_HEIGHT)
line:SetPoint("RIGHT",0,0)
line:SetHeight(SPELL_LINE_HEIGHT)
line.chk = ELib:Check(line):Point("LEFT",10,0):OnClick(SpellsListChkOnClick)
line.chk.UpdateColors = SpellsListChkUpdateColors
line.chk.CheckedTexture:SetVertexColor(0.2,1,0.2,1)
line.backClassColor = line:CreateTexture(nil, "BACKGROUND")
line.backClassColor:SetPoint("LEFT",0,0)
line.backClassColor:SetSize(350,SPELL_LINE_HEIGHT)
line.backClassColor:SetColorTexture(1, 1, 1, 1)
line.backClassColorR = 0
line.backClassColorG = 0
line.backClassColorB = 0
line:SetScript("OnUpdate",SpellsListLineOnUpdate)
line.icon = line:CreateTexture(nil, "ARTWORK")
line.icon:SetSize(28,28)
line.icon:SetPoint("LEFT", line.chk,"RIGHT", 10, 0)
line.icon:SetTexCoord(.1,.9,.1,.9)
ELib:Border(line.icon,1,.12,.13,.15,1)
line.spellName = ELib:Text(line):Size(200,SPELL_LINE_HEIGHT):Point("LEFT",line.icon,"RIGHT",5,0):Font(ExRT.F.defFont,12):Shadow()
line.tooltipFrame = CreateFrame("Frame",nil,line)
line.tooltipFrame:SetAllPoints(line.spellName)
line.tooltipFrame:SetScript("OnEnter", SpellsListTooltipFrameOnEnter)
line.tooltipFrame:SetScript("OnLeave", SpellsListTooltipFrameOnLeave)
line.class = line:CreateTexture(nil, "ARTWORK")
line.class:SetSize(22,22)
line.class:SetPoint("LEFT", line.spellName, "RIGHT", 5, 0)
line.class:SetTexture("Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES")
line.spec = line:CreateTexture(nil, "ARTWORK")
line.spec:SetSize(22,22)
line.spec:SetPoint("RIGHT", line.class, "LEFT", -2, 0)
line.spec1 = line:CreateTexture(nil, "ARTWORK")
line.spec1:SetSize(16,16)
line.spec1:SetPoint("TOPRIGHT", line.class, "TOPLEFT", -2, 0)
line.spec2 = line:CreateTexture(nil, "ARTWORK")
line.spec2:SetSize(16,16)
line.spec2:SetPoint("RIGHT", line.spec1, "LEFT", -1, 0)
line.spec3 = line:CreateTexture(nil, "ARTWORK")
line.spec3:SetSize(16,16)
line.spec3:SetPoint("RIGHT", line.spec2, "LEFT", -1, 0)
line.spec4 = line:CreateTexture(nil, "ARTWORK")
line.spec4:SetSize(16,16)
line.spec4:SetPoint("RIGHT", line.spec3, "LEFT", -1, 0)
line.col = ELib:Slider(line,""):Size(120):Point("LEFT",line.class,"RIGHT",15,-1):Range(1,10):SetTo(11):OnChange(SpellsListColSetValue)
line.col:SetObeyStepOnDrag(true)
line.col.Low:Hide()
line.col.High:Hide()
line.col:SetScript("OnEnter",nil)
line.col:SetScript("OnLeave",nil)
line.col:HideBorders()
line.col.Thumb:SetSize(12,12)
line.col.Thumb:SetTexture("Interface\\AddOns\\"..GlobalAddonName.."\\media\\circle256")
line.col.Thumb:SetVertexColor(0.44,0.45,0.50,1)
line.col.backline = line.col:CreateTexture(nil,"BACKGROUND")
line.col.backline:SetColorTexture(0.44,0.45,0.50,0.7)
line.col.backline:SetPoint("LEFT")
line.col.backline:SetPoint("RIGHT")
line.col.backline:SetHeight(4)
line.col.Text:SetFont(GameFontHighlight:GetFont(),10,"")
line.col.Text:SetTextColor(0.84,0.85,0.90,1)
line.col:SetScript("OnMouseWheel",nil)
line.col.ThumbBySpec = {}
for j=1,4 do
local Thumb = line.col:CreateTexture(nil,"ARTWORK",nil,1-j)
line.col.ThumbBySpec[j] = Thumb
Thumb:SetSize(14,14)
Thumb:SetMask("Interface\\CharacterFrame\\TempPortraitAlphaMask")
Thumb:Hide()
end
line.colBack = CreateFrame("Frame",nil,line)
line.colBack:SetHeight(SPELL_LINE_HEIGHT)
line.colBack:SetPoint("LEFT",line.col)
line.colBack:SetPoint("RIGHT",line.col)
line.colExpand = ELib:Button(line,L.cd2BySpec):Size(90,8):Point("LEFT",line.col,(ExRT.isClassic and not ExRT.isLK) and 15 or -30,0):Point("BOTTOM",line,0,0):OnClick(SpellsListLineColExpand)
line.colExpand.Texture:SetGradient("VERTICAL",CreateColor(0.05,0.26,0.09,1), CreateColor(0.20,0.41,0.25,1))
local textObj = line.colExpand:GetTextObj()
textObj:SetFont(textObj:GetFont(),8,"")
line.colExpand2 = ELib:Button(line,L.cd2ByRole):Size(90,8):Point("LEFT",line.col,60,0):Point("BOTTOM",line,0,0):OnClick(SpellsListLineColExpandRole)
line.colExpand2.Texture:SetGradient("VERTICAL",CreateColor(0.26,0.05,0.09,1), CreateColor(0.41,0.20,0.25,1))
local textObj = line.colExpand2:GetTextObj()
textObj:SetFont(textObj:GetFont(),8,"")
if ExRT.isClassic and not ExRT.isLK then
line.colExpand2.Show = line.colExpand2.Hide
line.colExpand2:Hide()
end
line.prior = ELib:Slider(line,""):Size(120):Point("LEFT",line.col,"RIGHT",15,0):Range(0,100):SetTo(101):OnChange(SpellsListPrioritySetValue)
line.prior:SetObeyStepOnDrag(true)
line.prior.Low:Hide()
line.prior.High:Hide()
line.prior:SetScript("OnEnter",nil)
line.prior:SetScript("OnLeave",nil)
line.prior:HideBorders()
line.prior.Thumb:SetSize(4,12)
line.prior.Thumb:SetColorTexture(0.44,0.45,0.50,1)
line.prior.backline = line.prior:CreateTexture(nil,"BACKGROUND")
line.prior.backline:SetColorTexture(0.44,0.45,0.50,0.7)
line.prior.backline:SetPoint("LEFT")
line.prior.backline:SetPoint("RIGHT")
line.prior.backline:SetHeight(4)
line.prior.Text:SetFont(GameFontHighlight:GetFont(),10,"")
line.prior.Text:SetTextColor(0.84,0.85,0.90,1)
line.prior:SetScript("OnMouseWheel",nil)
line.cd = ELib:Text(line,""):Size(40,SPELL_LINE_HEIGHT):Point("LEFT",line.prior,"RIGHT",15,1):Font(ExRT.F.defFont,14):Shadow():Center():Color(1,.3,.3)
line.cdTooltipFrame = CreateFrame("Frame",nil,line)
line.cdTooltipFrame:SetAllPoints(line.cd)
line.cdTooltipFrame:SetScript("OnEnter", SpellsListCDTooltipFrameOnEnter)
line.cdTooltipFrame:SetScript("OnLeave", SpellsListCDTooltipFrameOnLeave)
line.dur = ELib:Text(line,""):Size(40,SPELL_LINE_HEIGHT):Point("LEFT",line.cd,"RIGHT",5,0):Font(ExRT.F.defFont,14):Shadow():Center():Color(.3,1,.3)
line.durTooltipFrame = CreateFrame("Frame",nil,line)
line.durTooltipFrame:SetAllPoints(line.dur)
line.durTooltipFrame:SetScript("OnEnter", SpellsListDurTooltipFrameOnEnter)
line.durTooltipFrame:SetScript("OnLeave", SpellsListDurTooltipFrameOnLeave)
line.buttonModify = ELib:Button(line,">>"):Size(40,20):Point("LEFT",line.dur,"RIGHT",5,0):OnClick(SpellsListButtonModifyOnClick)
line.buttonAddBig = ELib:Button(line,ADD):Size(0,20):Point("LEFT",10,0):Point("RIGHT",-10,0):OnClick(SpellsListButtonAddOnClick)
line.starBut = ELib:Button(line,"",1):Size(20,20):Point("LEFT",line.dur,"RIGHT",10,0):OnClick(SpellsListButtonStarButOnClick):Tooltip(L.cd2Favorite)
line.starBut.Update = SpellsListButtonStarButUpdate
line.starBut.NormalTexture = ELib:Texture(line.starBut,"Interface\\AddOns\\"..GlobalAddonName.."\\media\\star2"):Point('x')
line.starBut.HighlightTexture = ELib:Texture(line.starBut,"Interface\\AddOns\\"..GlobalAddonName.."\\media\\star2"):Point('x')
line.starBut.PushedTexture = ELib:Texture(line.starBut,"Interface\\AddOns\\"..GlobalAddonName.."\\media\\star2"):Point('x')
line.starBut:SetNormalTexture(line.starBut.NormalTexture)
line.starBut:SetHighlightTexture(line.starBut.HighlightTexture)
line.starBut:SetPushedTexture(line.starBut.PushedTexture)
line.buttonSortByCol = ELib:Button(line,"",1):Size(0,18):Point("LEFT",line.col,0,0):Point("RIGHT",line.col,0,0):OnClick(SpellsListButtonSortByCol):OnEnter(SpellsListButtonSortByColOnEnter):OnLeave(SpellsListButtonSortByColOnLeave)
line.buttonSortByCol.text = ELib:Text(line.buttonSortByCol,L.cd2SortOpt,10):Point("CENTER",line.buttonSortByCol)
line.buttonSortByCol.arrow = ELib:Texture(line.buttonSortByCol,"Interface\\AddOns\\"..GlobalAddonName.."\\media\\DiesalGUIcons16x256x128"):Point("LEFT",line.buttonSortByCol.text,"RIGHT",2,0):Size(14,14):TexCoord(0.25,0.3125,0.5,0.625)
line:Hide()
end
self.list.colBySpecFrame = CreateFrame("Frame",nil,self)
self.list.colBySpecFrame:SetWidth(155)
self.list.colBySpecFrame:SetFrameStrata("DIALOG")
self.list.colBySpecFrame.background = self.list.colBySpecFrame:CreateTexture(nil,"BACKGROUND")
self.list.colBySpecFrame.background:SetAllPoints()
self.list.colBySpecFrame.background:SetColorTexture(0,0,0,.8)
ELib:Border(self.list.colBySpecFrame,2,0.44,0.45,0.50,1)
self.list.colBySpecFrame.close = ELib:Button(self.list.colBySpecFrame,"x"):Size(155-2,10):Point("BOTTOM",0,0):OnClick(function(self) self:GetParent():Hide() end)
self.list.colBySpecFrame:Hide()
self.list.colBySpecFrame.spec = {}
function self.list.colBySpecFrame:Open(line,clickObj)
if self:IsShown() and self.data == line.data[1] then
self:Hide()
return
end
self:ClearAllPoints()
self:SetPoint("TOPRIGHT",clickObj,"BOTTOMRIGHT",5,-2)
local class = line.data_class
local spellID = line.data[1]
local r,g,b = ExRT.F.classColorNum(class)
self.background:SetColorTexture(r*0.5,g*0.5,b*0.5,1)
local specs = line.colExpand.specs
for i=1,#specs do
local slider = self.spec[i]
if not slider then
slider = ELib:Slider(self,L.cd2AddSpellFrameColumnText.." 1"):Size(120):Point("RIGHT",self,"TOPRIGHT",-5,-3-SPELL_LINE_HEIGHT*(i-1)-SPELL_LINE_HEIGHT/2):Range(1,10):SetTo(1):OnChange(SpellsListColSetValue)
self.spec[i] = slider
slider:SetObeyStepOnDrag(true)
slider.Low:Hide()
slider.High:Hide()
slider:SetScript("OnEnter",nil)
slider:SetScript("OnLeave",nil)
slider:HideBorders()
slider.Thumb:SetSize(12,12)
slider.Thumb:SetTexture("Interface\\AddOns\\"..GlobalAddonName.."\\media\\circle256")
slider.Thumb:SetVertexColor(0.44,0.45,0.50,1)
slider.backline = slider:CreateTexture(nil,"BACKGROUND")
slider.backline:SetColorTexture(0.44,0.45,0.50,0.7)
slider.backline:SetPoint("LEFT")
slider.backline:SetPoint("RIGHT")
slider.backline:SetHeight(4)
slider.Text:SetFont(GameFontHighlight:GetFont(),10,"")
slider.Text:SetTextColor(0.44,0.45,0.50,1)
slider:SetScript("OnMouseWheel",nil)
slider.icon = slider:CreateTexture(nil,"ARTWORK")
slider.icon:SetPoint("RIGHT",slider,"LEFT",-5,0)
slider.icon:SetSize(20,20)
end
slider.icon:SetTexture(ExRT.GDB.ClassSpecializationIcons[ specs[i] ])
local specPos = line.colExpand.specsPos[i]
local colStr = line.data[1]..";"..(specPos or 1)
local col = VMRT.ExCD2.CDECol[colStr] or module.db.def_col[colStr] or line.data[3]
slider.keystr = colStr
slider.lock = true
slider:SetTo(col)
slider.lock = false
slider:Show()
end
for i=#specs+1,#self.spec do
self.spec[i]:Hide()
end
self:SetHeight(SPELL_LINE_HEIGHT * #specs + 10)
self.data = line.data[1]
self:Show()
end
self.list.colByRoleFrame = CreateFrame("Frame",nil,self)
self.list.colByRoleFrame:SetWidth(155)
self.list.colByRoleFrame:SetFrameStrata("DIALOG")
self.list.colByRoleFrame.background = self.list.colByRoleFrame:CreateTexture(nil,"BACKGROUND")
self.list.colByRoleFrame.background:SetAllPoints()
self.list.colByRoleFrame.background:SetColorTexture(0,0,0,.8)
ELib:Border(self.list.colByRoleFrame,2,0.44,0.45,0.50,1)
self.list.colByRoleFrame.close = ELib:Button(self.list.colByRoleFrame,"x"):Size(155-2,10):Point("BOTTOM",0,0):OnClick(function(self) self:GetParent():Hide() end):Tooltip(L.cd2ByRoleTip)
self.list.colByRoleFrame:Hide()
self.list.colByRoleFrame.role = {}
function self.list.colByRoleFrame:Open(line,clickObj)
if self:IsShown() and self.data == line.data[1] then
self:Hide()
return
end
self:ClearAllPoints()
self:SetPoint("TOPRIGHT",clickObj,"BOTTOMRIGHT",5,-2)
local class = line.data_class
local spellID = line.data[1]
local r,g,b = ExRT.F.classColorNum(class)
self.background:SetColorTexture(r*0.5,g*0.5,b*0.5,1)
for i=1,3 do
local slider = self.role[i]
if not slider then
slider = ELib:Slider(self,UNUSED):Size(120):Point("RIGHT",self,"TOPRIGHT",-5,-3-SPELL_LINE_HEIGHT*(i-1)-SPELL_LINE_HEIGHT/2):Range(0,10):SetTo(0):OnChange(function(self,...)
SpellsListColSetValue(self,...)
for j=1,#_C do
if _C[j].db[1] == line.data[1] then
_C[j].checkRole = (VMRT.ExCD2.CDECol[ line.data[1] ..";HEALER"] or VMRT.ExCD2.CDECol[ line.data[1] ..";TANK"] or VMRT.ExCD2.CDECol[ line.data[1] ..";DAMAGER"]) and true or false
end
end
end)
self.role[i] = slider
slider.zeroToNil = true
slider:SetObeyStepOnDrag(true)
slider.Low:Hide()
slider.High:Hide()
slider:SetScript("OnEnter",nil)
slider:SetScript("OnLeave",nil)
slider:HideBorders()
slider.Thumb:SetSize(12,12)
slider.Thumb:SetTexture("Interface\\AddOns\\"..GlobalAddonName.."\\media\\circle256")
slider.Thumb:SetVertexColor(0.44,0.45,0.50,1)
slider.backline = slider:CreateTexture(nil,"BACKGROUND")
slider.backline:SetColorTexture(0.44,0.45,0.50,0.7)
slider.backline:SetPoint("LEFT")
slider.backline:SetPoint("RIGHT")
slider.backline:SetHeight(4)
slider.Text:SetFont(GameFontHighlight:GetFont(),10,"")
slider.Text:SetTextColor(0.44,0.45,0.50,1)
slider:SetScript("OnMouseWheel",nil)
slider.icon = slider:CreateTexture(nil,"ARTWORK")
slider.icon:SetPoint("RIGHT",slider,"LEFT",-5,0)
slider.icon:SetSize(20,20)
end
slider.icon:SetAtlas(i == 1 and "groupfinder-icon-role-large-dps" or i == 2 and "groupfinder-icon-role-large-heal" or "groupfinder-icon-role-large-tank")
local colStr = line.data[1]..";"..(i == 1 and "DAMAGER" or i == 2 and "HEALER" or "TANK")
local col = VMRT.ExCD2.CDECol[colStr] or 0
slider.keystr = colStr
slider.lock = true
slider:SetTo(col)
slider.lock = false
slider:Show()
end
self:SetHeight(SPELL_LINE_HEIGHT * 3 + 10)
self.data = line.data[1]
self:Show()
end
local function SortCategories(cats)
local new = {}
for k,v in pairs(cats) do
new[#new+1] = k
end
sort(new,function(a,b) if a and b and self.CATEGORIES_VIS[a] and self.CATEGORIES_VIS[b] then return self.CATEGORIES_VIS[a].sort < self.CATEGORIES_VIS[b].sort end end)
return new
end
function self.list:UpdateDB(categoryNow)
self.current = categoryNow
local list,cats = {},{}
local extraData = {}
local AllSpells = module.options:GetAllSpells(categoryNow == "PVP")
for _,data in pairs(AllSpells) do
if not categoryNow then
list[#list+1] = data
for cat in string.gmatch(data[2], "[^,]+") do
cats[cat] = true
end
else
for cat in string.gmatch(data[2], "[^,]+") do
if cat == categoryNow then
list[#list+1] = data
end
cats[cat] = true
end
if (categoryNow == "ENABLED" and data[1] and GetSpellInfo(data[1]) and VMRT.ExCD2.CDE[ data[1] ]) then
list[#list+1] = data
end
if (categoryNow == "FAV" and data[1] and VMRT.ExCD2.OptFav[ data[1] ]) then
list[#list+1] = data
end
end
end
if self.search then
for i=#list,1,-1 do
local name = GetSpellInfo(list[i][1])
if name and not name:lower():find(self.search) then
tremove(list,i)
end
end
end
if categoryNow ~= "PVP" then
cats["PVP"] = nil
end
cats = SortCategories(cats)
if categoryNow and module.options.CATEGORIES_VIS[categoryNow].isClassCategory then
local class = categoryNow
local specList = not ExRT.isClassic and module.db.specByClass[class] or {0}
local newList = {}
local specsLen = #specList - 1
for i=1,#specList do
local specID = specList[i] or 0
local icon
if module.db.specIcons[specID] then
icon = "|T".. module.db.specIcons[specID] ..":20|t"
else
icon = ExRT.F.classIconInText(class,20) or ""
end
newList[#newList+1] = {cat = (icon or "").." |c"..ExRT.F.classColor(class)..L.specLocalizate[module.db.specInLocalizate[specID]], specID = specID, specPos = i, sortBut = i==1}
local count = 0
for j=1,#list do
local line = list[j]
for cat in string.gmatch(line[2], "[^,]+") do
if
cat == categoryNow and
(
(i == 1 and line[4]) or
(i == 1 and not line[4] and ((specsLen == 1 and line[5]) or (specsLen == 2 and line[5] and line[6]) or (specsLen == 3 and line[5] and line[6] and line[7]) or (specsLen == 4 and line[5] and line[6] and line[7] and line[8]))) or
(i > 1 and line[4+i-1])
)
then
newList[#newList+1] = line
if i > 1 then
extraData[#newList] = {specID = i, specPos = i}
end
count = count + 1
break
end
end
end
if count == 0 then
tremove(newList,#newList)
end
end
if not self.search then
newList[#newList+1] = {isAddButton = true, class = class}
end
list = newList
elseif categoryNow and not module.options.CATEGORIES_VIS[categoryNow].ignoreSubcats then
local newList = {}
for i=1,#cats do
if not module.options.CATEGORIES_VIS[categoryNow].ignoreOwncat or cats[i] ~= categoryNow then
newList[#newList+1] = {cat = module.options.CATEGORIES_VIS[ cats[i] ] and module.options.CATEGORIES_VIS[ cats[i] ].name or cats[i]}
local count = 0
for j=1,#list do
for cat in string.gmatch(list[j][2], "[^,]+") do
if cat == cats[i] then
newList[#newList+1] = list[j]
count = count + 1
break
end
end
end
if count == 0 then
tremove(newList,#newList)
end
end
end
list = newList
elseif categoryNow and module.options.CATEGORIES_VIS[categoryNow].ignoreSubcats then
tinsert(list,1,{cat = module.options.CATEGORIES_VIS[categoryNow] and module.options.CATEGORIES_VIS[categoryNow].name or categoryNow,sortBut = true})
elseif not categoryNow then
local newList = {}
for i=1,#cats do
newList[#newList+1] = {cat = module.options.CATEGORIES_VIS[ cats[i] ] and module.options.CATEGORIES_VIS[ cats[i] ].name or cats[i]}
local count = 0
for j=1,#list do
for cat in string.gmatch(list[j][2], "[^,]+") do
if cat == cats[i] then
newList[#newList+1] = list[j]
count = count + 1
break
end
end
--[[
local cat1,cat2 = strsplit(",",list[j][2])
local cat = (not ExRT.GDB.ClassID[cat1] and cat1 ~= "NO") and cat1 or cat2 or cat1
if cat == cats[i] then
newList[#newList+1] = list[j]
count = count + 1
end
]]
end
if count == 0 then
tremove(newList,#newList)
end
end
if not self.search then
newList[#newList+1] = {isAddButton = true}
end
list = newList
end
self.list = list
self.extraData = extraData
if self.sortByCol then
self.sortByCol = nil
local p = 0
local colData = {}
for i=1,#list do
local data = list[i]
if data[1] then
local col = VMRT.ExCD2.CDECol[data[1]..";1"] or module.db.def_col[data[1]..";1"] or data[3]
if extraData[i] and extraData[i].specPos then
col = VMRT.ExCD2.CDECol[data[1]..";"..(extraData[i].specPos)] or col
elseif not data[4] then
for j=5,8 do
if data[j] then
local newcol = VMRT.ExCD2.CDECol[data[1]..";"..(j-3)]
if newcol then
col = newcol
break
end
end
end
end
colData[i] = {p + col,i}
else
p = p + 20
colData[i] = {p,i}
end
end
sort(colData,function(a,b) return a[1]<b[1] end)
local newList = {}
local newExtra = {}
for i=1,#colData do
newList[i] = list[ colData[i][2] ]
newExtra[i] = extraData[ colData[i][2] ]
end
self.list = newList
self.extraData = extraData
elseif categoryNow == "ITEMS" and #list > 0 then
local header = list[1]
tremove(list, 1)
local listLen = #list
for i=1,#list/2 do
list[i], list[listLen-i+1] = list[listLen-i+1], list[i]
extraData[i], extraData[listLen-i+1] = extraData[listLen-i+1], extraData[i]
end
tinsert(list, 1, header)
end
end
function self.list:Update()
local scroll = self.ScrollBar:GetValue()
self:SetVerticalScroll(scroll % SPELL_LINE_HEIGHT)
local start = floor(scroll / SPELL_LINE_HEIGHT) + 1
local list = self.list
local lineCount = 1
for i=start,#list do
local data = list[i]
local extraData = self.extraData[i]
local line = self.lines[lineCount]
lineCount = lineCount + 1
if not line then
break
end
local isHideMost = false
line.spec:Hide()
line.spec1:Hide()
line.spec2:Hide()
line.spec3:Hide()
line.starBut:Hide()
line.buttonSortByCol:Hide()
if data.cat then
line.spellName:SetText(data.cat)
line.class:Hide()
line.colBack:Hide()
line.buttonModify:Hide()
line.data = nil
line.buttonAddBig:Hide()
if data.sortBut then
line.buttonSortByCol:Show()
end
isHideMost = true
elseif data.isAddButton then
line.spellName:SetText("")
line.class:Hide()
line.colBack:Hide()
line.buttonModify:Hide()
line.data = nil
if data.class then
line.buttonAddBig.new_class = data.class
else
line.buttonAddBig.new_class = nil
end
line.buttonAddBig:Show()
isHideMost = true
else
local spellName,_,spellTexture = GetSpellInfo(data[1])
line.icon:SetTexture(spellTexture)
line.spellName:SetText(spellName or "Removed spell #"..data[1])
line.tooltipFrame.link = nil
line.isItem = nil
if strsplit(",",data[2]) == "ITEMS" then
for itemID,itemSpellID in pairs(module.db.itemsToSpells) do
if itemSpellID == data[1] then
local itemName,_,itemQuality = GetItemInfo(itemID)
if itemName then
line.spellName:SetText((itemQuality and ITEM_QUALITY_COLORS[itemQuality] and ITEM_QUALITY_COLORS[itemQuality].hex or "")..itemName)
end
local itemTexture = select(5,GetItemInfoInstant(itemID))
line.icon:SetTexture(itemTexture)
line.tooltipFrame.link = "item:"..itemID
break
end
end
line.isItem = true
end
local class,specPos = nil
local dataSpecs = 0
for cat in string.gmatch(data[2], "[^,]+") do
if ExRT.GDB.ClassID[cat] then
class = cat
break
end
end
local cR,cG,cB = ExRT.F.classColorNum(class)
line.backClassColorR = cR
line.backClassColorG = cG
line.backClassColorB = cB
if class then
if class == "EVOKER" then
line.class:SetTexture("interface/icons/classicon_evoker")
line.class:SetTexCoord(0,1,0,1)
else
line.class:SetTexture("Interface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES")
line.class:SetTexCoord(unpack(CLASS_ICON_TCOORDS[class]))
end
line.class:Show()
local specs = ExRT.GDB.ClassSpecializationList[class]
local specID = nil
for j=4,4+#specs do
if data[j] then
dataSpecs = dataSpecs + 1
specID = specs[j-4]
end
end
if data[4] and not ExRT.isClassic then
dataSpecs = #specs
end
line.colExpand.specs = {}
line.colExpand.specsPos = {}
local specIcon = 1
for j=5,4+#specs do
if data[j] or data[4] then
line.colExpand.specs[#line.colExpand.specs+1] = specs[j-4]
line.colExpand.specsPos[#line.colExpand.specsPos+1] = j - 3
if data[j] then
local icon = line["spec"..specIcon]
if icon then
icon:SetTexture(ExRT.GDB.ClassSpecializationIcons[ specs[j-4] ])
icon:Show()
specIcon = specIcon + 1
end
end
end
end
if dataSpecs > 1 then
line.colBack:Show()
else
line.colBack:Hide()
if specID then
line.spec:SetTexture(ExRT.GDB.ClassSpecializationIcons[specID])
line.spec:Show()
line.spec1:Hide()
else
line.spec:Hide()
end
end
for j=4,4+#specs do
if data[j] then
specPos = j - 3
break
end
end
else
line.class:Hide()
line.colBack:Hide()
end
line.data_class = class
if module.db.spell_isPetAbility[ data[1] ] then
line.spec:SetTexture(613074)
line.spec:Show()
end
local covenantID = module.db.spell_covenant[ data[1] ]
if covenantID then
local texture = covenantID == 1 and "shadowlands-landingbutton-kyrian-up" or
covenantID == 2 and "shadowlands-landingbutton-venthyr-up" or
covenantID == 3 and "shadowlands-landingbutton-NightFae-up" or
covenantID == 4 and "shadowlands-landingbutton-necrolord-up"
if texture then
line.spec:SetAtlas(texture)
line.spec:Show()
end
end
for j=1,4 do
line.col.ThumbBySpec[j]:Hide()
end
local colDefStr = data[1]..";"..(specPos or 1)
local col = VMRT.ExCD2.CDECol[colDefStr] or module.db.def_col[colDefStr] or data[3]
if extraData and extraData.specPos then
local specPos = extraData.specPos
col = VMRT.ExCD2.CDECol[data[1]..";"..specPos] or col or data[3]
end
local defCol = col
line.col.keystr = colDefStr
if dataSpecs > 1 then
line.col.keystr = {}
local updateCol = data[4]
if updateCol then
line.col.keystr[#line.col.keystr+1] = colDefStr
end
local miniIcon = {}
for j=5,8 do
if data[j] or (data[4] and ExRT.GDB.ClassSpecializationList[class][j-4]) then
local str = data[1]..";"..(j-3)
line.col.keystr[#line.col.keystr+1] = str
if not updateCol and VMRT.ExCD2.CDECol[str] then
updateCol = true
col = VMRT.ExCD2.CDECol[str]
end
local specs = ExRT.GDB.ClassSpecializationList[class]
if specs then
local p = VMRT.ExCD2.CDECol[str] or VMRT.ExCD2.CDECol[data[1]..";1"] or module.db.def_col[str] or module.db.def_col[data[1]..";1"] or data[3]
if p ~= defCol then
local t = line.col.ThumbBySpec[j-4]
t:SetPoint("CENTER",line.col,"LEFT",7 + (line.col:GetWidth() - 14) / 9 * (p-1),miniIcon[p] == 1 and -5 or miniIcon[p] == 2 and 5 or 0)
t:SetTexture(ExRT.GDB.ClassSpecializationIcons[ specs[j-4] ])
t:Show()
miniIcon[p] = (miniIcon[p] or 0) + 1
end
end
end
end
end
if extraData and extraData.specPos then
local specPos = extraData.specPos
col = VMRT.ExCD2.CDECol[data[1]..";"..specPos] or col or data[3]
line.col.keystr = data[1]..";"..specPos
end
line.col.lock = true
line.col:SetTo(col)
line.col.lock = false
line.prior.lock = true
line.prior:SetTo(VMRT.ExCD2.Priority[ data[1] ] or 50)
line.prior.lock = false
local first = nil
for j=4,4+4 do
if data[j] then
first = data[j]
break
end
end
if first then
line.cd:SetFormattedText("%d:%02d",first[2]/60,first[2]%60)
if first[3] > 0 then
line.dur:SetFormattedText("%d:%02d",first[3]/60,first[3]%60)
else
line.dur:SetText("")
end
else
line.cd:SetFormattedText("")
line.dur:SetText("")
end
local findUserCat = false
for cat in string.gmatch(data[2], "[^,]+") do
if cat == "USER" then
findUserCat = true
break
end
end
line.buttonModify:SetShown(findUserCat)
line.buttonAddBig:Hide()
if spellName then
line.chk.disabled = false
else
line.chk.disabled = true
end
line.chk:SetChecked(VMRT.ExCD2.CDE[ data[1] ])
line.chk:UpdateColors()
if spellName and VMRT.ExCD2.OptFav[ data[1] ] then
line.starBut:Update(2)
else
line.starBut:Update(1)
end
line.starBut:SetShown(not findUserCat)
line.data = data
end
line.icon:SetShown(not isHideMost)
line.icon.border_top:SetShown(not isHideMost)
line.icon.border_bottom:SetShown(not isHideMost)
line.icon.border_left:SetShown(not isHideMost)
line.icon.border_right:SetShown(not isHideMost)
line.backClassColor:SetShown(not isHideMost)
line.chk:SetShown(not isHideMost)
line.col:SetShown(not isHideMost)
line.prior:SetShown(not isHideMost)
line.cd:SetShown(not isHideMost)
line.dur:SetShown(not isHideMost)
line.tooltipFrame:SetShown(not isHideMost)
line:Show()
end
for i=lineCount,#self.lines do
self.lines[i]:Hide()
end
self:Height(SPELL_LINE_HEIGHT * #list)
end
self.list.ScrollBar.slider:SetScript("OnValueChanged", function(self)
self:GetParent():GetParent():Update()
self:UpdateButtons()
end)
self.searchEditBox = ELib:Edit(self.tab.tabs[1]):Point("TOPLEFT",400,18):Size(140,16):AddSearchIcon():OnChange(function (self,isUser)
if not isUser then
return
end
local text = self:GetText():lower()
if text == "" then
text = nil
end
module.options.list.search = text
if self.scheduledUpdate then
return
end
self.scheduledUpdate = C_Timer.NewTimer(.3,function()
self.scheduledUpdate = nil
module.options.list:UpdateDB(module.options.list.current)
module.options.list:Update()
end)
end):Tooltip(SEARCH)
self.searchEditBox:SetTextColor(0,1,0,1)
self.addModSpellFrame = ELib:Popup():Size(570,275)
self.addModSpellFrame.Save = ELib:Button(self.addModSpellFrame,L.BossmodsKromogSetupsSave):Size(558,20):Point("BOTTOM",0,1):OnClick(function(self)
local parent = self:GetParent()
local data = parent.data
if not data then
return
end
for i=4,8 do
if data[i] and data[i][1] == 0 then
data[i] = nil
end
end
if data[1] == 0 then
return
end
if data[2] and strsplit(",",data[2]) == "ITEMS" and not data.itemID then
return
end
if data[4] or data[5] or data[6] or data[7] or data[8] then
local isNew = true
local AllSpells = module.options:GetAllSpells(true)
for _,line in pairs(AllSpells) do
if line == data then
isNew = false
break
end
end
if isNew then
VMRT.ExCD2.userDB[#VMRT.ExCD2.userDB+1] = data
end
module.options.list:UpdateDB(module.options.list.current)
module.options.list:Update()
module:UpdateSpellDB(true)
end
parent:Hide()
end)
function self.addModSpellFrame.Save:Check()
local parent = self:GetParent()
local data = parent.data
local spellID = data[1]
if not GetSpellInfo(spellID) then
self:Disable()
parent.spellIDIcon:ColorBorder(true)
return
end
if data[2] and strsplit(",",data[2]) == "ITEMS" and not data.itemID then
self:Disable()
parent.itemToSpell:ColorBorder(true)
return
end
local AllSpells = module.options:GetAllSpells(true)
for _,line in pairs(AllSpells) do
if line[1] == spellID and line ~= parent.data then
self:Disable()
parent.spellIDIcon:ColorBorder(true)
return
end
end
parent.spellIDIcon:ColorBorder()
parent.itemToSpell:ColorBorder()
self:Enable()
end
self.addModSpellFrame:SetScript("OnHide",function(self)
--self.Save:Click()
end)
self.addModSpellFrame.spellIDIcon = ELib:Edit(self.addModSpellFrame):Size(100,20):Point("TOPLEFT",150,-50):LeftText("Spell ID (for icon):"):OnChange(function(self,isUser)
local text = self:GetText() or ""
if not tonumber(text) then
text = "0"
end
local spellID = tonumber(text)
local parent = self:GetParent()
parent.data[1] = spellID
parent.Save:Check()
local spellName,_,spellIcon = GetSpellInfo(spellID)
self.RightText:SetText((spellIcon and "|T"..spellIcon..":20|t " or "")..(spellName or ""))
end)
self.addModSpellFrame.spellIDIcon.leftText:Color():Shadow()
self.addModSpellFrame.spellIDIcon.RightText = ELib:Text(self.addModSpellFrame.spellIDIcon,"",12):Point("LEFT",self.addModSpellFrame.spellIDIcon,"RIGHT",5,0):Color():Shadow()
self.addModSpellFrame.chkSpellIsTalent = ELib:Check(self.addModSpellFrame,L.cd2SpellIsTalent):Tooltip(L.cd2SpellIsTalentTip):Point(150,-75):OnClick(function(self)
local parent = self:GetParent()
parent.data.isTalent = self:GetChecked()
parent.Save:Check()
end)
local function addModSpellFrameEditCLEU(self)
local text = self:GetText() or ""
self.data[1] = tonumber(text) or 0
end
local function addModSpellFrameEditCD(self)
local text = self:GetText() or ""
self.data[2] = tonumber(text) or 0
end
local function addModSpellFrameEditDur(self)
local text = self:GetText() or ""
self.data[3] = tonumber(text) or 0
end
for i=1,5 do
self.addModSpellFrame["spellIDCLEU"..i] = ELib:Edit(self.addModSpellFrame):Size(180,20):Point("TOPLEFT",150,-125-(i-1)*25):OnChange(addModSpellFrameEditCLEU):Tooltip("Leave empty for ignoring"):LeftText("")
self.addModSpellFrame["spellIDCLEU"..i].leftText:Color():Shadow()
self.addModSpellFrame["cd"..i] = ELib:Edit(self.addModSpellFrame):Size(100,20):Point("LEFT",self.addModSpellFrame["spellIDCLEU"..i],"RIGHT",10,0):OnChange(addModSpellFrameEditCD)
self.addModSpellFrame["dur"..i] = ELib:Edit(self.addModSpellFrame):Size(100,20):Point("LEFT",self.addModSpellFrame["cd"..i],"RIGHT",10,0):OnChange(addModSpellFrameEditDur)
end
self.addModSpellFrame.spellIDCLEUtext = ELib:Text(self.addModSpellFrame,"Spell ID (for combat log event)",12):Point("BOTTOM",self.addModSpellFrame.spellIDCLEU1,"TOP",0,2):Color():Shadow()
self.addModSpellFrame.cdtext = ELib:Text(self.addModSpellFrame,L.cd2EditBoxCDTooltip,12):Point("BOTTOM",self.addModSpellFrame.cd1,"TOP",0,2):Color():Shadow()
self.addModSpellFrame.durtext = ELib:Text(self.addModSpellFrame,L.cd2EditBoxDurationTooltip,12):Point("BOTTOM",self.addModSpellFrame.dur1,"TOP",0,2):Color():Shadow()
self.addModSpellFrame.dropDown = ELib:DropDown(self.addModSpellFrame,200,10):Size(210):Point("TOPLEFT",150,-25)
self.addModSpellFrame.dropDown.LeftText = ELib:Text(self.addModSpellFrame.dropDown,L.cd2Class..":",12):Point("RIGHT",self.addModSpellFrame.dropDown,"LEFT",-5,0):Color():Shadow()
function self.addModSpellFrame.dropDown:SetValue(newValue)
ELib:DropDownClose()
module.options.addModSpellFrame.data[2] = newValue .. ",USER"
module.options.addModSpellFrame:Update()
end
for i=1,#module.db.classNames do
local class = module.db.classNames[i]
self.addModSpellFrame.dropDown.List[#self.addModSpellFrame.dropDown.List + 1] = {
text = "|c"..ExRT.F.classColor(class)..L.classLocalizate[class],
justifyH = "CENTER",
func = self.addModSpellFrame.dropDown.SetValue,
arg1 = class,
}
end
if ExRT.isClassic then
tremove(self.addModSpellFrame.dropDown.List, 12)
tremove(self.addModSpellFrame.dropDown.List, 10)
if not ExRT.isLK then tremove(self.addModSpellFrame.dropDown.List, 6) end
end
self.addModSpellFrame.dropDown.List[#self.addModSpellFrame.dropDown.List + 1] = {
text = L.cd2CatItems,
justifyH = "CENTER",
func = self.addModSpellFrame.dropDown.SetValue,
arg1 = "ITEMS",
}
self.addModSpellFrame.dropDown.List[#self.addModSpellFrame.dropDown.List + 1] = {
text = ALL,
justifyH = "CENTER",
func = self.addModSpellFrame.dropDown.SetValue,
arg1 = "OTHER",
}
self.addModSpellFrame.dropDown.Lines = #self.addModSpellFrame.dropDown.List
self.addModSpellFrame.Delete = ELib:Button(self.addModSpellFrame,DELETE):Size(100,20):Point("LEFT",self.addModSpellFrame.dropDown,"RIGHT",50,0):OnClick(function(self)
local parent = self:GetParent()
local data = parent.data
for i=1,#VMRT.ExCD2.userDB do
if data == VMRT.ExCD2.userDB[i] then
tremove(VMRT.ExCD2.userDB, i)
break
end
end
parent.data = nil
module.options.list:UpdateDB(module.options.list.current)
module.options.list:Update()
module:UpdateSpellDB(true)
parent:Hide()
end)
self.addModSpellFrame.isEquip = ELib:Check(self.addModSpellFrame,"|cffffffffIs Equipment:"):Left():Point("LEFT",self.addModSpellFrame["spellIDCLEU3"],"LEFT",0,0):OnClick(function(self)
local parent = self:GetParent()
local data = parent.data
if self:GetChecked() then
data.isEquip = true
else
data.isEquip = nil
end
end)
self.addModSpellFrame.itemToSpell = ELib:Edit(self.addModSpellFrame,nil,true):Size(180,20):Point("LEFT",self.addModSpellFrame["spellIDCLEU4"],"LEFT",0,0):OnChange(function(self,isUser)
local parent = self:GetParent()
local data = parent.data
self.RightText:SetText("")
local itemID = tonumber(self:GetText() or "")
data.itemID = itemID
parent.Save:Check()
if itemID then
local itemName, _, _, _, _, _, _, _, _, itemIcon = GetItemInfo(itemID)
local _, spellID = GetItemSpell(itemID)
if itemName then
if spellID then
self.RightText:SetText("SpellID: "..spellID.." (for item "..(itemIcon and "|T"..itemIcon..":20|t" or "")..itemName..")")
return
end
self.RightText:SetText("No spell found for item "..(itemIcon and "|T"..itemIcon..":20|t" or "")..itemName)
return
end
self.RightText:SetText("No item found")
end
end):LeftText("Item ID:"):Run(function(self)
self.leftText:Color()
self.RightText = ELib:Text(self,"",12):Point("TOPLEFT",self,"BOTTOMLEFT",3,-3):Color():Shadow()
end)
self.addModSpellFrame.Update = function(self)
local data = self.data
self.spellIDIcon:SetText(data[1])
self.chkSpellIsTalent:SetChecked(data.isTalent)
local class = "OTHER"
for i=1,#self.dropDown.List do
if strsplit(",",data[2]) == self.dropDown.List[i].arg1 then
self.dropDown:SetText(self.dropDown.List[i].text)
class = self.dropDown.List[i].arg1
break
end
end
local specList = not ExRT.isClassic and module.db.specByClass[class] or {0}
for i=1,#specList do
local specID = specList[i]
local icon
if module.db.specIcons[specID] then
icon = "|T".. module.db.specIcons[specID] ..":20|t"
else
icon = ExRT.F.classIconInText(class,20) or ""
end
self["spellIDCLEU"..i]:LeftText((icon or "").." |c"..ExRT.F.classColor(class)..L.specLocalizate[module.db.specInLocalizate[specID]])
local dataSpec = data[3+i] or {0,0,0}
data[3+i] = dataSpec
self["spellIDCLEU"..i]:SetText(dataSpec[1])
self["cd"..i]:SetText(dataSpec[2])
self["dur"..i]:SetText(dataSpec[3])
self["spellIDCLEU"..i].data = dataSpec
self["cd"..i].data = dataSpec
self["dur"..i].data = dataSpec
self["spellIDCLEU"..i]:Show()
self["cd"..i]:Show()
self["dur"..i]:Show()
end
for i=#specList+1,5 do
self["spellIDCLEU"..i]:Hide()
self["cd"..i]:Hide()
self["dur"..i]:Hide()
end
self.itemToSpell:SetText(data.itemID or "")
self.isEquip:SetChecked(data.isEquip)
self.itemToSpell:SetShown(class == "ITEMS")
self.isEquip:SetShown(class == "ITEMS")
self.chkSpellIsTalent:SetShown(class ~= "ITEMS")
local isNew = true
local AllSpells = module.options:GetAllSpells(true)
for _,line in pairs(AllSpells) do
if line == data then
isNew = false
break
end
end
self.Delete:SetShown(not isNew)
end
self.addModSpellFrame.OnShow = function(self)
local data = self.data
if not data then
data = {0,"OTHER,USER",1,{0,0,0}}
if self.new_class then
data[2] = self.new_class..",USER"
self.new_class = nil
end
self.data = data
end
self:Update()
end
self.categories:Update()
self.categories.buttons[1]:Click()
--> OPTIONS TAB2: Customize
self.optColHeader = ELib:Text(self.tab.tabs[2],L.cd2ColSet):Size(560,20):Point(15+80,-8)
local currColOpt = {}
function self:selectColumnTab()
local i = self and self.colID or module.options.optColTabs.selected
module.options.optColTabs.selected = i
module.options.optColTabs:UpdateTabs()
local isGeneralTab = i == (module.db.maxColumns + 1)
local optColSet = module.options.optColSet
local defOpt = module.db.colsDefaults
local VColOpt = VMRT.ExCD2.colSet[i]
optColSet.superTabFrame:Show()
optColSet.LOCK = true
currColOpt = {}
if isGeneralTab then
VColOpt.frameGeneral = nil
VColOpt.iconGeneral = nil
VColOpt.textureGeneral = nil
VColOpt.fontGeneral = nil
VColOpt.textGeneral = nil
VColOpt.methodsGeneral = nil
end
optColSet.superTabFrame.list.LDisabled[10] = isGeneralTab
optColSet.superTabFrame.list:Update()
optColSet.chkEnable:SetChecked(VColOpt.enabled)
optColSet.chkGeneral:SetChecked(VColOpt.frameGeneral)
optColSet.sliderLinesNum:SetValue(VColOpt.frameLines or defOpt.frameLines)
optColSet.sliderAlpha:SetValue(VColOpt.frameAlpha or defOpt.frameAlpha)
optColSet.sliderScale:SetValue(VColOpt.frameScale or defOpt.frameScale)
optColSet.sliderWidth:SetValue(VColOpt.frameWidth or defOpt.frameWidth)
optColSet.sliderColsInCol:SetValue(VColOpt.frameColumns or defOpt.frameColumns)
optColSet.sliderBetweenLines:SetValue(VColOpt.frameBetweenLines or defOpt.frameBetweenLines)
optColSet.sliderBlackBack:SetValue(VColOpt.frameBlackBack or defOpt.frameBlackBack)
optColSet.dropDownStrata:SetText(VColOpt.frameStrata or defOpt.frameStrata)
if VColOpt.ATF and not VColOpt.frameStrata then
optColSet.dropDownStrata:SetText("Auto")
end
optColSet.chkGeneral:doAlphas()
optColSet.sliderHeight:SetValue(VColOpt.iconSize or defOpt.iconSize)
optColSet.chkGray:SetChecked(VColOpt.iconGray)
optColSet.chkCooldown:SetChecked(VColOpt.methodsCooldown)
optColSet:chkCooldownTextUpdate()
optColSet.chkCooldownShowSwipe:SetChecked(VColOpt.iconCooldownShowSwipe)
optColSet.chkShowTitles:SetChecked(VColOpt.iconTitles)
optColSet.chkHideBlizzardEdges:SetChecked(VColOpt.iconHideBlizzardEdges)
optColSet.chkMasque:SetChecked(VColOpt.iconMasque)
optColSet.chkGeneralIcons:SetChecked(VColOpt.iconGeneral)
do
local defIconPos = VColOpt.iconPosition or defOpt.iconPosition
optColSet.dropDownIconPos:SetText( optColSet.dropDownIconPos.PosNames[defIconPos])
end
if optColSet.dropDownCooldownGlowType.List[ VColOpt.iconGlowType or 1 ] then
optColSet.dropDownCooldownGlowType:SetText(optColSet.dropDownCooldownGlowType.List[ VColOpt.iconGlowType or 1 ].text)
end
optColSet.chkGeneralIcons:doAlphas()
do
local texturePos = nil
for j=1,#ExRT.F.textureList do
if ExRT.F.textureList[j] == (VColOpt.textureFile or ExRT.F.barImg) then
texturePos = j
break
end
end
if not texturePos and VColOpt.textureFile then
texturePos = select(3,string.find(VColOpt.textureFile,"\\([^\\]*)$"))
end
texturePos = texturePos or "Standart"
optColSet.dropDownTexture:SetText(L.cd2OtherSetTexture.." ["..texturePos.."]")
end
optColSet.colorPickerBorder.color:SetColorTexture(VColOpt.textureBorderColorR or defOpt.textureBorderColorR,VColOpt.textureBorderColorG or defOpt.textureBorderColorG,VColOpt.textureBorderColorB or defOpt.textureBorderColorB, VColOpt.textureBorderColorA or defOpt.textureBorderColorA)
optColSet.sliderBorderSize:SetValue(VColOpt.textureBorderSize or defOpt.textureBorderSize)
optColSet.chkAnimation:SetChecked(VColOpt.textureAnimation)
optColSet.chkHideSpark:SetChecked(VColOpt.textureHideSpark)
optColSet.chkSmoothAnimation:SetChecked(VColOpt.textureSmoothAnimation)
optColSet.sliderSmoothAnimationDuration:SetValue(VColOpt.textureSmoothAnimationDuration or defOpt.textureSmoothAnimationDuration)
optColSet.chkGeneralColorize:SetChecked(VColOpt.textureGeneral)
optColSet.chkGeneralColorize:doAlphas()
do
local FontNameForDropDown = select(3,string.find(VColOpt.fontName or defOpt.fontName,"\\([^\\]*)$"))
optColSet.dropDownFont:SetText( (FontNameForDropDown or VColOpt.fontName or defOpt.fontName or "?") )
end
optColSet.sliderFont:SetValue(VColOpt.fontSize or defOpt.fontSize)
optColSet.chkFontOutline:SetChecked(VColOpt.fontOutline)
optColSet.chkFontShadow:SetChecked(VColOpt.fontShadow)
do
optColSet.chkFontOtherAvailable:SetChecked(VColOpt.fontOtherAvailable)
module.options.fontOtherAvailable(VColOpt.fontOtherAvailable)
if VColOpt.fontOtherAvailable then
optColSet.nowFont = "fontLeft"
else
optColSet.nowFont = "font"
end
optColSet.fontsTab.selectFunc(optColSet.fontsTab.tabs[1].button)
end
optColSet.chkGeneralFont:SetChecked(VColOpt.fontGeneral)
optColSet.chkGeneralFont:doAlphas()
optColSet.textLeftTemEdit:SetText(VColOpt.textTemplateLeft or defOpt.textTemplateLeft)
optColSet.textRightTemEdit:SetText(VColOpt.textTemplateRight or defOpt.textTemplateRight)
optColSet.textCenterTemEdit:SetText(VColOpt.textTemplateCenter or defOpt.textTemplateCenter)
optColSet.chkIconName:SetChecked(VColOpt.textIconName)
optColSet.sliderIconNameChars:SetValue(VColOpt.textIconNameChars or defOpt.textIconNameChars)
do
local deftextIconCDStyle = VColOpt.textIconCDStyle or defOpt.textIconCDStyle
optColSet.dropDownIconCDStyle:SetText(optColSet.dropDownIconCDStyle.Styles[deftextIconCDStyle])
end
optColSet.chkShowTargetName:SetChecked(VColOpt.textShowTargetName)
optColSet.chkGeneralText:SetChecked(VColOpt.textGeneral)
optColSet.chkGeneralText:doAlphas()
optColSet.chkShowOnlyOnCD:SetChecked(VColOpt.methodsShownOnCD)
optColSet.chkBotToTop:SetChecked(VColOpt.frameAnchorBottom)
optColSet.chkRightToLeft:SetChecked(VColOpt.frameAnchorRightToLeft)
optColSet.chkGeneralMethods:SetChecked(VColOpt.methodsGeneral)
do
local defStyleAnimation = VColOpt.methodsStyleAnimation or defOpt.methodsStyleAnimation
optColSet.dropDownStyleAnimation:SetText( optColSet.dropDownStyleAnimation.Styles[defStyleAnimation])
local defTimeLineAnimation = VColOpt.methodsTimeLineAnimation or defOpt.methodsTimeLineAnimation
optColSet.dropDownTimeLineAnimation:SetText(optColSet.dropDownTimeLineAnimation.Styles[defTimeLineAnimation])
local defSortingRules = VColOpt.methodsSortingRules or defOpt.methodsSortingRules
optColSet.dropDownSortingRules:SetText(optColSet.dropDownSortingRules.Rules[defSortingRules])
local ClickModText
for i=1,#optColSet.dropDownLineClickMod.Mods,2 do
if optColSet.dropDownLineClickMod.Mods[i+1] == VColOpt.methodsLineClickMod then
ClickModText = optColSet.dropDownLineClickMod.Mods[i]
break
end
end
optColSet.dropDownLineClickMod:SetText(ClickModText or optColSet.dropDownLineClickMod.Mods[1])
end
optColSet.chkIconTooltip:SetChecked(VColOpt.methodsIconTooltip)
optColSet.chkLineClick:SetChecked(VColOpt.methodsLineClick)
optColSet.chkLineClickWhisper:SetChecked(VColOpt.methodsLineClickWhisper)
optColSet.chkNewSpellNewLine:SetChecked(VColOpt.methodsNewSpellNewLine)
optColSet.chkHideOwnSpells:SetChecked(VColOpt.methodsHideOwnSpells)
optColSet.chkAlphaNotInRange:SetChecked(VColOpt.methodsAlphaNotInRange)
optColSet.sliderAlphaNotInRange:SetValue(VColOpt.methodsAlphaNotInRangeNum or defOpt.methodsAlphaNotInRangeNum)
optColSet.chkDisableActive:SetChecked(VColOpt.methodsDisableActive)
optColSet.chkOneSpellPerCol:SetChecked(VColOpt.methodsOneSpellPerCol)
optColSet.chkOnlyInCombat:SetChecked(VColOpt.methodsOnlyInCombat)
optColSet.chkSortByAvailability:SetChecked(VColOpt.methodsSortByAvailability)
optColSet.chkSortByAvailability_activeToTop:SetChecked(VColOpt.methodsSortActiveToTop)
optColSet.chkReverseSorting:SetChecked(VColOpt.methodsReverseSorting)
optColSet.chkCDOnlyTimer:SetChecked(VColOpt.methodsCDOnlyTime)
optColSet.chkTextIgnoreActive:SetChecked(VColOpt.methodsTextIgnoreActive)
optColSet.chkShowOnlyNotOnCD:SetChecked(VColOpt.methodsOnlyNotOnCD)
optColSet.chkGeneralMethods:doAlphas()
optColSet.blacklistEditBox.EditBox:SetText(VColOpt.blacklistText or defOpt.blacklistText)
optColSet.whitelistEditBox.EditBox:SetText(VColOpt.whitelistText or defOpt.whitelistText)
optColSet.chkGeneralBlackList:SetChecked(VColOpt.blacklistGeneral)
optColSet.chkGeneralBlackList:doAlphas()
optColSet.chkVisibilityPartyTypeAlways:SetChecked(not VColOpt.visibilityPartyType)
optColSet.chkVisibilityPartyTypeParty:SetChecked(VColOpt.visibilityPartyType == 1)
optColSet.chkVisibilityPartyTypeRaid:SetChecked(VColOpt.visibilityPartyType == 2)
optColSet.chkVisibilityZoneArena:SetChecked(not VColOpt.visibilityDisableArena)
optColSet.chkVisibilityZoneBG:SetChecked(not VColOpt.visibilityDisableBG)
optColSet.chkVisibilityZoneScenario:SetChecked(not VColOpt.visibilityDisable3ppl)
optColSet.chkVisibilityZone5ppl:SetChecked(not VColOpt.visibilityDisable5ppl)
optColSet.chkVisibilityZoneRaid:SetChecked(not VColOpt.visibilityDisableRaid)
optColSet.chkVisibilityZoneOutdoor:SetChecked(not VColOpt.visibilityDisableWorld)
optColSet.chkGeneralVisibility:SetChecked(VColOpt.visibilityGeneral)
optColSet.chkGeneralVisibility:doAlphas()
if not isGeneralTab then
optColSet.chkATF:SetChecked(VColOpt.ATF)
optColSet.sliderATFHeight:SetValue(VColOpt.iconSize or defOpt.iconSize)
optColSet.sliderATFFont:SetValue(VColOpt.fontCDSize or defOpt.fontCDSize)
optColSet.sliderATFMaxCol:SetValue(VColOpt.ATFCol or defOpt.ATFCol)
optColSet.sliderATFMaxLine:SetValue(VColOpt.ATFLines or defOpt.ATFLines)
optColSet.sliderATFOffsetX:SetValue(VColOpt.ATFOffsetX or defOpt.ATFOffsetX)
optColSet.sliderATFOffsetY:SetValue(VColOpt.ATFOffsetY or defOpt.ATFOffsetY)
optColSet.ATFRadiosCheck()
optColSet.ATFTypeGrowth1:SetChecked(VColOpt.ATFGrowth == 1 or not VColOpt.ATFGrowth)
optColSet.ATFTypeGrowth2:SetChecked(VColOpt.ATFGrowth == 2)
optColSet.dropDownATFFramePrior:Update(VColOpt.ATFFramePrior)
end
optColSet.chkEnable:SetShown(not isGeneralTab)
optColSet.chkGeneral:SetShown(not isGeneralTab)
optColSet.chkGeneralIcons:SetShown(not isGeneralTab)
optColSet.chkGeneralColorize:SetShown(not isGeneralTab)
optColSet.chkGeneralFont:SetShown(not isGeneralTab)
optColSet.chkGeneralText:SetShown(not isGeneralTab)
optColSet.chkGeneralMethods:SetShown(not isGeneralTab)
optColSet.chkGeneralVisibility:SetShown(not isGeneralTab)
optColSet.chkGeneralBlackList:SetShown(not isGeneralTab)
module.options.showColorFrame(module.options.colorSetupFrame)
if self then
optColSet.templateRestore:Hide()
end
if isGeneralTab and optColSet.superTabFrame.list.selected == 10 then
optColSet.superTabFrame.list:SetTo(1)
end
optColSet.LOCK = nil
currColOpt = VMRT.ExCD2.colSet[module.options.optColTabs.selected]
if VColOpt.enabled and not isGeneralTab and VMRT.ExCD2.enabled and not VColOpt.ATF then
optColSet.NavLineF.f = module.frame.colFrame[i]
optColSet.FindFrameBut:Show()
else
optColSet.NavLineF.f = nil
optColSet.FindFrameBut:Hide()
end
end
self.optColSet = {}
do
local tmpArr = {}
for i=1,module.db.maxColumns do
tmpArr[i] = tostring(i)
end
tmpArr[module.db.maxColumns+1] = L.cd2GeneralSet
tmpArr[#tmpArr+1] = ADVANCED_LABEL
tmpArr[#tmpArr+1] = L.Profiles
self.optColTabs = ELib:Tabs(self.tab.tabs[2],0,unpack(tmpArr)):Size(660,417):Point("TOP",0,-48):SetTo(module.db.maxColumns+1)
local profilesBut = self.optColTabs.tabs[module.db.maxColumns+3].button
profilesBut.colID = module.db.maxColumns+3
profilesBut:SetScript("OnClick", function(self)
module.options.optColTabs.selected = self.colID
module.options.optColTabs:UpdateTabs()
module.options.optColSet.superTabFrame:Hide()
module.options.optColSet.NavLineF.f = nil
module.options.optColSet.FindFrameBut:Hide()
end)
profilesBut:ClearAllPoints()
profilesBut:SetPoint("TOPRIGHT", -10, 24)
local advColBut = self.optColTabs.tabs[module.db.maxColumns+2].button
advColBut.colID = module.db.maxColumns+2
advColBut:SetScript("OnClick", function(self)
module.options.optColTabs.selected = self.colID
module.options.optColTabs:UpdateTabs()
module.options.optColSet.superTabFrame:Hide()
module.options.optColSet.NavLineF.f = nil
module.options.optColSet.FindFrameBut:Hide()
end)
advColBut:ClearAllPoints()
advColBut:SetPoint("RIGHT", profilesBut, "LEFT", 0, 0)
end
for i=1,module.db.maxColumns+1 do
self.optColTabs.tabs[i].button.colID = i
self.optColTabs.tabs[i].button:SetScript("OnClick", self.selectColumnTab)
end
self.optColTabs:SetBackdropBorderColor(0,0,0,0)
self.optColTabs:SetBackdropColor(0,0,0,0)
self.tab.tabs[2].decorationLine = ELib:DecorationLine(self.tab.tabs[2],true,"BACKGROUND",-5):Point("TOPLEFT",self.tab.tabs[2],0,-28):Point("RIGHT",self,0,0):Size(0,20)
self.optColSet.superTabFrame = ExRT.lib:ScrollTabsFrame(self.optColTabs,L.cd2OtherSetTabNameGeneral,L.cd2OtherSetTabNameIcons,L.cd2OtherSetTabNameColors,L.cd2OtherSetTabNameFont,L.cd2OtherSetTabNameText,L.cd2OtherSetTabNameOther,L.cd2OtherSetTabNameVisibility,L.cd2OtherSetTabNameBlackList,L.cd2OtherSetTabNameTemplate,L.cd2ATF):Size(660,450):Point("TOP",0,-10)
self.optColSet.superTabFrame.list.LDisabled = {}
self.optColSet.superTabFrame.list:SetScript("OnUpdate",function(self)
for i=1,#self.List do
local line = self.List[i]
if line:IsMouseOver() and line.index and self.LDisabled[line.index] then
if not self.DisabledTooltipShowed then
self.DisabledTooltipShowed = true
GameTooltip:SetOwner(line, "ANCHOR_TOP")
GameTooltip:AddLine(L.cd2ATFTooltipDisabled, 1, .3, .3)
GameTooltip:Show()
end
return
end
end
if self.DisabledTooltipShowed then
GameTooltip_Hide()
self.DisabledTooltipShowed = nil
end
end)
self.optColSet.NavLineF = ELib:Frame(self.optColTabs):Point("TOPLEFT",self.optColTabs,0,0):Size(1,1)
self.optColSet.NavLineF:Hide()
self.optColSet.NavLineF.line = self.optColSet.NavLineF:CreateLine(nil, "ARTWORK")
self.optColSet.NavLineF.line:SetTexture("Interface/AddOns/"..GlobalAddonName.."/media/lineGapped")
self.optColSet.NavLineF.line:SetVertexColor(.44,1,.50,1)
self.optColSet.NavLineF.line:SetThickness(10)
self.optColSet.NavLineF:SetScript("OnUpdate",function(self)
if not self.f then
return
end
local l1,t1 = self.f2:GetLeft(), self.f2:GetTop()
local s1 = self.f2:GetEffectiveScale()
local l2,t2 = self.f:GetLeft(), self.f:GetTop()
local s2 = self.f:GetEffectiveScale()
l1, t1 = l1*s1, t1*s1
l2, t2 = l2*s2, t2*s2
local s3 = UIParent:GetEffectiveScale()
l1, t1, l2, t2 = l1/s3, t1/s3, l2/s3, t2/s3
self.line:SetStartPoint("BOTTOMLEFT", UIParent, l1, t1)
self.line:SetEndPoint("BOTTOMLEFT", UIParent, l2, t2)
local t = GetTime() % 1
local d = 40/1024
self.line:SetTexCoord(d * t,(1 - d)+ t*d,0,1)
end)
self.optColSet.FindFrameBut = ELib:Button(self.optColTabs,L.cd2FindFrame):Point("TOPRIGHT",self.optColSet.superTabFrame,"TOPLEFT",-5,-1):Size(83,50):OnEnter(function()
local f = self.optColSet.NavLineF
if f.f and f.f.ATFenabled then return end
f:Show()
end):OnLeave(function ()
self.optColSet.NavLineF:Hide()
end)
self.optColSet.NavLineF.f2 = self.optColSet.FindFrameBut
self.optColSet.chkEnable = ELib:Check(self.optColSet.superTabFrame.tab[1],">>>"..L.Enable.."<<<"):Point(10,-10):AddColorState():OnClick(function(self)
if self:GetChecked() then
currColOpt.enabled = true
else
currColOpt.enabled = nil
end
module:ReloadAllSplits()
end):OnShow(function(self)
C_Timer.After(.1,function()
self:ColorState()
end)
end,true)
self.optColSet.chkGeneral = ELib:Check(self.optColSet.superTabFrame.tab[1],L.cd2ColSetGeneral):Point("TOPRIGHT",-10,-10):Left():OnClick(function(self)
if self:GetChecked() then
currColOpt.frameGeneral = true
else
currColOpt.frameGeneral = nil
end
module:ReloadAllSplits()
self:doAlphas()
end)
function self.optColSet.chkGeneral:doAlphas()
ExRT.lib.SetAlphas(VMRT.ExCD2.colSet[module.options.optColTabs.selected].frameGeneral and module.options.optColTabs.selected ~= (module.db.maxColumns + 1) and 0.5 or 1,module.options.optColSet.sliderLinesNum,module.options.optColSet.sliderAlpha,module.options.optColSet.sliderScale,module.options.optColSet.sliderWidth,module.options.optColSet.sliderColsInCol,module.options.optColSet.sliderBetweenLines,module.options.optColSet.sliderBlackBack,module.options.optColSet.butToCenter,module.options.optColSet.dropDownStrata,module.options.optColSet.textdropDownStrata)
end
self.optColSet.sliderLinesNum = ELib:Slider(self.optColSet.superTabFrame.tab[1],L.cd2lines):Size(400):Point("TOP",0,-50):Range(1,module.db.maxLinesInCol):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.frameLines = event
self.tooltipText = event
self:tooltipReload(self)
module:ReloadAllSplits()
end)
self.optColSet.sliderWidth = ELib:Slider(self.optColSet.superTabFrame.tab[1],L.cd2width):Size(400):Point("TOP",0,-85):Range(1,400):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.frameWidth = event
self.tooltipText = event
self:tooltipReload(self)
module:ReloadAllSplits()
end)
self.optColSet.sliderAlpha = ELib:Slider(self.optColSet.superTabFrame.tab[1],L.cd2alpha):Size(400):Point("TOP",0,-120):Range(0,100):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.frameAlpha = event
self.tooltipText = event
self:tooltipReload(self)
module:ReloadAllSplits()
end)
self.optColSet.sliderScale = ELib:Slider(self.optColSet.superTabFrame.tab[1],L.cd2scale):Size(400):Point("TOP",0,-155):Range(5,200):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.frameScale = event
self.tooltipText = event
self:tooltipReload(self)
module:ReloadAllSplits("ScaleFix")
end)
self.optColSet.sliderColsInCol = ELib:Slider(self.optColSet.superTabFrame.tab[1],L.cd2ColSetColsInCol):Size(400):Point("TOP",0,-190):Range(1,module.db.maxLinesInCol):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.frameColumns = event
self.tooltipText = event
self:tooltipReload(self)
module:ReloadAllSplits()
end)
self.optColSet.sliderBetweenLines = ELib:Slider(self.optColSet.superTabFrame.tab[1],L.cd2ColSetBetweenLines):Size(400):Point("TOP",0,-225):Range(0,20):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.frameBetweenLines = event
self.tooltipText = event
self:tooltipReload(self)
module:ReloadAllSplits()
end)
self.optColSet.sliderBlackBack = ELib:Slider(self.optColSet.superTabFrame.tab[1],L.cd2BlackBack):Size(400):Point("TOP",0,-260):Range(0,100):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.frameBlackBack = event
self.tooltipText = event
self:tooltipReload(self)
module:ReloadAllSplits()
end)
self.optColSet.dropDownStrata = ELib:DropDown(self.optColSet.superTabFrame.tab[1],230,-1):Point("TOPLEFT",198,-295):Size(230)
self.optColSet.textdropDownStrata = ELib:Text(self.optColSet.superTabFrame.tab[1],L.cd2ColStrata..":",11):Size(200,20):Point("TOPLEFT",27,-295)
for i,strataString in ipairs({"BACKGROUND","LOW","MEDIUM","HIGH","DIALOG","FULLSCREEN","FULLSCREEN_DIALOG","TOOLTIP","Auto"}) do
self.optColSet.dropDownStrata.List[i] = {
text = strataString,
arg1 = strataString,
func = function (self,arg)
ELib:DropDownClose()
currColOpt.frameStrata = arg
if arg == "Auto" then
currColOpt.frameStrata = nil
end
module:ReloadAllSplits()
self:GetParent().parent:SetText(arg)
end,
tooltip = strataString == "Auto" and L.cd2ColStrataAutoTooltip,
}
end
function self.optColSet.dropDownStrata:PreUpdate()
for i=1,#self.List do
local v = self.List[i]
if v.arg1 == "Auto" then
if currColOpt.ATF then
v.isHidden = nil
else
v.isHidden = true
end
break
end
end
end
self.optColSet.butToCenter = ELib:Button(self.optColSet.superTabFrame.tab[1],L.cd2ColSetResetPos):Size(200,20):Point("TOP",0,-330):OnClick(function(self)
if (module.db.maxColumns + 1) == module.options.optColTabs.selected then
module.frame:ClearAllPoints()
module.frame:SetPoint("CENTER",UIParent,"CENTER",0,0)
else
module.frame.colFrame[module.options.optColTabs.selected]:ClearAllPoints()
module.frame.colFrame[module.options.optColTabs.selected]:SetPoint("CENTER",UIParent,"CENTER",0,0)
end
end)
--> Icon and height options
self.optColSet.sliderHeight = ELib:Slider(self.optColSet.superTabFrame.tab[2],L.cd2OtherSetIconSize):Size(400):Point("TOP",0,-50):Range(6,128):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.iconSize = event
module:ReloadAllSplits()
self.tooltipText = event
self:tooltipReload(self)
end)
self.optColSet.chkGray = ELib:Check(self.optColSet.superTabFrame.tab[2],L.cd2graytooltip):Point(10,-110):OnClick(function(self)
if self:GetChecked() then
currColOpt.iconGray = true
else
currColOpt.iconGray = nil
end
module:ReloadAllSplits()
end)
self.optColSet.textIconPos = ELib:Text(self.optColSet.superTabFrame.tab[2],L.cd2OtherSetIconPosition..":"):Size(200,20):Point(10,-85)
self.optColSet.dropDownIconPos = ELib:DropDown(self.optColSet.superTabFrame.tab[2],190,3):Size(200):Point(180,-85)
self.optColSet.dropDownIconPos.PosNames = {L.cd2OtherSetIconPositionLeft,L.cd2OtherSetIconPositionRight,L.cd2OtherSetIconPositionNo}
for i=1,#self.optColSet.dropDownIconPos.PosNames do
self.optColSet.dropDownIconPos.List[i] = {
text = self.optColSet.dropDownIconPos.PosNames[i],
arg1 = i,
func = function (self,arg)
ELib:DropDownClose()
currColOpt.iconPosition = arg
module:ReloadAllSplits()
module.options.optColSet.dropDownIconPos:SetText(module.options.optColSet.dropDownIconPos.PosNames[arg])
end,
}
end
self.optColSet.chkCooldown = ELib:Check(self.optColSet.superTabFrame.tab[2],L.cd2ColSetMethodCooldown):Point(10,-135):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsCooldown = true
else
currColOpt.methodsCooldown = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkCooldownTextDef = ELib:Radio(self.optColSet.superTabFrame.tab[2],L.cd2ColSetCDTimeDef):Point("TOPLEFT",self.optColSet.chkCooldown,25,-25):Tooltip(L.cd2ColSetCDTimeDefTooltip):OnClick(function(self)
currColOpt.iconCooldownHideNumbers = nil
currColOpt.iconCooldownExRTNumbers = nil
module.options.optColSet:chkCooldownTextUpdate()
module:ReloadAllSplits()
end)
self.optColSet.chkCooldownExRTNumbers = ELib:Radio(self.optColSet.superTabFrame.tab[2],L.cd2ColSetCDTimeExRT):Point("TOPLEFT",self.optColSet.chkCooldownTextDef,0,-25):Tooltip(L.cd2ColSetCDTimeExRTTooltip):OnClick(function(self)
currColOpt.iconCooldownHideNumbers = nil
currColOpt.iconCooldownExRTNumbers = true
module.options.optColSet:chkCooldownTextUpdate()
module:ReloadAllSplits()
end)
self.optColSet.chkCooldownHideNumbers = ELib:Radio(self.optColSet.superTabFrame.tab[2],L.BattleResHideTime):Point("TOPLEFT",self.optColSet.chkCooldownExRTNumbers,0,-25):Tooltip(L.BattleResHideTimeTooltip):OnClick(function(self)
currColOpt.iconCooldownHideNumbers = true
currColOpt.iconCooldownExRTNumbers = nil
module.options.optColSet:chkCooldownTextUpdate()
module:ReloadAllSplits()
end)
self.optColSet.chkCooldownTextUpdate = function(self)
local v1,v2,v3
local currColOpt = VMRT.ExCD2.colSet[module.options.optColTabs.selected]
if currColOpt.iconCooldownExRTNumbers then
v3 = true
elseif currColOpt.iconCooldownHideNumbers then
v2 = true
else
v1 = true
end
module.options.optColSet.chkCooldownTextDef:SetChecked(v1)
module.options.optColSet.chkCooldownHideNumbers:SetChecked(v2)
module.options.optColSet.chkCooldownExRTNumbers:SetChecked(v3)
end
self.optColSet.chkCooldownShowSwipe = ELib:Check(self.optColSet.superTabFrame.tab[2],L.cd2ShowEgde):Point("TOPLEFT",self.optColSet.chkCooldownHideNumbers,0,-25):OnClick(function(self)
if self:GetChecked() then
currColOpt.iconCooldownShowSwipe = true
else
currColOpt.iconCooldownShowSwipe = nil
end
module:ReloadAllSplits()
end)
self.optColSet.textGlowType = ELib:Text(self.optColSet.superTabFrame.tab[2],L.cd2GlowType):Point("TOPLEFT",self.optColSet.chkCooldownShowSwipe,0,-25):Size(0,25):Middle():Left()
self.optColSet.dropDownCooldownGlowType = ELib:DropDown(self.optColSet.superTabFrame.tab[2],160,4):Size(170):Point("LEFT",self.optColSet.textGlowType,"RIGHT",5,0):Tooltip(L.cd2GlowTypeTooltip)
for i=1,4 do
self.optColSet.dropDownCooldownGlowType.List[i] = {
text = i == 4 and L.NoText or i,
arg1 = i,
func = function (self,arg1)
ELib:DropDownClose()
currColOpt.iconGlowType = arg1
module:ReloadAllSplits()
module.options.optColSet.dropDownCooldownGlowType:SetText(module.options.optColSet.dropDownCooldownGlowType.List[arg1].text)
end,
}
end
self.optColSet.chkShowTitles = ELib:Check(self.optColSet.superTabFrame.tab[2],L.cd2ColSetShowTitles):Point("TOPLEFT",self.optColSet.chkCooldown,0,-150):OnClick(function(self)
if self:GetChecked() then
currColOpt.iconTitles = true
else
currColOpt.iconTitles = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkHideBlizzardEdges = ELib:Check(self.optColSet.superTabFrame.tab[2],L.cd2ColSetIconHideBlizzardEdges):Point("TOPLEFT",self.optColSet.chkShowTitles,0,-25):OnClick(function(self)
if self:GetChecked() then
currColOpt.iconHideBlizzardEdges = true
else
currColOpt.iconHideBlizzardEdges = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkMasque = ELib:Check(self.optColSet.superTabFrame.tab[2],L.cd2ColSetIconMasque):Point("TOPLEFT",self.optColSet.chkHideBlizzardEdges,0,-25):OnClick(function(self)
if self:GetChecked() then
currColOpt.iconMasque = true
else
currColOpt.iconMasque = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkGeneralIcons = ELib:Check(self.optColSet.superTabFrame.tab[2],L.cd2ColSetGeneral):Point("TOPRIGHT",-10,-10):Left():OnClick(function(self)
if self:GetChecked() then
currColOpt.iconGeneral = true
else
currColOpt.iconGeneral = nil
end
module:ReloadAllSplits()
self:doAlphas()
end)
function self.optColSet.chkGeneralIcons:doAlphas()
ExRT.lib.SetAlphas(VMRT.ExCD2.colSet[module.options.optColTabs.selected].iconGeneral and module.options.optColTabs.selected ~= (module.db.maxColumns + 1) and 0.5 or 1,module.options.optColSet.chkGray,module.options.optColSet.sliderHeight,module.options.optColSet.dropDownIconPos,module.options.optColSet.chkCooldown,module.options.optColSet.chkShowTitles,module.options.optColSet.chkHideBlizzardEdges,module.options.optColSet.chkCooldownShowSwipe,module.options.optColSet.chkCooldownHideNumbers,module.options.optColSet.textIconPos, module.options.optColSet.textGlowType, module.options.optColSet.dropDownCooldownGlowType,module.options.optColSet.chkCooldownTextDef,module.options.optColSet.chkCooldownExRTNumbers,module.options.optColSet.chkMasque)
end
--> Texture and colors Options
local function dropDownTextureButtonClick(self,arg,name)
ELib:DropDownClose()
currColOpt.textureFile = arg
module:ReloadAllSplits()
module.options.optColSet.dropDownTexture:SetText(L.cd2OtherSetTexture.." ["..name.."]")
end
self.optColSet.textDDTexture = ELib:Text(self.optColSet.superTabFrame.tab[3],L.cd2OtherSetTexture..":"):Size(200,20):Point(10,-35)
self.optColSet.dropDownTexture = ELib:DropDown(self.optColSet.superTabFrame.tab[3],200,15):Size(200):Point(180,-35)
for i=1,#ExRT.F.textureList do
self.optColSet.dropDownTexture.List[i] = {}
local info = self.optColSet.dropDownTexture.List[i]
info.text = i
info.arg1 = ExRT.F.textureList[i]
info.arg2 = i
info.func = dropDownTextureButtonClick
info.texture = ExRT.F.textureList[i]
info.justifyH = "CENTER"
end
for key,texture in ExRT.F.IterateMediaData("statusbar") do
local info = {}
self.optColSet.dropDownTexture.List[#self.optColSet.dropDownTexture.List+1] = info
info.text = key
info.arg1 = texture
info.arg2 = key
info.func = dropDownTextureButtonClick
info.texture = texture
info.justifyH = "CENTER"
end
self.optColSet.textDDBorder = ELib:Text(self.optColSet.superTabFrame.tab[3],L.cd2OtherSetBorder..":"):Size(200,20):Point(10,-65)
self.optColSet.sliderBorderSize = ELib:Slider(self.optColSet.superTabFrame.tab[3],""):Size(170):Point(180,-68):Range(0,20):OnChange(function(self,event)
event = event - event%1
currColOpt.textureBorderSize = event
self.tooltipText = event
self:tooltipReload(self)
module:ReloadAllSplits()
end)
self.optColSet.colorPickerBorder = ExRT.lib.CreateColorPickButton(self.optColSet.superTabFrame.tab[3],20,20,nil,361,-65)
self.optColSet.colorPickerBorder:SetScript("OnClick",function (self)
if not ColorPickerFrame.SetupColorPickerAndShow then
ColorPickerFrame.previousValues = {currColOpt.textureBorderColorR or module.db.colsDefaults.textureBorderColorR,currColOpt.textureBorderColorG or module.db.colsDefaults.textureBorderColorG,currColOpt.textureBorderColorB or module.db.colsDefaults.textureBorderColorB, currColOpt.textureBorderColorA or module.db.colsDefaults.textureBorderColorA}
ColorPickerFrame.hasOpacity = true
local nilFunc = ExRT.NULLfunc
local function changedCallback(restore)
local newR, newG, newB, newA
if restore then
newR, newG, newB, newA = unpack(restore)
else
newA, newR, newG, newB = OpacitySliderFrame:GetValue(), ColorPickerFrame:GetColorRGB()
end
currColOpt.textureBorderColorR = newR
currColOpt.textureBorderColorG = newG
currColOpt.textureBorderColorB = newB
currColOpt.textureBorderColorA = newA
module:ReloadAllSplits()
self.color:SetColorTexture(newR,newG,newB,newA)
end
ColorPickerFrame.func, ColorPickerFrame.opacityFunc, ColorPickerFrame.cancelFunc = nilFunc, nilFunc, nilFunc
ColorPickerFrame.opacity = currColOpt.textureBorderColorA or module.db.colsDefaults.textureBorderColorA
ColorPickerFrame:SetColorRGB(currColOpt.textureBorderColorR or module.db.colsDefaults.textureBorderColorR,currColOpt.textureBorderColorG or module.db.colsDefaults.textureBorderColorG,currColOpt.textureBorderColorB or module.db.colsDefaults.textureBorderColorB)
ColorPickerFrame.func, ColorPickerFrame.opacityFunc, ColorPickerFrame.cancelFunc = changedCallback, changedCallback, changedCallback
ColorPickerFrame:Show()
else
local info = {}
info.r, info.g, info.b = currColOpt.textureBorderColorR or module.db.colsDefaults.textureBorderColorR,currColOpt.textureBorderColorG or module.db.colsDefaults.textureBorderColorG,currColOpt.textureBorderColorB or module.db.colsDefaults.textureBorderColorB
info.opacity = currColOpt.textureBorderColorA or module.db.colsDefaults.textureBorderColorA
info.hasOpacity = true
info.swatchFunc = function()
local newR, newG, newB = ColorPickerFrame:GetColorRGB()
local newA = ColorPickerFrame:GetColorAlpha()
currColOpt.textureBorderColorR = newR
currColOpt.textureBorderColorG = newG
currColOpt.textureBorderColorB = newB
currColOpt.textureBorderColorA = newA
module:ReloadAllSplits()
self.color:SetColorTexture(newR,newG,newB,newA)
end
info.cancelFunc = function()
local newR, newG, newB, newA = ColorPickerFrame:GetPreviousValues()
currColOpt.textureBorderColorR = newR
currColOpt.textureBorderColorG = newG
currColOpt.textureBorderColorB = newB
currColOpt.textureBorderColorA = newA
module:ReloadAllSplits()
self.color:SetColorTexture(newR,newG,newB,newA)
end
ColorPickerFrame:SetupColorPickerAndShow(info)
end
end)
self.optColSet.chkAnimation = ELib:Check(self.optColSet.superTabFrame.tab[3],L.cd2OtherSetAnimation):Point(10,-97):OnClick(function(self)
if self:GetChecked() then
currColOpt.textureAnimation = true
else
currColOpt.textureAnimation = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkHideSpark = ELib:Check(self.optColSet.superTabFrame.tab[3],L.cd2OtherSetHideSpark):Point(200,-97):OnClick(function(self)
if self:GetChecked() then
currColOpt.textureHideSpark = true
else
currColOpt.textureHideSpark = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkSmoothAnimation = ELib:Check(self.optColSet.superTabFrame.tab[3],L.cd2TextureSmoothAnim):Point(10,-122):OnClick(function(self)
if self:GetChecked() then
currColOpt.textureSmoothAnimation = true
else
currColOpt.textureSmoothAnimation = nil
end
module:ReloadAllSplits()
end)
self.optColSet.sliderSmoothAnimationDuration = ELib:Slider(self.optColSet.superTabFrame.tab[3],""):Size(140):Point("TOP",self.optColSet.chkSmoothAnimation,0,-2):Point("LEFT",self.optColSet.chkSmoothAnimation.text,"RIGHT",20,0):Range(10,200):OnChange(function(self,event)
event = event - event%1
currColOpt.textureSmoothAnimationDuration = event
module:ReloadAllSplits()
self.tooltipText = event / 100
self:tooltipReload(self)
end)
self.optColSet.sliderSmoothAnimationDuration.Low:SetText("0.1")
self.optColSet.sliderSmoothAnimationDuration.High:SetText("2")
self.colorSetupFrame = CreateFrame("Frame",nil,self.optColSet.superTabFrame.tab[3])
self.colorSetupFrame:SetSize(420,290)
self.colorSetupFrame:SetPoint("TOP",0,-135)
self.colorSetupFrame.backAlpha = ELib:Slider(self.colorSetupFrame,L.cd2OtherSetColorFrameAlpha):Size(400):Point("TOP",0,-163):Range(0,100)
self.colorSetupFrame.backCDAlpha = ELib:Slider(self.colorSetupFrame,L.cd2OtherSetColorFrameAlphaCD):Size(400):Point("TOP",0,-198):Range(0,100)
self.colorSetupFrame.backCooldownAlpha = ELib:Slider(self.colorSetupFrame,L.cd2OtherSetColorFrameAlphaCooldown):Size(400):Point("TOP",0,-233):Range(0,100)
self.colorSetupFrame.backAlpha.inOptName = "textureAlphaBackground"
self.colorSetupFrame.backCDAlpha.inOptName = "textureAlphaTimeLine"
self.colorSetupFrame.backCooldownAlpha.inOptName = "textureAlphaCooldown"
local function colorPickerButtonClick(self)
if not ColorPickerFrame.SetupColorPickerAndShow then
ColorPickerFrame.previousValues = {currColOpt[self.inOptName.."R"] or module.db.colsDefaults[self.inOptName.."R"],currColOpt[self.inOptName.."G"] or module.db.colsDefaults[self.inOptName.."G"],currColOpt[self.inOptName.."B"] or module.db.colsDefaults[self.inOptName.."B"], 1}
local nilFunc = ExRT.NULLfunc
local function changedCallback(restore)
local newR, newG, newB, newA
if restore then
newR, newG, newB, newA = unpack(restore)
else
newA, newR, newG, newB = OpacitySliderFrame:GetValue(), ColorPickerFrame:GetColorRGB()
end
currColOpt[self.inOptName.."R"] = newR
currColOpt[self.inOptName.."G"] = newG
currColOpt[self.inOptName.."B"] = newB
module:ReloadAllSplits()
self.color:SetColorTexture(newR,newG,newB,1)
end
ColorPickerFrame.func, ColorPickerFrame.opacityFunc, ColorPickerFrame.cancelFunc = nilFunc, nilFunc, nilFunc
ColorPickerFrame:SetColorRGB(currColOpt[self.inOptName.."R"] or module.db.colsDefaults[self.inOptName.."R"],currColOpt[self.inOptName.."G"] or module.db.colsDefaults[self.inOptName.."G"],currColOpt[self.inOptName.."B"] or module.db.colsDefaults[self.inOptName.."B"])
ColorPickerFrame.func, ColorPickerFrame.cancelFunc = changedCallback, changedCallback
ColorPickerFrame:Show()
else
local info = {}
info.r, info.g, info.b = currColOpt[self.inOptName.."R"] or module.db.colsDefaults[self.inOptName.."R"],currColOpt[self.inOptName.."G"] or module.db.colsDefaults[self.inOptName.."G"],currColOpt[self.inOptName.."B"] or module.db.colsDefaults[self.inOptName.."B"]
info.opacity = 1
info.hasOpacity = false
info.swatchFunc = function()
local newR, newG, newB = ColorPickerFrame:GetColorRGB()
currColOpt[self.inOptName.."R"] = newR
currColOpt[self.inOptName.."G"] = newG
currColOpt[self.inOptName.."B"] = newB
module:ReloadAllSplits()
self.color:SetColorTexture(newR,newG,newB,1)
end
info.cancelFunc = function()
local newR, newG, newB = ColorPickerFrame:GetPreviousValues()
currColOpt[self.inOptName.."R"] = newR
currColOpt[self.inOptName.."G"] = newG
currColOpt[self.inOptName.."B"] = newB
module:ReloadAllSplits()
self.color:SetColorTexture(newR,newG,newB,1)
end
ColorPickerFrame:SetupColorPickerAndShow(info)
end
end
local function colorPickerSliderValue(self,newval)
currColOpt[self.inOptName] = newval / 100
module:ReloadAllSplits()
self.tooltipText = ExRT.F.Round(newval)
self:tooltipReload(self)
end
local function colorPickerCheckBoxClick(self)
if self:GetChecked() then
currColOpt[self.inOptName] = true
else
currColOpt[self.inOptName] = nil
end
module:ReloadAllSplits()
end
local colorSetupFrameColorsNames_TopText = {L.cd2OtherSetColorFrameTopText,L.cd2OtherSetColorFrameTopBack,L.cd2OtherSetColorFrameTopTimeLine}
for i=1,3 do
self.colorSetupFrame["topText"..i] = ELib:Text(self.colorSetupFrame,colorSetupFrameColorsNames_TopText[i],12):Size(50,20):Point(225+(i-1)*40,-15):Center():Color():Shadow()
end
local colorSetupFrameColorsNames_Text = {L.cd2OtherSetColorFrameText..":",L.cd2OtherSetColorFrameActive..":",L.cd2OtherSetColorFrameCooldown..":"}
for j=1,3 do
for i=1,3 do
local colorf = ExRT.lib.CreateColorPickButton(self.colorSetupFrame,20,20,nil,240+(i-1)*40,-35-(j-1)*20)
self.colorSetupFrame[ "color"..colorSetupFrameColorsObjectsNames[i]..colorSetupFrameColorsNames[j] ] = colorf
colorf.inOptName = "textureColor"..colorSetupFrameColorsObjectsNames[i]..colorSetupFrameColorsNames[j]
colorf:SetScript("OnClick",colorPickerButtonClick)
end
self.colorSetupFrame[ "text"..colorSetupFrameColorsNames[j] ] = ELib:Text(self.colorSetupFrame,colorSetupFrameColorsNames_Text[j],12):Size(210,20):Point(10,-35-(j-1)*20):Right():Color():Shadow()
end
local checksInOptNames = {"textureClassText","textureClassBackground","textureClassTimeLine"}
for i=1,3 do
self.colorSetupFrame[ "colorClass"..colorSetupFrameColorsObjectsNames[i] ] = ELib:Check(self.colorSetupFrame,""):Point(241+(i-1)*40,-117):Size(18,18):OnClick(colorPickerCheckBoxClick)
self.colorSetupFrame[ "colorClass"..colorSetupFrameColorsObjectsNames[i] ].inOptName = checksInOptNames[i]
end
self.colorSetupFrame["textClass"] = ELib:Text(self.colorSetupFrame,L.cd2OtherSetColorFrameClass..":",12):Size(210,20):Point(10,-115):Right():Color():Shadow()
self.colorSetupFrame.backAlpha:SetScript("OnValueChanged",colorPickerSliderValue)
self.colorSetupFrame.backCDAlpha:SetScript("OnValueChanged",colorPickerSliderValue)
self.colorSetupFrame.backCooldownAlpha:SetScript("OnValueChanged",colorPickerSliderValue)
self.colorSetupFrame.resetButton = ELib:Button(self.colorSetupFrame,L.cd2OtherSetColorFrameReset):Size(160,20):Point("TOP",-81,-265)
self.colorSetupFrame.softenButton = ELib:Button(self.colorSetupFrame,L.cd2OtherSetColorFrameSoften):Size(160,20):Point("TOP",81,-265)
self.colorSetupFrame.softenButton:SetScript("OnClick",function()
local tmpColors = {"R","G","B"}
for j=1,3 do
for i=1,3 do
local maxColor = 0
for n=1,3 do
local color = currColOpt[ "textureColor"..colorSetupFrameColorsObjectsNames[i]..colorSetupFrameColorsNames[j]..tmpColors[n] ] or module.db.colsDefaults[ "textureColor"..colorSetupFrameColorsObjectsNames[i]..colorSetupFrameColorsNames[j]..tmpColors[n] ]
maxColor = max(maxColor,color)
end
for n=1,3 do
local color = currColOpt[ "textureColor"..colorSetupFrameColorsObjectsNames[i]..colorSetupFrameColorsNames[j]..tmpColors[n] ] or module.db.colsDefaults[ "textureColor"..colorSetupFrameColorsObjectsNames[i]..colorSetupFrameColorsNames[j]..tmpColors[n] ]
if color < maxColor then
currColOpt[ "textureColor"..colorSetupFrameColorsObjectsNames[i]..colorSetupFrameColorsNames[j]..tmpColors[n] ] = color + (maxColor - color) / 2
end
end
end
end
module.options.showColorFrame(module.options.colorSetupFrame)
module:ReloadAllSplits()
end)
self.colorSetupFrame.resetButton:SetScript("OnClick",function()
local tmpColors = {"R","G","B"}
for j=1,4 do
for i=1,3 do
for n=1,3 do
currColOpt[ "textureColor"..colorSetupFrameColorsObjectsNames[i]..colorSetupFrameColorsNames[j]..tmpColors[n] ] = nil
end
end
end
currColOpt.textureAlphaBackground = nil
currColOpt.textureAlphaTimeLine = nil
currColOpt.textureAlphaCooldown = nil
for i=1,3 do
currColOpt[ checksInOptNames[i] ] = nil
end
module.options.showColorFrame(module.options.colorSetupFrame)
module:ReloadAllSplits()
end)
function self:showColorFrame()
local currColOpt = VMRT.ExCD2.colSet[module.options.optColTabs.selected]
for j=1,3 do
for i=1,3 do
local this = module.options.colorSetupFrame[ "color"..colorSetupFrameColorsObjectsNames[i]..colorSetupFrameColorsNames[j] ]
this.color:SetColorTexture(currColOpt[this.inOptName.."R"] or module.db.colsDefaults[this.inOptName.."R"],currColOpt[this.inOptName.."G"] or module.db.colsDefaults[this.inOptName.."G"],currColOpt[this.inOptName.."B"] or module.db.colsDefaults[this.inOptName.."B"],1)
end
end
for i=1,3 do
module.options.colorSetupFrame["colorClass"..colorSetupFrameColorsObjectsNames[i]]:SetChecked( currColOpt[ checksInOptNames[i] ] )
end
self.backAlpha:SetValue((currColOpt[self.backAlpha.inOptName] or module.db.colsDefaults[self.backAlpha.inOptName])*100)
self.backCDAlpha:SetValue((currColOpt[self.backCDAlpha.inOptName] or module.db.colsDefaults[self.backCDAlpha.inOptName])*100)
self.backCooldownAlpha:SetValue((currColOpt[self.backCooldownAlpha.inOptName] or module.db.colsDefaults[self.backCooldownAlpha.inOptName])*100)
end
self.colorSetupFrame:SetScript("OnShow",self.showColorFrame)
self.optColSet.chkGeneralColorize = ELib:Check(self.optColSet.superTabFrame.tab[3],L.cd2ColSetGeneral):Point("TOPRIGHT",-10,-10):Left():OnClick(function(self)
if self:GetChecked() then
currColOpt.textureGeneral = true
else
currColOpt.textureGeneral = nil
end
module:ReloadAllSplits()
self:doAlphas()
end)
function self.optColSet.chkGeneralColorize:doAlphas()
ExRT.lib.SetAlphas(VMRT.ExCD2.colSet[module.options.optColTabs.selected].textureGeneral and module.options.optColTabs.selected ~= (module.db.maxColumns + 1) and 0.5 or 1,module.options.optColSet.dropDownTexture,module.options.optColSet.chkAnimation,module.options.colorSetupFrame,module.options.optColSet.colorPickerBorder,module.options.optColSet.sliderBorderSize,module.options.optColSet.chkHideSpark,module.options.optColSet.textDDTexture, module.options.optColSet.textDDBorder, module.options.optColSet.chkSmoothAnimation, module.options.optColSet.sliderSmoothAnimationDuration)
end
--> Font Options
self.optColSet.nowFont = "font"
self.optColSet.superTabFrame.tab[4].decorationLine = ELib:DecorationLine(self.optColSet.superTabFrame.tab[4],true,"BACKGROUND"):Point("TOPLEFT",self.optColSet.superTabFrame.tab[4],0,-35):Point("BOTTOMRIGHT",self.optColSet.superTabFrame.tab[4],"TOPRIGHT",0,-55)
self.optColSet.fontsTab = ELib:Tabs(self.optColSet.superTabFrame.tab[4],0,L.cd2ColSetFontPosGeneral,L.cd2ColSetFontPosRight,L.cd2ColSetFontPosCenter,L.cd2ColSetFontPosIcon,L.cd2ColSetFontPosIconCD):Size(455,160):Point(0,-55)
self.optColSet.fontsTab:SetBackdropBorderColor(0,0,0,0)
self.optColSet.fontsTab:SetBackdropColor(0,0,0,0)
local function fontsTabButtonClick(self)
local tabFrame = self.mainFrame
tabFrame.selected = self.id
tabFrame.UpdateTabs(tabFrame)
module.options.optColSet.nowFont = self.fontMark
local i = module.options.optColTabs.selected
do
local FontNameForDropDown = select(3,string.find(VMRT.ExCD2.colSet[i][self.fontMark.."Name"] or module.db.colsDefaults.fontName,"\\([^\\]*)$"))
module.options.optColSet.dropDownFont:SetText( (FontNameForDropDown or VMRT.ExCD2.colSet[i][self.fontMark.."Name"] or module.db.colsDefaults.fontName or "?") )
end
module.options.optColSet.sliderFont:SetValue(VMRT.ExCD2.colSet[i][self.fontMark.."Size"] or module.db.colsDefaults.fontSize)
module.options.optColSet.chkFontOutline:SetChecked(VMRT.ExCD2.colSet[i][self.fontMark.."Outline"])
module.options.optColSet.chkFontShadow:SetChecked(VMRT.ExCD2.colSet[i][self.fontMark.."Shadow"])
end
for i=1,5 do
self.optColSet.fontsTab.tabs[i].button:SetScript("OnClick",fontsTabButtonClick)
end
local fontOtherAvailableTable = {"Left","Right","Center","Icon","IconCD"}
function self.fontOtherAvailable(isAvailable)
if isAvailable then
for i=2,5 do
self.optColSet.fontsTab.tabs[i].button:Show()
end
self.optColSet.fontsTab.tabs[1].button:SetText(L.cd2ColSetFontPosLeft)
for i=1,5 do
self.optColSet.fontsTab.tabs[i].button.fontMark = "font"..fontOtherAvailableTable[i]
end
else
for i=2,5 do
self.optColSet.fontsTab.tabs[i].button:Hide()
end
self.optColSet.fontsTab.tabs[1].button:SetText(L.cd2ColSetFontPosGeneral)
self.optColSet.fontsTab.tabs[1].button.fontMark = "font"
end
self.optColSet.fontsTab.resizeFunc(self.optColSet.fontsTab.tabs[1].button, 0, nil, nil, self.optColSet.fontsTab.tabs[1].button:GetFontString():GetStringWidth(), self.optColSet.fontsTab.tabs[1].button:GetFontString():GetStringWidth())
fontsTabButtonClick(module.options.optColSet.fontsTab.tabs[1].button)
end
self.optColSet.chkFontOtherAvailable = ELib:Check(self.optColSet.superTabFrame.tab[4],L.cd2ColSetFontOtherAvailable):Point(10,-220):OnClick(function(self)
if self:GetChecked() then
currColOpt.fontOtherAvailable = true --fontOtherAvailable
else
currColOpt.fontOtherAvailable = nil
end
module:ReloadAllSplits()
module.options.fontOtherAvailable( self:GetChecked() )
end)
self.optColSet.sliderFont = ELib:Slider(self.optColSet.fontsTab,L.cd2OtherSetFontSize):Size(400):Point("TOP",0,-60):Range(8,72):OnChange(function(self,event)
event = event - event%1
currColOpt[module.options.optColSet.nowFont.."Size"] = event --fontSize
module:ReloadAllSplits()
self.tooltipText = event
self:tooltipReload(self)
end)
self.optColSet.textDDFont = ELib:Text(self.optColSet.fontsTab,L.cd2OtherSetFont..":"):Size(200,20):Point(10,-15)
local function dropDownFontButtonClick(self,arg1,arg2)
ELib:DropDownClose()
currColOpt[module.options.optColSet.nowFont.."Name"] = arg1 --fontName
module:ReloadAllSplits()
local FontNameForDropDown = select(3,string.find(arg1,"\\([^\\]*)$"))
if arg2 then
module.options.optColSet.dropDownFont:SetText(FontNameForDropDown or ExRT.F.fontList[arg2])
else
module.options.optColSet.dropDownFont:SetText(FontNameForDropDown or arg2)
end
end
self.optColSet.dropDownFont = ELib:DropDown(self.optColSet.fontsTab,350,10):Size(200):Point(180,-15)
for i=1,#ExRT.F.fontList do
self.optColSet.dropDownFont.List[i] = {}
local info = self.optColSet.dropDownFont.List[i]
info.text = ExRT.F.fontList[i]
info.arg1 = ExRT.F.fontList[i]
info.arg2 = i
info.func = dropDownFontButtonClick
info.font = ExRT.F.fontList[i]
info.justifyH = "CENTER"
end
for name,font in ExRT.F.IterateMediaData("font") do
local info = {}
self.optColSet.dropDownFont.List[#self.optColSet.dropDownFont.List+1] = info
info.text = name
info.arg1 = font
info.func = dropDownFontButtonClick
info.font = font
info.justifyH = "CENTER"
end
self.optColSet.chkFontOutline = ELib:Check(self.optColSet.fontsTab,L.cd2OtherSetOutline):Point(10,-95):OnClick(function(self)
if self:GetChecked() then
currColOpt[module.options.optColSet.nowFont.."Outline"] = true --fontOutline
else
currColOpt[module.options.optColSet.nowFont.."Outline"] = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkFontShadow = ELib:Check(self.optColSet.fontsTab,L.cd2OtherSetFontShadow):Point(10,-120):OnClick(function(self)
if self:GetChecked() then
currColOpt[module.options.optColSet.nowFont.."Shadow"] = true -- fontShadow
else
currColOpt[module.options.optColSet.nowFont.."Shadow"] = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkGeneralFont = ELib:Check(self.optColSet.superTabFrame.tab[4],L.cd2ColSetGeneral):Point("TOPRIGHT",-10,-10):Left():OnClick(function(self)
if self:GetChecked() then
currColOpt.fontGeneral = true
else
currColOpt.fontGeneral = nil
end
module:ReloadAllSplits()
self:doAlphas()
end)
function self.optColSet.chkGeneralFont:doAlphas()
ExRT.lib.SetAlphas(VMRT.ExCD2.colSet[module.options.optColTabs.selected].fontGeneral and module.options.optColTabs.selected ~= (module.db.maxColumns + 1) and 0.5 or 1,module.options.optColSet.dropDownFont,module.options.optColSet.sliderFont,module.options.optColSet.chkFontOutline,module.options.optColSet.chkFontShadow,module.options.optColSet.chkFontOtherAvailable)
end
--> Text options
self.optColSet.textLeftTemText = ELib:Text(self.optColSet.superTabFrame.tab[5],L.cd2ColSetTextLeft..":"):Size(200,20):Point(10,-40)
self.optColSet.textLeftTemEdit = ELib:Edit(self.optColSet.superTabFrame.tab[5]):Size(220,20):Point(180,-40):OnChange(function(self,isUser)
if isUser then
currColOpt.textTemplateLeft = self:GetText()
module:ReloadAllSplits()
end
end)
self.optColSet.textRightTemText = ELib:Text(self.optColSet.superTabFrame.tab[5],L.cd2ColSetTextRight..":"):Size(200,20):Point(10,-65)
self.optColSet.textRightTemEdit = ELib:Edit(self.optColSet.superTabFrame.tab[5]):Size(220,20):Point(180,-65):OnChange(function(self,isUser)
if isUser then
currColOpt.textTemplateRight = self:GetText()
module:ReloadAllSplits()
end
end)
self.optColSet.textCenterTemText = ELib:Text(self.optColSet.superTabFrame.tab[5],L.cd2ColSetTextCenter..":"):Size(200,20):Point(10,-90)
self.optColSet.textCenterTemEdit = ELib:Edit(self.optColSet.superTabFrame.tab[5]):Size(220,20):Point(180,-90):OnChange(function(self,isUser)
if isUser then
currColOpt.textTemplateCenter = self:GetText()
module:ReloadAllSplits()
end
end)
self.optColSet.textAllTemplates = ELib:Text(self.optColSet.superTabFrame.tab[5],L.cd2ColSetTextTooltip,11):Size(450,200):Point(10,-115):Top():Color()
self.optColSet.textResetButton = ELib:Button(self.optColSet.superTabFrame.tab[5],L.cd2ColSetTextReset):Size(340,20):Point("TOP",0,-225):OnClick(function(self)
currColOpt.textTemplateLeft = nil
currColOpt.textTemplateRight = nil
currColOpt.textTemplateCenter = nil
module:ReloadAllSplits()
module.options.optColSet.textLeftTemEdit:SetText(module.db.colsDefaults.textTemplateLeft)
module.options.optColSet.textRightTemEdit:SetText(module.db.colsDefaults.textTemplateRight)
module.options.optColSet.textCenterTemEdit:SetText(module.db.colsDefaults.textTemplateCenter)
end)
self.optColSet.chkIconName = ELib:Check(self.optColSet.superTabFrame.tab[5],L.cd2ColSetTextIconName):Point(10,-250):OnClick(function(self)
if self:GetChecked() then
currColOpt.textIconName = true
else
currColOpt.textIconName = nil
end
module:ReloadAllSplits()
end)
self.optColSet.sliderIconNameChars = ELib:Slider(self.optColSet.superTabFrame.tab[5],L.cd2ColSetMaxLength):Size(140):Point("TOP",self.optColSet.chkIconName,0,-8):Point("LEFT",self.optColSet.chkIconName.text,"RIGHT",20,0):Range(1,50):OnChange(function(self,event)
event = event - event%1
currColOpt.textIconNameChars = event
module:ReloadAllSplits()
self.tooltipText = event
self:tooltipReload(self)
end)
self.optColSet.sliderIconNameChars.Low:SetText("")
self.optColSet.sliderIconNameChars.High:SetText("")
self.optColSet.dropDownIconCDStyle = ELib:DropDown(self.optColSet.superTabFrame.tab[5],350):Size(230):Point("TOPLEFT",self.optColSet.chkIconName,170,-30)
self.optColSet.textdropDownIconCDStyle = ELib:Text(self.optColSet.superTabFrame.tab[5],L.cd2ColSetCDTimeStyle..":",11):Size(200,20):Point("TOPLEFT",self.optColSet.chkIconName,0,-30)
self.optColSet.dropDownIconCDStyle.Styles = {
"<10: |cff00ff009|r - <60: |cff00ff0046|r - 60+: |cff00ff00"..SecondsToTime(95,true).."|r - 120+:|cff00ff00"..SecondsToTime(125,true).."|r",
"<10: |cff00ff009|r - <60: |cff00ff0046|r - 60+: |cff00ff00"..SecondsToTime(95+60,true).."|r - 120+:|cff00ff00"..SecondsToTime(125+60,true).."|r",
"<10: |cff00ff008.5|r - <60: |cff00ff0046|r - 60+: |cff00ff00"..SecondsToTime(95,true).."|r - 120+:|cff00ff00"..SecondsToTime(125,true).."|r",
"<10: |cff00ff008.5|r - <60: |cff00ff0046|r - 60+: |cff00ff00"..SecondsToTime(95+60,true).."|r - 120+:|cff00ff00"..SecondsToTime(125+60,true).."|r",
"<10: |cff00ff009|r - <60: |cff00ff0046|r - 60+: |cff00ff001:35|r - 120+:|cff00ff002:05|r",
"<10: |cff00ff008.5|r - <60: |cff00ff0046|r - 60+: |cff00ff001:35|r - 120+:|cff00ff002:05|r",
"<10: |cff00ff009|r - <60: |cff00ff0046|r - 60+: |cff00ff001m|r - 120+:|cff00ff002m|r",
"<10: |cff00ff009|r - <60: |cff00ff0046|r - 60+: |cff00ff002m|r - 120+:|cff00ff003m|r",
"<10: |cff00ff008.5|r - <60: |cff00ff0046|r - 60+: |cff00ff001m|r - 120+:|cff00ff002m|r",
"<10: |cff00ff008.5|r - <60: |cff00ff0046|r - 60+: |cff00ff002m|r - 120+:|cff00ff003m|r",
"<10: |cff00ff008|r - <100: |cff00ff0046|r - 100+: |cff00ff001m|r - 120+:|cff00ff002m|r",
}
for i=1,#self.optColSet.dropDownIconCDStyle.Styles do
self.optColSet.dropDownIconCDStyle.List[i] = {
text = self.optColSet.dropDownIconCDStyle.Styles[i],
arg1 = i,
arg2 = self.optColSet.dropDownIconCDStyle.Styles[i],
func = function (self,arg,arg2)
ELib:DropDownClose()
currColOpt.textIconCDStyle = arg
module:ReloadAllSplits()
self:GetParent().parent:SetText(arg2)
end
}
end
self.optColSet.chkShowTargetName = ELib:Check(self.optColSet.superTabFrame.tab[5],L.cd2ColSetTextShowTargetName):Point("TOPLEFT",self.optColSet.chkIconName,0,-60):OnClick(function(self)
if self:GetChecked() then
currColOpt.textShowTargetName = true
else
currColOpt.textShowTargetName = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkGeneralText = ELib:Check(self.optColSet.superTabFrame.tab[5],L.cd2ColSetGeneral):Point("TOPRIGHT",-10,-10):Left():OnClick(function(self)
if self:GetChecked() then
currColOpt.textGeneral = true
else
currColOpt.textGeneral = nil
end
module:ReloadAllSplits()
self:doAlphas()
end)
function self.optColSet.chkGeneralText:doAlphas()
ExRT.lib.SetAlphas(VMRT.ExCD2.colSet[module.options.optColTabs.selected].textGeneral and module.options.optColTabs.selected ~= (module.db.maxColumns + 1) and 0.5 or 1,module.options.optColSet.textLeftTemEdit,module.options.optColSet.textRightTemEdit,module.options.optColSet.textCenterTemEdit,module.options.optColSet.chkIconName,module.options.optColSet.textAllTemplates,module.options.optColSet.textLeftTemText,module.options.optColSet.textRightTemText,module.options.optColSet.textCenterTemText,module.options.optColSet.textResetButton,module.options.optColSet.sliderIconNameChars,module.options.optColSet.dropDownIconCDStyle,module.options.optColSet.textdropDownIconCDStyle,module.options.optColSet.chkShowTargetName)
end
--> Method options
self.optColSet.superTabFrame.tab[6].scroll = ELib:ScrollFrame(self.optColSet.superTabFrame.tab[6]):Point("TOP"):Size(456,444):Height(535+25*2)
ELib:Border(self.optColSet.superTabFrame.tab[6].scroll,0)
self.optColSet.col6scroll = self.optColSet.superTabFrame.tab[6].scroll.C
self.optColSet.col6scroll:SetWidth(456 - 16)
self.optColSet.chkShowOnlyOnCD = ELib:Check(self.optColSet.col6scroll,L.cd2OtherSetOnlyOnCD):Point(10,-30):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsShownOnCD = true
else
currColOpt.methodsShownOnCD = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkBotToTop = ELib:Check(self.optColSet.col6scroll,L.cd2ColSetBotToTop):Point(10,-55):OnClick(function(self)
if self:GetChecked() then
currColOpt.frameAnchorBottom = true
else
currColOpt.frameAnchorBottom = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkRightToLeft = ELib:Check(self.optColSet.col6scroll,L.cd2ColSetRightToLeft):Point(10,-80):OnClick(function(self)
if self:GetChecked() then
currColOpt.frameAnchorRightToLeft = true
else
currColOpt.frameAnchorRightToLeft = nil
end
module:ReloadAllSplits()
end)
self.optColSet.textStyleAnimation = ELib:Text(self.optColSet.col6scroll,L.cd2OtherSetStyleAnimation..":",11):Size(200,20):Point(10,-105)
self.optColSet.dropDownStyleAnimation = ELib:DropDown(self.optColSet.col6scroll,205,2):Size(220):Point(180,-105)
self.optColSet.dropDownStyleAnimation.Styles = {L.cd2OtherSetStyleAnimation1,L.cd2OtherSetStyleAnimation2}
for i=1,#self.optColSet.dropDownStyleAnimation.Styles do
self.optColSet.dropDownStyleAnimation.List[i] = {
text = self.optColSet.dropDownStyleAnimation.Styles[i],
arg1 = i,
func = function (self,arg)
ELib:DropDownClose()
currColOpt.methodsStyleAnimation = arg
module:ReloadAllSplits()
self:GetParent().parent:SetText(module.options.optColSet.dropDownStyleAnimation.Styles[arg])
end
}
end
self.optColSet.textTimeLineAnimation = ELib:Text(self.optColSet.col6scroll,L.cd2OtherSetTimeLineAnimation..":",11):Size(200,20):Point(10,-130)
self.optColSet.dropDownTimeLineAnimation = ELib:DropDown(self.optColSet.col6scroll,205,2):Size(220):Point(180,-130)
self.optColSet.dropDownTimeLineAnimation.Styles = {L.cd2OtherSetTimeLineAnimation1,L.cd2OtherSetTimeLineAnimation2}
for i=1,#self.optColSet.dropDownTimeLineAnimation.Styles do
self.optColSet.dropDownTimeLineAnimation.List[i] = {
text = self.optColSet.dropDownTimeLineAnimation.Styles[i],
arg1 = i,
func = function (self,arg)
ELib:DropDownClose()
currColOpt.methodsTimeLineAnimation = arg
module:ReloadAllSplits()
self:GetParent().parent:SetText(module.options.optColSet.dropDownTimeLineAnimation.Styles[arg])
end
}
end
self.optColSet.chkIconTooltip = ELib:Check(self.optColSet.col6scroll,L.cd2OtherSetIconToolip):Point(10,-155):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsIconTooltip = true
else
currColOpt.methodsIconTooltip = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkLineClick = ELib:Check(self.optColSet.col6scroll,L.cd2OtherSetLineClick):Point(10,-180):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsLineClick = true
else
currColOpt.methodsLineClick = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkLineClickWhisper = ELib:Check(self.optColSet.col6scroll,L.cd2OtherSetLineClickWhisper):Point(10,-205):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsLineClickWhisper = true
else
currColOpt.methodsLineClickWhisper = nil
end
module:ReloadAllSplits()
end)
self.optColSet.textLineClickMod = ELib:Text(self.optColSet.col6scroll,L.cd2ClickKeyMod..":",11):Size(200,20):Point(10,-230)
self.optColSet.dropDownLineClickMod = ELib:DropDown(self.optColSet.col6scroll,205,4):Size(150):Point(250,-230)
self.optColSet.dropDownLineClickMod.Mods = {"-",nil,SHIFT_KEY or "Shift","shift",CTRL_KEY or "Ctrl","ctrl",ALT_KEY_TEXT or "Alt","alt"}
for i=1,#self.optColSet.dropDownLineClickMod.Mods,2 do
local text = self.optColSet.dropDownLineClickMod.Mods[i]
self.optColSet.dropDownLineClickMod.List[ #self.optColSet.dropDownLineClickMod.List+1 ] = {
text = text,
arg1 = self.optColSet.dropDownLineClickMod.Mods[i+1],
func = function (self,arg)
ELib:DropDownClose()
currColOpt.methodsLineClickMod = arg
module:ReloadAllSplits()
self:GetParent().parent:SetText(text)
end
}
end
self.optColSet.chkNewSpellNewLine = ELib:Check(self.optColSet.col6scroll,L.cd2NewSpellNewLine):Point(10,-255):Tooltip(L.cd2NewSpellNewLineTooltip):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsNewSpellNewLine = true
else
currColOpt.methodsNewSpellNewLine = nil
end
module:ReloadAllSplits()
end)
self.optColSet.textSortingRules = ELib:Text(self.optColSet.col6scroll,L.cd2MethodsSortingRules..":",11):Size(200,20):Point(10,-280)
self.optColSet.dropDownSortingRules = ELib:DropDown(self.optColSet.col6scroll,405,6):Size(220):Point(180,-280)
self.optColSet.dropDownSortingRules.Rules = {L.cd2MethodsSortingRules1,L.cd2MethodsSortingRules2,L.cd2MethodsSortingRules3,L.cd2MethodsSortingRules4,L.cd2MethodsSortingRules5,L.cd2MethodsSortingRules6}
for i=1,#self.optColSet.dropDownSortingRules.Rules do
self.optColSet.dropDownSortingRules.List[i] = {
text = self.optColSet.dropDownSortingRules.Rules[i],
arg1 = i,
func = function (self,arg)
ELib:DropDownClose()
currColOpt.methodsSortingRules = arg
module:ReloadAllSplits()
module.main:GROUP_ROSTER_UPDATE()
self:GetParent().parent:SetText(module.options.optColSet.dropDownSortingRules.Rules[arg])
end
}
end
self.optColSet.chkHideOwnSpells = ELib:Check(self.optColSet.col6scroll,L.cd2MethodsDisableOwn):Point(10,-305):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsHideOwnSpells = true
else
currColOpt.methodsHideOwnSpells = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkAlphaNotInRange = ELib:Check(self.optColSet.col6scroll,L.cd2MethodsAlphaNotInRange):Point(10,-330):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsAlphaNotInRange = true
else
currColOpt.methodsAlphaNotInRange = nil
end
module:ReloadAllSplits()
end)
self.optColSet.sliderAlphaNotInRange = ELib:Slider(self.optColSet.col6scroll,""):Size(140):Point("TOPLEFT",self.optColSet.chkAlphaNotInRange,270,-3):Range(0,100):OnChange(function(self,event)
event = event - event%1
currColOpt.methodsAlphaNotInRangeNum = event
module:ReloadAllSplits()
self.tooltipText = event
self:tooltipReload(self)
end)
self.optColSet.chkDisableActive = ELib:Check(self.optColSet.col6scroll,L.cd2ColSetDisableActive):Point(10,-355):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsDisableActive = true
else
currColOpt.methodsDisableActive = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkOneSpellPerCol = ELib:Check(self.optColSet.col6scroll,L.cd2ColSetOneSpellPerCol):Point(10,-380):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsOneSpellPerCol = true
else
currColOpt.methodsOneSpellPerCol = nil
end
module:ReloadAllSplits()
end):Tooltip(L.cd2ColSetOneSpellPerColTooltip)
self.optColSet.chkSortByAvailability = ELib:Check(self.optColSet.col6scroll,L.cd2SortByAvailability):Point(10,-405):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsSortByAvailability = true
else
currColOpt.methodsSortByAvailability = nil
end
module:ReloadAllSplits()
module.main:GROUP_ROSTER_UPDATE()
end)
self.optColSet.chkSortByAvailability_activeToTop = ELib:Check(self.optColSet.col6scroll,L.cd2SortByAvailabilityActiveToTop):Point("TOPLEFT",self.optColSet.chkSortByAvailability,0,-25):Tooltip(L.cd2SortByAvailabilityActiveToTopTooltip):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsSortActiveToTop = true
else
currColOpt.methodsSortActiveToTop = nil
end
module:ReloadAllSplits()
module.main:GROUP_ROSTER_UPDATE()
end)
self.optColSet.chkReverseSorting = ELib:Check(self.optColSet.col6scroll,L.cd2ReverseSorting):Point("TOPLEFT",self.optColSet.chkSortByAvailability_activeToTop,0,-25):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsReverseSorting = true
else
currColOpt.methodsReverseSorting = nil
end
module:ReloadAllSplits()
module.main:GROUP_ROSTER_UPDATE()
end)
self.optColSet.chkCDOnlyTimer = ELib:Check(self.optColSet.col6scroll,L.cd2CDOnlyTimer):Point("TOPLEFT",self.optColSet.chkReverseSorting,0,-25):Tooltip(L.cd2CDOnlyTimerTooltip):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsCDOnlyTime = true
else
currColOpt.methodsCDOnlyTime = nil
end
module:ReloadAllSplits()
module.main:GROUP_ROSTER_UPDATE()
end)
self.optColSet.chkTextIgnoreActive = ELib:Check(self.optColSet.col6scroll,L.cd2TextIgnoreActive):Point("TOPLEFT",self.optColSet.chkCDOnlyTimer,0,-25):Tooltip(L.cd2TextIgnoreActiveTooltip):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsTextIgnoreActive = true
else
currColOpt.methodsTextIgnoreActive = nil
end
module:ReloadAllSplits()
module.main:GROUP_ROSTER_UPDATE()
end)
self.optColSet.chkShowOnlyNotOnCD = ELib:Check(self.optColSet.col6scroll,L.cd2OtherSetOnlyNotOnCD):Point("TOPLEFT",self.optColSet.chkTextIgnoreActive,0,-25):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsOnlyNotOnCD = true
else
currColOpt.methodsOnlyNotOnCD = nil
end
module:ReloadAllSplits()
end)
self.optColSet.chkGeneralMethods = ELib:Check(self.optColSet.col6scroll,L.cd2ColSetGeneral):Point("TOPRIGHT",-10,-10):Left():OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsGeneral = true
else
currColOpt.methodsGeneral = nil
end
module:ReloadAllSplits()
self:doAlphas()
end)
function self.optColSet.chkGeneralMethods:doAlphas()
ExRT.lib.SetAlphas(VMRT.ExCD2.colSet[module.options.optColTabs.selected].methodsGeneral and module.options.optColTabs.selected ~= (module.db.maxColumns + 1) and 0.5 or 1,module.options.optColSet.chkShowOnlyOnCD,module.options.optColSet.chkBotToTop,module.options.optColSet.chkRightToLeft,module.options.optColSet.dropDownStyleAnimation,module.options.optColSet.dropDownTimeLineAnimation,module.options.optColSet.chkIconTooltip,module.options.optColSet.chkLineClick,module.options.optColSet.chkNewSpellNewLine,module.options.optColSet.dropDownSortingRules,module.options.optColSet.textSortingRules,module.options.optColSet.textStyleAnimation,module.options.optColSet.textTimeLineAnimation,module.options.optColSet.chkHideOwnSpells,module.options.optColSet.chkAlphaNotInRange,module.options.optColSet.sliderAlphaNotInRange,module.options.optColSet.chkDisableActive,module.options.optColSet.chkOneSpellPerCol,module.options.optColSet.chkLineClickWhisper,module.options.optColSet.chkSortByAvailability, module.options.optColSet.chkSortByAvailability_activeToTop, module.options.optColSet.chkReverseSorting, module.options.optColSet.chkCDOnlyTimer, module.options.optColSet.chkTextIgnoreActive, module.options.optColSet.chkShowOnlyNotOnCD, module.options.optColSet.dropDownLineClickMod, module.options.optColSet.textLineClickMod)
end
--> Visibility
self.optColSet.chkOnlyInCombat = ELib:Check(self.optColSet.superTabFrame.tab[7],L.TimerOnlyInCombat):Point(10,-30):OnClick(function(self)
if self:GetChecked() then
currColOpt.methodsOnlyInCombat = true
else
currColOpt.methodsOnlyInCombat = nil
end
module:ReloadAllSplits()
end)
self.optColSet.visibilityTextPartyType = ELib:Text(self.optColSet.superTabFrame.tab[7],L.cd2OtherVisibilityPartyType..":",10):Point(10,-60):Color()
self.optColSet.chkVisibilityPartyTypeAlways = ELib:Radio(self.optColSet.superTabFrame.tab[7],ALWAYS):Point(10,-75):OnClick(function(self)
module.options.optColSet.chkVisibilityPartyTypeAlways:SetChecked(true)
module.options.optColSet.chkVisibilityPartyTypeParty:SetChecked(false)
module.options.optColSet.chkVisibilityPartyTypeRaid:SetChecked(false)
currColOpt.visibilityPartyType = nil
module:ReloadAllSplits()
end)
self.optColSet.chkVisibilityPartyTypeParty = ELib:Radio(self.optColSet.superTabFrame.tab[7],AGGRO_WARNING_IN_PARTY.." / "..SOLO):Point(10,-95):OnClick(function(self)
module.options.optColSet.chkVisibilityPartyTypeAlways:SetChecked(false)
module.options.optColSet.chkVisibilityPartyTypeParty:SetChecked(true)
module.options.optColSet.chkVisibilityPartyTypeRaid:SetChecked(false)
currColOpt.visibilityPartyType = 1
module:ReloadAllSplits()
end)
self.optColSet.chkVisibilityPartyTypeRaid = ELib:Radio(self.optColSet.superTabFrame.tab[7],L.cd2OtherVisibilityPartyTypeRaid):Point(10,-115):OnClick(function(self)
module.options.optColSet.chkVisibilityPartyTypeAlways:SetChecked(false)
module.options.optColSet.chkVisibilityPartyTypeParty:SetChecked(false)
module.options.optColSet.chkVisibilityPartyTypeRaid:SetChecked(true)
currColOpt.visibilityPartyType = 2
module:ReloadAllSplits()
end)
self.optColSet.visibilityTextZoneType = ELib:Text(self.optColSet.superTabFrame.tab[7],L.cd2OtherVisibilityZoneType..":",10):Point(10,-140):Color()
self.optColSet.chkVisibilityZoneArena = ELib:Check(self.optColSet.superTabFrame.tab[7],ARENA):Point(10,-155):OnClick(function(self)
if self:GetChecked() then
currColOpt.visibilityDisableArena = nil
else
currColOpt.visibilityDisableArena = true
end
module:ReloadAllSplits()
end)
self.optColSet.chkVisibilityZoneBG = ELib:Check(self.optColSet.superTabFrame.tab[7],BATTLEGROUND):Point(10,-180):OnClick(function(self)
if self:GetChecked() then
currColOpt.visibilityDisableBG = nil
else
currColOpt.visibilityDisableBG = true
end
module:ReloadAllSplits()
end)
self.optColSet.chkVisibilityZoneScenario = ELib:Check(self.optColSet.superTabFrame.tab[7],TRACKER_HEADER_SCENARIO):Point(10,-205):OnClick(function(self)
if self:GetChecked() then
currColOpt.visibilityDisable3ppl = nil
else
currColOpt.visibilityDisable3ppl = true
end
module:ReloadAllSplits()
end)
self.optColSet.chkVisibilityZone5ppl = ELib:Check(self.optColSet.superTabFrame.tab[7],CALENDAR_TYPE_DUNGEON):Point(10,-230):OnClick(function(self)
if self:GetChecked() then
currColOpt.visibilityDisable5ppl = nil
else
currColOpt.visibilityDisable5ppl = true
end
module:ReloadAllSplits()
end)
self.optColSet.chkVisibilityZoneRaid = ELib:Check(self.optColSet.superTabFrame.tab[7],RAID):Point(10,-255):OnClick(function(self)
if self:GetChecked() then
currColOpt.visibilityDisableRaid = nil
else
currColOpt.visibilityDisableRaid = true
end
module:ReloadAllSplits()
end)
self.optColSet.chkVisibilityZoneOutdoor = ELib:Check(self.optColSet.superTabFrame.tab[7],WORLD):Point(10,-280):OnClick(function(self)
if self:GetChecked() then
currColOpt.visibilityDisableWorld = nil
else
currColOpt.visibilityDisableWorld = true
end
module:ReloadAllSplits()
end)
self.optColSet.chkGeneralVisibility = ELib:Check(self.optColSet.superTabFrame.tab[7],L.cd2ColSetGeneral):Point("TOPRIGHT",-10,-10):Left():OnClick(function(self)
if self:GetChecked() then
currColOpt.visibilityGeneral = true
else
currColOpt.visibilityGeneral = nil
end
module:ReloadAllSplits()
self:doAlphas()
end)
function self.optColSet.chkGeneralVisibility:doAlphas()
ExRT.lib.SetAlphas(VMRT.ExCD2.colSet[module.options.optColTabs.selected].visibilityGeneral and module.options.optColTabs.selected ~= (module.db.maxColumns + 1) and 0.5 or 1,module.options.optColSet.chkOnlyInCombat,module.options.optColSet.visibilityTextPartyType,module.options.optColSet.chkVisibilityPartyTypeAlways,module.options.optColSet.chkVisibilityPartyTypeParty,module.options.optColSet.chkVisibilityPartyTypeRaid,module.options.optColSet.visibilityTextZoneType,module.options.optColSet.chkVisibilityZoneArena,module.options.optColSet.chkVisibilityZoneBG,module.options.optColSet.chkVisibilityZoneScenario,module.options.optColSet.chkVisibilityZone5ppl,module.options.optColSet.chkVisibilityZoneRaid,module.options.optColSet.chkVisibilityZoneOutdoor)
end
--> Black List
self.optColSet.blacklistText = ELib:Text(self.optColSet.superTabFrame.tab[8],L.cd2ColSetBlacklistTooltip,11):Size(430,200):Point(10,-30):Top():Color()
self.optColSet.blacklistEditBox = ELib:MultiEdit(self.optColSet.superTabFrame.tab[8]):Size(430,140):Point("TOP",0,-85)
do
local scheluded = nil
local function ScheludeFunc(self)
scheluded = nil
module:ReloadAllSplits()
end
function self.optColSet.blacklistEditBox:OnTextChanged(isUser)
if not isUser then
return
end
currColOpt.blacklistText = strtrim( self:GetText() )
if not scheluded then
scheluded = ExRT.F.ScheduleTimer(ScheludeFunc, 1)
end
end
end
self.optColSet.whitelistText = ELib:Text(self.optColSet.superTabFrame.tab[8],L.cd2ColSetWhitelistTooltip,11):Size(430,200):Point(10,-235):Top():Color()
self.optColSet.whitelistEditBox = ELib:MultiEdit(self.optColSet.superTabFrame.tab[8]):Size(430,140):Point("TOP",0,-290)
do
local scheluded = nil
local function ScheludeFunc(self)
scheluded = nil
module:ReloadAllSplits()
end
function self.optColSet.whitelistEditBox:OnTextChanged(isUser)
if not isUser then
return
end
currColOpt.whitelistText = strtrim( self:GetText() )
if not scheluded then
scheluded = ExRT.F.ScheduleTimer(ScheludeFunc, 1)
end
end
end
self.optColSet.chkGeneralBlackList = ELib:Check(self.optColSet.superTabFrame.tab[8],L.cd2ColSetGeneral):Point("TOPRIGHT",-10,-10):Left():OnClick(function(self)
if self:GetChecked() then
currColOpt.blacklistGeneral = true
else
currColOpt.blacklistGeneral = nil
end
module:ReloadAllSplits()
self:doAlphas()
end)
function self.optColSet.chkGeneralBlackList:doAlphas()
ExRT.lib.SetAlphas(VMRT.ExCD2.colSet[module.options.optColTabs.selected].blacklistGeneral and module.options.optColTabs.selected ~= (module.db.maxColumns + 1) and 0.5 or 1,module.options.optColSet.blacklistEditBox,module.options.optColSet.whitelistEditBox,module.options.optColSet.whitelistText,module.options.optColSet.blacklistText)
end
--> Templates Tab
self.optColSet.templates = {}
self.optColSet.templateData = {
spells = {31821,62618,97462,20484,98008},
spellsCD = {90,0,0,20,0},
spellsDuration = {0,10,0,0,0},
spellsDead = {nil,nil,true,nil,nil},
spellsCharge = {nil,nil,nil,true,nil},
spellsClass = {"PALADIN","PRIEST","WARRIOR","DRUID","SHAMAN"},
[1] = {
iconSize = 16,
textureAnimation = true,
methodsStyleAnimation = 1,
methodsTimeLineAnimation = 1,
iconPosition = 1,
iconGray = true,
fontSize = 12,
fontName = ExRT.F.defFont,
fontOutline = true,
fontShadow = false,
textureFile = ExRT.F.barImg,
colorsText = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsBack = {0,1,0, 0,1,0, 1,0,0, 1,1,0},
colorsTL = {0,1,0, 0,1,0, 1,0,0, 1,1,0},
textureAlphaBackground = 0.3,
textureAlphaTimeLine = 0.8,
textureAlphaCooldown = 1,
textureClassBackground = false,
textureClassTimeLine = false,
textureClassText = false,
textTemplateLeft = "%name%",
textTemplateRight = "%time%",
textTemplateCenter = "",
textureAnimation = true,
_heightType = 1,
},
[2] = {
iconSize = 14,
textureAnimation = false,
methodsStyleAnimation = 1,
methodsTimeLineAnimation = 1,
iconPosition = 1,
iconGray = false,
fontSize = 12,
fontName = ExRT.F.defFont,
fontOutline = true,
fontShadow = false,
textureFile = ExRT.F.barImg,
colorsText = {1,1,1, 0.5,1,0.5, 1,0.5,0.5, 1,1,0.5,},
colorsBack = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsTL = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
textureAlphaBackground = 0.3,
textureAlphaTimeLine = 0.8,
textureAlphaCooldown = 1,
textureClassBackground = false,
textureClassTimeLine = false,
textureClassText = false,
textTemplateLeft = "%time% %name%",
textTemplateRight = "",
textTemplateCenter = "",
_heightType = 1,
},
[3] = {
iconSize = 24,
frameWidth = 24,
textureAnimation = false,
methodsStyleAnimation = 1,
methodsTimeLineAnimation = 1,
iconPosition = 1,
iconGray = true,
fontSize = 10,
fontName = ExRT.F.defFont,
fontOutline = true,
fontShadow = false,
textureFile = ExRT.F.barImg,
colorsText = {1,1,1, 0.5,1,0.5, 1,0.5,0.5, 1,1,0.5,},
colorsBack = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsTL = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
textureAlphaBackground = 0,
textureAlphaTimeLine = 0,
textureAlphaCooldown = 0.7,
textureClassBackground = false,
textureClassTimeLine = false,
textureClassText = false,
textTemplateLeft = "",
textTemplateRight = "",
textTemplateCenter = "",
textIconName = false,
methodsCooldown = true,
iconCooldownShowSwipe = true,
ATFLines = 2,
ATFCol = 6,
ATFGrowth = 2,
ATF = true,
fontCDSize = 10,
iconGlowType = 3,
func = function(parent,templateFrame)
local f1 = ELib:Frame(parent):Point("BOTTOMRIGHT",parent,"RIGHT",-20,0):Size(80,48)
ELib:Texture(f1,.8,.8,.8,.8,"BACKGROUND"):Point('x')
ELib:Text(f1,UnitName"player",12):Point("CENTER",0,0):Color(0,0.44,0.866):Outline()
local i1=templateFrame.lines[1] i1:ClearAllPoints() i1:SetPoint("BOTTOMRIGHT",f1,"BOTTOMLEFT",0,0)
local i2=templateFrame.lines[2] i2:ClearAllPoints() i2:SetPoint("RIGHT",i1,"LEFT",0,0)
local i3=templateFrame.lines[3] i3:ClearAllPoints() i3:SetPoint("BOTTOM",i1,"TOP",0,0)
local f2 = ELib:Frame(parent):Point("TOPRIGHT",parent,"RIGHT",-20,-1):Size(80,48)
ELib:Texture(f2,.8,.8,.8,.8,"BACKGROUND"):Point("TOPLEFT",f2,0,0):Point("BOTTOMRIGHT",f2,-54,0)
ELib:Texture(f2,.2,.2,.2,.8,"BACKGROUND"):Point("TOPLEFT",f2,"TOPRIGHT",-54,0):Point("BOTTOMRIGHT",f2,0,0)
ELib:Text(f2,UnitName"player",12):Point("CENTER",0,0):Color(0.77,0.12,0.23):Outline()
local i1=templateFrame.lines[4] i1:ClearAllPoints() i1:SetPoint("BOTTOMRIGHT",f2,"BOTTOMLEFT",0,0)
local i2=templateFrame.lines[5] i2:ClearAllPoints() i2:SetPoint("RIGHT",i1,"LEFT",0,0)
local i3=templateFrame.lines[6] i3:ClearAllPoints() i3:SetPoint("RIGHT",i2,"LEFT",0,0)
local i4=templateFrame.lines[7] i4:ClearAllPoints() i4:SetPoint("BOTTOM",i1,"TOP",0,0)
local i5=templateFrame.lines[8] i5:ClearAllPoints() i5:SetPoint("RIGHT",i4,"LEFT",0,0)
end,
disableOnGeneral = true,
DiffSpellData = {
spells = {98008, 108280, 8143, 49576, 61999, 51052, 48707, 48792 },
spellsCD = {0, 90, 0, 10, 0, 0, 20, 25 },
spellsDuration ={0, 0, 10, 0, 0, 0, 5, 8 },
spellsDead = {nil, nil, nil, nil, true, nil, nil, nil },
spellsCharge = {nil, nil, nil, true, nil, nil, nil, true },
spellsClass = {"SHAMAN","SHAMAN","SHAMAN","DEATHKNIGHT","DEATHKNIGHT","DEATHKNIGHT","DEATHKNIGHT","DEATHKNIGHT"},
},
},
[4] = {
iconSize = 16,
textureAnimation = true,
methodsStyleAnimation = 2,
methodsTimeLineAnimation = 2,
iconPosition = 1,
iconGray = false,
fontSize = 12,
fontName = ExRT.F.defFont,
fontOutline = false,
fontShadow = true,
textureFile = "Interface\\AddOns\\"..GlobalAddonName.."\\media\\bar19.tga",
colorsText = {1,1,1, 0.5,1,0.5, 1,1,1, 1,1,0.5},
colorsBack = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsTL = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
textureAlphaBackground = 0.15,
textureAlphaTimeLine = 1,
textureAlphaCooldown = 0.85,
textureClassBackground = true,
textureClassTimeLine = true,
textureClassText = false,
textTemplateLeft = "%name%",
textTemplateRight = "%time%",
textTemplateCenter = "",
frameBetweenLines = 1,
_heightType = 1,
},
[5] = {
iconSize = 40,
textureAnimation = false,
methodsStyleAnimation = 1,
methodsTimeLineAnimation = 1,
iconPosition = 1,
iconGray = true,
fontSize = 10,
fontName = ExRT.F.defFont,
fontOutline = true,
fontShadow = false,
textureFile = ExRT.F.barImg,
colorsText = {1,1,1, 0.5,1,0.5, 1,0.5,0.5, 1,1,0.5,},
colorsBack = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsTL = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
textureAlphaBackground = 0,
textureAlphaTimeLine = 0,
textureAlphaCooldown = 0.7,
textureClassBackground = false,
textureClassTimeLine = false,
textureClassText = false,
textTemplateLeft = "",
textTemplateRight = "",
textTemplateCenter = "",
textIconName = true,
methodsCooldown = true,
textIconNameChars = 6,
frameWidth = 40,
frameColumns = 4,
_heightType = 1,
},
[6] = {
iconSize = 12,
textureAnimation = false,
methodsStyleAnimation = 1,
methodsTimeLineAnimation = 1,
iconPosition = 1,
iconGray = false,
fontSize = 12,
fontName = ExRT.F.defFont,
fontOutline = false,
fontShadow = false,
textureFile = ExRT.F.barImg,
colorsText = {1,1,1, 0.5,1,0.5, 1,0.5,0.5, 1,1,0.5,},
colorsBack = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsTL = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
textureAlphaBackground = 0,
textureAlphaTimeLine = 0,
textureAlphaCooldown = 1,
textureClassBackground = false,
textureClassTimeLine = false,
textureClassText = false,
textTemplateLeft = "%time% %name%",
textTemplateRight = "",
textTemplateCenter = "",
_heightType = 1,
},
[7] = {
iconSize = 14,
textureAnimation = true,
methodsStyleAnimation = 1,
methodsTimeLineAnimation = 1,
iconPosition = 1,
iconGray = false,
fontSize = 12,
fontName = ExRT.F.defFont,
fontOutline = false,
fontShadow = true,
textureFile = "Interface\\AddOns\\"..GlobalAddonName.."\\media\\bar29.tga",
colorsText = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsBack = {0,1,0, 0,1,0, 0.8,0,0, 1,1,0},
colorsTL = {0,1,0, 0,1,0, 0.8,0,0, 1,1,0},
textureAlphaBackground = 0.3,
textureAlphaTimeLine = 0.8,
textureAlphaCooldown = 0.5,
textureClassBackground = false,
textureClassTimeLine = false,
textureClassText = false,
textTemplateLeft = "%name%",
textTemplateRight = "%stime%",
textTemplateCenter = "",
_heightType = 1,
},
[8] = {
iconSize = 16,
textureAnimation = true,
methodsStyleAnimation = 2,
methodsTimeLineAnimation = 2,
iconPosition = 2,
iconGray = true,
fontSize = 13,
fontName = ExRT.F.defFont,
fontOutline = true,
fontShadow = true,
textureFile = "Interface\\AddOns\\"..GlobalAddonName.."\\media\\bar6.tga",
colorsText = {1,1,1, 0.5,1,0.5, 1,0.5,0.5, 1,1,0.5,},
colorsBack = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsTL = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
textureAlphaBackground = 0.3,
textureAlphaTimeLine = 0.8,
textureAlphaCooldown = 0.5,
textureClassBackground = false,
textureClassTimeLine = false,
textureClassText = true,
textTemplateLeft = "%name%",
textTemplateRight = "",
textTemplateCenter = "",
_heightType = 1,
},
[9] = {
iconSize = 18,
textureAnimation = true,
methodsStyleAnimation = 1,
methodsTimeLineAnimation = 2,
iconPosition = 1,
iconGray = false,
fontSize = 12,
fontName = ExRT.F.defFont,
fontOutline = false,
fontShadow = true,
textureFile = "Interface\\AddOns\\"..GlobalAddonName.."\\media\\bar16.tga",
colorsText = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsBack = {0,0,0, 0,0,0, 0,0,0, 0,0,0},
colorsTL = {0.24,0.44,1, 1,0.37,1, 0.24,0.44,1, 1,0.46,0.10},
textureAlphaBackground = 0.3,
textureAlphaTimeLine = 0.9,
textureAlphaCooldown = 1,
textureClassBackground = false,
textureClassTimeLine = false,
textureClassText = false,
textTemplateLeft = "%name%",
textTemplateRight = "%stime%",
textTemplateCenter = "",
textureBorderSize = 1,
frameBetweenLines = 3,
textureBorderColorA = 1,
_heightType = 1,
},
[10] = {
iconSize = 18,
textureAnimation = true,
methodsStyleAnimation = 1,
methodsTimeLineAnimation = 2,
iconPosition = 1,
iconGray = false,
fontSize = 12,
fontName = ExRT.F.defFont,
fontOutline = false,
fontShadow = true,
textureFile = "Interface\\AddOns\\"..GlobalAddonName.."\\media\\bar16.tga",
colorsText = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsBack = {0,0,0, 0,0,0, 0,0,0, 0,0,0},
colorsTL = {0.24,0.44,1, 1,0.37,1, 0.24,0.44,1, 1,0.46,0.10},
textureAlphaBackground = 0.3,
textureAlphaTimeLine = 0.9,
textureAlphaCooldown = 1,
textureClassBackground = false,
textureClassTimeLine = true,
textureClassText = false,
textTemplateLeft = "%name%",
textTemplateRight = "%stime%",
textTemplateCenter = "",
textureBorderSize = 1,
frameBetweenLines = 3,
textureBorderColorA = 1,
_heightType = 1,
},
[11] = {
_twoSized = true,
_Scaled = .8,
iconSize = 40,
textureAnimation = true,
methodsStyleAnimation = 1,
methodsTimeLineAnimation = 2,
iconPosition = 1,
iconGray = true,
fontSize = 14,
fontName = ExRT.F.defFont,
fontOutline = true,
fontShadow = false,
textureFile = "Interface\\AddOns\\"..GlobalAddonName.."\\media\\bar17.tga",
colorsText = {1,1,1, 1,1,1, 1,.6,.6, 1,1,.5},
colorsBack = {0,0,0, 0,0,0, 0,0,0, 0,0,0},
colorsTL = {0,0,0, 0,0,0, 0,0,0, 0,0,0},
textureAlphaBackground = 0.8,
textureAlphaTimeLine = 1,
textureAlphaCooldown = .5,
textureClassBackground = false,
textureClassTimeLine = true,
textureClassText = false,
textTemplateLeft = "%name%",
textTemplateRight = "",
textTemplateCenter = "",
methodsCooldown = true,
methodsNewSpellNewLine = true,
frameColumns = 5,
iconHideBlizzardEdges = true,
frameLines = 60,
DiffSpellData = {
spells = {31821, 31821, 0, 0, 0, 97462, 0, 0, 0, 0, 20484, 20484},
spellsCD = {90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0},
spellsDuration = {0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
spellsDead = {nil, nil, nil, nil, nil, true, nil, nil, nil, nil, nil, nil},
spellsCharge = {nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, true, nil},
spellsClass = {"PALADIN","PALADIN",nil,nil,nil, "WARRIOR",nil,nil,nil,nil, "DRUID","DRUID"},
},
},
[12] = {},
[13] = {
iconSize = 13,
textureAnimation = true,
methodsStyleAnimation = 2,
methodsTimeLineAnimation = 2,
iconPosition = 2,
iconGray = false,
fontSize = 12,
fontName = ExRT.F.defFont,
fontOutline = false,
fontShadow = true,
textureFile = "Interface\\AddOns\\"..GlobalAddonName.."\\media\\bar19.tga",
colorsText = {1,1,1, 0.5,1,0.5, 1,1,1, 1,1,0.5},
colorsBack = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsTL = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
textureAlphaBackground = 0.15,
textureAlphaTimeLine = 1,
textureAlphaCooldown = 0.85,
textureClassBackground = true,
textureClassTimeLine = true,
textureClassText = false,
textTemplateLeft = "%name%",
textTemplateRight = "%time%",
textTemplateCenter = "",
iconTitles = true,
frameBetweenLines = 0,
DiffSpellData = {
spells = {31821, 31821, 31821, 97462, 97462, 51052, 51052, 51052, },
spellsCD = {0, 90, 0, 0, 0, 0, 0, 20, },
spellsDuration ={0, 0, 10, 0, 0, 0, 0, 0, },
spellsDead = {nil, nil, nil, nil, true, nil, nil, nil, },
spellsCharge = {nil, nil, nil, nil, nil, nil, nil, true, },
spellsClass = {"title","PALADIN","PALADIN","title","WARRIOR","title","DEATHKNIGHT","DEATHKNIGHT"},
},
_heightType = 1,
},
[14] = {
iconSize = 14,
textureAnimation = true,
methodsStyleAnimation = 2,
methodsTimeLineAnimation = 2,
iconPosition = 1,
iconGray = false,
fontSize = 12,
fontName = ExRT.F.defFont,
fontOutline = false,
fontShadow = true,
textureFile = "Interface\\AddOns\\"..GlobalAddonName.."\\media\\bar19.tga",
colorsText = {1,1,1, 0.5,1,0.5, 1,1,1, 1,1,0.5},
colorsBack = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsTL = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
textureAlphaBackground = 0.15,
textureAlphaTimeLine = 1,
textureAlphaCooldown = 0.85,
textureClassBackground = true,
textureClassTimeLine = true,
textureClassText = false,
textTemplateLeft = "%name%",
textTemplateRight = "%time%",
textTemplateCenter = "",
frameBetweenLines = 0,
_heightType = 1,
},
[15] = {
_twoSized = true,
_Scaled = .85,
iconSize = 13,
textureAnimation = true,
methodsStyleAnimation = 2,
methodsTimeLineAnimation = 2,
iconPosition = 1,
iconGray = false,
fontSize = 12,
fontName = ExRT.F.defFont,
fontOutline = false,
fontShadow = true,
textureFile = "Interface\\AddOns\\"..GlobalAddonName.."\\media\\bar19.tga",
colorsText = {1,1,1, 0.5,1,0.5, 1,1,1, 1,1,0.5},
colorsBack = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsTL = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
textureAlphaBackground = 0.15,
textureAlphaTimeLine = 1,
textureAlphaCooldown = 0.85,
textureClassBackground = true,
textureClassTimeLine = true,
textureClassText = false,
textTemplateLeft = "%name%",
textTemplateRight = "%time%",
textTemplateCenter = "",
iconTitles = true,
methodsNewSpellNewLine = true,
frameColumns = 5,
frameLines = 60,
frameBetweenLines = 0,
DiffSpellData = {
spells = {31821, 31821, 31821, 0, 0, 97462, 97462, 0, 0, 0, 740, 740, 740, 0, 0, 51052, 51052, 51052, 0, 0, 64843, 64843, 64843,},
spellsCD = {0, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 0, 0, 70,},
spellsDuration ={0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
spellsDead = {nil, nil, nil, nil, nil, nil, true, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil,},
spellsCharge = {nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, true, nil, nil, nil, nil, nil,},
spellsClass = {"title","PALADIN","PALADIN",nil,nil,"title","WARRIOR",nil,nil,nil,"title","DRUID","DRUID",nil,nil,"title","DEATHKNIGHT","DEATHKNIGHT",nil,nil,"title","PRIEST","PRIEST"},
},
_heightType = 1,
},
[16] = {},
[17] = {
iconSize = 14,
textureAnimation = true,
methodsStyleAnimation = 1,
methodsTimeLineAnimation = 2,
iconPosition = 1,
iconGray = false,
fontSize = 10,
fontName = ExRT.F.defFont,
fontOutline = false,
fontShadow = true,
textureFile = "Interface\\AddOns\\"..GlobalAddonName.."\\media\\bar26.tga",
colorsText = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsBack = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
colorsTL = {1,1,1, 1,1,1, 1,1,1, 1,1,1},
textureAlphaBackground = 0.15,
textureAlphaTimeLine = 0.8,
textureAlphaCooldown = 1,
textureClassBackground = false,
textureClassTimeLine = true,
textureClassText = false,
textTemplateLeft = "",
textTemplateRight = "%time%",
textTemplateCenter = "%name%: %spell%",
_heightType = 1,
},
def = {
enabled = true,
iconGlowType = 4,
textureSmoothAnimation = true,
},
toOptions = {
iconSize = true,
textureAnimation = true,
methodsStyleAnimation = true,
methodsTimeLineAnimation = true,
iconPosition = true,
iconGray = true,
fontSize = true,
fontName = true,
fontOutline = true,
fontShadow = true,
textureFile = true,
textureAlphaBackground = true,
textureAlphaTimeLine = true,
textureAlphaCooldown = true,
textureClassBackground = true,
textureClassTimeLine = true,
textureClassText = true,
textTemplateLeft = true,
textTemplateRight = true,
textTemplateCenter = true,
methodsCooldown = true,
textIconName = true,
fontOtherAvailable = true,
frameBetweenLines = true,
textureBorderSize = true,
textureBorderColorR = true,
textureBorderColorG = true,
textureBorderColorB = true,
textureBorderColorA = true,
methodsNewSpellNewLine = true,
methodsSortingRules = true,
iconTitles = true,
iconHideBlizzardEdges = true,
iconCooldownShowSwipe = true,
textIconNameChars = true,
iconGeneral = true,
textureGeneral = true,
methodsGeneral = true,
fontGeneral = true,
textGeneral = true,
frameGeneral = true,
frameColumns = true,
textureSmoothAnimation = true,
textureSmoothAnimationDuration = true,
iconCooldownHideNumbers = true,
textureHideSpark = true,
iconGlowType = true,
methodsDisableActive = true,
methodsOneSpellPerCol = true,
fontCDSize = true,
ATF = true,
ATFLines = true,
ATFCol = true,
ATFGrowth = true,
_frameAlpha = "frameAlpha",
_frameWidth = "frameWidth",
_frameBlackBack = "frameBlackBack",
_frameLines = "frameLines",
},
}
self.optColSet.templateSaveData = nil
for i=1,#self.optColSet.templateData do
local t = self.optColSet.templateData[i]
if t.colorsText then for j=1,3 do for k=1,3 do
local key = "textureColorText"..(j == 1 and "Default" or j==2 and "Active" or "Cooldown")..(k==1 and "R" or k==2 and "G" or "B")
t[key] = t.colorsText[(j-1)*3+k]
self.optColSet.templateData.toOptions[key] = true
end end end
if t.colorsBack then for j=1,3 do for k=1,3 do
local key = "textureColorBackground"..(j == 1 and "Default" or j==2 and "Active" or "Cooldown")..(k==1 and "R" or k==2 and "G" or "B")
t[key] = t.colorsBack[(j-1)*3+k]
self.optColSet.templateData.toOptions[key] = true
end end end
if t.colorsTL then for j=1,3 do for k=1,3 do
local key = "textureColorTimeLine"..(j == 1 and "Default" or j==2 and "Active" or "Cooldown")..(k==1 and "R" or k==2 and "G" or "B")
t[key] = t.colorsTL[(j-1)*3+k]
self.optColSet.templateData.toOptions[key] = true
end end end
t.colorsText, t.colorsBack, t.colorsTL = nil
end
local function TemplateButtonOnEnter(self)
if self.templateData.disableOnGeneral and module.options.optColTabs.selected == (module.db.maxColumns + 1) then
self.backgTexture:SetColorTexture(1,0,0,0.3)
GameTooltip:SetOwner(self, "ANCHOR_LEFT")
GameTooltip:AddLine(L.cd2ATFTooltipDisabled)
GameTooltip:Show()
else
self.backgTexture:SetColorTexture(1,1,1,0.3)
end
end
local function TemplateButtonOnLeave(self)
self.backgTexture:SetColorTexture(0,0,0,0)
GameTooltip_Hide()
end
local function TemplateButtonOnClick(self)
local templateData = self.templateData
if templateData.disableOnGeneral and module.options.optColTabs.selected == (module.db.maxColumns + 1) then
return
end
module.options.optColSet.templateRestore:Show()
module.options.optColSet.templateSaveData = {}
ExRT.F.table_copy(currColOpt,module.options.optColSet.templateSaveData)
for key,val in pairs(module.options.optColSet.templateData.toOptions) do
if type(val) == "boolean" then
val = key
end
if key:sub(1,1)=="_" then
key = key:sub(2)
if templateData[key] then
currColOpt[val] = templateData[key]
elseif key == "frameWidth" then
currColOpt[val] = max(130,currColOpt[val] or 130)
end
elseif val:find("General") then
currColOpt[val] = nil
else
currColOpt[val] = templateData[key]
end
end
module:ReloadAllSplits()
module.options.selectColumnTab()
end
local TemplateMT = {__index = self.optColSet.templateData.def}
self.optColSet.templatesScrollFrame = ELib:ScrollFrame(self.optColSet.superTabFrame.tab[9]):Size(430,380):Point("TOP",0,-50):Height( ceil(#self.optColSet.templateData/2) * 125 + 10 )
for i=1,#self.optColSet.templateData do
local templateData = self.optColSet.templateData[i]
if ExRT.F.table_len(templateData) > 0 then
local buttonFrame = CreateFrame("Button",nil,self.optColSet.templatesScrollFrame.C)
if templateData._twoSized then
buttonFrame:SetSize(370,120)
else
buttonFrame:SetSize(185,120)
end
buttonFrame:SetPoint(templateData._twoSized and "TOP" or (i-1)%2 == 0 and "TOPRIGHT" or "TOPLEFT",self.optColSet.templatesScrollFrame.C,"TOP",0,-floor((i-1)/2) * 125 - 5)
buttonFrame.backgTexture = buttonFrame:CreateTexture(nil, "BACKGROUND")
buttonFrame.backgTexture:SetAllPoints()
buttonFrame.templateData = templateData
buttonFrame:SetScript("OnEnter",TemplateButtonOnEnter)
buttonFrame:SetScript("OnLeave",TemplateButtonOnLeave)
buttonFrame:SetScript("OnClick",TemplateButtonOnClick)
local templateFrame = module:CreateColumn(buttonFrame)
self.optColSet.templates[i] = templateFrame
setmetatable(templateData,TemplateMT)
module:ColApplyStyle(templateFrame,templateData,{},module.db.colsDefaults)
templateFrame:ClearAllPoints()
templateFrame:Show()
templateFrame:SetPoint("CENTER")
if templateData._heightType == 1 then
local l = #(templateData.DiffSpellData and templateData.DiffSpellData.spells or self.optColSet.templateData.spells)
l = ceil(l / (templateData.frameColumns or 1))
local height = templateData.iconSize * l + ((templateData.frameBetweenLines or 0) - 1) * l
templateFrame:SetSize(min(templateFrame:GetWidth(),templateData._twoSized and 370 or 185),min(height,120))
else
templateFrame:SetSize(min(templateFrame:GetWidth(),templateData._twoSized and 370 or 185),min(templateFrame:GetHeight(),120))
end
if templateData._Scaled then
templateFrame:SetScale(templateData._Scaled)
end
if templateData.func then
templateData.func(buttonFrame,templateFrame)
end
local spellData = templateData.DiffSpellData or self.optColSet.templateData
local classColorsTable = type(CUSTOM_CLASS_COLORS)=="table" and CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS
local lineC = 0
for j=1,#spellData.spells do
lineC = lineC + 1
local bar = templateFrame.lines[lineC]
local spellClass = spellData.spellsClass[j]
if spellData.spells[j] ~= 0 then
local spellID = spellData.spells[j]
local spellName,_,spellTexture = GetSpellInfo(spellID or 0)
spellName = spellName or "unk"
bar.data = {
name = ExRT.SDB.charName,
fullName = ExRT.SDB.charName,
icon = spellTexture,
spellName = i == 3 and spellName:sub(1,spellName:find(' ')) or spellName,
db = {spellID,spellClass},
lastUse = GetTime(),
charge = GetTime(),
cd = spellData.spellsCD[j],
duration = spellData.spellsDuration[j],
classColor = classColorsTable[spellClass] or module.db.notAClass,
disabled = spellData.spellsDead[j],
isCharge = spellData.spellsCharge[j],
specialUpdateData = function(data)
local currTime = GetTime()
if data.isCharge then
if (data.charge + data.cd) < currTime then
data.charge = currTime
data.lastUse = currTime
end
return
end
if data.cd ~= 0 then
if (data.lastUse + data.cd) < currTime then
data.lastUse = currTime
end
elseif data.duration ~= 0 then
if (data.lastUse + data.duration) < currTime then
data.lastUse = currTime
end
end
end,
}
end
bar:UpdateStyle()
bar:Update()
bar:UpdateStatus()
if spellClass == "title" then
bar:CreateTitle()
end
end
end
end
self.optColSet.templateRestore = CreateFrame("Button",nil,self.optColSet.superTabFrame.tab[9], BackdropTemplateMixin and "BackdropTemplate")
self.optColSet.templateRestore:SetPoint("TOP",0,-10)
self.optColSet.templateRestore:SetSize(430,30)
self.optColSet.templateRestore:SetBackdrop({edgeFile = ExRT.F.defBorder, edgeSize = 8})
self.optColSet.templateRestore:SetBackdropBorderColor(1,0.5,0.5,1)
self.optColSet.templateRestore.text = ELib:Text(self.optColSet.templateRestore,L.cd2OtherSetTemplateRestore,12):Point('x'):Center():Color():Shadow()
self.optColSet.templateRestore:SetScript("OnEnter",function (self)
self.text:SetTextColor(1,1,0,1)
end)
self.optColSet.templateRestore:SetScript("OnLeave",function (self)
self.text:SetTextColor(1,1,1,1)
end)
self.optColSet.templateRestore:SetScript("OnClick",function (self)
wipe(currColOpt)
ExRT.F.table_copy(module.options.optColSet.templateSaveData,currColOpt)
module:ReloadAllSplits()
module.options.selectColumnTab()
self:Hide()
end)
self.optColSet.templateRestore:Hide()
--> Attach to frame
self.optColSet.chkATF = ELib:Check(self.optColSet.superTabFrame.tab[10],L.Enable):Point(10,-10):OnClick(function(self)
if self:GetChecked() then
currColOpt.ATF = true
currColOpt.frameGeneral = false
currColOpt.textureGeneral = false
currColOpt.iconGeneral = false
currColOpt.methodsGeneral = false
currColOpt.textGeneral = false
currColOpt.fontGeneral = false
currColOpt.methodsCooldown = true
currColOpt.frameStrata = nil
else
currColOpt.ATF = nil
end
module:ReloadAllSplits()
end)
self.optColSet.sliderATFHeight = ELib:Slider(self.optColSet.superTabFrame.tab[10],L.cd2OtherSetIconSize):Size(400):Point("TOP",0,-50):Range(6,128):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.iconSize = event
module:ReloadAllSplits()
self.tooltipText = event
self:tooltipReload(self)
end)
self.optColSet.sliderATFFont = ELib:Slider(self.optColSet.superTabFrame.tab[10],L.cd2OtherSetFontSize):Size(400):Point("TOP",0,-85):Range(8,72):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.fontCDSize = event
module:ReloadAllSplits()
self.tooltipText = event
self:tooltipReload(self)
end)
self.optColSet.ATFframePreview = ELib:Frame(self.optColSet.superTabFrame.tab[10]):Point("TOPLEFT",140,-140):Size(80,45)
ELib:Texture(self.optColSet.ATFframePreview,.8,.8,.8,.8,"BACKGROUND"):Point('x')
ELib:Text(self.optColSet.superTabFrame.tab[10],L.cd2ATFPosition..":"):Point("RIGHT",self.optColSet.ATFframePreview,"LEFT",-30,0):Color()
function self.optColSet.ATFRadiosCheck()
for k,v in pairs(self.optColSet.ATFRadios) do
v:SetChecked(false)
end
local pos = VMRT.ExCD2.colSet[module.options.optColTabs.selected].ATFPos or 1
local k = pos == 1 and "LB" or
pos == 2 and "LT" or
pos == 3 and "TL" or
pos == 4 and "TR" or
pos == 5 and "RT" or
pos == 6 and "RB" or
pos == 7 and "BR" or
pos == 8 and "BL" or
"C"
self.optColSet.ATFRadios[k]:SetChecked(true)
end
self.optColSet.ATFRadios = {}
self.optColSet.ATFRadios.LB = ELib:Radio(self.optColSet.superTabFrame.tab[10]):Point("BOTTOMRIGHT",self.optColSet.ATFframePreview,"BOTTOMLEFT",-2,2):OnClick(function(self)
currColOpt.ATFPos = 1
module.options.optColSet.ATFRadiosCheck()
module:ReloadAllSplits()
end)
self.optColSet.ATFRadios.LT = ELib:Radio(self.optColSet.superTabFrame.tab[10]):Point("TOPRIGHT",self.optColSet.ATFframePreview,"TOPLEFT",-2,-2):OnClick(function(self)
currColOpt.ATFPos = 2
module.options.optColSet.ATFRadiosCheck()
module:ReloadAllSplits()
end)
self.optColSet.ATFRadios.TL = ELib:Radio(self.optColSet.superTabFrame.tab[10]):Point("BOTTOMLEFT",self.optColSet.ATFframePreview,"TOPLEFT",2,2):OnClick(function(self)
currColOpt.ATFPos = 3
module.options.optColSet.ATFRadiosCheck()
module:ReloadAllSplits()
end)
self.optColSet.ATFRadios.TR = ELib:Radio(self.optColSet.superTabFrame.tab[10]):Point("BOTTOMRIGHT",self.optColSet.ATFframePreview,"TOPRIGHT",-2,2):OnClick(function(self)
currColOpt.ATFPos = 4
module.options.optColSet.ATFRadiosCheck()
module:ReloadAllSplits()
end)
self.optColSet.ATFRadios.RT = ELib:Radio(self.optColSet.superTabFrame.tab[10]):Point("TOPLEFT",self.optColSet.ATFframePreview,"TOPRIGHT",2,-2):OnClick(function(self)
currColOpt.ATFPos = 5
module.options.optColSet.ATFRadiosCheck()
module:ReloadAllSplits()
end)
self.optColSet.ATFRadios.RB = ELib:Radio(self.optColSet.superTabFrame.tab[10]):Point("BOTTOMLEFT",self.optColSet.ATFframePreview,"BOTTOMRIGHT",2,2):OnClick(function(self)
currColOpt.ATFPos = 6
module.options.optColSet.ATFRadiosCheck()
module:ReloadAllSplits()
end)
self.optColSet.ATFRadios.BR = ELib:Radio(self.optColSet.superTabFrame.tab[10]):Point("TOPRIGHT",self.optColSet.ATFframePreview,"BOTTOMRIGHT",-2,-2):OnClick(function(self)
currColOpt.ATFPos = 7
module.options.optColSet.ATFRadiosCheck()
module:ReloadAllSplits()
end)
self.optColSet.ATFRadios.BL = ELib:Radio(self.optColSet.superTabFrame.tab[10]):Point("TOPLEFT",self.optColSet.ATFframePreview,"BOTTOMLEFT",2,-2):OnClick(function(self)
currColOpt.ATFPos = 8
module.options.optColSet.ATFRadiosCheck()
module:ReloadAllSplits()
end)
self.optColSet.ATFRadios.C = ELib:Radio(self.optColSet.superTabFrame.tab[10]):Point("CENTER",self.optColSet.ATFframePreview,"CENTER",0,0):OnClick(function(self)
currColOpt.ATFPos = 9
module.options.optColSet.ATFRadiosCheck()
module:ReloadAllSplits()
end)
ELib:Text(self.optColSet.superTabFrame.tab[10],L.cd2ATFGrowth..":"):Point("TOPLEFT",320,-115):Color()
self.optColSet.ATFTypeGrowth1 = ELib:Radio(self.optColSet.superTabFrame.tab[10]):Point("TOPLEFT",280,-140):OnClick(function(self)
currColOpt.ATFGrowth = 1
module.options.optColSet.ATFTypeGrowth2:SetChecked(false)
module:ReloadAllSplits()
end)
do
local p = self.optColSet.ATFTypeGrowth1
local x,y = 20, 5
for i=1,3 do
p["l"..i] = p:CreateLine(nil, "BACKGROUND", nil, -5)
p["l"..i]:SetTexture("Interface/AddOns/"..GlobalAddonName.."/media/line")
p["l"..i]:SetVertexColor(1,0,0,1)
p["l"..i]:SetThickness(8)
x, y = (i % 2) == 1 and 20 or 120, i < 3 and 10 or -10
p["l"..i]:SetStartPoint("CENTER",p, x, y)
x, y = (i % 2) == 1 and 120 or 20, i < 2 and 10 or -10
p["l"..i]:SetEndPoint("CENTER",p, x, y)
end
end
self.optColSet.ATFTypeGrowth2 = ELib:Radio(self.optColSet.superTabFrame.tab[10]):Point("TOPLEFT",280,-180):OnClick(function(self)
currColOpt.ATFGrowth = 2
module.options.optColSet.ATFTypeGrowth1:SetChecked(false)
module:ReloadAllSplits()
end)
do
local p = self.optColSet.ATFTypeGrowth2
local x,y = 20, 10
for i=1,11 do
p["l"..i] = p:CreateLine(nil, "BACKGROUND", nil, -5)
p["l"..i]:SetTexture("Interface/AddOns/"..GlobalAddonName.."/media/line")
p["l"..i]:SetVertexColor(1,0,0,1)
p["l"..i]:SetThickness(8)
p["l"..i]:SetStartPoint("CENTER",p, x, y)
if (i % 2) == 0 then
x = x + 20
y = y + 20
else
y = y - 20
end
p["l"..i]:SetEndPoint("CENTER",p, x, y)
end
end
self.optColSet.sliderATFMaxCol = ELib:Slider(self.optColSet.superTabFrame.tab[10],L.cd2ATFMaxCol):Size(400):Point("TOP",0,-230):Range(1,20):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.ATFCol = event
module:ReloadAllSplits()
self.tooltipText = event
self:tooltipReload(self)
end)
self.optColSet.sliderATFMaxLine = ELib:Slider(self.optColSet.superTabFrame.tab[10],L.cd2ATFMaxLine):Size(400):Point("TOP",0,-265):Range(1,20):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.ATFLines = event
module:ReloadAllSplits()
self.tooltipText = event
self:tooltipReload(self)
end)
self.optColSet.sliderATFOffsetX = ELib:Slider(self.optColSet.superTabFrame.tab[10],L.cd2ATFOffsetX):Size(400):Point("TOP",0,-300):Range(-300,300):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.ATFOffsetX = event
module:ReloadAllSplits()
self.tooltipText = event
self:tooltipReload(self)
end)
self.optColSet.sliderATFOffsetY = ELib:Slider(self.optColSet.superTabFrame.tab[10],L.cd2ATFOffsetY):Size(400):Point("TOP",0,-335):Range(-300,300):SetObey(true):OnChange(function(self,event)
event = event - event%1
currColOpt.ATFOffsetY = event
module:ReloadAllSplits()
self.tooltipText = event
self:tooltipReload(self)
end)
self.optColSet.dropDownATFFramePrior = ELib:DropDown(self.optColSet.superTabFrame.tab[10],350,-1):Size(230):Point("TOPLEFT",180,-370):Tooltip(L.cd2FramePriorTooltip)
self.optColSet.textdropDownATFFramePrior = ELib:Text(self.optColSet.superTabFrame.tab[10],L.cd2FramePrior..":",11):Size(200,20):Point("LEFT",10,0):Point("TOP",self.optColSet.dropDownATFFramePrior,0,0)
for i=1,#module.db.rframes do
self.optColSet.dropDownATFFramePrior.List[i] = {
text = module.db.rframes[i].text or module.db.rframes[i].name,
arg1 = module.db.rframes[i].name,
func = function (self,arg,arg2)
ELib:DropDownClose()
currColOpt.ATFFramePrior = arg
module:ReloadAllSplits()
self:GetParent().parent:Update()
end
}
end
function self.optColSet.dropDownATFFramePrior:Update(opt)
opt = opt or currColOpt.ATFFramePrior
local optData = ExRT.F.table_find3(module.db.rframes, opt, "name")
if optData then
self:SetText(optData.text or optData.name or "")
else
self:SetText("")
end
end
do
module.options.optColTabs.selected = module.db.maxColumns+1
module.options.tab.tabs[2]:SetScript("OnShow",function ()
module.options.selectColumnTab(self.optColTabs.tabs[module.db.maxColumns+1].button)
module.options.tab.tabs[2]:SetScript("OnShow",nil)
end)
end
--> Advanced
local advTab = self.optColTabs.tabs[module.db.maxColumns+2]
advTab.hotfixEdit = ELib:MultiEdit(advTab):Size(650,200):Point("TOPLEFT",0,-30):SetText(VMRT.ExCD2.Hotfixes or ""):OnChange(function(self,isUser)
if not isUser then
return
end
VMRT.ExCD2.Hotfixes = self:GetText()
advTab.hotfixApplyBut:Show()
end)
--advTab.hotfixEdit.EditBox:Disable()
advTab.hotfixEditText = ELib:Text(advTab,"Hotfixes: [?]"):Point("BOTTOMLEFT",advTab.hotfixEdit,"TOPLEFT",10,3):Color():Run(function(self) self.TooltipOverwrite = "Functionality to change predefined addons data for spells.\nExample to change spells cooldown: \"62618:cd:120\". (Change cooldown of spell 62618 to 2 mins)\nExample to change spells duration: \"1044:dur:15\". (Change duration of spell 1044 to 15 sec)" end):Tooltip()
advTab.hotfixApplyBut = ELib:Button(advTab,APPLY):Point("TOPLEFT",advTab.hotfixEdit,"TOPRIGHT",5,-2):Size(90,25):Shown(false):OnClick(function (self)
self:Hide()
module:ApplyHotfixes()
end)
--> Profiles
local profilesTab = self.optColTabs.tabs[module.db.maxColumns+3]
local function GetCurrentProfileName()
return VMRT.ExCD2.Profiles.Now=="default" and L.ProfilesDefault or VMRT.ExCD2.Profiles.Now
end
profilesTab.currentText = ELib:Text(profilesTab,L.ProfilesCurrent,11):Size(650,200):Point(15,-15):Top():Color()
profilesTab.currentName = ELib:Text(profilesTab,"",14):Size(650,200):Point(210,-15):Top():Color(1,1,0)
profilesTab.currentName.UpdateText = function(self)
self:SetText(GetCurrentProfileName())
end
profilesTab.currentName:UpdateText()
profilesTab.choseText = ELib:Text(profilesTab,L.ProfilesChooseDesc,11):Size(650,200):Point(15,-40):Top():Color()
profilesTab.choseNewText = ELib:Text(profilesTab,L.ProfilesNew,11):Size(650,200):Point(15,-75+12):Top()
profilesTab.choseNew = ELib:Edit(profilesTab):Size(170,20):Point(10,-75)
profilesTab.choseNewButton = ELib:Button(profilesTab,L.ProfilesAdd):Size(70,20):Point("LEFT",profilesTab.choseNew,"RIGHT",0,0):OnClick(function (self)
local text = profilesTab.choseNew:GetText()
profilesTab.choseNew:SetText("")
if text == "" or text == "default" or VMRT.ExCD2.Profiles.List[text] or text == VMRT.ExCD2.Profiles.Now then
return
end
VMRT.ExCD2.Profiles.List[text] = ExRT.F.table_copy2(NewVMRTTableData)
StaticPopupDialogs["EXRT_EXCD_ACTIVATENEW"] = {
text = L.ProfilesActivateAlert,
button1 = L.YesText,
button2 = L.NoText,
OnAccept = function()
module:SelectProfile(text)
end,
timeout = 0,
whileDead = true,
hideOnEscape = true,
preferredIndex = 3,
}
StaticPopup_Show("EXRT_EXCD_ACTIVATENEW")
end)
profilesTab.choseSelectText = ELib:Text(profilesTab,L.ProfilesSelect,11):Size(605,200):Point(335,-75+12):Top()
profilesTab.choseSelectDropDown = ELib:DropDown(profilesTab,220,10):Point(330,-75):Size(235):SetText(LFG_LIST_SELECT)
local function GetCurrentProfilesList(func)
local list = {
{ text = GetCurrentProfileName(), func = func, arg1 = VMRT.ExCD2.Profiles.Now, _sort = "0" },
}
for name,_ in pairs(VMRT.ExCD2.Profiles.List) do
if name ~= VMRT.ExCD2.Profiles.Now then
list[#list + 1] = { text = name == "default" and L.ProfilesDefault or name, func = func, arg1 = name, _sort = "1"..name }
end
end
sort(list,function(a,b) return a._sort < b._sort end)
return list
end
function profilesTab.choseSelectDropDown:ToggleUpadte()
self.List = GetCurrentProfilesList(function(_,arg1)
ELib:DropDownClose()
module:SelectProfile(arg1)
end)
end
local function CopyProfile(name)
local newdb = VMRT.ExCD2.Profiles.List[name]
local currname = VMRT.ExCD2.Profiles.Now
if module:SelectProfile(name) then
VMRT.ExCD2.Profiles.List[name] = newdb
VMRT.ExCD2.Profiles.Now = currname
profilesTab.currentName:UpdateText()
print(L.cd2ProfileCopySuccess:format(name))
end
end
profilesTab.copyText = ELib:Text(profilesTab,L.ProfilesCopy,11):Size(605,200):Point(15,-120+12):Top()
profilesTab.copyDropDown = ELib:DropDown(profilesTab,220,10):Point(10,-120):Size(235)
function profilesTab.copyDropDown:ToggleUpadte()
self.List = GetCurrentProfilesList(function(_,arg1)
ELib:DropDownClose()
CopyProfile(arg1)
end)
for i=1,#self.List do
if self.List[i].arg1 == VMRT.ExCD2.Profiles.Now then
tremove(self.List, i)
break
end
end
end
local function DeleteProfile(name)
StaticPopupDialogs["EXRT_EXCD_PROFILES_REMOVE"] = {
text = L.ProfilesDeleteAlert,
button1 = L.YesText,
button2 = L.NoText,
OnAccept = function()
VMRT.ExCD2.Profiles.List[name] = nil
profilesTab:UpdateAutoTexts()
end,
timeout = 0,
whileDead = true,
hideOnEscape = true,
preferredIndex = 3,
}
StaticPopup_Show("EXRT_EXCD_PROFILES_REMOVE")
end
profilesTab.deleteText = ELib:Text(profilesTab,L.ProfilesDelete,11):Size(605,200):Point(15,-160+12):Top()
profilesTab.deleteDropDown = ELib:DropDown(profilesTab,220,10):Point(10,-160):Size(235)
function profilesTab.deleteDropDown:ToggleUpadte()
self.List = GetCurrentProfilesList(function(_,arg1)
ELib:DropDownClose()
DeleteProfile(arg1)
end)
for i=#self.List,1,-1 do
if self.List[i].arg1 == VMRT.ExCD2.Profiles.Now then
tremove(self.List, i)
elseif self.List[i].arg1 == "default" then
tremove(self.List, i)
end
end
end
profilesTab.importWindow, profilesTab.exportWindow = ExRT.F.CreateImportExportWindows()
function profilesTab.importWindow:ImportFunc(str)
local headerLen = str:sub(1,4) == "EXRT" and 8 or 7
local header = str:sub(1,headerLen)
if (header:sub(1,headerLen-1) ~= "EXRTCDP" and header:sub(1,headerLen-1) ~= "MRTCDP") or (header:sub(headerLen,headerLen) ~= "0" and header:sub(headerLen,headerLen) ~= "1") then
StaticPopupDialogs["EXRT_EXCD_IMPORT"] = {
text = "|cffff0000"..ERROR_CAPS.."|r "..L.ProfilesFail3,
button1 = OKAY,
timeout = 0,
whileDead = true,
hideOnEscape = true,
preferredIndex = 3,
}
StaticPopup_Show("EXRT_EXCD_IMPORT")
return
end
profilesTab:TextToProfile(str:sub(headerLen+1),header:sub(headerLen,headerLen)=="0")
end
profilesTab.exportButton = ELib:Button(profilesTab,L.ProfilesExport):Size(235,25):Point(10,-200):OnClick(function (self)
profilesTab.exportWindow:NewPoint("CENTER",UIParent,0,0)
profilesTab:ProfileToText()
end)
profilesTab.importButton = ELib:Button(profilesTab,L.ProfilesImport):Size(235,25):Point("LEFT",profilesTab.exportButton,"RIGHT",85,0):OnClick(function (self)
profilesTab.importWindow:NewPoint("CENTER",UIParent,0,0)
profilesTab.importWindow:Show()
end)
local IGNORE_PROFILE_KEYS = {
["Profiles"] = true,
}
function profilesTab:ProfileToText()
local new = {}
for key,val in pairs(VMRT.ExCD2) do
if not IGNORE_PROFILE_KEYS[key] then
new[key] = val
end
end
local strlist = ExRT.F.TableToText(new)
strlist[1] = "0,"..strlist[1]
local str = table.concat(strlist)
local compressed
if #str < 1000000 then
compressed = LibDeflate:CompressDeflate(str,{level = 5})
end
local encoded = "MRTCDP"..(compressed and "1" or "0")..LibDeflate:EncodeForPrint(compressed or str)
ExRT.F.dprint("Str len:",#str,"Encoded len:",#encoded)
if ExRT.isDev then
module.db.exportTable = new
end
profilesTab.exportWindow.Edit:SetText(encoded)
profilesTab.exportWindow:Show()
end
function profilesTab:SaveDataFilter(res)
local KeysToSave = {
["Profiles"] = true,
}
local R = {
data = {},
Restore = function(self,t)
for k,v in pairs(self.data) do
t[k] = v
end
end
}
for k,v in pairs(KeysToSave) do
R.data[k] = res[k]
end
return R
end
function profilesTab:LockedFilter(res)
local KeysToErase = {
["Profiles"] = true,
}
for k,v in pairs(KeysToErase) do
res[k] = nil
end
end
function profilesTab:OnlyVisualFilter(res)
local KeysToErase = {
["Hotfixes"] = true,
["Priority"] = true,
["CDE"] = true,
["enabled"] = true,
["gnGUIDs"] = true,
["CDECol"] = true,
["userDB"] = true,
["OptFav"] = true,
}
for k,v in pairs(KeysToErase) do
res[k] = VMRT.ExCD2[k]
end
end
function profilesTab:TextToProfile(str,uncompressed)
local decoded = LibDeflate:DecodeForPrint(str)
local decompressed
if uncompressed then
decompressed = decoded
else
decompressed = LibDeflate:DecompressDeflate(decoded)
end
decoded = nil
local _,tableData = strsplit(",",decompressed,2)
decompressed = nil
local successful, res = pcall(ExRT.F.TextToTable,tableData)
if ExRT.isDev then
module.db.lastImportDB = res
if module.db.exportTable and type(res)=="table" then
module.db.diffTable = {}
print("Compare table",ExRT.F.table_compare(res,module.db.exportTable,module.db.diffTable))
end
end
if successful and res then
profilesTab:LockedFilter(res)
StaticPopupDialogs["EXRT_EXCD_IMPORT"] = {
text = L.cd2ProfileRewriteAlert,
button1 = APPLY,
button2 = L.cd2ImportOnlyVisual,
button3 = L.ProfilesSaveAsNew,
button4 = CANCEL,
selectCallbackByIndex = true,
OnButton1 = function()
local saved = profilesTab:SaveDataFilter(VMRT.ExCD2)
ExRT.F.table_rewrite(VMRT.ExCD2,res)
saved:Restore(VMRT.ExCD2)
module:ReloadProfile()
res = nil
end,
OnButton2 = function()
profilesTab:OnlyVisualFilter(res)
local saved = profilesTab:SaveDataFilter(VMRT.ExCD2)
ExRT.F.table_rewrite(VMRT.ExCD2,res)
saved:Restore(VMRT.ExCD2)
module:ReloadProfile()
res = nil
end,
OnButton3 = function()
ExRT.F.ShowInput(L.ProfilesNewProfile,function(_,name)
if name == "" or VMRT.ExCD2.Profiles.List[name] or name == "default" or name == VMRT.ExCD2.Profiles.Now then
res = nil
return
end
VMRT.ExCD2.Profiles.List[name] = res
module:SelectProfile(name)
res = nil
end,nil,nil,nil,function(self)
local name = self:GetText()
if name == "" or VMRT.ExCD2.Profiles.List[name] or name == "default" or name == VMRT.ExCD2.Profiles.Now then
self:GetParent().OK:Disable()
else
self:GetParent().OK:Enable()
end
end)
end,
OnButton4 = function()
res = nil
end,
timeout = 0,
whileDead = true,
hideOnEscape = true,
preferredIndex = 3,
}
else
StaticPopupDialogs["EXRT_EXCD_IMPORT"] = {
text = L.ProfilesFail1..(res and "\nError code: "..res or ""),
button1 = OKAY,
timeout = 0,
whileDead = true,
hideOnEscape = true,
preferredIndex = 3,
}
end
StaticPopup_Show("EXRT_EXCD_IMPORT")
end
profilesTab.autoText = ELib:Text(profilesTab,L.cd2AutoChangeTooltip,12):Size(605,200):Point(10,-240):Top():Color()
local function GetTextProfileName(profileName)
if not profileName then
return
end
local prefix
if profileName == VMRT.ExCD2.Profiles.Now then
prefix = "|cff00ff00"
elseif not VMRT.ExCD2.Profiles.List[profileName] then
prefix = "|cffff0000"
end
if profileName == "default" then
profileName = L.ProfilesDefault
end
return (prefix or "")..profileName
end
function profilesTab:UpdateAutoTexts()
self.autoRaidDown:SetText(GetTextProfileName(VMRT.ExCD2.Profiles.Raid) or "|cff999999"..L.cd2DontChange)
self.autoDungDown:SetText(GetTextProfileName(VMRT.ExCD2.Profiles.Dung) or "|cff999999"..L.cd2DontChange)
self.autoArenaDown:SetText(GetTextProfileName(VMRT.ExCD2.Profiles.Arena) or "|cff999999"..L.cd2DontChange)
self.autoBGDown:SetText(GetTextProfileName(VMRT.ExCD2.Profiles.BG) or "|cff999999"..L.cd2DontChange)
self.autoOtherDown:SetText(GetTextProfileName(VMRT.ExCD2.Profiles.Other) or "|cff999999"..L.cd2DontChange)
for _,dd in pairs({self.autoSpec1Down,self.autoSpec2Down,self.autoSpec3Down,self.autoSpec4Down}) do
dd:SetText(GetTextProfileName(VMRT.ExCD2.Profiles[dd.OptKey]) or "|cff999999"..L.cd2DontChange)
end
end
local function AutoDropDown_ToggleUpadte(self)
local func = function(_,arg1)
ELib:DropDownClose()
VMRT.ExCD2.Profiles[self.OptKey] = arg1
profilesTab:UpdateAutoTexts()
end
self.List = GetCurrentProfilesList(func)
tinsert(self.List,1,{text = L.cd2DontChange, func = func})
end
profilesTab.autoRaidDown = ELib:DropDown(profilesTab,220,10):Point(10,-270):Size(235):AddText(RAID,11,function(self)self:NewPoint("TOPLEFT",'x',5,12):Color(1,.82,0,1) end)
profilesTab.autoRaidDown.OptKey = "Raid"
profilesTab.autoRaidDown.ToggleUpadte = AutoDropDown_ToggleUpadte
profilesTab.autoDungDown = ELib:DropDown(profilesTab,220,10):Point("TOPLEFT",profilesTab.autoRaidDown,0,-40):Size(235):AddText(CALENDAR_TYPE_DUNGEON,11,function(self)self:NewPoint("TOPLEFT",'x',5,12):Color(1,.82,0,1) end)
profilesTab.autoDungDown.OptKey = "Dung"
profilesTab.autoDungDown.ToggleUpadte = AutoDropDown_ToggleUpadte
profilesTab.autoArenaDown = ELib:DropDown(profilesTab,220,10):Point("TOPLEFT",profilesTab.autoRaidDown,320,0):Size(235):AddText(ARENA,11,function(self)self:NewPoint("TOPLEFT",'x',5,12):Color(1,.82,0,1) end)
profilesTab.autoArenaDown.OptKey = "Arena"
profilesTab.autoArenaDown.ToggleUpadte = AutoDropDown_ToggleUpadte
profilesTab.autoBGDown = ELib:DropDown(profilesTab,220,10):Point("TOPLEFT",profilesTab.autoArenaDown,0,-40):Size(235):AddText(BATTLEGROUND,11,function(self)self:NewPoint("TOPLEFT",'x',5,12):Color(1,.82,0,1) end)
profilesTab.autoBGDown.OptKey = "BG"
profilesTab.autoBGDown.ToggleUpadte = AutoDropDown_ToggleUpadte
profilesTab.autoOtherDown = ELib:DropDown(profilesTab,220,10):Point("TOPLEFT",profilesTab.autoDungDown,0,-40):Size(235):AddText(OTHER,11,function(self)self:NewPoint("TOPLEFT",'x',5,12):Color(1,.82,0,1) end)
profilesTab.autoOtherDown.OptKey = "Other"
profilesTab.autoOtherDown.ToggleUpadte = AutoDropDown_ToggleUpadte
local class = (select(2,UnitClass'player')) or ""
profilesTab.autoTextSpec = ELib:Text(profilesTab,L.cd2AutoChangeSpecTooltip,12):Size(605,200):Point(10,-380):Top():Color()
profilesTab.autoSpec1Down = ELib:DropDown(profilesTab,220,10):Point(10,-410):Size(235)
profilesTab.autoSpec1Down.OptKey = "Spec1" .. class
profilesTab.autoSpec1Down.ToggleUpadte = AutoDropDown_ToggleUpadte
profilesTab.autoSpec2Down = ELib:DropDown(profilesTab,220,10):Point("TOPLEFT",profilesTab.autoSpec1Down,0,-40):Size(235)
profilesTab.autoSpec2Down.OptKey = "Spec2" .. class
profilesTab.autoSpec2Down.ToggleUpadte = AutoDropDown_ToggleUpadte
profilesTab.autoSpec3Down = ELib:DropDown(profilesTab,220,10):Point("TOPLEFT",profilesTab.autoSpec1Down,320,0):Size(235)
profilesTab.autoSpec3Down.OptKey = "Spec3" .. class
profilesTab.autoSpec3Down.ToggleUpadte = AutoDropDown_ToggleUpadte
profilesTab.autoSpec4Down = ELib:DropDown(profilesTab,220,10):Point("TOPLEFT",profilesTab.autoSpec2Down,320,0):Size(235)
profilesTab.autoSpec4Down.OptKey = "Spec4" .. class
profilesTab.autoSpec4Down.ToggleUpadte = AutoDropDown_ToggleUpadte
if not GetSpecializationInfo then
profilesTab.autoTextSpec:Hide()
profilesTab.autoSpec1Down:Hide()
profilesTab.autoSpec2Down:Hide()
profilesTab.autoSpec3Down:Hide()
profilesTab.autoSpec4Down:Hide()
else
for i=1,4 do
local _, name = GetSpecializationInfo(i)
--if not name then
-- _, name = ExRT.Classic.GetSpecializationInfoByID(ExRT.GDB.ClassSpecializationList[class][i])
--end
if name then
profilesTab["autoSpec"..i.."Down"]:AddText(name,11,function(self)self:NewPoint("TOPLEFT",'x',5,12):Color(1,.82,0,1) end)
else
profilesTab["autoSpec"..i.."Down"]:Hide()
end
end
end
profilesTab:UpdateAutoTexts()
--> Other setts
self.optSetTab = ELib:OneTab(self.tab.tabs[2],L.cd2OtherSet):Size(652,34):Point("TOP",0,-532)
self.chkSplit = ELib:Check(self.optSetTab,L.cd2split,VMRT.ExCD2.SplitOpt):Point("LEFT",10,0):Tooltip(L.cd2splittooltip):OnClick(function(self,event)
if self:GetChecked() then
VMRT.ExCD2.SplitOpt = true
else
VMRT.ExCD2.SplitOpt = nil
end
module:UpdateLockState()
module:SplitExCD2Window()
module:ReloadAllSplits()
end)
self.chkNoRaid = ELib:Check(self.optSetTab,L.cd2noraid,VMRT.ExCD2.NoRaid):Point("LEFT",165,0):OnClick(function(self,event)
if self:GetChecked() then
VMRT.ExCD2.NoRaid = true
else
VMRT.ExCD2.NoRaid = nil
end
module:UpdateRoster()
end)
self.testMode = ELib:Check(self.optSetTab,L.cd2GeneralSetTestMode,module.db.testMode):Point("LEFT",325,0):Tooltip(L.cd2HelpTestButton):OnClick(function(self,event)
if self:GetChecked() then
module.db.testMode = true
else
module.db.testMode = nil
TestMode(1)
end
module:UpdateSpellDB(true)
end)
self.butResetToDef = ELib:Button(self.optSetTab,L.cd2OtherSetReset):Size(160,20):Point("LEFT",480,0):Tooltip(L.cd2HelpButtonDefault):OnClick(function()
local tabSelected = module.options.optColTabs.selected
StaticPopupDialogs["EXRT_EXCD_DEFAULT"] = {
text = L.cd2OtherSetReset,
button1 = L.YesText,
button2 = L.NoText,
OnAccept = function()
if not VMRT.ExCD2.colSet[tabSelected] then
VMRT.ExCD2.colSet[tabSelected] = {}
end
table_wipe2(VMRT.ExCD2.colSet[tabSelected])
for optName,optVal in pairs(module.db.colsInit) do
VMRT.ExCD2.colSet[tabSelected][optName] = optVal
end
module.options.selectColumnTab(self.optColTabs.tabs[tabSelected].button)
module:ReloadAllSplits()
end,
timeout = 0,
whileDead = true,
hideOnEscape = true,
preferredIndex = 3,
}
StaticPopup_Show("EXRT_EXCD_DEFAULT")
end)
--> OPTIONS TAB3: History
self.butHistoryClear = ELib:Button(self.tab.tabs[3],L.cd2HistoryClear):Size(180,20):Point("TOPRIGHT",-3,-6):OnClick(function()
table_wipe2(module.db.historyUsage)
module.options.historyBox.EditBox:SetText("")
end)
local historyBoxUpdateTable = {}
local function historyBoxUpdate(v)
table_wipe2(historyBoxUpdateTable)
local count = 0
for i=1,#module.db.historyUsage do
if VMRT.ExCD2.CDE[module.db.historyUsage[i][2]] then
count = count + 1
end
if count >= v and VMRT.ExCD2.CDE[module.db.historyUsage[i][2]] then
local tm = date("%X",module.db.historyUsage[i][1])
local bosshpstr = module.db.historyUsage[i][4] and format(" (%d:%.2d)",module.db.historyUsage[i][4]/60,module.db.historyUsage[i][4]%60) or ""
local spellName,_,spellIcon = GetSpellInfo(module.db.historyUsage[i][2])
historyBoxUpdateTable [#historyBoxUpdateTable + 1] = format("|cffffff00[%s]%s|r %s |Hspell:%d|h|T%s:0|t%s|h",tm,bosshpstr,module.db.historyUsage[i][3] or "?",module.db.historyUsage[i][2] or 0,spellIcon or "Interface\\Icons\\Trade_Engineering",spellName or "?")
end
if #historyBoxUpdateTable > 44 then
break
end
end
module.options.historyBox.EditBox:SetText(strjoin("\n",unpack(historyBoxUpdateTable)))
end
self.historyBox = ELib:MultiEdit2(self.tab.tabs[3]):Size(840,550):Point("TOP",0,-36):Hyperlinks()
self.historyBox.EditBox:SetScript("OnShow",function(self)
historyBoxUpdate(1)
local count = 0
for i=1,#module.db.historyUsage do
if VMRT.ExCD2.CDE[module.db.historyUsage[i][2]] then
count = count + 1
end
end
module.options.historyBox.ScrollBar:SetMinMaxValues(1,max(count,1))
module.options.historyBox.ScrollBar:UpdateButtons()
end)
self.historyBox.ScrollBar:SetScript("OnValueChanged",function (self,val)
val = ExRT.F.Round(val)
historyBoxUpdate(val)
self:UpdateButtons()
end)
self.HelpPlate = {
[1] = {},
[2] = {
FramePos = { x = 90, y = 25 },FrameSize = { width = 660, height = 615 },
[1] = { ButtonPos = { x = 50, y = -110 }, HighLightBox = { x = 0, y = -50, width = 660, height = 480 }, ToolTipDir = "RIGHT", ToolTipText = L.cd2HelpColSetup },
[2] = { ButtonPos = { x = 320, y = -550 }, HighLightBox = { x = 315, y = -560, width = 140, height = 30 }, ToolTipDir = "LEFT", ToolTipText = L.cd2HelpTestButton },
[3] = { ButtonPos = { x = 500, y = -550 }, HighLightBox = { x = 490, y = -560, width = 160, height = 30 }, ToolTipDir = "LEFT", ToolTipText = L.cd2HelpButtonDefault },
},
}
if not ExRT.isClassic then
self.HELPButton = ExRT.lib.CreateHelpButton(self.tab.tabs[2],self.HelpPlate,self.tab)
self.HELPButton:SetPoint("LEFT",self.title,"RIGHT",20,-2)
end
self.isWide = true
module:CreateSpellData(true)
end
local function CreateBlackList(text)
local blacklist = {}
local tmpList = {strsplit("\n", text)}
for i=1,#tmpList do
if tmpList[i]~="" then
if tmpList[i]:find(":(%d+)") then
local name,spellID = tmpList[i]:match("([^:]+):(%d+)")
if name and spellID then
spellID = tonumber(spellID)
blacklist[ spellID ] = blacklist[ spellID ] or {}
name = name:lower()
blacklist[ spellID ][name] = true
end
else
tmpList[i] = tmpList[i]:lower()
blacklist[ tmpList[i] ] = true
end
end
end
return blacklist
end
local function CreateWhiteList(text)
if text == "" then
return
end
local whitelist = {}
local tmpList = {strsplit("\n", text)}
for i=1,#tmpList do
if tmpList[i]~="" then
tmpList[i] = tmpList[i]:lower()
whitelist[ tmpList[i] ] = true
end
end
return whitelist
end
local function IconGlowNoLibStart(self)
local LCG = LibStub("LibCustomGlow-1.0",true)
if not LCG then
return
end
local iconGlowType = self:GetParent().parent.optionGlowType
if (not iconGlowType or iconGlowType == 1) then
return LCG.ButtonGlow_Start(self)
elseif iconGlowType == 2 then
return LCG.AutoCastGlow_Start(self)
elseif iconGlowType == 3 then
return LCG.PixelGlow_Start(self)
elseif iconGlowType == 4 then
return ExRT.NULLfunc(self)
end
end
local function IconGlowNoLibStop(self)
local LCG = LibStub("LibCustomGlow-1.0",true)
if not LCG then
return
end
local iconGlowType = self:GetParent().parent.optionGlowType
if (not iconGlowType or iconGlowType == 1) then
return LCG.ButtonGlow_Stop(self)
elseif iconGlowType == 2 then
return LCG.AutoCastGlow_Stop(self)
elseif iconGlowType == 3 then
return LCG.PixelGlow_Stop(self)
elseif iconGlowType == 4 then
return ExRT.NULLfunc(self)
end
end
function module:ColApplyStyle(columnFrame,currColOpt,generalOpt,defOpt,mainWidth,argScaleFix)
local LCG = LibStub("LibCustomGlow-1.0",true)
if not columnFrame.LOADEDs then
columnFrame.LOADEDs = {}
end
columnFrame.iconSize = (not currColOpt.iconGeneral and currColOpt.iconSize) or (currColOpt.iconGeneral and generalOpt.iconSize) or defOpt.iconSize
local frameBetweenLines = (not currColOpt.frameGeneral and currColOpt.frameBetweenLines) or (currColOpt.frameGeneral and generalOpt.frameBetweenLines) or defOpt.frameBetweenLines
columnFrame.frameBetweenLines = frameBetweenLines
local frameColumns = (not currColOpt.frameGeneral and currColOpt.frameColumns) or (currColOpt.frameGeneral and generalOpt.frameColumns) or defOpt.frameColumns
columnFrame.frameColumns = frameColumns
local linesShown = (not currColOpt.frameGeneral and currColOpt.frameLines) or (currColOpt.frameGeneral and generalOpt.frameLines) or defOpt.frameLines
linesShown = ceil(linesShown / frameColumns)
columnFrame.GlinesShown = linesShown
local linesTotal = min(linesShown * frameColumns,module.db.maxLinesInCol)
if currColOpt.ATF then
linesTotal = 150
end
if VMRT.ExCD2.SplitOpt then
columnFrame.Gheight = columnFrame.iconSize*linesShown+frameBetweenLines*(linesShown-1)
columnFrame:SetHeight(columnFrame.iconSize*linesShown+frameBetweenLines*(linesShown-1))
elseif not currColOpt.ATF then
columnFrame.Gheight = columnFrame.iconSize*linesShown
columnFrame:SetHeight(columnFrame.iconSize*linesShown)
end
columnFrame.NumberLastLinesActive = max(linesTotal,module.db.maxLinesInCol,#columnFrame.lines)
if currColOpt.enabled then
for j=1,linesTotal do
if not columnFrame.LOADEDs[j] then
columnFrame.lines[j] = CreateBar(columnFrame)
columnFrame.lines[j]:Hide()
columnFrame.LOADEDs[j] = true
end
end
columnFrame.IsColumnEnabled = true
else
columnFrame.IsColumnEnabled = false
end
local frameStrata = (not currColOpt.frameGeneral and currColOpt.frameStrata) or (currColOpt.frameGeneral and generalOpt.frameStrata) or defOpt.frameStrata
if currColOpt.ATF then
if not ( (not currColOpt.frameGeneral and currColOpt.frameStrata) or (currColOpt.frameGeneral and generalOpt.frameStrata) ) then
columnFrame.autoStrata = true
else
columnFrame.autoStrata = false
end
else
columnFrame.autoStrata = false
end
columnFrame:SetFrameStrata(frameStrata)
columnFrame.FrameStrata = nil
local frameAlpha = (not currColOpt.frameGeneral and currColOpt.frameAlpha) or (currColOpt.frameGeneral and generalOpt.frameAlpha) or defOpt.frameAlpha
columnFrame:SetAlpha(frameAlpha/100)
local frameScale = (not currColOpt.frameGeneral and currColOpt.frameScale) or (currColOpt.frameGeneral and generalOpt.frameScale) or defOpt.frameScale
if VMRT.ExCD2.SplitOpt then
if argScaleFix == "ScaleFix" then
ExRT.F.SetScaleFix(columnFrame,frameScale/100)
else
columnFrame:SetScale(frameScale/100)
end
else
columnFrame:SetScale(1)
end
local blackBack = (not currColOpt.frameGeneral and currColOpt.frameBlackBack) or (currColOpt.frameGeneral and generalOpt.frameBlackBack) or defOpt.frameBlackBack
columnFrame.texture:SetColorTexture(0,0,0,blackBack / 100)
--> View options
columnFrame.optionClassColorBackground = (not currColOpt.textureGeneral and currColOpt.textureClassBackground) or (currColOpt.textureGeneral and generalOpt.textureClassBackground)
columnFrame.optionClassColorTimeLine = (not currColOpt.textureGeneral and currColOpt.textureClassTimeLine) or (currColOpt.textureGeneral and generalOpt.textureClassTimeLine)
columnFrame.optionClassColorText = (not currColOpt.textureGeneral and currColOpt.textureClassText) or (currColOpt.textureGeneral and generalOpt.textureClassText)
columnFrame.optionAnimation = (not currColOpt.textureGeneral and currColOpt.textureAnimation) or (currColOpt.textureGeneral and generalOpt.textureAnimation)
columnFrame.optionSmoothAnimation = (not currColOpt.textureGeneral and currColOpt.textureSmoothAnimation) or (currColOpt.textureGeneral and generalOpt.textureSmoothAnimation)
columnFrame.optionSmoothAnimationDuration = (not currColOpt.textureGeneral and currColOpt.textureSmoothAnimationDuration) or (currColOpt.textureGeneral and generalOpt.textureSmoothAnimationDuration) or defOpt.textureSmoothAnimationDuration
columnFrame.optionSmoothAnimationDuration = columnFrame.optionSmoothAnimationDuration / 200
columnFrame.optionLinesMax = linesTotal
columnFrame.optionShownOnCD = (not currColOpt.methodsGeneral and currColOpt.methodsShownOnCD) or (currColOpt.methodsGeneral and generalOpt.methodsShownOnCD)
columnFrame.optionIconPosition = (not currColOpt.iconGeneral and currColOpt.iconPosition) or (currColOpt.iconGeneral and generalOpt.iconPosition) or defOpt.iconPosition
columnFrame.optionStyleAnimation = (not currColOpt.methodsGeneral and currColOpt.methodsStyleAnimation) or (currColOpt.methodsGeneral and generalOpt.methodsStyleAnimation) or defOpt.methodsStyleAnimation
columnFrame.optionTimeLineAnimation = (not currColOpt.methodsGeneral and currColOpt.methodsTimeLineAnimation) or (currColOpt.methodsGeneral and generalOpt.methodsTimeLineAnimation) or defOpt.methodsTimeLineAnimation
columnFrame.optionCooldown = (not currColOpt.iconGeneral and currColOpt.methodsCooldown) or (currColOpt.iconGeneral and generalOpt.methodsCooldown)
columnFrame.optionCooldownHideNumbers = (not currColOpt.iconGeneral and currColOpt.iconCooldownHideNumbers) or (currColOpt.iconGeneral and generalOpt.iconCooldownHideNumbers)
columnFrame.optionCooldownUseExRT = (not currColOpt.iconGeneral and currColOpt.iconCooldownExRTNumbers) or (currColOpt.iconGeneral and generalOpt.iconCooldownExRTNumbers)
if columnFrame.optionCooldownUseExRT then columnFrame.optionCooldownHideNumbers = true end
columnFrame.optionCooldownShowSwipe = (not currColOpt.iconGeneral and currColOpt.iconCooldownShowSwipe) or (currColOpt.iconGeneral and generalOpt.iconCooldownShowSwipe)
columnFrame.optionIconName = (not currColOpt.textGeneral and currColOpt.textIconName) or (currColOpt.textGeneral and generalOpt.textIconName)
columnFrame.optionHideSpark = (not currColOpt.textureGeneral and currColOpt.textureHideSpark) or (currColOpt.textureGeneral and generalOpt.textureHideSpark)
columnFrame.optionIconTitles = (not currColOpt.iconGeneral and currColOpt.iconTitles) or (currColOpt.iconGeneral and generalOpt.iconTitles)
columnFrame.optionIconTitles = columnFrame.optionIconTitles and not (columnFrame.optionIconPosition == 3)
columnFrame.optionIconHideBlizzardEdges = (not currColOpt.iconGeneral and currColOpt.iconHideBlizzardEdges) or (currColOpt.iconGeneral and generalOpt.iconHideBlizzardEdges)
local iconGlowType = (not currColOpt.iconGeneral and currColOpt.iconGlowType) or (currColOpt.iconGeneral and generalOpt.iconGlowType) or defOpt.iconGlowType
columnFrame.optionGlowType = iconGlowType
local glowStart, glowStop
if LCG and (not iconGlowType or iconGlowType == 1) then
glowStart, glowStop = LCG.ButtonGlow_Start, LCG.ButtonGlow_Stop
elseif LCG and iconGlowType == 2 then
glowStart, glowStop = LCG.AutoCastGlow_Start, LCG.AutoCastGlow_Stop
elseif LCG and iconGlowType == 3 then
glowStart, glowStop = LCG.PixelGlow_Start, LCG.PixelGlow_Stop
elseif LCG and iconGlowType == 4 then
glowStart, glowStop = ExRT.NULLfunc, ExRT.NULLfunc
elseif not LCG then
glowStart, glowStop = IconGlowNoLibStart, IconGlowNoLibStop
end
columnFrame.glowStart = glowStart or ExRT.NULLfunc
columnFrame.glowStop = glowStop or ExRT.NULLfunc
columnFrame.methodsIconTooltip = (not currColOpt.methodsGeneral and currColOpt.methodsIconTooltip) or (currColOpt.methodsGeneral and generalOpt.methodsIconTooltip)
columnFrame.methodsLineClick = (not currColOpt.methodsGeneral and currColOpt.methodsLineClick) or (currColOpt.methodsGeneral and generalOpt.methodsLineClick)
columnFrame.methodsLineClickWhisper = (not currColOpt.methodsGeneral and currColOpt.methodsLineClickWhisper) or (currColOpt.methodsGeneral and generalOpt.methodsLineClickWhisper)
columnFrame.methodsLineClickMod = (not currColOpt.methodsGeneral and currColOpt.methodsLineClickMod) or (currColOpt.methodsGeneral and generalOpt.methodsLineClickMod)
columnFrame.methodsNewSpellNewLine = (not currColOpt.methodsGeneral and currColOpt.methodsNewSpellNewLine) or (currColOpt.methodsGeneral and generalOpt.methodsNewSpellNewLine)
columnFrame.methodsSortingRules = (not currColOpt.methodsGeneral and currColOpt.methodsSortingRules) or (currColOpt.methodsGeneral and generalOpt.methodsSortingRules) or defOpt.methodsSortingRules
columnFrame.methodsHideOwnSpells = (not currColOpt.methodsGeneral and currColOpt.methodsHideOwnSpells) or (currColOpt.methodsGeneral and generalOpt.methodsHideOwnSpells)
columnFrame.methodsAlphaNotInRange = (not currColOpt.methodsGeneral and currColOpt.methodsAlphaNotInRange) or (currColOpt.methodsGeneral and generalOpt.methodsAlphaNotInRange)
columnFrame.methodsAlphaNotInRangeNum = (not currColOpt.methodsGeneral and currColOpt.methodsAlphaNotInRangeNum) or (currColOpt.methodsGeneral and generalOpt.methodsAlphaNotInRangeNum) or defOpt.methodsAlphaNotInRangeNum
columnFrame.methodsAlphaNotInRangeNum = columnFrame.methodsAlphaNotInRangeNum / 100
columnFrame.methodsDisableActive = (not currColOpt.methodsGeneral and currColOpt.methodsDisableActive) or (currColOpt.methodsGeneral and generalOpt.methodsDisableActive)
columnFrame.methodsOneSpellPerCol = (not currColOpt.methodsGeneral and currColOpt.methodsOneSpellPerCol) or (currColOpt.methodsGeneral and generalOpt.methodsOneSpellPerCol)
columnFrame.methodsSortByAvailability = (not currColOpt.methodsGeneral and currColOpt.methodsSortByAvailability) or (currColOpt.methodsGeneral and generalOpt.methodsSortByAvailability)
columnFrame.methodsSortActiveToTop = (not currColOpt.methodsGeneral and currColOpt.methodsSortActiveToTop) or (currColOpt.methodsGeneral and generalOpt.methodsSortActiveToTop)
columnFrame.methodsReverseSorting = (not currColOpt.methodsGeneral and currColOpt.methodsReverseSorting) or (currColOpt.methodsGeneral and generalOpt.methodsReverseSorting)
columnFrame.methodsReverseSorting = (not currColOpt.methodsGeneral and currColOpt.methodsReverseSorting) or (currColOpt.methodsGeneral and generalOpt.methodsReverseSorting)
columnFrame.methodsCDOnlyTime = (not currColOpt.methodsGeneral and currColOpt.methodsCDOnlyTime) or (currColOpt.methodsGeneral and generalOpt.methodsCDOnlyTime)
columnFrame.methodsTextIgnoreActive = (not currColOpt.methodsGeneral and currColOpt.methodsTextIgnoreActive) or (currColOpt.methodsGeneral and generalOpt.methodsTextIgnoreActive)
columnFrame.methodsOnlyNotOnCD = (not currColOpt.methodsGeneral and currColOpt.methodsOnlyNotOnCD) or (currColOpt.methodsGeneral and generalOpt.methodsOnlyNotOnCD)
columnFrame.methodsOnlyInCombat = (not currColOpt.visibilityGeneral and currColOpt.methodsOnlyInCombat) or (currColOpt.visibilityGeneral and generalOpt.methodsOnlyInCombat)
columnFrame.visibilityPartyType = (not currColOpt.visibilityGeneral and currColOpt.visibilityPartyType) or (currColOpt.visibilityGeneral and generalOpt.visibilityPartyType)
columnFrame.visibilityArena = not ( (not currColOpt.visibilityGeneral and currColOpt.visibilityDisableArena) or (currColOpt.visibilityGeneral and generalOpt.visibilityDisableArena) )
columnFrame.visibilityBG = not ( (not currColOpt.visibilityGeneral and currColOpt.visibilityDisableBG) or (currColOpt.visibilityGeneral and generalOpt.visibilityDisableBG) )
columnFrame.visibility3ppl = not ( (not currColOpt.visibilityGeneral and currColOpt.visibilityDisable3ppl) or (currColOpt.visibilityGeneral and generalOpt.visibilityDisable3ppl) )
columnFrame.visibility5ppl = not ( (not currColOpt.visibilityGeneral and currColOpt.visibilityDisable5ppl) or (currColOpt.visibilityGeneral and generalOpt.visibilityDisable5ppl) )
columnFrame.visibilityRaid = not ( (not currColOpt.visibilityGeneral and currColOpt.visibilityDisableRaid) or (currColOpt.visibilityGeneral and generalOpt.visibilityDisableRaid) )
columnFrame.visibilityWorld = not ( (not currColOpt.visibilityGeneral and currColOpt.visibilityDisableWorld) or (currColOpt.visibilityGeneral and generalOpt.visibilityDisableWorld) )
columnFrame.textTemplateLeft = (not currColOpt.textGeneral and currColOpt.textTemplateLeft) or (currColOpt.textGeneral and generalOpt.textTemplateLeft) or defOpt.textTemplateLeft
columnFrame.textTemplateRight = (not currColOpt.textGeneral and currColOpt.textTemplateRight) or (currColOpt.textGeneral and generalOpt.textTemplateRight) or defOpt.textTemplateRight
columnFrame.textTemplateCenter = (not currColOpt.textGeneral and currColOpt.textTemplateCenter) or (currColOpt.textGeneral and generalOpt.textTemplateCenter) or defOpt.textTemplateCenter
columnFrame.textIconNameChars = (not currColOpt.textGeneral and currColOpt.textIconNameChars) or (currColOpt.textGeneral and generalOpt.textIconNameChars) or defOpt.textIconNameChars
columnFrame.textIconCDStyle = (not currColOpt.textGeneral and currColOpt.textIconCDStyle) or (currColOpt.textGeneral and generalOpt.textIconCDStyle) or defOpt.textIconCDStyle
columnFrame.textShowTargetName = (not currColOpt.textGeneral and currColOpt.textShowTargetName) or (currColOpt.textGeneral and generalOpt.textShowTargetName)
local blacklistText = (not currColOpt.blacklistGeneral and currColOpt.blacklistText) or (currColOpt.blacklistGeneral and generalOpt.blacklistText) or defOpt.blacklistText
columnFrame.BlackList = CreateBlackList(blacklistText)
local whitelistText = (not currColOpt.blacklistGeneral and currColOpt.whitelistText) or (currColOpt.blacklistGeneral and generalOpt.whitelistText) or defOpt.whitelistText
columnFrame.WhiteList = CreateWhiteList(whitelistText)
local frameWidth = (not currColOpt.frameGeneral and currColOpt.frameWidth) or (currColOpt.frameGeneral and generalOpt.frameWidth) or defOpt.frameWidth
columnFrame:SetWidth(frameWidth*frameColumns)
columnFrame.barWidth = frameWidth
columnFrame.optionGray = (not currColOpt.iconGeneral and currColOpt.iconGray) or (currColOpt.iconGeneral and generalOpt.iconGray)
columnFrame.fontSize = (not currColOpt.fontGeneral and currColOpt.fontSize) or (currColOpt.fontGeneral and generalOpt.fontSize) or defOpt.fontSize
columnFrame.fontName = (not currColOpt.fontGeneral and currColOpt.fontName) or (currColOpt.fontGeneral and generalOpt.fontName) or defOpt.fontName
columnFrame.fontOutline = (not currColOpt.fontGeneral and currColOpt.fontOutline) or (currColOpt.fontGeneral and generalOpt.fontOutline)
columnFrame.fontShadow = (not currColOpt.fontGeneral and currColOpt.fontShadow) or (currColOpt.fontGeneral and generalOpt.fontShadow)
columnFrame.textureFile = (not currColOpt.textureGeneral and currColOpt.textureFile) or (currColOpt.textureGeneral and generalOpt.textureFile) or defOpt.textureFile
columnFrame.textureBorderSize = (not currColOpt.textureGeneral and currColOpt.textureBorderSize) or (currColOpt.textureGeneral and generalOpt.textureBorderSize) or defOpt.textureBorderSize
columnFrame.textureBorderColorR = (not currColOpt.textureGeneral and currColOpt.textureBorderColorR) or (currColOpt.textureGeneral and generalOpt.textureBorderColorR) or defOpt.textureBorderColorR
columnFrame.textureBorderColorG = (not currColOpt.textureGeneral and currColOpt.textureBorderColorG) or (currColOpt.textureGeneral and generalOpt.textureBorderColorG) or defOpt.textureBorderColorG
columnFrame.textureBorderColorB = (not currColOpt.textureGeneral and currColOpt.textureBorderColorB) or (currColOpt.textureGeneral and generalOpt.textureBorderColorB) or defOpt.textureBorderColorB
columnFrame.textureBorderColorA = (not currColOpt.textureGeneral and currColOpt.textureBorderColorA) or (currColOpt.textureGeneral and generalOpt.textureBorderColorA) or defOpt.textureBorderColorA
local fontOtherAvailable = (not currColOpt.fontGeneral and currColOpt.fontOtherAvailable) or (currColOpt.fontGeneral and generalOpt.fontOtherAvailable)
local fontOpts = (not currColOpt.fontGeneral and currColOpt) or (currColOpt.fontGeneral and generalOpt)
columnFrame.fontLeftSize = (not fontOtherAvailable and fontOpts.fontSize) or (fontOtherAvailable and fontOpts.fontLeftSize) or defOpt.fontSize
columnFrame.fontLeftName = (not fontOtherAvailable and fontOpts.fontName) or (fontOtherAvailable and fontOpts.fontLeftName) or defOpt.fontName
columnFrame.fontLeftOutline = (not fontOtherAvailable and fontOpts.fontOutline) or (fontOtherAvailable and fontOpts.fontLeftOutline)
columnFrame.fontLeftShadow = (not fontOtherAvailable and fontOpts.fontShadow) or (fontOtherAvailable and fontOpts.fontLeftShadow)
columnFrame.fontRightSize = (not fontOtherAvailable and fontOpts.fontSize) or (fontOtherAvailable and fontOpts.fontRightSize) or defOpt.fontSize
columnFrame.fontRightName = (not fontOtherAvailable and fontOpts.fontName) or (fontOtherAvailable and fontOpts.fontRightName) or defOpt.fontName
columnFrame.fontRightOutline = (not fontOtherAvailable and fontOpts.fontOutline) or (fontOtherAvailable and fontOpts.fontRightOutline)
columnFrame.fontRightShadow = (not fontOtherAvailable and fontOpts.fontShadow) or (fontOtherAvailable and fontOpts.fontRightShadow)
columnFrame.fontCenterSize = (not fontOtherAvailable and fontOpts.fontSize) or (fontOtherAvailable and fontOpts.fontCenterSize) or defOpt.fontSize
columnFrame.fontCenterName = (not fontOtherAvailable and fontOpts.fontName) or (fontOtherAvailable and fontOpts.fontCenterName) or defOpt.fontName
columnFrame.fontCenterOutline = (not fontOtherAvailable and fontOpts.fontOutline) or (fontOtherAvailable and fontOpts.fontCenterOutline)
columnFrame.fontCenterShadow = (not fontOtherAvailable and fontOpts.fontShadow) or (fontOtherAvailable and fontOpts.fontCenterShadow)
columnFrame.fontIconSize = (not fontOtherAvailable and fontOpts.fontSize) or (fontOtherAvailable and fontOpts.fontIconSize) or defOpt.fontSize
columnFrame.fontIconName = (not fontOtherAvailable and fontOpts.fontName) or (fontOtherAvailable and fontOpts.fontIconName) or defOpt.fontName
columnFrame.fontIconOutline = (not fontOtherAvailable and fontOpts.fontOutline) or (fontOtherAvailable and fontOpts.fontIconOutline)
columnFrame.fontIconShadow = (not fontOtherAvailable and fontOpts.fontShadow) or (fontOtherAvailable and fontOpts.fontIconShadow)
columnFrame.fontIconCDSize = (not fontOtherAvailable and fontOpts.fontSize) or (fontOtherAvailable and fontOpts.fontIconCDSize) or defOpt.fontSize
columnFrame.fontIconCDName = (not fontOtherAvailable and fontOpts.fontName) or (fontOtherAvailable and fontOpts.fontIconCDName) or defOpt.fontName
columnFrame.fontIconCDOutline = (not fontOtherAvailable and fontOpts.fontOutline) or (fontOtherAvailable and fontOpts.fontIconCDOutline)
columnFrame.fontIconCDShadow = (not fontOtherAvailable and fontOpts.fontShadow) or (fontOtherAvailable and fontOpts.fontIconCDShadow)
columnFrame.fontCDSize = (not currColOpt.fontGeneral and currColOpt.fontCDSize) or (currColOpt.fontGeneral and generalOpt.fontCDSize) or defOpt.fontCDSize
for j=1,3 do
for n=1,3 do
local object = colorSetupFrameColorsObjectsNames[j]
local state = colorSetupFrameColorsNames[n]
if not columnFrame["optionColor"..object..state] then
columnFrame["optionColor"..object..state] = {}
end
columnFrame["optionColor"..object..state].r = (not currColOpt.textureGeneral and currColOpt["textureColor"..object..state.."R"]) or (currColOpt.textureGeneral and generalOpt["textureColor"..object..state.."R"]) or defOpt["textureColor"..object..state.."R"]
columnFrame["optionColor"..object..state].g = (not currColOpt.textureGeneral and currColOpt["textureColor"..object..state.."G"]) or (currColOpt.textureGeneral and generalOpt["textureColor"..object..state.."G"]) or defOpt["textureColor"..object..state.."G"]
columnFrame["optionColor"..object..state].b = (not currColOpt.textureGeneral and currColOpt["textureColor"..object..state.."B"]) or (currColOpt.textureGeneral and generalOpt["textureColor"..object..state.."B"]) or defOpt["textureColor"..object..state.."B"]
end
end
columnFrame.optionAlphaBackground = (not currColOpt.textureGeneral and currColOpt.textureAlphaBackground) or (currColOpt.textureGeneral and generalOpt.textureAlphaBackground) or defOpt.textureAlphaBackground
columnFrame.optionAlphaTimeLine = (not currColOpt.textureGeneral and currColOpt.textureAlphaTimeLine) or (currColOpt.textureGeneral and generalOpt.textureAlphaTimeLine) or defOpt.textureAlphaTimeLine
columnFrame.optionAlphaCooldown = (not currColOpt.textureGeneral and currColOpt.textureAlphaCooldown) or (currColOpt.textureGeneral and generalOpt.textureAlphaCooldown) or defOpt.textureAlphaCooldown
columnFrame.ATFenabled = currColOpt.ATF
if currColOpt.ATF then
local ATFPos = currColOpt.ATFPos
local ATFGrowth = currColOpt.ATFGrowth or defOpt.ATFGrowth
local ATFPoint1,ATFPoint2 = "BOTTOMRIGHT", "BOTTOMLEFT"
local ATFPointCol1,ATFPointCol2 = "LEFT", "RIGHT"
local ATFPointLine1,ATFPointLine2 = "BOTTOM", "TOP"
local ATFBetweenLinesCol, ATFBetweenLinesLine = -frameBetweenLines, frameBetweenLines
if ATFPos == 1 then
ATFPoint1,ATFPoint2 = "BOTTOMRIGHT", "BOTTOMLEFT"
ATFPointCol1,ATFPointCol2 = "RIGHT", "LEFT"
ATFPointLine1,ATFPointLine2 = "BOTTOM", "TOP"
ATFBetweenLinesCol, ATFBetweenLinesLine = -frameBetweenLines, frameBetweenLines
elseif ATFPos == 2 then
ATFPoint1,ATFPoint2 = "TOPRIGHT", "TOPLEFT"
ATFPointCol1,ATFPointCol2 = "RIGHT", "LEFT"
ATFPointLine1,ATFPointLine2 = "TOP", "BOTTOM"
ATFBetweenLinesCol, ATFBetweenLinesLine = -frameBetweenLines, -frameBetweenLines
elseif ATFPos == 3 then
ATFPoint1,ATFPoint2 = "BOTTOMLEFT", "TOPLEFT"
ATFPointCol1,ATFPointCol2 = "LEFT", "RIGHT"
ATFPointLine1,ATFPointLine2 = "BOTTOM", "TOP"
ATFBetweenLinesCol, ATFBetweenLinesLine = frameBetweenLines, frameBetweenLines
elseif ATFPos == 4 then
ATFPoint1,ATFPoint2 = "BOTTOMRIGHT", "TOPRIGHT"
ATFPointCol1,ATFPointCol2 = "RIGHT", "LEFT"
ATFPointLine1,ATFPointLine2 = "BOTTOM", "TOP"
ATFBetweenLinesCol, ATFBetweenLinesLine = -frameBetweenLines, frameBetweenLines
elseif ATFPos == 5 then
ATFPoint1,ATFPoint2 = "TOPLEFT", "TOPRIGHT"
ATFPointCol1,ATFPointCol2 = "LEFT", "RIGHT"
ATFPointLine1,ATFPointLine2 = "TOP", "BOTTOM"
ATFBetweenLinesCol, ATFBetweenLinesLine = frameBetweenLines, -frameBetweenLines
elseif ATFPos == 6 then
ATFPoint1,ATFPoint2 = "BOTTOMLEFT", "BOTTOMRIGHT"
ATFPointCol1,ATFPointCol2 = "LEFT", "RIGHT"
ATFPointLine1,ATFPointLine2 = "TOP", "BOTTOM"
ATFBetweenLinesCol, ATFBetweenLinesLine = frameBetweenLines, frameBetweenLines
elseif ATFPos == 7 then
ATFPoint1,ATFPoint2 = "TOPRIGHT", "BOTTOMRIGHT"
ATFPointCol1,ATFPointCol2 = "RIGHT", "LEFT"
ATFPointLine1,ATFPointLine2 = "TOP", "BOTTOM"
ATFBetweenLinesCol, ATFBetweenLinesLine = -frameBetweenLines, -frameBetweenLines
elseif ATFPos == 8 then
ATFPoint1,ATFPoint2 = "TOPLEFT", "BOTTOMLEFT"
ATFPointCol1,ATFPointCol2 = "LEFT", "RIGHT"
ATFPointLine1,ATFPointLine2 = "TOP", "BOTTOM"
ATFBetweenLinesCol, ATFBetweenLinesLine = frameBetweenLines, frameBetweenLines
elseif ATFPos == 9 then
ATFPoint1,ATFPoint2 = "CENTER", "CENTER"
ATFPointCol1,ATFPointCol2 = "LEFT", "RIGHT"
ATFPointLine1,ATFPointLine2 = "TOP", "BOTTOM"
ATFBetweenLinesCol, ATFBetweenLinesLine = frameBetweenLines, -frameBetweenLines
end
if ATFGrowth == 2 then
ATFPointCol1,ATFPointCol2,ATFPointLine1,ATFPointLine2 = ATFPointLine1,ATFPointLine2,ATFPointCol1,ATFPointCol2
end
columnFrame.ATFPoint1 = ATFPoint1
columnFrame.ATFPoint2 = ATFPoint2
columnFrame.ATFPointCol1 = ATFPointCol1
columnFrame.ATFPointCol2 = ATFPointCol2
columnFrame.ATFPointLine1 = ATFPointLine1
columnFrame.ATFPointLine2 = ATFPointLine2
columnFrame.ATFBetweenLinesCol = ATFBetweenLinesCol
columnFrame.ATFBetweenLinesLine = ATFBetweenLinesLine
columnFrame.ATFCol = ATFGrowth == 2 and (currColOpt.ATFLines or defOpt.ATFLines) or (currColOpt.ATFCol or defOpt.ATFCol)
columnFrame.ATFMax = (currColOpt.ATFLines or defOpt.ATFLines) * (currColOpt.ATFCol or defOpt.ATFCol)
columnFrame.ATFOffsetX = currColOpt.ATFOffsetX or defOpt.ATFOffsetX
columnFrame.ATFOffsetY = currColOpt.ATFOffsetY or defOpt.ATFOffsetY
columnFrame.ATFGrowth = ATFGrowth
local framePriorOpt
if currColOpt.ATFFramePrior then
local new = ExRT.F.table_find3(module.db.rframes, currColOpt.ATFFramePrior, "name")
if new then
new = new.opts
framePriorOpt = ExRT.F.table_copy2(module.db.rframes_def)
for j=#new,1,-1 do
tinsert(framePriorOpt,1,new[j])
end
framePriorOpt = {
framePriorities = framePriorOpt,
}
end
end
columnFrame.ATFFramePrior = framePriorOpt
--rewrite something for fix
columnFrame.optionCooldown = true
columnFrame.optionHideSpark = true
columnFrame.iconSize = currColOpt.iconSize or defOpt.iconSize
columnFrame.barWidth = columnFrame.iconSize + 0.001
columnFrame.textTemplateLeft = ""
columnFrame.textTemplateRight = ""
columnFrame.textTemplateCenter = ""
columnFrame.optionIconTitles = false
columnFrame.optionTimeLineAnimation = 1
columnFrame.methodsNewSpellNewLine = false
columnFrame.texture:SetColorTexture(0,0,0,0)
end
local isMasqueEnabled = (not currColOpt.iconGeneral and currColOpt.iconMasque) or (currColOpt.iconGeneral and generalOpt.iconMasque)
if isMasqueEnabled and module.db.Masque then
if not columnFrame.Masque_Group then
columnFrame.Masque_Group = module.db.Masque:Group("MRT", "Raid cooldowns Col "..columnFrame.colNum)
end
elseif columnFrame.Masque_Group then
columnFrame.Masque_Group:Delete()
columnFrame.Masque_Group = nil
end
if currColOpt.enabled then
for n=1,#columnFrame.lines do
local line = columnFrame.lines[n]
line:UpdateStyle()
if line:IsShown() then
line:UpdateStatus()
end
end
local frameAnchorBottom = (not currColOpt.methodsGeneral and currColOpt.frameAnchorBottom) or (currColOpt.methodsGeneral and generalOpt.frameAnchorBottom)
local frameAnchorRightToLeft = (not currColOpt.methodsGeneral and currColOpt.frameAnchorRightToLeft) or (currColOpt.methodsGeneral and generalOpt.frameAnchorRightToLeft)
local lastLine = nil
for n=1,linesTotal do
local line
local colLine = columnFrame.lines[n]
if columnFrame.ATFenabled then
line = 1
elseif frameAnchorBottom then
local inLine = (n-1) % frameColumns
line = ((n-1) - inLine) / frameColumns
colLine:ClearAllPoints()
if frameAnchorRightToLeft then
colLine:SetPoint("BOTTOMRIGHT", -inLine*frameWidth, line*columnFrame.iconSize+line*frameBetweenLines)
else
colLine:SetPoint("BOTTOMLEFT", inLine*frameWidth, line*columnFrame.iconSize+line*frameBetweenLines)
end
colLine.ATFanchored = nil
else
local inLine = (n-1) % frameColumns
line = ExRT.F.Round( ((n-1) - inLine) / frameColumns )
colLine:ClearAllPoints()
if frameAnchorRightToLeft then
colLine:SetPoint("TOPRIGHT", -inLine*frameWidth, -line*columnFrame.iconSize-line*frameBetweenLines)
else
colLine:SetPoint("TOPLEFT", inLine*frameWidth, -line*columnFrame.iconSize-line*frameBetweenLines)
end
colLine.ATFanchored = nil
end
if line ~= lastLine then
colLine.IsNewLine = true
else
colLine.IsNewLine = nil
end
lastLine = line
end
if columnFrame.Masque_Group then
columnFrame.Masque_Group:ReSkin(true)
end
end
if currColOpt.enabled and VMRT.ExCD2.enabled then
columnFrame.optionIsEnabled = true
columnFrame:Show()
else
columnFrame.optionIsEnabled = nil
columnFrame:Hide()
end
if currColOpt.ATF then
columnFrame:ClearAllPoints()
columnFrame:SetPoint("LEFT",UIParent,"RIGHT",-2000, 0)
elseif not VMRT.ExCD2.SplitOpt and mainWidth then
columnFrame:ClearAllPoints()
columnFrame:SetPoint("TOPLEFT",module.frame,mainWidth, 0)
else
if currColOpt.posX and currColOpt.posY then
columnFrame:ClearAllPoints()
columnFrame:SetPoint("TOPLEFT",UIParent,"BOTTOMLEFT",currColOpt.posX,currColOpt.posY)
else
columnFrame:ClearAllPoints()
columnFrame:SetPoint("CENTER",UIParent,"CENTER",0,0)
end
end
columnFrame.Gwidth = frameWidth*frameColumns
end
do --unsafe check
local Masque, MSQ_Version = LibStub("Masque", true)
if Masque then
module.db.Masque = Masque
end
end
local lastSplitsReload = 0
function module:ReloadAllSplits(argScaleFix)
local _ctime = GetTime()
if lastSplitsReload > _ctime then
return
end
lastSplitsReload = _ctime + 0.05
local Width = 0
local maxHeight = 0
local generalOpt = VMRT.ExCD2.colSet[module.db.maxColumns+1]
local defOpt = module.db.colsDefaults
for i=1,module.db.maxColumns do
local columnFrame = module.frame.colFrame[i]
local currColOpt = VMRT.ExCD2.colSet[i]
module:ColApplyStyle(columnFrame,currColOpt,generalOpt,defOpt,Width,argScaleFix)
if currColOpt.enabled and not currColOpt.ATF then
if columnFrame.Gheight > maxHeight then
maxHeight = columnFrame.Gheight
end
Width = Width + columnFrame.Gwidth
end
end
module.frame:SetWidth(Width)
module.frame:SetHeight(maxHeight)
module.frame:SetAlpha((generalOpt.frameAlpha or defOpt.frameAlpha)/100)
if argScaleFix == "ScaleFix" then
ExRT.F.SetScaleFix(module.frame,(generalOpt.frameScale or defOpt.frameScale)/100)
else
module.frame:SetScale((generalOpt.frameScale or defOpt.frameScale)/100)
end
module.frame:SetFrameStrata(generalOpt.frameStrata or defOpt.frameStrata)
module:updateCombatVisibility()
module:ATFFrameDataReset()
UpdateAllData()
end
function module:SplitExCD2Window()
if VMRT.ExCD2.SplitOpt then
for i=1,module.db.maxColumns do
module.frame.colFrame[i]:SetParent(UIParent)
module.frame.colFrame[i]:EnableMouse(false)
end
module.frame:Hide()
else
for i=1,module.db.maxColumns do
module.frame.colFrame[i]:SetParent(module.frame)
ExRT.F.LockMove(module.frame.colFrame[i],nil,module.frame.colFrame[i].lockTexture)
ExRT.lib.AddShadowComment(module.frame.colFrame[i],1)
end
module.frame:Show()
end
end
function module:UpdateLockState()
if VMRT.ExCD2.lock then
ExRT.F.LockMove(module.frame,nil,module.frame.texture)
ExRT.lib.AddShadowComment(module.frame,1)
if VMRT.ExCD2.SplitOpt then
for i=1,module.db.maxColumns do
ExRT.F.LockMove(module.frame.colFrame[i],nil,module.frame.colFrame[i].lockTexture)
ExRT.lib.AddShadowComment(module.frame.colFrame[i],1)
end
end
else
ExRT.F.LockMove(module.frame,true,module.frame.texture)
ExRT.lib.AddShadowComment(module.frame,nil,L.cd2)
if VMRT.ExCD2.SplitOpt then
for i=1,module.db.maxColumns do
ExRT.F.LockMove(module.frame.colFrame[i],true,module.frame.colFrame[i].lockTexture)
ExRT.lib.AddShadowComment(module.frame.colFrame[i],nil,L.cd2,i,72,"OUTLINE")
end
end
end
end
function module:slash(arg1,arg2)
if string.find(arg1,"runcd ") then
local sid,name = arg2:match("%a+ (%d+) (.+)")
if sid and name then
print("Run CD "..sid.." by "..name)
sid = tonumber(sid)
local line = module.db.cdsNav[name][sid]
if line then
CLEUstartCD(line)
end
end
elseif string.find(arg1,"resetcd ") then
local sid,name = arg2:match("%a+ (%d+) (.+)")
if sid and name then
print("Reset CD "..sid.." by "..name)
sid = tonumber(sid)
local j = module.db.cdsNav[name][sid]
if j then
j:SetCD(0)
end
end
elseif arg1 == "cd" then
if not VMRT.ExCD2.enabled then
module:Enable()
else
module:Disable()
end
if module.options.chkEnable then
module.options.chkEnable:SetChecked(VMRT.ExCD2.enabled)
end
end
end
--{id, "class,cat1,cat2", col all specs, spec1, spec2={spellid,cd,duration},spec3,spec4 }, --name
module.db.AllSpells = {
{107574,"WARRIOR,DPS",3,--Аватара
{107574,90,20},
isTalent=true,cdDiff={296320,"*0.80"},durationDiff={400314,"*2"}},
{6673, "WARRIOR",1,--Боевой крик
{6673,15,0},nil,nil,nil},
{18499, "WARRIOR,DEF",4,--Ярость берсерка
{18499,60,6},nil,nil,nil,
isTalent=true},
--227847 Bladestorm found in 444780 When you Execute a target that you've Marked for Execution, you both reduce the cooldown of Bladestorm by 5 sec and apply 2 stacks of Overwhelmed to the target per stack of Marked for Execution consumed.
{227847,"WARRIOR,DPS",3,--Вихрь клинков
nil,{227847,90,6},nil,nil,
isTalent=true,cdDiff={296320,"*0.80",236308,"*0.67"},hasCharges=382953,hideWithTalent=152277,reduceCdAfterCast={{1715,152278,71},-0.5,{1464,152278,71},-1,{330334,152278,71},-1.5,{2565,152278,71},-1.5,{12294,152278,71},-1.5,{190456,152278,71},-2,{1680,152278,71},-1.5,{163201,152278,71},-1.5}},
{1161, "WARRIOR,TAUNT",5,--Вызывающий крик
nil,nil,nil,{1161,120,0},
isTalent=true},
{386071,"WARRIOR,TAUNT",5,--Disrupting Shout
nil,nil,nil,{386071,75,0},
isTalent=true},
{100, "WARRIOR",3,--Рывок
{100,20,0},nil,nil,nil,
hasCharges=103827,cdDiff={103827,-3}},
{167105,"WARRIOR",3,--Удар колосса
nil,{167105,45,10},nil,nil,
isTalent=true,hideWithTalent=262161,durationDiff={383442,3},reduceCdAfterCast={{1715,152278,71},-0.5,{1464,152278,71},-1,{330334,152278,71},-1.5,{2565,152278,71},-1.5,{12294,152278,71},-1.5,{190456,152278,71},-2,{1680,152278,71},-1.5,{163201,152278,71},-1.5},increaseDurAfterCast={{317349,354131},1.5}},
{1160, "WARRIOR,DEFTANK",4,--Деморализующий крик
nil,nil,nil,{1160,45,8},
isTalent=true,cdDiff={199023,-15},
CLEU_PREP = [[
spell335229_var = {}
]],CLEU_SPELL_DAMAGE=[[
if spellID == 6343 and (session_gGUIDs[sourceName][335229] or session_gGUIDs[sourceName][385840]) then
local sourceData = spell335229_var[sourceName]
if not sourceData then
sourceData = {0,0}
spell335229_var[sourceName] = sourceData
end
local t=GetTime()
if (t - sourceData[1]) > 2 then
sourceData[1] = t
sourceData[2] = 0
end
sourceData[2] = sourceData[2] + 1
if sourceData[2] <= 3 then
local line = CDList[sourceName][1160]
if line then
line:ReduceCD(1.5)
end
end
end
]]},
{376079,"WARRIOR",3,--Копье Бастиона
{376079,90,4},
isTalent=true,durationDiff={386284,2}},
{384318,"WARRIOR",3,--Громогласный рык
{384318,90,0},
isTalent=true,cdDiff={391572,-45}},
{118038,"WARRIOR,DEF",4,--Бой насмерть
nil,{118038,120,8},nil,nil,
isTalent=true,cdDiff={383338,-30,334993,{-20,-22,-24,-26,-28,-30,-32,-34,-36,-38,-40,-42,-44,-46,-48},391271,"*0.95"}},
{184364,"WARRIOR,DEF",4,--Безудержное восстановление
nil,nil,{184364,120,8},nil,
isTalent=true,cdDiff={334993,{-20,-22,-24,-26,-28,-30,-32,-34,-36,-38,-40,-42,-44,-46,-48},391271,"*0.95"},durationDiff={383468,3}},
{6544, "WARRIOR,MOVE",4,--Героический прыжок
{52174,45,0},nil,nil,nil,
isTalent=true,hasCharges=335214,startCdAfterAuraFadeExt=280746,ignoreUseWithAura=375258,changeCdWithAura={381758,"*0.85"},cdDiff={202163,-15},reduceCdAfterCast={{100,444777},-2}},
{57755, "WARRIOR",3,--Героический бросок
{57755,6,0},nil,nil,nil,
isTalent=true},
{3411, "WARRIOR,DEFTAR",2,--Вмешательство
{3411,30,6},nil,nil,nil,
isTalent=true,cdDiff={391271,"*0.95"}},
{5246, "WARRIOR,AOECC",1,--Устрашающий крик
{5246,90,8},nil,nil,nil,
isTalent=true,durationDiff={275338,7}},
{12975, "WARRIOR,DEFTANK",4,--Ни шагу назад
nil,nil,nil,{12975,180,15},
isTalent=true,cdDiff={280001,-60},increaseDurAfterCast={{317349,354131},3}},
{12323, "WARRIOR",3,--Пронзительный вой
{12323,30,8},
isTalent=true,cdDiff={339948,{-5,-6,-6,-7,-7,-8,-8,-9,-9,-10,-10,-11,-11,-12,-12}}},
{384100,"WARRIOR,UTIL",3,--Крик берсерка
{384100,60,8},
isTalent=true},
{6552, "WARRIOR,KICK",5,--Зуботычина
{6552,15,0},nil,nil,nil,
cdDiff={383115,-1}},
{97462, "WARRIOR,RAID",1,--Ободряющий клич
{97462,180,10},nil,nil,nil,
isTalent=true,durationDiff={382310,3,335034,{"*1.20","*1.22","*1.24","*1.26","*1.28","*1.30","*1.32","*1.34","*1.36","*1.38","*1.40","*1.42","*1.44","*1.46","*1.48"}},cdDiff={235941,-90}},
{1719, "WARRIOR,DPS",3,--Безрассудство
nil,nil,{1719,90,12},nil,
isTalent=true,durationDiff={337162,{"*1.20","*1.215","*1.23","*1.245","*1.26","*1.275","*1.29","*1.305","*1.32","*1.335","*1.35","*1.365","*1.38","*1.395","*1.41"},383922,4},cdDiff={296320,"*0.80"},reduceCdAfterCast={{1715,152278,72},-0.5,{184367,152278,72},-4,{1464,152278,72},-1,{330334,152278,72},-1.5,{2565,152278,72},-1.5,{190456,152278,72},-3,{163201,152278,72},-1.5},increaseDurAfterCast={{317349,354131},1.5}},
{385059,"WARRIOR,DPS",3,--Ярость Одина
nil,nil,{385059,45,0},nil,
isTalent=true},
{64382, "WARRIOR,UTIL",3,--Сокрушительный бросок
{64382,180,0},nil,nil,nil,
isTalent=true,cdDiff={329033,"*0.5"}},
{384110,"WARRIOR",3,--Сокрушительный бросок
{384110,45,0},nil,nil,nil,
isTalent=true},
{2565, "WARRIOR",4,--Блок щитом
{2565,16,0},nil,nil,nil,
hasCharges=1,changeCdWithHaste=true,increaseDurAfterCast={{23922,203177},1}},
{871, "WARRIOR,DEFTANK",4,--Глухая оборона
nil,nil,nil,{871,210,8},
isTalent=true,hasCharges=397103,cdDiff={334993,{-20,-22,-24,-26,-28,-30,-32,-34,-36,-38,-40,-42,-44,-46,-48},397103,-30,391271,"*0.95"},reduceCdAfterCast={{23922,384072},-5,{1715,152278,73},-1,{23922,335239},-5,{330334,152278,73},-3,{2565,152278,73},-3,{190456,152278,73},-4,{1680,152278,73},-3,{163201,152278,73},-3}},
{46968, "WARRIOR,AOECC",1,--Ударная волна
{46968,40,2},
isTalent=true,cdDiff={339948,{-5,-6,-6,-7,-7,-8,-8,-9,-9,-10,-10,-11,-11,-12,-12},440992,-5},
CLEU_PREP=[[
spell46968_var = {}
]],CLEU_SPELL_DAMAGE=[[
if spellID == 46968 and sourceName and session_gGUIDs[sourceName][275339] then
local sourceData = spell46968_var[sourceName]
if not sourceData then
sourceData = {0,0}
spell46968_var[sourceName] = sourceData
end
local t=GetTime()
if (t - sourceData[1]) > 2 then
sourceData[1] = t
sourceData[2] = 0
end
sourceData[2] = sourceData[2] + 1
if sourceData[2] == 3 then
local line = CDList[sourceName][46968]
if line then
line:ChangeCD(-15)
end
end
end
]]},
{23920, "WARRIOR,DEFTANK",4,--Отражение заклинаний
nil,{23920,25,0},{23920,25,0},{23920,20,0},
isTalent=true,cdDiff={391271,"*0.95"}},
{260708,"WARRIOR,DPS",3,--Размашистые удары
nil,{260708,30,15},nil,nil},
{355, "WARRIOR,TAUNT",5,--Провокация
{355,8,0},nil,nil,nil,
hideWithTalent=205800},
{46924, "WARRIOR,DPS",3,--Вихрь клинков
nil,nil,{46924,60,4},nil,
isTalent=true},
{262228,"WARRIOR,DPS",3,--Смертельное спокойствие
nil,{262228,60,6},nil,nil,
isTalent=true},
{118000,"WARRIOR",3,--Рев дракона
nil,nil,{118000,30,0},{118000,30,0},
isTalent=true},
{202168,"WARRIOR,DEF",3,--Верная победа
{202168,30,0},nil,nil,nil,
isTalent=true},
{228920,"WARRIOR,DPS",3,--Опустошитель
{228920,90,10},nil,nil,nil,
isTalent=true,hasCharges=382953,reduceCdAfterCast={{1715,152278,72},-0.5,{184367,152278,72},-4,{1464,152278,72},-1,{330334,152278,72},-1.5,{2565,152278,72},-1.5,{190456,152278,72},-3,{163201,152278,72},-1.5}},
{280772,"WARRIOR",3,--Прорыв блокады
nil,nil,{280772,30,10},nil,
isTalent=true},
{260643,"WARRIOR",3,--Рассекатель черепов
nil,{260643,30,0},nil,nil,
isTalent=true,changeCdWithHaste=true},
{107570,"WARRIOR,CC",3,--Удар громовержца
{107570,30,0},nil,nil,nil,
isTalent=true,cdDiff={391271,"*0.95"},cdDiff={436162,10}},
{262161,"WARRIOR,DPS",3,--Миротворец
nil,{262161,45,10},nil,nil,
isTalent=true},
{329038,"WARRIOR,PVP",3,--Кровавая ярость
nil,nil,{329038,20,4},nil,
isTalent=true},
{213871,"WARRIOR,PVP",3,--Телохранитель
nil,nil,nil,{213871,15,0},
isTalent=true},
{199261,"WARRIOR,PVP",3,--Инстинкт смерти
nil,nil,{199261,4,0},nil,
isTalent=true},
{236077,"WARRIOR,PVP",3,--Обезоруживание
{236077,45,5},nil,nil,nil,
isTalent=true},
{206572,"WARRIOR,PVP",3,--Рывок дракона
nil,nil,nil,{206572,20,0},
isTalent=true},
{236273,"WARRIOR,PVP",3,--Дуэль
nil,{236273,60,8},nil,nil,
isTalent=true},
{205800,"WARRIOR,PVP",3,--Угнетатель
nil,nil,nil,{205800,20,0},
isTalent=true},
{198817,"WARRIOR,PVP",3,--Заточка клинка
nil,{198817,30,0},nil,nil,
isTalent=true},
{198912,"WARRIOR,PVP",3,--Удар щитом
nil,nil,nil,{198912,10,0},
isTalent=true},
{236320,"WARRIOR,PVP",3,--Боевое знамя
nil,{236320,90,15},nil,nil,
isTalent=true},
{391054,"PALADIN,RES",1,--Заступничество
{391054,600,0},nil,nil,nil,
isBattleRes=true},
{31850, "PALADIN,DEFTANK",4,--Ревностный защитник
nil,nil,{31850,120,8},nil,
isTalent=true,cdDiff={114154,"*0.7"},reduceCdAfterCast={{53600,340023},{-1,-1.1,-1.2,-1.3,-1.4,-1.5,-1.6,-1.7,-1.8,-1.9,-2,-2.1,-2.2,-2.3,-2.4},{85673,385422},{-1,-2},{53600,385422},{-1,-2},{85256,385422},{-1,-2},{53385,385422},{-1,-2},{215661,385422},{-1,-2}},increaseDurAfterCast={{53600,340023},2},changeCdAfterAuraFullDur={{31850,337838},"*0.6"}},
{31821, "PALADIN,RAID",1,--Владение аурами
nil,{31821,180,8},nil,nil,
isTalent=true,cdDiff={199324,-60,392911,-30}},
{31935, "PALADIN,KICK",3,--Щит мстителя
nil,nil,{31935,15,0},nil,
isTalent=true,changeCdWithHaste=true,changeCdWithAura={327193,"*0.25"},
CLEU_PREP=[[
--avengershield_var = {} --hardcoded
]],CLEU_SPELL_CAST_SUCCESS=[[
if spellID == 35395 then
avengershield_var[sourceGUID] = GetTime()
elseif spellID == 204019 then
avengershield_var[sourceGUID] = GetTime()
elseif spellID == 31935 and session_gGUIDs[sourceName][337831] then --Avenger's Shield
avengershield_var[sourceGUID] = GetTime()
end
]],CLEU_SPELL_MISSED=[[
if destGUID and isPaladin[destGUID] and destName and missType == "DODGE" then
avengershield_var[destGUID] = GetTime()
end
]]
},
{31884, "PALADIN,RAID,DPS",1,--Гнев карателя
nil,{31884,120,20},{31884,120,20},{31884,60,20},
durationDiff={231895,10,286229,5,406872,3,53376,"*1.25"},cdDiff={231895,60,296320,"*0.80"},sameSpell={31884,231895,389539},sameTalent={231895},hideWithTalent={216331,458359},icon="Interface\\Icons\\spell_holy_avenginewrath",reduceCdAfterCast={{53600,204074},-2,{85673,204074},-2,{53600,204074},-2,{85256,204074},-2,{53385,204074},-2,{215661,204074},-2},increaseDurAfterCast={{24275,391142},1,{24275,337594},1,{24275,332806},3}},
{1044, "PALADIN,DEFTAR",2,--Благословенная свобода
{1044,25,8},nil,nil,nil,
isTalent=true,hasCharges=199454,reduceCdAfterCast={{85256,337600},-3,{85222,337600},-3,{85673,337600},-3,{53385,337600},-3,{152262,337600},-3,{53600,337600},-3}},
{1022, "PALADIN,DEFTAR",2,--Благословение защиты
{1022,300,10},nil,nil,nil,
isTalent=true,hasCharges=199454,cdDiff={384909,-60,216853,"*0.67",378425,{"*0.85","*0.7"}},sameSpell={1022,204018},icon="Interface\\Icons\\spell_holy_sealofprotection",reduceCdAfterCast={{85256,337600},-3,{85222,337600},-3,{85673,337600},-3,{53385,337600},-3,{152262,337600},-3,{53600,337600},-3}},
{6940, "PALADIN,DEFTAR",2,--Жертвенное благословение
{6940,120,12},nil,nil,nil,
isTalent=true,cdDiff={384820,-60,216853,"*0.67"},durationDiff={199452,-6},stopDurWithAuraFade=6940,reduceCdAfterCast={{85256,337600},-3,{85222,337600},-3,{85673,337600},-3,{53385,337600},-3,{152262,337600},-3,{53600,337600},-3}},
{4987, "PALADIN,DISPEL",5,--Очищение
nil,{4987,8,0},nil,nil,
isDispel=true},
{213644,"PALADIN,DISPEL",5,--Очищение от токсинов
nil,nil,{213644,8,0},{213644,8,0},
isTalent=true,isDispel=true},
{498, "PALADIN,DEF",4,--Божественная защита
nil,{498,60,8},nil,{498,60,8},
cdDiff={114154,"*0.7"},icon=524353},
{642, "PALADIN,DEF",2,--Божественный щит
{642,300,8},nil,nil,nil,
cdDiff={114154,"*0.7",332542,"*0.4",378425,{"*0.85","*0.7"}},stopDurWithAuraFade=642,reduceCdAfterCast={{85673,385422},{-1,-2},{53600,385422},{-1,-2},{85256,385422},{-1,-2},{53385,385422},{-1,-2},{215661,385422},{-1,-2}},
CLEU_PREP = [[
spell338741_var = {}
]],CLEU_SPELL_DAMAGE=[[
if destGUID and isPaladin[destGUID] and destName and session_gGUIDs[destName][338741] then
local now = GetTime()
if not spell338741_var[destGUID] or (now > spell338741_var[destGUID]) then
local soulbind_rank = _db.soulbind_rank[destName][338741] or SOULBIND_DEF_RANK_NOW
spell338741_var[destGUID] = now + (50 - soulbind_rank * 2)
local line = CDList[destName][642]
if line then
line:ReduceCD(5)
end
end
end
]]},
{190784,"PALADIN,MOVE",4,--Божественный скакун
{190784,45,3},nil,nil,nil,
isTalent=true,hasCharges=230332,durationDiff={432990,2,376996,2,335424,3,199542,2,339268,{"*1.50","*1.55","*1.60","*1.65","*1.70","*1.75","*1.80","*1.85","*1.90","*1.95","*2.00","*2.05","*2.10","*2.15","*2.20"}},ignoreUseWithAura=375253,changeCdWithAura={381752,"*0.85"}},
{86659, "PALADIN,DEFTANK",4,--Защитник древних королей
nil,nil,{86659,300,8},nil,
isTalent=true,cdDiff={340030,{-15,-16.5,-18,-19.5,-21,-22.5,-24,-25.5,-27,-28.5,-30,-31.5,-33,-34.5,-36}},hideWithTalent=228049,sameSpell={86659,212641},reduceCdAfterCast={{53600,204074},-2,{85673,204074},-2,{53600,204074},-2,{85256,204074},-2,{53385,204074},-2,{215661,204074},-2},
CLEU_SPELL_DAMAGE=[[
if spellID == 31935 and session_gGUIDs[sourceName][378279] then
local line = CDList[sourceName][86659]
if line then
local timeReduce = (_db.talent_classic_rank[sourceName][378279] or 2)*0.5
line:ReduceCD(timeReduce)
end
end
]]},
{853, "PALADIN",3,--Молот правосудия
{853,60,6},nil,nil,nil,
reduceCdAfterCast={{85673,234299},{-3,-6},{53600,234299},{-3,-6},{85256,234299},{-3,-6},{53385,234299},{-3,-6},{215661,234299},{-3,-6}}},
{183218,"PALADIN",3,--Преграждающая длань
nil,nil,nil,{183218,30,10},
CLEU_PREP=[[
handOfHind_var = {}
]],CLEU_SPELL_AURA_REMOVED=[[
if spellID == 183218 and destGUID then --Hand of Hindrance pvp
handOfHind_var[destGUID] = sourceName
end
]],CLEU_SPELL_DISPEL=[[
if destSpell == 183218 and destGUID then
local name = handOfHind_var[destGUID]
if name and session_gGUIDs[name][204934] and module.IsPvpTalentsOn(name) then
local line = CDList[name][183218]
if line then
line:ReduceCD(15)
end
end
end
]]},
{62124, "PALADIN,TAUNT",5,--Длань расплаты
{62124,8,0},nil,nil,nil,
hideWithTalent=207028},
{20473, "PALADIN",3,--Шок небес
nil,{20473,8.5,0},nil,nil,
cdDiff={332401,-1.5,53376,{"*0.8",31884}},changeCdWithHaste=true,reduceCdAfterCast={{35395,196926},-1},
CLEU_SPELL_AURA_REMOVED=[[
if spellID == 54149 and destName and session_gGUIDs[destName][392961] then
local line = CDList[destName][20473]
if line then
line:ReduceCD(1)
end
end
]]},
{633, "PALADIN,DEFTAR",2,--Возложение рук
{633,600,0},nil,nil,nil,
isTalent=true,cdDiff={114154,"*0.7",378425,{"*0.85","*0.7"}},reduceCdAfterCast={{85673,392928},-3,{53600,392928},-3,{85256,392928},-3,{53385,392928},-3,{85673,414720},-4.5,{53600,414720},-4.5,{85256,414720},-4.5,{53385,414720},-4.5,{85222,414720},-4.5},
CLEU_SPELL_HEAL=[[
if spellID == 633 and session_gGUIDs[sourceName][326734] then
local line = CDList[sourceName][633]
if line then
local maxHP = UnitHealthMax(destName) or 0
if maxHP ~= 0 then
local hpB4 = maxHP - (amount-overhealing)
if hpB4 < 0 then
hpB4 = 0
end
local val = 1 - hpB4 / maxHP
line:SetCD((line.cd or 0) * (1 - val * 0.6))
end
end
end
]]},
{96231, "PALADIN,KICK",5,--Укор
{96231,15,0},nil,nil,nil,
isTalent=true},
{184662,"PALADIN,DEF",4,--Щит возмездия
nil,nil,nil,{184662,90,15},
isTalent=true,cdDiff={114154,"*0.7"},stopDurWithAuraFade=184662},
{10326, "PALADIN,CC",3,--Изгнание зла
{10326,15,40},nil,nil,nil,
isTalent=true},
{255937,"PALADIN,DPS",3,--Испепеляющий след
nil,nil,nil,{255937,30,0},
isTalent=true,hideWithTalent=384052},
{383469,"PALADIN,DPS",3,--Светозарный указ
nil,nil,nil,{383469,15,0},
isTalent=true},
{375576,"PALADIN,DPS",3,--Божественный благовест
{375576,60,0},nil,nil,nil,
isTalent=true,cdDiff={379391,-15}},
{343527,"PALADIN,DPS",3,--Смертный приговор
nil,nil,nil,{343527,30,8},
isTalent=true,increaseDurAfterCast={{85256,384162},1},durationDiff={406940,4}},
{216331,"PALADIN,RAID",1,--Рыцарь-мститель
nil,{216331,60,12},nil,nil,
isTalent=true},
{200025,"PALADIN",3,--Частица добродетели
nil,{200025,15,8},nil,nil,
isTalent=true},
{223306,"PALADIN",3,--Дарование веры
nil,{223306,12,5},nil,nil,
isTalent=true},
{148039,"PALADIN",3,--Барьер веры
nil,{148039,30,0},nil,nil,
isTalent=true},
{200652,"PALADIN,HEAL",3,--Избавление Тира
nil,{200652,90,10},nil,nil,
isTalent=true,
CLEU_PREP=[[
spell200652_var = {}
]],CLEU_SPELL_CAST_SUCCESS=[[
if spellID == 200652 then
spell200652_var[sourceName] = 40
elseif spellID == 19750 and session_gGUIDs[sourceName][392951] and IsAuraActive(destName,200654) then
local line = CDList[sourceName][200652]
if line and (spell200652_var[sourceName] or 0) > 0 then
spell200652_var[sourceName] = (spell200652_var[sourceName] or 40) - 4
if spell200652_var[sourceName] > 0 then
line:ChangeDur(4)
else
line:ChangeDur(4 + spell200652_var[sourceName])
end
end
elseif spellID == 82326 and session_gGUIDs[sourceName][392951] and IsAuraActive(destName,200654) then
local line = CDList[sourceName][200652]
if line and (spell200652_var[sourceName] or 0) > 0 then
spell200652_var[sourceName] = (spell200652_var[sourceName] or 40) - 8
if spell200652_var[sourceName] > 0 then
line:ChangeDur(8)
else
line:ChangeDur(8 + spell200652_var[sourceName])
end
end
elseif spellID == 20473 and session_gGUIDs[sourceName][392951] and IsAuraActive(destName,200654) then
local line = CDList[sourceName][200652]
if line and (spell200652_var[sourceName] or 0) > 0 then
spell200652_var[sourceName] = (spell200652_var[sourceName] or 40) - 2
if spell200652_var[sourceName] > 0 then
line:ChangeDur(2)
else
line:ChangeDur(2 + spell200652_var[sourceName])
end
end
end
]]},
{388007,"PALADIN",3,--Благословение лета
nil,{388007,45,0},nil,nil,
isTalent=true,sameSpell={388007,388010,388011,388013}},
{204018,"PALADIN,DEFTAR",2,--Благословение защиты от заклинаний
nil,nil,{204018,300,10},nil,
isTalent=true,cdDiff={384909,-60,216853,"*0.67",378425,{"*0.85","*0.7"}},sameSpell={1022,204018},reduceCdAfterCast={{85256,337600},-3,{85222,337600},-3,{85673,337600},-3,{53385,337600},-3,{152262,337600},-3,{53600,337600},-3}},
{115750,"PALADIN",3,--Слепящий свет
{115750,90,0},nil,nil,nil,
isTalent=true},
{205191,"PALADIN",3,--Око за око
nil,nil,nil,{205191,60,10},
isTalent=true},
{343721,"PALADIN",3,--Последний расчет
nil,nil,nil,{343721,60,8},
isTalent=true,durationDiff={406940,4}},
{105809,"PALADIN,HEAL,DPS",3,--Святой каратель
{105809,180,20},nil,nil,nil,
isTalent=true},
{114165,"PALADIN,HEAL",3,--Божественная призма
nil,{114165,30,0},nil,nil,
isTalent=true},
{114158,"PALADIN,HEAL",3,--Молот Света
nil,{114158,60,14},nil,nil,
isTalent=true},
{327193,"PALADIN,DEFTANK",3,--Минута славы
nil,nil,{327193,90,15},nil,
isTalent=true},
{387174,"PALADIN,DEFTANK",3,--Око Тира
nil,nil,{387174,60,9},nil,
isTalent=true,cdDiff={405757,"*0.75"}},
{378974,"PALADIN",3,--Бастион Света
nil,nil,{378974,120,0},nil,
isTalent=true},
{20066, "PALADIN,CC",3,--Покаяние
{20066,15,0},nil,nil,nil,
isTalent=true},
{414273,"PALADIN",3,
nil,{414273,90,0},nil,nil,
isTalent=true},
{198034,"PALADIN",3,
nil,nil,nil,{198034,120,0},
isTalent=true},
{210256,"PALADIN,PVP",3,--Благословение святилища
nil,nil,nil,{210256,45,5},
isTalent=true},
{236186,"PALADIN,PVP",3,--Очищающий свет
nil,nil,{236186,4,0},{236186,4,0},
isTalent=true,isDispel=true},
{210294,"PALADIN",3,--Божественное одобрение
nil,{210294,30,0},nil,nil,
isTalent=true},
{228049,"PALADIN,PVP",3,--Страж забытой королевы
nil,nil,{228049,300,10},nil,
isTalent=true},
{207028,"PALADIN,PVP",3,--Инквизиция
nil,nil,{207028,20,0},nil,
isTalent=true},
{215652,"PALADIN,PVP",3,--Щит добродетели
nil,nil,{215652,45,0},nil,
isTalent=true},
{410126,"PALADIN,PVP",3,
{410126,45,0},
isTalent=true},
{432459,"PALADIN",3,
{432459,60,0},
isTalent=true,cdDiff={432804,"*0.8"}},
{186257,"HUNTER,MOVE",4,--Дух гепарда
{186257,180,12},nil,nil,nil,
durationDiff={339558,3},cdDiff={266921,-30,339558,{-16,-17,-18,-19,-20,-21,-22,-23,-24,-25,-26,-27,-28,-29,-30},336742,"*0.65",203235,"*0.5"},ignoreUseWithAura=375238,changeCdWithAura={381749,"*0.85"}},
{186289,"HUNTER",3,--Дух орла
nil,nil,nil,{186289,90,15},
isTalent=true,cdDiff={266921,-30,336742,"*0.65"}},
{186265,"HUNTER,DEF",4,--Дух черепахи
{186265,180,8},nil,nil,nil,
cdDiff={266921,-30,339377,{-10,-11.5,-13,-14.5,-16,-17.5,-19,-20.5,-23,-24.5,-26,-27.5,-29,-30.5,-32},336742,"*0.65"},stopDurWithAuraFade=186265,reduceCdAfterCast={{19434,248443},-20}},
{193530,"HUNTER,DPS",3,--Дух дикой природы
nil,{193530,120,20},nil,nil,
isTalent=true,cdDiff={296320,"*0.80",336742,"*0.65"},
CLEU_SPELL_DAMAGE=[[
if spellID == 83381 and critical then
local petOwner = ExRT.F.Pets:getOwnerNameByGUID(sourceGUID)
if petOwner and session_gGUIDs[petOwner][339704] then
local line = CDList[petOwner][193530]
if line then
local soulbind_rank = _db.soulbind_rank[petOwner][339704] or SOULBIND_DEF_RANK_NOW
local timeReduce = 0.8 + soulbind_rank * 0.2
line:ReduceCD(timeReduce)
end
end
end
]]},
{359844,"HUNTER,DPS",3,--Зов дикой природы
nil,{359844,120,20},nil,nil,
isTalent=true},
{19574, "HUNTER,DPS",3,--Звериный гнев
nil,{19574,90,15},nil,nil,
isTalent=true,reduceCdAfterCast={{217200,231548},-12}},
{186387,"HUNTER",3,--Взрывной выстрел
{186387,30,0},
isTalent=true,
CLEU_PREP = [[
spell378771_var_186387 = {}
]],CLEU_SPELL_DAMAGE=[[
if destGUID and isHunter[destGUID] and destName and session_gGUIDs[destName][378771] then
local maxHP = UnitHealthMax(destName)
if maxHP ~= 0 and ((amount / maxHP) < 0.40) then
local now = GetTime()
if not spell378771_var_186387[destGUID] or (now > spell378771_var_186387[destGUID]) then
spell378771_var_186387[destGUID] = now + 25
local line = CDList[destName][186387]
if line then
line:ResetCD()
end
end
end
end
]]},
{147362,"HUNTER,KICK",3,--Встречный выстрел
nil,{147362,24,0},{147362,24,0},nil,
isTalent=true,cdDiff={388039,-2}},
{781, "HUNTER,DEF",4,--Отрыв
{781,20,0},nil,nil,nil,
CLEU_PREP=[[
hunter_trap_var = {tar={},steel={},expl={}}
]],CLEU_SPELL_AURA_APPLIED=[[
if (spellID == 3355 or spellID == 135299 or spellID == 162487) and sourceName and session_gGUIDs[sourceName][346747] then --Hunter traps
local line = CDList[sourceName][781]
if spellID == 135299 then
if hunter_trap_var.tar[sourceName] then
line = nil
end
hunter_trap_var.tar[sourceName] = true
elseif spellID == 162487 then
if hunter_trap_var.steel[sourceName] then
line = nil
end
hunter_trap_var.steel[sourceName] = true
end
if line then
local soulbind_rank = _db.soulbind_rank[sourceName][346747] or SOULBIND_DEF_RANK_NOW
local timeReduce = 0.9 + 0.1 * soulbind_rank
line:ReduceCD(timeReduce)
end
end
]],CLEU_SPELL_CAST_SUCCESS=[[
if spellID == 187698 then --Tar Trap
hunter_trap_var.tar[sourceName] = nil
elseif spellID == 162488 then --Steel Trap
hunter_trap_var.steel[sourceName] = nil
elseif spellID == 236776 then --Expl Trap
hunter_trap_var.expl[sourceName] = nil
end
]],CLEU_SPELL_DAMAGE=[[
if spellID == 236777 and session_gGUIDs[sourceName][346747] then
local line = CDList[sourceName][781]
if hunter_trap_var.expl[sourceName] then
line = nil
end
hunter_trap_var.expl[sourceName] = true
if line then
local soulbind_rank = _db.soulbind_rank[sourceName][346747] or SOULBIND_DEF_RANK_NOW
local timeReduce = 0.9 + 0.1 * soulbind_rank
line:ReduceCD(timeReduce)
end
end
]]},
{109304,"HUNTER,DEF",3,--Живость
{109304,120,0},nil,nil,nil,
cdDiff={287938,-15},reduceCdAfterCast={{34026,270581},-3,{212431,270581},-2,{186270,270581},-3,{259391,270581},-1.5,{342049,270581},-4,{259489,270581},-5,{1513,270581},-2.5,{212436,270581},-3,{186387,270581},-1,{120360,270581},-6,{320976,270581},-1,{19434,270581},-3.5,{257620,270581},-3,{185358,270581},-4,{187708,270581},-3.5,{193455,270581},-3.5,{195645,270581},-2,{2643,270581},-4,{131894,270581},-3,{259387,270581},-3,{53351,270581},-1}},
{5384, "HUNTER,DEF",3,--Притвориться мертвым
{5384,30,0},nil,nil,nil,
cdDiff={336747,-15}},
{1543, "HUNTER",3,--Осветительная ракета
{1543,20,0},nil,nil,nil},
{187650,"HUNTER,CC",3,--Замораживающая ловушка
{187650,30,0},nil,nil,nil,
cdDiff={343247,-5}},
{190925,"HUNTER,MOVE",3,--Гарпун
nil,nil,nil,{190925,30,0},
isTalent=true,cdDiff={265895,-10}},
{19577, "HUNTER,CC",3,--Устрашение
{19577,60,5},
isTalent=true,cdDiff={459507,-5},reduceCdAfterCast={{34026,459533,253},-0.5,{19434,459533,254},-0.5,{259495,459533,255},-0.5}},
{34477, "HUNTER",3,--Перенаправление
{34477,30,0},
isTalent=true,cdDiff={248518,15}},
{187707,"HUNTER,KICK",3,--Намордник
nil,nil,nil,{187707,15,0},
isTalent=true,cdDiff={388039,-2}},
{257044,"HUNTER",3,--Быстрая стрельба
nil,nil,{257044,20,0},nil,
isTalent=true,cdDiff={400472,"*0.9",288613,"*0.3"}},
{187698,"HUNTER",3,--Смоляная ловушка
{187698,30,0},
isTalent=true,cdDiff={343247,-5}},
{19801, "HUNTER,UTIL",3,--Усмиряющий выстрел
{19801,10,0},
isTalent=true},
{288613,"HUNTER,DPS",3,--Меткий выстрел
nil,nil,{288613,120,15},nil,
isTalent=true,durationDiff={336849,3,339920,{"*1.20","*1.22","*1.24","*1.27","*1.29","*1.31","*1.33","*1.36","*1.38","*1.40","*1.42","*1.44","*1.46","*1.48","*1.50"},389449,3},cdDiff={203129,-20,296320,"*0.80",336742,"*0.65"},reduceCdAfterCast={{257620,260404},-2.5,{185358,260404},-2.5}},
{131894,"HUNTER",3,--Стая воронов
nil,{131894,60,15},nil,nil,
isTalent=true},
{120360,"HUNTER",3,--Шквал
{120360,20,3},
isTalent=true,cdDiff={459800,40}},
{109248,"HUNTER,CC",3,--Связующий выстрел
{109248,45,0},nil,nil,nil,
isTalent=true,reduceCdAfterCast={{34026,459533,253},-0.5,{19434,459533,254},-0.5,{259495,459533,255},-0.5}},
{321530,"HUNTER",3,--Кровопролитие
nil,{321530,60,18},nil,nil,
isTalent=true},
{199483,"HUNTER,DEF",3,--Камуфляж
{199483,60,0},nil,nil,nil,
isTalent=true},
{259391,"HUNTER",3,--Шакрамы
nil,nil,nil,{259391,20,0},
isTalent=true},
{53209, "HUNTER",3,--Выстрел химеры
nil,{53209,15,0},nil,nil,
isTalent=true,changeCdWithHaste=true},
{120679,"HUNTER",3,--Ужасный зверь
nil,{120679,20,0},nil,nil,
isTalent=true,durationDiff={385810,2}},
{260402,"HUNTER",3,--Двойной выстрел
nil,nil,{260402,60,0},nil,
isTalent=true},
{212431,"HUNTER",3,--Разрывной выстрел
{212431,30,0},
isTalent=true},
{269751,"HUNTER",3,--Обходной удар
nil,nil,nil,{269751,30,0},
isTalent=true},
{360966,"HUNTER",3,--Острие копья
nil,nil,nil,{360966,90,0},
isTalent=true,cdDiff={378962,-30}},
{201430,"HUNTER,DPS",3,--Звериный натиск
{201430,120,12},
isTalent=true},
{162488,"HUNTER",3,--Капкан
{162488,30,0},
isTalent=true,cdDiff={343247,-5}},
{260243,"HUNTER",3,--Беглый огонь
nil,nil,{260243,45,6},nil,
isTalent=true},
{205691,"HUNTER,PVP",3,--Ужасный зверь: василиск
nil,{205691,120,30},nil,nil,
isTalent=true},
{208652,"HUNTER,PVP",3,--Ужасный зверь: ястреб
nil,{208652,30,10},nil,nil,
isTalent=true},
{236776,"HUNTER",3,--Фугасная ловушка
{236776,40,0},
isTalent=true,cdDiff={343247,-5}},
{248518,"HUNTER,PVP",3,--Вмешательство
nil,{248518,45,0},nil,nil,
isTalent=true,startCdAfterAuraFade=248519},
{212640,"HUNTER,PVP",3,--Целебная повязка
nil,nil,nil,{212640,25,0},
isTalent=true},
{213691,"HUNTER",3,--Ошеломляющий выстрел
{213691,30,0},
isTalent=true,
CLEU_PREP = [[
spell378771_var_213691 = {}
]],CLEU_SPELL_DAMAGE=[[
if destGUID and isHunter[destGUID] and destName and session_gGUIDs[destName][378771] then
local maxHP = UnitHealthMax(destName)
if maxHP ~= 0 and ((amount / maxHP) < 0.40) then
local now = GetTime()
if not spell378771_var_213691[destGUID] or (now > spell378771_var_213691[destGUID]) then
spell378771_var_213691[destGUID] = now + 25
local line = CDList[destName][213691]
if line then
line:ResetCD()
end
end
end
end
]]},
{203155,"HUNTER,PVP",3,--Снайперский выстрел
nil,nil,{203155,10,0},nil,
isTalent=true},
{212638,"HUNTER,PVP",3,--Сеть следопыта
nil,nil,nil,{212638,25,0},
isTalent=true},
{53480, "HUNTER,PVP",3,--Рев жертвенности
{53480,60,12},nil,nil,nil,
isTalent=true},
{264735,"HUNTER",3,--Survival of the Fittest
{264735,120,6},
isTalent=true,cdDiff={388039,-30,266921,{"*0.9","*0.8"}},durationDiff={388039,2},hasCharges=459450},
{360952,"HUNTER",3,--Coordinated Assault
nil,nil,nil,{360952,120,20},
isTalent=true},
{13750, "ROGUE,DPS",3,--Выброс адреналина
nil,nil,{13750,180,20},nil,
isTalent=true,cdDiff={296320,"*0.80"}},
{315341,"ROGUE",3,--Промеж глаз
nil,nil,{315341,45,0},nil},
{13877, "ROGUE",3,--Шквал клинков
nil,nil,{13877,30,12},nil,
isTalent=true,durationDiff={272026,3}},
{2094, "ROGUE,CC",3,--Ослепление
{2094,120,0},
isTalent=true,cdDiff={256165,"*0.75",200733,"*0.5"}},
{31224, "ROGUE,DEF",4,--Плащ теней
{31224,120,5},
isTalent=true,durationDiff={457022,2},
CLEU_SPELL_INTERRUPT=[[
if sourceGUID and isRogue[sourceGUID] and sourceName and session_gGUIDs[sourceName][341535] and spellID == 1766 then
local line = CDList[sourceName][31224]
if line then
local soulbind_rank = _db.soulbind_rank[sourceName][341535] or SOULBIND_DEF_RANK_NOW
local timeReduce = (1.8 + soulbind_rank * 0.2) * 2
line:ReduceCD(timeReduce)
end
end
]]},
{185311,"ROGUE,DEF",4,--Алый фиал
{185311,30,6},nil,nil,nil},
{1725, "ROGUE",3,--Отвлечение
{1725,30,10},nil,nil,nil,
cdDiff={441429,60}},
{5277, "ROGUE,DEF",4,--Ускользание
{5277,120,10},
isTalent=true,
CLEU_SPELL_MISSED=[[
if destGUID and isRogue[destGUID] and destName and session_gGUIDs[destName][341535] and missType == "DODGE" then
local line = CDList[destName][5277]
if line then
local soulbind_rank = _db.soulbind_rank[destName][341535] or SOULBIND_DEF_RANK_NOW
local timeReduce = 1.8 + soulbind_rank * 0.2
line:ReduceCD(timeReduce)
end
end
]]},
{1966, "ROGUE,DEF",4,--Уловка
{1966,15,6},
isTalent=true,hasCharges=423647,cdDiff={354825,"0.8"}},
{1776, "ROGUE,CC",3,--Парализующий удар
{1776,20,0},
isTalent=true},
{195457,"ROGUE,MOVE",3,--Абордажный крюк
nil,nil,{195457,45,0},nil,
isTalent=true,cdDiff={256188,-15,341531,"*0.9"}},
{1766, "ROGUE,KICK",5,--Пинок
{1766,15,0},nil,nil,nil},
{408, "ROGUE,CC",3,--Удар по почкам
{408,20,0},nil,nil,nil},
{315508,"ROGUE",3,--Игра в кости
nil,nil,{315508,45,0},nil,
isTalent=true},
{381989,"ROGUE",3,--Призовая игра
nil,nil,{381989,420,0},nil,
isTalent=true},
{121471,"ROGUE,DPS",3,--Теневые клинки
nil,nil,nil,{121471,120,20},
isTalent=true,cdDiff={296320,"*0.80",354825,"0.8"},
CLEU_SPELL_ENERGIZE=[[
if destGUID and isRogue[destGUID] and destName and session_gGUIDs[sourceName][341559] and spellID == 196911 then
local line = CDList[destName][121471]
if line then
local soulbind_rank = _db.soulbind_rank[sourceName][341559] or SOULBIND_DEF_RANK_NOW
local timeReduce = 0.9 + soulbind_rank * 0.1
line:ReduceCD(timeReduce)
end
end
]]},
{36554, "ROGUE,MOVE",4,--Шаг сквозь тень
{36554,30,2},
isTalent=true,hasCharges=1,cdDiff={341531,"*0.9",382503,"*0.8"},
CLEU_PREP=[[
roguepvptal_var = {}
]],CLEU_SPELL_AURA_APPLIED=[[
if spellID == 79140 then
roguepvptal_var[sourceName] = destGUID
end
]],CLEU_SPELL_AURA_REMOVED=[[
if spellID == 79140 then
roguepvptal_var[sourceName] = nil
end
]],CLEU_SPELL_CAST_SUCCESS=[[
if spellID == 36554 and module.IsPvpTalentsOn(sourceName) then
if destGUID == roguepvptal_var[sourceName] and session_gGUIDs[sourceName][197007] then
local line = CDList[sourceName][36554]
if line then
line:ChangeCD(-20,true)
forceUpdateAllData = true
end
end
if bit.band(destFlags or 0,240) == 16 then
local line = CDList[sourceName][36554]
if line then
line:ChangeCD(-15,true)
forceUpdateAllData = true
end
end
end
]]},
{5938, "ROGUE",3,--Отравляющий укол
{5938,30,0},
isTalent=true},
{382245,"ROGUE",3,--Хладнокровие
{382245,45,0},
isTalent=true,startCdAfterAuraFade=382245},
{385616,"ROGUE",3,--Продолжительная отповедь
{385616,45,0},
isTalent=true},
{381623,"ROGUE,DPS",3,--Скорополоховый чай
{381623,60,6},
isTalent=true,hasCharges=1},
{114018,"ROGUE,UTIL",1,--Скрывающий покров
{114018,360,15},nil,nil,nil,
cdDiff={423662,"*0.5",441415,"*0.9"},durationDiff={457063,5}},
{2983, "ROGUE,MOVE",4,--Спринт
{2983,120,8},nil,nil,nil,
cdDiff={231691,-60,197000,"*0.5"},ignoreUseWithAura=375255,changeCdWithAura={381754,"*0.85"},durationDiff={423683,4,197000,"*0.5"}},
{212283,"ROGUE,DPS",3,--Символы смерти
nil,nil,nil,{212283,30,10},
cdDiff={394309,-5}},
{57934, "ROGUE",3,--Маленькие хитрости
{57934,30,6},
isTalent=true,startCdAfterAuraApply=59628},
{1856, "ROGUE,DEF",4,--Исчезновение
{1856,120,3},nil,nil,nil,
cdDiff={212081,-45,354825,"*0.8"},hasCharges=382513},
{271877,"ROGUE",3,--Натиск клинка
nil,nil,{271877,45,0},nil,
isTalent=true},
{343142,"ROGUE",3,--Клинки Ужаса
nil,nil,{343142,120,10},nil,
isTalent=true},
{200806,"ROGUE,DPS",3,--Пускание крови
nil,{200806,45,0},nil,nil,
isTalent=true},
{196937,"ROGUE",3,--Призрачный удар
nil,nil,{196937,90,0},nil,
isTalent=true},
{51690, "ROGUE,DPS",3,--Череда убийств
nil,nil,{51690,120,0},nil,
isTalent=true},
{137619,"ROGUE,DPS",3,--Метка смерти
{137619,40,0},nil,nil,nil,
isTalent=true},
{280719,"ROGUE",3,--Тайный прием
nil,nil,nil,{280719,60,0},
isTalent=true,reduceCdAfterCast={195452,-5,408,-5,196819,-5,280719,-5}},
{277925,"ROGUE",3,--Торнадо из сюрикэнов
nil,nil,nil,{277925,60,4},
isTalent=true},
{425748,"ROGUE",3,--Exsanguinate
nil,{425748,60,10},nil,nil},
{213981,"ROGUE,PVP",3,--Хладнокровие
nil,nil,nil,{213981,60,0},
isTalent=true},
{269513,"ROGUE,PVP",3,--Смерть с небес
{269513,30,0},nil,nil,nil,
isTalent=true},
{207777,"ROGUE,PVP",3,--Долой оружие
nil,nil,{207777,45,0},nil,
isTalent=true},
{206328,"ROGUE,PVP",3,--Нейротоксин
nil,{206328,45,0},nil,nil,
isTalent=true},
{198529,"ROGUE,PVP",3,--Кража доспехов
nil,nil,{198529,120,0},nil,
isTalent=true},
{207736,"ROGUE,PVP",3,--Дуэль в тенях
nil,nil,nil,{207736,120,6},
isTalent=true},
{212182,"ROGUE,PVP",3,--Дымовая шашка
{212182,180,5},nil,nil,nil,
isTalent=true},
{360194,"ROGUE",3,--Метка смерти
nil,{360194,120,0},nil,nil,
isTalent=true},
{385408,"ROGUE",3,--Сепсис
{385408,90,10},
isTalent=true,changeCdBeforeAuraFullDur={385408,-30}},
{385424,"ROGUE",3,--Зазубренный костяной шип
nil,{385424,30,0},
isTalent=true,hasCharges=1},
{385627,"ROGUE",3,--Погибель королей
nil,{385627,60,0},
isTalent=true},
{381802,"ROGUE",3,--Тотальная бойня
nil,{381802,60,0},
isTalent=true,startCdAfterAuraFade=381802},
{384631,"ROGUE",3,--Флагелляция
nil,nil,nil,{323654,90,12},
isTalent=true},
{204883,"PRIEST",3,--Круг исцеления
nil,nil,{204883,15,0},nil,
changeCdWithHaste=true,cdDiff={390947,-3}},
{19236, "PRIEST,DEF",4,--Молитва отчаяния
{19236,90,0},nil,nil,nil,
cdDiff={238100,-20}},
{47585, "PRIEST,DEF",4,--Слияние с Тьмой
nil,nil,nil,{47585,120,6},
isTalent=true,cdDiff={288733,-30},durationDiff={453729,2}},
{64843, "PRIEST,RAID",1,--Божественный гимн
nil,nil,{64843,180,8},nil,
isTalent=true,cdDiff={419110,-60,296320,"*0.80"},changeDurWithHaste=true,stopDurWithAuraFade=64843},
{586, "PRIEST,DEF",4,--Уход в тень
{586,30,10},nil,nil,nil,
cdDiff={329588,-10,390670,{-5,-10}},hideWithTalent=213602},
{47788, "PRIEST,DEFTAR",2,--Оберегающий дух
nil,nil,{47788,180,10},nil,
isTalent=true,durationDiff={337811,2,440738,2,329693,"*1.80"},stopDurWithAuraFade=47788,--changeCdAfterAuraFullDur={{47788,200209},-110},
CLEU_PREP = [[
spell47788_var = {}
]],CLEU_SPELL_CAST_SUCCESS=[[
if spellID == 47788 then
spell47788_var[sourceGUID.."-"..(destGUID or "")] = nil
end
]],CLEU_SPELL_AURA_REMOVED=[[
if spellID == 47788 and session_gGUIDs[sourceName][200209] and not spell47788_var[sourceGUID.."-"..(destGUID or "")] then
local line = CDList[sourceName][47788]
if line then
line:ModCD(-110)
end
end
]],CLEU_SPELL_HEAL=[[
if spellID == 48153 then
spell47788_var[sourceGUID.."-"..(destGUID or "")] = true
end
]]},
{88625, "PRIEST",3,--Слово Света: Наказание
nil,nil,{88625,60,0},nil,
isTalent=true,resetBy=200183,reduceCdAfterCast={{14914,336314},-4,{14914,390994},{-2,-4},585,-4,{585,196985},{-0.4,-0.8},{585,200183,nil,200183},-12,{585,338345},{-0.24,-0.352,-0.384,-0.416,-0.448,-0.48,-0.512,-0.544,-0.576,-0.608,-0.64,-0.672,-0.704,-0.736,-0.768},{585,338345,nil,200183},{-0.72,-1.056,-1.152,-1.248,-1.344,-1.44,-1.536,-1.632,-1.728,-1.824,-1.92,-2.016,-2.112,-2.208,-2.304}},
CLEU_SPELL_CAST_SUCCESS=[[
if spellID == 88625 and IsAuraActive(sourceName,372760) then
local line = CDList[sourceName][88625]
if line then
line:ReduceCD(15)
end
end
]]},
{34861, "PRIEST",3,--Слово Света: Освящение
nil,nil,{34861,60,0},nil,
isTalent=true,resetBy=200183,hasCharges=235587,reduceCdAfterCast={32546,-3,{32546,196985},{-0.3,-0.6},{32546,200183,nil,200183},-9,{32546,338345},{-0.18,-0.264,-0.288,-0.312,-0.336,-0.36,-0.384,-0.408,-0.432,-0.456,-0.48,-0.504,-0.528,-0.552,-0.576},{32546,338345,nil,200183},{-0.54,-0.792,-0.864,-0.936,-1.008,-1.08,-1.152,-1.224,-1.296,-1.368,-1.44,-1.512,-1.584,-1.656,-1.728},139,-2,{139,196985},{-0.2,-0.4},{139,200183,nil,200183},-6,{139,338345},{-0.12,-0.176,-0.192,-0.208,-0.224,-0.24,-0.256,-0.272,-0.288,-0.304,-0.32,-0.336,-0.352,-0.368,-0.384},{139,338345,nil,200183},{-0.36,-0.528,-0.576,-0.624,-0.672,-0.72,-0.768,-0.816,-0.864,-0.912,-0.96,-1.008,-1.056,-1.104,-1.152},{204883,336314},-4,{204883,390994},{-2,-4},596,-6,{596,196985},{-0.6,-1.2},{596,200183,nil,200183},-18,{596,338345},{-0.36,-0.528,-0.576,-0.624,-0.672,-0.72,-0.768,-0.816,-0.864,-0.912,-0.96,-1.008,-1.056,-1.104,-1.152},{596,338345,nil,200183},{-1.08,-1.584,-1.728,-1.872,-2.016,-2.16,-2.304,-2.448,-2.592,-2.736,-2.88,-3.024,-3.168,-3.312,-3.456}}},
{2050, "PRIEST,DEFTAR",3,--Слово Света: Безмятежность
nil,nil,{2050,60,0},nil,
isTalent=true,hasCharges=235587,resetBy=200183,reduceCdAfterCast={32546,-3,{32546,196985},{-0.3,-0.6},{32546,200183,nil,200183},-9,{32546,338345},{-0.18,-0.264,-0.288,-0.312,-0.336,-0.36,-0.384,-0.408,-0.432,-0.456,-0.48,-0.504,-0.528,-0.552,-0.576},{32546,338345,nil,200183},{-0.54,-0.792,-0.864,-0.936,-1.008,-1.08,-1.152,-1.224,-1.296,-1.368,-1.44,-1.512,-1.584,-1.656,-1.728},2060,-6,{2060,196985},{-0.2,-0.4},{2060,200183,nil,200183},-18,{2060,338345},{-0.36,-0.528,-0.576,-0.624,-0.672,-0.72,-0.768,-0.816,-0.864,-0.912,-0.96,-1.008,-1.056,-1.104,-1.152},{2060,338345,nil,200183},{-1.08,-1.584,-1.728,-1.872,-2.016,-2.16,-2.304,-2.448,-2.592,-2.736,-2.88,-3.024,-3.168,-3.312,-3.456},{33076,336314},-4,{33076,390994},{-2,-4},2061,-6,{2061,196985},{-0.6,-1.2},{2061,200183,nil,200183},-18,{2061,338345},{-0.36,-0.528,-0.576,-0.624,-0.672,-0.72,-0.768,-0.816,-0.864,-0.912,-0.96,-1.008,-1.056,-1.104,-1.152},{2061,338345,nil,200183},{-1.08,-1.584,-1.728,-1.872,-2.016,-2.16,-2.304,-2.448,-2.592,-2.736,-2.88,-3.024,-3.168,-3.312,-3.456}}},
{73325, "PRIEST,UTIL",2,--Духовное рвение
{73325,90,0},nil,nil,nil,
isTalent=true,hasCharges=336470,cdDiff={390620,-30,337678,{-20,-22,-24,-26,-28,-30,-32,-34,-36,-38,-40,-42,-44,-46,-48}},sameSpell={336471,73325},ignoreUseWithAura=375254,changeCdWithAura={381753,"*0.85"}},
{32375, "PRIEST,DISPEL",1,--Массовое рассеивание
{32375,120,0},nil,nil,nil,
isTalent=true,cdDiff={426438,-60}},
{33206, "PRIEST,DEFTAR",2,--Подавление боли
nil,{33206,180,8},nil,nil,
isTalent=true,durationDiff={329693,"*1.80"},hasCharges=373035},
{10060, "PRIEST,UTIL",3,--Придание сил
{10060,120,20},nil,nil,nil,
isTalent=true,
CLEU_SPELL_CAST_SUCCESS=[[
if spellID == 10060 and session_gGUIDs[sourceName][337762] and sourceName ~= destName then --Power infusion soulbind
local line = CDList[sourceName][10060]
if line then
local soulbind_rank = _db.soulbind_rank[sourceName][337762] or SOULBIND_DEF_RANK_NOW
local timeReduce = 5.4 + soulbind_rank * 0.6
line:ChangeCD(-timeReduce,true)
forceUpdateAllData = true
end
end
]]},
{373481,"PRIEST",3,--Слово Силы: Жизнь
{373481,15,0},nil,nil,nil,
isTalent=true,cdDiff={440674,-3}},
{62618, "PRIEST,RAID",1,--Слово силы: Барьер
nil,{62618,180,10},nil,nil,
isTalent=true,cdDiff={197590,-90},hideWithTalent=271466,icon="Interface\\Icons\\spell_holy_powerwordbarrier"},
{194509,"PRIEST",3,--Слово силы: Сияние
nil,{194509,20,0},nil,nil,
isTalent=true,hasCharges=322115,cdDiff={390684,-5}},
{33076, "PRIEST",3,--Молитва восстановления
nil,nil,{33076,12,0},nil,
isTalent=true,changeCdWithHaste=true},
{8122, "PRIEST,AOECC",3,--Ментальный крик
{8122,45,8},nil,nil,nil,
cdDiff={196704,-15},hideWithTalent=205369},
{527, "PRIEST,DISPEL",5,--Очищение
nil,{527,8,0},{527,8,0},nil,
hasCharges=196439,isDispel=true},
{213634,"PRIEST,DISPEL",5,--Очищение от болезни
nil,nil,nil,{213634,8,0},
isTalent=true,isDispel=true},
{391109,"PRIEST,DPS",5,--Темное вознесение
nil,nil,nil,{391109,60,20},
isTalent=true},
{47536, "PRIEST,HEAL",1,--Вознесение
nil,{47536,90,0},nil,nil,
isTalent=true,hideWithTalent=109964},
{32379, "PRIEST",3,--Слово Тьмы: Смерть
{32379,10,0},nil,nil,nil,
changeCdWithHaste=true},
{34433, "PRIEST,DPS,HEAL",3,--Исчадие Тьмы
{34433,180,15},nil,nil,nil,
isTalent=true,cdDiff={296320,"*0.80"},hideWithTalent=123040,reduceCdAfterCast={{47540,390770},-4,{585,390770},-4,{8092,390770},-4}},
{15487, "PRIEST,CC,KICK",3,--Безмолвие
nil,nil,nil,{15487,45,4},
isTalent=true,cdDiff={263716,-15}},
{64901, "PRIEST,HEALUTIL",1,--Символ надежды
nil,nil,{64901,180,4},nil,
isTalent=true,changeDurWithHaste=true,stopDurWithAuraFade=64901},
{15286, "PRIEST,RAID",1,--Объятия вампира
{15286,120,15},nil,nil,nil,
isTalent=true,durationDiff={329693,"*1.80"},cdDiff={199855,-30}},
{228260,"PRIEST,DPS",3,--Извержение Бездны
nil,nil,nil,{228260,120,0}},
{200183,"PRIEST,HEAL",3,--Прославление
nil,nil,{200183,120,20},nil,
isTalent=true},
{372835,"PRIEST,HEAL",3,--Колодец Света
nil,nil,{372835,120,0},nil,
isTalent=true,reduceCdAfterCast={{2050,372835},-3,{34861,372835},-3}},
{372760,"PRIEST,HEAL",3,--Божественное слово
nil,nil,{372760,60,0},nil,
isTalent=true},
{121536,"PRIEST,MOVE",3,--Божественное перышко
{121536,20,0},nil,nil,nil,
isTalent=true,hasCharges=1},
{205364,"PRIEST,CC",3,--Господство над разумом
{205364,30,0},nil,nil,nil,
isTalent=true},
{108920,"PRIEST,AOECC",3,--Щупальца Бездны
{108920,60,20},nil,nil,nil,
isTalent=true},
{110744,"PRIEST",3,--Божественная звезда
nil,{110744,15,0},{110744,15,0},{122121,15,0},
isTalent=true},
{246287,"PRIEST,HEAL",3,--Проповедь
nil,{246287,90,0},nil,nil,
isTalent=true},
{120517,"PRIEST",3,--Сияние
nil,{120517,60,0},{120517,60,0},{120644,60,0},
isTalent=true},
{265202,"PRIEST,RAID",1,--Слово Света: Спасение
nil,nil,{265202,720,0},nil,
isTalent=true,reduceCdAfterCast={34861,-15,2050,-15,{34861,196985},{-1.5,-3},{2050,196985},{-1.5,-3}}},
{200174,"PRIEST",3,--Подчинитель разума
nil,nil,nil,{200174,60,15},
isTalent=true},
{123040,"PRIEST",3,--Подчинитель разума
nil,{123040,60,12},nil,nil,
isTalent=true,cdDiff={296320,"*0.80"},reduceCdAfterCast={{585,390770},-2,{47540,390770},-2,{8092,390770},-2}},
{64044, "PRIEST,CC",3,--Глубинный ужас
nil,nil,nil,{64044,45,4},
isTalent=true},
{314867,"PRIEST",3,--Темный завет
nil,{314867,30,7},nil,nil,
isTalent=true,durationDiff={372985,4}},
{263165,"PRIEST",3,--Поток Бездны
nil,nil,nil,{263165,45,3},
isTalent=true,cdDiff={373221,-15}},
{375901,"PRIEST,PVP",3,--Игры разума
{375901,45,5},
isTalent=true,durationDiff={391112,2},stopDurWithAuraFade=375901,reduceCdAfterCast={{585,390996},{-0.5,-1},{47540,390996},{-0.5,-1},{8092,390996},{-0.5,-1},{73510,390996},{-0.5,-1},{14914,390996},{-0.5,-1}}},
{197862,"PRIEST,PVP",3,--Архангел
nil,{197862,60,15},nil,nil,
isTalent=true},
{197871,"PRIEST,PVP",3,--Темный архангел
nil,{197871,60,8},nil,nil,
isTalent=true},
{328530,"PRIEST,PVP",3,--Божественное вознесение
nil,nil,{328530,60,0},nil,
isTalent=true},
{289666,"PRIEST,PVP",3,--Великое исцеление
nil,nil,{289666,12,0},nil,
isTalent=true},
{213610,"PRIEST,PVP",3,--Священный оберег
nil,nil,{213610,45,0},nil,
isTalent=true},
{211522,"PRIEST,PVP",3,--Ментальный демон
nil,nil,nil,{211522,45,12},
isTalent=true},
{197268,"PRIEST,PVP",3,--Луч надежды
nil,nil,{197268,90,6},nil,
isTalent=true},
{316262,"PRIEST,PVP",3,--Украденные мысли
{316262,90,0},nil,nil,nil,
isTalent=true},
{108968,"PRIEST,DEFTAR",2,--Вхождение в Бездну
{108968,300,0},nil,nil,nil,
isTalent=true},
{215982,"PRIEST,PVP",3,--Дух воздаятеля
nil,nil,{215769,180,7},nil,
isTalent=true},
{428924,"PRIEST",3,--Premonition
{428924,60,0},
isTalent=true,cdDiff={440661,-15},hasCharges=440742},
{271466,"PRIEST,RAID",1,--Luminous Barrier
nil,{271466,180,0},nil,nil,
isTalent=true},
{421453,"PRIEST",3,--Ultimate Penitence
nil,{421453,240,0},nil,nil,
isTalent=true},
{48707, "DEATHKNIGHT,DEF",4,--Антимагический панцирь
{48707,60,5},
isTalent=true,durationDiff={205727,"*1.4",207321,5},cdDiff={205727,-20},stopDurWithAuraFade=48707},
{51052, "DEATHKNIGHT,RAID",3,--Зона антимагии
{51052,120,8},
isTalent=true,durationDiff={337764,{2,2.2,2.4,2.6,2.8,3,3.2,3.4,3.6,3.8,4,4.2,4.4,4.6,4.8}}},
{275699,"DEATHKNIGHT,DPS",3,--Апокалипсис
nil,nil,nil,{275699,45,15},
isTalent=true,cdDiff={288848,-15,296320,"*0.80",338553,-1},reduceCdAfterCast={{47541,276837},-1}},
{42650, "DEATHKNIGHT,DPS",3,--Войско мертвых
nil,nil,nil,{42650,180,30},
isTalent=true,hideWithTalent=455395,reduceCdAfterCast={{47541,276837},-5}},
{390279,"DEATHKNIGHT,DPS",3,--Отвратительное заражение
nil,nil,nil,{390279,45,0},
isTalent=true},
{221562,"DEATHKNIGHT,CC",3,--Асфиксия
{221562,45,5},
isTalent=true},
{49028, "DEATHKNIGHT,DEFTANK",4,--Танцующее руническое оружие
nil,{49028,120,8},nil,nil,
isTalent=true,durationDiff={377668,8,233412,"*0.75"},cdDiff={233412,"*0.5"},
CLEU_SPELL_AURA_REMOVED=[[
if spellID == 195181 and (session_gGUIDs[sourceName][334525] or session_gGUIDs[sourceName][377637]) then --Bone Shield
local line = CDList[sourceName][49028]
if line then
line:ReduceCD(5,true)
forceUpdateAllData = true
end
end
]],CLEU_SPELL_AURA_REMOVED_DOSE=[[
if spellID == 195181 and (session_gGUIDs[sourceName][334525] or session_gGUIDs[sourceName][377637]) then --Bone Shield
local line = CDList[sourceName][49028]
if line then
line:ReduceCD(5)
end
end
]]},
{56222, "DEATHKNIGHT,TAUNT",5,--Темная власть
{56222,8,0},nil,nil,nil,
hideWithTalent=207018},
{63560, "DEATHKNIGHT,DPS",3,--Темное превращение
nil,nil,nil,{63560,45,15},
isTalent=true,cdDiff={316941,{-8,-16}},durationDiff={337381,{3,3.3,3.9,3.9,4.2,4.5,4.8,5.1,5.4,5.7,6,6.3,6.6,6.9,7.2}},increaseDurAfterCast={{47541,334949},1,{47541,390268},1}},
{50977, "DEATHKNIGHT",3,--Врата смерти
{50977,60,0},nil,nil,nil},
{49576, "DEATHKNIGHT,UTIL",5,--Хватка смерти
nil,{49576,15,0},{49576,25,0},{49576,25,0},
hasCharges=356367,cdDiff={334724,-3},startCdAfterAuraFadeExt=334722},
{43265, "DEATHKNIGHT",3,--Смерть и разложение
nil,{43265,15,0},{43265,30,0},{43265,30,0},
hasCharges=356367,hideWithTalent=152280,reduceCdAfterCast={{47541,334898},-2,{49998,334898},-2}},
{48265, "DEATHKNIGHT,MOVE",4,--Поступь смерти
{48265,45,0},
hasCharges=356367,ignoreUseWithAura=375226,changeCdWithAura={381732,"*0.85"}},
{47568, "DEATHKNIGHT,DPS",3,--Усиление рунического оружия
{47568,120,20},
isTalent=true,cdDiff={296320,"*0.80"}},
{383269,"DEATHKNIGHT,DPS",3,--Рука поганища
{383269,120,12},
isTalent=true},
{279302,"DEATHKNIGHT",3,--Ярость ледяного змея
nil,nil,{279302,180,10},nil,
isTalent=true,cdDiff={334692,"*0.5",377047,"*0.5"}},
{108199,"DEATHKNIGHT,UTIL",1,--Хватка Кровожада
nil,{108199,120,0},nil,nil,
isTalent=true,cdDiff={206970,-30}},
{48792, "DEATHKNIGHT,DEFTANK,DEF",4,--Незыблемость льда
{48792,120,8},
isTalent=true,cdDiff={373926,-60,288424,-15,337704,{-20,-22,-24,-26,-28,-30,-32,-34,-36,-38,-40,-42,-44,-46,-38}}},
{49039, "DEATHKNIGHT",3,--Перерождение
{49039,120,10},
durationDiff={389682,2},cdDiff={437122,-30}},
{47528, "DEATHKNIGHT,KICK",5,--Заморозка разума
{47528,15,0},
isTalent=true,
CLEU_SPELL_INTERRUPT=[[
if sourceName and session_gGUIDs[sourceName][378848] and spellID == 47528 then
local line = CDList[sourceName][47528]
if line then
line:ReduceCD(3)
end
end
]]},
{51271, "DEATHKNIGHT,DPS,DEF",3,--Ледяной столп
nil,nil,{51271,60,12},nil,
isTalent=true,cdDiff={207126,-15}},
{61999, "DEATHKNIGHT,RES",3,--Воскрешение союзника
{61999,600,0},nil,nil,nil,
isBattleRes=true},
{46585, "DEATHKNIGHT",3,--Воскрешение мертвых
{46585,120,0},
isTalent=true,cdDiff={437122,-30}},
{196770,"DEATHKNIGHT",3,--Беспощадность зимы
nil,nil,{196770,20,8},nil,
isTalent=true},
{194679,"DEATHKNIGHT,DEFTANK",4,--Захват рун
nil,{194679,25,4},nil,nil,
isTalent=true,hasCharges=1},
{55233, "DEATHKNIGHT,DEFTANK",3,--Кровь вампира
nil,{55233,90,10},nil,nil,
isTalent=true,cdDiff={296320,"*0.80"},reduceCdAfterCast={{206930,334580},-2,{61999,205723},-3,{47541,205723},-4,{327574,205723},-2,{49998,205723},-4.5},durationDiff={317133,{2,4}}},
{207167,"DEATHKNIGHT,AOECC",3,--Ослепляющая наледь
{207167,60,0},
isTalent=true},
{206931,"DEATHKNIGHT,DEFTANK",3,--Кровопийца
nil,{206931,30,0},nil,nil,
isTalent=true},
{194844,"DEATHKNIGHT",3,--Буря костей
nil,{194844,60,0},nil,nil,
isTalent=true},
{152279,"DEATHKNIGHT,DPS",3,--Дыхание Синдрагосы
nil,nil,{152279,120,0},nil,
isTalent=true},
{274156,"DEATHKNIGHT",3,--Пожирание
nil,{274156,30,0},nil,nil,
isTalent=true},
{48743, "DEATHKNIGHT,DEF",3,--Смертельный союз
{48743,120,0},
isTalent=true},
{152280,"DEATHKNIGHT",3,--Осквернение
nil,nil,nil,{152280,20,0},
isTalent=true,reduceCdAfterCast={{47541,334898},-2,{49998,334898},-2}},
{57330, "DEATHKNIGHT",3,--Зимний горн
nil,nil,{57330,45,0},nil,
isTalent=true},
{321995,"DEATHKNIGHT",3,--Гипотермия
nil,nil,{321995,45,8},nil,
isTalent=true},
{49206, "DEATHKNIGHT,DPS",3,--Призыв горгульи
nil,nil,nil,{49206,180,30},
isTalent=true},
{219809,"DEATHKNIGHT",3,--Надгробный камень
nil,{219809,60,0},nil,nil,
isTalent=true},
{207289,"DEATHKNIGHT,DPS",3,--Нечестивый натиск
nil,nil,nil,{207289,90,12},
isTalent=true},
{212552,"DEATHKNIGHT,MOVE",3,--Блуждающий дух
{212552,60,4},
isTalent=true},
{305392,"DEATHKNIGHT",3,--Поток холода
nil,nil,{305392,45,0},nil,
isTalent=true},
{77606, "DEATHKNIGHT,PVP",3,--Темный симулякр
{77606,20,0},nil,nil,nil,
isTalent=true},
{203173,"DEATHKNIGHT,PVP",3,--Цепь смерти
nil,{203173,30,0},nil,nil,
isTalent=true},
{207018,"DEATHKNIGHT,PVP",3,--Убийственное намерение
nil,{207018,20,0},nil,nil,
isTalent=true},
{47476, "DEATHKNIGHT,PVP",3,--Удушение
nil,{47476,45,5},nil,nil,
isTalent=true},
{327574,"DEATHKNIGHT,DEFTANK",3,
nil,{327574,120,0},nil,nil,
isTalent=true},
{556, "SHAMAN",3,--Астральное возвращение
{556,600,0},nil,nil,nil},
{108271,"SHAMAN,DEF",4,--Астральный сдвиг
{108271,120,8},nil,nil,nil,
isTalent=true,durationDiff={329538,10},cdDiff={381647,-30},hideWithTalent=210918},
{2825, "SHAMAN,UTIL",3,--Жажда крови
{2825,300,40},nil,nil,nil,
cdDiff={193876,-240},specialCheck=function(_,name) return UnitFactionGroup(name or "")~="Alliance" end},
{32182, "SHAMAN,UTIL",3,--Героизм
{32182,300,40},nil,nil,nil,
cdDiff={193876,-240},specialCheck=function(_,name) return UnitFactionGroup(name or "")=="Alliance" end},
{192058,"SHAMAN,AOECC",1,--Тотем конденсации
{192058,60,2},nil,nil,nil,
isTalent=true,cdDiff={381867,{-3,-6},338042,{-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15}},
CLEU_PREP = [[
CapacitorMain = {}
CapacitorPrev,CapacitorCount = 0,0
CapacitorMain_445027 = {}
]],CLEU_SPELL_AURA_APPLIED = [[
if spellID == 118905 and sourceGUID and CapacitorMain[sourceGUID] then
sourceName = CapacitorMain[sourceGUID]
local line = CDList[sourceName][192058]
if line and session_gGUIDs[sourceName][265046] then
local t = GetTime()
if CapacitorPrev < t then
CapacitorPrev = t + 1
CapacitorCount = 0
end
CapacitorCount = CapacitorCount + 1
line:ChangeCD( -(CapacitorCount <= 4 and 5 or 0) )
end
if line and session_gGUIDs[sourceName][445027] then
local t = GetTime()
if not CapacitorMain_445027[sourceName] or t > CapacitorMain_445027[sourceName] then
CapacitorMain_445027[sourceName] = t + 1
line:ReduceCD(5)
end
end
end
]],CLEU_SPELL_SUMMON = [[
if sourceName and spellID == 192058 then
CapacitorMain[destGUID] = sourceName
end
]]},
{51886, "SHAMAN,DISPEL",5,--Очищение духа
nil,{51886,8,0},{51886,8,0},nil,
isTalent=true,isDispel=true},
{198103,"SHAMAN,UTIL",2,--Элементаль земли
{198103,300,60},nil,nil,nil,
isTalent=true,cdDiff={329534,"*0.6"}},
{2484, "SHAMAN,AOECC",3,--Тотем оков земли
{2484,30,20},nil,nil,nil,
cdDiff={381867,{-3,-6},338042,{-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15}}},
{51533, "SHAMAN,DPS",3,--Дух дикого зверя
nil,nil,{51533,90,15},nil,
isTalent=true,cdDiff={296320,"*0.80"},resetBy={{328923,333352}},
CLEU_PREP=[[
spell356218_var51533 = {}
]],CLEU_SPELL_AURA_APPLIED=[[
if spellID == 187881 and sourceName and session_gGUIDs[sourceName][335897] then
local line = CDList[sourceName][51533]
if line then
line:ReduceCD(2)
end
end
]],CLEU_SPELL_AURA_APPLIED_DOSE=[[
if spellID == 187881 and sourceName and session_gGUIDs[sourceName][335897] then
local line = CDList[sourceName][51533]
if line then
line:ReduceCD(2)
end
end
]],CLEU_SPELL_DAMAGE=[[
if spellID == 328928 and session_gGUIDs[sourceName][356218] then
local last = spell356218_var51533[sourceName] or 0
local t = GetTime()
if t > last then
spell356218_var51533[sourceName] = t + 0.2
local line = CDList[sourceName][51533]
if line then
line:ReduceCD(9)
end
end
end
]]},
{198067,"SHAMAN,DPS",3,--Элементаль огня
nil,{198067,150,30},nil,nil,
isTalent=true,durationDiff={338303,{"*1.35","*1.36","*1.37","*1.38","*1.39","*1.40","*1.41","*1.43","*1.44","*1.45","*1.46","*1.47","*1.48","*1.49","*1.50"}},cdDiff={296320,"*0.80"},hideWithTalent=192249,
CLEU_PREP=[[
spell356218_var198067 = {}
]],CLEU_SPELL_DAMAGE=[[
if spellID == 188389 and critical and session_gGUIDs[sourceName][336734] then
local line = CDList[sourceName][198067]
if line then
line:ReduceCD(1)
end
elseif spellID == 328928 and session_gGUIDs[sourceName][356218] then
local last = spell356218_var198067[sourceName] or 0
local t = GetTime()
if t > last then
spell356218_var198067[sourceName] = t + 0.2
local line = CDList[sourceName][198067]
if line then
line:ReduceCD(7)
end
end
end
]]},
{73920, "SHAMAN",3,--Целительный ливень
nil,nil,nil,{73920,10,0},
isTalent=true},
{5394, "SHAMAN",3,--Тотем исцеляющего потока
{5394,30,0},nil,nil,nil,
isTalent=true,hasCharges=108283,hideWithTalent=157153,cdDiff={381867,{-3,-6}}},
{108280,"SHAMAN,RAID",3,--Тотем целительного прилива
nil,nil,nil,{108280,180,12},
isTalent=true,cdDiff={381867,{-3,-6},353115,-45,296320,"*0.80"},
CLEU_PREP=[[
spell356218_var108280 = {}
]],CLEU_SPELL_DAMAGE=[[
if spellID == 328928 and session_gGUIDs[sourceName][356218] then
local last = spell356218_var108280[sourceName] or 0
local t = GetTime()
if t > last then
spell356218_var108280[sourceName] = t + 0.2
local line = CDList[sourceName][108280]
if line then
line:ReduceCD(7)
end
end
end
]],CLEU_SPELL_AURA_REMOVED_DOSE=[[
if spellID == 53390 and session_gGUIDs[sourceName][382030] then
local line = CDList[sourceName][108280]
if line then
line:ReduceCD(0.5)
end
end
]],CLEU_SPELL_AURA_REMOVED=[[
if spellID == 53390 and session_gGUIDs[sourceName][382030] then
local line = CDList[sourceName][108280]
if line then
line:ReduceCD(0.5)
end
end
]]},
{51514, "SHAMAN,CC",3,--Сглаз
{51514,30,0},nil,nil,nil,
isTalent=true,cdDiff={204268,-15},sameSpell={51514,211015,210873,211010,211004,269352,277778,277784,309328}},
{16191, "SHAMAN,HEALUTIL",3,--Тотем прилива маны
nil,nil,nil,{16191,180,8},
isTalent=true,cdDiff={381867,{-3,-6}},
CLEU_SPELL_AURA_REMOVED_DOSE=[[
if spellID == 53390 and session_gGUIDs[sourceName][382030] then
local line = CDList[sourceName][16191]
if line then
line:ReduceCD(0.5)
end
end
]],CLEU_SPELL_AURA_REMOVED=[[
if spellID == 53390 and session_gGUIDs[sourceName][382030] then
local line = CDList[sourceName][16191]
if line then
line:ReduceCD(0.5)
end
end
]]},
{77130, "SHAMAN,DISPEL",5,--Возрождение духа
nil,nil,nil,{77130,8,0},
isDispel=true},
{20608, "SHAMAN,RES",2,--Реинкарнация
{21169,1800,0},nil,nil,nil,
cdDiff={337964,{-180,-210,-240,-270,-300,-330,-360,-390,-420,-450,-480,-510,-540,-570,-600}},afterCombatNotReset=true,
CLEU_SPELL_CAST_SUCCESS=[[
if spellID == 21169 and sourceName and session_gGUIDs[sourceName][381689] then --No recheck after reload
local line = CDList[sourceName][21169]
if line then
if not AnkhTimers then
AnkhTimers = {}
end
if AnkhTimers[sourceName] then
AnkhTimers[sourceName]:Cancel()
end
AnkhTimers[sourceName] = C_Timer.NewTicker(1,function(self)
local line = CDList[sourceName][21169]
if not line or ((line.lastUse + line.cd) < GetTime()) then
self:Cancel()
AnkhTimers[sourceName] = nil
return
end
if UnitHealth(sourceName) == UnitHealthMax(sourceName) then
line:ReduceCD(0.75)
end
end)
end
end
]]},
{98008, "SHAMAN,RAID",1,--Тотем духовной связи
nil,nil,nil,{98008,180,6},
isTalent=true,hideWithTalent=204293,cdDiff={381867,{-3,-6}}},
{58875, "SHAMAN,MOVE",3,--Поступь духа
{58875,60,8},
isTalent=true,cdDiff={381678,{-10,-20}},ignoreUseWithAura=375256,changeCdWithAura={381756,"*0.85"}},
{192063,"SHAMAN,MOVE",3,--Порыв ветра
{192063,20,0},
isTalent=true,cdDiff={381678,{-5,-10}}},
{79206, "SHAMAN,MOVE",3,--Благосклонность предков
{79206,120,15},
isTalent=true,cdDiff={192088,-30},ignoreUseWithAura=375256,changeCdWithAura={381756,"*0.85"}},
{51490, "SHAMAN,UTIL",3,--Гром и молния
{51490,30,0},
isTalent=true,cdDiff={378779,-5}},
{8143, "SHAMAN,UTIL",1,--Тотем трепета
{8143,60,10},nil,nil,nil,
isTalent=true,cdDiff={381867,{-3,-6},338042,{-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15}}},
{57994, "SHAMAN,KICK",5,--Пронизывающий ветер
{57994,12,0},nil,nil,nil,
isTalent=true,cdDiff={329526,-4}},
{108281,"SHAMAN",1,--Наставления предков
{108281,120,10},
isTalent=true},
{378081,"SHAMAN",3,--Природная стремительность
{378081,60,0},
isTalent=true,startCdAfterAuraFade=378081},
{207399,"SHAMAN,RAID",1,--Тотем защиты Предков
nil,nil,nil,{207399,300,30},
isTalent=true,cdDiff={381867,{-3,-6}}},
{114051,"SHAMAN,DPS",3,--Перерождение
nil,nil,{114051,180,15},nil,
isTalent=true,durationDiff={462443,3}},
{114052,"SHAMAN,HEAL",3,--Перерождение
nil,nil,nil,{114052,180,15},
isTalent=true,durationDiff={462443,3}},
{114050,"SHAMAN,DPS",3,--Перерождение
nil,{114050,180,15},nil,nil,
isTalent=true,cdDiff={462440,-60}},
{198838,"SHAMAN,HEAL",3,--Тотем земляной стены
nil,nil,nil,{198838,60,15},
isTalent=true,stopDurWithAuraFade=198839,cdDiff={381867,{-3,-6}}},
{51485, "SHAMAN,AOECC",3,--Тотем хватки земли
{51485,60,20},
isTalent=true,cdDiff={381867,{-3,-6}}},
{320125,"SHAMAN",3,--Вторящий шок
nil,{320125,30,0},nil,nil,
isTalent=true},
{196884,"SHAMAN",3,--Свирепый выпад
nil,nil,{196884,30,0},nil,
isTalent=true},
{333974,"SHAMAN",3,--Кольцо огня
nil,nil,{333974,15,0},nil,
isTalent=true},
{342240,"SHAMAN",3,--Ледяной клинок
nil,nil,{342240,15,0},nil,
isTalent=true},
{192222,"SHAMAN",3,--Тотем жидкой магмы
nil,{192222,60,15},nil,nil,
isTalent=true,cdDiff={381867,{-3,-6}}},
{191634,"SHAMAN,DPS",3,--Хранитель бурь
nil,{191634,60,0},nil,nil,
isTalent=true},
{197214,"SHAMAN,AOECC",3,--Раскол
nil,nil,{197214,40,0},nil,
isTalent=true},
{197995,"SHAMAN",3,--Родник
nil,nil,nil,{197995,20,0},
isTalent=true},
{192077,"SHAMAN,RAIDSPEED",1,--Тотем ветряного порыва
{192077,120,15},nil,nil,nil,
isTalent=true,cdDiff={381867,{-3,-6},462791,-30}},
{383013,"SHAMAN,DISPEL",3,--Тотем противоядия
{383013,45,6},
isTalent=true,cdDiff={381867,{-3,-6}},
CLEU_SPELL_AURA_REMOVED_DOSE=[[
if spellID == 53390 and session_gGUIDs[sourceName][382030] then
local line = CDList[sourceName][383013]
if line then
line:ReduceCD(0.5)
end
end
]],CLEU_SPELL_AURA_REMOVED=[[
if spellID == 53390 and session_gGUIDs[sourceName][382030] then
local line = CDList[sourceName][383013]
if line then
line:ReduceCD(0.5)
end
end
]]},
{204331,"SHAMAN,PVP",3,--Тотем контрудара
{204331,45,15},nil,nil,nil,
isTalent=true,cdDiff={381867,{-3,-6}}},
{204336,"SHAMAN,PVP",3,--Тотем заземления
{204336,30,3},nil,nil,nil,
isTalent=true,cdDiff={381867,{-3,-6}}},
{305483,"SHAMAN,CC",3,--Молния-лассо
{305483,45,0},
isTalent=true},
{108285,"SHAMAN",3,--Возвращение тотемов
{108285,180,0},
isTalent=true,cdDiff={383011,-60},
CLEU_PREP=[[
TotemicRecallList = {
[204336]=true,
[204331]=true,
[383013]=true,
[383019]=true,
[383017]=true,
[192077]=true,
[204330]=true,
[157153]=true,
[8143]=true,
[192222]=true,
[51485]=true,
[198838]=true,
[192058]=true,
[2484]=true,
[5394]=true,
}
TotemicRecall1,TotemicRecall2 = {},{}
]],CLEU_SPELL_CAST_SUCCESS=[[
if sourceName and spellID and TotemicRecallList[spellID] then
TotemicRecall2[sourceName] = TotemicRecall1[sourceName]
TotemicRecall1[sourceName] = spellID
elseif spellID == 108285 and sourceName then
local s = TotemicRecall1[sourceName] or 0
local line = CDList[sourceName][s]
if line then
line:ResetCD()
end
if session_gGUIDs[sourceName][383012] then
local s = TotemicRecall2[sourceName] or 0
local line = CDList[sourceName][s]
if line then
line:ResetCD()
end
end
end
]]},
{157153,"SHAMAN",3,--Тотем разразившегося ливня
nil,nil,nil,{157153,45,15},
cdDiff={381867,{-3,-6}}},
{192249,"SHAMAN,DPS",3,--Элементаль бури
nil,{192249,150,30},nil,nil,
isTalent=true,durationDiff={338303,{"*1.35","*1.36","*1.37","*1.38","*1.39","*1.40","*1.41","*1.43","*1.44","*1.45","*1.46","*1.47","*1.48","*1.49","*1.50"}},cdDiff={296320,"*0.80"},
CLEU_SPELL_DAMAGE=[[
if spellID == 188389 and critical and session_gGUIDs[sourceName][336734] then
local line = CDList[sourceName][192249]
if line then
line:ReduceCD(1)
end
end
]]},
{73685, "SHAMAN",3,--Высвободить чары жизни
nil,nil,nil,{73685,15,0},
isTalent=true},
{375982,"SHAMAN",3,--Первозданная волна
{375982,30,0},
isTalent=true,cdDiff={382046,-15}},
{384352,"SHAMAN",3,--Doom Winds
nil,nil,{384352,90,0},nil,
isTalent=true},
{443454,"SHAMAN",3,--Ancestral Swiftness
nil,{443454,45,0},nil,nil,
isTalent=true},
{428332,"SHAMAN",3,--Primordial Wave
nil,nil,nil,{428332,35,0},
isTalent=true},
{409293,"SHAMAN,PVP",3,--Burrow
nil,{409293,120,0},nil,nil,
isTalent=true},
{355580,"SHAMAN,PVP",3,--Static Field Totem
nil,{355580,90,0},nil,nil,
isTalent=true},
{444995,"SHAMAN",3,--Surging Totem
nil,nil,{444995,30,0},nil,
isTalent=true},
{342245,"MAGE,DEF",3,--Манипуляции со временем
{342245,60,10},
isTalent=true,stopDurWithAuraFade={342246,110909},startCdAfterAuraApply={110909,342246},cdDiff={342249,-10}},
{235313,"MAGE,DEF",3,--Пылающая преграда
nil,nil,{235313,25,0},nil,
isTalent=true},
{1953, "MAGE,MOVE",4,--Скачок
{1953,15,0},nil,nil,nil,
cdDiff={382268,{-2,-4},336636,{-2,-2.2,-2.4,-2.6,-2.8,-3,-3.2,-3.4,-3.6,-3.8,-4,-4.2,-4.4,-4.6,-4.8}},hideWithTalent=212653,ignoreUseWithAura=375240,changeCdWithAura={381750,"*0.85"},resetBy={{342245,342249}}},
{190356,"MAGE",3,--Снежная буря
nil,nil,nil,{190356,8,0},
isTalent=true,changeCdWithHaste=true},
{235219,"MAGE",3,--Холодная хватка
nil,nil,nil,{235219,300,0},
isTalent=true},
{190319,"MAGE,DPS",3,--Возгорание
nil,nil,{190319,120,12},nil,
isTalent=true,cdDiff={296320,"*0.80"},durationDiff={383659,"*0.5"},reduceCdAfterCast={{133,203283},-3},
CLEU_SPELL_DAMAGE=[[
if (spellID == 11366 or spellID == 133 or spellID == 108853 or spellID == -257542 or spellID == 2948) then
if critical and session_gGUIDs[sourceName][155148] then
local line = CDList[sourceName][190319]
if line then
line:ReduceCD(1)
end
end
if session_gGUIDs[sourceName][416506] and IsAuraActive(sourceName,190319) then
local line = CDList[sourceName][190319]
if line then
line:ReduceCD(1.25)
end
end
elseif spellID == 2120 then
local t = GetTime()
if not spell155148_fs or t > spell155148_fs then
spell155148_fs = t + 1
spell155148_fs_c = 5
spell155148_fs_c_2 = 5
end
if (spell155148_fs_c or 0) > 0 and critical and session_gGUIDs[sourceName][155148] then
spell155148_fs_c = spell155148_fs_c - 1
local line = CDList[sourceName][190319]
if line then
line:ReduceCD(0.2)
end
end
if (spell155148_fs_c_2 or 0) > 0 and critical and session_gGUIDs[sourceName][416506] and IsAuraActive(sourceName,190319) then
spell155148_fs_c_2 = spell155148_fs_c_2 - 1
local line = CDList[sourceName][190319]
if line then
line:ReduceCD(0.25)
end
end
elseif spellID == 257542 and session_gGUIDs[sourceName][155148] then
if not spell155148_var1 then
spell155148_var1 = C_Timer.NewTimer(0.3,function()
spell155148_var1 = nil
if spell155148_var2 then
local line = CDList[sourceName][190319]
if line then
line:ReduceCD(1)
end
end
spell155148_var2 = nil
end)
end
spell155148_var2 = critical
end
]],CLEU_SPELL_CAST_SUCCESS=[[
if spellID == 190319 and session_gGUIDs[sourceName][449412] then
local auraData = IsAuraActive(sourceName,448604)
if auraData then
local line = CDList[sourceName][190319]
if line then
line:ChangeDur(0.5 * (auraData.applications or 1))
end
end
end
]]},
{120, "MAGE",3,--Конус холода
nil,nil,nil,{120,12,0},
resetBy={{122,206431},235219},cdDiff={417493,33}},
{190336,"MAGE",3,--Сотворение яств
{190336,15,0},nil,nil,nil},
{383121,"MAGE,AOECC",3,--Массовое превращение
{383121,60,0},nil,nil,nil,
isTalent=true},
{2139, "MAGE,KICK",5,--Антимагия
{2139,24,0},nil,nil,nil,
CLEU_SPELL_INTERRUPT=[[
if sourceName and session_gGUIDs[sourceName][382297] and spellID == 2139 then
local line = CDList[sourceName][2139]
if line then
line:ReduceCD(4)
end
end
if sourceName and session_gGUIDs[sourceName][336777] and spellID == 2139 then
local line = CDList[sourceName][2139]
if line then
local soulbind_rank = _db.soulbind_rank[sourceName][336777] or SOULBIND_DEF_RANK_NOW
local tr = {2.5,2.8,3.0,3.3,3.5,3.8,4.0,4.3,4.5,4.8,5.0,5.3,5.5,5.8,6.0}
local timeReduce = tr[soulbind_rank] or 3.5
line:ReduceCD(timeReduce)
end
end
]]},
{31661, "MAGE",3,--Дыхание дракона
{31661,45,0},
isTalent=true,reduceCdAfterCast={{5143,387807,nil,263725},-2,{108853,387807},-2,{30455,387807},-2}},
{12051, "MAGE",3,--Прилив сил
nil,{12051,90,6},nil,nil,
isTalent=true,hasCharges=273330,changeDurWithHaste=true},
{376103,"MAGE",3,--Сияющая искра
nil,{376103,30,0},nil,nil,
isTalent=true},
{122, "MAGE",3,--Кольцо льда
{122,30,0},nil,nil,nil,
hasCharges=205036,resetBy=235219},
{84714, "MAGE",3,--Ледяной шар
nil,nil,nil,{84714,60,0},
isTalent=true,
CLEU_SPELL_DAMAGE=[[
if (spellID == 190356) and session_gGUIDs[sourceName][236662] then
local line = CDList[sourceName][84714]
if line then
line:ReduceCD(0.5)
end
end
]]},
{11426, "MAGE,DEF",3,--Ледяная преграда
nil,nil,nil,{11426,25,0},
isTalent=true,stopDurWithAuraFade=11426,resetBy=235219},
{45438, "MAGE,DEF",3,--Ледяная глыба
{45438,240,10},nil,nil,nil,
isTalent=true,cdDiff={336613,{-25,-28,-30,-33,-35,-38,-40,-43,-45,-48,-50,-53,-55,-58,-60},382424,{-30,-60}},stopDurWithAuraFade=45438,resetBy=235219},
{12472, "MAGE,DPS",3,--Стылая кровь
nil,nil,nil,{12472,120,25},
isTalent=true,durationDiff={155149,5},cdDiff={296320,"*0.80"},hideWithTalent=198144,
CLEU_SPELL_CAST_SUCCESS=[[
if sourceName and (spellID == 30455 or spellID == 116 or spellID == 44614) and session_gGUIDs[sourceName][378433] then
local line = CDList[sourceName][12472]
if line then
line:ReduceCD(1)
end
end
]],CLEU_SPELL_DAMAGE=[[
if critical and sourceGUID and isMage[sourceGUID] and sourceName and session_gGUIDs[sourceName][336522] and IsAuraActive(sourceName,12472) then
if spellID ~= 190357 and spellID ~= 327498 and spellID ~= 205021 and spellID ~= 257538 then
local line = CDList[sourceName][12472]
if line then
local soulbind_rank = _db.soulbind_rank[sourceName][336522] or SOULBIND_DEF_RANK_NOW
local timeReduce = 0.75 + (soulbind_rank - 1) * 0.075
line:ReduceCD(timeReduce)
end
end
end
]]},
{66, "MAGE,DEF",4,--Невидимость
{66,300,20},nil,nil,nil,
isTalent=true,cdDiff={210476,-45}},
{110959,"MAGE,DEF",4,--Великая невидимость
{110959,120,0},nil,nil,nil,
isTalent=true,cdDiff={210476,-45}},
{55342, "MAGE,DEF",3,--Зеркальное изображение
{55342,120,40},nil,nil,nil,
isTalent=true},
{257541,"MAGE",3,--Пламя феникса
nil,nil,{257541,25,0},nil,
isTalent=true,hasCharges=1,
CLEU_SPELL_DAMAGE=[[
if (spellID == 11366 or spellID == 108853 or spellID == 2948 or spellID == 133) and critical and session_gGUIDs[sourceName][342344] then
local line = CDList[sourceName][257541]
if line then
line:ReduceCD(1)
end
end
]]},
{382440,"MAGE",3,--Переходящая сила
{382440,60,0},
isTalent=true},
{205025,"MAGE",3,--Величие разума
nil,{205025,45,0},nil,nil,
isTalent=true,startCdAfterAuraFade=205025},
{235450,"MAGE,DEF",4,--Призматический барьер
nil,{235450,25,0},nil,nil,
isTalent=true,cdDiff={235463,"*0"}},
{475, "MAGE,DISPEL",5,--Снятие проклятия
{475,8,0},nil,nil,nil,
isTalent=true,isDispel=true},
{31687, "MAGE",3,--Призыв элементаля воды
nil,nil,nil,{31687,30,0},
hideWithTalent=205024},
{80353, "MAGE,UTIL",3,--Искажение времени
{80353,300,40},nil,nil,nil},
{321507,"MAGE",3,--Касание мага
nil,{321507,45,0},nil,nil},
{153626,"MAGE",3,--Чародейский шар
nil,{153626,20,0},nil,nil,
isTalent=true,hasCharges=384651},
{365350,"MAGE",3,--Чародейский выброс
nil,{365350,90,12},nil,nil,
isTalent=true,durationDiff={321739,3},
CLEU_SPELL_CAST_SUCCESS=[[
if spellID == 365350 and session_gGUIDs[sourceName][449412] then
local auraData = IsAuraActive(sourceName,448604)
if auraData then
local line = CDList[sourceName][365350]
if line then
line:ChangeDur(0.5 * (auraData.applications or 1))
end
end
end
]]},
{157981,"MAGE",3,--Взрывная волна
{157981,30,0},
isTalent=true,cdDiff={389627,-5}},
{153595,"MAGE",3,--Кометная буря
nil,nil,nil,{153595,30,0},
isTalent=true},
{257537,"MAGE",3,--Полярная стрела
nil,nil,nil,{257537,45,0},
isTalent=true},
{157997,"MAGE",3,--Кольцо обледенения
{157997,25,0},
isTalent=true},
{153561,"MAGE",3,--Метеор
{153561,45,0},
isTalent=true,cdDiff={416719,-15}},
{389713,"MAGE",3,--Перемещение
{389713,45,0},
isTalent=true},
{205021,"MAGE",3,--Морозный луч
nil,nil,nil,{205021,60,0},
isTalent=true},
{113724,"MAGE,AOECC",3,--Кольцо мороза
{113724,45,10},nil,nil,nil,
isTalent=true},
{157980,"MAGE",3,--Сверхновая
nil,{157980,45,0},nil,nil,
isTalent=true},
{203286,"MAGE,PVP",3,--Большая огненная глыба
nil,nil,{203286,15,0},nil,
isTalent=true},
{198144,"MAGE,PVP",3,--Ледяной облик
nil,nil,nil,{198144,60,15},
isTalent=true},
{198111,"MAGE,PVP",3,--Барьер времени
nil,{198111,45,4},nil,nil,
isTalent=true},
{212653,"MAGE,MOVE",4,--Мерцание
{212653,25,0},nil,nil,nil,
isTalent=true,hasCharges=1,cdDiff={382268,{-2,-4},336636,{-2,-2.2,-2.4,-2.6,-2.8,-3,-3.2,-3.4,-3.6,-3.8,-4,-4.2,-4.4,-4.6,-4.8}},ignoreUseWithAura=375240,changeCdWithAura={381750,"*0.85"},resetBy={{342245,342249}}},
{414660,"MAGE",3,--Массовая преграда
{414660,120,0},
isTalent=true},
{414664,"MAGE",3,--Массовая невидимость
{414664,300,12},
isTalent=true,cdDiff={415945,-240}},
{198100,"MAGE,PVP",3,--Kleptomania
nil,{198100,20,0},nil,nil,
isTalent=true},
{352278,"MAGE,PVP",3,--Ice Wall
{352278,90,0},
isTalent=true},
{353082,"MAGE,PVP",3,--Ring of fire
{353082,30,0},
isTalent=true},
{44614,"MAGE",3,--Flurry
nil,nil,nil,{44614,30,0},
isTalent=true},
{353128,"MAGE,PVP",3,--Arcanosphere
nil,{353128,45,0},
isTalent=true},
{389794,"MAGE,PVP",3,--Snowdrift
nil,nil,nil,{389794,45,0},
isTalent=true},
{390612,"MAGE,PVP",3,--Frost Bomb
nil,nil,nil,{390612,15,0},
isTalent=true},
{104316,"WARLOCK",3,--Призыв зловещих охотников
nil,nil,{104316,20,0},nil,
isTalent=true,cdDiff={212628,-5}},
{29893, "WARLOCK",3,--Создание источника душ
{29893,120,0},nil,nil,nil},
{111771,"WARLOCK",3,--Демонические врата
{111771,10,0},
isTalent=true},
{333889,"WARLOCK",3,--Власть Скверны
{333889,180,0},
isTalent=true,cdDiff={339130,{-48,-51,-54,-57,-60,-63,-66,-69,-72,-75,-78,-81,-84,-87,-90},386113,-60,449707,-90}},
{80240, "WARLOCK,DPS",3,--Хаос
nil,nil,nil,{80240,30,12},
isTalent=true,hideWithTalent=200546},
{342601,"WARLOCK",3,--Ритуал рока
{342601,3600,0},nil,nil,nil},
{698, "WARLOCK",3,--Ритуал призыва
{698,120,0},nil,nil,nil},
{30283, "WARLOCK,AOECC",1,--Неистовство Тьмы
{30283,60,3},
isTalent=true,cdDiff={264874,-15}},
{20707, "WARLOCK,RES",3,--Камень души
{20707,600,0},nil,nil,nil,
isBattleRes=true},
{205180,"WARLOCK,DPS",3,--Призыв созерцателя тьмы
nil,{205180,120,20},nil,nil,
isTalent=true,cdDiff={296320,"*0.80",334183,-60},reduceCdAfterCast={{278350,337020},-2,{267211,337020},-2,{688,337020},-2,{116858,337020},-4,{267217,337020},-2,{5740,337020},-6,{111898,337020},-2,{27243,337020},-2,{105174,337020},-4,{104316,337020},-4,{691,337020},-2,{712,337020},-2,{697,337020},-2,{342601,337020},-2,{324536,337020},-2,{264119,337020},-2,{17877,337020},-2,{278350,387084},-1.5,{267211,387084},-1.5,{688,387084},-1.5,{116858,387084},-3,{267217,387084},-1.5,{5740,387084},-6,{111898,387084},-1.5,{27243,387084},-1.5,{105174,387084},-3,{104316,387084},-3,{691,387084},-1.5,{712,387084},-1.5,{697,387084},-1.5,{342601,387084},-1.5,{324536,387084},-1.5,{264119,387084},-1.5,{17877,387084},-1.5}},
{265187,"WARLOCK,DPS",3,--Призыв демонического тирана
nil,nil,{265187,60,15},nil,
isTalent=true,cdDiff={296320,"*0.80"},reduceCdAfterCast={{278350,387084},-1.5,{267211,387084},-1.5,{688,387084},-1.5,{116858,387084},-3,{267217,387084},-1.5,{5740,387084},-6,{111898,387084},-1.5,{27243,387084},-1.5,{105174,387084},-3,{104316,387084},-3,{691,387084},-1.5,{712,387084},-1.5,{697,387084},-1.5,{342601,387084},-1.5,{324536,387084},-1.5,{264119,387084},-1.5,{17877,387084},-1.5}},
{1122, "WARLOCK,DPS",3,--Призыв инфернала
nil,nil,nil,{1122,120,30},
isTalent=true,cdDiff={296320,"*0.80"},reduceCdAfterCast={{278350,337020},-0.6,{278350,337020},-1.5,{267211,337020},-0.6,{267211,337020},-1.5,{688,337020},-0.6,{688,337020},-1.5,{116858,337020},-1.2,{116858,337020},-3,{267217,337020},-0.6,{267217,337020},-1.5,{5740,337020},-1.8,{5740,337020},-4.5,{111898,337020},-0.6,{111898,337020},-1.5,{27243,337020},-0.6,{27243,337020},-1.5,{105174,337020},-1.2,{105174,337020},-3,{104316,337020},-1.2,{104316,337020},-3,{691,337020},-0.6,{691,337020},-1.5,{712,337020},-0.6,{712,337020},-1.5,{697,337020},-0.6,{697,337020},-1.5,{342601,337020},-0.6,{342601,337020},-1.5,{324536,337020},-0.6,{324536,337020},-1.5,{264119,337020},-0.6,{264119,337020},-1.5,{17877,337020},-0.6,{17877,337020},-1.5,
{278350,387084},-1.5,{267211,387084},-1.5,{688,387084},-1.5,{116858,387084},-3,{267217,387084},-1.5,{5740,387084},-4.5,{111898,387084},-1.5,{27243,387084},-1.5,{105174,387084},-3,{104316,387084},-3,{691,387084},-1.5,{712,387084},-1.5,{697,387084},-1.5,{342601,387084},-1.5,{324536,387084},-1.5,{264119,387084},-1.5,{17877,387084},-1.5}},
{104773,"WARLOCK,DEF",4,--Твердая решимость
{104773,180,8},
cdDiff={386659,-45},
CLEU_PREP = [[
spell339272_var = {}
spell389359_var = {}
]],CLEU_SPELL_DAMAGE=[[
if destGUID and isWarlock[destGUID] and destName and (session_gGUIDs[destName][339272] or session_gGUIDs[destName][389359]) then
local maxHP = UnitHealthMax(destName)
if maxHP ~= 0 and ((amount / maxHP) > 0.05) then
local now = GetTime()
if (not spell339272_var[destGUID] or (now > spell339272_var[destGUID])) and session_gGUIDs[destName][339272] then
local soulbind_rank = _db.soulbind_rank[destName][339272] or SOULBIND_DEF_RANK_NOW
spell339272_var[destGUID] = now + (31 - soulbind_rank)
local line = CDList[destName][104773]
if line then
line:ReduceCD(10)
end
end
if (not spell389359_var[destGUID] or (now > spell389359_var[destGUID])) and session_gGUIDs[destName][389359] then
spell389359_var[destGUID] = now + 20
local line = CDList[destName][104773]
if line then
line:ReduceCD(10)
end
end
end
end
]]},
{386997,"WARLOCK",3,--Гниение души
nil,{386997,60,0},nil,nil,
isTalent=true,cdDiff={389630,{-15,-30}}},
{386833,"WARLOCK",3,--Гильотина
nil,nil,{386833,45,8},nil,
isTalent=true},
{267211,"WARLOCK",3,--Взрывные желчегнусы
nil,nil,{267211,30,0},nil,
isTalent=true},
{152108,"WARLOCK",3,--Катаклизм
nil,nil,nil,{152108,30,0},
isTalent=true},
{196447,"WARLOCK",3,--Направленный демонический огонь
nil,nil,nil,{196447,24,0},
isTalent=true},
{108416,"WARLOCK,DEF",3,--Темный пакт
{108416,60,0},
isTalent=true,cdDiff={386686,-15}},
{267171,"WARLOCK",3,--Демоническая сила
nil,nil,{267171,60,0},nil,
isTalent=true},
{108503,"WARLOCK",3,--Гримуар жертвоприношения
nil,{108503,30,0},nil,{108503,30,0},
isTalent=true},
{111898,"WARLOCK",3,--Гримуар: страж Скверны
nil,nil,{111898,120,0},nil,
isTalent=true},
{48181, "WARLOCK",3,--Блуждающий дух
nil,{48181,15,0},nil,nil,
isTalent=true},
{5484, "WARLOCK,CC",3,--Вой ужаса
{5484,40,0},
isTalent=true,cdDiff={429072,-15}},
{6789, "WARLOCK,CC",3,--Лик тлена
{6789,45,0},
isTalent=true},
{205179,"WARLOCK",3,--Призрачная сингулярность
nil,{205179,45,0},nil,nil,
isTalent=true},
{264130,"WARLOCK",3,--Вытягивание сил
nil,nil,{264130,30,0},nil,
isTalent=true},
{6353, "WARLOCK",3,--Ожог души
nil,nil,nil,{6353,45,0},
isTalent=true},
{264119,"WARLOCK",3,--Призыв мерзотня
nil,nil,{264119,30,0},nil,
isTalent=true},
{278350,"WARLOCK",3,--Пагуба
nil,{278350,30,0},nil,nil,
isTalent=true},
{132409,"WARLOCK,KICK",3,--Запрет чар
nil,{132409,24,0},nil,{132409,24,0},
isTalent=true},
{328774,"WARLOCK",3,--Усиление проклятия
{328774,60,0},
isTalent=true,cdDiff={387972,-15}},
{212459,"WARLOCK,PVP",3,--Призыв повелителя Скверны
nil,nil,{212459,120,15},nil,
isTalent=true},
{201996,"WARLOCK,PVP",3,--Вызов наблюдателя
nil,nil,{201996,60,20},nil,
isTalent=true},
{212295,"WARLOCK,PVP",3,--Оберег Пустоты
{212295,45,3},nil,nil,nil,
isTalent=true},
{344566,"WARLOCK,PVP",3,--Быстрое заражение
{344566,30,0},nil,nil,
isTalent=true},
{410598,"WARLOCK,PVP",3,--Soul Rip
{410598,60,0},
isTalent=true},
{353753,"WARLOCK,PVP",3,--Bonds of Fel
{353753,30,0},
isTalent=true},
{417537,"WARLOCK",3,--Oblivion
nil,{417537,45,0},
isTalent=true},
{353294,"WARLOCK,PVP",3,--Shadow Rift
nil,nil,{353294,60,0},{353294,360,0},
isTalent=true},
{442726,"WARLOCK",3,--Malevolence
nil,{442726,60,0},
isTalent=true},
{115181,"MONK",3,--Пламенное дыхание
nil,{115181,15,0},nil,nil,
isTalent=true},
{322507,"MONK",3,--Божественный отвар
nil,{322507,45,0},nil,nil,
isTalent=true,cdDiff={325093,"*0.8"},hasCharges=450892,resetBy=115399},
{324312,"MONK",3,--Столкновение
nil,{324312,45,0},nil,nil,
isTalent=true},
{218164,"MONK,DISPEL",5,--Детоксикация
{218164,8,0},nil,nil,nil,
isTalent=true,baseForSpec=270,sameSpell={218164,115450},isDispel=true},
{322101,"MONK",3,--Устранение вреда
{322101,15,0},nil,nil,nil},
{113656,"MONK",3,--Неистовые кулаки
nil,nil,{113656,24,0},nil,
isTalent=true,changeDurWithHaste=true,changeCdWithHaste=true,
CLEU_SPELL_DAMAGE=[[
if spellID == 107428 and critical and (session_gGUIDs[sourceName][337481] or session_gGUIDs[sourceName][392993]) then
local line = CDList[sourceName][113656]
if line then
line:ReduceCD(4)
end
end
]]},
{101545,"MONK,MOVE",3,--Удар летящего змея
nil,nil,{101545,30,0},nil,
isTalent=true},
{115203,"MONK,DEFTANK,DEF",4,--Укрепляющий отвар
nil,{115203,360,15},{115203,120,15},{115203,120,15},
isTalent=true,cdDiff={{388813,268},-120,{388813,269},-30,{388813,270},-30,296320,"*0.80",202107,"*0.5"},sameSpell={115203,243435},reduceCdAfterCast={121253,-3,{121253,196736},-2}},
{132578,"MONK",3,--Призыв Нюцзао, Черного Быка
nil,{132578,180,0},nil,nil,
isTalent=true,reduceCdAfterCast={{121253,337264},-0.5,{322729,337264},-0.5,{205523,337264},-0.5,{121253,387219},{-0.25,-0.5},{322729,387219},{-0.25,-0.5},{205523,387219},{-0.25,-0.5}}},
{123904,"MONK,DPS",3,--Призыв Сюэня, Белого Тигра
nil,nil,{123904,120,20},nil,
isTalent=true},
{322118,"MONK,HEAL",3,--Призыв Юй-лун, Нефритовой Змеи
nil,nil,nil,{322118,180,25},
isTalent=true,hideWithTalent=325197,cdDiff={388212,-120},durationDiff={388212,-12},reduceCdAfterCast={{115151,336773},-0.3,{116670,336773},-0.3,{322101,336773},-0.3,{124682,336773},-0.3,{115151,388031},-0.3,{116670,388031},-0.3,{322101,388031},-0.3,{124682,388031},-0.3}},
{119381,"MONK,AOECC",1,--Круговой удар ногой
{119381,60,3},nil,nil,nil,
cdDiff={344359,{-5,-10}}},
{116849,"MONK,DEFTAR",2,--Исцеляющий кокон
nil,nil,nil,{116849,120,12},
isTalent=true,cdDiff={277667,-20,202424,-45},stopDurWithAuraFade=116849},
{115078,"MONK,CC",3,--Паралич
{115078,45,0},
isTalent=true,cdDiff={344359,{-7.5,-15}},
CLEU_SPELL_INTERRUPT=[[
if sourceName and session_gGUIDs[sourceName][450631] then
local line = CDList[sourceName][115078]
if line then
line:ReduceCD(5)
end
end
]]},
{115546,"MONK,TAUNT",5,--Вызов
{115546,8,0},nil,nil,nil,
hideWithTalent=207025},
{119582,"MONK",3,--Очищающий отвар
nil,{119582,20,0},nil,nil,
isTalent=true,hasCharges=1,changeCdWithHaste=true,sameSpell={115308,119582},cdDiff={325093,"*0.8"}},
{115310,"MONK,RAID",1,--Восстановление сил
nil,nil,nil,{115310,180,0},
isTalent=true,cdDiff={296320,"*0.80",353313,"*0.5"},reduceCdAfterCast={{107428,337099},-1,{107428,388551},-1},
CLEU_SPELL_HEAL=[[
if spellID == 116670 and critical and (session_gGUIDs[sourceName][278576] or session_gGUIDs[sourceName][388551]) then
local line = CDList[sourceName][115310]
if line then
line:ReduceCD(1)
end
end
]]},
{388615,"MONK,RAID",1,--Восстановление здоровья
nil,nil,nil,{388615,180,0},
isTalent=true,reduceCdAfterCast={{107428,388551},-1},
CLEU_SPELL_HEAL=[[
if spellID == 116670 and critical and (session_gGUIDs[sourceName][278576] or session_gGUIDs[sourceName][388551]) then
local line = CDList[sourceName][388615]
if line then
line:ReduceCD(1)
end
end
]]},
{107428,"MONK",3,--Удар восходящего солнца
{107428,10,0},
isTalent=true,changeCdWithHaste=true},
{109132,"MONK,MOVE",3,--Кувырок
{107428,20,0},nil,nil,nil,
hasCharges=1,cdDiff={115173,-5},ignoreUseWithAura=375252,changeCdWithAura={381751,"*0.85"},hideWithTalent=115008,reduceCdAfterCast={{116841,451041},-5},
CLEU_SPELL_INTERRUPT=[[
if sourceName and session_gGUIDs[sourceName][450631] then
local line = CDList[sourceName][109132]
if line then
line:ReduceCD(5)
end
end
]]},
{115008,"MONK,MOVE",4,--Ци-полет
{115008,20,0},nil,nil,nil,
isTalent=true,hasCharges=1,ignoreUseWithAura=375252,changeCdWithAura={381751,"*0.85"},reduceCdAfterCast={{116841,451041},-5},
CLEU_SPELL_INTERRUPT=[[
if sourceName and session_gGUIDs[sourceName][450631] then
local line = CDList[sourceName][115008]
if line then
line:ReduceCD(5)
end
end
]]},
{116705,"MONK,KICK",3,--Рука-копье
{116705,15,0},
isTalent=true},
{137639,"MONK,DPS",3,--Буря, земля и огонь
nil,nil,{137639,90,15},nil,
isTalent=true,hasCharges=1,cdDiff={296320,"*0.80"},hideWithTalent=152173,reduceCdAfterCast={{107428,280197},-1,{101546,280197},-0.5,{100784,280197},-0.5,{113656,280197},-1.5}},
{116680,"MONK",3,--Громовой чай
nil,nil,nil,{116680,30,0},
isTalent=true,startCdAfterAuraFade=116680,hasCharges=450892},
{322109,"MONK",3,--Смертельное касание
{322109,180,0},nil,nil,nil,
cdDiff={337296,-120,394123,-90}},
{122470,"MONK,DEF",3,--Закон кармы
nil,nil,{122470,90,10},nil,
isTalent=true,
CLEU_SPELL_DAMAGE=[[
if spellID == 322109 and session_gGUIDs[sourceName][345829] and module.IsPvpTalentsOn(sourceName) then
if overkill and overkill > 0 and bit.band(destFlags or 0,0x400) > 0 then
local line = CDList[sourceName][122470]
if line then
line:ReduceCD(60)
end
end
end
]]},
{392983,"MONK",3,--Удар Владыки Ветра
nil,nil,{392983,40,0},nil,
isTalent=true,cdDiff={451576,-10}},
{101643,"MONK",4,--Трансцендентность
{101643,10,0},
isTalent=true},
{119996,"MONK,MOVE",4,--Трансцендентность: перенос
{119996,45,0},nil,nil,nil,
cdDiff={216255,-15}},
{115176,"MONK,DEFTANK",4,--Дзен-медитация
nil,{115176,300,8},nil,nil,
isTalent=true,cdDiff={387035,"*0.75",202200,"*0.50"},stopDurWithAuraFade=115176},
{126892,"MONK",3,--Духовное путешествие
{126892,60,0},nil,nil,nil},
{115399,"MONK",3,--Отвар Черного Быка
nil,{115399,120,0},nil,nil,
isTalent=true},
{123986,"MONK",3,--Выброс ци
{123986,30,0},
isTalent=true},
{122278,"MONK,DEF",3,--Смягчение удара
{122278,120,10},
isTalent=true},
{122783,"MONK,DEF",4,--Распыление магии
{122783,90,6},
isTalent=true},
{325153,"MONK",3,--Взрывной бочонок
nil,{325153,60,0},nil,nil,
isTalent=true},
{325197,"MONK,HEAL",3,--Призыв Чи-Цзи, Красного Журавля
nil,nil,nil,{325197,180,25},
isTalent=true,cdDiff={388212,-120},durationDiff={388212,-12},reduceCdAfterCast={{115151,336773},-0.3,{116670,336773},-0.3,{322101,336773},-0.3,{124682,336773},-0.3,{115151,388031},-0.3,{116670,388031},-0.3,{322101,388031},-0.3,{124682,388031},-0.3}},
{116844,"MONK,UTIL",1,--Круг мира
{116844,45,5},
isTalent=true,cdDiff={450448,-5}},
{198898,"MONK",3,--Песнь Чи-Цзи
nil,nil,nil,{198898,30,0},
isTalent=true},
{115315,"MONK",3,--Призыв статуи Черного Быка
{115315,10,0},
isTalent=true},
{115313,"MONK",3,--Призыв статуи Нефритовой Змеи
{115313,10,0},
isTalent=true},
{116841,"MONK,UTIL,RAIDSPEED",2,--Тигриное рвение
{116841,30,6},nil,nil,nil,
isTalent=true},
{152175,"MONK",3,--Удар крутящегося дракона
nil,nil,{152175,30,0},nil,
isTalent=true,changeCdWithHaste=true,cdDiff={451524,-5}},
{207025,"MONK,PVP",3,--Осуждение
nil,{207025,20,0},nil,nil,
isTalent=true},
{202162,"MONK,PVP",3,--Отведение ударов
nil,{202162,45,15},nil,nil,
isTalent=true},
{202335,"MONK,PVP",3,--Пара бочек
nil,{202335,45,0},nil,nil,
isTalent=true},
{233759,"MONK,PVP",3,--Захват оружия
{233759,45,6},
isTalent=true},
{202370,"MONK,PVP",3,--Удар могучего быка
nil,{202370,30,0},nil,{202370,30,0},
isTalent=true},
{209584,"MONK,PVP",3,--Чай дзен-концентрации
nil,nil,nil,{209584,30,5},
isTalent=true},
{388193,"MONK",3,--Волшебная линия
nil,nil,{388193,15,0},{388193,15,0},
isTalent=true,cdDiff={406888,-10}},
{354540,"MONK,PVP",3,--Nimble Brew
nil,{354540,90,0},
isTalent=true},
{443028,"MONK",3,--Celestial Conduit
nil,nil,nil,{443028,90,0},
isTalent=true},
{387184,"MONK",3,--Weapons of Order
nil,{387184,120,0},
isTalent=true},
{22812, "DRUID,DEFTANK,DEF",4,--Дубовая кожа
{22812,60,8},nil,nil,nil,nil,
durationDiff={329800,8,327993,4,393611,1},cdDiff={203965,{"*0.85","*0.7"},340529,{"*0.9","*0.89","*0.88","*0.87","*0.86","*0.85","*0.84","*0.83","*0.82","*0.81","*0.80","*0.79","*0.78","*0.76"}}},
{50334, "DRUID,DPS",3,--Берсерк
nil,nil,nil,{50334,180,15},nil,
cdDiff={339062,-30,329802,-54},hideWithTalent=102558},
{106951,"DRUID,DPS",3,--Берсерк
nil,nil,{106951,180,15},nil,nil,
isTalent=true,cdDiff={296320,"*0.80",329802,-54,391174,-60},hideWithTalent=102543,reduceCdAfterCast={{274837,340053,103},-0.2,{106785,340053,103},-0.2,{202028,340053,103},-0.2,{5221,340053,103},-0.2,{1822,340053,103},-0.2,{106830,340053,103},-0.2}},
{194223,"DRUID,DPS",3,--Парад планет
nil,{194223,180,20},nil,nil,nil,
isTalent=true,durationDiff={340706,{5,5.5,6,6.5,7,7.5,8,8.5,9,9.5,10,10.5,11,11.5,12}},cdDiff={296320,"*0.80",329802,-54},hideWithTalent=102560},
{391528,"DRUID,DPS",3,--Созыв духов
{391528,120,0},
isTalent=true,cdDiff={391548,"*0.5",393991,"*0.5",393371,"*0.5",393414,"*0.5"}},
{1850, "DRUID,MOVE",4,--Порыв
{1850,120,10},nil,nil,nil,nil,
hideWithTalent=252216,ignoreUseWithAura=375230,changeCdWithAura={381746,"*0.85"}},
{22842, "DRUID,DEFTANK",4,--Неистовое восстановление
{22842,36,3},nil,nil,nil,nil,
isTalent=true,baseForSpec=104,hasCharges={273048,319454},changeCdWithHaste=true,cdDiff={372945,{"*0.8","*0.6"},50334,{"*0.001",50334,103211}},
CLEU_PREP=[[
berserk = {}
]],CLEU_SPELL_AURA_APPLIED=[[
if spellID == 50334 and destName then --Berserk
if berserk[destName] then
berserk[destName]:Cancel()
end
berserk[destName] = C_Timer.NewTicker(1,function()
local updateReq
local line = CDList[destName][22842]
if line then
line:ReduceCD( (1 + (UnitSpellHaste(destName) or 0)/100)*3 )
end
end, 15)
end
]],CLEU_SPELL_AURA_REMOVED=[[
if spellID == 50334 and destName then --Berserk
C_Timer.After(.5,function()
if berserk[destName] then
berserk[destName]:Cancel()
end
end)
end
]]},
{6795, "DRUID,TAUNT",5,--Рык
{6795,8,0},nil,nil,nil,nil,
hideWithTalent=207017,cdDiff={50334,{"*0.50",50334,103216}}},
{99, "DRUID,CC",3,--Парализующий рык
{99,30,0},nil,nil,nil,nil,
isTalent=true},
{29166, "DRUID,HEALUTIL",2,--Озарение
{29166,180,8},
isTalent=true,
CLEU_SPELL_HEAL=[[
if spellID == 48438 and session_gGUIDs[sourceName][287251] then
local line = CDList[sourceName][29166]
if line then
if (amount - overhealing) == 0 then
line:ReduceCD(1)
end
end
end
]]},
{102342,"DRUID,DEFTAR",2,--Железная кора
nil,nil,nil,nil,{102342,90,12},
isTalent=true,cdDiff={382552,-20},durationDiff={392116,4}},
{22570, "DRUID",3,--Калечение
{22570,20,0},
isTalent=true},
{88423, "DRUID,DISPEL",5,--Природный целитель
nil,nil,nil,nil,{88423,8,0},
isDispel=true},
{132158,"DRUID",3,--Природная стремительность
nil,nil,nil,nil,{132158,60,0},
isTalent=true,cdDiff={382550,-12,340550,{"*0.9","*0.89","*0.88","*0.87","*0.86","*0.85","*0.84","*0.83","*0.82","*0.81","*0.80","*0.79","*0.78","*0.76"}},startCdAfterAuraFade=132158},
{20484, "DRUID,RES",1,--Возрождение
{20484,600,0},nil,nil,nil,nil,
isBattleRes=true},
{2782, "DRUID,DISPEL",5,--Снятие порчи
nil,{2782,8,0},{2782,8,0},{2782,8,0},nil,
isTalent=true,isDispel=true},
{106839,"DRUID,KICK",5,--Лобовая атака
{106839,15,0},
isTalent=true},
{78675, "DRUID,KICK",5,--Столп солнечного света
nil,{78675,60,8},nil,nil,nil,
isTalent=true,
CLEU_SPELL_CAST_SUCCESS=[[
if sourceName and spellID == 78675 and session_gGUIDs[sourceName][202918] then
solarKickTarget = destGUID
solarKickTime = timestamp
end
]],CLEU_SPELL_INTERRUPT=[[
if sourceName and spellID == 78675 and session_gGUIDs[sourceName][202918] and solarKickTarget and solarKickTarget == destGUID and timestamp - solarKickTime < 10 then
local line = CDList[sourceName][78675]
if line then
line:ReduceCD(15)
end
end
]]},
{124974,"DRUID",3,--Природная чуткость
{124974,90,30},
isTalent=true},
{2908, "DRUID",5,--Умиротворение
{2908,10,0},nil,nil,nil,nil,
isTalent=true},
{106898,"DRUID,RAIDSPEED",1,--Тревожный рев
{106898,120,8},nil,nil,nil,nil,
isTalent=true,durationDiff={341450,{"*1.15","*1.165","*1.18","*1.195","*1.21","*1.225","*1.24","*1.255","*1.27","*1.285","*1.30","*1.315","*1.33","*1.345","*1.36"},441844,"*1.25"},cdDiff={288826,-60},sameSpell={106898,77764,77761},
CLEU_SPELL_INTERRUPT=[[
if sourceName and spellID == 106839 and session_gGUIDs[sourceName][205673] and module.IsPvpTalentsOn(sourceName) then
local line = CDList[sourceName][106898]
if line then
line:ReduceCD(10)
end
end
]]},
{61336, "DRUID,DEFTANK,DEF",3,--Инстинкты выживания
nil,nil,{61336,180,6},{61336,180,6},nil,
isTalent=true,hasCharges=328767,cdDiff={203965,"*0.67",296320,"*0.80"},
CLEU_SPELL_INTERRUPT=[[
if sourceName and spellID == 106839 and session_gGUIDs[sourceName][205673] and module.IsPvpTalentsOn(sourceName) then
local line = CDList[sourceName][61336]
if line then
line:ReduceCD(10)
end
end
]]},
{18562, "DRUID",3,--Быстрое восстановление
nil,nil,nil,nil,{18562,15,0},
isTalent=true,hasCharges=200383,cdDiff={200383,-3}},
{5217, "DRUID,DPS",3,--Тигриное неистовство
nil,nil,{5217,30,10},nil,nil,
isTalent=true,durationDiff={202021,5},
CLEU_SPELL_INTERRUPT=[[
if sourceName and spellID == 106839 and session_gGUIDs[sourceName][205673] and module.IsPvpTalentsOn(sourceName) then
local line = CDList[sourceName][5217]
if line then
line:ReduceCD(10)
end
end
]]},
{740, "DRUID,RAID",1,--Спокойствие
nil,nil,nil,nil,{740,180,8},
isTalent=true,cdDiff={197073,-30,329802,-54,296320,"*0.80"},changeDurWithHaste=true,
CLEU_SPELL_HEAL=[[
if spellID == 157982 and event == "SPELL_HEAL" and sourceGUID == destGUID and session_gGUIDs[sourceName][392162] then
local line, updateReq
for j=1,#_C do
line = _C[j]
if line.fullName == sourceName and line.db[1] ~= 740 then
line:ReduceCD(3,true)
updateReq = true
end
end
if updateReq then
UpdateAllData()
end
end
]]},
{132469,"DRUID,UTIL",3,--Тайфун
{61391,30,0},nil,nil,nil,nil,
isTalent=true},
{102793,"DRUID,UTIL",3,--Вихрь Урсола
{102793,60,10},nil,nil,nil,nil,
isTalent=true},
{200851,"DRUID",3,--Ярость Спящего
nil,nil,nil,{200851,60,10},nil,
isTalent=true},
{48438, "DRUID",3,--Буйный рост
{48438,10,0},
isTalent=true},
{155835,"DRUID,DEFTANK",3,--Колючий мех
nil,nil,nil,{155835,40,0},nil,
isTalent=true},
{102351,"DRUID",3,--Щит Кенария
nil,nil,nil,nil,{102351,30,0},
isTalent=true},
{274837,"DRUID",3,--Дикое бешенство
nil,nil,{274837,45,0},nil,nil,
isTalent=true},
{197721,"DRUID,HEAL",3,--Расцвет
nil,nil,nil,nil,{197721,60,6},
isTalent=true},
{205636,"DRUID,UTIL",3,--Сила природы
nil,{205636,60,10},nil,nil,nil,
isTalent=true,cdDiff={428937,-15}},
{202770,"DRUID",3,--Ярость Элуны
nil,{202770,60,8},nil,nil,nil,
isTalent=true,cdDiff={394121,-15}},
{319454,"DRUID",3,--Сердце дикой природы
{108293,300,45},nil,nil,nil,nil,
isTalent=true,cdDiff={341451,{"*0.9","*0.89","*0.88","*0.87","*0.86","*0.85","*0.84","*0.83","*0.82","*0.81","*0.80","*0.79","*0.78","*0.76"}},sameSpell={108293,108291,319454}},
{102560,"DRUID,DPS",3,--Воплощение: избранный Элуны
nil,{102560,180,30},nil,nil,nil,
isTalent=true,cdDiff={329802,-54}},
{102558,"DRUID,DEFTANK",3,--Воплощение: Страж Урсока
nil,nil,nil,{102558,180,30},nil,
isTalent=true,cdDiff={339062,-30,329802,-54}},
{102543,"DRUID,DPS",3,--Воплощение: король джунглей
nil,nil,{102543,180,30},nil,nil,
isTalent=true,cdDiff={329802,-54},reduceCdAfterCast={{274837,340053,103},-0.2,{106785,340053,103},-0.2,{202028,340053,103},-0.2,{5221,340053,103},-0.2,{1822,340053,103},-0.2,{106830,340053,103},-0.2}},
{33891, "DRUID,HEAL",3,--Воплощение: древо жизни
nil,nil,nil,nil,{33891,180,30},
isTalent=true,cdDiff={329802,-54},startCdAfterAuraApply=117679},
{102359,"DRUID,UTIL",3,--Массовое оплетение
{102359,30,0},nil,nil,nil,nil,
isTalent=true,cdDiff={341451,{"*0.9","*0.89","*0.88","*0.87","*0.86","*0.85","*0.84","*0.83","*0.82","*0.81","*0.80","*0.79","*0.78","*0.76"}}},
{5211, "DRUID,CC",3,--Мощное оглушение
{5211,60,0},nil,nil,nil,nil,
isTalent=true,cdDiff={341451,{"*0.9","*0.89","*0.88","*0.87","*0.86","*0.85","*0.84","*0.83","*0.82","*0.81","*0.80","*0.79","*0.78","*0.76"}}},
{203651,"DRUID",3,--Буйство природы
nil,nil,nil,nil,{203651,60,0},
isTalent=true},
{391888,"DRUID",3,--Адаптивный рой
{391888,25,0},
isTalent=true},
{80313, "DRUID",3,--Раздавить
nil,nil,nil,{80313,45,0},nil,
isTalent=true,cdDiff={441846,-5}},
{108238,"DRUID,DEF",3,--Обновление
{108238,90,0},nil,nil,nil,nil,
isTalent=true},
{252216,"DRUID,MOVE",3,--Рывок тигра
{252216,45,5},nil,nil,nil,nil,
isTalent=true,ignoreUseWithAura=375230,changeCdWithAura={381746,"*0.85"}},
{202425,"DRUID",3,--Воин Элуны
nil,{202425,45,0},nil,nil,nil,
isTalent=true,startCdAfterAuraFade=202425},
{102401,"DRUID,MOVE",3,--Стремительный рывок
{102401,15,0},nil,nil,nil,nil,
isTalent=true},
{207017,"DRUID,PVP",3,--Вызов вожака
nil,nil,nil,{207017,20,0},nil,
isTalent=true},
{201664,"DRUID,PVP",3,--Деморализующий рев
nil,nil,nil,{201664,30,8},nil,
isTalent=true},
{209749,"DRUID,PVP",3,--Волшебный рой
nil,{209749,30,5},nil,nil,nil,
isTalent=true},
{202246,"DRUID,PVP",3,--Накат
nil,nil,nil,{202246,25,0},nil,
isTalent=true},
{329042,"DRUID,PVP",3,--Изумрудная дрема
nil,nil,nil,{329042,120,0},nil,
isTalent=true},
{305497,"DRUID,PVP",3,--Шипы
nil,{305497,45,12},{305497,45,12},nil,{305497,45,12},
isTalent=true},
{204066,"DRUID,PVP",3,--Lunar Beam
nil,nil,nil,{204066,60,8},nil,
isTalent=true},
{188499,"DEMONHUNTER",3,--Танец клинков
nil,{188499,10,0},nil,
changeCdWithHaste=true,resetBy=191427},
{198589,"DEMONHUNTER,DEF",4,--Затуманивание
nil,{198589,60,10},nil,
cdDiff={338671,{-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-20}},startCdAfterAuraApply=212800},
{179057,"DEMONHUNTER,AOECC",3,--Кольцо Хаоса
{179057,45,2},
isTalent=true,cdDiff={206477,"*0.8"}},
{278326,"DEMONHUNTER",5,--Поглощение магии
{278326,10,0},nil,nil,
isTalent=true},
{196718,"DEMONHUNTER,RAID",1,--Мрак
{196718,300,8},
isTalent=true,durationDiff={389781,3,357419,2},cdDiff={389783,-120}},
{203720,"DEMONHUNTER,DEFTANK",3,--Демонические шипы
nil,nil,{203720,20,0},
hasCharges=1,changeCdWithHaste=true},
{183752,"DEMONHUNTER,KICK",5,--Прерывание
{183752,15,0},nil,nil},
{198013,"DEMONHUNTER",3,--Пронзающий взгляд
nil,{198013,40,0},nil,
isTalent=true,resetBy=191427},
{212084,"DEMONHUNTER",3,--Опустошение Скверной
nil,nil,{212084,40,0},
isTalent=true},
{195072,"DEMONHUNTER,MOVE",3,--Рывок Скверны
nil,{195072,10,0},nil,
hasCharges=320416,cdDiff={391397,{"*0.9","*0.8"},337685,"*0.7"},ignoreUseWithAura=375229,changeCdWithAura={381741,"*0.85"}},
{189110,"DEMONHUNTER,MOVE",3,--Инфернальный удар
nil,nil,{189110,20,0},
hasCharges=320416,cdDiff={391397,{"*0.9","*0.8"}},ignoreUseWithAura=375229,changeCdWithAura={381741,"*0.85"}},
{204021,"DEMONHUNTER",3,--Огненное клеймо
nil,nil,{204021,60,10},
isTalent=true,hasCharges=389732,cdDiff={389732,-15,338671,{-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15,-16,-17,-18,-20}}},
{258920,"DEMONHUNTER",3,--Обжигающий жар
{258920,25,0},nil,nil,
hasCharges=427775},
{217832,"DEMONHUNTER,CC",3,--Пленение
{217832,45,0},nil,nil,
isTalent=true,cdDiff={205506,15}},
{191427,"DEMONHUNTER,DPS,DEFTANK",3,--Метаморфоза
nil,{191427,180,20},{187827,180,15},
durationDiff={235893,-15},cdDiff={320421,{-30,-60},235893,-60,296320,"*0.80"},sameSpell={200166,191427}},
{204596,"DEMONHUNTER",3,--Печать огня
{204596,30,2},
isTalent=true,durationDiff={209281,-1},cdDiff={211489,"*0.75"},hasCharges=428557,
CLEU_PREP = [[
spell389718_var204596 = {}
]],CLEU_SPELL_AURA_APPLIED=[[
if sourceName and (spellID == 204598 or spellID == 207685 or spellID == 204490 or spellID == 204843) and session_gGUIDs[sourceName][389718] then
if (timestamp - (spell389718_var204596[sourceName] or 0)) > 0.1 then
spell389718_var204596[sourceName] = timestamp
local line = CDList[sourceName][204596]
if line then
line:ReduceCD(2)
end
end
end
]],CLEU_SPELL_DAMAGE=[[
if sourceName and (spellID == 389860) and session_gGUIDs[sourceName][389718] then
if (timestamp - (spell389718_var204596[sourceName] or 0)) > 0.1 then
spell389718_var204596[sourceName] = timestamp
local line = CDList[sourceName][204596]
if line then
line:ReduceCD(2)
end
end
end
]]},
{207684,"DEMONHUNTER,AOECC",1,--Печать страдания
{207684,120,2},
isTalent=true,durationDiff={209281,-1},cdDiff={320418,-30,211489,"*0.75"},hasCharges=428557,
CLEU_PREP = [[
spell389718_var207684 = {}
]],CLEU_SPELL_AURA_APPLIED=[[
if sourceName and (spellID == 204598 or spellID == 207685 or spellID == 204490 or spellID == 204843) and session_gGUIDs[sourceName][389718] then
if (timestamp - (spell389718_var207684[sourceName] or 0)) > 0.1 then
spell389718_var207684[sourceName] = timestamp
local line = CDList[sourceName][207684]
if line then
line:ReduceCD(2)
end
end
end
]],CLEU_SPELL_DAMAGE=[[
if sourceName and (spellID == 389860) and session_gGUIDs[sourceName][389718] then
if (timestamp - (spell389718_var207684[sourceName] or 0)) > 0.1 then
spell389718_var207684[sourceName] = timestamp
local line = CDList[sourceName][207684]
if line then
line:ReduceCD(2)
end
end
end
]]},
{202137,"DEMONHUNTER,UTIL",1,--Печать немоты
nil,nil,{202137,90,2},
isTalent=true,durationDiff={209281,-1},cdDiff={211489,"*0.75"},hasCharges=428557,
CLEU_PREP = [[
spell389718_var202137 = {}
]],CLEU_SPELL_AURA_APPLIED=[[
if sourceName and (spellID == 204598 or spellID == 207685 or spellID == 204490 or spellID == 204843) and session_gGUIDs[sourceName][389718] then
if (timestamp - (spell389718_var202137[sourceName] or 0)) > 0.1 then
spell389718_var202137[sourceName] = timestamp
local line = CDList[sourceName][202137]
if line then
line:ReduceCD(2)
end
end
end
]],CLEU_SPELL_DAMAGE=[[
if sourceName and (spellID == 389860) and session_gGUIDs[sourceName][389718] then
if (timestamp - (spell389718_var202137[sourceName] or 0)) > 0.1 then
spell389718_var202137[sourceName] = timestamp
local line = CDList[sourceName][202137]
if line then
line:ReduceCD(2)
end
end
end
]]},
{188501,"DEMONHUNTER",3,--Призрачное зрение
{188501,30,10},nil,nil,
stopDurWithAuraFade=188501,durationDiff={389849,6},cdDiff={391429,30}},
{185123,"DEMONHUNTER",3,--Бросок боевого клинка
{185123,9,0},nil,nil},
{185245,"DEMONHUNTER,TAUNT",5,--Мучение
{185245,8,0},nil,nil,
hideWithTalent=207029},
{370965,"DEMONHUNTER",3,--Охота
{370965,90,0},
isTalent=true},
{198793,"DEMONHUNTER",3,--Коварное отступление
{198793,25,0},
isTalent=true,cdDiff={389688,-5}},
{320341,"DEMONHUNTER",3,--Массовое извлечение
nil,nil,{320341,60,0},
isTalent=true},
{258860,"DEMONHUNTER",3,--Разрыв сущности
nil,{258860,40,0},nil,
isTalent=true},
{258925,"DEMONHUNTER",3,--Обстрел Скверны
nil,{258925,90,0},nil,
isTalent=true},
{211881,"DEMONHUNTER,CC",3,--Извержение Скверны
nil,{211881,30,0},nil},
{232893,"DEMONHUNTER",3,--Клинок Скверны
{232893,15,0},nil,nil,
isTalent=true,changeCdWithHaste=true},
{342817,"DEMONHUNTER",3,--Буря клинков
nil,{342817,20,0},nil,
isTalent=true,changeCdWithHaste=true},
{196555,"DEMONHUNTER,DEF",3,--Путь Пустоты
nil,{196555,180,6},nil,
isTalent=true},
{202138,"DEMONHUNTER,UTIL",3,--Печать цепей
nil,nil,{202138,60,2},
isTalent=true,cdDiff={211489,"*0.75"},hasCharges=428557,
CLEU_PREP = [[
spell389718_var202138 = {}
]],CLEU_SPELL_AURA_APPLIED=[[
if sourceName and (spellID == 204598 or spellID == 207685 or spellID == 204490 or spellID == 204843) and session_gGUIDs[sourceName][389718] then
if (timestamp - (spell389718_var202138[sourceName] or 0)) > 0.1 then
spell389718_var202138[sourceName] = timestamp
local line = CDList[sourceName][202138]
if line then
line:ReduceCD(2)
end
end
end
]],CLEU_SPELL_DAMAGE=[[
if sourceName and (spellID == 389860) and session_gGUIDs[sourceName][389718] then
if (timestamp - (spell389718_var202138[sourceName] or 0)) > 0.1 then
spell389718_var202138[sourceName] = timestamp
local line = CDList[sourceName][202138]
if line then
line:ReduceCD(2)
end
end
end
]]},
{263648,"DEMONHUNTER",3,--Призрачный барьер
nil,nil,{263648,30,0},
isTalent=true},
{390163,"DEMONHUNTER",3,--Элизийский декрет
nil,nil,{390163,60,2},
isTalent=true,
CLEU_PREP = [[
spell389718_var390163 = {}
]],CLEU_SPELL_AURA_APPLIED=[[
if sourceName and (spellID == 204598 or spellID == 207685 or spellID == 204490 or spellID == 204843) and session_gGUIDs[sourceName][389718] then
if (timestamp - (spell389718_var390163[sourceName] or 0)) > 0.1 then
spell389718_var390163[sourceName] = timestamp
local line = CDList[sourceName][390163]
if line then
line:ReduceCD(2)
end
end
end
]],CLEU_SPELL_DAMAGE=[[
if sourceName and (spellID == 389860) and session_gGUIDs[sourceName][389718] then
if (timestamp - (spell389718_var390163[sourceName] or 0)) > 0.1 then
spell389718_var390163[sourceName] = timestamp
local line = CDList[sourceName][390163]
if line then
line:ReduceCD(2)
end
end
end
]]},
{205630,"DEMONHUNTER,PVP",3,--Хватка Иллидана
nil,nil,{205630,60,0},
isTalent=true},
{206803,"DEMONHUNTER,PVP",3,--Удар с небес
nil,{206803,60,0},nil,
isTalent=true},
{205604,"DEMONHUNTER,PVP",3,--Обращение магии
{205604,60,0},nil,nil,
isTalent=true},
{207029,"DEMONHUNTER,PVP",3,--Мучитель
nil,nil,{207029,20,0},
isTalent=true},
{358267,"EVOKER,MOVE",3,--Бреющий полет
{358267,35,0},
hasCharges=365933,ignoreUseWithAura=375234,changeCdWithAura={381748,"*0.85"},resetBy={{357210,441257}},cdDiff={429483,-5}},
{357210,"EVOKER",3,--Глубокий вдох
{357210,120,0},
cdDiff={386348,-60}},
{364342,"EVOKER",3,--Дар бронзовых драконов
{364342,15,0},nil,nil},
{360995,"EVOKER",3,--Живительные объятия
nil,{360995,24,0},{360995,17,0},{360995,24,0},
isTalent=true},
{355913,"EVOKER",3,--Изумрудный цветок
{355913,30,0},nil,nil},
{360806,"EVOKER,CC",3,--Лунатизм
{360806,15,0},
isTalent=true,cdDiff={410962,-15}},
{365585,"EVOKER,DISPEL",5,--Нейтрализация
{365585,8,0},
isTalent=true,isDispel=true},
{374348,"EVOKER,DEF",3,--Обновляющее пламя
{374348,90,8},
isTalent=true,cdDiff={375577,-30}},
{363916,"EVOKER,DEF",3,--Обсидиановая чешуя
{363916,90,12},
isTalent=true,hasCharges=375406},
{357208,"EVOKER",3,--Огненное дыхание
{357208,30,0},nil,nil},
{351338,"EVOKER,KICK",5,--Подавление
{351338,40,0},
isTalent=true,cdDiff={371016,-20}},
{374251,"EVOKER",3,--Прижигающее пламя
{374251,60,0},
isTalent=true},
{368432,"EVOKER",3,--Разрушение магии
{368432,9,0},
isTalent=true},
{358385,"EVOKER,CC",3,--Сель
{358385,90,0},
isTalent=true,cdDiff={375528,-30}},
{370553,"EVOKER",3,--Смещение равновесия
{370553,120,0},
isTalent=true,startCdAfterAuraFade=370553},
{370665,"EVOKER,UTIL,MOVE",2,--Спасение
{370665,60,0},
isTalent=true},
{374968,"EVOKER,RAIDSPEED",1,--Спираль времени
{374968,120,10},
isTalent=true},
{372048,"EVOKER",3,--Угнетающий рык
{372048,120,0},
isTalent=true,cdDiff={374346,-30}},
{374227,"EVOKER,RAIDSPEED",3,--Южный ветер
{374227,120,8},
isTalent=true},
{390386,"EVOKER",3,--Ярость Аспектов
{390386,300,0}},
{370452,"EVOKER",3,--Сокрушающая звезда
nil,{370452,20,0},nil,
isTalent=true},
{368847,"EVOKER",3,--Огненная буря
nil,{368847,20,0},nil,
isTalent=true},
{359073,"EVOKER",3,--Всплеск вечности
nil,{359073,30,0},nil,
isTalent=true,reduceCdAfterCast={{364343,375777},-1,{357211,375777},-1,{356995,375777},-1,{355913,375777},-1}},
{375087,"EVOKER,DPS",3,--Ярость дракона
nil,{375087,120,10},nil,
isTalent=true},
{355936,"EVOKER",3,--Изумрудное дыхание
nil,nil,{355936,30,0},
isTalent=true},
{363534,"EVOKER,DEFTAR",2,--Перемотка
nil,nil,{363534,240,0},
isTalent=true,reduceCdAfterCast={{364343,376204},-2,{357211,376204},-2,{356995,376204},-2,{355913,376204},-2},hasCharges=376210,cdDiff={381922,-60}},
{370960,"EVOKER,HEAL",3,--Изумрудные грезы
nil,nil,{370960,180,5},
isTalent=true},
{359816,"EVOKER,HEAL",3,--Изумрудный полет
nil,nil,{359816,120,0},
isTalent=true},
{367226,"EVOKER",3,--Призрачный цветок
nil,nil,{367226,30,0},
isTalent=true,cdDiff={376150,-10}},
{357170,"EVOKER,DEFTAR",2,--Растяжение времени
nil,nil,{357170,60,8},
isTalent=true,durationDiff={376240,{"*1.15","*1.3"}}},
{370537,"EVOKER",3,--Стазис
nil,nil,{370537,90,0},
isTalent=true},
{395152,"EVOKER",3,--Ebon Might
nil,nil,nil,{395152,30,10},
isTalent=true,increaseDurAfterCast={395160,1,396286,2,{355913,414969},1},cdDiff={412713,"*0.9"}},
{403631,"EVOKER",3,--Breath of Eons
nil,nil,nil,{403631,120,0},
isTalent=true,cdDiff={412713,"*0.9"}},
{396286,"EVOKER",3,--Upheaval
nil,nil,nil,{396286,40,0},
isTalent=true,reduceCdAfterCast={{395160,407876},-1},cdDiff={412713,"*0.9"}},
{360827,"EVOKER",2,--Blistering Scales
nil,nil,nil,{360827,30,0},
isTalent=true,cdDiff={412713,"*0.9"}},
{406732,"EVOKER",2,--Spatial Paradox
nil,nil,nil,{406732,180,10},
isTalent=true,cdDiff={412713,"*0.9"}},
{409311,"EVOKER",3,--Prescience
nil,nil,nil,{409311,12,0},
isTalent=true,cdDiff={412713,"*0.9"},hasCharges=1},
{404977,"EVOKER",3,--Time Skip
nil,nil,nil,{404977,180,2},
isTalent=true,cdDiff={412713,"*0.9"},durationDiff={412723,1}},
{383005,"EVOKER,PVP",3,--Chrono Loop
{383005,45,0},
isTalent=true},
{370388,"EVOKER,PVP",3,--Swoop Up
{370388,90,0},
isTalent=true},
{443328,"EVOKER",3,--Spatial Paradox
nil,{443328,30,0},
isTalent=true},
{378441,"EVOKER,PVP",3,--Time Stop
{378441,45,0},
isTalent=true},
{408233,"EVOKER",3,--Bestow Weyrnstone
nil,nil,nil,{408233,60,0},
isTalent=true},
{378464,"EVOKER,PVP",3,--Nullifying Shroud
{378464,90,0},
isTalent=true},
{377509,"EVOKER,PVP",3,--Dream Projection
nil,nil,{377509,60,0},
isTalent=true},
{161642,"NO,RES",3,--Воскрешение
{161642,0,0},
afterCombatReset=true,isBattleRes=true},
{90355, "PET,HUNTER,UTIL",3,--Древняя истерия
{90355,360,40},
afterCombatNotReset=true},
{26064, "PET,HUNTER",3,--Панцирный щит
{26064,60,12}},
{55709, "PET,HUNTER",3,--Сердце феникса
{55709,480,0},
afterCombatNotReset=true},
{53478, "PET,HUNTER",3,--Ни шагу назад
{53478,360,20},
afterCombatNotReset=true},
{61685, "PET,HUNTER",3,--Рывок
{61685,25,0}},
{90361, "PET,HUNTER",3,--Духовное лечение
{90361,30,0}},
{91802, "PET,DEATHKNIGHT",5,--Неуклюжий рывок
{91802,30,0}},
{91797, "PET,DEATHKNIGHT",3,--Чудовищный удар
{91797,90,0}},
{89751, "PET,WARLOCK",3,--Буря Скверны
{89751,45,6}},
{89766, "PET,WARLOCK,CC,KICK",5,--Метание топора
{89766,30,0},
sameSpell={89766,119914}},
{115276,"PET,WARLOCK,DISPEL",5,--Обжигающая магия
{115276,10,0}},
{17767, "PET,WARLOCK",3,--Оплот теней
{17767,120,20},
sameSpell={119907,17767}},
{89808, "PET,WARLOCK,DISPEL",5,--Опаляющая магия
{89808,10,0},
sameSpell={119905,89808}},
{119899,"PET,WARLOCK",4,--Прижигание ран хозяина
{119899,30,12}},
{89792, "PET,WARLOCK",3,--Бегство
{89792,20,0}},
{115831,"PET,WARLOCK",3,--Буря гнева
{115831,45,6}},
{115268,"PET,WARLOCK,CC",3,--Очарование
{115268,30,0}},
{6358, "PET,WARLOCK,CC",3,--Соблазн
{6358,30,0},
sameSpell={119909,6358}},
{19647, "PET,WARLOCK,KICK",5,--Запрет чар
{19647,24,0},
sameSpell={119910,19647}},
{19505, "PET,WARLOCK",3,--Пожирание магии
{19505,15,0}},
{33395, "PET,MAGE",3,--Холод
{33395,25,0}},
{68992, "RACIAL",3,--Легкость тьмы
{68992,120,10},
isRacial="Worgen"},
{20589, "RACIAL",3,--Мастер побега
{20589,60,0},
isRacial="Gnome"},
{20594, "RACIAL",3,--Каменная форма
{20594,120,8},
isRacial="Dwarf",startCdAfterAuraApply=65116},
{121093,"RACIAL",3,--Дар наару
{121093,180,5},
sameSpell={121093,59545,59543,59548,59542,59544,59547,28880},isRacial="Draenei"},
{58984, "RACIAL",3,--Слиться с тенью
{58984,120,0},
isRacial="NightElf"},
{59752, "RACIAL",3,--Воля к жизни
{59752,180,0},
isRacial="Human"},
{69041, "RACIAL",3,--Ракетный обстрел
{69041,90,0},
sameSpell={69041,69070},isRacial="Goblin"},
{69070, "RACIAL",3,--Реактивный прыжок
{69070,90,0},
sameSpell={69041,69070},isRacial="Goblin"},
{7744, "RACIAL",3,--Воля Отрекшихся
{7744,120,0},
isRacial="Undead"},
{20577, "RACIAL",3,--Каннибализм
{20577,120,10},
isRacial="Undead"},
{20572, "RACIAL",3,--Кровавое неистовство
{20572,120,15},
isRacial="Orc"},
{20549, "RACIAL",3,--Громовая поступь
{20549,90,0},
isRacial="Tauren"},
{26297, "RACIAL",3,--Берсерк
{26297,180,12},
isRacial="Troll"},
{28730, "RACIAL",3,--Волшебный поток
{28730,120,0},
sameSpell={28730,69179,129597,80483,155145,25046,50613,202719,232633},isRacial="BloodElf"},
{107079,"RACIAL",3,--Сотрясающая ладонь
{107079,120,4},
isRacial="Pandaren"},
{256948,"RACIAL",3,--Пространственный разлом
{256948,180,0},
isRacial="VoidElf"},
{260364,"RACIAL",3,--Чародейский импульс
{260364,180,12},
isRacial="Nightborne"},
{255647,"RACIAL",3,--Правосудие Света
{255647,150,3},
isRacial="LightforgedDraenei"},
{255654,"RACIAL",3,--Бычий натиск
{255654,120,0},
isRacial="HighmountainTauren"},
{274738,"RACIAL",3,--Призыв предков
{274738,120,15},
isRacial="MagharOrc"},
{265221,"RACIAL",3,--Огненная кровь
{265221,120,8},
isRacial="DarkIronDwarf"},
{312924,"RACIAL",3,--Излучатель органического света
{312924,180,0},
isRacial="Mechagnome"},
{287712,"RACIAL",3,--Удар с размаху
{287712,150,3},
isRacial="KulTiran"},
{312411,"RACIAL",3,--Набор хитростей
{312411,90,0},
isRacial="Vulpera"},
{291944,"RACIAL",3,--Регенерация
{291944,150,6},
isRacial="ZandalariTroll"},
{357214,"RACIAL",3,--Взмах крыльями
{357214,90,0},
isRacial="Dracthyr",cdDiff={368838,-45}},
{368970,"RACIAL",3,--Взмах крыльями
{368970,90,0},
isRacial="Dracthyr",cdDiff={375443,-45}},
{67826, "ITEMS",3,--Дживс
{67826,3600,0},
isTalent=true,afterCombatNotReset=true},
{201414,"ITEMS",3,--Оплот чистоты
{201414,60,0},
item=133598},
{201371,"ITEMS",3,--Божественное правосудие
{201371,60,0},
item=133585},
{90633, "ITEMS",3,--Боевой штандарт гильдии
{90633,600,0},
sameSpell={90633,90628},icon="Interface\\Icons\\inv_guild_standard_horde_c",startCdAfterUse={{90631,120},{90632,120}},item=64402},
{90632, "ITEMS",3,--Боевой штандарт гильдии
{90632,600,0},
sameSpell={90632,90626},icon="Interface\\Icons\\inv_guild_standard_horde_b",startCdAfterUse={{90633,120},{90631,120}},item=64401},
{90631, "ITEMS",3,--Боевой штандарт гильдии
{90631,600,0},
sameSpell={90631,89479},icon="Interface\\Icons\\inv_guild_standard_horde_a",startCdAfterUse={{90633,120},{90632,120}},item=64400},
{187614,"ITEMS",3,--Legendary DD
{187614,120,15},
item={124634,124636,124635}},
{187612,"ITEMS",3,--Legendary Heal
{187612,120,15},
item=124638},
{187613,"ITEMS",3,--Legendary Tank
{187613,120,15},
item=124637},
{235169,"ITEMS",3,--Перерожденная ненависть Архимонда
{235169,75,10},
item=144249},
{235966,"ITEMS",3,--Предвидение Велена
{235966,75,10},
item=144258},
{235991,"ITEMS",3,--Пылкое желание Кил'джедена
{235991,75,0},
item=144259},
{251946,"ITEMS",3,--Пылающий бастион
{251946,120,3},
item=151978},
{295271,"ITEMS",3,--Темный панцирь
{295271,120,0},
icon=1003587,item=167865},
{344732,"ITEMS",3,--Сосуд жуткого огня
{344732,90,0},
item=184030},
{344231,"ITEMS",3,--Кровавый винтаж
{344231,60,0},
item=184031},
{344245,"ITEMS",3,--Зеркало маны
{344245,60,0},
item=184029},
{345251,"ITEMS",3,--Поджигание души
{345251,60,0},
item=184019},
{345019,"ITEMS",3,--Таящийся хищник
{345019,90,0},
item=184016},
{344916,"ITEMS",3,--Пучок огненных перьев
{344916,120,6},
item=184020},
{345432,"ITEMS",3,--Вальс крови
{345432,90,20},
item=184024},
{344662,"ITEMS",3,--Разбитая душа
{344662,120,0},
item=184025},
{334058,"ITEMS",3,--Гнилостный взрыв
{334058,90,10},
item=173069},
{333734,"ITEMS",3,--Паутина покоя
{333734,90,0},
icon=3717273,item=173078},
{311444,"ITEMS",3,--Колода Неукротимости
{311444,90,10},
item=173096},
{331624,"ITEMS",3,--Неутолимый голод
{331624,90,20},
icon=3717302,item=173087},
{345319,"ITEMS",3,--Символ ассимиляции
{345319,90,0},
item=184021},
{344384,"ITEMS",3,--Связь охотника
{344384,120,30},
item=184017},
{345228,"ITEMS",3,--Жетон гладиатора
{345228,60,15},
item={175921,185197}},
{345231,"ITEMS",3,--Эмблема гладиатора
{345231,120,20},
item={178447,185282}},
{336126,"ITEMS",3,--Медальон гладиатора
{336126,120,0},
item={181333,185304}},
{307192,"ITEMS",3,--Духовное зелье исцеления
{307192,300,0},
sameSpell={307192,213664,216431,216802,216468,338447,301308}},
{6262, "ITEMS",3,--Камень здоровья
{6262,60,0}},
{355327,"ITEMS",3,--Зажим черной души
{355327,90,0},
item=186431},
{356212,"ITEMS",3,--Запретная некромантия
{356212,600,0},
icon=355498,item=186421},
{355321,"ITEMS",3,--Истязающее озарение
{355321,120,0},
item=186428},
{358712,"ITEMS",3,--Эгида Аннгильды
{358712,90,0},
item=186424},
{355303,"ITEMS",3,--Зов Повелителя Холода
{355303,60,0},
item=186437},
{355333,"ITEMS",3,--Трофейный катализатор синтеза
{355333,90,0},
item=186432},
{353692,"ITEMS",3,--Изучение
{353692,60,0},
item=186422},
{363481,"ITEMS",3,--Резонатор гладиатора
{363481,120,4},
item=188766},
{363117,"ITEMS",3,--Взыскательная решимость гладиатора
{363117,180,15},
item=188524},
{363557,"ITEMS",3,--Львиный рык
{363557,600,0},
item=188262},
{364152,"ITEMS",3,--Сердце роя
{364152,180,0},
icon=538518,item=188255},
{367236,"ITEMS",3,--Ореол дезинтеграции
{367236,90,0},
icon=610679,item=188272},
{367241,"ITEMS",3,--Первая печать
{367241,300,0},
icon=656542,item=188271},
{368203,"ITEMS",3,--Изобретательность архитектора
{368203,90,0},
item=188268},
{367802,"ITEMS",3,--Пульсирующий осколок
{367802,60,0},
item=188266},
{368894,"ITEMS",3,--Заряженный сердечник Возвращающего
{368894,150,0},
icon=463521,item=188263},
{367885,"ITEMS",3,--Клетка навязчивых идей
{367885,180,0},
icon=1559579,item=188261},
{370511,"ITEMS",3,--Refreshing Healing Potion
{370511,300,0},
item=191380},
{422146,"ITEMS",3,--Belor'relos
{422146,120,0},
item=207172},
{422441,"ITEMS",3,--Branch of the Tormented Ancient
{422441,150,0},
item=207169},
{422303,"ITEMS",3,--Bandolier of Twisted Blades
{422303,90,0},
item=207165},
{423611,"ITEMS",3,--Ashes of the Embersoul
{423611,120,0},
item=207167},
{422956,"ITEMS",3,--Nymue's Unraveling Spindle
{422956,120,18},
item=208615},
{422083,"ITEMS",3,--Smoldering Seedling
{422083,120,0},
item=207170},
{427113,"ITEMS",3,--Dreambinder
{427113,120,4},
item=208616},
{295373,"ESSENCES",3,--Сосредоточенный огонь
{295373,30,0},
isTalent=true,sameSpell={295373,299349,299353}},
{295186,"ESSENCES",3,--Резонанс крови мира
{295186,60,0},
isTalent=true,sameSpell={295186,298628,299334}},
{302731,"ESSENCES",3,--Пространственная рябь
{302731,60,2},
isTalent=true,sameSpell={302731,302982,302983}},
{298357,"ESSENCES",3,--Воспоминания о снах наяву
{298357,120,0},
isTalent=true,sameSpell={298357,299372,299374}},
{293019,"ESSENCES",3,--Дар жизни Азерот
{293019,60,4},
isTalent=true,cdDiff={298080,-15},sameSpell={293019,298080,298081}},
{294926,"ESSENCES",3,--Сущность смерти
{294926,150,0},
isTalent=true,cdDiff={300002,-30},sameSpell={294926,300002,300003}},
{298168,"ESSENCES",3,--Эгида глубин
{298168,120,15},
isTalent=true,cdDiff={299273,-30},sameSpell={298168,299273,299275}},
{295746,"ESSENCES",3,--Усиленный нуль-щит
{295746,180,0},
isTalent=true,cdDiff={300015,-42},sameSpell={295746,300015,300016}},
{293031,"ESSENCES",3,--Луч подавления
{293031,60,0},
isTalent=true,cdDiff={300009,-15},sameSpell={293031,300009,300010}},
{296197,"ESSENCES",3,--Восполнение сил
{296197,15,0},
isTalent=true,sameSpell={296197,299932,299933}},
{296094,"ESSENCES",3,--Застой
{296094,180,0},
isTalent=true,sameSpell={296094,299882,299883}},
{293032,"ESSENCES",3,--Чары Хранительницы жизни
{293032,120,0},
isTalent=true,sameSpell={293032,299943,299944}},
{296072,"ESSENCES",3,--Перегрузка маны
{296072,30,8},
isTalent=true,sameSpell={296072,299875,299876}},
{296230,"ESSENCES",3,--Проводник жизненной силы
{296230,60,0},
isTalent=true,cdDiff={299958,-15},sameSpell={296230,299958,299959}},
{295258,"ESSENCES",3,--Сосредоточенный азеритовый луч
{295258,90,0},
isTalent=true,sameSpell={295258,299336,299338}},
{295840,"ESSENCES",3,--Защитник Азерот
{295840,180,0},
isTalent=true,sameSpell={295840,299355,299358}},
{297108,"ESSENCES",3,--Кровь врага
{297108,120,0},
isTalent=true,cdDiff={298273,-30},sameSpell={297108,298273,298277}},
{295337,"ESSENCES",3,--Очищающая вспышка
{295337,60,0},
isTalent=true,sameSpell={295337,299345,299347}},
{298452,"ESSENCES",3,--Высвобожденная сила
{298452,60,0},
isTalent=true,cdDiff={299376,-15},sameSpell={298452,299376,299378}},
{324739,"COVENANTS",3,--Призыв распорядителя
{324739,300,240},
isTalent=true,isCovenant=1},
{323436,"COVENANTS",3,--Очищение души
{323436,180,0},
isTalent=true,isCovenant=1,
CLEU_SPELL_HEAL=[[
if spellID == 323436 then
C_Timer.After(.3,function()
local line = CDList[sourceName][323436]
if line and GetTime() - (line.lastUse or 0) > 1 then
CLEUstartCD(line)
end
end)
end
]]},
{324631,"COVENANTS",3,--Скульптор плоти
{324631,120,4},
isTalent=true,isCovenant=4,stopDurWithAuraFade=324631},
{310143,"COVENANTS",3,--Облик души
{310143,90,0},
isTalent=true,isCovenant=3,cdDiff={320658,-15,342789,-30}},
{300728,"COVENANTS",3,--Врата теней
{300728,60,0},
isTalent=true,isCovenant=2,hasCharges=336147,durationDiff={331577,6},cdDiff={336147,30,342801,-6},
CLEU_SPELL_AURA_APPLIED_DOSE=[[
if spellID == 342801 and destName then
session_gGUIDs[destName] = {342801,"torghast",stack}
end
]]},
{307865,"COVENANTS,WARRIOR",3,--Копье Бастиона
{307865,60,4},
isTalent=true,isCovenant=1,durationDiff={357996,4}},
{312321,"COVENANTS,WARLOCK",3,--Очищающее пожертвование
{312321,40,0},
isTalent=true,isCovenant=1},
{324386,"COVENANTS,SHAMAN",3,--Тотем вечернего колокола
{324386,60,0},
isTalent=true,isCovenant=1,cdDiff={333261,-6,314278,-5}},
{323547,"COVENANTS,ROGUE",3,--Продолжительная отповедь
{323547,45,0},
isTalent=true,isCovenant=1},
{325013,"COVENANTS,PRIEST",3,--Благословение перерожденных
{325013,180,10},
isTalent=true,isCovenant=1,cdDiff={327468,-20},
CLEU_PREP=[[
priestBoon_var = {}
]],CLEU_SPELL_AURA_APPLIED_DOSE=[[
if spellID == 325013 then
priestBoon_var[sourceName] = stack
end
]],CLEU_SPELL_AURA_REMOVED=[[
if spellID == 325013 and session_gGUIDs[sourceName][356395] then
local max_stack = priestBoon_var[sourceName]
if max_stack then
local line = CDList[sourceName][325013]
if line then
local time_reduce = min(max_stack * 3,60)
line:ReduceCD(time_reduce,true)
forceUpdateAllData = true
end
end
priestBoon_var[sourceName] = nil
end
]]},
{304971,"COVENANTS,PALADIN",3,--Божественный благовест
{304971,60,0},
isTalent=true,isCovenant=1},
{310454,"COVENANTS,MONK",3,--Оружие ордена
{310454,120,30},
isTalent=true,isCovenant=1},
{307443,"COVENANTS,MAGE",3,--Сияющая искра
{307443,30,0},
isTalent=true,isCovenant=1},
{308491,"COVENANTS,HUNTER",3,--Резонирующая стрела
{308491,60,0},
isTalent=true,isCovenant=1},
{326434,"COVENANTS,DRUID",3,--Родственные души
{326434,60,10},
isTalent=true,isCovenant=1,sameSpell={338142,338018,338035,326462,326446,326647,326434}},
{306830,"COVENANTS,DEMONHUNTER",3,--Элизийский декрет
{306830,60,2},
isTalent=true,isCovenant=1},
{312202,"COVENANTS,DEATHKNIGHT",3,--Узы недостойных
{312202,60,0},
isTalent=true,isCovenant=1},
{324143,"COVENANTS,WARRIOR",3,--Знамя завоевателя
{324143,120,15},
isTalent=true,isCovenant=4},
{325289,"COVENANTS,WARLOCK",3,--Стрела опустошения
{325289,45,0},
isTalent=true,isCovenant=4},
{326059,"COVENANTS,SHAMAN",3,--Первозданная волна
{326059,45,0},
isTalent=true,isCovenant=4,hasCharges=333344},
{328547,"COVENANTS,ROGUE",3,--Зазубренный костяной шип
{328547,30,0},
isTalent=true,isCovenant=4,hasCharges=354731},
{324724,"COVENANTS,PRIEST",3,--Нечестивое кольцо
{324724,60,15},
isTalent=true,isCovenant=4,durationDiff={337979,2}},
{328204,"COVENANTS,PALADIN",3,--Молот покорителя
{328204,30,0},
isTalent=true,isCovenant=4,cdDiff={336612,-3}},
{325216,"COVENANTS,MONK",3,--Отвар из костяной пыли
{325216,60,10},
isTalent=true,isCovenant=4,
CLEU_PREP=[[
spell337295_var = {}
spell337295_var_c = {}
]],CLEU_SPELL_HEAL=[[
if spellID == 325218 and session_gGUIDs[sourceName][337295] then
local line = CDList[sourceName][325216]
if line then
local t = GetTime()
if t - (spell337295_var[sourceName] or 0) > 20 then
spell337295_var[sourceName] = t
spell337295_var_c[sourceName] = 0
end
spell337295_var_c[sourceName] = spell337295_var_c[sourceName] + 1
if spell337295_var_c[sourceName] <= 5 then
line:ReduceCD(0.5)
end
end
end
]]},
{324220,"COVENANTS,MAGE",3,--Дитя смерти
{324220,180,25},
isTalent=true,isCovenant=4,durationDiff={336999,{6,6.6,7.2,7.8,8.4,9,9.6,10.2,10.8,11.4,12,12.6,13.2,13.8,14.4}}},
{325028,"COVENANTS,HUNTER",3,--Шакрам смерти
{325028,45,0},
isTalent=true,isCovenant=4},
{325727,"COVENANTS,DRUID",3,--Адаптивный рой
{325727,25,0},
isTalent=true,isCovenant=4},
{329554,"COVENANTS,DEMONHUNTER",3,--Подпитка для пламени
{329554,120,30},
isTalent=true,isCovenant=4,durationDiff={340063,{1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}}},
{315443,"COVENANTS,DEATHKNIGHT",3,--Рука поганища
{315443,120,12},
isTalent=true,isCovenant=4},
{325886,"COVENANTS,WARRIOR",3,--Повторный толчок Древних
{325886,90,0},
isTalent=true,isCovenant=3,cdDiff={339939,-15}},
{325640,"COVENANTS,WARLOCK",3,--Гниение души
{325640,60,0},
isTalent=true,isCovenant=3},
{328923,"COVENANTS,SHAMAN",3,--Волшебное переливание
{328923,120,3},
isTalent=true,isCovenant=3,cdDiff={339183,{-25,-26,-27,-28,-29,-30,-31,-33,-34,-35,-36,-37,-38,-39,-40},333348,-15}},
{328305,"COVENANTS,ROGUE",3,--Сепсис
{328305,90,10},
isTalent=true,isCovenant=3,changeCdBeforeAuraFullDur={328305,-30}},
{327661,"COVENANTS,PRIEST",3,--Волшебные стражи
{327661,90,20},
isTalent=true,isCovenant=3},
{328620,"COVENANTS,PALADIN",3,--Благословение лета
{328620,45,0},
isTalent=true,isCovenant=3,sameSpell={328282,328622,328620,328281}},
{327104,"COVENANTS,MONK",3,--Волшебная линия
{327104,30,0},
isTalent=true,isCovenant=3},
{314791,"COVENANTS,MAGE",3,--Переходящая сила
{314791,45,0},
isTalent=true,isCovenant=3},
{328231,"COVENANTS,HUNTER",3,--Дикие духи
{328231,120,15},
isTalent=true,isCovenant=3,durationDiff={339109,3}},
{323764,"COVENANTS,DRUID",3,--Созыв духов
{323764,120,4},
isTalent=true,isCovenant=3,cdDiff={354118,"*0.5",335766,-20}},
{323639,"COVENANTS,DEMONHUNTER",3,--Охота
{323639,90,0},
isTalent=true,isCovenant=3},
{324128,"COVENANTS,DEATHKNIGHT",3,--Дань смерти
{324128,30,10},
isTalent=true,isCovenant=3},
{317320,"COVENANTS,WARRIOR",3,--Порицание
{317320,0,0},
isTalent=true,isCovenant=2},
{321792,"COVENANTS,WARLOCK",3,--Неотвратимая катастрофа
{321792,60,0},
isTalent=true,isCovenant=2},
{320674,"COVENANTS,SHAMAN",3,--Цепная жатва
{320674,90,0},
isTalent=true,isCovenant=2,
CLEU_SPELL_DAMAGE=[[
if spellID == 320752 and critical then
local line = CDList[sourceName][320674]
if line then
line:ReduceCD(5)
end
end
]],CLEU_SPELL_HEAL=[[
if spellID == 320751 and critical then
local line = CDList[sourceName][320674]
if line and critical then
line:ReduceCD(5)
end
end
]]},
{323654,"COVENANTS,ROGUE",3,--Флагелляция
{323654,90,12},
isTalent=true,isCovenant=2},
{323673,"COVENANTS,PRIEST",3,--Игры разума
{323673,45,5},
isTalent=true,isCovenant=2,durationDiff={338315,2},stopDurWithAuraFade=323673},
{316958,"COVENANTS,PALADIN",1,--Пепельное освящение
{316958,240,30},
isTalent=true,isCovenant=2,durationDiff={355447,"*1.5"}},
{326860,"COVENANTS,MONK",3,--Павший орден
{326860,180,24},
isTalent=true,isCovenant=2},
{314793,"COVENANTS,MAGE",3,--Истязающие зеркала
{314793,90,25},
isTalent=true,isCovenant=2},
{324149,"COVENANTS,HUNTER",3,--Выстрел свежевателя
{324149,30,0},
isTalent=true,isCovenant=2},
{323546,"COVENANTS,DRUID",3,--Прожорливое бешенство
{323546,180,20},
isTalent=true,isCovenant=2,durationDiff={354109,2.5},stopDurWithAuraFade=323546},
{317009,"COVENANTS,DEMONHUNTER",3,--Клеймо греха
{317009,60,8},
isTalent=true,isCovenant=2,cdDiff={340028,{-1,-2,-3,-4,-5,-6,-7,-8,-9,-10,-11,-12,-13,-14,-15}}},
{311648,"COVENANTS,DEATHKNIGHT",3,--Клубящийся туман
{311648,60,8},
isTalent=true,isCovenant=2},
}
if ExRT.isCata then
module.db.AllSpells = {
{29166, "DRUID", 1, {29166, 180, 10}}, --Озарение
{20484, "DRUID", 1, {20484, 600, 0}}, --BR
{6795, "DRUID", 1, {6795, 8, 0}}, --Taunt
{740, "DRUID", 1, {740, 480, 8}}, --Tranq
{5209, "DRUID", 1, {5209, 180, 6}}, --Challenging Roar
{33891, "DRUID", 1, {33891, 180, 25}}, --Tree of Life
{48505, "DRUID", 1, {48505, 90, 10}}, --Звездопад
{50334, "DRUID", 1, {50334, 180, 15}}, --Берсерк
{355, "WARRIOR", 1, {355, 8, 0}}, --Taunt
{12975, "WARRIOR", 1, {12975, 180, 20}}, --Last stand
{871, "WARRIOR", 1, {871, 300, 10}}, --SW
{1161, "WARRIOR", 1, {1161, 180, 6}}, --Challenging Shout
{12809, "WARRIOR", 1, {12809, 30, 5}}, --Concussion Blow
{676, "WARRIOR", 1, {676, 60, 10}}, --Disarm
{55694, "WARRIOR", 1, {55694, 180, 10}}, --Enraged Regeneration
{64382, "WARRIOR", 1, {64382, 300, 10}}, --Shattering Throw
{97462, "WARRIOR", 1, {97462, 180, 10}}, --Rallying Cry
{11958, "MAGE", 1, {11958, 480, 0}}, --Cold Snap
{12472, "MAGE", 1, {12472, 180, 20}}, --IV
{45438, "MAGE", 1, {45438, 300, 10}}, --IB
{55342, "MAGE", 1, {55342, 180, 30}}, --Mirrors
{642, "PALADIN", 1, {642, 300, 8}}, --DS
{633, "PALADIN", 1, {633, 600, 0}}, --LoH
{86150, "PALADIN", 1, {86150, 300, 0}}, --
{31884, "PALADIN", 1, {31884, 180, 20}}, --AW
{1022, "PALADIN", 1, {1022, 300, 10}}, --BoP
{1044, "PALADIN", 1, {1044, 25, 6}}, --Freedom
{1038, "PALADIN", 1, {1038, 120, 10}}, --Salv
{6940, "PALADIN", 1, {6940, 120, 12}}, --Sac
{62124, "PALADIN", 1, {62124, 8, 0}}, --Taunt
{64205, "PALADIN", 1, {64205, 120, 10}}, --Divine Sacrifice
{31821, "PALADIN", 1, {31821, 120, 6}}, --Aura Mastery
{54428, "PALADIN", 1, {54428, 120, 9}}, --Divine Plea
{70940, "PALADIN", 1, {70940, 180, 6}}, --Divine Guardian
{16190, "SHAMAN", 1, {16190, 180, 12}}, --MTT
{98008, "SHAMAN", 1, {98008, 180, 6}}, --SLT
{32182, "SHAMAN", 1, {32182, 300, 40}, specialCheck=function() if UnitFactionGroup('player')=="Alliance" then return true end end}, --BL [A]
{2825, "SHAMAN", 1, {2825, 300, 40}, specialCheck=function() if UnitFactionGroup('player')=="Horde" then return true end end}, --BL [H]
{20608, "SHAMAN", 1, {21169, 1800, 0}}, --Reincarnation
{2894, "SHAMAN", 1, {2894, 600, 120}}, --FET
{2062, "SHAMAN", 1, {2062, 600, 120}}, --EET
{20707, "WARLOCK", 1, {20707, 900, 0}}, --Soulstone
{34477, "HUNTER", 1, {34477, 30, 0}}, --MD
{19577, "HUNTER", 1, {19577, 60, 3}}, --MD
{5384, "HUNTER", 1, {5384, 30, 0}}, --Feign Death
{64843, "PRIEST", 1, {64843, 480, 8}}, --Divine Hymn
{62618, "PRIEST", 1, {62618, 180, 10}}, --Слово силы: Барьер
{724, "PRIEST", 1, {724, 180, 0}}, --Lightwell
{6346, "PRIEST", 1, {6346, 180, 0}}, --Fear Ward
{10060, "PRIEST", 1, {10060, 120, 15}}, --Power Infusion
{64901, "PRIEST", 1, {64901, 360, 0}}, --Hymn of Hope
{47788, "PRIEST", 1, {47788, 180, 10}}, --Guardian Spirit
{33206, "PRIEST", 1, {33206, 180, 8}}, --Pain Suppression
{5277, "ROGUE", 1, {5277, 180, 15}}, --Evasion
{57934, "ROGUE", 1, {57934, 30, 6}}, --Tricks of the Trade
{49576, "DEATHKNIGHT", 1, {49576, 35, 0}}, --Grip
{48707, "DEATHKNIGHT", 1, {48707, 45, 5}}, --AMS
{42650, "DEATHKNIGHT", 1, {42650, 600, 0}}, --Army
{61999, "DEATHKNIGHT", 1, {61999, 600, 0}}, --Res
{56222, "DEATHKNIGHT", 1, {56222, 8, 0}}, --Taunt
{51052, "DEATHKNIGHT", 1, {51052, 120, 10}}, --AMZ
{49028, "DEATHKNIGHT", 1, {49028, 90, 12}}, --DRW
{49016, "DEATHKNIGHT", 1, {49016, 180, 30}}, --Unholy Frenzy
}
module.db.spell_isTalent[GetSpellInfo(16190) or "spell:16190"] = true module.db.spell_isTalent[16190] = true
module.db.spell_isTalent[GetSpellInfo(10060) or "spell:10060"] = true module.db.spell_isTalent[10060] = true
module.db.spell_isTalent[GetSpellInfo(11958) or "spell:11958"] = true module.db.spell_isTalent[11958] = true
module.db.spell_isTalent[GetSpellInfo(51052) or "spell:51052"] = true module.db.spell_isTalent[51052] = true
module.db.spell_isTalent[GetSpellInfo(47788) or "spell:47788"] = true module.db.spell_isTalent[47788] = true
module.db.spell_isTalent[GetSpellInfo(33206) or "spell:33206"] = true module.db.spell_isTalent[33206] = true
module.db.spell_isTalent[GetSpellInfo(724) or "spell:724"] = true module.db.spell_isTalent[724] = true
module.db.spell_isTalent[GetSpellInfo(64205) or "spell:64205"] = true module.db.spell_isTalent[64205] = true
module.db.spell_isTalent[GetSpellInfo(49028) or "spell:49028"] = true module.db.spell_isTalent[49028] = true
module.db.spell_isTalent[GetSpellInfo(49016) or "spell:49016"] = true module.db.spell_isTalent[49016] = true
module.db.spell_isTalent[GetSpellInfo(31821) or "spell:31821"] = true module.db.spell_isTalent[31821] = true
module.db.spell_isTalent[33891] = true
module.db.spell_isTalent[48505] = true
module.db.spell_isTalent[50334] = true
module.db.spell_isTalent[98008] = true
module.db.spell_isTalent[97462] = true
module.db.spell_resetOtherSpells[GetSpellInfo(11958) or "spell:11958"] = {GetSpellInfo(45438)}
module.db.spell_aura_list[GetSpellInfo(45438) or "spell:45438"] = GetSpellInfo(45438)
module.db.spell_aura_list[GetSpellInfo(47788) or "spell:47788"] = GetSpellInfo(47788)
module.db.spell_aura_list[GetSpellInfo(9863) or "spell:9863"] = GetSpellInfo(9863)
module.db.spell_afterCombatNotReset[GetSpellInfo(20608) or "spell:20608"] = true module.db.spell_afterCombatNotReset[20608] = true
module.db.spell_cdByTalent_fix[31884] = {53375,{-20,-40,-60}}
module.db.spell_cdByTalent_fix[871] = {12312,{-30,-60}}
module.db.spell_cdByTalent_fix[10278] = {20174,{-60,-120}}
module.db.spell_cdByTalent_fix[10310] = {20234,{-120,-240}}
module.db.spell_cdByTalent_fix[11958] = {55091,{"*0.9","*0.8"}}
module.db.spell_cdByTalent_fix[33206] = {47507,{"*0.9","*0.8"}}
module.db.spell_cdByTalent_fix[10060] = {47507,{"*0.9","*0.8"}}
module.db.spell_cdByTalent_fix[20608] = {16209,{"*0.75","*0.5"}}
module.db.spell_cdByTalent_fix[9863] = {17123,{"*0.7","*0.4"}}
module.db.spell_cdByTalent_fix[42650] = {55620,{-60,-120}}
module.db.spell_cdByTalent_fix[49576] = {49588,{-5,-10}}
module.db.spell_cdByTalent_fix[740] = {92363,{-150,-300}}
module.db.spell_cdByTalent_fix[64843] = {87430,{-150,-300}}
module.db.spell_durationByTalent_fix[1044] = {20174,{2,4}}
module.db.spell_durationByTalent_fix[98008] = {16173,{"*1.2","*1.4"}}
module.db.spell_durationByTalent_fix[16190] = {16173,{"*1.2","*1.4"}}
module.db.spellIgnoreAfterFirstUse[9863] = 10
module.db.spellIgnoreAfterFirstUse[64843] = 10
module.db.spellIgnoreAfterFirstUse[64901] = 10
module.db.spellIgnoreAfterFirstUse[42650] = 10
module.db.spell_startCDbyAuraFade[GetSpellInfo(57934) or "spell:57934"] = 57934 module.db.spell_startCDbyAuraFade[57934] = 57934
module.db.spell_startCDbyAuraFade[GetSpellInfo(57934) or "spell:57934"] = GetSpellInfo(57934) module.db.spell_startCDbyAuraFade[57934] = GetSpellInfo(57934)
module.db.spell_sharingCD[GetSpellInfo(31884) or "spell:31884"] = {[GetSpellInfo(642) or "spell:642"]=30}
elseif ExRT.isLK then
module.db.AllSpells = {
{29166, "DRUID", 1, {29166, 180, 20}}, --Озарение
{20748, "DRUID", 1, {20748, 600, 0}}, --BR
{6795, "DRUID", 1, {6795, 8, 0}}, --Taunt
{9863, "DRUID", 1, {9863, 480, 8}}, --Tranq
{5209, "DRUID", 1, {5209, 180, 6}}, --Challenging Roar
{355, "WARRIOR", 1, {355, 8, 0}}, --Taunt
{12975, "WARRIOR", 1, {12975, 180, 20}}, --Last stand
{871, "WARRIOR", 1, {871, 300, 10}}, --SW
{1161, "WARRIOR", 1, {1161, 180, 6}}, --Challenging Shout
{12809, "WARRIOR", 1, {12809, 30, 5}}, --Concussion Blow
{676, "WARRIOR", 1, {676, 60, 10}}, --Disarm
{55694, "WARRIOR", 1, {55694, 180, 10}}, --Enraged Regeneration
{64382, "WARRIOR", 1, {64382, 300, 10}}, --Shattering Throw
{11958, "MAGE", 1, {11958, 480, 0}}, --Cold Snap
{12472, "MAGE", 1, {12472, 180, 20}}, --IV
{45438, "MAGE", 1, {45438, 300, 10}}, --IB
{55342, "MAGE", 1, {55342, 180, 30}}, --Mirrors
{642, "PALADIN", 1, {642, 300, 12}}, --DS
{10310, "PALADIN", 1, {10310, 1200, 0}}, --LoH
{19752, "PALADIN", 1, {19752, 600, 180}}, --DI
{31884, "PALADIN", 1, {31884, 180, 20}}, --AW
{10278, "PALADIN", 1, {10278, 300, 10}}, --BoP
{1044, "PALADIN", 1, {1044, 25, 6}}, --Freedom
{1038, "PALADIN", 1, {1038, 120, 10}}, --Salv
{6940, "PALADIN", 1, {6940, 120, 12}}, --Sac
{62124, "PALADIN", 1, {62124, 8, 0}}, --Taunt
{64205, "PALADIN", 1, {64205, 120, 10}}, --Divine Sacrifice
{31821, "PALADIN", 1, {31821, 120, 6}}, --Aura Mastery
{16190, "SHAMAN", 1, {16190, 300, 12}}, --MTT
{32182, "SHAMAN", 1, {32182, 300, 40}, specialCheck=function() if UnitFactionGroup('player')=="Alliance" then return true end end}, --BL [A]
{2825, "SHAMAN", 1, {2825, 300, 40}, specialCheck=function() if UnitFactionGroup('player')=="Horde" then return true end end}, --BL [H]
{20608, "SHAMAN", 1, {21169, 1800, 0}}, --Reincarnation
{2894, "SHAMAN", 1, {2894, 600, 120}}, --FET
{2062, "SHAMAN", 1, {2062, 600, 120}}, --EET
{20765, "WARLOCK", 1, {20765, 900, 0}}, --Soulstone
{19801, "HUNTER", 1, {19801, 8, 0}}, --Tranq
{34477, "HUNTER", 1, {34477, 30, 0}}, --MD
{19577, "HUNTER", 1, {19577, 60, 3}}, --MD
{5384, "HUNTER", 1, {5384, 30, 0}}, --Feign Death
{64843, "PRIEST", 1, {64843, 480, 8}}, --Divine Hymn
{724, "PRIEST", 1, {724, 180, 0}}, --Lightwell
{6346, "PRIEST", 1, {6346, 180, 0}}, --Fear Ward
{10060, "PRIEST", 1, {10060, 120, 15}}, --Power Infusion
{64901, "PRIEST", 1, {64901, 360, 0}}, --Hymn of Hope
{47788, "PRIEST", 1, {47788, 180, 10}}, --Guardian Spirit
{33206, "PRIEST", 1, {33206, 180, 8}}, --Pain Suppression
{5277, "ROGUE", 1, {5277, 180, 15}}, --Evasion
{57934, "ROGUE", 1, {57934, 30, 6}}, --Tricks of the Trade
{49576, "DEATHKNIGHT", 1, {49576, 35, 0}}, --Grip
{48707, "DEATHKNIGHT", 1, {48707, 45, 5}}, --AMS
{42650, "DEATHKNIGHT", 1, {42650, 600, 0}}, --Army
{61999, "DEATHKNIGHT", 1, {61999, 600, 0}}, --Res
{56222, "DEATHKNIGHT", 1, {56222, 8, 0}}, --Taunt
{51052, "DEATHKNIGHT", 1, {51052, 120, 10}}, --AMZ
{49028, "DEATHKNIGHT", 1, {49028, 90, 12}}, --DRW
{49016, "DEATHKNIGHT", 1, {49016, 180, 30}}, --Unholy Frenzy
}
module.db.spell_isTalent[GetSpellInfo(16190) or "spell:16190"] = true module.db.spell_isTalent[16190] = true
module.db.spell_isTalent[GetSpellInfo(10060) or "spell:10060"] = true module.db.spell_isTalent[10060] = true
module.db.spell_isTalent[GetSpellInfo(11958) or "spell:11958"] = true module.db.spell_isTalent[11958] = true
module.db.spell_isTalent[GetSpellInfo(51052) or "spell:51052"] = true module.db.spell_isTalent[51052] = true
module.db.spell_isTalent[GetSpellInfo(47788) or "spell:47788"] = true module.db.spell_isTalent[47788] = true
module.db.spell_isTalent[GetSpellInfo(33206) or "spell:33206"] = true module.db.spell_isTalent[33206] = true
module.db.spell_isTalent[GetSpellInfo(724) or "spell:724"] = true module.db.spell_isTalent[724] = true
module.db.spell_isTalent[GetSpellInfo(64205) or "spell:64205"] = true module.db.spell_isTalent[64205] = true
module.db.spell_isTalent[GetSpellInfo(49028) or "spell:49028"] = true module.db.spell_isTalent[49028] = true
module.db.spell_isTalent[GetSpellInfo(49016) or "spell:49016"] = true module.db.spell_isTalent[49016] = true
module.db.spell_isTalent[GetSpellInfo(31821) or "spell:31821"] = true module.db.spell_isTalent[31821] = true
module.db.spell_resetOtherSpells[GetSpellInfo(11958) or "spell:11958"] = {GetSpellInfo(45438)}
module.db.spell_aura_list[GetSpellInfo(45438) or "spell:45438"] = GetSpellInfo(45438)
module.db.spell_aura_list[GetSpellInfo(47788) or "spell:47788"] = GetSpellInfo(47788)
module.db.spell_aura_list[GetSpellInfo(9863) or "spell:9863"] = GetSpellInfo(9863)
module.db.spell_afterCombatNotReset[GetSpellInfo(20608) or "spell:20608"] = true module.db.spell_afterCombatNotReset[20608] = true
module.db.spell_cdByTalent_fix[31884] = {53375,{-30,-60}}
module.db.spell_cdByTalent_fix[871] = {12312,{-30,-60}}
module.db.spell_cdByTalent_fix[10278] = {20174,{-60,-120}}
module.db.spell_cdByTalent_fix[10310] = {20234,{-120,-240}}
module.db.spell_cdByTalent_fix[11958] = {55091,{"*0.9","*0.8"}}
module.db.spell_cdByTalent_fix[33206] = {47507,{"*0.9","*0.8"}}
module.db.spell_cdByTalent_fix[10060] = {47507,{"*0.9","*0.8"}}
module.db.spell_cdByTalent_fix[20608] = {16209,{"*0.75","*0.5"}}
module.db.spell_cdByTalent_fix[9863] = {17123,{"*0.7","*0.4"}}
module.db.spell_cdByTalent_fix[42650] = {55620,{-60,-120}}
module.db.spell_cdByTalent_fix[49576] = {49588,{-5,-10}}
module.db.spell_durationByTalent_fix[1044] = {20174,{2,4}}
module.db.spellIgnoreAfterFirstUse[9863] = 10
module.db.spellIgnoreAfterFirstUse[64843] = 10
module.db.spellIgnoreAfterFirstUse[64901] = 10
module.db.spellIgnoreAfterFirstUse[42650] = 10
module.db.spell_startCDbyAuraFade[GetSpellInfo(57934) or "spell:57934"] = 57934 module.db.spell_startCDbyAuraFade[57934] = 57934
module.db.spell_startCDbyAuraFade[GetSpellInfo(57934) or "spell:57934"] = GetSpellInfo(57934) module.db.spell_startCDbyAuraFade[57934] = GetSpellInfo(57934)
module.db.spell_sharingCD[GetSpellInfo(31884) or "spell:31884"] = {[GetSpellInfo(642) or "spell:642"]=30}
elseif ExRT.isBC then
module.db.AllSpells = {
{29166, "DRUID", 1, {29166, 360, 20}}, --Озарение
{20748, "DRUID", 1, {20748, 1200, 0}}, --BR
{6795, "DRUID", 1, {6795, 10, 0}}, --Taunt
{9863, "DRUID", 1, {9863, 600, 8}}, --Tranq
{5209, "DRUID", 1, {5209, 600, 6}}, --Challenging Roar
{355, "WARRIOR", 1, {355, 10, 0}}, --Taunt
{12975, "WARRIOR", 1, {12975, 480, 20}}, --Last stand
{871, "WARRIOR", 1, {871, 1800, 10}}, --SW
{1161, "WARRIOR", 1, {1161, 600, 6}}, --Challenging Shout
{12809, "WARRIOR", 1, {12809, 45, 5}}, --Concussion Blow
{676, "WARRIOR", 1, {676, 60, 10}}, --Disarm
{11958, "MAGE", 1, {11958, 480, 0}}, --Cold Snap
{12472, "MAGE", 1, {12472, 180, 20}}, --IV
{45438, "MAGE", 1, {45438, 300, 10}}, --IB
{1020, "PALADIN", 1, {1020, 300, 12}}, --DS
{10310, "PALADIN", 1, {10310, 3600, 0}}, --LoH
{19752, "PALADIN", 1, {19752, 3600, 180}}, --DI
{31884, "PALADIN", 1, {31884, 180, 20}}, --AW
{16190, "SHAMAN", 1, {16190, 300, 12}}, --MTT
{32182, "SHAMAN", 1, {32182, 600, 40}, specialCheck=function() if UnitFactionGroup('player')=="Alliance" then return true end end}, --BL [A]
{2825, "SHAMAN", 1, {2825, 600, 40}, specialCheck=function() if UnitFactionGroup('player')=="Horde" then return true end end}, --BL [H]
{20608, "SHAMAN", 1, {21169, 3600, 0}}, --Reincarnation
{2894, "SHAMAN", 1, {2894, 1200, 120}}, --FET
{2062, "SHAMAN", 1, {2062, 1200, 120}}, --EET
{20765, "WARLOCK", 1, {20765, 1800, 0}}, --Soulstone
{19801, "HUNTER", 1, {19801, 20, 0}}, --Tranq
{34477, "HUNTER", 1, {34477, 120, 30}}, --MD
{19577, "HUNTER", 1, {19577, 60, 3}}, --MD
{5384, "HUNTER", 1, {5384, 30, 0}}, --Feign Death
{28275, "PRIEST", 1, {28275, 360, 180}}, --Lightwell
{6346, "PRIEST", 1, {6346, 180, 0}}, --Fear Ward
{32548, "PRIEST", 1, {32548, 300, 15}, specialCheck=function(_,_,_,r) if r=="Draenei" then return true end end}, --Symbol of Hope
{10060, "PRIEST", 1, {10060, 180, 15}}, --Power Infusion
{5277, "ROGUE", 1, {5277, 300, 15}}, --Evasion
}
module.db.spell_isTalent[GetSpellInfo(16190) or "spell:16190"] = true module.db.spell_isTalent[16190] = true
module.db.spell_isTalent[GetSpellInfo(10060) or "spell:10060"] = true module.db.spell_isTalent[10060] = true
module.db.spell_isTalent[GetSpellInfo(11958) or "spell:11958"] = true module.db.spell_isTalent[11958] = true
module.db.spell_resetOtherSpells[GetSpellInfo(11958) or "spell:11958"] = {GetSpellInfo(45438)}
module.db.spell_aura_list[GetSpellInfo(45438) or "spell:45438"] = GetSpellInfo(45438)
elseif ExRT.isClassic then
module.db.AllSpells = {
{29166, "DRUID", 1, {29166, 360, 20}}, --Озарение
{20748, "DRUID", 1, {20748, 1800, 0}}, --BR
{6795, "DRUID", 1, {6795, 10, 0}}, --Taunt
{9863, "DRUID", 1, {9863, 300, 10}}, --Tranq
{5209, "DRUID", 1, {5209, 600, 6}}, --Challenging Roar
{355, "WARRIOR", 1, {355, 10, 0}}, --Taunt
{12975, "WARRIOR", 1, {12975, 600, 20}}, --Last stand
{871, "WARRIOR", 1, {871, 1800, 10}}, --SW
{1161, "WARRIOR", 1, {1161, 600, 6}}, --Challenging Shout
{11958, "MAGE", 1, {11958, 480, 40}}, --IB
{1020, "PALADIN", 1, {1020, 300, 12}}, --DS
{10310, "PALADIN", 1, {10310, 3600, 0}}, --LoH
{19752, "PALADIN", 1, {19752, 3600, 0}}, --DI
{17359, "SHAMAN", 1, {17359, 300, 12}}, --MTT
{20765, "WARLOCK", 1, {20765, 1800, 0}}, --Soulstone
}
end