Advertisement
Guest User

SAA with T10 support and dirty 3.3.3 fix

a guest
Mar 24th, 2010
551
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 61.09 KB | None | 0 0
  1. --[[
  2.  
  3. Version 1.4.1.1
  4.  
  5. Author : Adoriele of US Dragonblight - with permission from Levva of EU Khadgar
  6.  
  7. Repurposed version of ShockAndAwe, an Enhancement Shaman addon, for Balance
  8.     Druids. Provides Debuff timers, as well as proc and cooldown bars for Eclipse
  9.     and Omen of Clarity.
  10.  
  11. Changelog:
  12.  
  13. v1.4.1.1    - Added support for T102P
  14. v1.4.1  - Eclipse cooldown no longer constantly refreshes to 30s, added eclipse type to Eclipse
  15.             cooldown bars, changed functionality of Eclipse buff bar to go grey if
  16.             the buff disappears early
  17. v1.4.0  - 3.3 patch workaround for lack of Eclipse in Combat Log
  18. v1.3.3  - Fixed bug causing debuffs not to spawn when switching targets. Fixed
  19.             bug involving disabling a bar that's currently active.
  20. v1.3.2  - Oops: Applied Debuff/CC change to Abilities as well, and to be safe did
  21.             similar things to Procs and Trinkets as a double-check. Also fixed a
  22.             bug that would not let you turn off the Eclipse bar.
  23. v1.3.1  - Fixed "Debuff/CC, a nil value" bug
  24. v1.3    - Serious revamp of underlying mechanics. Added trinket bars, cc bars,
  25.             multiple proc bars. Added ability to merge bars of the same type
  26.             (except procs). Adding custom bars should now be much easier,
  27.             relatively.
  28. v1.2.1  - Fixed bug with Eclipse and Moonfire bars overlapping, changed FF bar
  29.             to accept any FF.
  30. v1.2    - 3.1 Compatability
  31. v1.1.1  - Fixed GCD bar to be localization independent, added SF Combo points,
  32.             structural changes
  33. v1.1    - Finally fixed OoC issue, removed dependency on localization for
  34.             functionality
  35. v1.0.5  - Fixed encoding issue with Russian locale, added German locale
  36. v1.0.4  - Fixed a bug with the French localization, added Russian and Taiwan
  37. V1.0.3  - Fixed a bug with the OoC bar
  38. V1.0.2  - Added French localization, fixed test bar bug
  39. V1.0.1  - Added text and icon options
  40.  
  41. --]]
  42.  
  43. -- Don't load if it's not a Druid
  44. if select(2, UnitClass('player')) ~= "DRUID" then
  45.     DisableAddOn("SquawkAndAwe")
  46.     return
  47. end
  48.  
  49. -- Basic Ace3 stuff
  50. local L = LibStub("AceLocale-3.0"):GetLocale("SquawkAndAwe")
  51. local AceAddon = LibStub("AceAddon-3.0")
  52. local media = LibStub:GetLibrary("LibSharedMedia-3.0");
  53. SquawkAndAwe = AceAddon:NewAddon("SquawkAndAwe", "AceConsole-3.0", "AceEvent-3.0", "AceTimer-3.0")
  54. local REVISION = tonumber(("$Revision: 1.4.1.1 $"):match("%d+"))
  55.  
  56. -- Frame creation
  57. SquawkAndAwe.frames = {}
  58. SquawkAndAwe.BaseFrame = CreateFrame("Frame","SquawkAndAweBase",UIParent)
  59.  
  60. -- Other initializations
  61. SquawkAndAwe.textures = {}
  62. SquawkAndAwe.borders = {}
  63. SquawkAndAwe.fonts = {}
  64. SquawkAndAwe.sounds = {}
  65. SquawkAndAwe.barBackdrop = {
  66.         bgFile = "Interface/Tooltips/UI-Tooltip-Background",
  67.         edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
  68.         tile = false, tileSize = 0, edgeSize = 12,
  69.         insets = { left = 2, right = 2, top = 2, bottom = 2 }
  70.     }
  71. SquawkAndAwe.frameBackdrop ={
  72.         bgFile = "Interface/Tooltips/UI-Tooltip-Background",
  73.         --edgeFile = "Interface/Tooltips/UI-Tooltip-Border",
  74.         tile = false, tileSize = 0, edgeSize = 12,
  75.         insets = { left = 0, right = 0, top = 0, bottom = 0 }
  76.     }
  77.  
  78. SquawkAndAwe.combat = {}
  79. SquawkAndAwe.combat.procs = {}
  80. SquawkAndAwe.combat.procs.Eclipse   = {id = 48518,  name = GetSpellInfo(48518), cd = 30}
  81. SquawkAndAwe.combat.procs.Eclipsew  = {id = 48517,  name = GetSpellInfo(48517), cd = 30}
  82. SquawkAndAwe.combat.procs.Omen      = {id = 16870,  name = GetSpellInfo(16870)}
  83. SquawkAndAwe.combat.procs.T102P     = {id = 70721,    name = GetSpellInfo(70721)}
  84. SquawkAndAwe.combat.procs.T84P      = {id = 64823,  name = GetSpellInfo(64823)}
  85. SquawkAndAwe.combat.procs.PVP           = {id = 46833,  name = GetSpellInfo(46833)}
  86. SquawkAndAwe.combat.debuffs = {}
  87. SquawkAndAwe.combat.debuffs.Moonfire    = {id = 48463,  name = GetSpellInfo(48463), tick = 3}
  88. SquawkAndAwe.combat.debuffs.Insect      = {id = 48468,  name = GetSpellInfo(48468), tick = 2}
  89. SquawkAndAwe.combat.debuffs.Faerie      = {id = 770,    name = GetSpellInfo(770)}
  90. SquawkAndAwe.combat.cc = {}
  91. SquawkAndAwe.combat.cc.Roots        = {id = 339,    name = GetSpellInfo(339)}
  92. SquawkAndAwe.combat.cc.Hibernate    = {id = 2637,   name = GetSpellInfo(2637)}
  93. SquawkAndAwe.combat.cc.Cyclone  = {id = 33786,  name = GetSpellInfo(33786)}
  94. SquawkAndAwe.combat.abilities = {}
  95. SquawkAndAwe.combat.abilities.Innervate = {id = 29166,  name = GetSpellInfo(29166)}
  96. SquawkAndAwe.combat.abilities.Force         = {id = 33831,  name = GetSpellInfo(33831), dur = 30}
  97. SquawkAndAwe.combat.abilities.Starfall      = {id = 48505,  name = GetSpellInfo(48505)}
  98. SquawkAndAwe.combat.abilities.Typhoon       = {id = 50516,  name = GetSpellInfo(50516)}
  99. SquawkAndAwe.combat.abilities.Barkskin      = {id = 22812,  name = GetSpellInfo(22812)}
  100. SquawkAndAwe.combat.trinkets = {}
  101. SquawkAndAwe.combat.trinkets.flare          = {id = 64713,  itemid = 45518, name = GetSpellInfo(64713), itemname    = GetItemInfo(45518),   color = {r=1, g=0.8, b=0.32, a=0.9},    cd = 45}
  102. SquawkAndAwe.combat.trinkets.flame          = {id = 64712,  itemid = 45148, name = GetSpellInfo(64712), itemname    = GetItemInfo(45148),   color = {r=1, g=0.42, b=0, a=0.9}}
  103. SquawkAndAwe.combat.trinkets.pandora        = {id = 64741,  itemid = 45490, name = GetSpellInfo(64741), itemname    = GetItemInfo(45490),   color = {r=0.13, g=1, b=0.35, a=0.9},   cd = 45}
  104. SquawkAndAwe.combat.trinkets.fates          = {id = 64707,  itemid = 45466, name = GetSpellInfo(64707), itemname    = GetItemInfo(45466),   color = {r=0.16, g=1, b=0.69, a=0.9}}
  105. SquawkAndAwe.combat.trinkets.focus          = {id = 65004,  itemid = 45866, name = GetSpellInfo(65004), itemname    = GetItemInfo(45866),   color = {r=0.46, g=0.38, b=1, a=0.9},   cd = 45}
  106. SquawkAndAwe.combat.trinkets.siphon         = {id = 65008,  itemid = 45292, name = GetSpellInfo(65008), itemname    = GetItemInfo(45292),   color = {r=0.5, g=0, b=1, a=0.9}}
  107. SquawkAndAwe.combat.trinkets.broodmother    = {id = 65006,  itemid = 45308, name = GetSpellInfo(65006), itemname    = GetItemInfo(45308),   color = {r=0, g=1, b=0.3, a=0.9},   cd = 0}
  108. SquawkAndAwe.combat.trinkets.dying          = {id = 60494,  itemid = 40255, name = GetSpellInfo(60494), itemname    = GetItemInfo(40255),   color = {r=0, g=0.37, b=0.12, a=0.9},   cd = 45}
  109. SquawkAndAwe.combat.trinkets.illustration   = {id = 60486,  itemid = 40432, name = GetSpellInfo(60486), itemname    = GetItemInfo(40432),   color = {r=0.75, g=0.30, b=0.65, a=0.9},    cd = 0}
  110. SquawkAndAwe.combat.trinkets.spider         = {id = 60492,  itemid = 39229, name = GetSpellInfo(60492), itemname    = GetItemInfo(39229),   color = {r=0.62, g=0.27, b=0.18, a=0.9},    cd = 45}
  111. SquawkAndAwe.combat.trinkets.sundial        = {id = 60064,  itemid = 40682, name = GetSpellInfo(60064), itemname    = GetItemInfo(40682),   color = {r=0.16, g=0.93, b=0.91, a=0.9},    cd = 45}
  112. SquawkAndAwe.combat.trinkets.serpent        = {id = 56184,  itemid = 42395, name = GetSpellInfo(56184), itemname    = GetItemInfo(42395),   color = {r=0.2, g=0.02, b=0.48, a=0.9}}
  113. SquawkAndAwe.combat.trinkets.ember          = {id = 60479,  itemid = 37660, name = GetSpellInfo(60479), itemname    = GetItemInfo(37660),   color = {r=1, g=0.04, b=0.09, a=0.9},   cd = 45}
  114. SquawkAndAwe.combat.trinkets.prisoner       = {id = 60480,  itemid = 37873, name = GetSpellInfo(60480), itemname    = GetItemInfo(37873),   color = {r=0.51, g=0.47, b=0.50, a=0.9}}
  115. SquawkAndAwe.combat.trinkets.winged         = {id = 60521,  itemid = 37844, name = GetSpellInfo(60521), itemname    = GetItemInfo(37844),   color = {r=1, g=0.35, b=0.73, a=0.9}}
  116. SquawkAndAwe.combat.trinkets.tome           = {id = 60471,  itemid = 36972, name = GetSpellInfo(60471), itemname    = GetItemInfo(36972),   color = {r=0.84, g=0.6, b=0.15, a=0.9}}
  117. SquawkAndAwe.combat.Moonglade   = {id = 18960,  name = GetSpellInfo(18960)}
  118. SquawkAndAwe.combat.Starfire    = {id = 2912,   name = GetSpellInfo(2912)}
  119. SquawkAndAwe.combat.Wrath       = {id = 5176,   name = GetSpellInfo(5176)}
  120. SquawkAndAwe.combat.FeralFF = {id = 16857, name = GetSpellInfo(16857)}
  121.  
  122. SquawkAndAwe.actives    = {}
  123. SquawkAndAwe.actives.trinkets   = {}
  124. SquawkAndAwe.actives.procs          = {}
  125. SquawkAndAwe.actives.cc             = {}
  126. SquawkAndAwe.actives.debuffs        = {}
  127. SquawkAndAwe.actives.abilities  = {}
  128. SquawkAndAwe.ActiveEclipseBuff = false
  129.  
  130. SquawkAndAwe.activeTrinketNames = {}
  131. SquawkAndAwe.activeTrinketNames.Trinket1 = "flare"
  132. SquawkAndAwe.activeTrinketNames.Trinket2 = "flame"
  133.  
  134. SquawkAndAwe.times  = {}
  135.  
  136. SquawkAndAwe.barFrames          = {}
  137. local barFrameIndex     = 0
  138. SquawkAndAwe.statusBars         = {}
  139. local statusbarIndex    = 0
  140.  
  141. local playerName    = UnitName("player");
  142. local LastMF        = 0
  143. local SFCombos      = 0
  144. local EclipseType   = ""
  145.  
  146.  
  147. -------------------
  148. -- Config details
  149. -------------------
  150.  
  151. local defaults = {
  152.     char = {
  153.         -- Settings
  154.         -- Frame
  155.         fWidth      = 300,
  156.         barHeight   = 25,
  157.         scale       = 1,
  158.  
  159.         -- Bars
  160.         bars = {
  161.             -- Maximum bar length in time
  162.             MaxLen          = 30,
  163.  
  164.             -- Trinkets
  165.             trinketshow     = false,
  166.             mergetrinkets   = true,
  167.             trinketcd       = false,
  168.  
  169.             -- Procs
  170.             procs   = {
  171.                 Eclipse = {
  172.                     show        = true,
  173.                     color       = {r=1,     g=1,    b=1,    a=0.9},
  174.                     wcolor      = {r=0,     g=1,    b=0,    a=0.9},
  175.                     cd          = true,
  176.                     flash       = true,
  177.                 },
  178.                 Omen        = {
  179.                     show    = true,
  180.                     color   = {r=0.6,   g=0.6,  b=1,    a=0.9},
  181.                     flash   = false,
  182.                 },
  183.                   T102P     = {
  184.                     show  = true,
  185.                       color = {r=0.6,   g=0.6,  b=1,  a=0.9},
  186.                     flash   = false,
  187.                 },
  188.                 T84P        = {
  189.                     show    = true,
  190.                     color   = {r=0.43,      g=0.61, b=1,    a=0.9},
  191.                     flash   = true,
  192.                 },
  193.                 PVP     = {
  194.                     show    = false,
  195.                     color   = {r=0.54,      g=0.32, b=1,    a=0.9},
  196.                     flash   = true,
  197.                 },
  198.             },
  199.             cdcolor = {r=0.6,   g=0.6,  b=0.6,  a=0.9},
  200.  
  201.             -- Debuffs
  202.             debuffs = {
  203.                 Moonfire    = {
  204.                     show    = true,
  205.                     color   = {r=0.5,   g=0,    b=1,    a=0.9},
  206.                     tick    = true,
  207.                 },
  208.                 Insect  = {
  209.                     show    = true,
  210.                     color   = {r=0,     g=1,    b=0.3,  a=0.9},
  211.                     tick    = true,
  212.                 },
  213.                 Faerie  = {
  214.                     show    = true,
  215.                     color   = {r=1,     g=0.5,  b=1,    a=0.9},
  216.                 },
  217.             } ,
  218.             mergedebuffs    = false,
  219.             tickcolor       = {r=0.6,   g=0.6,  b=0.6,  a=0.9},
  220.  
  221.             -- CC
  222.             cc  = {
  223.                 Roots       = {
  224.                     show    = true,
  225.                     color   = {r=0.38,      g=0.2,  b=0.08, a=0.9},
  226.                 },
  227.                 Hibernate   = {
  228.                     show    = true,
  229.                     color   = {r=1,     g=0.55, b=0.54, a=0.9},
  230.                 },
  231.                 Cyclone     = {
  232.                     show    = true,
  233.                     color   = {r=0.25,      g=0.25, b=0.25, a=0.9},
  234.                 },
  235.             },
  236.             mergecc         = true,
  237.  
  238.             -- Abilities
  239.             abilities   = {
  240.                 Starfall        = {
  241.                     show    = true,
  242.                     color   = {r=1,     g=1,    b=1,    a=0.9},
  243.                     dur     = true,
  244.                 },
  245.                 Typhoon     = {
  246.                     show    = true,
  247.                     color   = {r=0.5,       g=0,    b=1,    a=0.9},
  248.                 },
  249.                 Force           = {
  250.                     show    = true,
  251.                     color   = {r=0,     g=1,    b=0,    a=0.9},
  252.                     dur = true,
  253.                 },
  254.                 Innervate   = {
  255.                     show    = true,
  256.                     color   = {r=0,     g=0,    b=1,    a=0.9},
  257.                     dur = true,
  258.                 },
  259.                 Barkskin        = {
  260.                     show    = true,
  261.                     color   = {r=1,     g=1,    b=0,    a=0.9},
  262.                     dur = true,
  263.                 },
  264.             },
  265.             mergeabilities  = true,
  266.             GCD =   {
  267.                 show    = true,
  268.                 color   = {r=0.6,   g=0.6,  b=0.6,  a=0.6},
  269.             },
  270.         },
  271.  
  272.         -- Media
  273.         texture         = "BantoBar",
  274.         border          = "None",
  275.         barborder       = "None",
  276.         icons               = true,
  277.             -- Text
  278.             barstext        = true,
  279.             barfont     = "Friz Quadrata TT",
  280.             barfontsize = 12,
  281.             spellnames  = true,
  282.             durations   = true,
  283.             eclipsetype = true,
  284.             sfcomboshow = true,
  285.  
  286.         -- Main
  287.         debug   = false,
  288.         barshow = true,
  289.  
  290.         -- Incidentals
  291.         relativeTo      = "UIParent",
  292.         relativePoint   = "CENTER",
  293.         point           = "CENTER",
  294.         xOffset         = 0,
  295.         yOffset         = 0,
  296.         --fHeight           = 175,
  297.  
  298.  
  299.         -- unused so far
  300.         message = "Welcome Home!",
  301.         resetOn = true,
  302.  
  303.     }
  304. }
  305.  
  306. -----------------------------------------
  307. -- Initialisation & Startup Routines
  308. -----------------------------------------
  309. -- Changed to hide uptime, stats, priority frames, kill options for now
  310. function SquawkAndAwe:OnInitialize()
  311.     local AceConfigReg = LibStub("AceConfigRegistry-3.0")
  312.     local AceConfigDialog = LibStub("AceConfigDialog-3.0")
  313.  
  314.     self.db = LibStub("AceDB-3.0"):New("SquawkAndAweDBPC", SquawkAndAwe.defaults, "char")
  315.     LibStub("AceConfig-3.0"):RegisterOptionsTable("SquawkAndAwe", self:GetOptions(), {"SquawkAndAwe", "saa"} )
  316.     media.RegisterCallback(self, "LibSharedMedia_Registered")
  317.  
  318.     -- Add the options to blizzard frame (add them backwards so they show up in the proper order
  319.     self.optionsFrame = AceConfigDialog:AddToBlizOptions("SquawkAndAwe","SquawkAndAwe")
  320.     self.optionsFrame[L["About"]] = LibStub("LibAboutPanel").new("SquawkAndAwe", "SquawkAndAwe")
  321.     self.db:RegisterDefaults(defaults)
  322.     local version = GetAddOnMetadata("SquawkAndAwe","Version")
  323.     self.version = ("SquawkAndAwe v%s (r%s)"):format(version, REVISION)
  324.     self:Print(self.version.." Loaded.")
  325. end
  326.  
  327. function SquawkAndAwe:OnDisable()
  328.     -- Called when the addon is disabled
  329. end
  330.  
  331. -- Unregistered a couple events, should work
  332. function SquawkAndAwe:OnEnable()
  333.     self:LibSharedMedia_Registered()
  334.     self:RegisterEvent("PLAYER_ENTERING_WORLD")
  335.     self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
  336.     self:RegisterEvent("PLAYER_TARGET_CHANGED")
  337.     self:RegisterEvent("SPELL_UPDATE_COOLDOWN")
  338.     self:RegisterEvent("UNIT_AURA")
  339. end
  340.  
  341. -- Should work without changes
  342. function SquawkAndAwe:LibSharedMedia_Registered()
  343.     for k, v in pairs(media:List("statusbar")) do
  344.         self.textures[v] = v
  345.     end
  346.     for k, v in pairs(media:List("border")) do
  347.         self.borders[v] = v
  348.     end
  349.     for k, v in pairs(media:List("font")) do
  350.         self.fonts[v] = v
  351.     end
  352.     for k, v in pairs(media:List("sound")) do
  353.         self.sounds[v] = v
  354.     end
  355. end
  356.  
  357. ----------------------
  358. -- Event Routines
  359. ----------------------
  360. function SquawkAndAwe:PLAYER_ENTERING_WORLD()
  361.     self:SetBorderTexture(nil, self.db.char.border)
  362.     self:SetBarBorderTexture(nil, self.db.char.barborder)
  363.     self:RedrawFrames()
  364. end
  365.  
  366. function SquawkAndAwe:UNIT_AURA(event,id)
  367.     if id == "player" and not SquawkAndAwe.ActiveEclipseBuff then
  368. --      local _,_,_,_,_,_,_,_,_,_,spellID = UnitBuff("player",SquawkAndAwe.combat.procs.Eclipse.name);
  369. --      if spellID == SquawkAndAwe.combat.procs.Eclipse.id then
  370.         if UnitBuff("player",SquawkAndAwe.combat.procs.Eclipse.name) then
  371.             SquawkAndAwe.ActiveEclipseBuff = true
  372.             SquawkAndAwe:ProcBars("Eclipse", SquawkAndAwe.combat.procs.Eclipse)
  373. --      elseif spellID == SquawkAndAwe.combat.procs.Eclipsew.id then
  374.         elseif UnitBuff("player",SquawkAndAwe.combat.procs.Eclipsew.name) then
  375.             SquawkAndAwe.ActiveEclipseBuff = true
  376.             SquawkAndAwe:ProcBars("Eclipsew", SquawkAndAwe.combat.procs.Eclipsew)
  377.         end
  378.     end -- if id == "player"
  379. end -- function SAA:UNIT_AURA()
  380.  
  381. function SquawkAndAwe:COMBAT_LOG_EVENT_UNFILTERED(_, timestamp, event, sourceGUID, sourceName, sourceFlags, destGUID, destName, destFlags, ...)
  382.     local k,v,_,icon,color
  383.     local spellID = select(1, ...)
  384.     local spellName = select(2,...)
  385.     if sourceGUID == UnitGUID("player") then
  386.         if event == "SPELL_AURA_APPLIED" then
  387.             -- Trinket handler
  388.             for k,v in pairs (SquawkAndAwe.combat.trinkets) do
  389.                 if spellID == v.id then
  390.                     if self.db.char.bars.trinketshow then
  391.                         SquawkAndAwe:TrinketBars(k,v)
  392.                     end -- if trinketshow
  393.                     return
  394.                 end -- if spellID == v.id
  395.             end -- for k,v in pairs(trinkets)
  396.  
  397.             -- Proc handler
  398.             for k,v in pairs(SquawkAndAwe.combat.procs) do
  399.                 if spellID == v.id then
  400.                     SquawkAndAwe:ProcBars(k,v)
  401.                     return
  402.                 end -- if spellID == v.id
  403.             end -- for k,v in pairs(procs)
  404.  
  405.             -- Debuff Handler
  406.             for k,v in pairs(SquawkAndAwe.combat.debuffs) do
  407.                 if spellName == v.name then
  408.                     if spellName == SquawkAndAwe.combat.debuffs.Moonfire.name then
  409.                         SFCombos = 0
  410.                         LastMF = 0
  411.                     end
  412.                     SquawkAndAwe:DebuffBars(k,v)
  413.                 return
  414.                 end -- if spellID == v.id
  415.             end -- for k,v in pairs(debuffs)
  416.  
  417.             -- CC Handler
  418.             for k,v in pairs(SquawkAndAwe.combat.cc) do
  419.                 if spellName == v.name then
  420.                     SquawkAndAwe:CCBars(k)
  421.                     return
  422.                 end
  423.             end
  424.  
  425.         -- Check for IS, MF ticks, reset bars
  426.         elseif event == "SPELL_PERIODIC_DAMAGE" and destName == UnitName("target")then
  427.             if spellID == SquawkAndAwe.combat.debuffs.Moonfire.id then
  428.                 if self.db.char.bars.debuffs.Moonfire.tick then
  429.                     SquawkAndAwe.times.MoonfireTick = GetTime() + SquawkAndAwe.combat.debuffs.Moonfire.tick
  430.                 end
  431.             elseif spellID == SquawkAndAwe.combat.debuffs.Insect.id then
  432.                 if self.db.char.bars.debuffs.Insect.tick then
  433.                     SquawkAndAwe.times.InsectTick = GetTime() + SquawkAndAwe.combat.debuffs.Insect.tick
  434.                 end
  435.             end
  436.         -- Check for spell casts for spells that generate them
  437.         elseif event == "SPELL_CAST_SUCCESS" then
  438.          -- Ability handler
  439.             for k,v in pairs(SquawkAndAwe.combat.abilities) do
  440.                 if spellName == v.name then
  441.                     SquawkAndAwe:AbilityBars(k,v)
  442.                     return
  443.                 end
  444.             end
  445.  
  446.             -- Debuff Handler
  447.             for k,v in pairs(SquawkAndAwe.combat.debuffs) do
  448.                 if spellName == v.name then
  449.                     if spellName == SquawkAndAwe.combat.debuffs.Moonfire.name then
  450.                         SFCombos = 0
  451.                         LastMF = 0
  452.                     end
  453.                     SquawkAndAwe:DebuffBars(k,v)
  454.                 return
  455.                 end -- if spellID == v.id
  456.             end -- for k,v in pairs(debuffs)
  457.         end -- event == EVENT
  458.     -- Add handling for FF from any source
  459.     elseif (spellID == SquawkAndAwe.combat.debuffs.Faerie.id or spellID == SquawkAndAwe.combat.FeralFF.id) and destName == UnitName("target") and (event == "SPELL_CAST_SUCCESS" or event == "SPELL_AURA_APPLIED") then
  460.         --[[if self.db.char.bars.debuffs.Faerie.show then
  461.             SquawkAndAwe.actives.debuffs.Faerie = true
  462.             if self.db.char.bars.mergedebuffs then
  463.                 self.frames["Debuffs"]:Show()
  464.             else
  465.                 self.frames["Faerie"]:Show()
  466.             end
  467.         end--]]
  468.         SquawkAndAwe:DebuffBars("Faerie", SquawkAndAwe.combat.debuffs.Faerie)
  469.     end -- if sourceGUID == player
  470. end
  471.  
  472. -- Triggers GCD bar
  473. function SquawkAndAwe:SPELL_UPDATE_COOLDOWN()
  474.     if self.db.char.bars.GCD.show then
  475.         self:GCDBar()
  476.     end
  477. end
  478.  
  479. -- Changing targets should refresh CC and Debuff bars
  480. function SquawkAndAwe:PLAYER_TARGET_CHANGED()
  481.     SquawkAndAwe:TriggerDebuffs()
  482.     SquawkAndAwe:TriggerCC()
  483. end
  484.  
  485. ---------------------------
  486. -- Buff Info functions
  487. ---------------------------
  488.  
  489. -- Generic spell getter
  490. function SquawkAndAwe:GetSpellInfo(spellName, spelltype)
  491.     local index = 1
  492.     if spelltype == "buff" then
  493.         while UnitBuff("player", index) do
  494.             local name, _, _, _, _, _, expires = UnitBuff("player", index)
  495. --          if name == spellName then
  496.             if name == spellName or (spellName == "Eclipse (Lunar)" and EclipseType == "Wrath" and name == "Eclipse (Solar)") then
  497.                 return expires
  498.             end
  499.             index = index + 1
  500.         end
  501.         return 0
  502.     elseif spelltype == "debuff" or spelltype == "cc" then
  503.         while UnitDebuff("target", index) do
  504.             local name, _, _, _, _, _, expires, source = UnitDebuff("target", index)
  505.             if name == spellName and (source == "player" or spellName == self.combat.debuffs.Faerie.name or spellName == self.combat.FeralFF.name) then
  506.                 return expires
  507.             end
  508.             index = index + 1
  509.         end
  510.         if spelltype == "cc" then
  511.             index = 1
  512.             while UnitDebuff("focus", index) do
  513.                 local name, _, _, _, _, _, expires, source = UnitDebuff("focus", index)
  514.                 if name == spellName and source == "player" then
  515.                     return expires
  516.                 end
  517.                 index = index + 1
  518.             end
  519.         end
  520.         return 0
  521.     elseif spelltype == "cd" then
  522.         local start, duration, enable = GetSpellCooldown(spellName)
  523.         return start + duration
  524.     elseif spelltype == "item" then
  525.         local start, duration, enable = GetItemCooldown(spellName)
  526.         return start + duration
  527.     end
  528. end
  529.  
  530. ---------------------------
  531. -- functions
  532. ---------------------------
  533. -- Alias for CreateBaseFrame()
  534. function SquawkAndAwe:RedrawFrames()
  535.     self:ClearActives()
  536.     self:HideAllBars()
  537.     self:SetBaseFrame()
  538. end
  539.  
  540. -- Finds the number of bars which have been activated. Merged categories count
  541. -- as one bar, no matter how many bars are active
  542. function SquawkAndAwe:FindNumBars()
  543.     local num   = 0
  544.     local add
  545.     local k,v
  546.  
  547.     -- Add trinket bars
  548.     if self.db.char.bars.trinketshow and self.db.char.bars.mergetrinkets then
  549.         num = num + 1
  550.     elseif self.db.char.trinketshow then
  551.         num = num + 2
  552.     end
  553.  
  554.     -- Add proc bars (checking for Eclipse CD bar, even if buff bar is disabled)
  555.     for k,v in pairs(self.db.char.bars.procs) do
  556.         if self.db.char.bars.procs[k].show or self.db.char.bars.procs[k].cd then
  557.             num = num + 1
  558.         end
  559.     end
  560.  
  561.     -- Check for any debuff bars
  562.     add = 0
  563.     for k,v in pairs(self.db.char.bars.debuffs) do
  564.         if self.db.char.bars.debuffs[k].show then
  565.             add = add + 1
  566.         end
  567.     end
  568.     if self.db.char.bars.mergedebuffs and not add == 0 then
  569.         num = num + 1   -- If merged, only add one bar, and only of any are enabled
  570.     else
  571.         num = num + add -- If not, add as many as are enabled
  572.     end
  573.  
  574.     -- Check for cc bars
  575.     add = 0
  576.     for k,v in pairs(self.db.char.bars.cc) do
  577.         if self.db.char.bars.cc[k].show then
  578.             add = add + 1
  579.         end
  580.     end
  581.     if self.db.char.bars.mergecc and not add == 0 then
  582.         num = num + 1
  583.     else
  584.         num = num + add
  585.     end
  586.  
  587.     -- Check for ability bars
  588.     add = 0
  589.     for k,v in pairs(self.db.char.bars.abilities) do
  590.         if self.db.char.bars.abilities[k].show then
  591.             add = add + 1
  592.         end
  593.     end
  594.     if self.db.char.bars.mergeabilities and not add == 0 then
  595.         num = num + 1
  596.     else
  597.         num = num + add
  598.     end
  599.  
  600.     -- Check for GCD bar
  601.     if self.db.char.bars.GCD.show then
  602.         num = num + 1
  603.     end
  604.     return num
  605. end
  606.  
  607. -- Prints version number
  608. function SquawkAndAwe:DisplayVersion()
  609.     self:Print(self.version)
  610. end
  611.  
  612. -- Clear the actives listings
  613. function SquawkAndAwe:ClearActives()
  614.     SquawkAndAwe.actives    = {}
  615.     SquawkAndAwe.actives.trinkets   = {}
  616.     SquawkAndAwe.actives.procs      = {}
  617.     SquawkAndAwe.actives.cc         = {}
  618.     SquawkAndAwe.actives.debuffs    = {}
  619.     SquawkAndAwe.actives.abilities  = {}
  620. end
  621.  
  622. function SquawkAndAwe:HideAllBars()
  623.     for i,v in ipairs(SquawkAndAwe.barFrames) do
  624.         v:Hide()
  625.     end
  626. end
  627.  
  628. -- Creates base frame, calls CreateBarFrames()
  629. function SquawkAndAwe:SetBaseFrame()
  630.     -- Basic config
  631.     self.BaseFrame:SetScale(self.db.char.scale)
  632.     self.BaseFrame:SetFrameStrata("BACKGROUND")
  633.     local width
  634.     self.BaseFrame:SetWidth(self.db.char.fWidth + (self.db.char.icons and self.db.char.barHeight + 9 or 0))
  635.     self.BaseFrame:SetHeight((self.db.char.barHeight + 3) * self:FindNumBars() + 3)
  636.     self.BaseFrame:SetBackdrop(self.frameBackdrop)
  637.     self.BaseFrame:SetBackdropColor(1, 1, 1, 0)
  638.     self.BaseFrame:SetMovable(true)
  639.     self.BaseFrame:RegisterForDrag("LeftButton")
  640.     self.BaseFrame:SetPoint(self.db.char.point, self.db.char.relativeTo, self.db.char.relativePoint, self.db.char.xOffset, self.db.char.yOffset)
  641.  
  642.     -- Set the start-drag script
  643.     self.BaseFrame:SetScript("OnDragStart",
  644.         function()
  645.             self.BaseFrame:StartMoving();
  646.         end );
  647.  
  648.     -- Set the stop-drag script
  649.     self.BaseFrame:SetScript("OnDragStop",
  650.         function()
  651.             self.BaseFrame:StopMovingOrSizing();
  652.             self.BaseFrame:SetScript("OnUpdate", nil);
  653.             self:FinishedMoving(self.db.char, self.BaseFrame);
  654.         end );
  655.  
  656.     -- Show the frame, reset the toggle
  657.     self.BaseFrame:Show()
  658.     self.db.char.barshow = false
  659.  
  660.     -- Create the bar frames
  661.     self:CreateBarFrames()
  662. end
  663.  
  664. -- Creates bar frames by iterating through categories and setting up each,
  665. -- either merged or not
  666. function SquawkAndAwe:CreateBarFrames()
  667.     -- Bar creation
  668.     local barCount = 0
  669.     local k,v
  670.     local layer
  671.     local add
  672.  
  673.     -- Reset frames container
  674.     self.frames = {}
  675.     barFrameIndex = 0
  676.     statusbarIndex = 0
  677.  
  678.     -- Trinket Bars
  679.     if self.db.char.bars.trinketshow then
  680.         if self.db.char.bars.mergetrinkets then
  681.             SquawkAndAwe:SetBarFrame("Trinkets", barCount)
  682.             SquawkAndAwe:AddStatusBar(self.frames["Trinkets"], "Trinket1", SquawkAndAwe.combat.trinkets.flare.color, 2)
  683.             SquawkAndAwe:AddStatusBar(self.frames["Trinkets"], "Trinket2", SquawkAndAwe.combat.trinkets.flame.color, 1)
  684.             barCount = barCount + 1
  685.         else
  686.             -- First trinket bar
  687.             SquawkAndAwe:SetBarFrame("Trinket1", barCount)
  688.             SquawkAndAwe:SetBarFrame("Trinket2", barCount + 1)
  689.             barCount = barCount + 2
  690.             if self.db.char.bars.trinketcd then
  691.                 SquawkAndAwe:AddStatusBar(self.frames["Trinket1"], "Trinket1CD", self.db.char.bars.cdcolor, 1)
  692.                 SquawkAndAwe:AddStatusBar(self.frames["Trinket1"], "Trinket1", SquawkAndAwe.combat.trinkets.flare.color, 2)
  693.                 SquawkAndAwe:AddStatusBar(self.frames["Trinket2"], "Trinket2CD", self.db.char.bars.cdcolor, 1)
  694.                 SquawkAndAwe:AddStatusBar(self.frames["Trinket2"], "Trinket2", SquawkAndAwe.combat.trinkets.flame.color, 2)
  695.             else
  696.                 SquawkAndAwe:AddStatusBar(self.frames["Trinket1"], "Trinket1", SquawkAndAwe.combat.trinkets.flare.color, 1)
  697.                 SquawkAndAwe:AddStatusBar(self.frames["Trinket2"], "Trinket2", SquawkAndAwe.combat.trinkets.flame.color, 1)
  698.             end
  699.         end
  700.     end
  701.  
  702.     -- Proc bars
  703.     for k,v in pairs(self.db.char.bars.procs) do
  704.         if v.show or v.cd then
  705.             SquawkAndAwe:SetBarFrame(k, barCount, SquawkAndAwe.combat.procs[k].id)
  706.             if v.cd then
  707.                 SquawkAndAwe:AddStatusBar(self.frames[k], k.."CD", self.db.char.bars.cdcolor, 1)
  708.                 if v.show then
  709.                     SquawkAndAwe:AddStatusBar(self.frames[k], k, v.color, 2)
  710.                 end
  711.             else
  712.                 SquawkAndAwe:AddStatusBar(self.frames[k], k, v.color, 1)
  713.             end
  714.             barCount = barCount + 1
  715.         end
  716.     end
  717.  
  718.     -- Debuff bars
  719.     layer = 1
  720.     add = 0
  721.     if self.db.char.bars.mergedebuffs then
  722.         -- Make sure at least one is enabled
  723.         for k,v in pairs(self.db.char.bars.debuffs)do
  724.             if v.show then
  725.                 add = add + 1
  726.             end
  727.         end
  728.         if add > 0 then
  729.             SquawkAndAwe:SetBarFrame("Debuffs", barCount)
  730.             for k,v in pairs(self.db.char.bars.debuffs) do
  731.                 if v.show then
  732.                     SquawkAndAwe:AddStatusBar(self.frames["Debuffs"], k, v.color, layer)
  733.                     layer = layer + 1
  734.                 end
  735.             end
  736.             barCount = barCount + 1
  737.         end
  738.     else
  739.         for k,v in pairs(self.db.char.bars.debuffs) do
  740.             if v.show then
  741.                 SquawkAndAwe:SetBarFrame(k, barCount, SquawkAndAwe.combat.debuffs[k].id)
  742.                 SquawkAndAwe:AddStatusBar(self.frames[k], k, v.color, 1)
  743.                 if v.tick then
  744.                     SquawkAndAwe:AddStatusBar(self.frames[k], k.."Tick", self.db.char.bars.tickcolor, 2, true, SquawkAndAwe.combat.debuffs[k].tick)
  745.                 end
  746.                 barCount = barCount + 1
  747.             end
  748.         end
  749.     end
  750.  
  751.     -- CC bars
  752.     layer = 1
  753.     add = 0
  754.     if self.db.char.bars.mergecc then
  755.         -- Make sure at least one is enabled
  756.         for k,v in pairs(self.db.char.bars.cc)do
  757.             if v.show then
  758.                 add = add + 1
  759.             end
  760.         end
  761.         if add > 0 then
  762.             SquawkAndAwe:SetBarFrame("CC", barCount)
  763.             for k,v in pairs(self.db.char.bars.cc) do
  764.                 if v.show then
  765.                     SquawkAndAwe:AddStatusBar(self.frames["CC"], k, v.color, layer)
  766.                     layer = layer + 1
  767.                 end
  768.             end
  769.             barCount = barCount + 1
  770.         end
  771.     else
  772.         for k,v in pairs(self.db.char.bars.cc) do
  773.             if v.show then
  774.                 SquawkAndAwe:SetBarFrame(k, barCount, SquawkAndAwe.combat.cc[k].id)
  775.                 SquawkAndAwe:AddStatusBar(self.frames[k], k, v.color, 1)
  776.                 barCount = barCount + 1
  777.             end
  778.         end
  779.     end
  780.  
  781.  
  782.     -- Ability bars
  783.     layer = 1
  784.     add = 0
  785.     if self.db.char.bars.mergeabilities then
  786.         -- Make sure at least one is enabled
  787.         for k,v in pairs(self.db.char.bars.abilities)do
  788.             if v.show then
  789.                 add = add + 1
  790.             end
  791.         end
  792.         if add > 0 then
  793.             SquawkAndAwe:SetBarFrame("Abilities", barCount)
  794.             for k,v in pairs(self.db.char.bars.abilities) do
  795.                 if v.show then
  796.                     SquawkAndAwe:AddStatusBar(self.frames.Abilities, k, v.color, layer)
  797.                     layer = layer + 1
  798.                 end
  799.             end
  800.             barCount = barCount + 1
  801.         end
  802.     else
  803.         for k,v in pairs(self.db.char.bars.abilities) do
  804.             if v.show then
  805.                 SquawkAndAwe:SetBarFrame(k, barCount, SquawkAndAwe.combat.abilities[k].id)
  806.                 if v.dur then
  807.                     SquawkAndAwe:AddStatusBar(self.frames[k], k.."Dur", v.color, 2)
  808.                     SquawkAndAwe:AddStatusBar(self.frames[k], k, self.db.char.bars.cdcolor, 1)
  809.                 else
  810.                     SquawkAndAwe:AddStatusBar(self.frames[k], k, v.color, 1)
  811.                 end
  812.                 barCount = barCount + 1
  813.             end
  814.         end
  815.     end
  816.  
  817.     -- GCD Bar
  818.     if self.db.char.bars.GCD.show then
  819.         SquawkAndAwe:SetBarFrame("GCD", barCount)
  820.         SquawkAndAwe:AddStatusBar(self.frames["GCD"], "GCD", self.db.char.bars.GCD.color, 1)
  821.     end
  822. end
  823.  
  824. -- Can't destroy frames, so we have to reuse them
  825. function SquawkAndAwe:GetNextBarFrame()
  826.     barFrameIndex = barFrameIndex + 1
  827.  
  828.     -- Grab a frame from storage
  829.     newFrame = SquawkAndAwe.barFrames[barFrameIndex]
  830.     if newFrame then
  831.         return newFrame
  832.     end
  833.  
  834.     -- If it wasn't there, create a new one and put it in storage
  835.     newFrame = CreateFrame("Frame", "SAABarFrame"..barFrameIndex, SquawkAndAwe.BaseFrame)
  836.     SquawkAndAwe.barFrames[barFrameIndex] = newFrame
  837.     return newFrame
  838. end
  839.  
  840. -- Sets up the bar frame, given its offset in number of bars from the top
  841. function SquawkAndAwe:SetBarFrame(frameName, frameOffset, spellID)
  842.     local newFrame  = SquawkAndAwe:GetNextBarFrame()
  843.  
  844.     -- Set up the frame
  845.     newFrame:SetFrameStrata("LOW")
  846.     newFrame:SetWidth(self.db.char.fWidth)
  847.     newFrame:SetHeight(self.db.char.barHeight)
  848.     newFrame:ClearAllPoints()
  849.     newFrame:SetPoint("TOPRIGHT", self.BaseFrame, "TOPRIGHT", 0, frameOffset * self.db.char.barHeight * -1 - 3)
  850.     newFrame:SetBackdrop(self.barBackdrop);
  851.     newFrame:SetBackdropColor(0, 0, 0, 0.2);
  852.     newFrame:SetBackdropBorderColor( 1, 1, 1, 1);
  853.     newFrame:EnableMouse(false)
  854.  
  855.     -- Set up the icon
  856.     local _, icon
  857.     -- Create frame
  858.     if not newFrame.icon then
  859.         newFrame.icon = CreateFrame("Frame", "SAA_"..frameName.."Icon", newFrame)
  860.     end
  861.  
  862.     -- Sizing and placement
  863.     newFrame.icon:SetWidth(self.db.char.barHeight)
  864.     newFrame.icon:SetHeight(self.db.char.barHeight)
  865.     newFrame.icon:SetPoint("RIGHT", newFrame, "LEFT", -3, 0)
  866.  
  867.     -- If we were given a spell, apply the icon
  868.     if spellID then
  869.         _, _, icon = GetSpellInfo(spellID)
  870.         newFrame.icon:SetBackdrop({bgFile = icon})
  871.     end
  872.     if self.db.char.icons then
  873.         newFrame.icon:Show()
  874.     else
  875.         newFrame.icon:Hide()
  876.     end
  877.  
  878.     -- Set up the text
  879.     -- Create the text overlay
  880.     if not newFrame.text then
  881.         newFrame.text = newFrame:CreateFontString(nil,"OVERLAY")
  882.     end
  883.  
  884.     -- Apply font
  885.     local barfont = media:Fetch("font", self.db.char.barfont)
  886.     newFrame.text:SetFont(barfont, self.db.char.barfontsize)
  887.     newFrame.text:SetTextColor(1, 1, 1, 1)
  888.  
  889.     -- Place text overlay
  890.     newFrame.text:ClearAllPoints()
  891.     if self.db.char.icons then
  892.         newFrame.text:SetPoint("LEFT", newFrame.icon, "RIGHT", 9, 0)
  893.     else
  894.         newFrame.text:SetPoint("LEFT", newFrame, "LEFT", 6, 0)
  895.     end
  896.  
  897.     -- Clear text
  898.     newFrame.text:SetText("")
  899.  
  900.     -- Set update script
  901.     newFrame:SetScript("OnUpdate",
  902.         function()
  903.             OnUpdate();
  904.         end );
  905.  
  906.     -- Hide the frame
  907.     newFrame:Hide()
  908.  
  909.     -- Add it to frame array
  910.     self.frames[frameName] = newFrame
  911. end
  912.  
  913. -- Can't destroy frames, so we have to reuse them
  914. function SquawkAndAwe:GetNextStatusBar()
  915.     statusbarIndex = statusbarIndex + 1
  916.  
  917.     -- Grab a frame from storage
  918.     newFrame = SquawkAndAwe.statusBars[statusbarIndex]
  919.     if newFrame then
  920.         return newFrame
  921.     end
  922.  
  923.     -- If it wasn't there, create a new one and put it in storage
  924.     newFrame = CreateFrame("StatusBar", "SAA_Statusbar"..statusbarIndex, SquawkAndAwe.BaseFrame)
  925.     SquawkAndAwe.statusBars[statusbarIndex] = newFrame
  926.     return newFrame
  927. end
  928.  
  929. -- Adds a status bar to a bar frame. If isTick is set, the bar is 1/3 height,
  930. -- and max/min values are changed
  931. function SquawkAndAwe:AddStatusBar(addToFrame, newFrameName, colors, frameLevel, isTick, tickDur)
  932.     statusbar = SquawkAndAwe:GetNextStatusBar()
  933.     statusbar:SetParent(addToFrame)
  934.  
  935.     statusbar:SetFrameLevel(frameLevel)
  936.     statusbar:ClearAllPoints()
  937.     statusbar:SetHeight((self.db.char.barHeight - 6) / (isTick and 3 or 1))
  938.     statusbar:SetWidth(self.db.char.fWidth - 6)
  939.     statusbar:SetPoint("BOTTOMRIGHT", addToFrame, "BOTTOMRIGHT", -3, 3)
  940.     statusbar:SetStatusBarTexture(media:Fetch("statusbar", self.db.char.texture))
  941.     statusbar:SetStatusBarColor(colors.r, colors.g, colors.b, colors.a)
  942.     if isTick then
  943.         statusbar:SetMinMaxValues(0,tickDur)
  944.         statusbar:SetValue(tickDur / 2)
  945.     -- Special case for GCD bar
  946.     elseif newFrameName == "GCD" then
  947.         statusbar:SetMinMaxValues(0,1.5)
  948.         statusbar:SetValue(.75)
  949.     else
  950.         statusbar:SetMinMaxValues(0, self.db.char.bars.MaxLen)
  951.         statusbar:SetValue(15)
  952.     end
  953.  
  954.     -- Add the spark
  955.     if not statusbar.spark then
  956.         statusbar.spark = statusbar:CreateTexture(nil, "OVERLAY")
  957.     end
  958.     statusbar.spark:SetTexture("Interface\\CastingBar\\UI-CastingBar-Spark")
  959.     statusbar.spark:SetWidth(16)
  960.     statusbar.spark:SetHeight(self.db.char.barHeight + 10)
  961.     statusbar.spark:SetBlendMode("ADD")
  962.     statusbar.spark:SetPoint("CENTER", statusbar, "LEFT",(self.db.char.fWidth - 6)* 15/self.db.char.bars.MaxLen, -1)
  963.  
  964.     -- Hide it for ticks
  965.     if istick then
  966.         statusbar.spark:Show()
  967.     else
  968.         statusbar.spark:Hide()
  969.     end
  970.  
  971.     addToFrame[newFrameName] = statusbar
  972. end
  973.  
  974. -- Resets bars to center of screen
  975. function SquawkAndAwe:ResetBars()
  976.     self.BaseFrame:ClearAllPoints()
  977.     self.db.char.point          = defaults.char.point
  978.     self.db.char.relativeTo     = defaults.char.relativeTo
  979.     self.db.char.relativePoint  = defaults.char.relativePoint
  980.     self.db.char.xOffset        = defaults.char.xOffset
  981.     self.db.char.yOffset        = defaults.char.yOffset
  982.     self.db.char.fWidth         = defaults.char.fWidth
  983.     self.db.char.barHeight      = defaults.char.barHeight
  984.     self.db.char.scale          = defaults.char.scale
  985.     self.db.char.barfont        = defaults.char.barfont
  986.     self.db.char.barfontsize    = defaults.char.barfontsize
  987.     self.db.char.bartexture     = defaults.char.bartexture
  988.     self.db.char.texture        = defaults.char.texture
  989.     barshow = true
  990.     self.BaseFrame:SetPoint(self.db.char.point, self.db.char.relativeTo, self.db.char.relativePoint, self.db.char.xOffset, self.db.char.yOffset)
  991.     self:RedrawFrames()
  992.     self.db.char.barshow = true -- so that call to ShowHideBars resets to false
  993.     self:ShowHideBars()
  994. end
  995.  
  996. -- Handles activating Trinket bars
  997. function SquawkAndAwe:TrinketBars(k, v)
  998.     -- Trinket 1 already active, move to 2
  999.     if SquawkAndAwe.actives.trinkets.Trinket1 then
  1000.         SquawkAndAwe.actives.trinkets.Trinket2 = true
  1001.         SquawkAndAwe.activeTrinketNames.Trinket2 = k
  1002.         if v.cd and self.db.char.bars.trinketcd then
  1003.             SquawkAndAwe.times.Trinket2CD = GetTime() + v.cd
  1004.         end
  1005.         if self.db.char.bars.mergetrinkets then
  1006.             self.frames.Trinkets.Trinket2:SetStatusBarColor(v.color.r, v.color.g, v.color.b, v.color.a)
  1007.             self.frames.Trinkets.Trinket2:Show()
  1008.             -- Must set icon in OnUpdate(). Lowest duration trinket effect is not immutable
  1009.         else
  1010.             self.frames.Trinket2.Trinket2:SetStatusBarColor(v.color.r, v.color.g, v.color.b, v.color.a)
  1011.             if self.db.char.icons then
  1012.                 _,_,icon = GetSpellInfo(v.id)
  1013.                 self.frames.Trinket2.icon:SetBackdrop({bgFile = icon})
  1014.             end
  1015.             self.frames.Trinket2:Show()
  1016.         end
  1017.     else
  1018.         SquawkAndAwe.actives.trinkets.Trinket1 = true
  1019.         SquawkAndAwe.activeTrinketNames.Trinket1 = k
  1020.         if v.cd and self.db.char.bars.trinketcd then
  1021.             SquawkAndAwe.times.Trinket1CD = GetTime() + v.cd
  1022.         end
  1023.         if self.db.char.bars.mergetrinkets then
  1024.             self.frames.Trinkets.Trinket1:SetStatusBarColor(v.color.r, v.color.g, v.color.b, v.color.a)
  1025.             self.frames.Trinkets:Show()
  1026.             self.frames.Trinkets.Trinket2:Hide()
  1027.         else
  1028.             if self.db.char.bars.trinketcd then
  1029.                 SquawkAndAwe.actives.Trinket1CD = true
  1030.             end
  1031.             self.frames.Trinket1.Trinket1:SetStatusBarColor(v.color.r, v.color.g, v.color.b, v.color.a)
  1032.             if self.db.char.icons then
  1033.                 _,_,icon = GetSpellInfo(v.id)
  1034.                 self.frames.Trinket1.icon:SetBackdrop({bgFile = icon})
  1035.             end
  1036.             self.frames.Trinket1:Show()
  1037.         end -- if mergetrinkets
  1038.     end -- if actives.Trinket1
  1039. end
  1040.  
  1041. -- Handles activating Proc bars
  1042. function SquawkAndAwe:ProcBars(k, v)
  1043.     local color
  1044.     -- Special handling for Wrath Eclipse
  1045.     if k == "Eclipsew" then
  1046.         if self.db.char.bars.procs.Eclipse.show or self.db.char.bars.procs.Eclipse.cd then
  1047.             if self.db.char.bars.procs.Eclipse.show then
  1048.                 color = self.db.char.bars.procs.Eclipse.wcolor
  1049.                 self.frames.Eclipse.Eclipse:SetStatusBarColor(color.r, color.g, color.b, color.a)
  1050.                 SquawkAndAwe.actives.procs.Eclipse = true
  1051.             end
  1052.             SquawkAndAwe.times.EclipseCD = GetTime() + v.cd
  1053.             if self.db.char.icons then
  1054.                 _,_,icon = GetSpellInfo(v.id)
  1055.                 self.frames.Eclipse.icon:SetBackdrop({bgFile = icon})
  1056.             end
  1057.             EclipseType = SquawkAndAwe.combat.Wrath.name
  1058.             self.frames.Eclipse:Show()
  1059.         end
  1060.     elseif self.db.char.bars.procs[k].show or self.db.char.bars.procs[k].cd then
  1061.         if v.id == SquawkAndAwe.combat.procs.Eclipse.id then
  1062.             EclipseType = SquawkAndAwe.combat.Starfire.name
  1063.         end
  1064.         if self.db.char.bars.procs[k].show then
  1065.             color = self.db.char.bars.procs[k].color
  1066.             self.frames[k][k]:SetStatusBarColor(color.r, color.g, color.b, color.a)
  1067.             SquawkAndAwe.actives.procs[k] = true
  1068.         end
  1069.         if v.cd then
  1070.             SquawkAndAwe.times[k.."CD"] = GetTime() + v.cd
  1071.         end
  1072.         if self.db.char.bars.procs[k].cd then
  1073.             SquawkAndAwe.actives[k.."CD"] = true
  1074.         end
  1075.         if self.db.char.icons then
  1076.             _,_,icon = GetSpellInfo(v.id)
  1077.             self.frames[k].icon:SetBackdrop({bgFile = icon})
  1078.         end
  1079.         self.frames[k]:Show()
  1080.     end -- if spellID == Wrath else if show
  1081. end
  1082.  
  1083. -- Handles activating Debuff bars
  1084. function SquawkAndAwe:DebuffBars(k, v, notick)
  1085.     if self.db.char.bars.debuffs[k].show then
  1086.         SquawkAndAwe.actives.debuffs[k] = true
  1087.         if self.db.char.bars.mergedebuffs then
  1088.             self.frames.Debuffs:Show()
  1089.         else
  1090.             if self.db.char.bars.debuffs[k].tick and not notick then
  1091.                 SquawkAndAwe.times[k.."Tick"] = GetTime() + v.tick
  1092.                 SquawkAndAwe.actives[k.."Tick"] = true
  1093.             end
  1094.             self.frames[k]:Show()
  1095.         end
  1096.     end -- if v.show
  1097. end
  1098.  
  1099. function SquawkAndAwe:TriggerDebuffs()
  1100.     for k,v in pairs(SquawkAndAwe.combat.debuffs) do
  1101.         if SquawkAndAwe.db.char.bars.debuffs[k].show then
  1102.             SquawkAndAwe:DebuffBars(k, v, true)
  1103.         end
  1104.     end
  1105. end
  1106.  
  1107. -- Handles activting CC bars
  1108. function SquawkAndAwe:CCBars(k)
  1109.     if self.db.char.bars.cc[k].show then
  1110.         SquawkAndAwe.actives.cc[k] = true
  1111.         if self.db.char.bars.mergecc then
  1112.             self.frames.CC:Show()
  1113.         else
  1114.             self.frames[k]:Show()
  1115.         end
  1116.     end
  1117. end
  1118.  
  1119. function SquawkAndAwe:TriggerCC()
  1120.     for k,v in pairs(SquawkAndAwe.combat.cc) do
  1121.         if SquawkAndAwe.db.char.bars.cc[k].show then
  1122.             SquawkAndAwe:CCBars(k)
  1123.         end
  1124.     end
  1125. end
  1126.  
  1127. -- Handles activating Ability bars
  1128. function SquawkAndAwe:AbilityBars(k, v)
  1129.     if self.db.char.bars.abilities[k].show then
  1130.         SquawkAndAwe.actives.abilities[k] = true
  1131.         if self.db.char.bars.mergeabilities then
  1132.             self.frames.Abilities:Show()
  1133.         else
  1134.             if self.db.char.bars.abilities[k].dur then
  1135.                 if v.dur then
  1136.                     SquawkAndAwe.times[k.."Dur"] = GetTime() + v.dur
  1137.                 end
  1138.             end
  1139.             self.frames[k]:Show()
  1140.         end
  1141.     end
  1142. end
  1143.  
  1144. -- Handles activating the GCD bar
  1145. function SquawkAndAwe:GCDBar()
  1146.     local startTime, duration, enabled = GetSpellCooldown(SquawkAndAwe.combat.Moonglade.name) -- TM chosen because it has no other cooldown and all druids will have it
  1147.     if duration > 0 then
  1148.         self.frames["GCD"]:Show()
  1149.         SquawkAndAwe.actives.GCD = true
  1150.     end
  1151. end
  1152.  
  1153. function SquawkAndAwe:DurationString(duration)
  1154.     local string = (("%1.1f"):format(duration % 60)) .. "s";
  1155.  
  1156.     if (duration >= 60) then
  1157.         duration = floor(duration - (duration % 60)) / 60; -- minutes
  1158.  
  1159.         string = (duration % 60) .."m " .. string;
  1160.  
  1161.         if (duration >= 60) then
  1162.             duration = (duration - (duration % 60)) / 60; -- hours
  1163.             string = duration .. "h " .. string;
  1164.         end
  1165.     end
  1166.     return string
  1167. end
  1168.  
  1169. -- Sorts two arrays by the values in one array. Nominally, sorts keys by
  1170. -- duration, descending. i.e. after sort, keys[0] will be the last to drop
  1171. function SquawkAndAwe:SortByDuration(keys, durs)
  1172.     local i,v
  1173.     local swap = true
  1174.  
  1175.     while swap do
  1176.         swap = false
  1177.         for i,v in ipairs(durs) do
  1178.             if durs[i + 1] and v < durs[i + 1] then
  1179.                 durs[i + 1], durs[i] = durs[i], durs[i + 1]
  1180.                 keys[i + 1], keys[i] = keys[i], keys[i + 1]
  1181.                 swap = true
  1182.             end
  1183.         end
  1184.     end
  1185.  
  1186.     return keys, durs
  1187. end
  1188.  
  1189. function OnUpdate()
  1190.     local width = SquawkAndAwe.db.char.fWidth - 6
  1191.     local sparkscale = width / SquawkAndAwe.db.char.bars.MaxLen
  1192.     local timeLeft = 0
  1193.     local namestring = ""
  1194.     local durstring = ""
  1195.     local k,v,i,_,icon
  1196.     local sort = {}
  1197.     local durs = {}
  1198.  
  1199.     -- Handle Trinket updates
  1200.     if SquawkAndAwe.db.char.bars.trinketshow then
  1201.         if SquawkAndAwe.db.char.bars.mergetrinkets then
  1202.             namestring = ""
  1203.             durstring = ""
  1204.             i = 1
  1205.             if SquawkAndAwe.actives.trinkets.Trinket1 then
  1206.                 sort[i] = "Trinket1"
  1207.                 if SquawkAndAwe.db.char.bars.trinketcd then
  1208.                     if SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames.Trinket1].cd then
  1209.                         durs[i] = SquawkAndAwe.times.Trinket1CD - GetTime()
  1210.                     else
  1211.                         durs[i] = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames.Trinket1].itemname, "item") - GetTime()
  1212.                     end
  1213.                 else
  1214.                     durs[i] = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames.Trinket1].name, "buff") - GetTime()
  1215.                 end
  1216.                 if durs[i] < 0 then
  1217.                     SquawkAndAwe.actives.trinkets.Trinket1 = false
  1218.                     SquawkAndAwe.frames.Trinkets.Trinket1:Hide()
  1219.                     SquawkAndAwe.frames.Trinkets.Trinket1.spark:Hide()
  1220.                 else
  1221.                     i = i + 1
  1222.                     SquawkAndAwe.frames.Trinkets.Trinket1:Show()
  1223.                     SquawkAndAwe.frames.Trinkets.Trinket1.spark:Show()
  1224.                 end
  1225.             end
  1226.             if SquawkAndAwe.actives.trinkets.Trinket2 then
  1227.                 sort[i] = "Trinket2"
  1228.                 if SquawkAndAwe.db.char.bars.trinketcd then
  1229.                     if SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames.Trinket2].cd then
  1230.                         durs[i] = SquawkAndAwe.times.Trinket2CD - GetTime()
  1231.                     else
  1232.                         durs[i] = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames.Trinket2].itemname, "item") - GetTime()
  1233.                     end
  1234.                 else
  1235.                     durs[i] = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames.Trinket2].name, "buff") - GetTime()
  1236.                 end
  1237.                 if durs[i] < 0 then
  1238.                     SquawkAndAwe.actives.trinkets.Trinket2 = false
  1239.                     SquawkAndAwe.frames.Trinkets.Trinket2:Hide()
  1240.                     SquawkAndAwe.frames.Trinkets.Trinket2.spark:Hide()
  1241.                 else
  1242.                     i = i + 1
  1243.                     SquawkAndAwe.frames.Trinkets.Trinket2:Show()
  1244.                     SquawkAndAwe.frames.Trinkets.Trinket2.spark:Show()
  1245.                 end
  1246.             end
  1247.             if i > 1 then
  1248.                 sort, durs = SquawkAndAwe:SortByDuration(sort, durs)
  1249.                 if SquawkAndAwe.db.char.icons then
  1250.                     _,_,icon = GetSpellInfo(SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames[sort[i-1]]].id)
  1251.                     SquawkAndAwe.frames.Trinkets.icon:SetBackdrop({bgFile = icon})
  1252.                     SquawkAndAwe.frames.Trinkets.icon:Show()
  1253.                 end
  1254.                 if SquawkAndAwe.db.char.spellnames then
  1255.                     namestring = SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames[sort[i-1]]].itemname..(SquawkAndAwe.db.char.bars.trinketcd and " "..L["Cooldown"] or "")..(SquawkAndAwe.db.char.durations and ": " or "")
  1256.                 end
  1257.                 if SquawkAndAwe.db.char.durations then
  1258.                     durstring = SquawkAndAwe:DurationString(durs[i-1])
  1259.                 end
  1260.                 if SquawkAndAwe.db.char.barstext then
  1261.                     SquawkAndAwe.frames.Trinkets.text:SetText(namestring..durstring)
  1262.                 end
  1263.                 while i > 1 do
  1264.                     i = i - 1
  1265.                     k = sort[i]
  1266.                     SquawkAndAwe.frames.Trinkets[k]:SetFrameLevel(i)
  1267.                     timeLeft = math.min(durs[i], SquawkAndAwe.db.char.bars.MaxLen)
  1268.                     SquawkAndAwe.frames.Trinkets[k]:SetValue(timeLeft)
  1269.                     SquawkAndAwe.frames.Trinkets[k].spark:SetPoint("CENTER", SquawkAndAwe.frames.Trinkets[k], "LEFT", timeLeft * sparkscale, 0)
  1270.                     SquawkAndAwe.frames.Trinkets[k].spark:Show()
  1271.                 end
  1272.             elseif not SquawkAndAwe.db.char.barshow then
  1273.                 SquawkAndAwe.frames.Trinkets:Hide()
  1274.             end
  1275.         else
  1276.             for k,v in pairs(SquawkAndAwe.actives.trinkets) do
  1277.                 namestring = ""
  1278.                 durstring = ""
  1279.                 if v then
  1280.                     if SquawkAndAwe.db.char.bars.trinketcd then
  1281.                         if SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames[k]].cd then
  1282.                             timeLeft = SquawkAndAwe.times[k.."CD"] - GetTime()
  1283.                         else
  1284.                             timeLeft = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames[k]].itemname, "item") - GetTime()
  1285.                         end
  1286.                         if timeLeft < 0 then
  1287.                             SquawkAndAwe.actives.trinkets[k] = false
  1288.                             SquawkAndAwe.frames[k]:Hide()
  1289.                             SquawkAndAwe.frames[k].text:SetText("")
  1290.                         else
  1291.                             if SquawkAndAwe.db.char.spellnames then
  1292.                                 namestring = SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames[k]].itemname.." "..L["Cooldown"]..(SquawkAndAwe.db.char.durations and ": " or "")
  1293.                             end
  1294.                             if SquawkAndAwe.db.char.durations then durstring = SquawkAndAwe:DurationString(timeLeft) end
  1295.                             timeLeft = math.min(timeLeft, SquawkAndAwe.db.char.bars.MaxLen)
  1296.                             SquawkAndAwe.frames[k][k.."CD"]:SetValue(timeLeft)
  1297.                             SquawkAndAwe.frames[k][k.."CD"].spark:SetPoint("CENTER", SquawkAndAwe.frames[k][k.."CD"], "LEFT", timeLeft * sparkscale, 0)
  1298.                             SquawkAndAwe.frames[k][k.."CD"].spark:Show()
  1299.                             SquawkAndAwe.frames[k].text:SetText(namestring..durstring)
  1300.                         end
  1301.                     end
  1302.                     timeLeft = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames[k]].name, "buff") - GetTime()
  1303.                     if timeLeft > 0 then
  1304.                         if SquawkAndAwe.db.char.spellnames then
  1305.                             namestring = SquawkAndAwe.combat.trinkets[SquawkAndAwe.activeTrinketNames[k]].itemname..(SquawkAndAwe.db.char.durations and ": " or "")
  1306.                         end
  1307.                         if SquawkAndAwe.db.char.durations then durstring = SquawkAndAwe:DurationString(timeLeft) end
  1308.                         timeLeft = math.min(timeLeft, SquawkAndAwe.db.char.bars.MaxLen)
  1309.                         SquawkAndAwe.frames[k][k]:SetValue(timeLeft)
  1310.                         SquawkAndAwe.frames[k][k].spark:SetPoint("CENTER", SquawkAndAwe.frames[k][k], "LEFT", timeLeft * sparkscale, 0)
  1311.                         SquawkAndAwe.frames[k][k].spark:Show()
  1312.                         SquawkAndAwe.frames[k][k]:Show()
  1313.                         SquawkAndAwe.frames[k].text:SetText(namestring..durstring)
  1314.                     else
  1315.                         SquawkAndAwe.frames[k][k]:Hide()
  1316.                         if not SquawkAndAwe.db.char.bars.trinketcd then
  1317.                             SquawkAndAwe.actives.trinkets[k] = false
  1318.                             SquawkAndAwe.frames[k]:Hide()
  1319.                             SquawkAndAwe.frames[k].text:SetText("")
  1320.                         end
  1321.                     end
  1322.                 end
  1323.             end -- for k,v in trinkets
  1324.         end -- if mergetrinkets
  1325.     end -- if trinketshow
  1326.  
  1327.     -- Handle Proc updates
  1328.     for k,v in pairs(SquawkAndAwe.actives.procs) do
  1329.         namestring = ""
  1330.         durstring = ""
  1331.         if v and SquawkAndAwe.db.char.bars.procs[k].show then
  1332.             if SquawkAndAwe.db.char.bars.procs[k].cd then
  1333.                 timeLeft = SquawkAndAwe.times[k.."CD"] - GetTime()
  1334.                 if timeLeft < 0 then
  1335.                     SquawkAndAwe.actives.procs[k] = false
  1336.                     SquawkAndAwe.frames[k]:Hide()
  1337.                     SquawkAndAwe.frames[k].text:SetText("")
  1338.                 else
  1339.                     if SquawkAndAwe.db.char.spellnames then
  1340. --                      namestring = SquawkAndAwe.combat.procs[k].name..((SquawkAndAwe.db.char.eclipsetype and k == "Eclipse") and " ("..EclipseType..")" or "").." "..L["Cooldown"]..(SquawkAndAwe.db.char.durations and ": " or "")
  1341.                         namestring = ((k=="Eclipse" and "Eclipse") or SquawkAndAwe.combat.procs[k].name)..((SquawkAndAwe.db.char.eclipsetype and k == "Eclipse") and " ("..EclipseType..")" or "").." "..L["Cooldown"]..(SquawkAndAwe.db.char.durations and ": " or "")
  1342.                     end
  1343.                     if SquawkAndAwe.db.char.durations then durstring = SquawkAndAwe:DurationString(timeLeft) end
  1344.                     timeLeft = math.min(timeLeft, SquawkAndAwe.db.char.bars.MaxLen)
  1345.                     SquawkAndAwe.frames[k][k.."CD"]:SetValue(timeLeft)
  1346.                     SquawkAndAwe.frames[k][k.."CD"].spark:SetPoint("CENTER", SquawkAndAwe.frames[k][k.."CD"], "LEFT", timeLeft * sparkscale, 0)
  1347.                     SquawkAndAwe.frames[k][k.."CD"].spark:Show()
  1348.                     SquawkAndAwe.frames[k].text:SetText(namestring..durstring)
  1349.                 end
  1350.             end
  1351.             if SquawkAndAwe.db.char.bars.procs[k].show then
  1352.                 timeLeft = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.procs[k].name, "buff") - GetTime()
  1353.                 if timeLeft > 0 then
  1354.                         if SquawkAndAwe.db.char.spellnames then
  1355. --                      namestring = SquawkAndAwe.combat.procs[k].name..((SquawkAndAwe.db.char.eclipsetype and k == "Eclipse") and " ("..EclipseType..")" or "")..(SquawkAndAwe.db.char.durations and ": " or "")
  1356.                         namestring = ((k=="Eclipse" and "Eclipse") or SquawkAndAwe.combat.procs[k].name)..((SquawkAndAwe.db.char.eclipsetype and k == "Eclipse") and " ("..EclipseType..")" or "")..(SquawkAndAwe.db.char.durations and ": " or "")
  1357.                     end
  1358.                     if SquawkAndAwe.db.char.durations then durstring = SquawkAndAwe:DurationString(timeLeft) end
  1359.                     timeLeft = math.min(timeLeft, SquawkAndAwe.db.char.bars.MaxLen)
  1360.                     SquawkAndAwe.frames[k][k]:SetValue(timeLeft)
  1361.                     SquawkAndAwe.frames[k][k].spark:SetPoint("CENTER", SquawkAndAwe.frames[k][k], "LEFT", timeLeft * sparkscale, 0)
  1362.                     SquawkAndAwe.frames[k][k].spark:Show()
  1363.                     SquawkAndAwe.frames[k][k]:Show()
  1364.                     if SquawkAndAwe.db.char.bars.procs[k].flash then
  1365.                         UIFrameFlash(SquawkAndAwe.frames[k][k], 0.25, 0.25, 30, true, 0.25, 0.25)
  1366.                     end
  1367.                     SquawkAndAwe.frames[k].text:SetText(namestring..durstring)
  1368.                 else
  1369.                     if k == "Eclipse" then
  1370.                         if SquawkAndAwe.ActiveEclipseBuff then
  1371.                             SquawkAndAwe.ActiveEclipseBuff = false
  1372.                             UIFrameFlashRemoveFrame(SquawkAndAwe.frames.Eclipse.Eclipse)
  1373.                             SquawkAndAwe.frames.Eclipse.Eclipse:SetStatusBarColor(0.3, 0.3, 0.3, 0.9)
  1374.                         end
  1375.                         timeLeft = SquawkAndAwe.times.EclipseCD - GetTime() - 15
  1376.                         if timeLeft < 0 then
  1377.                             SquawkAndAwe.frames.Eclipse.Eclipse:Hide()
  1378.                         else
  1379.                             if SquawkAndAwe.db.char.spellnames then
  1380. --                              local typestring = SquawkAndAwe.db.char.eclipsetype and " ("..(EclipseType == SquawkAndAwe.combat.Wrath.name and SquawkAndAwe.combat.Starfire.name or SquawkAndAwe.combat.Wrath.name)..")"
  1381. --                              namestring = SquawkAndAwe.combat.procs.Eclipse.name..(SquawkAndAwe.db.char.eclipsetype and typestring or "").." "..L["Cooldown"]..(SquawkAndAwe.db.char.durations and ": " or "")
  1382.                                 namestring = "Eclipse ("..EclipseType..")"..(SquawkAndAwe.db.char.durations and ": " or "")
  1383.                             end
  1384.                             if SquawkAndAwe.db.char.durations then durstring = SquawkAndAwe:DurationString(timeLeft) end
  1385.                             timeLeft = math.min(timeLeft, SquawkAndAwe.db.char.bars.MaxLen)
  1386.                             SquawkAndAwe.frames.Eclipse.Eclipse:SetValue(timeLeft)
  1387.                             SquawkAndAwe.frames.Eclipse.Eclipse.spark:SetPoint("CENTER", SquawkAndAwe.frames[k][k.."CD"], "LEFT", timeLeft * sparkscale, 0)
  1388.                             SquawkAndAwe.frames.Eclipse.Eclipse.spark:Show()
  1389.                             SquawkAndAwe.frames.Eclipse.text:SetText(namestring..durstring)
  1390.                         end
  1391.                     else
  1392.                         SquawkAndAwe.frames[k][k]:Hide()
  1393.                         UIFrameFlashRemoveFrame(SquawkAndAwe.frames[k][k])
  1394.                         if not SquawkAndAwe.db.char.bars.procs[k].cd then
  1395.                             SquawkAndAwe.actives.procs[k] = false
  1396.                             SquawkAndAwe.frames[k]:Hide()
  1397.                             SquawkAndAwe.frames[k].text:SetText("")
  1398.                         end
  1399.                     end
  1400.                 end
  1401.             end
  1402.         end
  1403.     end
  1404.  
  1405.     -- Handle Debuff updates
  1406.     if SquawkAndAwe.db.char.bars.mergedebuffs then
  1407.         namestring = ""
  1408.         durstring = ""
  1409.         i = 1
  1410.         -- Find out how many are active
  1411.         for k,v in pairs(SquawkAndAwe.db.char.bars.debuffs) do
  1412.             if v.show and SquawkAndAwe.actives.debuffs[k] then
  1413.                 sort[i] = k
  1414.                 durs[i] = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.debuffs[k].name, "debuff") - GetTime()
  1415.                 if durs[i] < 0 then
  1416.                     SquawkAndAwe.actives.debuffs[k] = false
  1417.                     SquawkAndAwe.frames.Debuffs[k]:Hide()
  1418.                     SquawkAndAwe.frames.Debuffs[k].spark:Hide()
  1419.                 else
  1420.                     i = i + 1
  1421.                     SquawkAndAwe.frames.Debuffs[k]:Show()
  1422.                     SquawkAndAwe.frames.Debuffs[k].spark:Show()
  1423.                 end
  1424.             elseif v.show and not SquawkAndAwe.db.char.barshow then
  1425.                 SquawkAndAwe.frames.Debuffs[k]:Hide()
  1426.                 SquawkAndAwe.frames.Debuffs[k].spark:Hide()
  1427.             end
  1428.         end
  1429.         if i > 1 then
  1430.             sort, durs = SquawkAndAwe:SortByDuration(sort, durs)
  1431.             if  SquawkAndAwe.db.char.icons then
  1432.                 _,_,icon = GetSpellInfo(SquawkAndAwe.combat.debuffs[sort[i-1]].id)
  1433.                 SquawkAndAwe.frames.Debuffs.icon:SetBackdrop({bgFile = icon})
  1434.                 SquawkAndAwe.frames.Debuffs.icon:Show()
  1435.             end
  1436.             if SquawkAndAwe.db.char.spellnames then
  1437.                 namestring = SquawkAndAwe.combat.debuffs[sort[i-1]].name..(SquawkAndAwe.db.char.durations and ": " or "")
  1438.             end
  1439.             if SquawkAndAwe.db.char.durations then
  1440.                 durstring = SquawkAndAwe:DurationString(durs[i-1])
  1441.             end
  1442.             if SquawkAndAwe.db.char.barstext then
  1443.                 SquawkAndAwe.frames.Debuffs.text:SetText(namestring..durstring)
  1444.             end
  1445.             while i > 1 do
  1446.                 i = i - 1
  1447.                 k = sort[i]
  1448.                 SquawkAndAwe.frames.Debuffs[k]:SetFrameLevel(i)
  1449.                 timeLeft = math.min(durs[i], SquawkAndAwe.db.char.bars.MaxLen)
  1450.                 SquawkAndAwe.frames.Debuffs[k]:SetValue(timeLeft)
  1451.                 SquawkAndAwe.frames.Debuffs[k].spark:SetPoint("CENTER", SquawkAndAwe.frames.Debuffs[k], "LEFT", timeLeft * sparkscale, 0)
  1452.                 SquawkAndAwe.frames.Debuffs[k].spark:Show()
  1453.             end
  1454.         elseif ((not SquawkAndAwe.db.char.barshow) and SquawkAndAwe.frames.Debuffs) then
  1455.             SquawkAndAwe.frames.Debuffs:Hide()
  1456.         end
  1457.     else
  1458.         for k,v in pairs(SquawkAndAwe.actives.debuffs) do
  1459.             namestring = ""
  1460.             durstring = ""
  1461.             if v then
  1462.                 timeLeft = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.debuffs[k].name, "debuff") - GetTime()
  1463.                 if (timeLeft < 0) then
  1464.                     SquawkAndAwe.actives.debuffs[k] = false
  1465.                     SquawkAndAwe.frames[k]:Hide()
  1466.                     SquawkAndAwe.frames[k].text:SetText("")
  1467.                 else
  1468.                     if SquawkAndAwe.db.char.spellnames then
  1469.                         namestring = SquawkAndAwe.combat.debuffs[k].name
  1470.                         if k == "Moonfire" and SquawkAndAwe.db.char.sfcomboshow then
  1471.                             -- We set LastMF to 0 when we activate the bar.
  1472.                             if ((not (LastMF == 0)) and timeLeft > LastMF) then
  1473.                                 SFCombos = SFCombos + 1
  1474.                             end
  1475.                             LastMF = timeLeft
  1476.                             namestring = namestring.." ("..SFCombos..")"
  1477.                         end
  1478.                         if SquawkAndAwe.db.char.durations then namestring = namestring..": " end
  1479.                     end
  1480.                     if SquawkAndAwe.db.char.durations then  durstring = SquawkAndAwe:DurationString(timeLeft) end
  1481.                     if SquawkAndAwe.db.char.barstext then SquawkAndAwe.frames[k].text:SetText(namestring..durstring)end
  1482.                     timeLeft = math.min(timeLeft, SquawkAndAwe.db.char.bars.MaxLen)
  1483.                     SquawkAndAwe.frames[k][k]:SetValue(timeLeft)
  1484.                     SquawkAndAwe.frames[k][k].spark:SetPoint("CENTER", SquawkAndAwe.frames[k][k], "LEFT", timeLeft * sparkscale, 0)
  1485.                     SquawkAndAwe.frames[k][k].spark:Show()
  1486.                     if SquawkAndAwe.db.char.bars.debuffs[k].tick then
  1487.                         timeLeft = SquawkAndAwe.times[k.."Tick"] - GetTime()
  1488.                         if timeLeft < 0 then
  1489.                             SquawkAndAwe.frames[k][k.."Tick"]:Hide()
  1490.                         else
  1491.                             timeLeft = math.min(timeLeft, SquawkAndAwe.db.char.bars.MaxLen)
  1492.                             SquawkAndAwe.frames[k][k.."Tick"]:Show()
  1493.                             SquawkAndAwe.frames[k][k.."Tick"]:SetValue(timeLeft)
  1494.                             SquawkAndAwe.frames[k][k.."Tick"].spark:SetPoint("CENTER", SquawkAndAwe.frames[k][k.."Tick"], "LEFT", timeLeft * SquawkAndAwe.db.char.fWidth / 1.5 + 1, -1)
  1495.                         end
  1496.                     end
  1497.                 end
  1498.             end
  1499.         end
  1500.     end
  1501.  
  1502.     -- Handle CC updates
  1503.     if SquawkAndAwe.db.char.bars.mergecc then
  1504.         namestring = ""
  1505.         durstring = ""
  1506.         i = 1
  1507.         -- Find out how many are active
  1508.         for k,v in pairs(SquawkAndAwe.db.char.bars.cc) do
  1509.             if v.show and SquawkAndAwe.actives.cc[k] then
  1510.                 sort[i] = k
  1511.                 durs[i] = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.cc[k].name, "cc") - GetTime()
  1512.                 if durs[i] < 0 then
  1513.                     SquawkAndAwe.actives.cc[k] = false
  1514.                     SquawkAndAwe.frames.CC[k]:Hide()
  1515.                     SquawkAndAwe.frames.CC[k].spark:Hide()
  1516.                 else
  1517.                     i = i + 1
  1518.                     SquawkAndAwe.frames.CC[k]:Show()
  1519.                     SquawkAndAwe.frames.CC[k].spark:Show()
  1520.                 end
  1521.             elseif v.show and not SquawkAndAwe.db.char.barshow then
  1522.                 SquawkAndAwe.frames.CC[k]:Hide()
  1523.                 SquawkAndAwe.frames.CC[k].spark:Hide()
  1524.             end
  1525.         end
  1526.         if i > 1 then
  1527.             sort, durs = SquawkAndAwe:SortByDuration(sort, durs)
  1528.             if SquawkAndAwe.db.char.icons then
  1529.                 _,_,icon = GetSpellInfo(SquawkAndAwe.combat.cc[sort[i-1] ].id)
  1530.                 SquawkAndAwe.frames.CC.icon:SetBackdrop({bgFile = icon})
  1531.                 SquawkAndAwe.frames.CC.icon:Show()
  1532.             end
  1533.             if SquawkAndAwe.db.char.spellnames then
  1534.                 namestring = SquawkAndAwe.combat.cc[sort[i-1] ].name..(SquawkAndAwe.db.char.durations and ": " or "")
  1535.             end
  1536.             if SquawkAndAwe.db.char.durations then
  1537.                 durstring = SquawkAndAwe:DurationString(durs[i-1])
  1538.             end
  1539.             if SquawkAndAwe.db.char.barstext then
  1540.                 SquawkAndAwe.frames.CC.text:SetText(namestring..durstring)
  1541.             end
  1542.             while i > 1 do
  1543.                 i = i - 1
  1544.                 k = sort[i]
  1545.                 SquawkAndAwe.frames.CC[k]:SetFrameLevel(i)
  1546.                 timeLeft = math.min(durs[i], SquawkAndAwe.db.char.bars.MaxLen)
  1547.                 SquawkAndAwe.frames.CC[k]:SetValue(timeLeft)
  1548.                 SquawkAndAwe.frames.CC[k].spark:SetPoint("CENTER", SquawkAndAwe.frames.CC[k], "LEFT", timeLeft * sparkscale, 0)
  1549.                 SquawkAndAwe.frames.CC[k].spark:Show()
  1550.             end
  1551.         elseif ((not SquawkAndAwe.db.char.barshow) and SquawkAndAwe.frames.CC) then
  1552.             SquawkAndAwe.frames.CC:Hide()
  1553.         end
  1554.     else
  1555.         for k,v in pairs(SquawkAndAwe.actives.cc) do
  1556.             namestring = ""
  1557.             durstring = ""
  1558.             if v then
  1559.                 timeLeft = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.cc[k].name, "cc") - GetTime()
  1560.                 if (timeLeft < 0) then
  1561.                     SquawkAndAwe.actives.cc[k] = false
  1562.                     SquawkAndAwe.frames[k]:Hide()
  1563.                     SquawkAndAwe.frames[k].text:SetText("")
  1564.                 else
  1565.                     if SquawkAndAwe.db.char.spellnames then
  1566.                         namestring = SquawkAndAwe.combat.cc[k].name
  1567.                         if SquawkAndAwe.db.char.durations then namestring = namestring..": " end
  1568.                     end
  1569.                     if SquawkAndAwe.db.char.durations then  durstring = SquawkAndAwe:DurationString(timeLeft) end
  1570.                     if SquawkAndAwe.db.char.barstext then SquawkAndAwe.frames[k].text:SetText(namestring..durstring)end
  1571.                     timeLeft = math.min(timeLeft, SquawkAndAwe.db.char.bars.MaxLen)
  1572.                     SquawkAndAwe.frames[k][k]:SetValue(timeLeft)
  1573.                     SquawkAndAwe.frames[k][k].spark:SetPoint("CENTER", SquawkAndAwe.frames[k][k], "LEFT", timeLeft * sparkscale, 0)
  1574.                     SquawkAndAwe.frames[k][k].spark:Show()
  1575.                 end
  1576.             end
  1577.         end
  1578.     end
  1579.  
  1580.     -- Handle Ability updates
  1581.     if SquawkAndAwe.db.char.bars.mergeabilities then
  1582.         namestring = ""
  1583.         durstring = ""
  1584.         i = 1
  1585.        -- Find out how many are active
  1586.        for k,v in pairs(SquawkAndAwe.db.char.bars.abilities) do
  1587.             if v.show and SquawkAndAwe.actives.abilities[k] then
  1588.                 sort[i] = k
  1589.                 durs[i] = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.abilities[k].name, "cd") - GetTime()
  1590.                 if durs[i] < 0 then
  1591.                 SquawkAndAwe.actives.abilities[k] = false
  1592.                 SquawkAndAwe.frames.Abilities[k]:Hide()
  1593.                 SquawkAndAwe.frames.Abilities[k].spark:Hide()
  1594.                 else
  1595.                     i = i + 1
  1596.                     SquawkAndAwe.frames.Abilities[k]:Show()
  1597.                     SquawkAndAwe.frames.Abilities[k].spark:Show()
  1598.                 end
  1599.             elseif v.show and not SquawkAndAwe.db.char.barshow then
  1600.                 SquawkAndAwe.frames.Abilities[k]:Hide()
  1601.                 SquawkAndAwe.frames.Abilities[k].spark:Hide()
  1602.             end
  1603.         end
  1604.         if i > 1 then
  1605.             sort, durs = SquawkAndAwe:SortByDuration(sort, durs)
  1606.             if SquawkAndAwe.db.char.icons then
  1607.                 _,_,icon = GetSpellInfo(SquawkAndAwe.combat.abilities[sort[i-1]].id)
  1608.                 SquawkAndAwe.frames.Abilities.icon:SetBackdrop({bgFile = icon})
  1609.                 SquawkAndAwe.frames.Abilities.icon:Show()
  1610.             end
  1611.             if SquawkAndAwe.db.char.spellnames then
  1612.                 namestring = SquawkAndAwe.combat.abilities[sort[i-1]].name..(SquawkAndAwe.db.char.durations and ": " or "")
  1613.             end
  1614.             if SquawkAndAwe.db.char.durations then
  1615.                 durstring = SquawkAndAwe:DurationString(durs[i-1])
  1616.             end
  1617.             if SquawkAndAwe.db.char.barstext then
  1618.                 SquawkAndAwe.frames.Abilities.text:SetText(namestring..durstring)
  1619.             end
  1620.             while i > 1 do
  1621.                 i = i - 1
  1622.                 k = sort[i]
  1623.                 SquawkAndAwe.frames.Abilities[k]:SetFrameLevel(i)
  1624.                 timeLeft = math.min(durs[i], SquawkAndAwe.db.char.bars.MaxLen)
  1625.                 SquawkAndAwe.frames.Abilities[k]:SetValue(timeLeft)
  1626.                 SquawkAndAwe.frames.Abilities[k].spark:SetPoint("CENTER", SquawkAndAwe.frames.Abilities[k], "LEFT", timeLeft * sparkscale, 0)
  1627.                 SquawkAndAwe.frames.Abilities[k].spark:Show()
  1628.             end
  1629.         elseif ((not SquawkAndAwe.db.char.barshow) and SquawkAndAwe.frames.Abilities) then
  1630.             SquawkAndAwe.frames.Abilities:Hide()
  1631.         end
  1632.     else
  1633.         for k,v in pairs(SquawkAndAwe.actives.abilities) do
  1634.             namestring = ""
  1635.             durstring = ""
  1636.             if v then
  1637.                 timeLeft = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.abilities[k].name, "cd") - GetTime()
  1638.                 if (timeLeft < 0) then
  1639.                     SquawkAndAwe.actives.abilities[k] = false
  1640.                     SquawkAndAwe.frames[k]:Hide()
  1641.                     SquawkAndAwe.frames[k].text:SetText("")
  1642.                 else
  1643.                     if SquawkAndAwe.db.char.spellnames then
  1644.                         namestring = SquawkAndAwe.combat.abilities[k].name.." "..L["Cooldown"]
  1645.                         if SquawkAndAwe.db.char.durations then namestring = namestring..": " end
  1646.                     end
  1647.                     if SquawkAndAwe.db.char.durations then  durstring = SquawkAndAwe:DurationString(timeLeft) end
  1648.                     timeLeft = math.min(timeLeft, SquawkAndAwe.db.char.bars.MaxLen)
  1649.                     SquawkAndAwe.frames[k][k]:SetValue(timeLeft)
  1650.                     SquawkAndAwe.frames[k][k].spark:SetPoint("CENTER", SquawkAndAwe.frames[k][k], "LEFT", timeLeft * sparkscale, 0)
  1651.                     SquawkAndAwe.frames[k][k].spark:Show()
  1652.                     if SquawkAndAwe.db.char.bars.abilities[k].dur then
  1653.                         if SquawkAndAwe.combat.abilities[k].dur then
  1654.                             timeLeft = SquawkAndAwe.times[k.."Dur"] - GetTime()
  1655.                         else
  1656.                             timeLeft = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.abilities[k].name, "buff") - GetTime()
  1657.                         end
  1658.                         if SquawkAndAwe.db.char.spellnames and timeLeft > 0 then
  1659.                                 namestring = SquawkAndAwe.combat.abilities[k].name
  1660.                                 if SquawkAndAwe.db.char.durations then namestring = namestring..": " end
  1661.                         end
  1662.                         if timeLeft < 0 then
  1663.                             SquawkAndAwe.frames[k][k.."Dur"]:Hide()
  1664.                         else
  1665.                             if SquawkAndAwe.db.char.durations then  durstring = SquawkAndAwe:DurationString(timeLeft) end
  1666.                             timeLeft = math.min(timeLeft, SquawkAndAwe.db.char.bars.MaxLen)
  1667.                             SquawkAndAwe.frames[k][k.."Dur"]:Show()
  1668.                             SquawkAndAwe.frames[k][k.."Dur"]:SetValue(timeLeft)
  1669.                             SquawkAndAwe.frames[k][k.."Dur"].spark:SetPoint("CENTER", SquawkAndAwe.frames[k][k.."Dur"], "LEFT", timeLeft * sparkscale, 0)
  1670.                             SquawkAndAwe.frames[k][k.."Dur"].spark:Show()
  1671.                         end
  1672.                     end
  1673.                     if SquawkAndAwe.db.char.barstext then SquawkAndAwe.frames[k].text:SetText(namestring..durstring)end
  1674.                 end
  1675.             end
  1676.         end
  1677.     end
  1678.  
  1679.     -- Handle GCD updates
  1680.     if SquawkAndAwe.actives.GCD then
  1681.         timeLeft = SquawkAndAwe:GetSpellInfo(SquawkAndAwe.combat.Moonglade.name, "cd") - GetTime()
  1682.         if timeLeft < 0 then
  1683.             SquawkAndAwe.actives.GCD = false
  1684.             SquawkAndAwe.frames.GCD:Hide()
  1685.         else
  1686.             SquawkAndAwe.frames.GCD.GCD:SetValue(timeLeft)
  1687.             SquawkAndAwe.frames.GCD.GCD.spark:SetPoint("CENTER",SquawkAndAwe.frames.GCD.GCD,"LEFT", timeLeft * width / 1.5, 0)
  1688.             SquawkAndAwe.frames.GCD.GCD.spark:Show()
  1689.         end
  1690.     end
  1691. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement