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, --wotlk [57367]=true, [57327]=true, [57294]=true, [57360]=true, [57291]=true, [57327]=true, [57332]=true, [57356]=true, [57325]=true, [57358]=true, [57325]=true, [57365]=true, [57329]=true, [57332]=true, [57329]=true, [57334]=true, [57371]=true, [57360]=true, [57079]=true, [57097]=true, [57334]=true, [57139]=true, [57286]=true, [57100]=true, [57102]=true, [57288]=true, [53284]=true, [57111]=true, [57286]=true, [57107]=true, [57288]=true, } module.db.StaminaFood = {[201638]=true,[259457]=true,[288075]=true,[288074]=true,[297119]=true,[297040]=true,} module.db.tableFood_headers = ExRT.isClassic and {0,375} or {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, --wotlk [53760]=true, [53755]=true, [67019]=true, [53758]=true, [54212]=true, [62380]=true, [53752]=true, [53760]=true, [53755]=true, [53758]=true, [54212]=true, [28497]=true, [33721]=true, [60347]=true, [53749]=true, [60346]=true, [53746]=true, [60345]=true, [53764]=true, [53748]=true, [60344]=true, [60341]=true, [53763]=true, [53751]=true, [60340]=true, [53747]=true, [60343]=true, [63729]=true, } module.db.tableFlask_headers = ExRT.isClassic and {0,1} or {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 [370607]=true, [371028]=true, [371024]=true, [371033]=true, [371134]=true, [371152]=true, [371039]=true, [371167]=true, } module.db.hsSpells = { [6262] = true, [105708] = true, [156438] = true, [188016] = true, --[188018] = true, [250870] = true, [301308] = true, [307192] = true, [370511] = 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}, {STAT_VERSATILITY or "Vers","DRUID",1126}, {TUTORIAL_TITLE2 or "Movement","EVOKER",381748,nil,{[381758]=true,[381732]=true,[381741]=true,[381746]=true,[381748]=true,[381750]=true,[381749]=true,[381751]=true,[381752]=true,[381753]=true,[381754]=true,[381756]=true,[381757]=true,}}, } module.db.tableInt = {[1459]=true,[264760]=7,} module.db.tableStamina = {[21562]=true,[264764]=7,} module.db.tableAP = {[6673]=true,[264761]=7,} module.db.tableVers = {[1126]=true,} module.db.tableMove = {[381758]=true,[381732]=true,[381741]=true,[381746]=true,[381748]=true,[381750]=true,[381749]=true,[381751]=true,[381752]=true,[381753]=true,[381754]=true,[381756]=true,[381757]=true,} 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, --VotI [384233] = 1, [384234] = 2, [384235] = 3, [384229] = 1, [384228] = 2, [384227] = 3, [384192] = 1, [384203] = 2, [384201] = 3, [384239] = 1, [384240] = 2, [384241] = 3, [384245] = 1, [384246] = 2, [384247] = 3, [384220] = 1, [384221] = 2, [384222] = 3, [384210] = 1, [384209] = 2, [384208] = 3, [384214] = 1, [384215] = 2, [384216] = 3, [384154] = 1, [384248] = 2, [384306] = 3, } module.db.minFoodLevelToActual = { [100] = 10, [125] = 14, } module.db.tableScrolls = not ExRT.isClassic and {} or { --tbc [33077]=true, [33082]=true, [33079]=true, [33078]=true, [33080]=true, [33081]=true, [12174]=true, [12179]=true, [12176]=true, [12178]=true, [12177]=true, [12175]=true, --wotlk [58451]=true, [48099]=true, [43194]=true, [48103]=true, [58450]=true, [58448]=true, [69377]=true, [43199]=true, [58449]=true, [48102]=true, [43196]=true, [58453]=true, [58452]=true, [69994]=true, [48100]=true, [43198]=true, [48104]=true, [43195]=true, [48101]=true, [43197]=true, } module.db.tableFoodIsBest = {} 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, --Haste Mastery Crit Versa Int Str Agi Stam Stam Special [382145]=70, [382150]=70, [382146]=70, [382149]=70, [396092]=90, [382246]=70, [382247]=90, --HasteCrit HasteVers VersMastery StamStr StamAgi StamInt HasteMastery CritVers CritMastery [382152]=90, [382153]=90, [382157]=90, [382230]=70, [382231]=70, [382232]=70, [382154]=90, [382155]=90, [382156]=90, [382234]=90, [382235]=90, [382236]=90, } module.db.tableFoodIsBest = { --Haste Mastery Crit Versa Int Str Agi Stam Stam Special [382145]=70, [382150]=70, [382146]=70, [382149]=70, [396092]=90, [382246]=70, [382247]=90, --HasteCrit HasteVers VersMastery StamStr StamAgi StamInt HasteMastery CritVers CritMastery [382152]=90, [382153]=90, [382157]=90, [382230]=70, [382231]=70, [382232]=70, [382154]=90, [382155]=90, [382156]=90, [382234]=90, [382235]=90, [382236]=90, } module.db.tableFood_headers = {0,70,90} module.db.tableFlask = { --Stamina, Main stat, [307187]=70, [307185]=70, [307166]=70, [371339]=70, [374000]=70, [371354]=70, [371204]=70, [370662]=70, [373257]=70, [371386]=70, [370652]=70, [371172]=70, [371186]=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] = 70, [125] = 90, } module.db.tableInt = {[1459]=true,} module.db.tableStamina = {[21562]=true,} module.db.tableAP = {[6673]=true,} end if ExRT.isLK then module.db.classicBuffs = { {"druid","Druid",136078,{[48470]=9,[26991]=8,[21850]=7,[21849]=6,[1126]=1,[5232]=2,[5234]=4,[6756]=3,[8907]=5,[9884]=6,[9885]=7,[26990]=8,[48469]=9,[69381]=9}}, --Gift of the Wild {"int","Int",135932,{[43002]=7,[27126]=6,[10157]=5,[10156]=4,[1461]=3,[1460]=2,[1459]=1,[23028]=5,[27127]=6,[42995]=7,[61316]=3,[61024]=7}}, --Arcane Intellect {"ap","AP",132333,{[6673]=1,[5242]=2,[6192]=3,[11549]=4,[11550]=5,[11551]=6,[25289]=7,[2048]=8,[47436]=9}}, --Battle Shout {"spirit","Spirit",135946,{[27681]=4,[32999]=5,[48074]=6,[14752]=1,[14818]=2,[14819]=3,[27841]=4,[25312]=5,[48073]=6}}, --Prayer of Spirit {"armor","Armor",135926,{[588]=1,[7128]=2,[602]=3,[1006]=4,[10951]=5,[10952]=6,[25431]=7,[48040]=8,[48168]=9}}, --Inner Fire {"shadow","Shadow",136121,{[48170]=5,[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,[48162]=8,[1244]=2,[1245]=3,[2791]=4,[10937]=5,[10938]=6,[25389]=7,[48161]=8}}, --Power Word: Fortitude } elseif 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 } else 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 } end if ExRT.isLK 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,[48931]=9,[48932]=10,[25782]=6,[25916]=7,[27141]=8,[48933]=9,[48934]=10}} --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,[48935]=8,[48936]=9,[25894]=5,[25918]=6,[27143]=7,[48937]=8,[48938]=9}} --Blessing of Wisdom module.db.classicBuffs[#module.db.classicBuffs+1] = {"bok","BoK",135993,{[20217]=1,[25898]=1,[69378]=1}} --Blessing of Kings module.db.classicBuffs[#module.db.classicBuffs+1] = {"bos","BoS",135911,{[25899]=1,[20911]=1}} --Greater Blessing of Sanctuary elseif 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 elseif ExRT.isClassic and UnitFactionGroup("player") == "Alliance" 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 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,[367405]=18,[393438]=87} 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) if ExRT.isClassic then return end 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 ExRT.isClassic then return end 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 if ExRT.isClassic then stats = 375 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]) if ExRT.isClassic then result = format("|cff00ff00%s (%d):|r ",foodType > 0 and L.YesText or L.NoText,#f[foodType]) end 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 if ExRT.isClassic then flaskType = 1 end 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] 0 and L.YesText or L.NoText,#f[ flaskStats ]) end for j=1,#f[ flaskStats ] do result = result .. format("%s%s",f[ flaskStats ][j][1] or "?", j < #f[ flaskStats ] 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 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 classicBuffsList if ExRT.isClassic then buffsList,buffsListLen = module.db.classicBuffs,#module.db.classicBuffs classicBuffsList = {} for k=1,buffsListLen do for s in pairs(buffsList[k][4]) do classicBuffsList[s] = k end end end 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]) or ExRT.isClassic then f[-k] = true end end for i=1,40 do local _,_,_,_,_,_,_,_,_,auraSpellID = UnitAura(name, i,"HELPFUL") if not auraSpellID then break else if ExRT.isClassic then local k = classicBuffsList[auraSpellID] if k then isAnyBuff[k] = true isAnyBuff[buffsListLen + k] = true end else for k=1,buffsListLen do if (auraSpellID == buffsList[k][3]) or (buffsList[k][5] and buffsList[k][5][auraSpellID]) then isAnyBuff[k] = true isAnyBuff[buffsListLen + k] = true elseif auraSpellID == buffsList[k][4] then isAnyBuff[buffsListLen + k] = true end 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 or "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 and not ExRT.isClassic) 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) if ExRT.isClassic then return end 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) if ExRT.isClassic then return end 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 local 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(IsShiftKeyDown() and 3 or nil) 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(IsShiftKeyDown() and 2 or 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(IsShiftKeyDown() and 3 or nil) 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(IsShiftKeyDown() and 2 or 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(IsShiftKeyDown() and 3 or nil) 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(IsShiftKeyDown() and 2 or 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.disableNotInRaid = ELib:Check(self.tab.tabs[1],L.RaidCheckDisableNonRaid,VMRT.RaidCheck.disableNotInRaid):Point("TOPLEFT",self.disableLFR,"TOPLEFT",0,-25):OnClick(function(self) if self:GetChecked() then VMRT.RaidCheck.disableNotInRaid = true else VMRT.RaidCheck.disableNotInRaid = nil end end) self.chkRunes = ELib:Check(self.tab.tabs[1],L.RaidCheckRunesEnable,VMRT.RaidCheck.RunesCheck):Point("TOPLEFT",self.level2optLine,7,-125):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,-270):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,-295):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.sliderFontSize = ELib:Slider(self.tab.tabs[2],""):Size(320):Point(200,-145):Range(10,80):SetTo(VMRT.RaidCheck.ReadyCheckFontSize or 12):OnChange(function(self,event) event = floor(event + .5) VMRT.RaidCheck.ReadyCheckFontSize = event module.frame:UpdateFont() self.tooltipText = event self:tooltipReload(self) end) ELib:Text(self.tab.tabs[2],L.cd2OtherSetFontSize..":",11):Point("RIGHT",self.sliderFontSize,"LEFT",-5,0):Color(1,.82,0,1):Right() local function dropDownFontSetValue(_,arg1) ELib:DropDownClose() VMRT.RaidCheck.ReadyCheckFont = arg1 self.dropDownFont:SetText(arg1 or DEFAULT) module.frame:UpdateFont() end self.dropDownFont = ELib:DropDown(self.tab.tabs[2],350,10):Size(320):Point(200,-175):SetText(VMRT.RaidCheck.ReadyCheckFont or DEFAULT):AddText("|cffffce00"..L.cd2OtherSetFont..":") self.dropDownFont.List[1] = { text = DEFAULT, arg1 = nil, func = dropDownFontSetValue, font = ExRT.F.defFont, justifyH = "CENTER", } for i=1,#ExRT.F.fontList do local info = {} self.dropDownFont.List[i+1] = info info.text = ExRT.F.fontList[i] info.arg1 = ExRT.F.fontList[i] info.func = dropDownFontSetValue info.font = ExRT.F.fontList[i] info.justifyH = "CENTER" end for key,font in ExRT.F.IterateMediaData("font") do local info = {} self.dropDownFont.List[#self.dropDownFont.List+1] = info info.text = key info.arg1 = font info.func = dropDownFontSetValue info.font = font info.justifyH = "CENTER" end --[[ self.fontOutline = ELib:Check(self.tab.tabs[2],L.cd2OtherSetOutline,VMRT.RaidCheck.ReadyCheckFontOutline):Point("LEFT",self.dropDownFont,"RIGHT",5,0):OnClick(function(self) VMRT.RaidCheck.ReadyCheckFontOutline = self:GetChecked() module:UpdateVisual() end) ]] self.chkReadyCheckFrameEditBoxTimer = ELib:Edit(self.tab.tabs[2],6,true):Size(50,20):Point(350,-210):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):LeftText(L.raidcheckReadyCheckTimerTooltip) self.chkReadyCheckFrameClassSort = ELib:Check(self.tab.tabs[2],L.RaidCheckSortByClass,VMRT.RaidCheck.ReadyCheckSortClass):Point(15,-235):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) self.chkReadyCheckConsumablesDisableForRL = ELib:Check(self.tab.tabs[3],L.RaidCheckDisableForRL,VMRT.RaidCheck.ConsDisableForStarter):Point("TOPLEFT",self.chkReadyCheckConsumablesOnlyCuadFlask,"BOTTOMLEFT",0,-5):OnClick(function(self) VMRT.RaidCheck.ConsDisableForStarter = 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() self.runes:Hide() self.runes.txt:Hide() self.runesToChat:Hide() self.runesToChat.txt:Hide() self.vantusrunes:Hide() self.vantusrunes.txt:Hide() self.vantusrunesToChat:Hide() self.vantusrunesToChat.txt:Hide() self.raidbuffs:Point(15,-60) self.level2optLine:SetPoint("TOPLEFT",10,-135+50) self.chkOils:Hide() self.chkKits:Hide() self.chkRunes:Hide() self.disableLFR:Hide() self.disableNotInRaid:Point("TOPLEFT",self.disableLFR,"TOPLEFT",0,0) self.chkBuffs:Point("TOPLEFT",self.chkRunes,0,25) self.minFoodLevelText:Hide() self.minFoodLevelAny:Hide() self.minFoodLevel100:Hide() self.minFoodLevel125:Hide() self.checkLQFlask:Hide() self.chkPotion:Hide() self.potion:Hide() self.potion.txt:Hide() self.potionToChat:Hide() self.potionToChat.txt:Hide() self.hs:Hide() self.hsToChat:Hide() self.minFlaskExpText:Point("TOPLEFT",self.minFoodLevelText,"TOPLEFT",0,50) 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 do local KitSlots = { 5, --INVSLOT_CHEST --7, --INVSLOT_LEGS --10, --INVSLOT_HAND --8, --INVSLOT_FEET } if ExRT.is10 then wipe(KitSlots) end 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+" L_EncName = "%(%+%d+[^%)]+%) ?%(%d+" end function module:KitCheck() local kitNow, kitMax = 0, 1 local kitType = 0 local timeLeft if ExRT.isClassic then return kitNow, kitMax, timeLeft, kitType end 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() local oilMH, oilOH = 0, 0 if ExRT.isClassic then return oilMH, oilOH end if not oilTypes then oilTypes = ExRT.is10 and { } or { {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 for _,itemSlotID in pairs(OilSlots) do local tooltipData = C_TooltipInfo.GetInventoryItem("player", itemSlotID) if tooltipData then TooltipUtil.SurfaceArgs(tooltipData) for _, line in ipairs(tooltipData.lines) do TooltipUtil.SurfaceArgs(line) end for j=2, #tooltipData.lines do local tooltipLine = tooltipData.lines[j] local text = tooltipLine.leftText 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 end 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','vers','stam','move','dur'} local RCW_iconsListHeaders = {L.RaidCheckHeadFood,L.RaidCheckHeadFlask,L.RaidCheckHeadRune,L.RaidCheckHeadVantus,SPELL_STAT4_NAME or "Int",ATTACK_POWER_TOOLTIP or "AP",STAT_VERSATILITY or "Vers",SPELL_STAT3_NAME or "Stamina",TUTORIAL_TITLE2 or "Movement",DURABILITY or "Durability"} local RCW_iconsListDebugIcons = {136000,967549,840006,1058937,135932,132333,136078,135987,4622448,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' == 60 then tinsert(RCW_iconsList,10,'oil') tinsert(RCW_iconsListHeaders,10,WEAPON) tinsert(RCW_iconsListDebugIcons,10,463543) tinsert(RCW_iconsList,10,'kit') tinsert(RCW_iconsListHeaders,10,BONUS_ARMOR) tinsert(RCW_iconsListDebugIcons,10,3528447) RCW_liveToslDiff = 60 end module.frame = ELib:Template("ExRTDialogModernTemplate",UIParent) module.frame:SetSize(430+60+(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() and not self.hoverShow then self.hover:SetAlpha(.15) self.hoverShow = true elseif not self:IsMouseOver() 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)--:Font(VMRT.RaidCheck.ReadyCheckFont or ExRT.F.defFont,(VMRT.RaidCheck.ReadyCheckFontSize or 12)-2) 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+60+(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+60+(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) if ExRT.is10 or ExRT.isLK1 then line.classLeft:SetGradient("VERTICAL",CreateColor(.24,.25,.30,1), CreateColor(.27,.28,.33,1)) else line.classLeft:SetGradientAlpha("VERTICAL",.24,.25,.30,1,.27,.28,.33,1) end 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 self:UpdateFont() end function module.frame:UpdateFont() if not self.isCreated then return end for i=1,40 do local line = self.lines[i] line.name:SetFont(VMRT.RaidCheck.ReadyCheckFont or ExRT.F.defFont,VMRT.RaidCheck.ReadyCheckFontSize or 12,"") line.mini.name:SetFont(VMRT.RaidCheck.ReadyCheckFont or ExRT.F.defFont,VMRT.RaidCheck.ReadyCheckFontSize or 12,"") for i,key in pairs(RCW_iconsList) do line[key].bigText:SetFont(VMRT.RaidCheck.ReadyCheckFont or ExRT.F.defFont,(VMRT.RaidCheck.ReadyCheckFontSize or 12)-2,"") end end self.title:SetFont(VMRT.RaidCheck.ReadyCheckFont or ExRT.F.defFont,VMRT.RaidCheck.ReadyCheckFontSize or 12,"") self.timeLeftLine.time:SetFont(VMRT.RaidCheck.ReadyCheckFont or ExRT.F.defFont,VMRT.RaidCheck.ReadyCheckFontSize or 12,"") --[[ if self.headers then for i=1,#self.headers do self.headers[i]:SetFont(VMRT.RaidCheck.ReadyCheckFont or ExRTFontNormal:GetFont() or ExRT.F.defFont,(VMRT.RaidCheck.ReadyCheckFontSize or 12)-2,"") end 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) if ExRT.is10 or ExRT.isLK1 then line.back2:SetGradient("HORIZONTAL",CreateColor(cR1,cG1,cB1,1), CreateColor(cR1,cG1,cB1,0)) else line.back2:SetGradientAlpha("HORIZONTAL",cR1,cG1,cB1,1,cR1,cG1,cB1,0) end 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) if ExRT.is10 or ExRT.isLK1 then line.back2:SetGradient("HORIZONTAL",CreateColor(cR1,cG1,cB1,1), CreateColor(cR1,cG1,cB1,0)) else line.back2:SetGradientAlpha("HORIZONTAL",cR1,cG1,cB1,1,cR1,cG1,cB1,0) end 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) if ExRT.is10 or ExRT.isLK1 then line.back2:SetGradient("HORIZONTAL",CreateColor(r,g,b,1), CreateColor(r,g,b,0)) else line.back2:SetGradientAlpha("HORIZONTAL",r,g,b,1,r,g,b,0) end 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 if ExRT.is10 or ExRT.isLK1 then line.classLeft:SetGradient("HORIZONTAL",CreateColor(r,g,b,.4), CreateColor(r,g,b,0)) else line.classLeft:SetGradientAlpha("HORIZONTAL",r,g,b,.4,r,g,b,0) end 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 (spellId == 367405 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 module.db.tableVers[spellId] and not ExRT.isClassic then line.vers.texture:SetTexture(icon) line.vers.text:SetText("") buffCount = buffCount + 1 elseif module.db.tableMove[spellId] and not ExRT.isClassic then line.move.texture:SetTexture(icon) line.move.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 >= 6 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) if manual and self.frame:IsShown() then self.frame:Hide() return end 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 < 4660 and ExRT.isClassic then VMRT.RaidCheck.BuffsCheck = nil 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 and not ExRT.isClassic then GetRunes(3) end if VMRT.RaidCheck.BuffsCheck then GetRaidBuffs(3) end if UnitLevel'player'==60 then C_Timer.After(1,function() if VMRT.RaidCheck.KitsCheck and not ExRT.isClassic then GetKits(3) end if VMRT.RaidCheck.OilsCheck and not ExRT.isClassic then GetOils(3) end end) end else if VMRT.RaidCheck.disableLFR then local _,_,difficulty = GetInstanceInfo() if difficulty == 7 or difficulty == 17 then return end end if VMRT.RaidCheck.disableNotInRaid then local _,zoneType = GetInstanceInfo() if zoneType ~= "raid" 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 and not ExRT.isClassic 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 and not ExRT.isClassic and UnitLevel'player'==60 then IsSendKitsByMe = true ExRT.F.ScheduleTimer(ExRT.F.SendExMsg, 0.1, "raidcheck","REPORT_KITS\t"..ExRT.V) end IsSendOilsByMe = nil if VMRT.RaidCheck.OilsCheck and not ExRT.isClassic and UnitLevel'player'==60 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 UnitLevel'player'==60 and "\tKIT\t"..format("%d/%d",kitNow, kitMax) or "").. (not ExRT.isClassic and UnitLevel'player'==60 and "\tOIL\t"..format("%d",oilMH) or "").. (not ExRT.isClassic and UnitLevel'player'==60 and "\tOIL2\t"..format("%d",oilOH) or "").. (not ExRT.isClassic and UnitLevel'player'==60 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 rune_item_id = ExRT.is10 and 201325 or 181468 local rune_texture = ExRT.is10 and 4644002 or 134078 local wenchants = { [6190] = {ench=6190,item=171286,icon=463544}, [6188] = {ench=6188,item=171285,icon=463543}, [6200] = {ench=6200,item=171437,icon=3528422}, [6198] = {ench=6198,item=171436,icon=3528424}, [6201] = {ench=6201,item=171439,icon=3528423}, [6199] = {ench=6199,item=171438,icon=3528425}, [5401] = {ench=5401,item=-33757,icon=462329,iconoh=135814}, [5400] = {ench=5400,item=-318038,icon=135814}, [6381] = {ench=6381,item=191940,icon=4622275,q=3}, [6380] = {ench=6380,item=191939,icon=4622275,q=2}, [6379] = {ench=6379,item=191933,icon=4622275,q=1}, [6698] = {ench=6698,item=191945,icon=4622279,q=3}, [6697] = {ench=6697,item=191944,icon=4622279,q=2}, [6696] = {ench=6696,item=191943,icon=4622279,q=1}, [6384] = {ench=6384,item=191950,icon=4622274,q=3}, [6383] = {ench=6383,item=191949,icon=4622274,q=2}, [6382] = {ench=6382,item=191948,icon=4622274,q=1}, [6514] = {ench=6514,item=194823,icon=134421,q=3}, [6513] = {ench=6513,item=194822,icon=134421,q=2}, [6512] = {ench=6512,item=194821,icon=134421,q=1}, [6695] = {ench=6695,item=194826,icon=134422,q=3}, [6694] = {ench=6694,item=194825,icon=134422,q=2}, [6515] = {ench=6515,item=194824,icon=134422,q=1}, [6518] = {ench=6518,item=194820,icon=134418,q=3}, [6517] = {ench=6517,item=194819,icon=134418,q=2}, [6516] = {ench=6516,item=194817,icon=134418,q=1}, [6534] = {ench=6534,item=198165,icon=135644,q=3}, [6533] = {ench=6533,item=198164,icon=135644,q=2}, [6532] = {ench=6532,item=198163,icon=135644,q=1}, [6531] = {ench=6531,item=198162,icon=249174,q=3}, [6530] = {ench=6530,item=198161,icon=249174,q=2}, [6529] = {ench=6529,item=198160,icon=249174,q=1}, [6522] = {ench=6522,item=198312,icon=4548897,q=3}, [6521] = {ench=6521,item=198311,icon=4548897,q=2}, [6520] = {ench=6520,item=198310,icon=4548897,q=1}, [6528] = {ench=6528,item=198318,icon=4548899,q=3}, [6527] = {ench=6527,item=198317,icon=4548899,q=2}, [6526] = {ench=6526,item=198316,icon=4548899,q=1}, [6525] = {ench=6525,item=198315,icon=4548898,q=3}, [6524] = {ench=6524,item=198314,icon=4548898,q=2}, [6523] = {ench=6523,item=198313,icon=4548898,q=1}, } local wenchants_items = {} for k,v in pairs(wenchants) do wenchants_items[v.item] = v end 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 = {} module.consumables.rlpointer = CreateFrame("Frame",nil,UIParent) module.consumables.rlpointer:SetSize(1,1) module.consumables.rlpointer:SetPoint("CENTER") module.consumables.rlpointer:Hide() module.consumables.close = ELib:Button(module.consumables,CLOSE or 'x',"ExRTButtonModernTemplate,SecureHandlerClickTemplate"):Shown(false):Size(0,20):Point("TOPLEFT",module.consumables,"BOTTOMLEFT",0,-2):Point("TOPRIGHT",module.consumables,"BOTTOMRIGHT",0,-2) module.consumables.close:SetFrameRef("rlpointer",module.consumables.rlpointer) module.consumables.close:SetAttribute("_onclick",[[ self:GetFrameRef("rlpointer"):Hide() ]]) 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=2,8 do if i ~= 6 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,8 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 or i == 8 then button.click = CreateFrame("Button",nil,button,"SecureActionButtonTemplate") button.click:SetAllPoints() button.click:Hide() button.click:RegisterForClicks("AnyUp", "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(ExRT.is10 and 4622275 or 463543) module.consumables.buttons.oil = button elseif i == 5 then button.texture:SetTexture(rune_texture) 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() elseif i == 8 then button.texture:SetTexture(136051) module.consumables.buttons.class = button button:Hide() end end function module.consumables:Enable() self:RegisterEvent("READY_CHECK") self:RegisterEvent("READY_CHECK_FINISHED") self:Show() end function module.consumables:Disable() self:UnregisterAllEvents() self:Hide() end local isElvUIFix function module.consumables:Update() if (IsAddOnLoaded("ElvUI") or IsAddOnLoaded("ShestakUI")) 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 not InCombatLockdown() then if isWarlockInRaid then self.buttons.hs:Show() else self.buttons.hs:Hide() totalButtons = totalButtons - 1 end if ExRT.is10 then self.buttons.kit:Hide() totalButtons = totalButtons - 1 self.buttons.oil:ClearAllPoints() self.buttons.oil:SetPoint("LEFT",self.buttons.flask,"RIGHT",0,0) end 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 local isShamanBuff 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 elseif spellId == 192106 then isShamanBuff = format(GARRISON_DURATION_MINUTES,ceil((expires-now)/60)) if expires - now <= 600 then isShamanBuff = false end 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 ExRT.is10 then flaskCount = 0 flaskCanCount = 0 end 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("%s%s",flaskCount > 0 and flaskCount or "",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 if not ExRT.is10 then 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 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 wenchants[mainHandEnchantID or 0] then lastWeaponEnchantItem = wenchants[mainHandEnchantID].item 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 local wenchData if lastWeaponEnchantItem and wenchants_items[lastWeaponEnchantItem] then wenchData = wenchants_items[lastWeaponEnchantItem] self.buttons.oil.texture:SetTexture(wenchData.icon) self.buttons.oiloh.texture:SetTexture(wenchData.iconoh or wenchData.icon) 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 type(lastWeaponEnchantItem) == 'number' and lastWeaponEnchantItem < 0 then --for spell enchants if not InCombatLockdown() then local spellName = GetSpellInfo(-lastWeaponEnchantItem) self.buttons.oil.click:SetAttribute("spell", spellName) self.buttons.oil.click:Show() self.buttons.oil.click.IsON = true self.buttons.oil.click:SetAttribute("type", "spell") local spellName = GetSpellInfo(lastWeaponEnchantItem == -33757 and 318038 or -lastWeaponEnchantItem) self.buttons.oiloh.click:SetAttribute("spell", spellName) self.buttons.oiloh.click:Show() self.buttons.oiloh.click.IsON = true self.buttons.oiloh.click:SetAttribute("type", "spell") end self.buttons.oil.count:SetText("") self.buttons.oiloh.count:SetText("") elseif 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(rune_item_id,false,true) local runeUnlim = ExRT.is10 and 0 or GetItemCount(190384,false,true) if runeUnlim and runeUnlim > 0 then self.buttons.rune.count:SetText("") if not InCombatLockdown() then self.buttons.rune.texture:SetTexture(4224736) local itemName = GetItemInfo(190384) 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 elseif runeCount and runeCount > 0 then self.buttons.rune.count:SetFormattedText("%d",runeCount) if not InCombatLockdown() then self.buttons.rune.texture:SetTexture(rune_texture) local itemName = GetItemInfo(rune_item_id) 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) or (runeUnlim and runeUnlim > 0)) and not isRune then LCG.PixelGlow_Start(self.buttons.rune) else LCG.PixelGlow_Stop(self.buttons.rune) end end local isClassShamanEnh if select(2,UnitClass("player")) == "SHAMAN" and GetSpecialization() == 2 then isClassShamanEnh = true end if isClassShamanEnh then if isShamanBuff then self.buttons.class.texture:SetDesaturated(false) self.buttons.class.statustexture:SetTexture("Interface\\RaidFrame\\ReadyCheck-Ready") self.buttons.class.timeleft:SetText(isShamanBuff) else self.buttons.class.texture:SetDesaturated(true) end if not InCombatLockdown() then local spellName = GetSpellInfo(192106) self.buttons.class.click:SetAttribute("type", "spell") self.buttons.class.click:SetAttribute("spell", spellName) self.buttons.class.click:Show() self.buttons.class.click.IsON = true end end if not InCombatLockdown() then if isClassShamanEnh then self.buttons.class.texture:SetTexture(136051) self.buttons.class:Show() totalButtons = totalButtons + 1 self.buttons.class:ClearAllPoints() if isWarlockInRaid then self.buttons.class:SetPoint("LEFT",self.buttons.hs,"RIGHT",0,0) else self.buttons.class:SetPoint("LEFT",self.buttons.rune,"RIGHT",0,0) end else self.buttons.class:Hide() self.buttons.class.click:Hide() self.buttons.class.click.IsON = false end end if not InCombatLockdown() then self:SetWidth(consumables_size*totalButtons) end end function module.consumables:Repos(isRL) if InCombatLockdown() then return end if isRL then self:SetParent(self.rlpointer) self:ClearAllPoints() self:SetPoint("CENTER",self.rlpointer,"CENTER",0,0) self.rlpointer:Show() self.close:Show() self.isRLpos = true elseif self.isRLpos then local parent if isElvUIFix then parent = ReadyCheckFrame else parent = ReadyCheckListenerFrame end self:SetParent(parent) self:ClearAllPoints() self:SetPoint("BOTTOM",parent,"TOP",0,5) self.isRLpos = false 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") if self.isRLpos then self.rlpointer:Hide() end end) if arg1 and UnitIsUnit(arg1,"player") and not VMRT.RaidCheck.ConsDisableForStarter then self:Repos(true) else self:Repos() end elseif event == "READY_CHECK_FINISHED" then module.consumables:OnHide() if self.isRLpos then self.rlpointer:Hide() end 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() if not InCombatLockdown() and self.close:IsShown() then self.close:Hide() end end) module.consumables.Test = function(isRL) --module.consumables:SetParent(UIParent) --module.consumables:ClearAllPoints() --module.consumables:SetPoint("CENTER") module.consumables:GetScript("OnEvent")(module.consumables,"READY_CHECK",isRL and UnitName'player' or "") end --/run GMRT.A.RaidCheck.consumables.Test() end