local GlobalAddonName, ExRT = ... local IsEncounterInProgress, GetTime = IsEncounterInProgress, GetTime local VMRT = nil local module = ExRT:New("RaidCheck",ExRT.L.raidcheck) local ELib,L = ExRT.lib,ExRT.L module.db.tableFood = not ExRT.isClassic and { --Haste Mastery Crit Versa Int Str Agi Stam Stam Special [185736]=5, [257413]=5, [257418]=5, [257408]=5, [257422]=5, [259449]=10, [259452]=10, [259448]=10, [259453]=10, [288074]=5, [257415]=10, [257420]=10, [257410]=10, [257424]=10, [259455]=14, [259456]=14, [259454]=14, [259457]=10, [288075]=10, [290468]=10, [290469]=10, [290467]=10, --85 actually [285719]=5, [285720]=5, [285721]=5, [288074]=5, [288075]=10, [286171]=10, [297117]=14, [297118]=14, [297116]=14, [297034]=14, [297035]=14, [297039]=14, [297037]=14, [297119]=14, [297040]=14, } or { [18192]=true, [24799]=true, [18194]=true, [22730]=true, [25661]=true, [18141]=true, [18125]=true, [22790]=true, [22789]=true, [25804]=true, [18222]=true, [18125]=true, [18141]=true, --tbc [33257]=true, [33257]=true, [35272]=true, [45245]=true, [33254]=true, [33254]=true, [35272]=true, [33254]=true, [33268]=true, [33263]=true, [33263]=true, [33263]=true, [33259]=true, [33261]=true, [33261]=true, [33256]=true, [43764]=true, [43722]=true, [33265]=true, [45619]=true, [46682]=true, [44104]=true, [44098]=true, [44101]=true, [44099]=true, [44102]=true, [44106]=true, [44105]=true, [44097]=true, [44100]=true, [43771]=true, [33272]=true, [19705]=true, [19710]=true, [19706]=true, [19708]=true, [46899]=true, [19709]=true, [25941]=true, [40323]=true, [42293]=true, [25694]=true, [19711]=true, [24870]=true, } module.db.StaminaFood = {[201638]=true,[259457]=true,[288075]=true,[288074]=true,[297119]=true,[297040]=true,} module.db.tableFood_headers = {0,5,10,14} module.db.tableFlask = not ExRT.isClassic and { --Stamina, Int, Agi, Str [251838]=25, [251837]=25, [251836]=25, [251839]=25, [298839]=38, [298837]=38, [298836]=38, [298841]=38, } or { [17629]=true, [17627]=true, [17628]=true, [17626]=true, [17538]=true, [11474]=true, [17539]=true, [26276]=true, [21920]=true, [17535]=true, [11348]=true, [11371]=true, [24382]=true, [24417]=true, [24383]=true, [10669]=true, [10692]=true, [10693]=true, [10668]=true, [17538]=true, [24363]=true, [3593]=true, [11348]=true, [24361]=true, [11371]=true, [16323]=true, [11405]=true, [16329]=true, [17038]=true, [17539]=true, [11474]=true, [26276]=true, [21920]=true, [16326]=true, [16325]=true, [15233]=true, [15279]=true, [5665]=true, [17549]=true, [17543]=true, [17544]=true, [17546]=true, [17548]=true, [17545]=true, [17537]=true, [11334]=true, --tbc [28518]=true, [28540]=true, [28520]=true, [28521]=true, [28519]=true, [42735]=true, [41609]=true, [46837]=true, [41608]=true, [46839]=true, [41610]=true, [41611]=true, [40572]=true, [40576]=true, [40567]=true, [40568]=true, [40573]=true, [40575]=true, [28503]=true, [38954]=true, [28497]=true, [28501]=true, [28493]=true, [28491]=true, [33726]=true, [28490]=true, [33721]=true, [33720]=true, [28514]=true, [28509]=true, [28502]=true, [39628]=true, [39627]=true, [39626]=true, [39625]=true, [11406]=true, [28496]=true, [28489]=true, [28515]=true, [38910]=true, [38927]=true, [28511]=true, [28537]=true, [28513]=true, [28512]=true, [28536]=true, [28538]=true, } module.db.tableFlask_headers = {0,25,38} module.db.tablePotion = { [188024]=true, --Run haste [250871]=true, --Mana [252753]=true, --Mana channel [250872]=true, --Mana+hp [279152]=true, --Agi [279151]=true, --Int [279154]=true, --Stamina [279153]=true, --Str [251231]=true, --Armor [298152]=true, --Int [298146]=true, --Agi [298153]=true, --Stamina [298154]=true, --Str [298155]=true, --Armor [298225]=true, --Potion of Empowered Proximity [298317]=true, --Potion of Focused Resolve [300714]=true, --Potion of Unbridled Fury [300741]=true, --Potion of Wild Mending [251316]=true, --Potion of Bursting Blood [269853]=true, --Potion of Rising Death [250873]=true, --Invis [250878]=true, --Run haste [251143]=true, --Fall [307159]=true, --Agi [307162]=true, --Int [307163]=true, --Stam [307164]=true, --Str [307160]=true, --Armor [307161]=true, --Mana sleep [307194]=true, --Mana+hp [307193]=true, --Mana [307497]=true, --Potion of Deathly Fixation [307494]=true, --Potion of Empowered Exorcisms [307496]=true, --Potion of Divine Awakening [307495]=true, --Potion of Phantom Fire [322302]=true, --Potion of Sacrificial Anima [344314]=true, --Run [307199]=true, --Potion of Soul Purity [342890]=true, --Potion of Unhindered Passing [307196]=true, --Potion of Shadow Sight [307195]=true, --Invis } module.db.hsSpells = { [6262] = true, [105708] = true, [156438] = true, [188016] = true, --[188018] = true, [250870] = true, [301308] = true, [307192] = true, } module.db.raidBuffs = { {ATTACK_POWER_TOOLTIP or "AP","WARRIOR",6673,264761}, {SPELL_STAT3_NAME or "Stamina","PRIEST",21562,264764}, {SPELL_STAT4_NAME or "Int","MAGE",1459,264760}, } module.db.tableInt = {[1459]=true,[264760]=7,} module.db.tableStamina = {[21562]=true,[264764]=7,} module.db.tableAP = {[6673]=true,[264761]=7,} module.db.tableVantus = { --uldir [269276] = 1, [269405] = 2, [269408] = 3, [269407] = 4, [269409] = 5, [269411] = 6, [269412] = 7, [269413] = 8, --ep [298622] = 1, [298640] = 2, [298642] = 3, [298643] = 4, [298644] = 5, [298645] = 6, [298646] = 7, [302914] = 8, --Nyl [306475] = 1, [306480] = 2, [306476] = 3, [306477] = 4, [306478] = 5, [306484] = 6, [306485] = 7, [306479] = 8, [313550] = 9, [313551] = 10, [313554] = 11, [313556] = 12, --CN [311445] = 1, [334132] = 2, [311448] = 3, [311446] = 4, [311447] = 5, [311449] = 6, [311450] = 7, [311451] = 8, [311452] = 9, [334131] = 10, --SoD [354384] = 1, [354385] = 2, [354386] = 3, [354387] = 4, [354388] = 5, [354389] = 6, [354390] = 7, [354391] = 8, [354392] = 9, [354393] = 10, } module.db.minFoodLevelToActual = { [100] = 10, [125] = 14, } --TBC SCROLLS module.db.tableScrolls = not ExRT.isClassic and {} or { [33077]=true, [33082]=true, [33079]=true, [33078]=true, [33080]=true, [33081]=true, [12174]=true, [12179]=true, [12176]=true, [12178]=true, [12177]=true, [12175]=true, } if not ExRT.isClassic and UnitLevel'player' > 50 then module.db.tableFood = { --Haste Mastery Crit Versa Int Str Agi Stam Stam Special [308488]=30, [308506]=30, [308434]=30, [308514]=30, [327708]=20, [327706]=20, [327709]=20, [308525]=30, [327707]=30, [308637]=30, [308474]=18, [308504]=18, [308430]=18, [308509]=18, [327704]=18, [327701]=18, [327705]=18, [327702]=18, [308525]=18, [341449]=20, } module.db.tableFoodIsBest = { --Haste Mastery Crit Versa Int Str Agi Stam Stam Special [308488]=30, [308506]=30, [308434]=30, [308514]=30, [327708]=30, [327706]=30, [327709]=30, [308525]=30, [327707]=30, [308637]=30, [341449]=30, } module.db.tableFood_headers = {0,18,30} module.db.tableFlask = { --Stamina, Main stat, [307187]=70, [307185]=70, [307166]=70, } module.db.tableFlask_headers = {0,70} for i=1,#module.db.raidBuffs do module.db.raidBuffs[i][4] = nil end module.db.minFoodLevelToActual = { [100] = 18, [125] = 30, } module.db.tableInt = {[1459]=true,} module.db.tableStamina = {[21562]=true,} module.db.tableAP = {[6673]=true,} end module.db.classicBuffs = { {"druid","Druid",136078,{[21850]=7,[21849]=6,[1126]=1,[5232]=2,[5234]=4,[6756]=3,[8907]=5,[9884]=6,[9885]=7,}}, --Gift of the Wild {"int","Int",135932,{[10157]=5,[10156]=4,[1461]=3,[1460]=2,[1459]=1,[23028]=5}}, --Arcane Intellect {"ap","AP",132333,{[6673]=1,[5242]=2,[6192]=3,[11549]=4,[11550]=5,[11551]=6,[25289]=7,}}, --Battle Shout {"spirit","Spirit",135946,{[27681]=4,[14752]=1,[14818]=2,[14819]=3,[27841]=4,}}, --Prayer of Spirit {"armor","Armor",135926,{[588]=1,[7128]=2,[602]=3,[1006]=4,[10951]=5,[10952]=6,}}, --Inner Fire {"shadow","Shadow",136121,{[10958]=3,[976]=1,[10957]=2,[27683]=3,}}, --Shadow Protection {"stamina","Stamina",135987,{[1243]=1,[21562]=5,[21564]=6,[1244]=2,[1245]=3,[2791]=4,[10937]=5,[10938]=6,}}, --Power Word: Fortitude } if ExRT.isBC then module.db.classicBuffs = { {"druid","Druid",136078,{[26991]=8,[21850]=7,[21849]=6,[1126]=1,[5232]=2,[5234]=4,[6756]=3,[8907]=5,[9884]=6,[9885]=7,[26990]=8,}}, --Gift of the Wild {"int","Int",135932,{[27126]=6,[10157]=5,[10156]=4,[1461]=3,[1460]=2,[1459]=1,[23028]=5,[27127]=6,}}, --Arcane Intellect {"ap","AP",132333,{[6673]=1,[5242]=2,[6192]=3,[11549]=4,[11550]=5,[11551]=6,[25289]=7,[2048]=8,}}, --Battle Shout {"spirit","Spirit",135946,{[27681]=4,[32999]=5,[14752]=1,[14818]=2,[14819]=3,[27841]=4,[25312]=5,}}, --Prayer of Spirit {"armor","Armor",135926,{[588]=1,[7128]=2,[602]=3,[1006]=4,[10951]=5,[10952]=6,[25431]=7,}}, --Inner Fire {"shadow","Shadow",136121,{[25433]=4,[10958]=3,[976]=1,[10957]=2,[27683]=3,[39374]=4,}}, --Shadow Protection {"stamina","Stamina",135987,{[1243]=1,[21562]=5,[21564]=6,[25392]=7,[1244]=2,[1245]=3,[2791]=4,[10937]=5,[10938]=6,[25389]=7,}}, --Power Word: Fortitude } end if ExRT.isClassic and UnitFactionGroup("player") == "Alliance" and not ExRT.isBC then module.db.classicBuffs[#module.db.classicBuffs+1] = {"bom","BoM",135908,{[19740]=1,[19834]=2,[19835]=3,[19836]=4,[19837]=5,[19838]=6,[25291]=7,[25782]=6,[25916]=7,}} --Blessing of Might module.db.classicBuffs[#module.db.classicBuffs+1] = {"bow","BoW",135970,{[19742]=1,[19850]=2,[19852]=3,[19853]=4,[19854]=5,[25290]=6,[25894]=5,[25918]=6,}} --Blessing of Wisdom module.db.classicBuffs[#module.db.classicBuffs+1] = {"bok","BoK",135993,{[20217]=1,[25898]=1,}} --Blessing of Kings module.db.classicBuffs[#module.db.classicBuffs+1] = {"bos","BoS",135967,{[1038]=1,[25895]=1,}} --Blessing of Kings end if ExRT.isBC then module.db.classicBuffs[#module.db.classicBuffs+1] = {"bom","BoM",135908,{[19740]=1,[19834]=2,[19835]=3,[19836]=4,[19837]=5,[19838]=6,[25291]=7,[27140]=8,[25782]=6,[25916]=7,[27141]=8}} --Blessing of Might module.db.classicBuffs[#module.db.classicBuffs+1] = {"bow","BoW",135970,{[19742]=1,[19850]=2,[19852]=3,[19853]=4,[19854]=5,[25290]=6,[27142]=7,[25894]=5,[25918]=6,[27143]=7,}} --Blessing of Wisdom module.db.classicBuffs[#module.db.classicBuffs+1] = {"bok","BoK",135993,{[20217]=1,[25898]=1,}} --Blessing of Kings module.db.classicBuffs[#module.db.classicBuffs+1] = {"bos","BoS",135967,{[1038]=1,[25895]=1,}} --Blessing of Kings end module.db.tableClassicBuff = {} if ExRT.isClassic then for i=1,#module.db.classicBuffs do for k,v in pairs(module.db.classicBuffs[i][4]) do module.db.tableClassicBuff[k] = module.db.classicBuffs[i] end end end module.db.potionList = {} module.db.hsList = {} module.db.tableFoodInProgress = nil module.db.RaidCheckReadyCheckHide = nil module.db.RaidCheckReadyCheckTime = nil module.db.RaidCheckReadyCheckTable = {} module.db.RaidCheckReadyPPLNum = 0 module.db.RaidCheckReadyCheckHideSchedule = nil module.db.tableRunes = {[224001]=5,[270058]=6,[317065]=6,[347901]=18,} module.db.durability = {} module.db.oil = {} module.db.oil2 = {} module.db.kit = {} local IsSendFoodByMe,IsSendFlaskByMe,IsSendRunesByMe,IsSendBuffsByMe,IsSendKitsByMe,IsSendOilsByMe = nil local _GetRaidRosterInfo = GetRaidRosterInfo local function GetRaidRosterInfo(raidUnitID) if IsInRaid() then return _GetRaidRosterInfo(raidUnitID) elseif raidUnitID <= 5 then local unit = raidUnitID <= 4 and "party"..raidUnitID or "player" return ExRT.F.UnitCombatlogname(unit),nil,1,nil,nil,select(2,UnitClass(unit)) else return nil end end local function GetPotion(arg1) local h = L.raidcheckPotion local t = {} for key,val in pairs(module.db.potionList) do t[#t+1] = {key,val} end local function toChat(h) local chat_type = ExRT.F.chatType(true) if arg1 == 2 then print(h) end if arg1 == 1 then SendChatMessage(h,chat_type) end end table.sort(t,function(a,b) return a[2]>b[2] end) for i=1,#t do h = h .. format("%s %d%s",t[i][1],t[i][2],i<#t and ", " or "") if #h > 230 then toChat(h) h = "" end end toChat(h) end local function GetHs(arg1) local h = L.raidcheckHS local t = {} for key,val in pairs(module.db.hsList) do t[#t+1] = {key,val} end local function toChat(h) local chat_type = ExRT.F.chatType(true) if arg1 == 2 then print(h) end if arg1 == 1 then SendChatMessage(h,chat_type) end end table.sort(t,function(a,b) return a[2]>b[2] end) for i=1,#t do h = h .. format("%s %d%s",t[i][1],t[i][2],i<#t and ", " or "") if #h > 230 then toChat(h) h = "" end end toChat(h) end --[[ Check Types: 1 - to chat 2 - ready check 3 - ready check (self) nil - self ]] local function PublicResults(msg,chat_type) if msg == "" or not msg then return elseif chat_type then msg = msg:gsub("|c........","") msg = msg:gsub("|r","") chat_type = ExRT.F.chatType(true) SendChatMessage(msg,chat_type) else print(msg) end end local function GetRunes(checkType) local f = {[0]={}} local gMax = ExRT.F.GetRaidDiffMaxGroup() for j=1,40 do local name,_,subgroup = GetRaidRosterInfo(j) if name and subgroup <= gMax then local isAnyBuff = nil for i=1,40 do local _,_,_,_,_,_,_,_,_,spellId = UnitAura(name, i,"HELPFUL") if not spellId then break else local isRune = module.db.tableRunes[spellId] if isRune then f[isRune] = f[isRune] or {} f[isRune][ #f[isRune]+1 ] = name isAnyBuff = true break end end end if not isAnyBuff then f[0][ #f[0]+1 ] = name end end end if not checkType or checkType == 1 then for _,stats in ipairs({0,5,6}) do f[stats] = f[stats] or {} local result = format("|cff00ff00%d (%d):|r ",stats,#f[stats]) for i=1,#f[stats] do result = result .. f[stats][i] if #result > 230 then PublicResults(result,checkType) result = "" elseif i ~= #f[stats] then result = result .. ", " end end PublicResults(result,checkType) end elseif checkType == 2 or checkType == 3 then if checkType == 3 then checkType = nil end f[5] = f[5] or {} local result = format("|cff00ff00%s (%d):|r ",L.RaidCheckNoRunes,#f[0]+#f[5]) for i=1,#f[0] do result = result .. f[0][i] if #result > 230 then PublicResults(result,checkType) result = "" elseif i ~= #f[0] or #f[5] > 0 then result = result .. ", " end end for i=1,#f[5] do result = result .. f[5][i] .. "(5)" if #result > 230 then PublicResults(result,checkType) result = "" elseif i ~= #f[5] then result = result .. ", " end end PublicResults(result,checkType) end end local vruneName local function GetVRunes(checkType) if not vruneName then local kjrunename = GetSpellInfo(237825) if kjrunename then kjrunename = kjrunename:match("^(.-)[:%-:]") if kjrunename then vruneName = "^"..kjrunename end end end local f = {[0]={},[1]={}} local gMax = ExRT.F.GetRaidDiffMaxGroup() for j=1,40 do local name,_,subgroup = GetRaidRosterInfo(j) if name and subgroup <= gMax then local isAnyBuff = nil for i=1,40 do local auraName = UnitAura(name, i,"HELPFUL") if type(auraName)~='string' then break elseif vruneName then local isRune = auraName:find(vruneName) if isRune then f[1][ #f[1]+1 ] = name isAnyBuff = true break end end end if not isAnyBuff then f[0][ #f[0]+1 ] = name end end end PublicResults((vruneName or ""):gsub("%^",""),checkType) for stats,name in pairs({[0]=L.NoText,[1]=L.YesText}) do local result = format("|cff00ff00%s (%d):|r ",name,#f[stats]) for i=1,#f[stats] do result = result .. f[stats][i] if #result > 230 then PublicResults(result,checkType) result = "" elseif i ~= #f[stats] then result = result .. ", " end end PublicResults(result,checkType) end end local function GetFood(checkType) local f = {[0]={}} local gMax = ExRT.F.GetRaidDiffMaxGroup() for j=1,40 do local name,_,subgroup = GetRaidRosterInfo(j) if name and subgroup <= gMax then local isAnyBuff = nil for i=1,40 do local _,_,_,_,_,_,_,_,_,spellId,_,_,_,_,_,stats = UnitAura(name, i,"HELPFUL") if not spellId then break else local foodType = module.db.tableFood[spellId] if foodType then local _,unitRace = UnitRace(name) if unitRace == "Pandaren" and stats then stats = stats / 2 end if module.db.StaminaFood[spellId] and stats then stats = ceil( stats / 1.5 ) end stats = foodType or stats ---ALERT HERE, stats must be first; replace on future updates if module.db.tableFoodIsBest[spellId] then stats = module.db.tableFoodIsBest[spellId] end if spellId == 201641 or spellId == 201640 or spellId == 201639 or spellId == 201638 then stats = foodType elseif spellId == 201636 or spellId == 201634 or spellId == 201635 or spellId == 201637 then stats = foodType elseif (spellId == 259449 or spellId == 259452 or spellId == 259448 or spellId == 259453) or (spellId == 259455 or spellId == 259456 or spellId == 259454 or spellId == 259457) then stats = foodType elseif spellId == 185736 then stats = foodType end f[stats] = f[stats] or {} f[stats][ #f[stats]+1 ] = name isAnyBuff = true end end end if not isAnyBuff then f[0][ #f[0]+1 ] = name end end end if not checkType or checkType == 1 then for _,foodType in ipairs(module.db.tableFood_headers) do f[foodType] = f[foodType] or {} local result = format("|cff00ff00%d (%d):|r ",foodType,#f[foodType]) for j=1,#f[foodType] do result = result .. f[foodType][j] .. (j < #f[foodType] and ", " or "") if #result > 230 then PublicResults(result,checkType) result = "" end end PublicResults(result,checkType) end elseif checkType == 2 or checkType == 3 then if checkType == 3 then checkType = nil end local counter,counterResult = 0,0 local badStats = {} for statsNum,data in pairs(f) do if ((VMRT.RaidCheck.FoodMinLevel and statsNum < (module.db.minFoodLevelToActual[VMRT.RaidCheck.FoodMinLevel] or 375)) or (not VMRT.RaidCheck.FoodMinLevel and statsNum == 0)) and #data > 0 then badStats[#badStats + 1] = statsNum counter = counter + #data end end sort(badStats) local result = format("|cff00ff00%s (%d):|r ",L.raidchecknofood,counter) for i=1,#badStats do local statsNum = badStats[i] for j=1,#f[statsNum] do counterResult = counterResult + 1 result = result .. f[statsNum][j].. (statsNum ~= 0 and "("..statsNum..")" or "") .. (counterResult < counter and ", " or "") if #result > 220 then PublicResults(result,checkType) result = "" end end end PublicResults(result,checkType) end end local function GetFlask(checkType) local f = {[0]={}} local gMax = ExRT.F.GetRaidDiffMaxGroup() local _time = GetTime() for j=1,40 do local name,_,subgroup = GetRaidRosterInfo(j) if name and subgroup <= gMax then local isAnyBuff = nil for i=1,40 do local _,_,_,_,_,expires,_,_,_,spellId = UnitAura(name, i,"HELPFUL") if not spellId then break else local flaskType = module.db.tableFlask[spellId] if flaskType then f[flaskType] = f[flaskType] or {} expires = expires or -1 local lost = expires-_time if expires == 0 or lost < 0 then lost = 901 end f[flaskType][ #f[flaskType]+1 ] = {name,lost} if ExRT.F.table_find(module.db.tableFlask_headers,flaskType) then isAnyBuff = true end end end end if not isAnyBuff then f[0][ #f[0]+1 ] = {name,901} end end end for flaskType,typeData in pairs(f) do table.sort(typeData,function(a,b) return a[2] 230 then PublicResults(result,checkType) result = "" end end PublicResults(result,checkType) end elseif checkType == 2 or checkType == 3 then if checkType == 3 then checkType = nil end f[0] = f[0] or {} local result = format("|cff00ff00%s (%d):|r ",L.raidchecknoflask,#f[0]) for j=1,#f[0] do result = result .. format("%s%s",f[0][j][1] or "?",j < #f[0] and ", " or "") if #result > 230 then PublicResults(result,checkType) result = "" end end local strings_list = {} for i=1,#module.db.tableFlask_headers do local flaskStats = module.db.tableFlask_headers[i] if flaskStats ~= 0 then f[ flaskStats ] = f[ flaskStats ] or {} for j=1,#f[ flaskStats ] do if f[ flaskStats ][j][2] <= showExpFlasks_seconds and f[ flaskStats ][j][2] >= 0 then local mins = floor( f[ flaskStats ][j][2] / 60 ) strings_list[#strings_list + 1] = format("%s%s%s",f[ flaskStats ][j][1] or "?", "("..(mins == 0 and "<1" or tostring(mins))..")", i < #module.db.tableFlask_headers and i > 1 and (not VMRT.RaidCheck.FlaskLQ) and " LQ" or "") elseif i < #module.db.tableFlask_headers and i > 1 and not VMRT.RaidCheck.FlaskLQ then strings_list[#strings_list + 1] = format("%s%s",f[ flaskStats ][j][1] or "?"," LQ") end end end end local strings_list_len = #strings_list if strings_list_len > 0 then result = result .. ( #f[0] > 0 and result ~= "" and ", " or "" ) end for i=1,strings_list_len do result = result .. strings_list[i] .. (i < strings_list_len and ", " or "") if #result > 230 then PublicResults(result,checkType) result = "" end end PublicResults(result,checkType) end end local function GetRaidBuffs(checkType) local buffsList,buffsListLen = module.db.raidBuffs,#module.db.raidBuffs local f = {} for k=1,buffsListLen * 2 do f[k] = 0 end local gMax = ExRT.F.GetRaidDiffMaxGroup() local isAnyBuff = {} for j=1,40 do local name,_,subgroup, _, _, class = GetRaidRosterInfo(j) if name and subgroup <= gMax then for k=1,buffsListLen * 2 do isAnyBuff[k] = false end for k=1,buffsListLen do if class == buffsList[k][2] then f[-k] = true end end for i=1,40 do local _,_,_,_,_,_,_,_,_,auraSpellID = UnitAura(name, i,"HELPFUL") if not auraSpellID then break else for k=1,buffsListLen do if auraSpellID == buffsList[k][3] then isAnyBuff[k] = true isAnyBuff[buffsListLen + k] = true elseif auraSpellID == buffsList[k][4] then isAnyBuff[buffsListLen + k] = true end end end end for k=1,buffsListLen do if not isAnyBuff[k] then f[k] = f[k] + 1 end if not isAnyBuff[buffsListLen + k] then f[buffsListLen + k] = f[buffsListLen + k] + 1 end end end end if true then if checkType == 3 then checkType = nil end local result = format("|cff00ff00%s|r ",GARRISON_MISSION_PARTY_BUFFS) local isAnyBuff = true for k=1,buffsListLen do if f[k] > 0 and f[-k] then isAnyBuff = false result = result .. buffsList[k][1] .. " ("..f[k].."), " elseif f[buffsListLen + k] > 0 and not f[-k] and UnitLevel'player' == 50 then --check for minor buffs (7%), but only in BfA actually isAnyBuff = false result = result .. buffsList[k][1] .. " ("..f[buffsListLen + k].."), " end end if isAnyBuff then result = result .. ALL else result = result:gsub(", $","") end PublicResults(result,checkType) end end local function GetKits(checkType) local list = { YES = {}, NO = {}, NO_ADDON = {}, } local currTime = time() for index, name in ExRT.F.IterateRoster, ExRT.F.GetRaidDiffMaxGroup() do if name then local shortName = strsplit("-",name) local data = module.db.kit[name] or module.db.kit[shortName] if data then local kNow,kMax = (data.kit or ""):match("(%d+)/(%d+)") if data.time + 600 < currTime then kNow = nil end if kNow == "1" then list.YES[#list.YES + 1] = shortName else list.NO[#list.NO + 1] = shortName end else list.NO[#list.NO + 1] = shortName list.NO_ADDON[shortName] = true end end end if checkType == 3 then checkType = nil end local result = format("|cff00ff00%s ",L.RaidCheckNoKits) if checkType == 2 or not checkType then sort(list.NO) result = result .."("..#list.NO.."):|r " for i=1,#list.NO do local name = list.NO[i] result = result .. name .. ( list.NO_ADDON[name] and " ("..L.RaidCheckNoAddon..")" or "" ) if #result > 230 then PublicResults(result,checkType) result = "" elseif i < #list.NO then result = result .. ", " end end result = result:gsub(", $","") if result ~= "" then PublicResults(result,checkType) end end end local function GetOils(checkType) local list = { YES = {}, NO = {}, NO_ADDON = {}, } local currTime = time() for index, name in ExRT.F.IterateRoster, ExRT.F.GetRaidDiffMaxGroup() do if name then local shortName = strsplit("-",name) local data = module.db.oil[name] or module.db.oil[shortName] if data then local anyOil = true if data.time + 600 < currTime then anyOil = nil end if anyOil and data.oil == "0" then anyOil = nil end if not anyOil then local data2 = module.db.oil2[name] or module.db.oil2[shortName] if data2 then anyOil = true if data2.time + 600 < currTime then anyOil = nil end if anyOil and data2.oil == "0" then anyOil = nil end end end if anyOil then list.YES[#list.YES + 1] = shortName else list.NO[#list.NO + 1] = shortName end else list.NO[#list.NO + 1] = shortName list.NO_ADDON[shortName] = true end end end if checkType == 3 then checkType = nil end local result = format("|cff00ff00%s ",L.RaidCheckNoOils) if checkType == 2 or not checkType then sort(list.NO) result = result .."("..#list.NO.."):|r " for i=1,#list.NO do local name = list.NO[i] result = result .. name .. ( list.NO_ADDON[name] and " ("..L.RaidCheckNoAddon..")" or "" ) if #result > 230 then PublicResults(result,checkType) result = "" elseif i < #list.NO then result = result .. ", " end end result = result:gsub(", $","") if result ~= "" then PublicResults(result,checkType) end end end --SCROLLS local function GetScrolls(checkType) local f = {[0]={}} local gMax = ExRT.F.GetRaidDiffMaxGroup() for j=1,40 do local name,_,subgroup = GetRaidRosterInfo(j) if name and subgroup <= gMax then for i=1,40 do local _,_,_,_,_,expires,_,_,_,spellId = UnitAura(name, i,"HELPFUL") if not spellId then break else local scrollType = module.db.tableScrolls[spellId] if scrollType then f[scrollType] = f[scrollType] or {} end end end end end if not checkType or checkType == 1 then result = "" PublicResults(result,checkType) end end module.GetRunes = GetRunes module.GetVRunes = GetVRunes module.GetFood = GetFood module.GetFlask = GetFlask module.GetRaidBuffs = GetRaidBuffs module.GetKits = GetKits module.GetOils = GetOils function module.options:Load() self:CreateTilte() self.decorationLine = ELib:DecorationLine(self,true,"BACKGROUND",-5):Point("TOPLEFT",self,0,-16):Point("BOTTOMRIGHT",self,"TOPRIGHT",0,-36) self.tab = ELib:Tabs(self,0,LANDING_PAGE_REPORT,L.raidcheckReadyCheck,L.RaidCheckConsum):Point(0,-36):Size(698,598):SetTo(1) self.tab:SetBackdropBorderColor(0,0,0,0) self.tab:SetBackdropColor(0,0,0,0) self.food = ELib:Button(self.tab.tabs[1],L.raidcheckfood):Size(230,20):Point(15,-10):OnClick(function() GetFood() end) self.food.txt = ELib:Text(self.tab.tabs[1],"/rt food",10):Size(100,20):Point("LEFT",self.food,"RIGHT",5,0) self.foodToChat = ELib:Button(self.tab.tabs[1],L.raidcheckfoodchat):Size(230,20):Point("LEFT",self.food,"RIGHT",71,0):OnClick(function() GetFood(1) end) self.foodToChat.txt = ELib:Text(self.tab.tabs[1],"/rt foodchat",10):Size(100,20):Point("LEFT",self.foodToChat,"RIGHT",5,0) self.flask = ELib:Button(self.tab.tabs[1],L.raidcheckflask):Size(230,20):Point(15,-35):OnClick(function() GetFlask() end) self.flask.txt = ELib:Text(self.tab.tabs[1],"/rt flask",10):Size(100,20):Point("LEFT",self.flask,"RIGHT",5,0) self.flaskToChat = ELib:Button(self.tab.tabs[1],L.raidcheckflaskchat):Size(230,20):Point("LEFT",self.flask,"RIGHT",71,0):OnClick(function() GetFlask(1) end) self.flaskToChat.txt = ELib:Text(self.tab.tabs[1],"/rt flaskchat",10):Size(100,20):Point("LEFT",self.flaskToChat,"RIGHT",5,0) self.runes = ELib:Button(self.tab.tabs[1],L.RaidCheckRunesCheck):Size(230,20):Point(15,-60):OnClick(function() GetRunes() end) self.runes.txt = ELib:Text(self.tab.tabs[1],"/rt check r",10):Size(60,22):Point("LEFT",self.runes,"RIGHT",5,0) self.runesToChat = ELib:Button(self.tab.tabs[1],L.RaidCheckRunesChat):Size(230,20):Point("LEFT",self.runes,"RIGHT",71,0):OnClick(function() GetRunes(1) end) self.runesToChat.txt = ELib:Text(self.tab.tabs[1],"/rt check rc",10):Size(100,22):Point("LEFT",self.runesToChat,"RIGHT",5,0) self.vantusrunes = ELib:Button(self.tab.tabs[1],L.RaidCheckVRunesCheck):Size(230,20):Point(15,-85):OnClick(function() GetVRunes() end) self.vantusrunes.txt = ELib:Text(self.tab.tabs[1],"/rt check v",10):Size(60,22):Point("LEFT",self.vantusrunes,"RIGHT",5,0) self.vantusrunesToChat = ELib:Button(self.tab.tabs[1],L.RaidCheckVRunesChat):Size(230,20):Point("LEFT",self.vantusrunes,"RIGHT",71,0):OnClick(function() GetVRunes(1) end) self.vantusrunesToChat.txt = ELib:Text(self.tab.tabs[1],"/rt check vc",10):Size(100,22):Point("LEFT",self.vantusrunesToChat,"RIGHT",5,0) self.raidbuffs = ELib:Button(self.tab.tabs[1],L.RaidCheckBuffs):Size(230,20):Point(15,-110):OnClick(function() GetRaidBuffs() end) self.raidbuffs.txt = ELib:Text(self.tab.tabs[1],"/rt check b",10):Size(60,22):Point("LEFT",self.raidbuffs,"RIGHT",5,0) self.raidbuffsToChat = ELib:Button(self.tab.tabs[1],L.RaidCheckBuffsToChat):Size(230,20):Point("LEFT",self.raidbuffs,"RIGHT",71,0):OnClick(function() GetRaidBuffs(1) end) self.raidbuffsToChat.txt = ELib:Text(self.tab.tabs[1],"/rt check bc",10):Size(100,22):Point("LEFT",self.raidbuffsToChat,"RIGHT",5,0) self.level2optLine = CreateFrame("Frame",nil,self.tab.tabs[1]) self.level2optLine:SetPoint("TOPLEFT",10,-135) self.level2optLine:SetSize(1,1) self.chkSlak = ELib:Check(self.tab.tabs[1],L.raidcheckslak,VMRT.RaidCheck.ReadyCheck):Point("TOPLEFT",self.level2optLine,7,0):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.ReadyCheck = true else VMRT.RaidCheck.ReadyCheck = nil end end) self.chkOnAttack = ELib:Check(self.tab.tabs[1],L.RaidCheckOnAttack,VMRT.RaidCheck.OnAttack):Point("TOPLEFT",self.chkSlak,"TOPLEFT",25,-25):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.OnAttack = true else VMRT.RaidCheck.OnAttack = nil end end) self.chkSendSelf = ELib:Check(self.tab.tabs[1],L.RaidCheckSendSelf,VMRT.RaidCheck.SendSelf):Point("TOPLEFT",self.chkOnAttack,"TOPLEFT",0,-25):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.SendSelf = true else VMRT.RaidCheck.SendSelf = nil end end) self.disableLFR = ELib:Check(self.tab.tabs[1],L.RaidCheckDisableInLFR,VMRT.RaidCheck.disableLFR):Point("TOPLEFT",self.chkSendSelf,"TOPLEFT",0,-25):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.disableLFR = true else VMRT.RaidCheck.disableLFR = nil end end) self.chkRunes = ELib:Check(self.tab.tabs[1],L.RaidCheckRunesEnable,VMRT.RaidCheck.RunesCheck):Point("TOPLEFT",self.level2optLine,7,-100):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.RunesCheck = true else VMRT.RaidCheck.RunesCheck = nil end end) self.chkBuffs = ELib:Check(self.tab.tabs[1],L.RaidCheckBuffsEnable,VMRT.RaidCheck.BuffsCheck):Point("TOPLEFT",self.chkRunes,0,-25):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.BuffsCheck = true else VMRT.RaidCheck.BuffsCheck = nil end end) self.chkKits = ELib:Check(self.tab.tabs[1],L.RaidCheckKitsEnable,VMRT.RaidCheck.KitsCheck):Point("TOPLEFT",self.chkBuffs,0,-25):Tooltip(L.RaidCheckNoAddonOptTooltip):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.KitsCheck = true else VMRT.RaidCheck.KitsCheck = nil end end) self.chkOils = ELib:Check(self.tab.tabs[1],L.RaidCheckOilsEnable,VMRT.RaidCheck.OilsCheck):Point("TOPLEFT",self.chkKits,0,-25):Tooltip(L.RaidCheckNoAddonOptTooltip):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.OilsCheck = true else VMRT.RaidCheck.OilsCheck = nil end end) self.minFoodLevelText = ELib:Text(self.tab.tabs[1],L.RaidCheckMinFoodLevel,11):Point("TOPLEFT",self.chkOils,"TOPLEFT",3,-23):Size(0,25) self.minFoodLevelAny = ELib:Radio(self.tab.tabs[1],L.RaidCheckMinFoodLevelAny,not VMRT.RaidCheck.FoodMinLevel):Point("LEFT",self.minFoodLevelText,"RIGHT", 15, 0):OnClick(function(self) self:SetChecked(true) module.options.minFoodLevel100:SetChecked(false) module.options.minFoodLevel125:SetChecked(false) VMRT.RaidCheck.FoodMinLevel = nil end) self.minFoodLevel100 = ELib:Radio(self.tab.tabs[1],module.db.minFoodLevelToActual[100],VMRT.RaidCheck.FoodMinLevel == 100):Point("LEFT",self.minFoodLevelAny,"RIGHT", 75, 0):OnClick(function(self) self:SetChecked(true) module.options.minFoodLevelAny:SetChecked(false) module.options.minFoodLevel125:SetChecked(false) VMRT.RaidCheck.FoodMinLevel = 100 end) self.minFoodLevel125 = ELib:Radio(self.tab.tabs[1],module.db.minFoodLevelToActual[125],VMRT.RaidCheck.FoodMinLevel == 125):Point("LEFT",self.minFoodLevel100,"RIGHT", 75, 0):OnClick(function(self) self:SetChecked(true) module.options.minFoodLevelAny:SetChecked(false) module.options.minFoodLevel100:SetChecked(false) VMRT.RaidCheck.FoodMinLevel = 125 end) self.minFlaskExpText = ELib:Text(self.tab.tabs[1],L.RaidCheckMinFlaskExp,11):Point("TOPLEFT",self.minFoodLevelText,"TOPLEFT",0,-22):Size(0,25) self.minFlaskExpNo = ELib:Radio(self.tab.tabs[1],L.RaidCheckMinFlaskExpNo,VMRT.RaidCheck.FlaskExp == 0):Point("LEFT",self.minFlaskExpText,"RIGHT", 15, 0):OnClick(function(self) self:SetChecked(true) module.options.minFlaskExp5min:SetChecked(false) module.options.minFlaskExp10min:SetChecked(false) VMRT.RaidCheck.FlaskExp = 0 end) self.minFlaskExp5min = ELib:Radio(self.tab.tabs[1],"5 "..L.RaidCheckMinFlaskExpMin,VMRT.RaidCheck.FlaskExp == 1):Point("LEFT",self.minFlaskExpNo,"RIGHT", 75, 0):OnClick(function(self) self:SetChecked(true) module.options.minFlaskExpNo:SetChecked(false) module.options.minFlaskExp10min:SetChecked(false) VMRT.RaidCheck.FlaskExp = 1 end) self.minFlaskExp10min = ELib:Radio(self.tab.tabs[1],"10 "..L.RaidCheckMinFlaskExpMin,VMRT.RaidCheck.FlaskExp == 2):Point("LEFT",self.minFlaskExp5min,"RIGHT", 75, 0):OnClick(function(self) self:SetChecked(true) module.options.minFlaskExpNo:SetChecked(false) module.options.minFlaskExp5min:SetChecked(false) VMRT.RaidCheck.FlaskExp = 2 end) self.checkLQFlask = ELib:Check(self.tab.tabs[1],L.RaidCheckLQFlask,not VMRT.RaidCheck.FlaskLQ):Point("TOPLEFT",self.level2optLine,7,-245):OnClick(function(self) VMRT.RaidCheck.FlaskLQ = not VMRT.RaidCheck.FlaskLQ end) self.chkPotion = ELib:Check(self.tab.tabs[1],L.raidcheckPotionCheck,VMRT.RaidCheck.PotionCheck):Point("TOPLEFT",self.level2optLine,7,-270):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.PotionCheck = true module.options.potionToChat:Enable() module.options.potion:Enable() module.options.hs:Enable() module.options.hsToChat:Enable() module:RegisterEvents('ENCOUNTER_START','ENCOUNTER_END') else VMRT.RaidCheck.PotionCheck = nil module.options.potionToChat:Disable() module.options.potion:Disable() module.options.hs:Disable() module.options.hsToChat:Disable() module:UnregisterEvents('ENCOUNTER_START','ENCOUNTER_END') end end) self.potion = ELib:Button(self.tab.tabs[1],L.raidcheckPotionLastPull):Size(230,20):Point("TOPLEFT",self.chkPotion,"TOPLEFT",-2,-25):OnClick(function() GetPotion(2) end):Run(function(s,a) if a then s:Disable() end end,not VMRT.RaidCheck.PotionCheck) self.potion.txt = ELib:Text(self.tab.tabs[1],"/rt potion",11):Size(100,20):Point("LEFT",self.potion,"RIGHT",5,0) self.potionToChat = ELib:Button(self.tab.tabs[1],L.raidcheckPotionLastPullToChat):Size(230,20):Point("LEFT",self.potion,"RIGHT",71,0):OnClick(function() GetPotion(1) end):Run(function(s,a) if a then s:Disable() end end,not VMRT.RaidCheck.PotionCheck) self.potionToChat.txt = ELib:Text(self.tab.tabs[1],"/rt potionchat",11):Size(100,20):Point("LEFT",self.potionToChat,"RIGHT",5,0) self.hs = ELib:Button(self.tab.tabs[1],L.raidcheckHSLastPull):Size(230,20):Point("TOPLEFT",self.potion,"TOPLEFT",0,-25):OnClick(function() GetHs(2) end):Run(function(s,a) if a then s:Disable() end end,not VMRT.RaidCheck.PotionCheck) self.hsToChat = ELib:Button(self.tab.tabs[1],L.raidcheckHSLastPullToChat):Size(230,20):Point("LEFT",self.hs,"RIGHT",71,0):OnClick(function() GetHs(1) end):Run(function(s,a) if a then s:Disable() end end,not VMRT.RaidCheck.PotionCheck) ELib:Text(self.tab.tabs[2],L.RaidCheckChatComand..": |cffffffff/rt check|r",10):Point(15,-10) self.chkReadyCheckFrameEnable = ELib:Check(self.tab.tabs[2],L.Enable,VMRT.RaidCheck.ReadyCheckFrame):Point(15,-25):AddColorState():OnClick(function(self) if self:GetChecked() then module:RegisterEvents('READY_CHECK_FINISHED','READY_CHECK_CONFIRM') VMRT.RaidCheck.ReadyCheckFrame = true else module:UnregisterEvents('READY_CHECK_FINISHED','READY_CHECK_CONFIRM') VMRT.RaidCheck.ReadyCheckFrame = nil end end) self.chkReadyCheckFrameEnableRL = ELib:Check(self.tab.tabs[2],L.RaidCheckOnlyRL,VMRT.RaidCheck.ReadyCheckFrameOnlyRL):Point(15,-50):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.ReadyCheckFrameOnlyRL = true else VMRT.RaidCheck.ReadyCheckFrameOnlyRL = nil end end) self.chkReadyCheckFrameButTest = ELib:Button(self.tab.tabs[2],L.raidcheckReadyCheckTest):Size(300,20):Point(15,-75):OnClick(function(self) module.main:READY_CHECK("raid1",35,"TEST") for i=2,30 do local y = math.random(1,30000) local r = math.random(1,2) ExRT.F.ScheduleTimer(function() module.main:READY_CHECK_CONFIRM("raid"..i,r==1,"TEST") end, y/1000) end end) self.chkReadyCheckFrameSliderScale = ELib:Slider(self.tab.tabs[2],L.raidcheckReadyCheckScale):Size(300):Point(15,-115):Range(5,200):SetTo(VMRT.RaidCheck.ReadyCheckFrameScale or 100):OnChange(function(self,event) event = event - event%1 VMRT.RaidCheck.ReadyCheckFrameScale = event ExRT.F.SetScaleFix(module.frame,event/100) self.tooltipText = event self:tooltipReload(self) end) self.chkReadyCheckFrameHtmlTimer = ELib:Text(self.tab.tabs[2],L.raidcheckReadyCheckTimerTooltip,11):Size(0,24):Point(15,-148) self.chkReadyCheckFrameEditBoxTimer = ELib:Edit(self.tab.tabs[2],6,true):Size(50,20):Point("TOP",0,-150):Point("LEFT",self.chkReadyCheckFrameHtmlTimer,"RIGHT",10,0):Text(VMRT.RaidCheck.ReadyCheckFrameTimerFade or "4"):OnChange(function(self) VMRT.RaidCheck.ReadyCheckFrameTimerFade = tonumber(self:GetText()) or 4 if VMRT.RaidCheck.ReadyCheckFrameTimerFade < 2.5 then VMRT.RaidCheck.ReadyCheckFrameTimerFade = 2.5 end end) self.chkReadyCheckFrameClassSort = ELib:Check(self.tab.tabs[2],L.RaidCheckSortByClass,VMRT.RaidCheck.ReadyCheckSortClass):Point(15,-175):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.ReadyCheckSortClass = true else VMRT.RaidCheck.ReadyCheckSortClass = nil end end) self.chkReadyCheckColDecLine = ELib:DecorationLine(self.tab.tabs[2]):Point("TOP",self.chkReadyCheckFrameClassSort,"BOTTOM",0,-5):Size(0,1):Point("LEFT",0,0):Point("RIGHT",0,0) self.chkReadyCheckColText = ELib:Text(self.tab.tabs[2],L.cd2Columns..":",12):Point("TOPLEFT",self.chkReadyCheckFrameClassSort,"BOTTOMLEFT",0,-10) self.chkReadyCheckColSoulstone = ELib:Check(self.tab.tabs[2],GetSpellInfo(20707) or "Soulstone",VMRT.RaidCheck.ReadyCheckSoulstone):Point("TOPLEFT",self.chkReadyCheckFrameClassSort,"BOTTOMLEFT",0,-30):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.ReadyCheckSoulstone = true else VMRT.RaidCheck.ReadyCheckSoulstone = nil end end) self.chkReadyCheckConsumables = ELib:Check(self.tab.tabs[3],L.Enable,not VMRT.RaidCheck.DisableConsumables):Point(15,-10):AddColorState():OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.DisableConsumables = nil module.consumables:Enable() else VMRT.RaidCheck.DisableConsumables = true module.consumables:Disable() end end) self.chkReadyCheckConsumablesOnlyCuadFlask = ELib:Check(self.tab.tabs[3],L.RaidCheckOnlyCauldron,VMRT.RaidCheck.DisableNotCauldronFlask):Point("TOPLEFT",self.chkReadyCheckConsumables,"BOTTOMLEFT",0,-5):OnClick(function(self) VMRT.RaidCheck.DisableNotCauldronFlask = self:GetChecked() end) if ExRT.isClassic then self.tab.tabs[3].button:Hide() self.tab.tabs[1].button:Hide() self.tab.tabs[2].button:ClearAllPoints() self.tab.tabs[2].button:SetPoint("TOPLEFT", 10, 24) self.tab:SetTo(2) self.chkReadyCheckColDecLine:Hide() self.chkReadyCheckColText:Hide() self.chkReadyCheckColSoulstone:Hide() end end local function CheckPotionsOnPull() table.wipe(module.db.potionList) local gMax = ExRT.F.GetRaidDiffMaxGroup() for j=1,40 do local name,_,subgroup = GetRaidRosterInfo(j) if name and subgroup <= gMax then local b = nil for i=1,40 do local _,_,_,_,_,_,_,_,_,spellId = UnitAura(name, i,"HELPFUL") if not spellId then break elseif module.db.tablePotion[spellId] then module.db.potionList[name] = 1 b = true end end if not b then module.db.potionList[name] = 0 end end end end do local charItemSlotsTable = not ExRT.isClassic and { CharacterHeadSlot,CharacterNeckSlot,CharacterShoulderSlot,CharacterBackSlot,CharacterChestSlot,CharacterWristSlot, CharacterHandsSlot,CharacterWaistSlot,CharacterLegsSlot,CharacterFeetSlot,CharacterFinger0Slot,CharacterFinger1Slot,CharacterTrinket0Slot,CharacterTrinket1Slot, CharacterMainHandSlot,CharacterSecondaryHandSlot } or { CharacterHeadSlot,CharacterNeckSlot,CharacterShoulderSlot,CharacterBackSlot,CharacterChestSlot,CharacterWristSlot, CharacterHandsSlot,CharacterWaistSlot,CharacterLegsSlot,CharacterFeetSlot, CharacterFinger0Slot,CharacterFinger1Slot,CharacterTrinket0Slot,CharacterTrinket1Slot, CharacterMainHandSlot,CharacterSecondaryHandSlot,CharacterRangedSlot, } function module:DurabilityCheck() local totalCurrent, totalMax = 0,0 for _,v in pairs(charItemSlotsTable) do local slotId = v:GetID() local current, maximum = GetInventoryItemDurability(slotId) if current and maximum then totalCurrent = totalCurrent + current totalMax = totalMax + maximum end end if totalMax == 0 then return 100 else return totalCurrent / totalMax * 100 end end end local inspectScantip = CreateFrame("GameTooltip", "ExRTRaidCheckScanningTooltip", nil, "GameTooltipTemplate") inspectScantip:SetOwner(UIParent, "ANCHOR_NONE") do local KitSlots = { 5, --INVSLOT_CHEST --7, --INVSLOT_LEGS --10, --INVSLOT_HAND --8, --INVSLOT_FEET } local L_EncName = "^"..L.RaidCheckReinforced local TimeLeftPatt = "%(([^%)]+)%)[^%)]*$" if ExRT.locale == "koKR" then L_EncName = "%([^%)]+%+%d+%) %(%d+" elseif ExRT.locale == "zhCN" then L_EncName = "^加固(%+[0-9]+ " TimeLeftPatt = "(([^)]-))$" elseif ExRT.locale ~= "ruRU" and ExRT.locale ~= "enGB" and ExRT.locale ~= "enUS" then L_EncName = "%(%+%d+[^%)]+%) %(%d+" end function module:KitCheck() local kitNow, kitMax = 0, 1 local kitType = 0 local timeLeft for _,itemSlotID in pairs(KitSlots) do inspectScantip:SetInventoryItem("player", itemSlotID) for j=2, inspectScantip:NumLines() do local tooltipLine = _G["ExRTRaidCheckScanningTooltipTextLeft"..j] local text = tooltipLine:GetText() if text and text ~= "" then if text:find(L_EncName) then kitNow = kitNow + 1 timeLeft = text:match(TimeLeftPatt) local stats = text:match("%d+") if stats == "32" then kitType = 172347 elseif stats == "16" then kitType = 172346 elseif stats == "24" then kitType = 180709 end break end end end inspectScantip:ClearLines() end return kitNow, kitMax, timeLeft, kitType end end do local OilSlots = { 16, --INVSLOT_MAINHAND 17, --INVSLOT_OFFHAND } local oilTypes = nil function module:OilCheck() if not oilTypes then oilTypes = { {GetSpellInfo(320798),320798}, {GetSpellInfo(321389),321389}, {GetSpellInfo(322762),322762}, {GetSpellInfo(322763),322763}, {GetSpellInfo(295623),33757}, {GetSpellInfo(194084),318038}, {L.RaidCheckOilSharpen,322762}, {L.RaidCheckOilSharpen2,322763}, } for i=#oilTypes,1,-1 do if not oilTypes[i][1] then tremove(oilTypes,i) end end end local oilMH, oilOH = 0, 0 for _,itemSlotID in pairs(OilSlots) do inspectScantip:SetInventoryItem("player", itemSlotID) for j=2, inspectScantip:NumLines() do local tooltipLine = _G["ExRTRaidCheckScanningTooltipTextLeft"..j] local text = tooltipLine:GetText() local isBreak if text and text ~= "" then for i=1,#oilTypes do if text:find("^"..oilTypes[i][1]) then if itemSlotID == 16 then oilMH = oilTypes[i][2] elseif itemSlotID == 17 then oilOH = oilTypes[i][2] end isBreak = true break end end end if isBreak then break end end inspectScantip:ClearLines() end return oilMH, oilOH end end function module.main:ENCOUNTER_START() ExRT.F.ScheduleTimer(CheckPotionsOnPull,1.5) table.wipe(module.db.hsList) for index, name in ExRT.F.IterateRoster, ExRT.F.GetRaidDiffMaxGroup() do if name then module.db.hsList[name] = 0 end end module:RegisterEvents('COMBAT_LOG_EVENT_UNFILTERED') end function module.main:ENCOUNTER_END() module:UnregisterEvents('COMBAT_LOG_EVENT_UNFILTERED') end function module:slash(arg) if arg == "food" then GetFood() elseif arg == "flask" then GetFlask() elseif arg == "foodchat" then GetFood(1) elseif arg == "flaskchat" then GetFlask(1) elseif arg == "potion" and VMRT.RaidCheck.PotionCheck then GetPotion(2) elseif arg == "potionchat" and VMRT.RaidCheck.PotionCheck then GetPotion(1) elseif arg == "check runes" or arg == "check r" then GetRunes() elseif arg == "check runeschat" or arg == "check rc" then GetRunes(1) elseif arg == "check v" then GetVRunes() elseif arg == "check vc" then GetVRunes(1) elseif arg == "check b" then GetRaidBuffs() elseif arg == "check bc" then GetRaidBuffs(1) elseif arg == "check" then module:ReadyCheckWindow(nil,nil,true) elseif arg == "help" then print("|cff00ff00/rt check|r - show raid buffs window") end end local RCW_iconsList = {'food','flask','rune','vantus','int','ap','stam','dur'} local RCW_iconsListHeaders = {L.RaidCheckHeadFood,L.RaidCheckHeadFlask,L.RaidCheckHeadRune,L.RaidCheckHeadVantus,SPELL_STAT4_NAME or "Int",ATTACK_POWER_TOOLTIP or "AP",SPELL_STAT3_NAME or "Stamina",DURABILITY or "Durability"} local RCW_iconsListDebugIcons = {136000,967549,840006,1058937,135932,132333,135987,132281} local RCW_iconsListWide = {} local RCW_liveToClassicDiff = 0 if ExRT.isClassic then local wideDiff = 0 for k,v in pairs(RCW_iconsListWide) do if v then wideDiff = wideDiff - 1 end end RCW_liveToClassicDiff = (#module.db.classicBuffs + 2) - #RCW_iconsList + 1 RCW_iconsListDebugIcons[2] = 134877 RCW_iconsListWide[2] = true for i=3,#RCW_iconsList do RCW_iconsList[i] = nil RCW_iconsListHeaders[i] = nil RCW_iconsListDebugIcons[i] = nil end if ExRT.isBC then RCW_liveToClassicDiff = RCW_liveToClassicDiff + 1 RCW_iconsList[#RCW_iconsList+1] = "scrolls" RCW_iconsListHeaders[#RCW_iconsList] = "Scrolls" RCW_iconsListDebugIcons[#RCW_iconsList] = 134943 RCW_iconsListWide[#RCW_iconsList] = true end for i=1,#module.db.classicBuffs do RCW_iconsList[#RCW_iconsList+1] = module.db.classicBuffs[i][1] RCW_iconsListHeaders[#RCW_iconsList] = module.db.classicBuffs[i][2] RCW_iconsListDebugIcons[#RCW_iconsList] = module.db.classicBuffs[i][3] end RCW_iconsList[#RCW_iconsList+1] = "dur" RCW_iconsListHeaders[#RCW_iconsList] = DURABILITY or "Durability" RCW_iconsListDebugIcons[#RCW_iconsList] = 132281 for k,v in pairs(RCW_iconsListWide) do if v then wideDiff = wideDiff + 1 end end RCW_liveToClassicDiff = RCW_liveToClassicDiff + wideDiff end local RCW_liveToslDiff = 0 if not ExRT.isClassic and UnitLevel'player' > 50 then tinsert(RCW_iconsList,8,'oil') tinsert(RCW_iconsListHeaders,8,WEAPON) tinsert(RCW_iconsListDebugIcons,8,463543) tinsert(RCW_iconsList,8,'kit') tinsert(RCW_iconsListHeaders,8,BONUS_ARMOR) tinsert(RCW_iconsListDebugIcons,8,3528447) RCW_liveToslDiff = 60 end module.frame = ELib:Template("ExRTDialogModernTemplate",UIParent) module.frame:SetSize(430+(ExRT.isClassic and 30*RCW_liveToClassicDiff or 0)+RCW_liveToslDiff,100) module.frame:SetPoint("CENTER",UIParent,"CENTER",0,0) module.frame:SetFrameStrata("DIALOG") module.frame:EnableMouse(true) module.frame:SetMovable(true) module.frame:RegisterForDrag("LeftButton") module.frame:SetClampedToScreen(true) module.frame:SetScript("OnDragStart", function(self) self:StartMoving() end) module.frame:SetScript("OnDragStop", function(self) self:StopMovingOrSizing() VMRT.RaidCheck.ReadyCheckLeft = self:GetLeft() VMRT.RaidCheck.ReadyCheckTop = self:GetTop() end) module.frame:SetScript("OnMouseDown", function(self,button) if button == "RightButton" then self:Hide() end end) module.frame:Hide() do local tmr = 0 module.frame:SetScript("OnUpdate",function(self,elapsed) tmr = tmr + elapsed if tmr > 0.1 then tmr = 0 local h = "" if module.db.RaidCheckReadyCheckTime then local ctime_ = module.db.RaidCheckReadyCheckTime - GetTime() if ctime_ > 0 then h = format(" (%d %s)",ctime_+1,L.raidcheckReadyCheckSec) end end self.headText:SetText("MRT: "..L.raidcheckReadyCheck..h) end end) end module.frame.border = ExRT.lib.CreateShadow(module.frame,20) module.frame.headText = module.frame.title module.frame.anim_frame = CreateFrame("Frame",nil,module.frame) module.frame.anim_frame:SetPoint("TOPLEFT") module.frame.anim_frame:SetSize(1,1) module.frame.anim = module.frame.anim_frame:CreateAnimationGroup() module.frame.timer = module.frame.anim:CreateAnimation() module.frame.timer:SetScript("OnFinished", function() module.frame.anim:Stop() module.frame:Hide() end) module.frame.timer:SetDuration(2) module.frame.timer:SetScript("OnUpdate", function(self,elapsed) module.frame:SetAlpha(1-self:GetProgress()) end) module.frame:SetScript("OnHide", function(self) self:UnregisterAllEvents() if module.frame.anim:IsPlaying() then module.frame.anim:Stop() end if module.frame.hideTimer then module.frame.hideTimer:Cancel() module.frame.hideTimer = nil end end) do local button = CreateFrame("Button",nil,module.frame) module.frame.mimimize = button function module.frame:SetMaximized() button.isMinimized = nil self.minimized:Hide() self.maximized:Show() button.NormalTexture:SetTexCoord(unpack(button.TC.up)) button.HighlightTexture:SetTexCoord(unpack(button.TC.up)) button.PushedTexture:SetTexCoord(unpack(button.TC.up)) self:SetHeight(self.SizeMaximized) end function module.frame:SetMinimized() button.isMinimized = true self.minimized:Show() self.maximized:Hide() button.NormalTexture:SetTexCoord(unpack(button.TC.down)) button.HighlightTexture:SetTexCoord(unpack(button.TC.down)) button.PushedTexture:SetTexCoord(unpack(button.TC.down)) self:SetHeight(module.frame.SizeMinimized) end function module.frame:SetMinimizedFromOptions() if VMRT.RaidCheck.RCW_Mini and not button.isMinimized then self:SetMinimized() end end button.TC = { up = {0.3125,0.375,0.5,0.625}, down = {0.25,0.3125,0.5,0.625}, } button:SetPoint("TOPRIGHT",-20,0) button:SetSize(18,18) button:SetScript("OnClick",function(self) if self.isMinimized then module.frame:SetMaximized() VMRT.RaidCheck.RCW_Mini = false else module.frame:SetMinimized() VMRT.RaidCheck.RCW_Mini = true end end) button.NormalTexture = button:CreateTexture(nil,"ARTWORK") button.NormalTexture:SetTexture("Interface\\AddOns\\"..GlobalAddonName.."\\media\\DiesalGUIcons16x256x128") button.NormalTexture:SetPoint("TOPLEFT") button.NormalTexture:SetPoint("BOTTOMRIGHT") button.NormalTexture:SetVertexColor(1,1,1,.7) button.NormalTexture:SetTexCoord(unpack(button.TC.up)) button:SetNormalTexture(button.NormalTexture) button.HighlightTexture = button:CreateTexture(nil,"ARTWORK") button.HighlightTexture:SetTexture("Interface\\AddOns\\"..GlobalAddonName.."\\media\\DiesalGUIcons16x256x128") button.HighlightTexture:SetPoint("TOPLEFT") button.HighlightTexture:SetPoint("BOTTOMRIGHT") button.HighlightTexture:SetVertexColor(1,1,0,1) button.HighlightTexture:SetTexCoord(unpack(button.TC.up)) button:SetHighlightTexture(button.HighlightTexture) button.PushedTexture = button:CreateTexture(nil,"ARTWORK") button.PushedTexture:SetTexture("Interface\\AddOns\\"..GlobalAddonName.."\\media\\DiesalGUIcons16x256x128") button.PushedTexture:SetPoint("TOPLEFT") button.PushedTexture:SetPoint("BOTTOMRIGHT") button.PushedTexture:SetVertexColor(1,1,1,1) button.PushedTexture:SetTexCoord(unpack(button.TC.up)) button:SetPushedTexture(button.PushedTexture) end module.frame.minimized = CreateFrame('Frame',nil,module.frame) module.frame.minimized:SetPoint("TOPLEFT") module.frame.minimized:SetSize(1,1) module.frame.minimized:Hide() module.frame.maximized = CreateFrame('Frame',nil,module.frame) module.frame.maximized:SetPoint("TOPLEFT") module.frame.maximized:SetSize(1,1) module.frame.lines = {} module.frame.lines_mini = {} local function RCW_LineOnUpdate(self) if self:IsMouseOver(self) and not self.hoverShow then self.hover:SetAlpha(.15) self.hoverShow = true elseif not self:IsMouseOver(self) and self.hoverShow then self.hover:SetAlpha(0) self.hoverShow = false end end local function RCW_LineOnEnter(self) if self.tooltip then GameTooltip:SetOwner(self, "ANCHOR_LEFT") if type(self.tooltip) == 'string' then GameTooltip:SetHyperlink(self.tooltip) else GameTooltip:SetUnitAura(self:GetParent().unit, self.tooltip, "HELPFUL") end GameTooltip:Show() end end local function RCW_LineOnLeave(self) if self.tooltip then GameTooltip_Hide() end end local function RCW_AddIcon(parent,texture) local icon = ELib:Icon(parent,texture,14) icon:SetScript("OnEnter",RCW_LineOnEnter) icon:SetScript("OnLeave",RCW_LineOnLeave) icon.texture:SetTexCoord(.1,.9,.1,.9) icon.text = ELib:Text(icon,"100",8):Point("BOTTOMRIGHT",4,0):Right():Color(0,1,0) icon.bigText = ELib:Text(icon,"",10):Point("CENTER",0,0):Center():Color(1,1,1) icon.subIcon = icon:CreateTexture(nil, "BORDER") icon.subIcon:SetPoint("CENTER",icon,"TOPRIGHT",-2,-2) icon.subIcon:SetSize(10,10) icon.subIcon:SetTexture("Interface\\AddOns\\"..GlobalAddonName.."\\media\\DiesalGUIcons16x256x128") icon.subIcon:SetTexCoord(0.125,0.1875,0.5,0.625) icon.subIcon:SetVertexColor(1,0,0) icon.subIcon:Hide() return icon end local function CreateCol(line,key,i) line[key.."pointer"] = CreateFrame("Frame",nil,line) line[key.."pointer"]:SetSize(RCW_iconsListWide[i] and 60 or 30,14) if i==1 then line[key.."pointer"]:SetPoint("CENTER",line.name,"RIGHT",15 - 5,0) else line[key.."pointer"]:SetPoint("CENTER",line[ RCW_iconsList[i-1].."pointer" ],"CENTER",30+(RCW_iconsListWide[i-1] and 15 or 0)+(RCW_iconsListWide[i] and 15 or 0),0) end line[key] = RCW_AddIcon(line,RCW_iconsListDebugIcons[i]) line[key]:Point("CENTER",line[key.."pointer"],"CENTER",0,0) line[key].UpdatePos = function(self,pointFrame) line[key.."pointer"]:ClearAllPoints() line[key.."pointer"]:SetPoint("CENTER",pointFrame,"CENTER",30,0) return line[key.."pointer"] end for j=2,4 do line[key..j] = RCW_AddIcon(line,RCW_iconsListDebugIcons[i]) line[key..j]:Point("LEfT",line[key..((j-1) == 1 and "" or tostring(j-1))],"RIGHT",0,0) line[key..j]:Hide() end end local RCW_iconsList_ORIGIN = #RCW_iconsList function module.frame:UpdateCols() for i=RCW_iconsList_ORIGIN+1,#RCW_iconsList do RCW_iconsList[i] = nil if module.frame.headers[i] then module.frame.headers[i]:SetText("") end end local colsAdd = 0 if VMRT.RaidCheck.ReadyCheckSoulstone then colsAdd = colsAdd + 1 RCW_iconsList[RCW_iconsList_ORIGIN+colsAdd] = "ss" RCW_iconsListHeaders[RCW_iconsList_ORIGIN+colsAdd] = GetSpellInfo(20707) or "Soulstone" RCW_iconsListDebugIcons[RCW_iconsList_ORIGIN+colsAdd] = 136210 local header = module.frame.headers[RCW_iconsList_ORIGIN+colsAdd] if not header then header = ELib:Text(module.frame.headers,"",10):Color(1,1,1):Point("BOTTOMLEFT",module.frame.headers[RCW_iconsList_ORIGIN+colsAdd-1],"BOTTOMLEFT",30,0) module.frame.headers[RCW_iconsList_ORIGIN+colsAdd] = header end header:SetText(RCW_iconsListHeaders[RCW_iconsList_ORIGIN+colsAdd]) end for i=1,40 do local line = module.frame.lines[i] line:SetSize(420+(ExRT.isClassic and 30*RCW_liveToClassicDiff or 0)+RCW_liveToslDiff+colsAdd*30,14) local prevPointer = line[ RCW_iconsList[RCW_iconsList_ORIGIN].."pointer" ] if VMRT.RaidCheck.ReadyCheckSoulstone then if not line["ss"] then CreateCol(line,"ss",RCW_iconsList_ORIGIN+1) end prevPointer = line["ss"]:UpdatePos(prevPointer) line["ss"]:Show() elseif line["ss"] then line["ss"]:Hide() end end module.frame:SetWidth(430+(ExRT.isClassic and 30*RCW_liveToClassicDiff or 0)+RCW_liveToslDiff+colsAdd*30) end function module.frame:Create() if self.isCreated then return end self.isCreated = true local miniWidth = (module.frame:GetWidth() - 10) / 4 for i=1,40 do local line = CreateFrame("FRAME",nil,module.frame.maximized) module.frame.lines[i] = line line.pos = i if i==1 then line:SetPoint("TOPLEFT", 5, -50) else line:SetPoint("TOPLEFT", module.frame.lines[i-1], "BOTTOMLEFT", 0, -0) end line:SetSize(420+(ExRT.isClassic and 30*RCW_liveToClassicDiff or 0)+RCW_liveToslDiff,14) line.name = ELib:Text(line,"raid"..i):Size(130,12):Point("LEFT",20,0):Font(ExRT.F.defFont,12):Color():Shadow() line.icon = ELib:Icon(line,"Interface\\RaidFrame\\ReadyCheck-Waiting",14):Point("LEFT",0,0) for i,key in pairs(RCW_iconsList) do CreateCol(line,key,i) end if i%2 == 0 then line.back = line:CreateTexture(nil,"BACKGROUND") line.back:SetPoint("TOPLEFT",-5,0) line.back:SetPoint("BOTTOMRIGHT",5,0) line.back:SetColorTexture(1,1,1,.05) end line.hover = line:CreateTexture(nil,"BACKGROUND") line.hover:SetPoint("TOPLEFT",-5,0) line.hover:SetPoint("BOTTOMRIGHT",5,0) line.hover:SetColorTexture(1,1,1,1) line.hover:SetAlpha(0) line.classLeft = line:CreateTexture(nil,"BACKGROUND",nil,5) line.classLeft:SetPoint("TOPLEFT",-5,0) line.classLeft:SetPoint("BOTTOMLEFT",-5,0) --line.classLeft:SetWidth(160) line.classLeft:SetPoint("RIGHT",5,0) line.classLeft:SetColorTexture(1,1,1,1) line.classLeft:SetGradientAlpha("VERTICAL",.24,.25,.30,1,.27,.28,.33,1) line:SetScript("OnUpdate",RCW_LineOnUpdate) local line_mini = CreateFrame("FRAME",nil,module.frame.minimized) module.frame.lines_mini[i] = line_mini line_mini.pos = i if i==1 then line_mini:SetPoint("TOPLEFT", 5, -20) elseif i % 4 == 1 then line_mini:SetPoint("TOPLEFT", module.frame.lines_mini[i-4], "BOTTOMLEFT", 0, -0) else line_mini:SetPoint("TOPLEFT", module.frame.lines_mini[i-1], "TOPRIGHT", 0, -0) end line_mini:SetSize(miniWidth,14) line_mini.name = ELib:Text(line_mini,"raid"..i):Size(miniWidth-16,12):Point("LEFT",16,0):Font(ExRT.F.defFont,12):Color():Shadow() line_mini.icon = ELib:Icon(line_mini,"Interface\\RaidFrame\\ReadyCheck-Waiting",14):Point("LEFT",0,0) line.mini = line_mini end end do local line = CreateFrame("Frame",nil,module.frame) module.frame.timeLeftLine = line local cR1,cG1,cB1 = 1,.2,.2 --Started local cR3,cG3,cB3 = .6,.6,.2 --Mid local cR2,cG2,cB2 = .2,.7,.2 --Finished local WIDTH,WIDTH2 = 430,18 line:SetSize(WIDTH,18) --line:SetPoint("BOTTOMLEFT",module.frame,"TOPLEFT",0,-50) line:SetPoint("TOPLEFT",module.frame,"TOPLEFT",0,0) line.back = line:CreateTexture(nil,"BACKGROUND") line.back:SetSize(110,18) line.back:SetPoint("LEFT") line.back:SetColorTexture(cR1,cG1,cB1) line.back2 = line:CreateTexture(nil,"BACKGROUND") line.back2:SetSize(WIDTH2,18) line.back2:SetPoint("LEFT",line.back,"RIGHT") line.back2:SetColorTexture(1,1,1) line.back2:SetGradientAlpha("HORIZONTAL",cR1,cG1,cB1,1,cR1,cG1,cB1,0) line.time = ELib:Text(module.frame.maximized,"40"):Point("TOPLEFT",line,5,-34):Font(ExRT.F.defFont,12):Color():Shadow() line.time:Hide() local currR,currG,currB = 1,.2,.2 local stop = nil local end_time,duration = 0,30 line:SetScript("OnUpdate",function(self) if stop then return end local t = end_time - GetTime() if t < 0 then self:Stop() return end local width = t / duration * (WIDTH - WIDTH2) if width <= 1 then width = 1 end line.back:SetWidth(width) --line.time:SetFormattedText("%d",t) end) line.Stop = function(self) stop = true if line:GetAlpha() > 0 then line.anim_alpha:Play() end self:Color(cR2,cG2,cB2) end line.Start = function(self,timer) end_time = GetTime() + timer duration = timer line.time:SetText("") line.back:SetColorTexture(cR1,cG1,cB1) line.back2:SetGradientAlpha("HORIZONTAL",cR1,cG1,cB1,1,cR1,cG1,cB1,0) line.back:SetWidth(WIDTH - WIDTH2) currR,currG,currB = cR1,cG1,cB1 line.anim_alpha:Stop() line:SetAlpha(1) line.time:SetAlpha(1) stop = nil self:Show() self.time:Show() end line:SetScript("OnHide",function(self) line.time:Hide() end) line.anim_alpha = line:CreateAnimationGroup() line.anim_alpha.color = line.anim_alpha:CreateAnimation() line.anim_alpha.color:SetDuration(1) line.anim_alpha.color:SetScript("OnUpdate", function(self,elapsed) line:SetAlpha(1 - self:GetProgress()) line.time:SetAlpha(1 - self:GetProgress()) end) line.anim_alpha.color:SetScript("OnFinished", function() line.anim_alpha:Stop() end) local cfR,cfG,cfB = 1,1,1 local ctR,ctG,ctB = 1,1,1 line.anim = line:CreateAnimationGroup() line.anim.color = line.anim:CreateAnimation() line.anim.color:SetDuration(1) line.anim.color:SetScript("OnUpdate", function(self,elapsed) local r,g,b = cfR - (cfR - ctR) * self:GetProgress(),cfG - (cfG - ctG) * self:GetProgress(),cfB - (cfB - ctB) * self:GetProgress() line.back:SetColorTexture(r,g,b) line.back2:SetGradientAlpha("HORIZONTAL",r,g,b,1,r,g,b,0) currR,currG,currB = r,g,b end) line.Color = function(self,r,g,b) if self.anim:IsPlaying() then line.anim:Stop() end cfR,cfG,cfB = currR,currG,currB ctR,ctG,ctB = r,g,b line.anim:Play() end line.SetProgress = function(self,total,totalResponced) local progress = totalResponced / max(total,1) if progress == 0 then self.time:SetText(totalResponced.."/"..total) return end local fR,fG,fB local tR,tG,tB if progress >= .66 then fR,fG,fB = cR3,cG3,cB3 tR,tG,tB = cR2,cG2,cB2 progress = (progress - 0.66) / (1 - 0.66) else fR,fG,fB = cR1,cG1,cB1 tR,tG,tB = cR3,cG3,cB3 progress = progress * (1 / 0.66) end --self.time:SetText(progress < 1 and totalResponced.."/"..total or "") self.time:SetText(totalResponced.."/"..total) local r,g,b = fR - (fR - tR) * progress,fG - (fG - tG) * progress,fB - (fB - tB) * progress self:Color(r,g,b) end --Fix header strata local frame = CreateFrame("Frame",nil,module.frame) frame:SetPoint("TOP") frame:SetSize(1,1) module.frame.title:SetParent(frame) end do local headers = CreateFrame("Frame",nil,module.frame.maximized) module.frame.headers = headers for i,key in pairs(RCW_iconsListHeaders) do headers[i] = ELib:Text(headers,key,10):Color(1,1,1) if i == 1 then headers[i]:Point("BOTTOMLEFT",module.frame,"TOPLEFT",155,-48) else headers[i]:Point("BOTTOMLEFT",headers[i-1],"BOTTOMLEFT",30+(RCW_iconsListWide[i-1] and 15 or 0)+(RCW_iconsListWide[i] and 15 or 0),0) end end local group = headers:CreateAnimationGroup() group:SetScript('OnFinished', function() group:Play() end) local rotation = group:CreateAnimation('Rotation') rotation:SetDuration(0.000001) rotation:SetEndDelay(2147483647) rotation:SetOrigin('BOTTOMRIGHT', 0, 0) rotation:SetDegrees(20) group:Play() end function module.frame:PrepToHide() if (not module.frame:IsShown()) or (self.isManual) then return end local delay = tonumber(VMRT.RaidCheck.ReadyCheckFrameTimerFade or "4") or 4 module.frame.hideTimer = C_Timer.NewTimer(max(0.01,delay),function() module.frame.hideTimer = nil module.frame.anim:Play() end) module.frame.timeLeftLine:Stop() end local RCW_UnitToLine = {} local RCW_RCStatusToIcon = { [1] = "Interface\\RaidFrame\\ReadyCheck-Waiting", [2] = "Interface\\RaidFrame\\ReadyCheck-Ready", [3] = "Interface\\RaidFrame\\ReadyCheck-NotReady", } function module.frame:UpdateLinesSize(large) local size1 = large and 20 or 14 local size2 = large and 18 or 14 local size3 = large and 8 or 6 local size4 = large and 10 or 8 for i=1,#self.lines do local line = self.lines[i] line:SetHeight(size1) for i,key in pairs(RCW_iconsList) do for j=1,4 do local icon = line[key..(j == 1 and "" or tostring(j))] icon:SetSize(size2,size2) icon.size = size2 icon.text:SetFont(icon.text:GetFont(),size3,"OUTLINE") icon.bigText:SetFont(icon.bigText:GetFont(),size4,"OUTLINE") icon.subIcon:SetSize(size4,size4) end end end end local testRandomNames = { --Top parses on WCL :) "Dredd", "Tygar","Lexk","Zoot","Creams","Critcapped","Dragonaut","Kimence","Raarticuno","Tek","Vodia","Waffles","Bovice","Katbus","Sassuke","Thriser","Variety","Xennov","Drshockalu","Illson","Ushnark","Angelista","Beezy","Blankies","Bujusima","Creamydee","Cutemeatball","Dmb","Garwyn","Sharoon","Shrode","Zhava", "Inkline","Fog","Lukn","Vanq","Coziness","Detore","Mcdoogal","Scubastevee", "Brath", "Elron","Palyu","Ravage","Andyxo","Dean","Dee","Emlis","Manglz","Rhuku","Thance","Verruckt","Zeki","Dane","Blurs","Perry","Smy","Soylent","Earl","Hedral","Jiyun","Xelectra","Bloodrusher","Ej","Execute","Lyger","Musclemommyx","Retrofresh","Rodcockulous", "Swimmies","Bixr","Buffcheck","Lightbox","Riggered","Stonka","Yim","Pigg","Poom","Vish", "Loue", "Cheely","Exora","Hoh","Perilla","Asuna","Devi","Empty","Klikey","Rtm","Sammie","Trashy","Kame","Legs","Ordi","Rising","Seyera","Arafei","Dikken","Lillefod","Abbotts","Dumpy","Feron","Fungi","Kolonelkunt","Pahstee","Tyba","Yvraine","Zela", "Krageth","Lunaris","Aestalux","Delmaree","Kutsal","Odoac","Shadyshade","Dokiecry","El","Elyvilon","Samm", } function module.frame:UpdateRoster() wipe(RCW_UnitToLine) local gMax = ExRT.F.GetRaidDiffMaxGroup() local inRaid = IsInRaid() local count = 0 local classColorsTable = type(CUSTOM_CLASS_COLORS)=="table" and CUSTOM_CLASS_COLORS or RAID_CLASS_COLORS if self.isTest then local function shuffle(tbl) for i = #tbl, 2, -1 do local j = math.random(i) tbl[i], tbl[j] = tbl[j], tbl[i] end return tbl end shuffle(testRandomNames) end local result = {} for i=1,(self.isTest and (ExRT.isClassic and 40 or math.random(0,1)*10+20) or 40) do local name,subgroup,_,class,unit if self.isTest then --name = format("%s %d","raid",i) name = testRandomNames[i] if #name > 2 then local del = math.random(2,#name) name = name:sub(1,del-1)..name:sub(del+1) end subgroup = i / 5 class = ExRT.GDB.ClassList[math.random(1,12)] unit = "raid"..i elseif not inRaid and i <= 5 then unit = i == 1 and 'player' or 'party'..(i-1) name = UnitName(unit) subgroup = 1 class = select(2,UnitClass(unit)) else name,_,subgroup,_,_,class = GetRaidRosterInfo(i) unit = "raid"..i end if name and subgroup <= gMax then result[#result+1] = { name = ExRT.F.delUnitNameServer(name), unit = unit, class = class, } end end if VMRT and VMRT.RaidCheck and VMRT.RaidCheck.ReadyCheckSortClass then sort(result,function(a,b) if a.class == b.class then return a.name < b.name else return a.class < b.class end end) end for i=1,#result do count = count + 1 local line = self.lines[count] if line then local data = result[i] line.name:SetText(data.name) line.unit = data.unit line.unit_name = data.name line.name:SetTextColor(1,1,1,1) line.mini.name:SetText(data.name) line.mini.name:SetTextColor(1,1,1,1) local classColor = classColorsTable[data.class] local r,g,b = classColor and classColor.r or .7,classColor and classColor.g or .7,classColor and classColor.b or .7 line.classLeft:SetGradientAlpha("HORIZONTAL",r,g,b,.4,r,g,b,0) line:Show() line.mini:Show() line.rc_status = 1 RCW_UnitToLine[data.name] = line RCW_UnitToLine[line.unit] = line end end for i=count+1,#self.lines do self.lines[i].unit = nil self.lines[i]:Hide() self.lines[i].mini:Hide() end self:UpdateLinesSize(count <= 20) self.SizeMaximized = 55 + (count <= 20 and 20 or 14) * count self.SizeMinimized = 25 + math.ceil(count / 4) * 14 self:SetHeight(self.maximized:IsShown() and self.SizeMaximized or self.SizeMinimized) end function module.frame:UpdateData(onlyLine) if not vruneName and not ExRT.isClassic then local kjrunename = GetSpellInfo(237825) if kjrunename then kjrunename = kjrunename:match("^(.-)[:%-:]") if kjrunename then vruneName = "^"..kjrunename end end end local total,totalResponced = 0,0 local currTime,currTime2 = time(),GetTime() for i=1,#self.lines do local line = self.lines[i] if line.unit then total = total + 1 if line.rc_status == 2 or line.rc_status == 3 then totalResponced = totalResponced + 1 end if not onlyLine or line == onlyLine then local buffCount = 0 local flaskCount = 1 local scrollCount = 1 line.icon.texture:SetTexture(RCW_RCStatusToIcon[line.rc_status] or "") line.mini.icon.texture:SetTexture(RCW_RCStatusToIcon[line.rc_status] or "") for i,key in pairs(RCW_iconsList) do line[key].texture:SetTexture("") line[key].texture:SetAlpha(1) line[key].text:SetText("") line[key].bigText:SetText("") line[key].tooltip = nil line[key].subIcon:Hide() line[key]:Point("CENTER",line[key.."pointer"],"CENTER",0,0) for j=2,4 do line[key..j].texture:SetTexture("") line[key..j].texture:SetAlpha(1) line[key..j].text:SetText("") line[key..j].bigText:SetText("") line[key..j].tooltip = nil line[key..j]:Hide() line[key..j].subIcon:Hide() end end for i=1,60 do local name,icon,_,_,duration,expirationTime,_,_,_,spellId,_,_,_,_,_,val1 = UnitAura(line.unit, i,"HELPFUL") if not spellId then break elseif module.db.tableFood[spellId] then local val = module.db.tableFood[spellId] line.food.texture:SetTexture(136000) if type(val)~="number" then val = "" elseif module.db.tableFoodIsBest[spellId] then line.food.text:SetTextColor(0,1,0) elseif val >= 30 or (UnitLevel'player' < 60 and val >= 10) then line.food.text:SetTextColor(0,1,0) else line.food.text:SetTextColor(1,0,0) end line.food.text:SetText(val) line.food.tooltip = i if expirationTime and expirationTime - currTime2 < 600 and expirationTime ~= 0 then line.food.subIcon:Show() line.food.texture:SetAlpha(.6) end buffCount = buffCount + 1 elseif icon == 134062 or icon == 132805 then line.food.texture:SetTexture(134062) line.food.text:SetText("") elseif icon == 136000 then line.food.texture:SetTexture(136000) line.food.text:SetTextColor(1,1,1) if val1 == 0 then val1 = nil end line.food.text:SetText(val1 or "") line.food.tooltip = i buffCount = buffCount + 1 elseif module.db.tableFlask[spellId] then local val = module.db.tableFlask[spellId] local frame = line["flask"..(flaskCount == 1 and "" or tostring(flaskCount))] line.flask:Point("CENTER",line.flaskpointer,"CENTER",-(line.flask.size or 18)*((flaskCount-1)/2),0) flaskCount = flaskCount + 1 if flaskCount > 4 then flaskCount = 4 end frame.texture:SetTexture(icon) if type(val)=='number' then if (UnitLevel'player' >= 60 and val >= 38) or (val >= 14) then frame.text:SetTextColor(0,1,0) else frame.text:SetTextColor(1,1,0) end frame.text:SetText(val) else frame.text:SetText("") end frame.tooltip = i if expirationTime and expirationTime - currTime2 < 600 and expirationTime ~= 0 then frame.subIcon:Show() frame.texture:SetAlpha(.6) end frame:Show() buffCount = buffCount + 1 elseif module.db.tableScrolls[spellId] and ExRT.isBC then local val = module.db.tableScrolls[spellId] local frame = line["scrolls"..(scrollCount == 1 and "" or tostring(scrollCount))] line.scrolls:Point("CENTER",line.scrollspointer,"CENTER",-(line.scrolls.size or 18)*((scrollCount-1)/2),0) scrollCount = scrollCount + 1 if scrollCount > 4 then scrollCount = 4 end frame.texture:SetTexture(icon) if type(val)=='number' then if (UnitLevel'player' >= 60 and val >= 38) or (val >= 14) then frame.text:SetTextColor(0,1,0) else frame.text:SetTextColor(1,1,0) end frame.text:SetText(val) else frame.text:SetText("") end frame.tooltip = i if expirationTime and expirationTime - currTime2 < 180 and expirationTime ~= 0 then frame.subIcon:Show() frame.texture:SetAlpha(.6) end frame:Show() buffCount = buffCount + 1 elseif module.db.tableVantus[spellId] then local val = module.db.tableVantus[spellId] line.vantus.texture:SetTexture(icon) line.vantus.text:SetTextColor(1,1,1) line.vantus.text:SetText(val) line.vantus.tooltip = i elseif name and not ExRT.isClassic and vruneName and name:find(vruneName) then line.vantus.texture:SetTexture(icon) line.vantus.text:SetText("") line.vantus.tooltip = i elseif module.db.tableRunes[spellId] and line.rune then local val = module.db.tableRunes[spellId] line.rune.texture:SetTexture((spellId == 270058 or spellId == 317065) and 840006 or (spellId == 347901 and 134078) or icon) if val >= 18 then line.rune.text:SetTextColor(0,1,0) line.rune.text:SetText("") else line.rune.text:SetTextColor(1,0,0) line.rune.text:SetText(val) end elseif module.db.tableInt[spellId] and not ExRT.isClassic then line.int.texture:SetTexture(icon) line.int.text:SetText("") buffCount = buffCount + 1 elseif module.db.tableAP[spellId] and not ExRT.isClassic then line.ap.texture:SetTexture(icon) line.ap.text:SetText("") buffCount = buffCount + 1 elseif module.db.tableStamina[spellId] and not ExRT.isClassic then line.stam.texture:SetTexture(icon) line.stam.text:SetText("") buffCount = buffCount + 1 elseif ExRT.isClassic and module.db.tableClassicBuff[spellId] then local data = module.db.tableClassicBuff[spellId] local key = data[1] line[key].texture:SetTexture(icon) local val = data[4][spellId] line[key].text:SetText(val or "") line[key].tooltip = "spell:"..spellId elseif spellId == 20707 and line.ss then line.ss.texture:SetTexture(136210) end end if line.dur and not self.isTest then local durTab, dur = module.db.durability[line.unit_name] if durTab and (durTab.time + (line.rc_status ~= 4 and 60 or 600) > currTime) then dur = durTab.dur end line.dur.bigText:SetText(dur and format("%d",dur).."%" or "-") if dur and dur <= 20 then line.dur.bigText:SetTextColor(1,0,0) elseif dur and dur <= 50 then line.dur.bigText:SetTextColor(1,1,0) else line.dur.bigText:SetTextColor(1,1,1) end end if line.kit and not self.isTest then local durTab, dur = module.db.kit[line.unit_name] if durTab and (durTab.time + (line.rc_status ~= 4 and 60 or 600) > currTime) then dur = durTab.kit end line.kit.bigText:SetText(dur or "-") line.kit.text:SetTextColor(1,1,1) local kNow,kMax = (dur or ""):match("(%d+)/(%d+)") if kNow == "1" then line.kit.bigText:SetText("") line.kit.texture:SetTexture(3528447) line.kit.tooltip = "spell:"..324068 if durTab.types then local itemID = strsplit(":",durTab.types) if itemID and itemID ~= "0" and tonumber(itemID) then local _, _, _, _, icon = GetItemInfoInstant(tonumber(itemID)) if icon then line.kit.texture:SetTexture(icon) end line.kit.tooltip = "item:"..itemID local stats = "" if itemID == "172347" then stats = 32 line.kit.text:SetTextColor(0,1,0) elseif itemID == "172346" then stats = 16 line.kit.text:SetTextColor(1,1,0) elseif itemID == "180709" then stats = 24 line.kit.text:SetTextColor(1,1,0) end line.kit.text:SetText(stats) end end elseif kNow == "0" then line.kit.bigText:SetText("") end if not kNow or not kMax or kNow == kMax then line.kit.bigText:SetTextColor(1,1,1) elseif kNow == "0" then line.kit.bigText:SetTextColor(1,0,0) else line.dur.bigText:SetTextColor(1,1,0) end end if line.oil and not self.isTest then local durTab, oil, oil2 = module.db.oil[line.unit_name] if durTab and (durTab.time + (line.rc_status ~= 4 and 60 or 600) > currTime) then oil = durTab.oil oil2 = module.db.oil2[line.unit_name] end if not oil then line.oil.bigText:SetText("-") elseif oil == "0" then else local texture = select(3,GetSpellInfo(tonumber(oil))) if oil == "320798" then texture = 463543 elseif oil == "321389" then texture = 463544 elseif oil == "322762" then texture = 3528422 elseif oil == "322763" then texture = 3528423 end line.oil.texture:SetTexture(texture) line.oil.tooltip = "spell:"..oil if oil2 then oil2 = oil2.oil if oil2 ~= "0" then local texture = select(3,GetSpellInfo(tonumber(oil2))) if oil2 == "320798" then texture = 463543 elseif oil2 == "321389" then texture = 463544 elseif oil2 == "322762" then texture = 3528422 elseif oil2 == "322763" then texture = 3528423 end line.oil2.texture:SetTexture(texture) line.oil2.tooltip = "spell:"..oil2 line.oil2:Show() local size = (line.oil.size or 18) - 4 line.oil:SetSize(size,size) line.oil2:SetSize(size,size) line.oil:Point("CENTER",line.oilpointer,"CENTER",-size*(1/2),0) end end end end if self.isTest and line.pos <= (ExRT.isClassic and 30 or 15) then self.testData[line.pos] = self.testData[line.pos] or {} local hideOne = self.testData[line.pos].hideOne or math.random(1,#RCW_iconsList) self.testData[line.pos].hideOne = hideOne for i,key in pairs(RCW_iconsList) do if line.pos <= 5 or i ~= hideOne then line[key].texture:SetTexture(RCW_iconsListDebugIcons[i]) line[key].text:SetText("") end end if ExRT.isClassic then local flaskNum = self.testData[line.pos].flaskNum or math.random(0,4) self.testData[line.pos].flaskNum = flaskNum line.flask:Point("CENTER",line.flaskpointer,"CENTER",-(line.flask.size or 18)*((flaskNum-1)/2),0) if flaskNum >= 1 then line.flask.texture:SetTexture(RCW_iconsListDebugIcons[2]) else line.flask.texture:SetTexture("") end if flaskNum >= 2 then line.flask2.texture:SetTexture(RCW_iconsListDebugIcons[2]) line.flask2:Show() end if flaskNum >= 3 then line.flask3.texture:SetTexture(RCW_iconsListDebugIcons[2]) line.flask3:Show() end if flaskNum >= 4 then line.flask4.texture:SetTexture(RCW_iconsListDebugIcons[2]) line.flask4:Show() end if ExRT.isBC then local scrollNum = self.testData[line.pos].scrollNum or math.random(0,4) self.testData[line.pos].scrollNum = scrollNum line.scrolls:Point("CENTER",line.scrollspointer,"CENTER",-(line.scrolls.size or 18)*((scrollNum-1)/2),0) if scrollNum >= 1 then line.scrolls.texture:SetTexture(RCW_iconsListDebugIcons[3]) else line.scrolls.texture:SetTexture("") end if scrollNum >= 2 then line.scrolls2.texture:SetTexture(RCW_iconsListDebugIcons[3]) line.scrolls2:Show() end if scrollNum >= 3 then line.scrolls3.texture:SetTexture(RCW_iconsListDebugIcons[3]) line.scrolls3:Show() end if scrollNum >= 4 then line.scrolls4.texture:SetTexture(RCW_iconsListDebugIcons[3]) line.scrolls4:Show() end end end local lowFlask = self.testData[line.pos].lowFlask or math.random(1,60) self.testData[line.pos].lowFlask = lowFlask if lowFlask <= 10 and line.flask.texture:GetTexture() then line.flask.subIcon:Show() line.flask.texture:SetAlpha(.6) end if line.dur then line.dur.texture:SetTexture("") local dur = self.testData[line.pos].dur or math.random(1,10000) / 100 self.testData[line.pos].dur = dur line.dur.bigText:SetText(dur and format("%d",dur).."%" or "-") if dur and dur <= 20 then line.dur.bigText:SetTextColor(1,0,0) elseif dur and dur <= 50 then line.dur.bigText:SetTextColor(1,1,0) else line.dur.bigText:SetTextColor(1,1,1) end end buffCount = self.testData[line.pos].buffCount or math.random(4,5) self.testData[line.pos].buffCount = buffCount end if line.rc_status == 3 then line.name:SetTextColor(1,.5,.5) line.name:SetAlpha(1) elseif line.rc_status == 2 and (buffCount >= 5 or ExRT.isClassic) then line.name:SetTextColor(1,1,1) line.name:SetAlpha(.3) elseif line.rc_status == 2 then line.name:SetTextColor(1,1,.5) line.name:SetAlpha(1) else line.name:SetTextColor(1,1,1) line.name:SetAlpha(1) end if line.rc_status == 3 then line.mini.name:SetTextColor(1,.5,.5) line.mini.name:SetAlpha(1) elseif line.rc_status == 2 then line.mini.name:SetTextColor(1,1,1) line.mini.name:SetAlpha(.3) else line.mini.name:SetTextColor(1,1,1) line.mini.name:SetAlpha(1) end end end end if total == totalResponced then self:PrepToHide() end self.timeLeftLine:SetProgress(total,totalResponced) end module.frame:SetScript("OnEvent",function(self,event,unit) --This can stop updating after UI hiding (Alt+Z) if not self:IsVisible() then self:UnregisterAllEvents() return end if unit and RCW_UnitToLine[unit] then module.frame:UpdateData(RCW_UnitToLine[unit]) end end) function module:ReadyCheckWindow(starter,isTest,manual) self.frame:Create() module.db.RaidCheckReadyCheckTime = nil local colsAdd = 0 if VMRT.RaidCheck.ReadyCheckSoulstone then colsAdd = bit.bor(colsAdd,0x1) end if (self.frame.colsAdd or 0) ~= colsAdd then self.frame.colsAdd = colsAdd self.frame:UpdateCols() end self.frame.isManual = manual self.frame.isTest = isTest if not self.frame.testData then self.frame.testData = {} else wipe(self.frame.testData) end self.frame:UpdateRoster() if manual then for i=1,#self.frame.lines do self.frame.lines[i].rc_status = 4 end if UnitLevel'player' >= 50 and not ExRT.isClassic then ExRT.F.SendExMsg("raidcheckreq","REQ\t1") end end self.frame:UpdateData() self.frame.headText:SetText("MRT") self.frame.timeLeftLine:Hide() self.frame.mimimize:Hide() self.frame:SetMaximized() if self.frame.hideTimer then self.frame.hideTimer:Cancel() end self.frame.anim:Stop() self.frame:SetAlpha(1) self.frame:Show() self.frame:RegisterEvent("UNIT_AURA") end function module.main:ADDON_LOADED() VMRT = _G.VMRT VMRT.RaidCheck = VMRT.RaidCheck or { ReadyCheckFrame = true, ReadyCheckFrameOnlyRL = true, } VMRT.RaidCheck.FlaskExp = VMRT.RaidCheck.FlaskExp or 1 if VMRT.Addon.Version < 3930 then VMRT.RaidCheck.BuffsCheck = true end if VMRT.Addon.Version < 4080 then if not VMRT.RaidCheck.ReadyCheckFrame then VMRT.RaidCheck.ReadyCheckFrame = true VMRT.RaidCheck.ReadyCheckFrameOnlyRL = true end end if VMRT.RaidCheck.ReadyCheckLeft and VMRT.RaidCheck.ReadyCheckTop then module.frame:ClearAllPoints() module.frame:SetPoint("TOPLEFT",UIParent,"BOTTOMLEFT",VMRT.RaidCheck.ReadyCheckLeft,VMRT.RaidCheck.ReadyCheckTop) end if VMRT.RaidCheck.ReadyCheckFrameScale then module.frame:SetScale(VMRT.RaidCheck.ReadyCheckFrameScale/100) end VMRT.RaidCheck.ReadyCheckFrameTimerFade = VMRT.RaidCheck.ReadyCheckFrameTimerFade or 4 module.db.tableFoodInProgress = GetSpellInfo(104934) if VMRT.RaidCheck.ReadyCheckFrame then module:RegisterEvents('READY_CHECK_FINISHED','READY_CHECK_CONFIRM') end if VMRT.RaidCheck.PotionCheck then module:RegisterEvents('ENCOUNTER_START','ENCOUNTER_END') end if not VMRT.RaidCheck.WeaponEnch then VMRT.RaidCheck.WeaponEnch = {} end module:RegisterEvents('READY_CHECK') module:RegisterSlash() module:RegisterAddonMessage() if module.consumables and not VMRT.RaidCheck.DisableConsumables then module.consumables:Enable() end end local function SendDataToChat() if IsSendFoodByMe then GetFood(2) end if IsSendFlaskByMe then GetFlask(2) end if IsSendRunesByMe then GetRunes(2) end if IsSendBuffsByMe then GetRaidBuffs(2) end if IsSendKitsByMe then GetKits(2) end if IsSendOilsByMe then GetOils(2) end IsSendFoodByMe = nil IsSendFlaskByMe = nil IsSendRunesByMe = nil IsSendBuffsByMe = nil IsSendKitsByMe = nil IsSendOilsByMe = nil end local function PrepareDataToChat(toSelf) if toSelf then GetFood(3) GetFlask(3) if VMRT.RaidCheck.RunesCheck then GetRunes(3) end if VMRT.RaidCheck.BuffsCheck then GetRaidBuffs(3) end C_Timer.After(1,function() if VMRT.RaidCheck.KitsCheck then GetKits(3) end if VMRT.RaidCheck.OilsCheck then GetOils(3) end end) else if VMRT.RaidCheck.disableLFR then local _,_,difficulty = GetInstanceInfo() if difficulty == 7 or difficulty == 17 then return end end IsSendFoodByMe = true ExRT.F.ScheduleTimer(ExRT.F.SendExMsg, 0.1, "raidcheck","FOOD\t"..ExRT.V) IsSendFlaskByMe = true ExRT.F.ScheduleTimer(ExRT.F.SendExMsg, 0.1, "raidcheck","FLASK\t"..ExRT.V) IsSendRunesByMe = nil if VMRT.RaidCheck.RunesCheck then IsSendRunesByMe = true ExRT.F.ScheduleTimer(ExRT.F.SendExMsg, 0.1, "raidcheck","RUNES\t"..ExRT.V) end IsSendBuffsByMe = nil if VMRT.RaidCheck.BuffsCheck then IsSendBuffsByMe = true ExRT.F.ScheduleTimer(ExRT.F.SendExMsg, 0.1, "raidcheck","BUFFS\t"..ExRT.V) end IsSendKitsByMe = nil if VMRT.RaidCheck.KitsCheck then IsSendKitsByMe = true ExRT.F.ScheduleTimer(ExRT.F.SendExMsg, 0.1, "raidcheck","REPORT_KITS\t"..ExRT.V) end IsSendOilsByMe = nil if VMRT.RaidCheck.OilsCheck then IsSendOilsByMe = true ExRT.F.ScheduleTimer(ExRT.F.SendExMsg, 0.1, "raidcheck","REPORT_OILS\t"..ExRT.V) end ExRT.F.ScheduleTimer(SendDataToChat, 1) end end function module:SendConsumeData() local oilMH, oilOH = module:OilCheck() local kitNow, kitMax, kitTimeLeft, kitType = module:KitCheck() ExRT.F.SendExMsg("raidcheck","DUR\t"..ExRT.V.."\t"..format("%.2f",module:DurabilityCheck()).. (not ExRT.isClassic and "\tKIT\t"..format("%d/%d",kitNow, kitMax) or "").. (not ExRT.isClassic and "\tOIL\t"..format("%d",oilMH) or "").. (not ExRT.isClassic and "\tOIL2\t"..format("%d",oilOH) or "").. (not ExRT.isClassic and "\tKITT\t"..format("%d",kitType or 0) or "") ) end do local function ScheduledReadyCheckFinish() module.main:READY_CHECK_FINISHED() end function module.main:READY_CHECK(starter,timer,isTest) if not (isTest == "TEST") then isTest = nil end if VMRT.RaidCheck.ReadyCheck and not isTest and not ExRT.isClassic then PrepareDataToChat(VMRT.RaidCheck.SendSelf) end if (VMRT.RaidCheck.ReadyCheckFrame and (not VMRT.RaidCheck.ReadyCheckFrameOnlyRL or ExRT.F.IsPlayerRLorOfficer("player"))) or isTest then ExRT.F.CancelTimer(module.db.RaidCheckReadyCheckHideSchedule) module.db.RaidCheckReadyCheckHideSchedule = ExRT.F.ScheduleTimer(ScheduledReadyCheckFinish, timer or 35) module:ReadyCheckWindow(starter,isTest) module.db.RaidCheckReadyCheckTime = GetTime() + (timer or 35) module.frame.timeLeftLine:Start(timer or 35) module.frame.mimimize:Show() module.frame:SetMinimizedFromOptions() module.main:READY_CHECK_CONFIRM(ExRT.F.delUnitNameServer(starter),true,isTest) end if not isTest then module:SendConsumeData() end end end function module.main:READY_CHECK_FINISHED() module.frame:PrepToHide() end function module.main:READY_CHECK_CONFIRM(unit,response,isTest) if not (isTest == "TEST") then unit = UnitName(unit) isTest = nil end if unit and RCW_UnitToLine[unit] then local line = RCW_UnitToLine[unit] line.rc_status = response == true and 2 or 3 module.frame:UpdateData(line) end end do local _db = module.db function module.main.COMBAT_LOG_EVENT_UNFILTERED(_,event,_,_,sourceName,_,_,_,_,_,_,spellId) if event == "SPELL_CAST_SUCCESS" and sourceName then if _db.hsSpells[spellId] then _db.hsList[sourceName] = _db.hsList[sourceName] and _db.hsList[sourceName] + 1 or 1 elseif _db.tablePotion[spellId] then _db.potionList[sourceName] = _db.potionList[sourceName] and _db.potionList[sourceName] + 1 or 1 end end end end module.db.prevReqAntispam = 0 function module:addonMessage(sender, prefix, type, ver, ...) if prefix == "raidcheck" then if sender then ver = max(tonumber(ver or "0") or 0,3910) --set min ver to 3910 if type == "DUR" then local val = ... val = tonumber(val or "100") or 100 module.db.durability[sender] = { time = time(), dur = val, } local shortName = ExRT.F.delUnitNameServer(sender) module.db.durability[shortName] = module.db.durability[sender] for i=2, select('#', ...), 2 do local key,val = select(i, ...) if key == "KIT" then module.db.kit[sender] = { time = time(), kit = val, } module.db.kit[shortName] = module.db.kit[sender] elseif key == "KITT" then local data = module.db.kit[sender] if data then data.types = val end elseif key == "OIL" then module.db.oil[sender] = { time = time(), oil = val, } module.db.oil[shortName] = module.db.oil[sender] elseif key == "OIL2" then module.db.oil2[sender] = { time = time(), oil = val, } module.db.oil2[shortName] = module.db.oil2[sender] end end local line = RCW_UnitToLine[shortName] if line then module.frame:UpdateData(line) end end if ver > ExRT.V then if type == "FOOD" then IsSendFoodByMe = nil elseif type == "FLASK" then IsSendFlaskByMe = nil elseif type == "RUNES" then IsSendRunesByMe = nil elseif type == "BUFFS" then IsSendBuffsByMe = nil elseif type == "REPORT_KITS" then IsSendKitsByMe = nil elseif type == "REPORT_OILS" then IsSendOilsByMe = nil end return end if ExRT.F.IsPlayerRLorOfficer(ExRT.SDB.charName) == 2 then return end if (sender < ExRT.SDB.charName or ExRT.F.IsPlayerRLorOfficer(sender) == 2) and ver >= ExRT.V then if type == "FOOD" then IsSendFoodByMe = nil elseif type == "FLASK" then IsSendFlaskByMe = nil elseif type == "RUNES" then IsSendRunesByMe = nil elseif type == "BUFFS" then IsSendBuffsByMe = nil elseif type == "REPORT_KITS" then IsSendKitsByMe = nil elseif type == "REPORT_OILS" then IsSendOilsByMe = nil end end end elseif prefix == "raidcheckreq" then if type == "REQ" then if ver == "1" then local currTime = GetTime() if currTime - module.db.prevReqAntispam < 300 then return end module.db.prevReqAntispam = currTime module:SendConsumeData() end end end end local addonMsgFrame = CreateFrame'Frame' local addonMsgAttack_AntiSpam = 0 addonMsgFrame:SetScript("OnEvent",function (self, event, ...) local prefix, message, channel, sender = ... if message and ((prefix == "BigWigs" and message:find("^T:BWPull")) or (prefix == "D4" and message:find("^PT"))) then if VMRT.RaidCheck.OnAttack and not ExRT.isClassic then local _time = GetTime() if (_time - addonMsgAttack_AntiSpam) < 2 then return end addonMsgAttack_AntiSpam = _time PrepareDataToChat(VMRT.RaidCheck.SendSelf) end end end) addonMsgFrame:RegisterEvent("CHAT_MSG_ADDON") if (not ExRT.isClassic) and UnitLevel'player' >= 60 then local consumables_size = 44 local lastWeaponEnchantItem module.consumables = CreateFrame("Frame","MRTConsumables",ReadyCheckListenerFrame) module.consumables:SetPoint("BOTTOM",ReadyCheckListenerFrame,"TOP",0,5) module.consumables:SetSize(consumables_size*5,consumables_size) module.consumables:Hide() module.consumables.buttons = {} local function ButtonOnEnter(self) self:GetParent():SetAlpha(.7) end local function ButtonOnLeave(self) self:GetParent():SetAlpha(1) end module.consumables.state = CreateFrame('Frame', nil, nil, 'SecureHandlerStateTemplate') module.consumables.state:SetAttribute('_onstate-combat', [=[ for i=1,7 do if i == 2 or i == 3 or i == 4 or i == 5 or i == 7 then if self:GetFrameRef("Button"..i) then if newstate == 'hide' then self:GetFrameRef("Button"..i):Hide() elseif newstate == 'show' then if self:GetFrameRef("Button"..i).IsON then self:GetFrameRef("Button"..i):Show() end end end end end ]=]) RegisterStateDriver(module.consumables.state, 'combat', '[combat] hide; [nocombat] show') for i=1,7 do local button = CreateFrame("Frame",nil,module.consumables) module.consumables.buttons[i] = button button:SetSize(consumables_size,consumables_size) if i == 1 then button:SetPoint("LEFT",0,0) else button:SetPoint("LEFT",module.consumables.buttons[i-1],"RIGHT",0,0) end button.texture = button:CreateTexture() button.texture:SetAllPoints() button.statustexture = button:CreateTexture(nil,"OVERLAY") button.statustexture:SetPoint("CENTER") button.statustexture:SetSize(consumables_size/2,consumables_size/2) button.timeleft = button:CreateFontString(nil,"ARTWORK","GameFontWhite") button.timeleft:SetPoint("BOTTOM",button,"TOP",0,1) button.timeleft:SetFont(button.timeleft:GetFont(),8,"OUTLINE") --button.timeleft:SetTextColor(0,1,0,1) button.count = button:CreateFontString(nil,"ARTWORK","GameFontWhite") button.count:SetPoint("BOTTOMRIGHT",button,"BOTTOMRIGHT",-1,1) button.count:SetFont(button.timeleft:GetFont(),10,"OUTLINE") --button.count:SetTextColor(0,1,0,1) if i == 2 or i == 3 or i == 4 or i == 5 or i == 7 then button.click = CreateFrame("Button",nil,button,"SecureActionButtonTemplate") button.click:SetAllPoints() button.click:Hide() button.click:RegisterForClicks("AnyDown") if i == 4 or i == 7 then button.click:SetAttribute("type", "item") button.click:SetAttribute("target-slot", i == 4 and "16" or "17") else button.click:SetAttribute("type", "macro") end button.click:SetScript("OnEnter",ButtonOnEnter) button.click:SetScript("OnLeave",ButtonOnLeave) module.consumables.state:SetFrameRef("Button"..i, button.click) end if i == 1 then button.texture:SetTexture(136000) module.consumables.buttons.food = button elseif i == 2 then button.texture:SetTexture(3566840) module.consumables.buttons.flask = button elseif i == 3 then button.texture:SetTexture(3528447) module.consumables.buttons.kit = button elseif i == 4 then button.texture:SetTexture(463543) module.consumables.buttons.oil = button elseif i == 5 then button.texture:SetTexture(134078) module.consumables.buttons.rune = button elseif i == 6 then button.texture:SetTexture(538745) module.consumables.buttons.hs = button elseif i == 7 then button.texture:SetTexture(463543) module.consumables.buttons.oiloh = button button:Hide() end end function module.consumables:Enable() self:RegisterEvent("READY_CHECK","READY_CHECK_FINISHED") self:Show() end function module.consumables:Disable() self:UnregisterAllEvents() self:Hide() end local isElvUIFix function module.consumables:Update() if IsAddOnLoaded("ElvUI") and not isElvUIFix then self:SetParent(ReadyCheckFrame) self:ClearAllPoints() self:SetPoint("BOTTOM",ReadyCheckFrame,"TOP",0,5) isElvUIFix = true end local isWarlockInRaid for _, name, _, class in ExRT.F.IterateRoster, ExRT.F.GetRaidDiffMaxGroup() do if class == "WARLOCK" then isWarlockInRaid = true break end end local totalButtons = 6 if isWarlockInRaid then self.buttons.hs:Show() else self.buttons.hs:Hide() totalButtons = totalButtons - 1 end for i=1,#self.buttons do self.buttons[i].statustexture:SetTexture("Interface\\RaidFrame\\ReadyCheck-NotReady") self.buttons[i].timeleft:SetText("") self.buttons[i].count:SetText("") self.buttons[i].texture:SetDesaturated(true) end local LCG = LibStub("LibCustomGlow-1.0",true) local now = GetTime() local isFood, isRune, isFlask for i=1,60 do local name,icon,count,dispelType,duration,expires,caster,isStealable,_,spellId = UnitAura("player", i, "HELPFUL") if not spellId then break elseif module.db.tableFood[spellId] then self.buttons.food.statustexture:SetTexture("Interface\\RaidFrame\\ReadyCheck-Ready") self.buttons.food.texture:SetDesaturated(false) self.buttons.food.timeleft:SetFormattedText(GARRISON_DURATION_MINUTES,ceil((expires-now)/60)) isFood = true elseif icon == 136000 and not isFood then self.buttons.food.statustexture:SetTexture("Interface\\RaidFrame\\ReadyCheck-Ready") self.buttons.food.texture:SetDesaturated(false) self.buttons.food.timeleft:SetFormattedText(GARRISON_DURATION_MINUTES,ceil((expires-now)/60)) elseif module.db.tableFlask[spellId] then self.buttons.flask.statustexture:SetTexture("Interface\\RaidFrame\\ReadyCheck-Ready") self.buttons.flask.texture:SetDesaturated(false) self.buttons.flask.timeleft:SetFormattedText(GARRISON_DURATION_MINUTES,ceil((expires-now)/60)) isFlask = true if expires - now <= 600 then isFlask = false end elseif module.db.tableRunes[spellId] then self.buttons.rune.statustexture:SetTexture("Interface\\RaidFrame\\ReadyCheck-Ready") self.buttons.rune.texture:SetDesaturated(false) self.buttons.rune.timeleft:SetFormattedText(GARRISON_DURATION_MINUTES,ceil((expires-now)/60)) isRune = true end end local hsCount = GetItemCount(5512,false,true) if hsCount and hsCount > 0 then self.buttons.hs.count:SetFormattedText("%d",hsCount) self.buttons.hs.statustexture:SetTexture("Interface\\RaidFrame\\ReadyCheck-Ready") self.buttons.hs.texture:SetDesaturated(false) else self.buttons.hs.count:SetText("0") end local flaskCount = GetItemCount(171276,false,false) local flaskCanCount = GetItemCount(171280,false,false) if not isFlask and ((flaskCount and flaskCount > 0 and not VMRT.RaidCheck.DisableNotCauldronFlask) or (flaskCanCount and flaskCanCount > 0)) then if not InCombatLockdown() then local itemID = (flaskCanCount and flaskCanCount > 0) and 171280 or 171276 local itemName = GetItemInfo(itemID) if itemName then self.buttons.flask.click:SetAttribute("macrotext1", format("/stopmacro [combat]\n/use %s", itemName)) self.buttons.flask.click:Show() self.buttons.flask.click.IsON = true else self.buttons.flask.click:Hide() self.buttons.flask.click.IsON = false end end else if not InCombatLockdown() then self.buttons.flask.click:Hide() self.buttons.flask.click.IsON = false end end self.buttons.flask.count:SetFormattedText("%d%s",flaskCount,flaskCanCount > 0 and "+|cff00ff00"..flaskCanCount or "") if LCG then if not isFlask and ((flaskCount and flaskCount > 0 and not VMRT.RaidCheck.DisableNotCauldronFlask) or (flaskCanCount and flaskCanCount > 0)) then LCG.PixelGlow_Start(self.buttons.flask) else LCG.PixelGlow_Stop(self.buttons.flask) end end local kitCount = GetItemCount(172347,false,true) local kitNow, kitMax, kitTimeLeft = module:KitCheck() if kitNow > 0 then self.buttons.kit.statustexture:SetTexture("Interface\\RaidFrame\\ReadyCheck-Ready") self.buttons.kit.texture:SetDesaturated(false) if kitTimeLeft then self.buttons.kit.timeleft:SetText(kitTimeLeft) end end if kitCount and kitCount > 0 then if not InCombatLockdown() then local itemName = GetItemInfo(172347) if itemName then self.buttons.kit.click:SetAttribute("macrotext1", format("/stopmacro [combat]\n/use %s\n/use 5", itemName)) self.buttons.kit.click:Show() self.buttons.kit.click.IsON = true else self.buttons.kit.click:Hide() self.buttons.kit.click.IsON = false end end else if not InCombatLockdown() then self.buttons.kit.click:Hide() self.buttons.kit.click.IsON = false end end self.buttons.kit.count:SetFormattedText("%d",kitCount) if LCG then if kitCount and kitCount > 0 and kitNow == 0 then LCG.PixelGlow_Start(self.buttons.kit) else LCG.PixelGlow_Stop(self.buttons.kit) end end lastWeaponEnchantItem = lastWeaponEnchantItem or VMRT.RaidCheck.WeaponEnch[ExRT.SDB.charKey] local offhandCanBeEnchanted local offhandItemID = GetInventoryItemID("player", 17) if offhandItemID then local _, _, _, _, _, itemClassID, itemSubClassID = GetItemInfoInstant(offhandItemID) if itemClassID == 2 then offhandCanBeEnchanted = true end end if not InCombatLockdown() then if offhandCanBeEnchanted then self.buttons.oiloh:Show() totalButtons = totalButtons + 1 self.buttons.oiloh:ClearAllPoints() self.buttons.oiloh:SetPoint("LEFT",self.buttons.oil,"RIGHT",0,0) self.buttons.rune:ClearAllPoints() self.buttons.rune:SetPoint("LEFT",self.buttons.oiloh,"RIGHT",0,0) else self.buttons.oiloh:Hide() self.buttons.rune:ClearAllPoints() self.buttons.rune:SetPoint("LEFT",self.buttons.oil,"RIGHT",0,0) end end local hasMainHandEnchant, mainHandExpiration, mainHandCharges, mainHandEnchantID, hasOffHandEnchant, offHandExpiration, offHandCharges, offHandEnchantID = GetWeaponEnchantInfo() if hasMainHandEnchant then self.buttons.oil.statustexture:SetTexture("Interface\\RaidFrame\\ReadyCheck-Ready") self.buttons.oil.texture:SetDesaturated(false) self.buttons.oil.timeleft:SetFormattedText(GARRISON_DURATION_MINUTES,ceil((mainHandExpiration or 0)/1000/60)) if mainHandEnchantID == 6190 then lastWeaponEnchantItem = 171286 elseif mainHandEnchantID == 6188 then lastWeaponEnchantItem = 171285 elseif mainHandEnchantID == 6200 then lastWeaponEnchantItem = 171437 elseif mainHandEnchantID == 6198 then lastWeaponEnchantItem = 171436 elseif mainHandEnchantID == 6201 then lastWeaponEnchantItem = 171439 elseif mainHandEnchantID == 6199 then lastWeaponEnchantItem = 171438 end end if offhandCanBeEnchanted and hasOffHandEnchant then self.buttons.oiloh.statustexture:SetTexture("Interface\\RaidFrame\\ReadyCheck-Ready") self.buttons.oiloh.texture:SetDesaturated(false) self.buttons.oiloh.timeleft:SetFormattedText(GARRISON_DURATION_MINUTES,ceil((offHandExpiration or 0)/1000/60)) end if lastWeaponEnchantItem == 171286 then self.buttons.oil.texture:SetTexture(463544) self.buttons.oiloh.texture:SetTexture(463544) elseif lastWeaponEnchantItem == 171285 then self.buttons.oil.texture:SetTexture(463543) self.buttons.oiloh.texture:SetTexture(463543) elseif lastWeaponEnchantItem == 171437 then self.buttons.oil.texture:SetTexture(3528422) self.buttons.oiloh.texture:SetTexture(3528422) elseif lastWeaponEnchantItem == 171436 then self.buttons.oil.texture:SetTexture(3528424) self.buttons.oiloh.texture:SetTexture(3528424) elseif lastWeaponEnchantItem == 171439 then self.buttons.oil.texture:SetTexture(3528423) self.buttons.oiloh.texture:SetTexture(3528423) elseif lastWeaponEnchantItem == 171438 then self.buttons.oil.texture:SetTexture(3528425) self.buttons.oiloh.texture:SetTexture(3528425) end VMRT.RaidCheck.WeaponEnch[ExRT.SDB.charKey] = lastWeaponEnchantItem if lastWeaponEnchantItem then local oilCount = GetItemCount(lastWeaponEnchantItem,false,true) self.buttons.oil.count:SetText(oilCount) self.buttons.oiloh.count:SetText(oilCount) if oilCount and oilCount > 0 then if not InCombatLockdown() then local itemName = GetItemInfo(lastWeaponEnchantItem) if itemName then self.buttons.oil.click:SetAttribute("item", itemName) self.buttons.oil.click:Show() self.buttons.oil.click.IsON = true if mainHandExpiration and (lastWeaponEnchantItem == 171285 or lastWeaponEnchantItem == 171286) and offhandItemID and not offhandCanBeEnchanted then self.buttons.oil.click:SetAttribute("type", "cancelaura") else self.buttons.oil.click:SetAttribute("type", "item") end self.buttons.oiloh.click:SetAttribute("item", itemName) self.buttons.oiloh.click:Show() self.buttons.oiloh.click.IsON = true else self.buttons.oil.click:Hide() self.buttons.oil.click.IsON = false self.buttons.oiloh.click:Hide() self.buttons.oiloh.click.IsON = false end end else if not InCombatLockdown() then self.buttons.oil.click:Hide() self.buttons.oil.click.IsON = false self.buttons.oiloh.click:Hide() self.buttons.oiloh.click.IsON = false end end if LCG then if oilCount and oilCount > 0 and (not hasMainHandEnchant or (mainHandExpiration and mainHandExpiration <= 300000)) then LCG.PixelGlow_Start(self.buttons.oil) else LCG.PixelGlow_Stop(self.buttons.oil) end if oilCount and oilCount > 0 and (not hasOffHandEnchant or (offHandExpiration and offHandExpiration <= 300000)) then LCG.PixelGlow_Start(self.buttons.oiloh) else LCG.PixelGlow_Stop(self.buttons.oiloh) end end end local runeCount = GetItemCount(181468,false,true) if runeCount and runeCount > 0 then self.buttons.rune.count:SetFormattedText("%d",runeCount) if not InCombatLockdown() then local itemName = GetItemInfo(181468) if itemName then self.buttons.rune.click:SetAttribute("macrotext1", format("/stopmacro [combat]\n/use %s", itemName)) self.buttons.rune.click:Show() self.buttons.rune.click.IsON = true else self.buttons.rune.click:Hide() self.buttons.rune.click.IsON = false end end else self.buttons.rune.count:SetText("0") if not InCombatLockdown() then self.buttons.rune.click:Hide() self.buttons.rune.click.IsON = false end end if LCG then if runeCount and runeCount > 0 and not isRune then LCG.PixelGlow_Start(self.buttons.rune) else LCG.PixelGlow_Stop(self.buttons.rune) end end if not InCombatLockdown() then self:SetWidth(consumables_size*totalButtons) end end function module.consumables:OnHide() self:UnregisterEvent("UNIT_AURA") self:UnregisterEvent("UNIT_INVENTORY_CHANGED") if self.cancelDelay then self.cancelDelay:Cancel() self.cancelDelay = nil end end module.consumables:SetScript("OnEvent",function(self,event,arg1,arg2) if event == "READY_CHECK" then self:Update() self:RegisterEvent("UNIT_AURA") self:RegisterEvent("UNIT_INVENTORY_CHANGED") if self.cancelDelay then self.cancelDelay:Cancel() end self.cancelDelay = C_Timer.NewTimer(arg2 or 40,function() self:UnregisterEvent("UNIT_AURA") self:UnregisterEvent("UNIT_INVENTORY_CHANGED") end) elseif event == "READY_CHECK_FINISHED" then module.consumables:OnHide() elseif event == "UNIT_AURA" then if arg1 == "player" then self:Update() end elseif event == "UNIT_INVENTORY_CHANGED" then if arg1 == "player" then C_Timer.After(.2,function() self:Update() end) end end end) module.consumables:SetScript("OnHide",function(self) module.consumables:OnHide() end) module.consumables.Test = function() module.consumables:SetParent(UIParent) module.consumables:ClearAllPoints() module.consumables:SetPoint("CENTER") module.consumables:GetScript("OnEvent")(module.consumables,"READY_CHECK") end --/run GMRT.A.RaidCheck.consumables.Test() end