Advertisement
pr0fite

unitframes

Jun 17th, 2017
505
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 42.77 KB | None | 0 0
  1. local E, L, V, P, G = unpack(select(2, ...)); --Inport: Engine, Locales, PrivateDB, ProfileDB, GlobalDB
  2. local UF = E:NewModule('UnitFrames', 'AceTimer-3.0', 'AceEvent-3.0', 'AceHook-3.0');
  3. local LSM = LibStub("LibSharedMedia-3.0");
  4. UF.LSM = LSM
  5.  
  6. --Cache global variables
  7. --Lua functions
  8. local _G = _G
  9. local select, pairs, type, unpack, assert, tostring = select, pairs, type, unpack, assert, tostring
  10. local min = math.min
  11. local tinsert = table.insert
  12. local find, gsub, format = string.find, string.gsub, string.format
  13. --WoW API / Variables
  14. local hooksecurefunc = hooksecurefunc
  15. local CreateFrame = CreateFrame
  16. local IsAddOnLoaded = IsAddOnLoaded
  17. local UnitFrame_OnEnter = UnitFrame_OnEnter
  18. local UnitFrame_OnLeave = UnitFrame_OnLeave
  19. local IsInInstance = IsInInstance
  20. local InCombatLockdown = InCombatLockdown
  21. local CompactRaidFrameManager_GetSetting = CompactRaidFrameManager_GetSetting
  22. local CompactRaidFrameManager_SetSetting = CompactRaidFrameManager_SetSetting
  23. local GetInstanceInfo = GetInstanceInfo
  24. local UnregisterStateDriver = UnregisterStateDriver
  25. local RegisterStateDriver = RegisterStateDriver
  26. local UnregisterAttributeDriver = UnregisterAttributeDriver
  27. local CompactRaidFrameManager_UpdateShown = CompactRaidFrameManager_UpdateShown
  28. local CompactRaidFrameContainer = CompactRaidFrameContainer
  29. local MAX_RAID_MEMBERS = MAX_RAID_MEMBERS
  30. local MAX_BOSS_FRAMES = MAX_BOSS_FRAMES
  31.  
  32. --Global variables that we don't cache, list them here for mikk's FindGlobals script
  33. -- GLOBALS: UIParent, ElvCharacterDB, ElvUF_Parent, oUF_RaidDebuffs, CompactRaidFrameManager
  34. -- GLOBALS: PlayerFrame, RuneFrame, PetFrame, TargetFrame, ComboFrame, FocusFrame
  35. -- GLOBALS: FocusFrameToT, TargetFrameToT, CompactUnitFrameProfiles
  36.  
  37.  
  38. local _, ns = ...
  39. local ElvUF = ns.oUF
  40. assert(ElvUF, "ElvUI was unable to locate oUF.")
  41.  
  42. UF['headerstoload'] = {}
  43. UF['unitgroupstoload'] = {}
  44. UF['unitstoload'] = {}
  45.  
  46. UF['groupPrototype'] = {}
  47. UF['headerPrototype'] = {}
  48. UF['headers'] = {}
  49. UF['groupunits'] = {}
  50. UF['units'] = {}
  51.  
  52. UF['statusbars'] = {}
  53. UF['fontstrings'] = {}
  54. UF['badHeaderPoints'] = {
  55. ['TOP'] = 'BOTTOM',
  56. ['LEFT'] = 'RIGHT',
  57. ['BOTTOM'] = 'TOP',
  58. ['RIGHT'] = 'LEFT',
  59. }
  60.  
  61. UF["headerFunctions"] = {}
  62.  
  63. UF['classMaxResourceBar'] = {
  64. ['DEATHKNIGHT'] = 6,
  65. ['PALADIN'] = 5,
  66. ['WARLOCK'] = 5,
  67. ['MONK'] = 6,
  68. ['MAGE'] = 4,
  69. ['ROGUE'] = 10,
  70. ["DRUID"] = 5
  71. }
  72.  
  73. UF['mapIDs'] = {
  74. [30] = 40, -- Alterac Valley
  75. [489] = 10, -- Warsong Gulch
  76. [529] = 15, -- Arathi Basin
  77. [566] = 15, -- Eye of the Storm
  78. [607] = 15, -- Strand of the Ancients
  79. [628] = 40, -- Isle of Conquest
  80. [726] = 10, -- Twin Peaks
  81. [727] = 10, -- Silvershard mines
  82. [761] = 10, -- The Battle for Gilneas
  83. [968] = 10, -- Rated Eye of the Storm
  84. [998] = 10, -- Temple of Kotmogu
  85. [1105] = 15, -- Deepwind Gourge
  86. [1280] = 40, -- Southshore vs. Tarren Mill
  87. }
  88.  
  89. UF['headerGroupBy'] = {
  90. ['CLASS'] = function(header)
  91. header:SetAttribute("groupingOrder", "DEATHKNIGHT,DRUID,HUNTER,MAGE,PALADIN,PRIEST,SHAMAN,WARLOCK,WARRIOR,MONK")
  92. header:SetAttribute('sortMethod', 'NAME')
  93. header:SetAttribute("groupBy", 'CLASS')
  94. end,
  95. ['MTMA'] = function(header)
  96. header:SetAttribute("groupingOrder", "MAINTANK,MAINASSIST,NONE")
  97. header:SetAttribute('sortMethod', 'NAME')
  98. header:SetAttribute("groupBy", 'ROLE')
  99. end,
  100. ['ROLE'] = function(header)
  101. header:SetAttribute("groupingOrder", "TANK,HEALER,DAMAGER,NONE")
  102. header:SetAttribute('sortMethod', 'NAME')
  103. header:SetAttribute("groupBy", 'ASSIGNEDROLE')
  104. end,
  105. ['NAME'] = function(header)
  106. header:SetAttribute("groupingOrder", "1,2,3,4,5,6,7,8")
  107. header:SetAttribute('sortMethod', 'NAME')
  108. header:SetAttribute("groupBy", nil)
  109. end,
  110. ['GROUP'] = function(header)
  111. header:SetAttribute("groupingOrder", "1,2,3,4,5,6,7,8")
  112. header:SetAttribute('sortMethod', 'INDEX')
  113. header:SetAttribute("groupBy", 'GROUP')
  114. end,
  115. ['PETNAME'] = function(header)
  116. header:SetAttribute("groupingOrder", "1,2,3,4,5,6,7,8")
  117. header:SetAttribute('sortMethod', 'NAME')
  118. header:SetAttribute("groupBy", nil)
  119. header:SetAttribute("filterOnPet", true) --This is the line that matters. Without this, it sorts based on the owners name
  120. end,
  121. }
  122.  
  123. local POINT_COLUMN_ANCHOR_TO_DIRECTION = {
  124. ['TOPTOP'] = 'UP_RIGHT',
  125. ['BOTTOMBOTTOM'] = 'TOP_RIGHT',
  126. ['LEFTLEFT'] = 'RIGHT_UP',
  127. ['RIGHTRIGHT'] = 'LEFT_UP',
  128. ['RIGHTTOP'] = 'LEFT_DOWN',
  129. ['LEFTTOP'] = 'RIGHT_DOWN',
  130. ['LEFTBOTTOM'] = 'RIGHT_UP',
  131. ['RIGHTBOTTOM'] = 'LEFT_UP',
  132. ['BOTTOMRIGHT'] = 'UP_LEFT',
  133. ['BOTTOMLEFT'] = 'UP_RIGHT',
  134. ['TOPRIGHT'] = 'DOWN_LEFT',
  135. ['TOPLEFT'] = 'DOWN_RIGHT'
  136. }
  137.  
  138. local DIRECTION_TO_POINT = {
  139. DOWN_RIGHT = "TOP",
  140. DOWN_LEFT = "TOP",
  141. UP_RIGHT = "BOTTOM",
  142. UP_LEFT = "BOTTOM",
  143. RIGHT_DOWN = "LEFT",
  144. RIGHT_UP = "LEFT",
  145. LEFT_DOWN = "RIGHT",
  146. LEFT_UP = "RIGHT",
  147. UP = "BOTTOM",
  148. DOWN = "TOP"
  149. }
  150.  
  151. local DIRECTION_TO_GROUP_ANCHOR_POINT = {
  152. DOWN_RIGHT = "TOPLEFT",
  153. DOWN_LEFT = "TOPRIGHT",
  154. UP_RIGHT = "BOTTOMLEFT",
  155. UP_LEFT = "BOTTOMRIGHT",
  156. RIGHT_DOWN = "TOPLEFT",
  157. RIGHT_UP = "BOTTOMLEFT",
  158. LEFT_DOWN = "TOPRIGHT",
  159. LEFT_UP = "BOTTOMRIGHT",
  160. OUT_RIGHT_UP = "BOTTOM",
  161. OUT_LEFT_UP = "BOTTOM",
  162. OUT_RIGHT_DOWN = "TOP",
  163. OUT_LEFT_DOWN = "TOP",
  164. OUT_UP_RIGHT = "LEFT",
  165. OUT_UP_LEFT = "RIGHT",
  166. OUT_DOWN_RIGHT = "LEFT",
  167. OUT_DOWN_LEFT = "RIGHT",
  168. }
  169.  
  170. local INVERTED_DIRECTION_TO_COLUMN_ANCHOR_POINT = {
  171. DOWN_RIGHT = "RIGHT",
  172. DOWN_LEFT = "LEFT",
  173. UP_RIGHT = "RIGHT",
  174. UP_LEFT = "LEFT",
  175. RIGHT_DOWN = "BOTTOM",
  176. RIGHT_UP = "TOP",
  177. LEFT_DOWN = "BOTTOM",
  178. LEFT_UP = "TOP",
  179. UP = "TOP",
  180. DOWN = "BOTTOM"
  181. }
  182.  
  183. local DIRECTION_TO_COLUMN_ANCHOR_POINT = {
  184. DOWN_RIGHT = "LEFT",
  185. DOWN_LEFT = "RIGHT",
  186. UP_RIGHT = "LEFT",
  187. UP_LEFT = "RIGHT",
  188. RIGHT_DOWN = "TOP",
  189. RIGHT_UP = "BOTTOM",
  190. LEFT_DOWN = "TOP",
  191. LEFT_UP = "BOTTOM",
  192. }
  193.  
  194. local DIRECTION_TO_HORIZONTAL_SPACING_MULTIPLIER = {
  195. DOWN_RIGHT = 1,
  196. DOWN_LEFT = -1,
  197. UP_RIGHT = 1,
  198. UP_LEFT = -1,
  199. RIGHT_DOWN = 1,
  200. RIGHT_UP = 1,
  201. LEFT_DOWN = -1,
  202. LEFT_UP = -1,
  203. }
  204.  
  205. local DIRECTION_TO_VERTICAL_SPACING_MULTIPLIER = {
  206. DOWN_RIGHT = -1,
  207. DOWN_LEFT = -1,
  208. UP_RIGHT = 1,
  209. UP_LEFT = 1,
  210. RIGHT_DOWN = -1,
  211. RIGHT_UP = 1,
  212. LEFT_DOWN = -1,
  213. LEFT_UP = 1,
  214. }
  215.  
  216. function UF:ConvertGroupDB(group)
  217. local db = self.db.units[group.groupName]
  218. if db.point and db.columnAnchorPoint then
  219. db.growthDirection = POINT_COLUMN_ANCHOR_TO_DIRECTION[db.point..db.columnAnchorPoint];
  220. db.point = nil;
  221. db.columnAnchorPoint = nil;
  222. end
  223.  
  224. if db.growthDirection == "UP" then
  225. db.growthDirection = "UP_RIGHT"
  226. end
  227.  
  228. if db.growthDirection == "DOWN" then
  229. db.growthDirection = "DOWN_RIGHT"
  230. end
  231. end
  232.  
  233.  
  234.  
  235. function UF:Construct_UF(frame, unit)
  236. frame:SetScript('OnEnter', UnitFrame_OnEnter)
  237. frame:SetScript('OnLeave', UnitFrame_OnLeave)
  238.  
  239. if(self.thinBorders) then
  240. frame.SPACING = 0
  241. frame.BORDER = E.mult
  242. else
  243. frame.BORDER = E.Border
  244. frame.SPACING = 0
  245. end
  246.  
  247. frame.SHADOW_SPACING = 3
  248. frame.CLASSBAR_YOFFSET = 0 --placeholder
  249. frame.BOTTOM_OFFSET = 0 --placeholder
  250.  
  251. frame.RaisedElementParent = CreateFrame('Frame', nil, frame)
  252. frame.RaisedElementParent.TextureParent = CreateFrame('Frame', nil, frame.RaisedElementParent)
  253. frame.RaisedElementParent:SetFrameLevel(frame:GetFrameLevel() + 100)
  254.  
  255. if not self['groupunits'][unit] then
  256. local stringTitle = E:StringTitle(unit)
  257. if stringTitle:find('target') then
  258. stringTitle = gsub(stringTitle, 'target', 'Target')
  259. end
  260. self["Construct_"..stringTitle.."Frame"](self, frame, unit)
  261. else
  262. UF["Construct_"..E:StringTitle(self['groupunits'][unit]).."Frames"](self, frame, unit)
  263. end
  264.  
  265. self:Update_StatusBars()
  266. self:Update_FontStrings()
  267. return frame
  268. end
  269.  
  270. function UF:GetObjectAnchorPoint(frame, point)
  271. if not frame[point] or point == "Frame" then
  272. return frame
  273. elseif frame[point] and not frame[point]:IsShown() then
  274. return frame.Health
  275. else
  276. return frame[point]
  277. end
  278. end
  279.  
  280. function UF:GetPositionOffset(position, offset)
  281. if not offset then offset = 2; end
  282. local x, y = 0, 0
  283. if find(position, 'LEFT') then
  284. x = offset
  285. elseif find(position, 'RIGHT') then
  286. x = -offset
  287. end
  288.  
  289. if find(position, 'TOP') then
  290. y = -offset
  291. elseif find(position, 'BOTTOM') then
  292. y = offset
  293. end
  294.  
  295. return x, y
  296. end
  297.  
  298. function UF:GetAuraOffset(p1, p2)
  299. local x, y = 0, 0
  300. if p1 == "RIGHT" and p2 == "LEFT" then
  301. x = -3
  302. elseif p1 == "LEFT" and p2 == "RIGHT" then
  303. x = 3
  304. end
  305.  
  306. if find(p1, 'TOP') and find(p2, 'BOTTOM') then
  307. y = -1
  308. elseif find(p1, 'BOTTOM') and find(p2, 'TOP') then
  309. y = 1
  310. end
  311.  
  312. return E:Scale(x), E:Scale(y)
  313. end
  314.  
  315. function UF:GetAuraAnchorFrame(frame, attachTo, isConflict)
  316. if isConflict then
  317. E:Print(format(L["%s frame(s) has a conflicting anchor point, please change either the buff or debuff anchor point so they are not attached to each other. Forcing the debuffs to be attached to the main unitframe until fixed."], E:StringTitle(frame:GetName())))
  318. end
  319.  
  320. if isConflict or attachTo == 'FRAME' then
  321. return frame
  322. elseif attachTo == 'TRINKET' then
  323. if select(2, IsInInstance()) == "arena" then
  324. return frame.Trinket
  325. else
  326. return frame.PVPSpecIcon
  327. end
  328. elseif attachTo == 'BUFFS' then
  329. return frame.Buffs
  330. elseif attachTo == 'DEBUFFS' then
  331. return frame.Debuffs
  332. elseif attachTo == 'HEALTH' then
  333. return frame.Health
  334. elseif attachTo == 'POWER' and frame.Power then
  335. return frame.Power
  336. else
  337. return frame
  338. end
  339. end
  340.  
  341. function UF:ClearChildPoints(...)
  342. for i=1, select("#", ...) do
  343. local child = select(i, ...)
  344. child:ClearAllPoints()
  345. end
  346. end
  347.  
  348. function UF:UpdateColors()
  349. local db = self.db.colors
  350.  
  351. local good = E:GetColorTable(db.reaction.GOOD)
  352. local bad = E:GetColorTable(db.reaction.BAD)
  353. local neutral = E:GetColorTable(db.reaction.NEUTRAL)
  354.  
  355. ElvUF.colors.tapped = E:GetColorTable(db.tapped);
  356. ElvUF.colors.disconnected = E:GetColorTable(db.disconnected);
  357. ElvUF.colors.health = E:GetColorTable(db.health);
  358. ElvUF.colors.power.MANA = E:GetColorTable(db.power.MANA);
  359. ElvUF.colors.power.RAGE = E:GetColorTable(db.power.RAGE);
  360. ElvUF.colors.power.FOCUS = E:GetColorTable(db.power.FOCUS);
  361. ElvUF.colors.power.ENERGY = E:GetColorTable(db.power.ENERGY);
  362. ElvUF.colors.power.RUNIC_POWER = E:GetColorTable(db.power.RUNIC_POWER);
  363. ElvUF.colors.power.PAIN = E:GetColorTable(db.power.PAIN);
  364. ElvUF.colors.power.FURY = E:GetColorTable(db.power.FURY);
  365. ElvUF.colors.power.LUNAR_POWER = E:GetColorTable(db.power.LUNAR_POWER)
  366. ElvUF.colors.power.INSANITY = E:GetColorTable(db.power.INSANITY)
  367. ElvUF.colors.power.MAELSTROM = E:GetColorTable(db.power.MAELSTROM)
  368.  
  369. ElvUF.colors.ComboPoints = {}
  370. ElvUF.colors.ComboPoints[1] = E:GetColorTable(db.classResources.comboPoints[1])
  371. ElvUF.colors.ComboPoints[2] = E:GetColorTable(db.classResources.comboPoints[2])
  372. ElvUF.colors.ComboPoints[3] = E:GetColorTable(db.classResources.comboPoints[3])
  373.  
  374. --Monk, Mage, Paladin and Warlock, Death Knight
  375. ElvUF.colors.ClassBars = {}
  376. ElvUF.colors.ClassBars.MONK = {}
  377. ElvUF.colors.ClassBars.PALADIN = E:GetColorTable(db.classResources.PALADIN);
  378. ElvUF.colors.ClassBars.MAGE = E:GetColorTable(db.classResources.MAGE);
  379. ElvUF.colors.ClassBars.MONK[1] = E:GetColorTable(db.classResources.MONK[1])
  380. ElvUF.colors.ClassBars.MONK[2] = E:GetColorTable(db.classResources.MONK[2])
  381. ElvUF.colors.ClassBars.MONK[3] = E:GetColorTable(db.classResources.MONK[3])
  382. ElvUF.colors.ClassBars.MONK[4] = E:GetColorTable(db.classResources.MONK[4])
  383. ElvUF.colors.ClassBars.MONK[5] = E:GetColorTable(db.classResources.MONK[5])
  384. ElvUF.colors.ClassBars.MONK[6] = E:GetColorTable(db.classResources.MONK[6])
  385. ElvUF.colors.ClassBars.DEATHKNIGHT = E:GetColorTable(db.classResources.DEATHKNIGHT)
  386. ElvUF.colors.ClassBars.WARLOCK = E:GetColorTable(db.classResources.WARLOCK)
  387.  
  388. ElvUF.colors.reaction[1] = bad
  389. ElvUF.colors.reaction[2] = bad
  390. ElvUF.colors.reaction[3] = bad
  391. ElvUF.colors.reaction[4] = neutral
  392. ElvUF.colors.reaction[5] = good
  393. ElvUF.colors.reaction[6] = good
  394. ElvUF.colors.reaction[7] = good
  395. ElvUF.colors.reaction[8] = good
  396. ElvUF.colors.smooth = {1, 0, 0,
  397. 1, 1, 0,
  398. unpack(E:GetColorTable(db.health))}
  399.  
  400. ElvUF.colors.castColor = E:GetColorTable(db.castColor);
  401. ElvUF.colors.castNoInterrupt = E:GetColorTable(db.castNoInterrupt);
  402. end
  403.  
  404. function UF:Update_StatusBars()
  405. local statusBarTexture = LSM:Fetch("statusbar", self.db.statusbar)
  406. for statusbar in pairs(UF['statusbars']) do
  407. if statusbar and statusbar:GetObjectType() == 'StatusBar' and not statusbar.isTransparent then
  408. statusbar:SetStatusBarTexture(statusBarTexture)
  409. if statusbar.texture then statusbar.texture = statusBarTexture end --Update .texture on oUF Power element
  410. elseif statusbar and statusbar:GetObjectType() == 'Texture' then
  411. statusbar:SetTexture(statusBarTexture)
  412. end
  413. end
  414. end
  415.  
  416. function UF:Update_StatusBar(bar)
  417. bar:SetStatusBarTexture(LSM:Fetch("statusbar", self.db.statusbar))
  418. end
  419.  
  420. function UF:Update_FontString(object)
  421. object:FontTemplate(LSM:Fetch("font", self.db.font), self.db.fontSize, self.db.fontOutline)
  422. end
  423.  
  424. function UF:Update_FontStrings()
  425. local stringFont = LSM:Fetch("font", self.db.font)
  426. for font in pairs(UF['fontstrings']) do
  427. font:FontTemplate(stringFont, self.db.fontSize, self.db.fontOutline)
  428. end
  429. end
  430.  
  431. function UF:Configure_FontString(obj)
  432. UF['fontstrings'][obj] = true
  433. obj:FontTemplate() --This is temporary.
  434. end
  435.  
  436. function UF:Update_AllFrames()
  437. if InCombatLockdown() then self:RegisterEvent('PLAYER_REGEN_ENABLED'); return end
  438. if E.private["unitframe"].enable ~= true then return; end
  439. self:UpdateColors()
  440. self:Update_FontStrings()
  441. self:Update_StatusBars()
  442.  
  443. for unit in pairs(self['units']) do
  444. if self.db['units'][unit].enable then
  445. self[unit]:Enable()
  446. self[unit]:Update()
  447. E:EnableMover(self[unit].mover:GetName())
  448. else
  449. self[unit]:Disable()
  450. E:DisableMover(self[unit].mover:GetName())
  451. end
  452. end
  453.  
  454. for unit, group in pairs(self['groupunits']) do
  455. if self.db['units'][group].enable then
  456. self[unit]:Enable()
  457. self[unit]:Update()
  458. E:EnableMover(self[unit].mover:GetName())
  459. else
  460. self[unit]:Disable()
  461. E:DisableMover(self[unit].mover:GetName())
  462. end
  463. end
  464.  
  465. self:UpdateAllHeaders()
  466. end
  467.  
  468. function UF:CreateAndUpdateUFGroup(group, numGroup)
  469. if InCombatLockdown() then self:RegisterEvent('PLAYER_REGEN_ENABLED'); return end
  470.  
  471. for i=1, numGroup do
  472. local unit = group..i
  473. local frameName = E:StringTitle(unit)
  474. frameName = frameName:gsub('t(arget)', 'T%1')
  475. if not self[unit] then
  476. self['groupunits'][unit] = group;
  477. self[unit] = ElvUF:Spawn(unit, 'ElvUF_'..frameName)
  478. self[unit].index = i
  479. self[unit]:SetParent(ElvUF_Parent)
  480. self[unit]:SetID(i)
  481. end
  482.  
  483. local frameName = E:StringTitle(group)
  484. frameName = frameName:gsub('t(arget)', 'T%1')
  485. self[unit].Update = function()
  486. UF["Update_"..E:StringTitle(frameName).."Frames"](self, self[unit], self.db['units'][group])
  487. end
  488.  
  489. if self.db['units'][group].enable then
  490. self[unit]:Enable()
  491. self[unit].Update()
  492.  
  493. if self[unit].isForced then
  494. self:ForceShow(self[unit])
  495. end
  496. E:EnableMover(self[unit].mover:GetName())
  497. else
  498. self[unit]:Disable()
  499. E:DisableMover(self[unit].mover:GetName())
  500. end
  501. end
  502. end
  503.  
  504. function UF:HeaderUpdateSpecificElement(group, elementName)
  505. assert(self[group], "Invalid group specified.")
  506. for i=1, self[group]:GetNumChildren() do
  507. local frame = select(i, self[group]:GetChildren())
  508. if frame and frame.Health then
  509. frame:UpdateElement(elementName)
  510. end
  511. end
  512. end
  513.  
  514. --Keep an eye on this one, it may need to be changed too
  515. --Reference: http://www.tukui.org/forums/topic.php?id=35332
  516. function UF.groupPrototype:GetAttribute(name)
  517. return self.groups[1]:GetAttribute(name)
  518. end
  519.  
  520. function UF.groupPrototype:Configure_Groups(self)
  521. local db = UF.db.units[self.groupName]
  522.  
  523. local point
  524. local width, height, newCols, newRows = 0, 0, 0, 0
  525. local direction = db.growthDirection
  526. local xMult, yMult = DIRECTION_TO_HORIZONTAL_SPACING_MULTIPLIER[direction], DIRECTION_TO_VERTICAL_SPACING_MULTIPLIER[direction]
  527. local UNIT_HEIGHT = db.infoPanel and db.infoPanel.enable and (db.height + db.infoPanel.height) or db.height
  528.  
  529. local numGroups = self.numGroups
  530. for i=1, numGroups do
  531. local group = self.groups[i]
  532.  
  533. point = DIRECTION_TO_POINT[direction]
  534.  
  535. if group then
  536. UF:ConvertGroupDB(group)
  537. if point == "LEFT" or point == "RIGHT" then
  538. group:SetAttribute("xOffset", db.horizontalSpacing * DIRECTION_TO_HORIZONTAL_SPACING_MULTIPLIER[direction])
  539. group:SetAttribute("yOffset", 0)
  540. group:SetAttribute("columnSpacing", db.verticalSpacing)
  541. else
  542. group:SetAttribute("xOffset", 0)
  543. group:SetAttribute("yOffset", db.verticalSpacing * DIRECTION_TO_VERTICAL_SPACING_MULTIPLIER[direction])
  544. group:SetAttribute("columnSpacing", db.horizontalSpacing)
  545. end
  546.  
  547. if not group.isForced then
  548. if not group.initialized then
  549. group:SetAttribute("startingIndex", db.raidWideSorting and (-min(numGroups * (db.groupsPerRowCol * 5), MAX_RAID_MEMBERS) + 1) or -4)
  550. group:Show()
  551. group.initialized = true
  552. end
  553. group:SetAttribute('startingIndex', 1)
  554. end
  555.  
  556. group:ClearAllPoints()
  557. if db.raidWideSorting and db.invertGroupingOrder then
  558. group:SetAttribute("columnAnchorPoint", INVERTED_DIRECTION_TO_COLUMN_ANCHOR_POINT[direction])
  559. else
  560. group:SetAttribute("columnAnchorPoint", DIRECTION_TO_COLUMN_ANCHOR_POINT[direction])
  561. end
  562.  
  563. group:ClearChildPoints()
  564. group:SetAttribute("point", point)
  565.  
  566. if not group.isForced then
  567. group:SetAttribute("maxColumns", db.raidWideSorting and numGroups or 1)
  568. group:SetAttribute("unitsPerColumn", db.raidWideSorting and (db.groupsPerRowCol * 5) or 5)
  569. UF.headerGroupBy[db.groupBy](group)
  570. group:SetAttribute('sortDir', db.sortDir)
  571. group:SetAttribute("showPlayer", db.showPlayer)
  572. end
  573.  
  574. if i == 1 and db.raidWideSorting then
  575. group:SetAttribute("groupFilter", "1,2,3,4,5,6,7,8")
  576. else
  577. group:SetAttribute("groupFilter", tostring(i))
  578. end
  579. end
  580.  
  581. --MATH!! WOOT
  582. point = DIRECTION_TO_GROUP_ANCHOR_POINT[direction]
  583. if db.raidWideSorting and db.startFromCenter then
  584. point = DIRECTION_TO_GROUP_ANCHOR_POINT["OUT_"..direction]
  585. end
  586. if (i - 1) % db.groupsPerRowCol == 0 then
  587. if DIRECTION_TO_POINT[direction] == "LEFT" or DIRECTION_TO_POINT[direction] == "RIGHT" then
  588. if group then
  589. group:Point(point, self, point, 0, height * yMult)
  590. end
  591. height = height + UNIT_HEIGHT + db.verticalSpacing
  592. newRows = newRows + 1
  593. else
  594. if group then
  595. group:Point(point, self, point, width * xMult, 0)
  596. end
  597. width = width + db.width + db.horizontalSpacing
  598.  
  599. newCols = newCols + 1
  600. end
  601. else
  602. if DIRECTION_TO_POINT[direction] == "LEFT" or DIRECTION_TO_POINT[direction] == "RIGHT" then
  603. if newRows == 1 then
  604. if group then
  605. group:Point(point, self, point, width * xMult, 0)
  606. end
  607. width = width + ((db.width + db.horizontalSpacing) * 5)
  608. newCols = newCols + 1
  609. elseif group then
  610. group:Point(point, self, point, (((db.width + db.horizontalSpacing) * 5) * ((i-1) % db.groupsPerRowCol)) * xMult, ((UNIT_HEIGHT + db.verticalSpacing) * (newRows - 1)) * yMult)
  611. end
  612. else
  613. if newCols == 1 then
  614. if group then
  615. group:Point(point, self, point, 0, height * yMult)
  616. end
  617. height = height + ((UNIT_HEIGHT + db.verticalSpacing) * 5)
  618. newRows = newRows + 1
  619. elseif group then
  620. group:Point(point, self, point, ((db.width + db.horizontalSpacing) * (newCols - 1)) * xMult, (((UNIT_HEIGHT + db.verticalSpacing) * 5) * ((i-1) % db.groupsPerRowCol)) * yMult)
  621. end
  622. end
  623. end
  624.  
  625. if height == 0 then
  626. height = height + ((UNIT_HEIGHT + db.verticalSpacing) * 5)
  627. elseif width == 0 then
  628. width = width + ((db.width + db.horizontalSpacing) * 5)
  629. end
  630. end
  631.  
  632. if not self.isInstanceForced then
  633. self.dirtyWidth = width - db.horizontalSpacing
  634. self.dirtyHeight = height - db.verticalSpacing
  635. end
  636.  
  637. if self.mover then
  638. self.mover.positionOverride = DIRECTION_TO_GROUP_ANCHOR_POINT[direction]
  639. E:UpdatePositionOverride(self.mover:GetName())
  640. self:GetScript("OnSizeChanged")(self) --Mover size is not updated if frame is hidden, so call an update manually
  641. end
  642.  
  643. self:SetSize(width - db.horizontalSpacing, height - db.verticalSpacing)
  644. end
  645.  
  646. function UF.groupPrototype:Update(self)
  647. local group = self.groupName
  648.  
  649. UF[group].db = UF.db['units'][group]
  650. for i=1, #self.groups do
  651. self.groups[i].db = UF.db['units'][group]
  652. self.groups[i]:Update()
  653. end
  654. end
  655.  
  656. function UF.groupPrototype:AdjustVisibility(self)
  657. if not self.isForced then
  658. local numGroups = self.numGroups
  659. for i=1, #self.groups do
  660. local group = self.groups[i]
  661. if (i <= numGroups) and ((self.db.raidWideSorting and i <= 1) or not self.db.raidWideSorting) then
  662. group:Show()
  663. else
  664. if group.forceShow then
  665. group:Hide()
  666. UF:UnshowChildUnits(group, group:GetChildren())
  667. group:SetAttribute('startingIndex', 1)
  668. else
  669. group:Reset()
  670. end
  671. end
  672. end
  673. end
  674. end
  675.  
  676. function UF.headerPrototype:ClearChildPoints()
  677. for i=1, self:GetNumChildren() do
  678. local child = select(i, self:GetChildren())
  679. child:ClearAllPoints()
  680. end
  681. end
  682.  
  683. function UF.headerPrototype:Update(isForced)
  684. local group = self.groupName
  685. local db = UF.db['units'][group]
  686. UF["Update_"..E:StringTitle(group).."Header"](UF, self, db, isForced)
  687.  
  688. local i = 1
  689. local child = self:GetAttribute("child" .. i)
  690.  
  691. while child do
  692. UF["Update_"..E:StringTitle(group).."Frames"](UF, child, db)
  693.  
  694. if _G[child:GetName()..'Pet'] then
  695. UF["Update_"..E:StringTitle(group).."Frames"](UF, _G[child:GetName()..'Pet'], db)
  696. end
  697.  
  698. if _G[child:GetName()..'Target'] then
  699. UF["Update_"..E:StringTitle(group).."Frames"](UF, _G[child:GetName()..'Target'], db)
  700. end
  701.  
  702. i = i + 1
  703. child = self:GetAttribute("child" .. i)
  704. end
  705. end
  706.  
  707. function UF.headerPrototype:Reset()
  708. self:Hide()
  709.  
  710. self:SetAttribute("showPlayer", true)
  711.  
  712. self:SetAttribute("showSolo", true)
  713. self:SetAttribute("showParty", true)
  714. self:SetAttribute("showRaid", true)
  715.  
  716. self:SetAttribute("columnSpacing", nil)
  717. self:SetAttribute("columnAnchorPoint", nil)
  718. self:SetAttribute("groupBy", nil)
  719. self:SetAttribute("groupFilter", nil)
  720. self:SetAttribute("groupingOrder", nil)
  721. self:SetAttribute("maxColumns", nil)
  722. self:SetAttribute("nameList", nil)
  723. self:SetAttribute("point", nil)
  724. self:SetAttribute("sortDir", nil)
  725. self:SetAttribute("sortMethod", "NAME")
  726. self:SetAttribute("startingIndex", nil)
  727. self:SetAttribute("strictFiltering", nil)
  728. self:SetAttribute("unitsPerColumn", nil)
  729. self:SetAttribute("xOffset", nil)
  730. self:SetAttribute("yOffset", nil)
  731. end
  732.  
  733. function UF:CreateHeader(parent, groupFilter, overrideName, template, groupName, headerTemplate)
  734. local group = parent.groupName or groupName
  735. local db = UF.db['units'][group]
  736. ElvUF:SetActiveStyle("ElvUF_"..E:StringTitle(group))
  737. local header = ElvUF:SpawnHeader(overrideName, headerTemplate, nil,
  738. 'oUF-initialConfigFunction', ("self:SetWidth(%d); self:SetHeight(%d);"):format(db.width, db.height),
  739. 'groupFilter', groupFilter,
  740. 'showParty', true,
  741. 'showRaid', true,
  742. 'showSolo', true,
  743. template and 'template', template)
  744.  
  745. header.groupName = group
  746. header:SetParent(parent)
  747. header:Show()
  748.  
  749. for k, v in pairs(self.headerPrototype) do
  750. header[k] = v
  751. end
  752.  
  753. return header
  754. end
  755.  
  756. function UF:CreateAndUpdateHeaderGroup(group, groupFilter, template, headerUpdate, headerTemplate)
  757. if InCombatLockdown() then self:RegisterEvent('PLAYER_REGEN_ENABLED'); return end
  758. local db = self.db['units'][group]
  759. local raidFilter = UF.db.smartRaidFilter
  760. local numGroups = db.numGroups
  761. if(raidFilter and numGroups and (self[group] and not self[group].blockVisibilityChanges)) then
  762. local inInstance, instanceType = IsInInstance()
  763. if(inInstance and (instanceType == 'raid' or instanceType == 'pvp')) then
  764. local _, _, _, _, maxPlayers, _, _, mapID = GetInstanceInfo()
  765.  
  766. if UF.mapIDs[mapID] then
  767. maxPlayers = UF.mapIDs[mapID]
  768. end
  769.  
  770. if maxPlayers > 0 then
  771. numGroups = E:Round(maxPlayers/5)
  772. E:Print(group, "Forcing maxGroups to: "..numGroups.." because maxPlayers is: "..maxPlayers)
  773. end
  774. end
  775. end
  776.  
  777. if not self[group] then
  778. local stringTitle = E:StringTitle(group)
  779. ElvUF:RegisterStyle("ElvUF_"..stringTitle, UF["Construct_"..stringTitle.."Frames"])
  780. ElvUF:SetActiveStyle("ElvUF_"..stringTitle)
  781.  
  782. if db.numGroups then
  783. self[group] = CreateFrame('Frame', 'ElvUF_'..stringTitle, ElvUF_Parent, 'SecureHandlerStateTemplate');
  784. self[group].groups = {}
  785. self[group].groupName = group
  786. self[group].template = self[group].template or template
  787. self[group].headerTemplate = self[group].headerTemplate or headerTemplate
  788. if not UF["headerFunctions"][group] then UF["headerFunctions"][group] = {} end
  789. for k, v in pairs(self.groupPrototype) do
  790. UF["headerFunctions"][group][k] = v
  791. end
  792. else
  793. self[group] = self:CreateHeader(ElvUF_Parent, groupFilter, "ElvUF_"..E:StringTitle(group), template, group, headerTemplate)
  794. end
  795.  
  796. self[group].db = db
  797. self['headers'][group] = self[group]
  798. self[group]:Show()
  799. end
  800.  
  801. self[group].numGroups = numGroups
  802. if numGroups then
  803. if db.raidWideSorting then
  804. if not self[group].groups[1] then
  805. self[group].groups[1] = self:CreateHeader(self[group], nil, "ElvUF_"..E:StringTitle(self[group].groupName)..'Group1', template or self[group].template, nil, headerTemplate or self[group].headerTemplate)
  806. end
  807. else
  808. while numGroups > #self[group].groups do
  809. local index = tostring(#self[group].groups + 1)
  810. tinsert(self[group].groups, self:CreateHeader(self[group], index, "ElvUF_"..E:StringTitle(self[group].groupName)..'Group'..index, template or self[group].template, nil, headerTemplate or self[group].headerTemplate))
  811. end
  812. end
  813.  
  814. UF["headerFunctions"][group]:AdjustVisibility(self[group])
  815.  
  816. if headerUpdate or not self[group].mover then
  817. UF["headerFunctions"][group]:Configure_Groups(self[group])
  818. if not self[group].isForced and not self[group].blockVisibilityChanges then
  819. RegisterStateDriver(self[group], "visibility", db.visibility)
  820. end
  821. else
  822. UF["headerFunctions"][group]:Configure_Groups(self[group])
  823. UF["headerFunctions"][group]:Update(self[group])
  824. end
  825.  
  826. if(db.enable) then
  827. if self[group].mover then
  828. E:EnableMover(self[group].mover:GetName())
  829. end
  830. else
  831. UnregisterStateDriver(self[group], "visibility")
  832. self[group]:Hide()
  833. if self[group].mover then
  834. E:DisableMover(self[group].mover:GetName())
  835. end
  836. return
  837. end
  838. else
  839. self[group].db = db
  840.  
  841. if not UF["headerFunctions"][group] then UF["headerFunctions"][group] = {} end
  842. UF["headerFunctions"][group]["Update"] = function()
  843. local db = UF.db['units'][group]
  844. if db.enable ~= true then
  845. UnregisterAttributeDriver(UF[group], "state-visibility")
  846. UF[group]:Hide()
  847. if(UF[group].mover) then
  848. E:DisableMover(UF[group].mover:GetName())
  849. end
  850. return
  851. end
  852. UF["Update_"..E:StringTitle(group).."Header"](UF, UF[group], db)
  853.  
  854. for i=1, UF[group]:GetNumChildren() do
  855. local child = select(i, UF[group]:GetChildren())
  856. UF["Update_"..E:StringTitle(group).."Frames"](UF, child, UF.db['units'][group])
  857.  
  858. if _G[child:GetName()..'Target'] then
  859. UF["Update_"..E:StringTitle(group).."Frames"](UF, _G[child:GetName()..'Target'], UF.db['units'][group])
  860. end
  861.  
  862. if _G[child:GetName()..'Pet'] then
  863. UF["Update_"..E:StringTitle(group).."Frames"](UF, _G[child:GetName()..'Pet'], UF.db['units'][group])
  864. end
  865. end
  866.  
  867. E:EnableMover(UF[group].mover:GetName())
  868. end
  869.  
  870. if headerUpdate then
  871. UF["Update_"..E:StringTitle(group).."Header"](self, self[group], db)
  872. else
  873. UF["headerFunctions"][group]:Update(self[group])
  874. end
  875. end
  876. end
  877.  
  878. function UF:PLAYER_REGEN_ENABLED()
  879. self:Update_AllFrames()
  880. self:UnregisterEvent('PLAYER_REGEN_ENABLED')
  881. end
  882.  
  883. function UF:CreateAndUpdateUF(unit)
  884. assert(unit, 'No unit provided to create or update.')
  885. if InCombatLockdown() then self:RegisterEvent('PLAYER_REGEN_ENABLED'); return end
  886.  
  887. local frameName = E:StringTitle(unit)
  888. frameName = frameName:gsub('t(arget)', 'T%1')
  889. if not self[unit] then
  890. self[unit] = ElvUF:Spawn(unit, 'ElvUF_'..frameName)
  891. self['units'][unit] = unit
  892. end
  893.  
  894. self[unit].Update = function()
  895. UF["Update_"..frameName.."Frame"](self, self[unit], self.db['units'][unit])
  896. end
  897.  
  898. if self[unit]:GetParent() ~= ElvUF_Parent then
  899. self[unit]:SetParent(ElvUF_Parent)
  900. end
  901.  
  902. if self.db['units'][unit].enable then
  903. self[unit]:Enable()
  904. self[unit].Update()
  905. E:EnableMover(self[unit].mover:GetName())
  906. else
  907. self[unit]:Disable()
  908. E:DisableMover(self[unit].mover:GetName())
  909. end
  910. end
  911.  
  912. function UF:LoadUnits()
  913. for _, unit in pairs(self['unitstoload']) do
  914. self:CreateAndUpdateUF(unit)
  915. end
  916. self['unitstoload'] = nil
  917.  
  918. for group, groupOptions in pairs(self['unitgroupstoload']) do
  919. local numGroup, template = unpack(groupOptions)
  920. self:CreateAndUpdateUFGroup(group, numGroup, template)
  921. end
  922. self['unitgroupstoload'] = nil
  923.  
  924. for group, groupOptions in pairs(self['headerstoload']) do
  925. local groupFilter, template, headerTemplate
  926. if type(groupOptions) == 'table' then
  927. groupFilter, template, headerTemplate = unpack(groupOptions)
  928. end
  929.  
  930. self:CreateAndUpdateHeaderGroup(group, groupFilter, template, nil, headerTemplate)
  931. end
  932. self['headerstoload'] = nil
  933. end
  934.  
  935. function UF:UpdateAllHeaders(event)
  936. if InCombatLockdown() then
  937. self:RegisterEvent('PLAYER_REGEN_ENABLED', 'UpdateAllHeaders')
  938. return
  939. end
  940.  
  941. if event == 'PLAYER_REGEN_ENABLED' then
  942. self:UnregisterEvent('PLAYER_REGEN_ENABLED')
  943. end
  944.  
  945. local _, instanceType = IsInInstance();
  946. local ORD = ns.oUF_RaidDebuffs or oUF_RaidDebuffs
  947. if ORD then
  948. ORD:ResetDebuffData()
  949.  
  950. if instanceType == "party" or instanceType == "raid" then
  951. ORD:RegisterDebuffs(E.global.unitframe.aurafilters.RaidDebuffs.spells)
  952. else
  953. ORD:RegisterDebuffs(E.global.unitframe.aurafilters.CCDebuffs.spells)
  954. end
  955. end
  956.  
  957. if E.private["unitframe"]["disabledBlizzardFrames"].party then
  958. ElvUF:DisableBlizzard('party')
  959. end
  960.  
  961. local smartRaidFilterEnabled = self.db.smartRaidFilter
  962. for group, header in pairs(self['headers']) do
  963. UF["headerFunctions"][group]:Update(header)
  964.  
  965. local shouldUpdateHeader
  966. if header.numGroups == nil or smartRaidFilterEnabled then
  967. shouldUpdateHeader = false
  968. elseif header.numGroups ~= nil and not smartRaidFilterEnabled then
  969. shouldUpdateHeader = true
  970. end
  971. self:CreateAndUpdateHeaderGroup(group, nil, nil, shouldUpdateHeader)
  972.  
  973. if group == 'party' or group == 'raid' or group == 'raid40' then
  974. --Update BuffIndicators on profile change as they might be using profile specific data
  975. self:UpdateAuraWatchFromHeader(group)
  976. end
  977. end
  978. end
  979.  
  980. local function HideRaid()
  981. if InCombatLockdown() then return end
  982. CompactRaidFrameManager:Kill()
  983. local compact_raid = CompactRaidFrameManager_GetSetting("IsShown")
  984. if compact_raid and compact_raid ~= "0" then
  985. CompactRaidFrameManager_SetSetting("IsShown", "0")
  986. end
  987. end
  988.  
  989. function UF:DisableBlizzard()
  990. if (not E.private["unitframe"]["disabledBlizzardFrames"].raid) and (not E.private["unitframe"]["disabledBlizzardFrames"].party) then return; end
  991. if not CompactRaidFrameManager_UpdateShown then
  992. E:StaticPopup_Show("WARNING_BLIZZARD_ADDONS")
  993. else
  994. if not CompactRaidFrameManager.hookedHide then
  995. hooksecurefunc("CompactRaidFrameManager_UpdateShown", HideRaid)
  996. CompactRaidFrameManager:HookScript('OnShow', HideRaid)
  997. CompactRaidFrameManager.hookedHide = true
  998. end
  999. CompactRaidFrameContainer:UnregisterAllEvents()
  1000.  
  1001. HideRaid()
  1002. end
  1003. end
  1004.  
  1005. local hiddenParent = CreateFrame("Frame")
  1006. hiddenParent:Hide()
  1007.  
  1008. local HandleFrame = function(baseName)
  1009. local frame
  1010. if(type(baseName) == 'string') then
  1011. frame = _G[baseName]
  1012. else
  1013. frame = baseName
  1014. end
  1015.  
  1016. if(frame) then
  1017. frame:UnregisterAllEvents()
  1018. frame:Hide()
  1019.  
  1020. -- Keep frame hidden without causing taint
  1021. frame:SetParent(hiddenParent)
  1022.  
  1023. local health = frame.healthbar
  1024. if(health) then
  1025. health:UnregisterAllEvents()
  1026. end
  1027.  
  1028. local power = frame.manabar
  1029. if(power) then
  1030. power:UnregisterAllEvents()
  1031. end
  1032.  
  1033. local spell = frame.spellbar
  1034. if(spell) then
  1035. spell:UnregisterAllEvents()
  1036. end
  1037.  
  1038. local altpowerbar = frame.powerBarAlt
  1039. if(altpowerbar) then
  1040. altpowerbar:UnregisterAllEvents()
  1041. end
  1042. end
  1043. end
  1044.  
  1045. function ElvUF:DisableBlizzard(unit)
  1046. if(not unit) or InCombatLockdown() then return end
  1047.  
  1048. if(unit == 'player') and E.private["unitframe"]["disabledBlizzardFrames"].player then
  1049. HandleFrame(PlayerFrame)
  1050.  
  1051. -- For the damn vehicle support:
  1052. PlayerFrame:RegisterUnitEvent('UNIT_ENTERING_VEHICLE', "player")
  1053. PlayerFrame:RegisterUnitEvent('UNIT_ENTERED_VEHICLE', "player")
  1054. PlayerFrame:RegisterUnitEvent('UNIT_EXITING_VEHICLE', "player")
  1055. PlayerFrame:RegisterUnitEvent('UNIT_EXITED_VEHICLE', "player")
  1056. PlayerFrame:RegisterEvent('PLAYER_ENTERING_WORLD')
  1057.  
  1058. -- User placed frames don't animate
  1059. PlayerFrame:SetUserPlaced(true)
  1060. PlayerFrame:SetDontSavePosition(true)
  1061. RuneFrame:SetParent(PlayerFrame)
  1062. elseif(unit == 'pet') and E.private["unitframe"]["disabledBlizzardFrames"].player then
  1063. HandleFrame(PetFrame)
  1064. elseif(unit == 'target') and E.private["unitframe"]["disabledBlizzardFrames"].target then
  1065. HandleFrame(TargetFrame)
  1066. HandleFrame(ComboFrame)
  1067. elseif(unit == 'focus') and E.private["unitframe"]["disabledBlizzardFrames"].focus then
  1068. HandleFrame(FocusFrame)
  1069. HandleFrame(FocusFrameToT)
  1070. elseif(unit == 'targettarget') and E.private["unitframe"]["disabledBlizzardFrames"].target then
  1071. HandleFrame(TargetFrameToT)
  1072. elseif(unit:match'(boss)%d?$' == 'boss') and E.private["unitframe"]["disabledBlizzardFrames"].boss then
  1073. local id = unit:match'boss(%d)'
  1074. if(id) then
  1075. HandleFrame('Boss' .. id .. 'TargetFrame')
  1076. else
  1077. for i=1, MAX_BOSS_FRAMES do
  1078. HandleFrame(('Boss%dTargetFrame'):format(i))
  1079. end
  1080. end
  1081. elseif(unit:match'(party)%d?$' == 'party') and E.private["unitframe"]["disabledBlizzardFrames"].party then
  1082. local id = unit:match'party(%d)'
  1083. if(id) then
  1084. HandleFrame('PartyMemberFrame' .. id)
  1085. else
  1086. for i=1, 4 do
  1087. HandleFrame(('PartyMemberFrame%d'):format(i))
  1088. end
  1089. end
  1090. HandleFrame(PartyMemberBackground)
  1091. elseif(unit:match'(arena)%d?$' == 'arena') and E.private["unitframe"]["disabledBlizzardFrames"].arena then
  1092. local id = unit:match'arena(%d)'
  1093.  
  1094. if(id) then
  1095. HandleFrame('ArenaEnemyFrame' .. id)
  1096. HandleFrame('ArenaPrepFrame'..id)
  1097. HandleFrame('ArenaEnemyFrame'..id..'PetFrame')
  1098. else
  1099. for i=1, 5 do
  1100. HandleFrame(('ArenaEnemyFrame%d'):format(i))
  1101. HandleFrame(('ArenaPrepFrame%d'):format(i))
  1102. HandleFrame(('ArenaEnemyFrame%dPetFrame'):format(i))
  1103. end
  1104. end
  1105. end
  1106. end
  1107.  
  1108. function UF:ADDON_LOADED(event, addon)
  1109. if addon ~= 'Blizzard_ArenaUI' then return; end
  1110. ElvUF:DisableBlizzard('arena')
  1111. self:UnregisterEvent("ADDON_LOADED");
  1112. end
  1113.  
  1114. local hasEnteredWorld = false
  1115. function UF:PLAYER_ENTERING_WORLD()
  1116. if not hasEnteredWorld then
  1117. --We only want to run Update_AllFrames once when we first log in or /reload
  1118. self:Update_AllFrames()
  1119. hasEnteredWorld = true
  1120. else
  1121. --We need to update headers in case we zoned into an instance
  1122. UF:UpdateAllHeaders()
  1123. end
  1124. end
  1125.  
  1126. function UF:UnitFrameThreatIndicator_Initialize(_, unitFrame)
  1127. unitFrame:UnregisterAllEvents() --Arena Taint Fix
  1128. end
  1129.  
  1130. function UF:Initialize()
  1131. self.db = E.db["unitframe"]
  1132. self.thinBorders = self.db.thinBorders or E.PixelMode
  1133. if E.private["unitframe"].enable ~= true then return; end
  1134. E.UnitFrames = UF;
  1135.  
  1136. local ElvUF_Parent = CreateFrame('Frame', 'ElvUF_Parent', E.UIParent, 'SecureHandlerStateTemplate');
  1137. ElvUF_Parent:SetFrameStrata("LOW")
  1138. RegisterStateDriver(ElvUF_Parent, "visibility", "[petbattle] hide; show")
  1139.  
  1140. self:UpdateColors()
  1141. ElvUF:RegisterStyle('ElvUF', function(frame, unit)
  1142. self:Construct_UF(frame, unit)
  1143. end)
  1144.  
  1145. self:LoadUnits()
  1146. self:RegisterEvent('PLAYER_ENTERING_WORLD')
  1147.  
  1148. --InterfaceOptionsFrameCategoriesButton9:SetScale(0.0001)
  1149. --[[if E.private["unitframe"]["disabledBlizzardFrames"].arena and E.private["unitframe"]["disabledBlizzardFrames"].focus and E.private["unitframe"]["disabledBlizzardFrames"].party then
  1150. InterfaceOptionsFrameCategoriesButton10:SetScale(0.0001)
  1151. end
  1152.  
  1153. if E.private["unitframe"]["disabledBlizzardFrames"].target then
  1154. InterfaceOptionsCombatPanelTargetOfTarget:SetScale(0.0001)
  1155. InterfaceOptionsCombatPanelTargetOfTarget:SetAlpha(0)
  1156. end]]
  1157.  
  1158. if E.private["unitframe"]["disabledBlizzardFrames"].party and E.private["unitframe"]["disabledBlizzardFrames"].raid then
  1159. self:DisableBlizzard()
  1160. --InterfaceOptionsFrameCategoriesButton11:SetScale(0.0001)
  1161.  
  1162. self:RegisterEvent('GROUP_ROSTER_UPDATE', 'DisableBlizzard')
  1163. UIParent:UnregisterEvent('GROUP_ROSTER_UPDATE') --This may fuck shit up.. we'll see...
  1164. else
  1165. CompactUnitFrameProfiles:RegisterEvent('VARIABLES_LOADED')
  1166. end
  1167.  
  1168. if (not E.private["unitframe"]["disabledBlizzardFrames"].party) and (not E.private["unitframe"]["disabledBlizzardFrames"].raid) then
  1169. E.RaidUtility.Initialize = E.noop
  1170. end
  1171.  
  1172. if E.private["unitframe"]["disabledBlizzardFrames"].arena then
  1173. self:SecureHook('UnitFrameThreatIndicator_Initialize')
  1174.  
  1175. if not IsAddOnLoaded('Blizzard_ArenaUI') then
  1176. self:RegisterEvent('ADDON_LOADED')
  1177. else
  1178. ElvUF:DisableBlizzard('arena')
  1179. end
  1180. end
  1181.  
  1182. local ORD = ns.oUF_RaidDebuffs or oUF_RaidDebuffs
  1183. if not ORD then return end
  1184. ORD.ShowDispelableDebuff = true
  1185. ORD.FilterDispellableDebuff = true
  1186. ORD.MatchBySpellName = false
  1187. end
  1188.  
  1189. function UF:ResetUnitSettings(unit)
  1190. E:CopyTable(self.db['units'][unit], P['unitframe']['units'][unit]);
  1191.  
  1192. if self.db['units'][unit].buffs and self.db['units'][unit].buffs.sizeOverride then
  1193. self.db['units'][unit].buffs.sizeOverride = P.unitframe.units[unit].buffs.sizeOverride or 0
  1194. end
  1195.  
  1196. if self.db['units'][unit].debuffs and self.db['units'][unit].debuffs.sizeOverride then
  1197. self.db['units'][unit].debuffs.sizeOverride = P.unitframe.units[unit].debuffs.sizeOverride or 0
  1198. end
  1199.  
  1200. self:Update_AllFrames()
  1201. end
  1202.  
  1203. function UF:ToggleForceShowGroupFrames(unitGroup, numGroup)
  1204. for i=1, numGroup do
  1205. if self[unitGroup..i] and not self[unitGroup..i].isForced then
  1206. UF:ForceShow(self[unitGroup..i])
  1207. elseif self[unitGroup..i] then
  1208. UF:UnforceShow(self[unitGroup..i])
  1209. end
  1210. end
  1211. end
  1212.  
  1213. local ignoreSettings = {
  1214. ['position'] = true,
  1215. ['playerOnly'] = true,
  1216. ["selfBuffs"] = true,
  1217. ['useBlacklist'] = true,
  1218. ['useWhitelist'] = true,
  1219. ['noDuration'] = true,
  1220. ['onlyDispellable'] = true,
  1221. ['useFilter'] = true,
  1222. ['bossAuras'] = true,
  1223. }
  1224.  
  1225. local ignoreSettingsGroup = {
  1226. ['visibility'] = true,
  1227. }
  1228.  
  1229. local allowPass = {
  1230. ['sizeOverride'] = true,
  1231. }
  1232.  
  1233. function UF:MergeUnitSettings(fromUnit, toUnit, isGroupUnit)
  1234. local db = self.db['units']
  1235. local filter = ignoreSettings
  1236. if isGroupUnit then
  1237. filter = ignoreSettingsGroup
  1238. end
  1239. if fromUnit ~= toUnit then
  1240. for option, value in pairs(db[fromUnit]) do
  1241. if type(value) ~= 'table' and not filter[option] then
  1242. if db[toUnit][option] ~= nil then
  1243. db[toUnit][option] = value
  1244. end
  1245. elseif not filter[option] then
  1246. if type(value) == 'table' then
  1247. for opt, val in pairs(db[fromUnit][option]) do
  1248. --local val = db[fromUnit][option][opt]
  1249. if type(val) ~= 'table' and not filter[opt] then
  1250. if db[toUnit][option] ~= nil and (db[toUnit][option][opt] ~= nil or allowPass[opt]) then
  1251. db[toUnit][option][opt] = val
  1252. end
  1253. elseif not filter[opt] then
  1254. if type(val) == 'table' then
  1255. for o, v in pairs(db[fromUnit][option][opt]) do
  1256. if not filter[o] then
  1257. if db[toUnit][option] ~= nil and db[toUnit][option][opt] ~= nil and db[toUnit][option][opt][o] ~= nil then
  1258. db[toUnit][option][opt][o] = v
  1259. end
  1260. end
  1261. end
  1262. end
  1263. end
  1264. end
  1265. end
  1266. end
  1267. end
  1268. else
  1269. E:Print(L["You cannot copy settings from the same unit."])
  1270. end
  1271.  
  1272. self:Update_AllFrames()
  1273. end
  1274.  
  1275. local function updateColor(self, r, g, b)
  1276. if not self.isTransparent then return end
  1277. if self.backdrop then
  1278. local _, _, _, a = self.backdrop:GetBackdropColor()
  1279. self.backdrop:SetBackdropColor(r * 0.58, g * 0.58, b * 0.58, a)
  1280. elseif self:GetParent().template then
  1281. local _, _, _, a = self:GetParent():GetBackdropColor()
  1282. self:GetParent():SetBackdropColor(r * 0.58, g * 0.58, b * 0.58, a)
  1283. end
  1284.  
  1285. if self.bg and self.bg:GetObjectType() == 'Texture' and not self.bg.multiplier then
  1286. self.bg:SetColorTexture(r * 0.35, g * 0.35, b * 0.35)
  1287. end
  1288. end
  1289.  
  1290. function UF:ToggleTransparentStatusBar(isTransparent, statusBar, backdropTex, adjustBackdropPoints, invertBackdropTex)
  1291. statusBar.isTransparent = isTransparent
  1292.  
  1293. local statusBarTex = statusBar:GetStatusBarTexture()
  1294. local statusBarOrientation = statusBar:GetOrientation()
  1295. if isTransparent then
  1296. if statusBar.backdrop then
  1297. statusBar.backdrop:SetTemplate("Transparent")
  1298. statusBar.backdrop.ignoreUpdates = true
  1299. elseif statusBar:GetParent().template then
  1300. statusBar:GetParent():SetTemplate("Transparent")
  1301. statusBar:GetParent().ignoreUpdates = true
  1302. end
  1303.  
  1304. statusBar:SetStatusBarTexture(0, 0, 0, 0)
  1305. if statusBar.texture then statusBar.texture = statusBar:GetStatusBarTexture() end --Needed for Power element
  1306.  
  1307. backdropTex:ClearAllPoints()
  1308. if statusBarOrientation == 'VERTICAL' then
  1309. backdropTex:Point("TOPLEFT", statusBar, "TOPLEFT")
  1310. backdropTex:Point("BOTTOMLEFT", statusBarTex, "TOPLEFT")
  1311. backdropTex:Point("BOTTOMRIGHT", statusBarTex, "TOPRIGHT")
  1312. else
  1313. backdropTex:Point("TOPLEFT", statusBarTex, "TOPRIGHT")
  1314. backdropTex:Point("BOTTOMLEFT", statusBarTex, "BOTTOMRIGHT")
  1315. backdropTex:Point("BOTTOMRIGHT", statusBar, "BOTTOMRIGHT")
  1316. end
  1317.  
  1318. if invertBackdropTex then
  1319. backdropTex:Show()
  1320. end
  1321.  
  1322. if not invertBackdropTex and not statusBar.hookedColor then
  1323. hooksecurefunc(statusBar, "SetStatusBarColor", updateColor)
  1324. statusBar.hookedColor = true
  1325. end
  1326.  
  1327. if backdropTex.multiplier then
  1328. backdropTex.multiplier = 0.25
  1329. end
  1330. else
  1331. if statusBar.backdrop then
  1332. statusBar.backdrop:SetTemplate("Default", nil, nil, not statusBar.PostCastStart and self.thinBorders)
  1333. statusBar.backdrop.ignoreUpdates = nil
  1334. elseif statusBar:GetParent().template then
  1335. statusBar:GetParent():SetTemplate("Default", nil, nil, self.thinBorders)
  1336. statusBar:GetParent().ignoreUpdates = nil
  1337. end
  1338. statusBar:SetStatusBarTexture(LSM:Fetch("statusbar", self.db.statusbar))
  1339. if statusBar.texture then statusBar.texture = statusBar:GetStatusBarTexture() end
  1340.  
  1341. if adjustBackdropPoints then
  1342. backdropTex:ClearAllPoints()
  1343. if statusBarOrientation == 'VERTICAL' then
  1344. backdropTex:Point("TOPLEFT", statusBar, "TOPLEFT")
  1345. backdropTex:Point("BOTTOMLEFT", statusBarTex, "TOPLEFT")
  1346. backdropTex:Point("BOTTOMRIGHT", statusBarTex, "TOPRIGHT")
  1347. else
  1348. backdropTex:Point("TOPLEFT", statusBarTex, "TOPRIGHT")
  1349. backdropTex:Point("BOTTOMLEFT", statusBarTex, "BOTTOMRIGHT")
  1350. backdropTex:Point("BOTTOMRIGHT", statusBar, "BOTTOMRIGHT")
  1351. end
  1352. end
  1353.  
  1354. if invertBackdropTex then
  1355. backdropTex:Hide()
  1356. end
  1357.  
  1358. if backdropTex.multiplier then
  1359. backdropTex.multiplier = 0.25
  1360. end
  1361. end
  1362. end
  1363.  
  1364. E:RegisterInitialModule(UF:GetName())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement