Thread Tools Display Modes
10-23-12, 09:03 AM   #1
Julchen
A Deviate Faerie Dragon
Join Date: Dec 2009
Posts: 17
RealUI include Raid - Frame and Raid not linked

Hi, I want to write a Raidframe for RealUI with custom Healthbar/Background textures. So far i created a texture that should connect with the oUF Raid but it doesnt. They are seperated i found the invisible Frame for the Raid so I can eg heal myself but the texture is somewhere else on the screen - the parent of the texture is wrong. I think their is a syntax mistake cause the Raid is handled different from a single spawn UF.

cfg.lua
Lua Code:
  1. local addon, ns = ...
  2.  local cfg = CreateFrame("Frame")
  3.  
  4.  
  5. -----------------------------
  6. -- Unit Frames
  7. -----------------------------
  8.  
  9. cfg.size = "large"      -- Chose between small and large layouts
  10.                         -- nibRealUI will control the size if it's installed
  11.  
  12. cfg.focus = true        -- Set/Clear focus with focuskey + left click
  13. cfg.focuskey = "shift"  -- shift / alt / ctrl
  14.  
  15. cfg.arena = false       -- Enable Arena frames
  16. cfg.showtank = false    -- Enable MainTank frame
  17.  
  18. -- Unit Frames Positions
  19. cfg.unit_positions = {             
  20.     small = {
  21.         player =        { x = -287, y = -38},
  22.         pet =           { x = 11,   y = 0},     -- Anchored to Player
  23.         focus =         { x = 0,    y = -51},   -- Anchored to Player
  24.         focustarget =   { x = 0,    y = -10},   -- Anchored to Focus
  25.         target =        { x = 287,  y = -38},
  26.         targettarget =  { x = 0,    y = -51},   -- Anchored to Target
  27.         tank =          { x = 0,    y = -10},   -- Anchored to TargetTarget
  28.     },
  29.     large = {
  30.         player =        { x = -307, y = -38},
  31.         pet =           { x = 11,   y = 0},     -- Anchored to Player
  32.         focus =         { x = 0,    y = -51},   -- Anchored to Player
  33.         focustarget =   { x = 0,    y = -10},   -- Anchored to Focus
  34.         target =        { x = 307,  y = -38},
  35.         targettarget =  { x = 0,    y = -51},   -- Anchored to Target
  36.         tank =          { x = 0,    y = -10},   -- Anchored to TargetTarget
  37.         raid =          { x = 0,    y = -100},
  38.     },
  39. }
  40.  
  41. -----------------------------
  42. -- Overlay
  43. -----------------------------
  44.  
  45. cfg.overlay = {
  46.     -- Font
  47.     font = {
  48.         small = {"Interface\\AddOns\\oUF_RealUI\\media\\pixel_lr_small.ttf", 8, "MONOCHROMEOUTLINE"},
  49.         large = {"Interface\\AddOns\\oUF_RealUI\\media\\pixel_hr_small.ttf", 8, "MONOCHROMEOUTLINE"},
  50.     },
  51.     -- Bars
  52.     bar = {
  53.         opacity = {
  54.             surround = 1,           -- Border of objects
  55.             background = 0.5,       -- Background of unit frame
  56.             status = 0.8,           -- Background of objects (arrow, end box, etc)
  57.             bar = {0.2, 0.5},       -- Health/Power gradient {start, end}
  58.             bar2 = {0.4, 1},        -- Pet/Vehicle Health/Power gradient {start, end}
  59.             steps = 0.7,            -- Tiny step indicator
  60.         },
  61.         colors = {
  62.             byhostility = true,
  63.             byclass = true,
  64.         },
  65.     },
  66.     -- Arrows
  67.     arrow = {
  68.         opacity = {
  69.             surround = 1,
  70.             background = 0.8,
  71.         },
  72.         colors = {
  73.             [1] = {1, 1, 1},
  74.             [2] = {1, 1, 0},
  75.             [3] = {1, 0, 0},
  76.             [4] = {1, 0.5, 0},
  77.         },
  78.     },
  79. }
  80.  
  81. -----------------------------
  82. -- Handover
  83. -----------------------------
  84.  
  85. ns.cfg = cfg

layout.lua
Lua Code:
  1. local name, ns = ...
  2. local cfg = ns.cfg
  3. local layoutSize = cfg.size == "large" and "large" or "small"
  4.  
  5. -- Unit Frames Sizes
  6. local unit_sizes = {
  7.     small = {
  8.         player =        {width = 224, height = 22},
  9.         pet =           {width = 10, height = 22},
  10.         focus =         {width = 158, height = 10},
  11.         focustarget =   {width = 148, height = 10},
  12.         target =        {width = 224, height = 22},
  13.         targettarget =  {width = 158, height = 10},
  14.         tank =          {width = 158, height = 10},
  15.     },
  16.     large = {
  17.         player =        {width = 244, height = 22},
  18.         pet =           {width = 11, height = 22},
  19.         focus =         {width = 168, height = 10},
  20.         focustarget =   {width = 158, height = 10},
  21.         target =        {width = 244, height = 22},
  22.         targettarget =  {width = 168, height = 10},
  23.         tank =          {width = 168, height = 10},
  24.         raid =          {width = 68, height = 42},
  25.     },
  26. }
  27.  
  28. -- Frame background
  29. local framebd = {
  30.     edgeFile = "", edgeSize = 0,
  31.     bgFile = [=[Interface\ChatFrame\ChatFrameBackground]=],
  32.     insets = {left = 0, right = 0, top = 0, bottom = 0}
  33. }
  34.  
  35. local framebackdrop = function(parent, anchor)
  36.     local frame = CreateFrame("Frame", nil, parent)
  37.     frame:SetFrameStrata("LOW")
  38.     frame:SetPoint("TOPLEFT", anchor, "TOPLEFT")
  39.     frame:SetPoint("BOTTOMRIGHT", anchor, "BOTTOMRIGHT")
  40.     frame:SetBackdrop(framebd)
  41.     frame:SetBackdropColor(1, .5, .5, 0)
  42.     frame:SetBackdropBorderColor(0, 0, 0, 0)
  43.     return frame
  44. end
  45.  
  46. ns.bd = framebackdrop
  47. -------------------
  48.  
  49. local OnEnter = function(self)
  50.     UnitFrame_OnEnter(self)
  51. end
  52.  
  53. local OnLeave = function(self)
  54.     UnitFrame_OnLeave(self)
  55. end
  56.  
  57. --------------------
  58.  
  59. local dropdown = CreateFrame('Frame', name .. 'DropDown', UIParent, 'UIDropDownMenuTemplate')
  60.  
  61. local function DisplayFocusPopUp()
  62.     StaticPopupDialogs["RUIFOCUSHELP"] = {
  63.         text = "Use Shift+Click to set focus.",
  64.         button1 = OKAY,
  65.         OnAccept = function() return end,
  66.         timeout = 0,
  67.         whileDead = true,
  68.         hideOnEscape = true,
  69.         notClosableByLogout = false,
  70.     }
  71.     StaticPopup_Show("RUIFOCUSHELP")
  72. end
  73.  
  74. hooksecurefunc("UnitPopup_OnClick",function(self)
  75.     local button = self.value
  76.     if button == "SET_FOCUS" or button == "CLEAR_FOCUS" then
  77.         if StaticPopup1 then
  78.             StaticPopup1:Hide()
  79.             DisplayFocusPopUp()
  80.         end
  81.     end
  82. end)
  83.  
  84. local function menu(self)
  85.     dropdown:SetParent(self)
  86.     return ToggleDropDownMenu(1, nil, dropdown, 'cursor', 0, 0)
  87. end
  88.  
  89. local init = function(self)
  90.     local unit = self:GetParent().unit
  91.     local menu, name, id
  92.    
  93.     if (not unit) then
  94.         return
  95.     end
  96.    
  97.     if (UnitIsUnit(unit, "player")) then
  98.         menu = "SELF"
  99.     elseif (UnitIsUnit(unit, "vehicle")) then
  100.         menu = "VEHICLE"
  101.     elseif (UnitIsUnit(unit, "pet")) then
  102.         menu = "PET"
  103.     elseif (UnitIsPlayer(unit)) then
  104.         id = UnitInRaid(unit)
  105.         if(id) then
  106.             menu = "RAID_PLAYER"
  107.             name = GetRaidRosterInfo(id)
  108.         elseif(UnitInParty(unit)) then
  109.             menu = "PARTY"
  110.         else
  111.             menu = "PLAYER"
  112.         end
  113.     else
  114.         menu = "TARGET"
  115.         name = RAID_TARGET_ICON
  116.     end
  117.    
  118.     if (menu) then
  119.         UnitPopup_ShowMenu(self, menu, unit, name, id)
  120.     end
  121. end
  122.  
  123. UIDropDownMenu_Initialize(dropdown, init, 'MENU')
  124.  
  125. -----------------------
  126.  
  127. local Shared = function(self, unit)
  128.     self.menu = menu
  129.    
  130.     self.framebd = ns.bd(self, self)
  131.    
  132.     self:SetScript("OnEnter", OnEnter)
  133.     self:SetScript("OnLeave", OnLeave)
  134.     self:RegisterForClicks"AnyUp"
  135.    
  136.     if cfg.focus then
  137.        local ModKey = cfg.focuskey
  138.        local MouseButton = 1
  139.        local key = ModKey .. '-type' .. (MouseButton or '')
  140.        if(self.unit == 'focus') then
  141.           self:SetAttribute(key, 'macro')
  142.           self:SetAttribute('macrotext', '/clearfocus')
  143.         else
  144.           self:SetAttribute(key, 'focus')
  145.         end
  146.     end
  147. end
  148.  
  149. local LF = CreateFrame("Frame")
  150. LF:RegisterEvent("VARIABLES_LOADED")
  151. LF:SetScript("OnEvent", function()
  152.     LF:UnregisterEvent("VARIABLES_LOADED")
  153.    
  154.     if nibRealUICharacter then
  155.         if nibRealUICharacter.resolution then
  156.             layoutSize = (nibRealUICharacter.resolution == 2) and "large" or "small"
  157.         end
  158.     end
  159.    
  160.     local UnitSpecific = {
  161.         player = function(self, ...)
  162.             Shared(self, ...)
  163.             self:SetSize(unit_sizes[layoutSize].player.width, unit_sizes[layoutSize].player.height)
  164.         end,
  165.        
  166.         focus = function(self, ...)
  167.             Shared(self, ...)
  168.             self:SetSize(unit_sizes[layoutSize].focus.width, unit_sizes[layoutSize].focus.height)
  169.         end,
  170.        
  171.         focustarget = function(self, ...)
  172.             Shared(self, ...)
  173.             self:SetSize(unit_sizes[layoutSize].focustarget.width, unit_sizes[layoutSize].focustarget.height)
  174.         end,
  175.        
  176.         pet = function(self, ...)
  177.             Shared(self, ...)
  178.             self:SetSize(unit_sizes[layoutSize].pet.width, unit_sizes[layoutSize].pet.height)
  179.         end,
  180.        
  181.         target = function(self, ...)
  182.             Shared(self, ...)
  183.             self:SetSize(unit_sizes[layoutSize].target.width, unit_sizes[layoutSize].target.height)
  184.         end,
  185.        
  186.         targettarget = function(self, ...)
  187.             Shared(self, ...)
  188.             self:SetSize(unit_sizes[layoutSize].targettarget.width, unit_sizes[layoutSize].targettarget.height)
  189.         end,
  190.        
  191.         raid = function(self, ...)
  192.             Shared(self, ...)
  193.             self:SetSize(unit_sizes[layoutSize].raid.width, unit_sizes[layoutSize].raid.height)
  194.         end,
  195.        
  196.         -- tank = function(self, ...)
  197.             -- Shared(self, ...)
  198.             -- self:SetSize(unit_sizes[layoutSize].tank.width, unit_sizes[layoutSize].tank.height)
  199.         -- end,
  200.     }
  201.  
  202.     oUF:RegisterStyle("RealUI", Shared)
  203.  
  204.     for unit,layout in next, UnitSpecific do
  205.         oUF:RegisterStyle('RealUI - ' .. unit:gsub("^%l", string.upper), layout)
  206.     end
  207.  
  208.     local spawnHelper = function(self, unit, ...)
  209.         if (UnitSpecific[unit]) then
  210.             self:SetActiveStyle('RealUI - ' .. unit:gsub("^%l", string.upper))
  211.         elseif(UnitSpecific[unit:match('[^%d]+')]) then
  212.             self:SetActiveStyle('RealUI - ' .. unit:match('[^%d]+'):gsub("^%l", string.upper))
  213.         else
  214.             self:SetActiveStyle'RealUI'
  215.         end
  216.        
  217.         local object = self:Spawn(unit)
  218.         object:SetPoint(...)
  219.         return object
  220.     end
  221.  
  222.     oUF:Factory(function(self)
  223.         spawnHelper(self, "player", "CENTER", cfg.unit_positions[layoutSize].player.x, cfg.unit_positions[layoutSize].player.y)
  224.         spawnHelper(self, "pet", "RIGHT", "oUF_RealUIPlayer", cfg.unit_positions[layoutSize].pet.x, cfg.unit_positions[layoutSize].pet.y)
  225.         spawnHelper(self, "focus", "RIGHT", "oUF_RealUIPlayer", cfg.unit_positions[layoutSize].focus.x, cfg.unit_positions[layoutSize].focus.y)
  226.         spawnHelper(self, "focustarget", "RIGHT", "oUF_RealUIFocus", cfg.unit_positions[layoutSize].focustarget.x, cfg.unit_positions[layoutSize].focustarget.y)
  227.         spawnHelper(self, "target", "CENTER", cfg.unit_positions[layoutSize].target.x, cfg.unit_positions[layoutSize].target.y)
  228.         spawnHelper(self, "targettarget", "LEFT", "oUF_RealUITarget", cfg.unit_positions[layoutSize].targettarget.x, cfg.unit_positions[layoutSize].targettarget.y)
  229.        
  230.         raid = self:SpawnHeader('oUF_RealUIRaid', nil, "solo,party,raid",
  231.             'showPlayer', true,
  232.             'showSolo', true,
  233.             'showParty', true,
  234.             'showRaid', true,
  235.             'xoffset', 5,
  236.             'yOffset', -4,
  237.             'point', "TOP",
  238.             'groupFilter', '1,2,3,4,5',
  239.             'groupingOrder', '1,2,3,4,5,6,7,8',
  240.             'groupBy', 'GROUP',
  241.             'maxColumns', 8,
  242.             'unitsPerColumn', 5,
  243.             'columnSpacing', 5,
  244.             'columnAnchorPoint', "LEFT",
  245.             'oUF-initialConfigFunction', ([[
  246.                 self:SetHeight(%d)
  247.                 self:SetWidth(%d)
  248.             ]]):format(unit_sizes[layoutSize].raid.width, unit_sizes[layoutSize].raid.height)
  249.         )
  250.        
  251.         raid:SetPoint("TOP", UIParent, "CENTER", 0, -160)
  252.         -- Main Tank
  253.         -- if cfg.showtank then
  254.             -- self:SetActiveStyle("RealUI - Tank")
  255.            
  256.             -- local tank = self:SpawnHeader('oUF_MainTank', nil, 'raid',
  257.                     -- 'oUF-initialConfigFunction', ([[
  258.                         -- self:SetWidth(%d)
  259.                         -- self:SetHeight(%d)
  260.                     -- ]]):format(unit_sizes[layoutSize].tank.width, unit_sizes[layoutSize].tank.height),
  261.                     -- 'showRaid', true,
  262.                     -- 'groupFilter', 'MAINTANK',
  263.                     -- 'yOffset', 0,
  264.                     -- 'point' , 'BOTTOM'
  265.                 -- )
  266.             -- tank:SetPoint("LEFT", self.units.target, cfg.unit_positions[layoutSize].tank.x, cfg.unit_positions[layoutSize].tank.y)
  267.         -- end
  268.        
  269.         ns.overlayinit()
  270.     end)
  271. end)

overlay.lua
Lua Code:
  1. local name, ns = ...
  2. local cfg = ns.cfg.overlay
  3. local layoutSize = (ns.cfg.size == "large") and "large" or "small"
  4.  
  5. local Overlay = CreateFrame("Frame")
  6. local RC = LibStub("LibRangeCheck-2.0")
  7.  
  8. local _G = getfenv(0)
  9. local min = math.min
  10. local max = math.max
  11. local floor = _G.floor
  12. local ceil = _G.ceil
  13. local format = _G.format
  14. local strform = _G.string.format
  15. local tonumber = _G.tonumber
  16. local tostring = _G.tostring
  17. local strlen = _G.strlen
  18. local strsub = _G.strsub
  19.  
  20. local PLAYER_ID = "player"
  21. local PET_ID = "pet"
  22. local VEHICLE_ID = "vehicle"
  23. local FOCUS_ID = "focus"
  24. local FOCUSTARGET_ID = "focustarget"
  25. local TARGET_ID = "target"
  26. local TARGETTARGET_ID = "targettarget"
  27. local MAINTANK_ID = "maintank"
  28. local RAID_ID = "raid"
  29.  
  30. local _, class = UnitClass("player")
  31.  
  32. local fontPixel1
  33.  
  34. local Textures = {
  35.     plain = [[Interface\AddOns\oUF_RealUI\media\Plain]],
  36.     small = {
  37.         f1 = {
  38.             health = {
  39.                 surround = [[Interface\AddOns\oUF_RealUI\media\small\F1_Health_Surround]],
  40.                 bar = [[Interface\AddOns\oUF_RealUI\media\small\F1_Health_Bar]],
  41.                 step = [[Interface\AddOns\oUF_RealUI\media\small\F1_Health_Step]],
  42.                 arrow = {
  43.                     surround = [[Interface\AddOns\oUF_RealUI\media\small\F1_Health_Arrow_Surround]],
  44.                     background = [[Interface\AddOns\oUF_RealUI\media\small\F1_Health_Arrow_Background]],
  45.                 },
  46.             },
  47.             power = {
  48.                 surround = [[Interface\AddOns\oUF_RealUI\media\small\F1_Power_Surround]],
  49.                 bar = [[Interface\AddOns\oUF_RealUI\media\small\F1_Power_Bar]],
  50.                 step = [[Interface\AddOns\oUF_RealUI\media\small\F1_Power_Step]],
  51.                 arrow = {
  52.                     surround = [[Interface\AddOns\oUF_RealUI\media\small\F1_Power_Arrow_Surround]],
  53.                     background = [[Interface\AddOns\oUF_RealUI\media\small\F1_Power_Arrow_Background]],
  54.                 },
  55.             },
  56.             endbox = {
  57.                 surround = [[Interface\AddOns\oUF_RealUI\media\small\F1_EndBox_Surround]],
  58.                 bar = [[Interface\AddOns\oUF_RealUI\media\small\F1_EndBox_Bar]],
  59.             },
  60.             statusbox = {
  61.                 surround = [[Interface\AddOns\oUF_RealUI\media\small\F1_StatusBox_Surround]],
  62.                 bar = [[Interface\AddOns\oUF_RealUI\media\small\F1_StatusBox_Bar]],
  63.             },
  64.         },
  65.         f2 = {
  66.             health = {
  67.                 surround = [[Interface\AddOns\oUF_RealUI\media\small\F2_Health_Surround]],
  68.                 bar = [[Interface\AddOns\oUF_RealUI\media\small\F2_Health_Bar]],
  69.             },
  70.             endbox = {
  71.                 surround = [[Interface\AddOns\oUF_RealUI\media\small\F2_EndBox_Surround]],
  72.                 bar = [[Interface\AddOns\oUF_RealUI\media\small\F2_EndBox_Bar]],
  73.             },
  74.             statusbox = {
  75.                 surround = [[Interface\AddOns\oUF_RealUI\media\small\F1_StatusBox_Surround]],
  76.                 bar = [[Interface\AddOns\oUF_RealUI\media\small\F1_StatusBox_Bar]],
  77.             },
  78.         },
  79.         f3 = {
  80.             health = {
  81.                 surround = [[Interface\AddOns\oUF_RealUI\media\small\F3_Health_Surround]],
  82.                 bar = [[Interface\AddOns\oUF_RealUI\media\small\F3_Health_Bar]],
  83.             },
  84.             endbox = {
  85.                 surround = [[Interface\AddOns\oUF_RealUI\media\small\F2_EndBox_Surround]],
  86.                 bar = [[Interface\AddOns\oUF_RealUI\media\small\F2_EndBox_Bar]],
  87.             },
  88.             statusbox = {
  89.                 surround = [[Interface\AddOns\oUF_RealUI\media\small\F1_StatusBox_Surround]],
  90.                 bar = [[Interface\AddOns\oUF_RealUI\media\small\F1_StatusBox_Bar]],
  91.             },
  92.         },
  93.     },
  94.     large = {
  95.         f0 = {
  96.             health = {
  97.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F0_Health_Surround]],
  98.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F0_Health_Bar]],
  99.             },
  100.             power = {
  101.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F0_Power_Surround]],
  102.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F0_Power_Bar]],
  103.             },
  104.             indikator = {
  105.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F0_indikator_Surround]],
  106.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F0_indikator_Bar]],
  107.             },
  108.         },
  109.         f1 = {
  110.             health = {
  111.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F1_Health_Surround]],
  112.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F1_Health_Bar]],
  113.                 step = [[Interface\AddOns\oUF_RealUI\media\large\F1_Health_Step]],
  114.                 arrow = {
  115.                     surround = [[Interface\AddOns\oUF_RealUI\media\large\F1_Health_Arrow_Surround]],
  116.                     background = [[Interface\AddOns\oUF_RealUI\media\large\F1_Health_Arrow_Background]],
  117.                 },
  118.             },
  119.             power = {
  120.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F1_Power_Surround]],
  121.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F1_Power_Bar]],
  122.                 step = [[Interface\AddOns\oUF_RealUI\media\large\F1_Power_Step]],
  123.                 arrow = {
  124.                     surround = [[Interface\AddOns\oUF_RealUI\media\large\F1_Power_Arrow_Surround]],
  125.                     background = [[Interface\AddOns\oUF_RealUI\media\large\F1_Power_Arrow_Background]],
  126.                 },
  127.             },
  128.             endbox = {
  129.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F1_EndBox_Surround]],
  130.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F1_EndBox_Bar]],
  131.             },
  132.             statusbox = {
  133.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F1_StatusBox_Surround]],
  134.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F1_StatusBox_Bar]],
  135.             },
  136.         },
  137.         f2 = {
  138.             health = {
  139.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F2_Health_Surround]],
  140.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F2_Health_Bar]],
  141.             },
  142.             endbox = {
  143.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F2_EndBox_Surround]],
  144.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F2_EndBox_Bar]],
  145.             },
  146.             statusbox = {
  147.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F1_StatusBox_Surround]],
  148.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F1_StatusBox_Bar]],
  149.             },
  150.         },
  151.         f3 = {
  152.             health = {
  153.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F3_Health_Surround]],
  154.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F3_Health_Bar]],
  155.             },
  156.             endbox = {
  157.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F2_EndBox_Surround]],
  158.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F2_EndBox_Bar]],
  159.             },
  160.             statusbox = {
  161.                 surround = [[Interface\AddOns\oUF_RealUI\media\large\F1_StatusBox_Surround]],
  162.                 bar = [[Interface\AddOns\oUF_RealUI\media\large\F1_StatusBox_Bar]],
  163.             },
  164.         },
  165.     },
  166. }
  167.  
  168. local HealthEndBarCoords = {
  169.     small = {
  170.         [PLAYER_ID] = {35/256, 43/256, 0, 1},
  171.         [TARGET_ID] = {43/256, 35/256, 0, 1},
  172.         [FOCUS_ID] = {101/256, 107/256, 0, 1},
  173.         [FOCUSTARGET_ID] = {111/256, 117/256, 0, 1},
  174.         [TARGETTARGET_ID] = {107/256, 101/256, 0, 1},
  175.     },
  176.     large = {
  177.         [PLAYER_ID] = {15/256, 24/256, 0, 1},
  178.         [TARGET_ID] = {24/256, 15/256, 0, 1},
  179.         [FOCUS_ID] = {81/256, 88/256, 0, 1},
  180.         [FOCUSTARGET_ID] = {91/256, 98/256, 0, 1},
  181.         [TARGETTARGET_ID] = {88/256, 81/256, 0, 1},
  182.         [RAID_ID] = {31/128, 47/128, 0, 1},
  183.     },
  184. }
  185.  
  186. local PowerEndBarCoords = {
  187.     small = {
  188.         [PLAYER_ID] = {55/256, 61/256, 0, 1},
  189.         [TARGET_ID] = {61/256, 55/256, 0, 1},
  190.     },
  191.     large = {
  192.         [PLAYER_ID] = {35/256, 42/256, 0, 1},
  193.         [TARGET_ID] = {42/256, 35/256, 0, 1},
  194.     },
  195. }
  196.  
  197. local SimpleBackdrop = {
  198.     bgFile = Textures.plain,
  199.     edgeFile = Textures.plain,
  200.     tile = false, tileSize = 0, edgeSize = 1,
  201.     insets = { left = 1, right = 1, top = 1, bottom = 1 }
  202. }
  203.  
  204. local UF = {
  205.     [PLAYER_ID] = nil,
  206.     [PET_ID] = nil,
  207.     [TARGET_ID] = nil,
  208.     [FOCUS_ID] = nil,
  209.     [FOCUSTARGET_ID] = nil,
  210.     [TARGETTARGET_ID] = nil,
  211.     [MAINTANK_ID] = nil,
  212.     [RAID_ID] = nil,
  213. }
  214.  
  215. local ParentFrames = {
  216.     [PLAYER_ID] = "oUF_RealUIPlayer",
  217.     [PET_ID] = "oUF_RealUIPet",
  218.     [TARGET_ID] = "oUF_RealUITarget",
  219.     [FOCUS_ID] = "oUF_RealUIFocus",
  220.     [FOCUSTARGET_ID] = "oUF_RealUIFocusTarget",
  221.     [TARGETTARGET_ID] = "oUF_RealUITargetTarget",
  222.     [MAINTANK_ID] = "oUF_RealUIMaintank",
  223.     [RAID_ID] = "oUF_RealUIRaid",
  224. }
  225.  
  226. local HealthWidth = {
  227.     small = {
  228.         [PLAYER_ID] = 220,
  229.         [PET_ID] = 220,
  230.         [TARGET_ID] = 220,
  231.         [FOCUS_ID] = 154,
  232.         [FOCUSTARGET_ID] = 145,
  233.         [TARGETTARGET_ID] = 154,
  234.         [MAINTANK_ID] = 145,
  235.     },
  236.     large = {
  237.         [PLAYER_ID] = 240,
  238.         [PET_ID] = 240,
  239.         [TARGET_ID] = 240,
  240.         [FOCUS_ID] = 174,
  241.         [FOCUSTARGET_ID] = 165,
  242.         [TARGETTARGET_ID] = 174,
  243.         [MAINTANK_ID] = 165,
  244.         [RAID_ID] = 68,
  245.     },
  246. }
  247. local HealthWidthShort = {
  248.     small = {
  249.         [PLAYER_ID] = 212,
  250.         [PET_ID] = 220,
  251.         [TARGET_ID] = 212,
  252.         [FOCUS_ID] = 148,
  253.         [FOCUSTARGET_ID] = 138,
  254.         [TARGETTARGET_ID] = 148,
  255.         [MAINTANK_ID] = 138,
  256.     },
  257.     large = {
  258.         [PLAYER_ID] = 231,
  259.         [PET_ID] = 240,
  260.         [TARGET_ID] = 231,
  261.         [FOCUS_ID] = 168,
  262.         [FOCUSTARGET_ID] = 157,
  263.         [TARGETTARGET_ID] = 168,
  264.         [MAINTANK_ID] = 157,
  265.         [RAID_ID] = 48,
  266.     },
  267. }
  268.  
  269. local PowerWidth = {
  270.     small = {
  271.         [PLAYER_ID] = 200,
  272.         [PET_ID] = 200,
  273.         [TARGET_ID] = 200,
  274.     },
  275.     large = {
  276.         [PLAYER_ID] = 220,
  277.         [PET_ID] = 220,
  278.         [TARGET_ID] = 220,
  279.     },
  280. }
  281. local PowerWidthShort = {
  282.     small = {
  283.         [PLAYER_ID] = 194,
  284.         [PET_ID] = 200,
  285.         [TARGET_ID] = 194,
  286.     },
  287.     large = {
  288.         [PLAYER_ID] = 213,
  289.         [PET_ID] = 220,
  290.         [TARGET_ID] = 213,
  291.     },
  292. }
  293.  
  294. local HealthTextYOffset = {
  295.     small = {
  296.         [PLAYER_ID] = 13,
  297.         [TARGET_ID] = 13,
  298.     },
  299.     large = {
  300.         [PLAYER_ID] = 14,
  301.         [TARGET_ID] = 14,
  302.     },
  303. }
  304.  
  305. local PowerTextYOffset = {
  306.     small = {
  307.         [PLAYER_ID] = -4,
  308.         [TARGET_ID] = -8,
  309.     },
  310.     large = {
  311.         [PLAYER_ID] = -6,
  312.         [TARGET_ID] = -10,
  313.     },
  314. }
  315.  
  316. local HealthArrowYOffset = {
  317.     small = 12,
  318.     large = 13,
  319. }
  320.  
  321. local PowerArrowYOffset = {
  322.     small = -35,
  323.     large = -35,
  324. }
  325.  
  326. local PowerArrowTextYOffset = {
  327.     small = -1,
  328.     large = -2,
  329. }
  330.  
  331. local NameLengths = {
  332.     small = {
  333.         [TARGET_ID] = 20,
  334.         [FOCUS_ID] = 12,
  335.         [FOCUSTARGET_ID] = 12,
  336.         [TARGETTARGET_ID] = 12,
  337.         [MAINTANK_ID] = 12,
  338.     },
  339.     large = {
  340.         [TARGET_ID] = 18,
  341.         [FOCUS_ID] = 12,
  342.         [FOCUSTARGET_ID] = 12,
  343.         [TARGETTARGET_ID] = 12,
  344.         [MAINTANK_ID] = 12,
  345.         [RAID_ID] = 6,
  346.     },
  347. }
  348.  
  349. local PowerUpdateSpeeds = {
  350.     ["default"] = 1/10,
  351.     ["ENERGY"] = 1/20,
  352. }
  353.  
  354. local ReversePowers = {
  355.     ["RAGE"] = true,
  356.     ["RUNIC_POWER"] = true,
  357.     ["POWER_TYPE_SUN_POWER"] = true,
  358. }
  359.  
  360. local StepPoints = {
  361.     ["default"] = {0.35, 0.25},
  362.     ["HUNTER"] = {0.35, 0.2},
  363.     ["PALADIN"] = {0.35, 0.2},
  364.     ["WARLOCK"] = {0.35, 0.2},
  365.     ["WARRIOR"] = {0.35, 0.2},
  366. }
  367. local PlayerStepPoints
  368.  
  369. local StatusColors = {
  370.     damage = {1, 0, 0},
  371.     incomingheal = {1, 1, 0},
  372.     heal = {0, 1, 0},
  373.     resting = {0, 1, 0},
  374.     combat = {1, 0, 0},
  375.     afk = {1, 1, 0},
  376.     offline = {0.6, 0.6, 0.6},
  377.     leader = {0, 1, 1},
  378.     tapped = {0.4, 0.4, 0.4},
  379.     pvpenemy = {0.25, 0, 0},
  380.     pvpfriendly = {0, 0.25, 0},
  381.     dead = {0.5, 0.5, 0.5},
  382. }
  383.  
  384. local HealthColors = {
  385.     normal = {0.8, 0, 0},
  386.     hostile = {0.8, 0, 0},
  387.     neutral = {0.7, 0.7, 0},
  388.     friendly = {0, 0.7, 0},
  389. }
  390.  
  391. local PowerColors = {}
  392.  
  393. local ClassificationShort = {
  394.     ["worldboss"] = "?",
  395.     ["rareelite"] = "R",
  396.     ["elite"] = "E",
  397.     ["rare"] = "r",
  398.     ["normal"] = "",
  399.     ["trivial"] = "",
  400. }
  401.  
  402. local RangeColors = {
  403.     [5] = {1, 1, 1},
  404.     [30] = {1, 1, 0.6},
  405.     [35] = {1, 0.9, 0},
  406.     [40] = {1, 0.6, 0},
  407.     [100] = {1, 0, 0},
  408. }
  409.  
  410. local UnitHealthVal = {
  411.     [PLAYER_ID] = 0,
  412.     [TARGET_ID] = 0,
  413.     [VEHICLE_ID] = 0,
  414. }
  415.  
  416. ---- MISC FUNCTIONS ----
  417. -- Seconds to Time
  418. local function ConvertSecondstoTime(value)
  419.     local minues, seconds
  420.     minutes = floor(value / 60)
  421.     seconds = floor(value - (minutes * 60))
  422.     if ( minutes > 0 ) then
  423.         if ( seconds < 10 ) then seconds = strform("0%d", seconds) end
  424.         return strform("%s:%s", minutes, seconds)
  425.     else
  426.         return strform("%ss", seconds)
  427.     end
  428. end
  429.  
  430. -- Safe Unit Vals
  431. local function GetSafeVals(vCur, vMax)
  432.     local percent
  433.     if vCur > 0 and vMax == 0 then
  434.         vMax = vCur
  435.         percent = 1
  436.     elseif vCur == 0 and vMax == 0 then
  437.         percent = 1
  438.     else
  439.         percent = vCur / vMax
  440.     end
  441.     return vCur, vMax, percent
  442. end
  443.  
  444. -- Readable Numbers
  445. local function ReadableNumber(num, places)
  446.     local ret
  447.     local placeValue = ("%%.%df"):format(places or 0)
  448.     if not num then
  449.         return 0
  450.     elseif num >= 10000000 then
  451.         ret = tostring(floor(num / 1000000)) .. "m" -- million (no decimal)
  452.     elseif num >= 1000000 then
  453.         ret = placeValue:format(num / 1000000) .. "m" -- million
  454.     elseif num >= 200000 then
  455.         places = 0
  456.         ret = tostring(floor(num / 1000)) .. "k" -- thousand (no decimal)
  457.     elseif num >= 1000 then
  458.         ret = placeValue:format(num / 1000) .. "k" -- thousand
  459.     else
  460.         ret = num -- hundreds
  461.     end
  462.     return ret
  463. end
  464.  
  465. -- Class Color
  466. local classColors
  467. local function GetClassColor(class)
  468.     if not RAID_CLASS_COLORS[class] then return {1, 1, 1} end
  469.     classColors = CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS[class] or RAID_CLASS_COLORS[class]
  470.     return {classColors.r, classColors.g , classColors.b}
  471. end
  472.  
  473. -- Power Colors
  474. local function GetPowerColors()
  475.     for pToken, color in pairs(PowerBarColor) do
  476.         if type(pToken) == "string" then
  477.             if color.r then
  478.                 PowerColors[pToken] = {color.r, color.g, color.b}
  479.             end
  480.         end
  481.     end
  482.     PowerColors["POWER_TYPE_PYRITE"] = { 0, 0.79215693473816, 1 }
  483.     PowerColors["POWER_TYPE_STEAM"] = { 0.94901967048645, 0.94901967048645, 0.94901967048645 }
  484.     PowerColors["POWER_TYPE_HEAT"] = { 1, 0.490019610742107, 0 }
  485.     PowerColors["POWER_TYPE_BLOOD_POWER"] = { 0.73725494556129, 0, 1 }
  486.     PowerColors["POWER_TYPE_OOZE"] = { 0.75686281919479, 1, 0 }
  487. end
  488.  
  489. -- Frame Position
  490. local function SetFramePosition(frame, strata, level, width, height, ...)
  491.     frame:ClearAllPoints()
  492.     frame:SetFrameStrata(strata)
  493.     frame:SetFrameLevel(level)
  494.     frame:SetWidth(width)
  495.     frame:SetHeight(height)
  496.     if ... then
  497.         frame:SetPoint(unpack(...))
  498.     end
  499. end
  500.  
  501. -- Text Position
  502. local function SetTextPosition(frame, p1, p2)
  503.     local cPos = (p1 ~= "CENTER") and p1..p2 or p1
  504.     frame.text:ClearAllPoints()
  505.     frame.text:SetPoint(cPos, frame, cPos, 0.5, 0.5)
  506.     frame.text:SetJustifyH(p2)
  507.     frame.text:SetJustifyV(p1)
  508. end
  509.  
  510. -- Vehicle swap
  511. local function PlayerOrVehicleIDs(UnitID)
  512.     if ((UnitID == PLAYER_ID) or (UnitID == VEHICLE_ID)) then
  513.         if UF[PLAYER_ID].vehicle then
  514.             return VEHICLE_ID, PLAYER_ID
  515.         else
  516.             return PLAYER_ID, PLAYER_ID
  517.         end
  518.     elseif (UnitID == PET_ID) then
  519.         return PET_ID, PLAYER_ID
  520.     else
  521.         return UnitID, UnitID
  522.     end
  523. end
  524. local function SetPlayerVehicleFlag()
  525.     UF[PLAYER_ID].vehicle = (UnitHasVehicleUI(PLAYER_ID) and UnitExists(VEHICLE_ID))
  526. end
  527.  
  528. ---- UNIT FRAME UPDATES ----
  529. -- Smooth
  530. local smoothing = {}
  531. local function SetBarPosition(bar, pos)
  532.     bar:SetWidth(pos)
  533.     bar.pos = pos
  534.    
  535.     if pos > 1 then
  536.         if not bar.ender.visible then
  537.             bar.ender.visible = true
  538.             bar.ender:Show()
  539.         end
  540.        
  541.         if not bar.reverse then
  542.             bar.alpha = cfg.bar.opacity.bar[1] + (cfg.bar.opacity.bar[2] - cfg.bar.opacity.bar[1]) * (pos / bar.maxwidth)
  543.         else
  544.             bar.alpha = cfg.bar.opacity.bar[1] + (cfg.bar.opacity.bar[2] - cfg.bar.opacity.bar[1]) * (1 - (pos / bar.maxwidth))
  545.         end
  546.        
  547.         bar.bg:SetAlpha(bar.alpha)
  548.         bar.ender.bg:SetAlpha(bar.alpha)
  549.     else
  550.         bar.bg:SetAlpha(0)
  551.         if bar.ender.visible then
  552.             bar.ender.visible = false
  553.             bar.ender:Hide()
  554.         end
  555.     end
  556. end
  557.  
  558. local function SetBarValue(bar, pos)
  559.     pos = pos + 1
  560.     if pos ~= bar.pos then
  561.         smoothing[bar] = pos
  562.     else
  563.         SetBarPosition(bar, pos)
  564.         smoothing[bar] = nil
  565.     end
  566. end
  567.  
  568. local smoothUpdateFrame = CreateFrame('Frame')
  569. smoothUpdateFrame:SetScript('OnUpdate', function()
  570.     local limit = 30 / GetFramerate()
  571.     for bar, pos in pairs(smoothing) do
  572.         local cur = bar.pos
  573.         local new = cur + min((pos-cur)/3, max(pos-cur, limit))
  574.         if new ~= new then
  575.             new = pos
  576.         end
  577.         SetBarPosition(bar, new)
  578.         if cur == pos or abs(new - pos) < 2 then
  579.             SetBarPosition(bar, pos)
  580.             smoothing[bar] = nil
  581.         end
  582.     end
  583. end)
  584.  
  585.  
  586. -- Range Display
  587. function Overlay:UpdateUnitRange(UnitID)
  588.     if not(UnitExists(UnitID)) then return end
  589.    
  590.     -- Get range
  591.     local section
  592.     local minRange, maxRange = RC:GetRange(UnitID)
  593.    
  594.     -- Pet/Player swap
  595.     if (UnitID == PET_ID) or (UnitID == VEHICLE_ID) then UnitID = PLAYER_ID end
  596.    
  597.     -- No change? Skip
  598.     if ((minRange == UF[UnitID].rangedisplay.lastmin) and (maxRange == UF[UnitID].rangedisplay.lastmin)) then return end
  599.    
  600.     -- Get Range section
  601.     if UnitIsUnit(PLAYER_ID, UnitID) then maxRange = nil end
  602.     if minRange > 80 then maxRange = nil end
  603.     if maxRange then
  604.         if maxRange <= 5 then
  605.             section = 5
  606.         elseif maxRange <= 30 then
  607.             section = 30
  608.         elseif maxRange <= 35 then
  609.             section = 35
  610.         elseif maxRange <= 40 then
  611.             section = 40
  612.         else
  613.             section = 100
  614.         end
  615.         UF[UnitID].rangedisplay.text:SetFormattedText("%d", maxRange)
  616.         UF[UnitID].rangedisplay.text:SetTextColor(RangeColors[section][1], RangeColors[section][2], RangeColors[section][3])
  617.     else
  618.         UF[UnitID].rangedisplay.text:SetText("")
  619.     end
  620. end
  621.  
  622. function Overlay:RangeDisplay_OnUpdate(self, elapsed, UnitID)
  623.     self.elapsed = self.elapsed + elapsed
  624.     if self.elapsed >= self.interval then
  625.         Overlay:UpdateUnitRange(UnitID)
  626.         self.elapsed = 0
  627.     end
  628. end
  629.  
  630. -- Text Positions
  631. function Overlay:UpdateUnitTextPosition(UnitID, Text, Side)
  632.     -- Player
  633.     if UnitID == PLAYER_ID then
  634.         if Text == "health.fullval" then
  635.             if Side == "OUTSIDE" then
  636.                 SetFramePosition(UF[UnitID].health.fullval, "MEDIUM", UF[UnitID].health:GetFrameLevel(), 12, 12, {"BOTTOMLEFT", UF[UnitID].health, "BOTTOMLEFT", 256 - HealthWidthShort[layoutSize][PLAYER_ID], HealthTextYOffset[layoutSize][PLAYER_ID]})
  637.                 SetTextPosition(UF[UnitID].health.fullval, "BOTTOM", "LEFT")
  638.             else
  639.                 SetFramePosition(UF[UnitID].health.fullval, "MEDIUM", UF[UnitID].health:GetFrameLevel(), 12, 12, {"BOTTOMRIGHT", UF[UnitID].health, "BOTTOMRIGHT", 1, HealthTextYOffset[layoutSize][PLAYER_ID]})
  640.                 SetTextPosition(UF[UnitID].health.fullval, "BOTTOM", "RIGHT")
  641.             end
  642.         elseif Text == "power.fullval" then
  643.             if Side == "OUTSIDE" then
  644.                 SetFramePosition(UF[UnitID].power.fullval, "MEDIUM", UF[UnitID].power:GetFrameLevel(), 12, 12, {"BOTTOMLEFT", UF[UnitID].power, "BOTTOMLEFT", 256 - PowerWidthShort[layoutSize][PLAYER_ID], PowerTextYOffset[layoutSize][PLAYER_ID]})
  645.                 SetTextPosition(UF[UnitID].power.fullval, "BOTTOM", "LEFT")
  646.             else
  647.                 SetFramePosition(UF[UnitID].power.fullval, "MEDIUM", UF[UnitID].power:GetFrameLevel(), 12, 12, {"BOTTOMRIGHT", UF[UnitID].power, "BOTTOMRIGHT", 1, PowerTextYOffset[layoutSize][PLAYER_ID]})
  648.                 SetTextPosition(UF[UnitID].power.fullval, "BOTTOM", "RIGHT")
  649.             end
  650.         end
  651.     -- Target
  652.     elseif UnitID == TARGET_ID then
  653.         if Text == "health.fullval" then
  654.             if Side == "OUTSIDE" then
  655.                 SetFramePosition(UF[UnitID].health.fullval, "MEDIUM", UF[UnitID].health:GetFrameLevel(), 12, 12, {"BOTTOMRIGHT", UF[UnitID].health, "BOTTOMRIGHT", -(256 - HealthWidthShort[layoutSize][TARGET_ID]) + 2, HealthTextYOffset[layoutSize][TARGET_ID]})
  656.                 SetTextPosition(UF[UnitID].health.fullval, "BOTTOM", "RIGHT")
  657.             else
  658.                 SetFramePosition(UF[UnitID].health.fullval, "MEDIUM", UF[UnitID].health:GetFrameLevel(), 12, 12, {"BOTTOMLEFT", UF[UnitID].health, "BOTTOMLEFT", 1, HealthTextYOffset[layoutSize][TARGET_ID]})
  659.                 SetTextPosition(UF[UnitID].health.fullval, "BOTTOM", "LEFT")
  660.             end
  661.         elseif Text == "power.fullval" then
  662.             if Side == "OUTSIDE" then
  663.                 SetFramePosition(UF[UnitID].power.fullval, "MEDIUM", UF[UnitID].power:GetFrameLevel(), 12, 12, {"TOPRIGHT", UF[UnitID].power, "TOPRIGHT", -(256 - PowerWidthShort[layoutSize][TARGET_ID] - 2), PowerTextYOffset[layoutSize][TARGET_ID]})
  664.                 SetTextPosition(UF[UnitID].power.fullval, "BOTTOM", "RIGHT")
  665.             else
  666.                 SetFramePosition(UF[UnitID].power.fullval, "MEDIUM", UF[UnitID].power:GetFrameLevel(), 12, 12, {"TOPLEFT", UF[UnitID].power, "TOPLEFT", 1, PowerTextYOffset[layoutSize][TARGET_ID]})
  667.                 SetTextPosition(UF[UnitID].power.fullval, "BOTTOM", "LEFT")
  668.             end
  669.         end
  670.     end
  671. end
  672.  
  673. -- Unit Health
  674. local ValidHealthUnit = {
  675.     [PLAYER_ID] = true,
  676.     [TARGET_ID] = true,
  677.     [PET_ID] = true,
  678.     [VEHICLE_ID] = true,
  679.     [FOCUS_ID] = true,
  680.     [FOCUSTARGET_ID] = true,
  681.     [TARGETTARGET_ID] = true,
  682.     [RAID_ID] = true,
  683. }
  684. function Overlay:UpdateUnitHealth(UnitID, ...)
  685.     local Unit, UFUnit = PlayerOrVehicleIDs(UnitID)
  686.    
  687.     -- Skip
  688.     if not UF[UFUnit] then return end
  689.     if not(ValidHealthUnit[Unit]) then return end
  690.     if (UF[PLAYER_ID].vehicle and (Unit == PET_ID)) then return end
  691.     if not UnitExists(Unit) then return end
  692.    
  693.     -- Vals
  694.     local uHealth, uHealthMax, PerHP = GetSafeVals(UnitHealth(Unit), UnitHealthMax(Unit))
  695.     if UnitHealthVal[Unit] then UnitHealthVal[Unit] = uHealth end
  696.    
  697.     -- Pet / Vehicle
  698.     local xPos
  699.     if ((Unit == PET_ID) and UF[PLAYER_ID].haspet) or ((Unit == VEHICLE_ID) and UF[PLAYER_ID].vehicle) then
  700.         local PetPerHP = PerHP
  701.         if (Unit ~= PET_ID) then
  702.             PetPerHP = select(3, GetSafeVals(UnitHealth(UFUnit), UnitHealthMax(UFUnit)))
  703.         end
  704.         xPos = floor(HealthWidth[layoutSize][PLAYER_ID] * (1 - (PetPerHP)))
  705.         if (xPos == 0) then
  706.             UF[PLAYER_ID].health2:Hide()
  707.         else
  708.             UF[PLAYER_ID].health2:Show()
  709.             UF[PLAYER_ID].health2:SetWidth(xPos)
  710.             UF[PLAYER_ID].health2.alpha = cfg.bar.opacity.bar2[1] + (cfg.bar.opacity.bar2[2] - cfg.bar.opacity.bar2[1]) * (1 - PetPerHP)
  711.             UF[PLAYER_ID].health2:SetAlpha(UF[PLAYER_ID].health2.alpha)
  712.         end
  713.         if (Unit == PET_ID) then return end
  714.     end
  715.    
  716.     -- Health hasn't changed? Skip
  717.     if UF[UFUnit].health.position == PerHP and not(...) then return end
  718.     UF[UFUnit].health.position = PerHP
  719.    
  720.     local xPosShort = floor(HealthWidthShort[layoutSize][UFUnit] * (1 - PerHP))
  721.    
  722.     local FullValText
  723.     if ((Unit == PLAYER_ID) or (Unit == VEHICLE_ID) or (Unit == TARGET_ID)) then
  724.         -- Step
  725.         local CurStep, NewStep, StepChanged = 0, 0, false
  726.         local HealthStepPoints = StepPoints[class] or {0.35, 0.25}
  727.         CurStep = (PerHP < (HealthStepPoints[2] + 0.01)) and 2 or (PerHP < (HealthStepPoints[1] + 0.01)) and 1 or 0
  728.         NewStep = CurStep
  729.         if UF[UFUnit].health.arrow.step ~= CurStep then
  730.             StepChanged = true
  731.         end
  732.        
  733.         ---- Arrow
  734.         -- Change Health Arrow color
  735.         if StepChanged then
  736.             UF[UFUnit].health.arrow.background.bg:SetVertexColor(cfg.arrow.colors[NewStep+1][1], cfg.arrow.colors[NewStep+1][2], cfg.arrow.colors[NewStep+1][3], cfg.arrow.opacity.background)
  737.             UF[UFUnit].health.arrow.percent.text:SetTextColor(cfg.arrow.colors[NewStep+1][1], cfg.arrow.colors[NewStep+1][2], cfg.arrow.colors[NewStep+1][3], cfg.arrow.opacity.surround)
  738.             UF[UFUnit].health.arrow.step = NewStep
  739.         end
  740.        
  741.         ---- Texts
  742.         local ArrowText = ""
  743.         ArrowText = tostring(floor(PerHP * 100)).."%"
  744.         if StepChanged then
  745.             if CurStep == 0 then
  746.                 Overlay:UpdateUnitTextPosition(UFUnit, "health.fullval", "OUTSIDE")
  747.             else
  748.                 Overlay:UpdateUnitTextPosition(UFUnit, "health.fullval", "INSIDE")
  749.             end
  750.         end
  751.         UF[UFUnit].health.arrow.percent.text:SetText(ArrowText)
  752.        
  753.         FullValText = ReadableNumber(uHealth, 1)
  754.     else
  755.         FullValText = tostring(floor(PerHP * 100)).."%"
  756.     end
  757.    
  758.     -- Health Text
  759.     UF[UFUnit].health.fullval.text:SetText(FullValText)
  760.    
  761.     -- Set Bar
  762.     SetBarValue(UF[UFUnit].health.bar, xPosShort)
  763. end
  764.  
  765. function Overlay:Health_OnUpdate(self, elapsed, UnitID)
  766.     self.elapsed = self.elapsed + elapsed
  767.     if self.elapsed >= self.interval then
  768.         Overlay:UpdateUnitHealth(UnitID)
  769.         self.elapsed = 0
  770.     end
  771. end
  772.  
  773. -- Unit Power
  774. local ValidPowerUnit = {
  775.     [PLAYER_ID] = true,
  776.     [TARGET_ID] = true,
  777.     [PET_ID] = true,
  778.     [VEHICLE_ID] = true,
  779. }
  780. function Overlay:UpdateUnitPower(UnitID, ...)
  781.     local Unit, UFUnit = PlayerOrVehicleIDs(UnitID)
  782.    
  783.     -- Skip
  784.     if not UF[UFUnit] then return end
  785.     if not UF[UFUnit].power then return end
  786.     if not(ValidPowerUnit[Unit]) then return end
  787.     if (UF[PLAYER_ID].vehicle and (Unit == PET_ID)) then return end
  788.     if not UnitExists(Unit) then return end
  789.    
  790.     local uPower, uPowerMax, PerMP = GetSafeVals(UnitPower(Unit), UnitPowerMax(Unit))
  791.     local xPos, xPosShort
  792.    
  793.     -- Pet / Vehicle
  794.     if ((Unit == PET_ID) and UF[PLAYER_ID].haspet) or ((Unit == VEHICLE_ID) and UF[PLAYER_ID].vehicle) then
  795.         local PetPerMP = PerMP
  796.         if (Unit ~= PET_ID) then
  797.             PetPerMP = select(3, GetSafeVals(UnitPower(UFUnit), UnitPowerMax(UFUnit)))
  798.         end
  799.         xPos = floor(PowerWidth[layoutSize][PLAYER_ID] * (1 - (PetPerMP)))
  800.         if (xPos == 0) then
  801.             UF[PLAYER_ID].power2:Hide()
  802.         else
  803.             UF[PLAYER_ID].power2:Show()
  804.             UF[PLAYER_ID].power2:SetWidth(xPos)
  805.             UF[PLAYER_ID].power2.alpha = cfg.bar.opacity.bar2[1] + (cfg.bar.opacity.bar2[2] - cfg.bar.opacity.bar2[1]) * (1 - PetPerMP)
  806.             UF[PLAYER_ID].power2:SetAlpha(UF[PLAYER_ID].power2.alpha)
  807.         end
  808.         if (Unit == PET_ID) then return end
  809.     end
  810.    
  811.     -- Power Disabled? Leave now
  812.     if not(UF[UFUnit].power.enabled) then return end
  813.    
  814.     -- xPos
  815.     if (UF[UFUnit].power.reverse) then
  816.         xPos = floor(PowerWidth[layoutSize][UFUnit] * PerMP)
  817.         xPosShort = floor(PowerWidthShort[layoutSize][UFUnit] * PerMP)
  818.     else
  819.         xPos = floor(PowerWidth[layoutSize][UFUnit] * (1 - PerMP))
  820.         xPosShort = floor(PowerWidthShort[layoutSize][UFUnit] * (1 - PerMP))
  821.     end
  822.    
  823.     -- Power hasn't changed? Skip
  824.     if UF[UFUnit].power.position == PerMP and not(...) then return end
  825.     UF[UFUnit].power.position = PerMP
  826.    
  827.     -- Power Info
  828.     local pType, pToken, altR, altG, altB = UnitPowerType(Unit)
  829.    
  830.     -- Druid Mana
  831.     if UF[UFUnit].power.druidmana or UF[UFUnit].power.monkmana then
  832.         local xDMPos = floor(PowerWidth[layoutSize][UFUnit] * (1 - (UnitPower(Unit, 0) / UnitPowerMax(Unit, 0))))
  833.         if xDMPos == 0 then
  834.             UF[UFUnit].power2:Hide()
  835.         else
  836.             UF[UFUnit].power2:Show()
  837.             UF[UFUnit].power2:SetWidth(xDMPos)
  838.         end
  839.     end
  840.    
  841.     -- Step
  842.     local CurStep, NewStep, StepChanged = 0, 0, false
  843.     CurStep =   ((PerMP < (UF[UFUnit].power.steppoints[3] + 0.01)) and UF[UFUnit].power.sinrogue) and 3 or
  844.                 (PerMP < (UF[UFUnit].power.steppoints[2] + 0.01)) and 2 or
  845.                 (PerMP < (UF[UFUnit].power.steppoints[1] + 0.01)) and 1 or 0
  846.     if UF[UFUnit].power.hassteps then
  847.         if UF[UFUnit].power.sinrogue then
  848.             if CurStep == 2 then
  849.                 NewStep = 3
  850.             elseif CurStep == 3 then
  851.                 NewStep = 2
  852.             else
  853.                 NewStep = CurStep
  854.             end
  855.         else
  856.             NewStep = CurStep
  857.         end
  858.     end
  859.     if UF[UFUnit].power.arrow.step ~= NewStep then
  860.         StepChanged = true
  861.     end
  862.    
  863.     ---- Arrow
  864.     -- Change Power Arrow color
  865.     if StepChanged then
  866.         UF[UFUnit].power.arrow.background.bg:SetVertexColor(cfg.arrow.colors[NewStep+1][1], cfg.arrow.colors[NewStep+1][2], cfg.arrow.colors[NewStep+1][3], cfg.arrow.opacity.background)
  867.         UF[UFUnit].power.arrow.percent.text:SetTextColor(cfg.arrow.colors[NewStep+1][1], cfg.arrow.colors[NewStep+1][2], cfg.arrow.colors[NewStep+1][3], cfg.arrow.opacity.surround)
  868.         UF[UFUnit].power.arrow.step = NewStep
  869.     end
  870.    
  871.     ---- Texts
  872.     local ArrowText, FullValText = "", ""
  873.     if pToken == "MANA" then
  874.         ArrowText = tostring(floor(PerMP * 100)).."%"
  875.         FullValText = ReadableNumber(uPower, 1)
  876.     else
  877.         ArrowText = tostring(uPower)
  878.         FullValText = ""
  879.     end
  880.     if StepChanged then
  881.         if CurStep == 0 then
  882.             Overlay:UpdateUnitTextPosition(UFUnit, "power.fullval", "OUTSIDE")
  883.         else
  884.             Overlay:UpdateUnitTextPosition(UFUnit, "power.fullval", "INSIDE")
  885.         end
  886.     end
  887.     UF[UFUnit].power.arrow.percent.text:SetText(ArrowText)
  888.     UF[UFUnit].power.fullval.text:SetText(FullValText)
  889.    
  890.     -- Set Bar
  891.     SetBarValue(UF[UFUnit].power.bar, xPosShort)
  892. end
  893.  
  894. function Overlay:Power_OnUpdate(self, elapsed, UnitID)
  895.     self.elapsed = self.elapsed + elapsed
  896.     if self.elapsed >= self.interval then
  897.         Overlay:UpdateUnitPower(UnitID)
  898.         self.elapsed = 0
  899.     end
  900. end
  901.  
  902. -- Unit Health Bar
  903. function Overlay:UpdateUnitHealthBarInfo(UnitID, ...)
  904.     if (UnitID == PET_ID) then return end
  905.     local Unit, UFUnit = PlayerOrVehicleIDs(UnitID)
  906.     if not UF[UFUnit] then return end
  907.     if not(ValidHealthUnit[Unit]) then return end
  908.     if not(UnitExists(Unit)) then return end
  909.    
  910.     -- Find Color type
  911.     local ColorType = "normal"
  912.     if (Unit ~= PLAYER_ID) then
  913.         if UnitIsDeadOrGhost(Unit) then
  914.             ColorType = "dead"
  915.         elseif (cfg.bar.colors.byclass and UnitIsPlayer(Unit)) then
  916.             ColorType = "class"
  917.         elseif cfg.bar.colors.byhostility then
  918.             ColorType = "hostility"
  919.         else
  920.             ColorType = "normal"
  921.         end
  922.     else
  923.         -- Player
  924.         if UnitIsDeadOrGhost(Unit) then
  925.             ColorType = "dead"
  926.         else
  927.             ColorType = "normal"
  928.         end
  929.     end
  930.    
  931.     -- Get new colors
  932.     local hColor = {}
  933.     local newColorID = ""
  934.     if ColorType == "normal" then
  935.         hColor = HealthColors.normal
  936.         newColorID = "normal"
  937.     elseif ColorType == "dead" then
  938.         hColor = StatusColors.dead
  939.         newColorID = "dead"
  940.     elseif ColorType == "class" then
  941.         local _, uClass = UnitClass(Unit)
  942.         hColor = GetClassColor(uClass)
  943.         newColorID = uClass
  944.     elseif ColorType == "hostility" then
  945.         if UnitIsEnemy("player", Unit) then
  946.             hColor = HealthColors.hostile
  947.             newColorID = "hostile"
  948.         elseif UnitCanAttack("player", Unit) then
  949.             hColor = HealthColors.neutral
  950.             newColorID = "neutral"
  951.         else
  952.             hColor = HealthColors.friendly
  953.             newColorID = "friendly"
  954.         end
  955.     end
  956.    
  957.     -- Apply colors
  958.     if UF[UFUnit].health.colorID ~= newColorID then
  959.         UF[UFUnit].health.colorID = newColorID
  960.         UF[UFUnit].health.bar.bg:SetVertexColor(hColor[1], hColor[2], hColor[3], UF[UFUnit].health.alpha)
  961.         UF[UFUnit].health.bar.ender.bg:SetVertexColor(hColor[1], hColor[2], hColor[3], UF[UFUnit].health.alpha)
  962.         UF[UFUnit].health.fullval.text:SetTextColor(1, 1, 1, cfg.bar.opacity.surround)
  963.     end
  964.    
  965.     if not ... then
  966.         -- Steps
  967.         if ((UFUnit == PLAYER_ID) or (UFUnit == TARGET_ID)) then
  968.             if UFUnit == PLAYER_ID then
  969.                 for i = 1, 2 do
  970.                     SetFramePosition(UF[PLAYER_ID].health.steps[i], "MEDIUM", UF[PLAYER_ID].health.surround:GetFrameLevel() + 2, 16, 16, {"BOTTOMRIGHT", UF[PLAYER_ID].health.surround, "BOTTOMRIGHT", floor(-(HealthWidthShort[layoutSize][PLAYER_ID] - (HealthWidthShort[layoutSize][PLAYER_ID] * PlayerStepPoints[i]))), 0})
  971.                     UF[PLAYER_ID].health.steps[i]:Show()
  972.                 end
  973.             else
  974.                 for i = 1, 2 do
  975.                     SetFramePosition(UF[TARGET_ID].health.steps[i], "MEDIUM", UF[TARGET_ID].health.surround:GetFrameLevel() + 2, 16, 16, {"BOTTOMLEFT", UF[TARGET_ID].health.surround, "BOTTOMLEFT", floor(HealthWidthShort[layoutSize][TARGET_ID] - (HealthWidthShort[layoutSize][TARGET_ID] * PlayerStepPoints[i])), 0})
  976.                     UF[TARGET_ID].health.steps[i]:Show()
  977.                 end
  978.             end
  979.         end
  980.     end
  981.    
  982.     --Overlay:UpdateUnitHealth(UFUnit)
  983. end
  984.  
  985. -- Unit Power Bar Color
  986. function Overlay:UpdateUnitPowerBarInfo(UnitID)
  987.     if not((UnitID == PLAYER_ID) or (UnitID == TARGET_ID) or (UnitID == VEHICLE_ID)) then return end
  988.    
  989.     local Unit, UFUnit = PlayerOrVehicleIDs(UnitID)
  990.     if not UF[UFUnit] then return end
  991.     if not UF[UFUnit].power.enabled then return end
  992.     if not(ValidPowerUnit[Unit]) then return end
  993.     if not(UnitExists(Unit)) then return end
  994.    
  995.     -- Power info
  996.     local pType, pToken, altR, altG, altB = UnitPowerType(Unit)
  997.     local pMax = UnitPowerMax(Unit)
  998.     if UFUnit == PLAYER_ID then
  999.         UF[UFUnit].power.interval = PowerUpdateSpeeds[pToken] or PowerUpdateSpeeds["default"]
  1000.     end
  1001.    
  1002.     -- Set defaults
  1003.     UF[UFUnit].power.position = -1
  1004.     UF[UFUnit].power.arrow.step = -1
  1005.    
  1006.     -- Get Color
  1007.     local NewColor = ""
  1008.     local pColor
  1009.     if UnitIsDeadOrGhost(Unit) then
  1010.         pColor = StatusColors.dead
  1011.         NewColor = "DEAD"  
  1012.     else
  1013.         if PowerColors[pToken] then
  1014.             pColor = PowerColors[pToken]
  1015.             NewColor = pToken
  1016.         else
  1017.             if not(altR) then
  1018.                 pColor = PowerColors["MANA"]
  1019.                 NewColor = "MANA"
  1020.             else
  1021.                 pColor = {altR, altG, altB}
  1022.                 NewColor = "ALT"
  1023.             end
  1024.         end
  1025.     end
  1026.    
  1027.     -- Reverse
  1028.     if ReversePowers[pToken] then
  1029.         UF[UFUnit].power.reverse = true
  1030.     else
  1031.         UF[UFUnit].power.reverse = false
  1032.     end
  1033.    
  1034.     -- Druid Mana
  1035.     UF[UFUnit].power.druidmana = false
  1036.     if ((Unit == PLAYER_ID) and (class == "DRUID" or "MONK") and not(UF[PLAYER_ID].haspet)) then
  1037.         if ((pToken ~= "MANA") and (UnitPowerMax(Unit, 0) > 0)) then
  1038.             UF[UFUnit].power.druidmana = true
  1039.             UF[UFUnit].power.monkmana = true
  1040.         else
  1041.             UF[UFUnit].power2:Hide()
  1042.         end
  1043.     end
  1044.    
  1045.     -- Apply colors
  1046.     if (UF[UFUnit].power.color ~= NewColor) then
  1047.         UF[UFUnit].power.color = NewColor
  1048.         UF[UFUnit].power.bar.bg:SetVertexColor(pColor[1], pColor[2], pColor[3], UF[UFUnit].power.alpha)
  1049.         UF[UFUnit].power.bar.ender.bg:SetVertexColor(pColor[1], pColor[2], pColor[3], UF[UFUnit].power.alpha)
  1050.         UF[UFUnit].power.fullval.text:SetTextColor(1, 1, 1, cfg.bar.opacity.surround)
  1051.     end
  1052.    
  1053.     ---- Steps
  1054.     -- Calc step points
  1055.     UF[UFUnit].power.steppoints = {}
  1056.     UF[UFUnit].power.steppoints[1] = PlayerStepPoints[1]
  1057.     UF[UFUnit].power.steppoints[2] = PlayerStepPoints[2]
  1058.     UF[UFUnit].power.steppoints[3] = 0
  1059.     UF[UFUnit].power.hassteps = false
  1060.     UF[UFUnit].power.sinrogue = ((class == "ROGUE") and (GetSpecialization() == 1) and (UFUnit == PLAYER_ID))
  1061.     if ((pToken == "MANA") or ((pToken ~= "MANA") and (pMax == 100))) then
  1062.         UF[UFUnit].power.hassteps = true
  1063.     elseif UnitPowerMax(Unit) > 80 then
  1064.         local s = 1
  1065.         if UF[UFUnit].power.sinrogue then
  1066.             UF[UFUnit].power.steppoints[1] = 0.55 * (100 / pMax)
  1067.             s = 2
  1068.         else
  1069.             UF[UFUnit].power.steppoints[3] = 0
  1070.         end
  1071.         UF[UFUnit].power.steppoints[s] = PlayerStepPoints[1] * (100 / pMax)
  1072.         UF[UFUnit].power.steppoints[s + 1] = PlayerStepPoints[2] * (100 / pMax)
  1073.         UF[UFUnit].power.hassteps = true
  1074.     end
  1075.     -- Position steps
  1076.     local stepXMod = (UFUnit == PLAYER_ID) and -1 or 1
  1077.     local stepAnchor = (UFUnit == PLAYER_ID) and "BOTTOMRIGHT" or "BOTTOMLEFT"
  1078.     for i = 1, 3 do
  1079.         local xStepPos
  1080.         if UF[UFUnit].power.reverse then
  1081.             xStepPos = floor(stepXMod * (PowerWidthShort[layoutSize][UFUnit] - (PowerWidthShort[layoutSize][UFUnit] * (1 - UF[UFUnit].power.steppoints[i]))))
  1082.         else
  1083.             xStepPos = floor(stepXMod * (PowerWidthShort[layoutSize][UFUnit] - (PowerWidthShort[layoutSize][UFUnit] * UF[UFUnit].power.steppoints[i])))
  1084.         end
  1085.         SetFramePosition(UF[UFUnit].power.steps[i], "MEDIUM", UF[UFUnit].power.surround:GetFrameLevel() + 2, 16, 16, {stepAnchor, UF[UFUnit].power.surround, stepAnchor, xStepPos, 0})
  1086.         if UF[UFUnit].power.hassteps and (UF[UFUnit].power.steppoints[i] > 0) then
  1087.             UF[UFUnit].power.steps[i]:Show()
  1088.         else
  1089.             UF[UFUnit].power.steps[i]:Hide()
  1090.         end
  1091.     end
  1092.    
  1093.     Overlay:UpdateUnitPower(UFUnit)
  1094. end
  1095.  
  1096. -- Toggle Power
  1097. function Overlay:ToggleUnitPower(UnitID)
  1098.     local Unit, UFUnit = PlayerOrVehicleIDs(UnitID)
  1099.     if not UF[UFUnit] then return end
  1100.     if not UF[UFUnit].power then return end
  1101.    
  1102.     if UnitExists(Unit) and UnitPowerMax(Unit) > 0 then
  1103.         if not UF[UFUnit].power.enabled then
  1104.             UF[UFUnit].power.enabled = true
  1105.             UF[UFUnit].power.bar:Show()
  1106.             UF[UFUnit].power.fullval:Show()
  1107.         end
  1108.     else
  1109.         UF[UFUnit].power.enabled = false
  1110.         UF[UFUnit].power.bar.ender.visible = false
  1111.         UF[UFUnit].power.bar:Hide()
  1112.         UF[UFUnit].power.bar.ender:Hide()
  1113.         for i = 1, 2 do
  1114.             UF[UFUnit].power.steps[i]:Hide()
  1115.         end
  1116.         UF[UFUnit].power.fullval:Hide()
  1117.     end
  1118. end
  1119.  
  1120. -- Unit Info
  1121. function Overlay:UpdateUnitInfo(UnitID)
  1122.     if ((UnitID == PLAYER_ID) or (UnitID == PET_ID)) then return end
  1123.     if not(UF[UnitID]) then return end
  1124.     if not(UnitExists(UnitID)) then return end
  1125.    
  1126.     -- Name
  1127.     local oldName = UnitName(UnitID)
  1128.     local uName = (strlen(oldName) > NameLengths[layoutSize][UnitID]) and gsub(oldName, "%s?(.[\128-\191]*)%S+%s", "%1.") or oldName
  1129.     if strlen(uName) > NameLengths[layoutSize][UnitID] then
  1130.         uName = strsub(uName, 1, NameLengths[layoutSize][UnitID] - 1)..".."
  1131.     end
  1132.    
  1133.     -- Level
  1134.     local uLevel = UnitLevel(UnitID)
  1135.     if uLevel <= 0 then
  1136.         uLevel = 99
  1137.     end
  1138.     local uLevelColor = GetQuestDifficultyColor(uLevel)
  1139.    
  1140.     -- Classification
  1141.     local uClassification = ClassificationShort[UnitClassification(UnitID)] or ""
  1142.    
  1143.     -- Set Texts
  1144.     if (UnitID == TARGET_ID) then
  1145.         if uLevel == 99 then
  1146.             UF[UnitID].powertext.text:SetText("??")
  1147.         else
  1148.             UF[UnitID].powertext.text:SetText(uLevel)
  1149.         end
  1150.         UF[UnitID].healthtext.text:SetText(uName)
  1151.         UF[UnitID].powertext.text:SetTextColor(uLevelColor.r, uLevelColor.g, uLevelColor.b)
  1152.     elseif (UnitID == RAID_ID) then
  1153.         UF[UnitID].healthtext.text:SetText(uName)      
  1154.     else
  1155.         local InfoText = ""
  1156.         if uLevel == 99 then uLevel = "??" end
  1157.         if ((UnitID == FOCUS_ID) or (UnitID == FOCUSTARGET_ID)) then
  1158.             InfoText = strform("%s |cff%02x%02x%02x%s|r", uName, uLevelColor.r * 255, uLevelColor.g * 255, uLevelColor.b * 255, uLevel)
  1159.         else
  1160.             InfoText = strform("|cff%02x%02x%02x%s|r %s", uLevelColor.r * 255, uLevelColor.g * 255, uLevelColor.b * 255, uLevel, uName)
  1161.         end
  1162.         UF[UnitID].healthtext.text:SetText(InfoText)
  1163.     end
  1164.     UF[UnitID].endboxtext.text:SetText(uClassification)
  1165. end
  1166.  
  1167. -- Unit Background Colors
  1168. local bgColor
  1169. function Overlay:UpdateUnitBackgroundColor(UnitID)
  1170.     local Unit, UFUnit = PlayerOrVehicleIDs(UnitID)
  1171.     if not UF[UFUnit] then return end
  1172.    
  1173.     local newColorID = ""
  1174.     if UnitIsPVP(Unit) then
  1175.         if UnitIsFriend(Unit, PLAYER_ID) then
  1176.             bgColor = StatusColors.pvpfriendly
  1177.             newColorID = "friendly"
  1178.         else
  1179.             bgColor = StatusColors.pvpenemy
  1180.             newColorID = "pvpenemy"
  1181.         end
  1182.     elseif (UnitIsTapped(Unit) and not(UnitIsTappedByPlayer(Unit))) then
  1183.         bgColor = StatusColors.tapped
  1184.         newColorID = "tapped"
  1185.     else
  1186.         bgColor = {0, 0, 0}
  1187.         newColorID = "black"
  1188.     end
  1189.    
  1190.     if UF[UFUnit].backgroundColorID ~= newColorID then
  1191.         UF[UFUnit].backgroundColorID = newColorID
  1192.         UF[UFUnit].health.background.bg:SetVertexColor(bgColor[1], bgColor[2], bgColor[3], cfg.bar.opacity.background)
  1193.         if UF[UFUnit].power then
  1194.             UF[UFUnit].power.background.bg:SetVertexColor(bgColor[1], bgColor[2], bgColor[3], cfg.bar.opacity.background)
  1195.         end
  1196.     end
  1197. end
  1198.  
  1199. -- End Box
  1200. function Overlay:UpdateEndBox(UnitID)
  1201.     local cColor
  1202.     if UnitID == PLAYER_ID then
  1203.         cColor = GetClassColor(class)
  1204.         UF[PLAYER_ID].endbox.bar:SetVertexColor(cColor[1], cColor[2], cColor[3], cfg.bar.opacity.status)
  1205.         if UF[PLAYER_ID].haspet then
  1206.             UF[PLAYER_ID].endbox.bar:Show()
  1207.         else
  1208.             UF[PLAYER_ID].endbox.bar:Hide()
  1209.         end
  1210.     else
  1211.         UF[UnitID].endbox.bar:Show()
  1212.         if UnitIsPlayer(UnitID) then
  1213.             cColor = GetClassColor(select(2, UnitClass(UnitID)))
  1214.         else
  1215.             if UnitIsEnemy("player", UnitID) then
  1216.                 cColor = HealthColors.hostile
  1217.             elseif UnitCanAttack("player", UnitID) then
  1218.                 cColor = HealthColors.neutral
  1219.             else
  1220.                 cColor = HealthColors.friendly
  1221.             end
  1222.         end
  1223.         UF[UnitID].endbox.bar:SetVertexColor(cColor[1], cColor[2], cColor[3], cfg.bar.opacity.status)
  1224.     end
  1225. end
  1226.  
  1227. -- PvP Timer
  1228. local PvPTimerFrame = CreateFrame("Frame")
  1229. PvPTimerFrame:Hide()
  1230. PvPTimerFrame.e = 0
  1231. PvPTimerFrame.i = 1
  1232. PvPTimerFrame.ticks = 0     -- Wait until one update passes to see if we're now under 301sec PvP timer
  1233. PvPTimerFrame.ms = 0
  1234. PvPTimerFrame.ts = ""
  1235. PvPTimerFrame:SetScript("OnUpdate", function(s, e)
  1236.     s.e = s.e + e
  1237.     if s.e >= s.i then
  1238.         s.ms = GetPVPTimer()
  1239.         if s.ticks >= 1 and s.ms < 301000 then
  1240.             s.ts = ConvertSecondstoTime(floor(s.ms / 1000))
  1241.             UF[PLAYER_ID].healthtext.text:SetText(s.ts)
  1242.         elseif s.ticks >= 1 then
  1243.             s.e = 0
  1244.             s.ticks = 0
  1245.             UF[PLAYER_ID].healthtext.text:SetText("")
  1246.             s:Hide()
  1247.         else
  1248.             s.ticks = s.ticks + 1
  1249.         end
  1250.         s.e = 0
  1251.     end
  1252. end)
  1253. function Overlay:UpdatePvPTimer()
  1254.     local ms = UnitIsPVP(PLAYER_ID) and GetPVPTimer() or 0
  1255.     if ms > 0 then
  1256.         PvPTimerFrame:Show()
  1257.     else
  1258.         PvPTimerFrame:Hide()
  1259.         PvPTimerFrame.ticks = 0
  1260.         UF[PLAYER_ID].healthtext.text:SetText("")
  1261.     end
  1262. end
  1263.  
  1264. -- Status
  1265. function Overlay:UpdateStatus(UnitID)
  1266.     if not(UF[UnitID]) then return end
  1267.    
  1268.     local S1, S2
  1269.     local S1Status, S2Status
  1270.  
  1271.     -- 2
  1272.     if UnitIsAFK(UnitID) then
  1273.         S2Status = StatusColors.afk
  1274.         S2 = true
  1275.     elseif not(UnitIsConnected(UnitID)) then
  1276.         S2Status = StatusColors.offline
  1277.         S2 = true
  1278.     elseif (UnitID == PLAYER_ID) and UnitIsGroupLeader(UnitID) then
  1279.         S2Status = StatusColors.leader
  1280.         S2 = true
  1281.     else
  1282.         S2 = false
  1283.     end
  1284.     if S2 then
  1285.         UF[UnitID].statusbox[2]:Show()
  1286.         UF[UnitID].statusbox[2].bar:SetVertexColor(S2Status[1], S2Status[2], S2Status[3], cfg.bar.opacity.status)
  1287.     else
  1288.         UF[UnitID].statusbox[2]:Hide()
  1289.     end
  1290.    
  1291.     -- 1
  1292.     if UnitAffectingCombat(UnitID) then
  1293.         S1Status = StatusColors.combat
  1294.         S1 = true
  1295.     elseif IsResting(UnitID) then
  1296.         S1Status = StatusColors.resting
  1297.         S1 = true
  1298.     else
  1299.         S1 = false
  1300.     end
  1301.     if S2 and not(S1) then
  1302.         UF[UnitID].statusbox[1]:Show()
  1303.         UF[UnitID].statusbox[1].bar:SetVertexColor(0, 0, 0, 0)
  1304.     elseif S1 then
  1305.         UF[UnitID].statusbox[1]:Show()
  1306.         UF[UnitID].statusbox[1].bar:SetVertexColor(S1Status[1], S1Status[2], S1Status[3], cfg.bar.opacity.status)
  1307.     else
  1308.         UF[UnitID].statusbox[1]:Hide()
  1309.     end
  1310.    
  1311.     -- Pvp
  1312.     if UnitID == PLAYER_ID then
  1313.         self:UpdatePvPTimer()
  1314.     end
  1315. end
  1316.  
  1317. -- In Between
  1318. local function InBetween_OnUpdate(self, elapsed)
  1319.     self.elapsed = self.elapsed + elapsed
  1320.     if self.elapsed >= self.interval then
  1321.         local Now = GetTime()
  1322.         -- Check current status durations
  1323.         if self.wound and (self.woundend <= Now) then
  1324.             self.wound = false
  1325.         end
  1326.         if self.heal and (self.healend <= Now) then
  1327.             self.heal = false
  1328.         end
  1329.        
  1330.         -- Apply current status
  1331.         if self.heal then
  1332.             if not self.healset then self.bg:SetVertexColor(StatusColors.heal[1], StatusColors.heal[2], StatusColors.heal[3], cfg.bar.opacity.status) end
  1333.             self.healset = true
  1334.             self.woundset = false
  1335.             self.inchealset = false
  1336.         elseif self.wound then
  1337.             if not self.woundset then self.bg:SetVertexColor(StatusColors.damage[1], StatusColors.damage[2], StatusColors.damage[3], cfg.bar.opacity.status) end
  1338.             self.woundset = true
  1339.             self.healset = false
  1340.             self.inchealset = false
  1341.         elseif self.incheal then
  1342.             if not self.inchealset then self.bg:SetVertexColor(StatusColors.incomingheal[1], StatusColors.incomingheal[2], StatusColors.incomingheal[3], cfg.bar.opacity.status) end
  1343.             self.inchealset = true
  1344.             self.healset = false
  1345.             self.woundset = false
  1346.         else
  1347.             if self.inchealset or self.healset or self.woundset then self.bg:SetVertexColor(1, 1, 1, 0) end
  1348.             self.healset = false
  1349.             self.woundset = false
  1350.             self.inchealset = false
  1351.         end
  1352.        
  1353.         self.elapsed = 0
  1354.     end
  1355. end
  1356.  
  1357. function Overlay:SetInBetween(UnitID, Event)
  1358.     if Event == "WOUND" then
  1359.         UF[UnitID].inbetween.wound = true
  1360.         UF[UnitID].inbetween.woundend = GetTime() + 0.5
  1361.     elseif Event == "HEAL" then
  1362.         UF[UnitID].inbetween.heal = true
  1363.         UF[UnitID].inbetween.healend = GetTime() + 0.5
  1364.     elseif Event == "INCHEAL" then
  1365.         UF[UnitID].inbetween.incheal = true
  1366.     elseif Event == "NOINCHEAL" then
  1367.         UF[UnitID].inbetween.incheal = false
  1368.     elseif Event == "NONE" then
  1369.         UF[UnitID].inbetween.wound = false
  1370.         UF[UnitID].inbetween.heal = false
  1371.         UF[UnitID].inbetween.incheal = false
  1372.     end
  1373. end
  1374.  
  1375. -- Pet Status
  1376. function Overlay:UpdatePetStatus()
  1377.     if UnitExists(PET_ID) then
  1378.         UF[PLAYER_ID].haspet = true
  1379.         UF[PLAYER_ID].health2:Show()
  1380.         UF[PLAYER_ID].power2:Show()
  1381.     else
  1382.         UF[PLAYER_ID].haspet = false
  1383.         UF[PLAYER_ID].health2:Hide()
  1384.         UF[PLAYER_ID].power2:Hide()
  1385.     end
  1386. end
  1387.  
  1388. -- End Icons
  1389. function Overlay:UpdateEndIcons()
  1390.     for k,v in pairs(UF) do
  1391.         if UF[k].endicon then
  1392.             if UnitHasIncomingResurrection(k) then
  1393.                 UF[k].endicon.bg:SetTexture([[Interface\RaidFrame\Raid-Icon-Rez]])
  1394.                 UF[k].endicon:Show()
  1395.             else
  1396.                 local RIUnit = ((k == PLAYER_ID) and UnitHasVehicleUI(PLAYER_ID)) and VEHICLE_ID or k
  1397.                 local index = GetRaidTargetIndex(RIUnit)
  1398.                 if index then
  1399.                     UF[k].endicon.bg:SetTexture([[Interface\TargetingFrame\UI-RaidTargetingIcons]])
  1400.                     SetRaidTargetIconTexture(UF[k].endicon.bg, index)
  1401.                     UF[k].endicon:Show()
  1402.                 else
  1403.                     UF[k].endicon:Hide()
  1404.                 end
  1405.             end
  1406.         end
  1407.     end
  1408. end
  1409.  
  1410. -- Refresh all units power and health
  1411. function Overlay:RefreshUnits()
  1412.     self:UpdatePetStatus()
  1413.     SetPlayerVehicleFlag()
  1414.     for k,v in pairs(UF) do
  1415.         if UnitExists(k) then
  1416.             if UF[k].health then
  1417.                 self:UpdateUnitHealthBarInfo(k)
  1418.                 self:UpdateUnitHealth(k)
  1419.             end
  1420.             if UF[k].power then
  1421.                 self:ToggleUnitPower(k)
  1422.                 self:UpdateUnitPowerBarInfo(k)
  1423.                 self:UpdateUnitPower(k)
  1424.             end
  1425.             self:UpdateEndBox(k)
  1426.             self:UpdateStatus(k)
  1427.             self:UpdateUnitBackgroundColor(k)
  1428.             self:UpdateUnitInfo(k)
  1429.         end
  1430.     end
  1431.     self:UpdateEndIcons()
  1432. end
  1433.  
  1434. -- Font Update
  1435. function Overlay:UpdateFonts()
  1436.     for k,v in pairs(UF) do
  1437.         if type(v) == "table" then
  1438.             for k2,v2 in pairs(v) do
  1439.                 if type(v2) == "table" then
  1440.                     if UF[k][k2].text then
  1441.                         UF[k][k2].text:SetFont(unpack(fontPixel1))
  1442.                     else
  1443.                    
  1444.             for k3,v3 in pairs(v2) do
  1445.                 if type(v3) == "table" then
  1446.                     if UF[k][k2][k3].text then
  1447.                         UF[k][k2][k3].text:SetFont(unpack(fontPixel1))
  1448.                     else
  1449.  
  1450.             for k4,v4 in pairs(v3) do
  1451.                 if type(v4) == "table" then
  1452.                     if UF[k][k2][k3][k4].text then
  1453.                         UF[k][k2][k3][k4].text:SetFont(unpack(fontPixel1))
  1454.        
  1455.         end; end; end; end; end; end; end; end; end; end
  1456.     end
  1457. end
  1458.  
  1459. -- Texture Update
  1460. local USTCExtras = {FOCUS_ID, FOCUSTARGET_ID, TARGETTARGET_ID, RAID_ID}--, MAINTANK_ID}
  1461. function Overlay:UpdateTextures()
  1462.     ---- Player ----
  1463.     -- Health
  1464.     UF[PLAYER_ID].health.surround.bg:SetVertexColor(1, 1, 1, cfg.bar.opacity.surround)
  1465.     for i = 1, 2 do
  1466.         UF[PLAYER_ID].health.steps[i].bg:SetVertexColor(1, 1, 1, cfg.bar.opacity.steps)
  1467.     end
  1468.     UF[PLAYER_ID].health.arrow.surround.bg:SetVertexColor(1, 1, 1, cfg.arrow.opacity.surround)
  1469.     UF[PLAYER_ID].health2.bg:SetVertexColor(1, 1, 1, 1)
  1470.    
  1471.     -- Power
  1472.     UF[PLAYER_ID].power.surround.bg:SetVertexColor(1, 1, 1, cfg.bar.opacity.surround)
  1473.     for i = 1, 3 do
  1474.         UF[PLAYER_ID].power.steps[i].bg:SetVertexColor(1, 1, 1, cfg.bar.opacity.steps)
  1475.     end
  1476.     UF[PLAYER_ID].power.arrow.surround.bg:SetVertexColor(1, 1, 1, cfg.arrow.opacity.surround)
  1477.     UF[PLAYER_ID].power2.bg:SetVertexColor(1, 1, 1, 1)
  1478.    
  1479.     -- End Box
  1480.     UF[PLAYER_ID].endbox.surround:SetVertexColor(1, 1, 1, cfg.bar.opacity.surround)
  1481.     UF[PLAYER_ID].endbox.background:SetVertexColor(0, 0, 0, cfg.bar.opacity.background)
  1482.    
  1483.     -- Status Boxes
  1484.     for i = 1, 2 do
  1485.         UF[PLAYER_ID].statusbox[i].surround:SetVertexColor(1, 1, 1, cfg.bar.opacity.surround)
  1486.         UF[PLAYER_ID].statusbox[i].background:SetVertexColor(0, 0, 0, cfg.bar.opacity.background)
  1487.     end
  1488.    
  1489.     ---- Target ----
  1490.     -- Health
  1491.     UF[TARGET_ID].health.surround.bg:SetVertexColor(1, 1, 1, cfg.bar.opacity.surround)
  1492.     for i = 1, 2 do
  1493.         UF[TARGET_ID].health.steps[i].bg:SetVertexColor(1, 1, 1, cfg.bar.opacity.steps)
  1494.     end
  1495.     UF[TARGET_ID].health.arrow.surround.bg:SetVertexColor(1, 1, 1, cfg.arrow.opacity.surround)
  1496.    
  1497.     -- Power
  1498.     UF[TARGET_ID].power.surround.bg:SetVertexColor(1, 1, 1, cfg.bar.opacity.surround)
  1499.     for i = 1, 3 do
  1500.         UF[TARGET_ID].power.steps[i].bg:SetVertexColor(1, 1, 1, cfg.bar.opacity.steps)
  1501.     end
  1502.     UF[TARGET_ID].power.arrow.surround.bg:SetVertexColor(1, 1, 1, cfg.arrow.opacity.surround)
  1503.    
  1504.     -- End Box
  1505.     UF[TARGET_ID].endbox.surround:SetVertexColor(1, 1, 1, cfg.bar.opacity.surround)
  1506.     UF[TARGET_ID].endbox.background:SetVertexColor(0, 0, 0, cfg.bar.opacity.background)
  1507.    
  1508.     -- Status Boxes
  1509.     for i = 1, 2 do
  1510.         UF[TARGET_ID].statusbox[i].surround:SetVertexColor(1, 1, 1, cfg.bar.opacity.surround)
  1511.         UF[TARGET_ID].statusbox[i].background:SetVertexColor(0, 0, 0, cfg.bar.opacity.background)
  1512.     end
  1513.    
  1514.     ---- Extras ----
  1515.     for k,v in pairs(USTCExtras) do
  1516.         -- Health
  1517.         UF[v].health.surround.bg:SetVertexColor(1, 1, 1, cfg.bar.opacity.surround)
  1518.        
  1519.         -- End Box
  1520.         if RAID_ID then return else
  1521.         UF[v].endbox.surround:SetVertexColor(1, 1, 1, cfg.bar.opacity.surround)
  1522.         UF[v].endbox.background:SetVertexColor(0, 0, 0, cfg.bar.opacity.background)
  1523.         end
  1524.         -- Status Boxes
  1525.         for i = 1, 2 do
  1526.             UF[v].statusbox[i].surround:SetVertexColor(1, 1, 1, cfg.bar.opacity.surround)
  1527.             UF[v].statusbox[i].background:SetVertexColor(0, 0, 0, cfg.bar.opacity.background)
  1528.         end
  1529.     end
  1530. end
  1531.  
  1532. ---- FRAME CREATION ----
  1533. local function CreateStatusBox(parent)
  1534.     local NewEndBox
  1535.     NewEndBox = CreateFrame("Frame", nil, parent)
  1536.     NewEndBox:SetParent(parent)
  1537.     NewEndBox.surround = NewEndBox:CreateTexture(nil, "ARTWORK")
  1538.     NewEndBox.surround:SetAllPoints()
  1539.     NewEndBox.background = NewEndBox:CreateTexture(nil, "BACKGROUND")
  1540.     NewEndBox.background:SetAllPoints()
  1541.     NewEndBox.bar = NewEndBox:CreateTexture(nil, "ARTWORK")
  1542.     NewEndBox.bar:SetAllPoints()
  1543.     return NewEndBox
  1544. end
  1545.  
  1546. local function CreateArtFrame(parent)
  1547.     local NewArtFrame
  1548.     NewArtFrame = CreateFrame("Frame", nil, parent)
  1549.     NewArtFrame:SetParent(parent)
  1550.     NewArtFrame.bg = NewArtFrame:CreateTexture(nil, "ARTWORK")
  1551.     NewArtFrame.bg:SetAllPoints()
  1552.     return NewArtFrame
  1553. end
  1554.  
  1555. local function CreateTextFrame(parent, position1, position2)
  1556.     local NewTextFrame
  1557.     NewTextFrame = CreateFrame("Frame", nil, parent)
  1558.     NewTextFrame.text = NewTextFrame:CreateFontString(nil, "ARTWORK")
  1559.     NewTextFrame.text:SetFont(unpack(fontPixel1))
  1560.     SetTextPosition(NewTextFrame, position1, position2)
  1561.     return NewTextFrame
  1562. end
  1563.  
  1564. --------------------------------------------------------
  1565. --------------------------------------------------------
  1566. function Overlay:CreateFrames()
  1567.     --------------
  1568.     ---- RAID ----
  1569.     --------------
  1570. do
  1571.     local Parent = _G[ParentFrames[RAID_ID]] or UIParent
  1572.     UF[RAID_ID] = CreateFrame("Frame", ParentFrames[RAID_ID].."_Overlay", Parent)
  1573.     SetFramePosition(UF[RAID_ID], "MEDIUM", 0, 128, 128, {"BOTTOMRIGHT", Parent, "BOTTOMRIGHT", -100, 105})
  1574.     UF[RAID_ID].backgroundColorID = ""
  1575.    
  1576.     -- Health
  1577.     UF[RAID_ID].health = CreateFrame("Frame", nil, UF[RAID_ID])
  1578.     UF[RAID_ID].health:SetParent(UF[RAID_ID])
  1579.     SetFramePosition(UF[RAID_ID].health, "MEDIUM", UF[RAID_ID]:GetFrameLevel(), 128, 128, {"BOTTOMRIGHT", UF[RAID_ID], "BOTTOMRIGHT", 0, 16})
  1580.     UF[RAID_ID].health.colorID = ""
  1581.     UF[RAID_ID].health.alpha = 1
  1582.     UF[RAID_ID].health.position = -1
  1583.     UF[RAID_ID].health.elapsed = 0
  1584.     UF[RAID_ID].health.interval = 0.1
  1585.     UF[RAID_ID].health:SetScript("OnUpdate", function(self, elapsed)
  1586.         Overlay:Health_OnUpdate(self, elapsed, RAID_ID)
  1587.     end)
  1588.    
  1589.         -- Surround
  1590.         UF[RAID_ID].health.surround = CreateArtFrame(UF[RAID_ID].health)
  1591.         SetFramePosition(UF[RAID_ID].health.surround, "MEDIUM", UF[RAID_ID].health:GetFrameLevel() + 2, 128, 128, {"BOTTOMRIGHT", UF[RAID_ID].health, "BOTTOMRIGHT", 0, 0})
  1592.         UF[RAID_ID].health.surround.bg:SetTexture(Textures[layoutSize].f0.health.surround)
  1593.        
  1594.         -- Background
  1595.         UF[RAID_ID].health.background = CreateArtFrame(UF[RAID_ID].health)
  1596.         SetFramePosition(UF[RAID_ID].health.background, "MEDIUM", UF[RAID_ID].health:GetFrameLevel(), 128, 128, {"BOTTOMRIGHT", UF[RAID_ID].health, "BOTTOMRIGHT", 0, 0})
  1597.         UF[RAID_ID].health.background.bg:SetTexture(Textures[layoutSize].f0.health.bar)
  1598.        
  1599.         -- Bar
  1600.         UF[RAID_ID].health.bar = CreateArtFrame(UF[RAID_ID].health.background)
  1601.         UF[RAID_ID].health.bar.pos = 0
  1602.         UF[RAID_ID].health.bar.maxwidth = HealthWidthShort[layoutSize][RAID_ID]
  1603.         SetFramePosition(UF[RAID_ID].health.bar, "MEDIUM", UF[RAID_ID].health.background:GetFrameLevel() + 1, 0, (layoutSize == "small") and 9 or 10, {"BOTTOMRIGHT", UF[RAID_ID].health.background, "BOTTOMRIGHT", -1, 1})
  1604.         UF[RAID_ID].health.bar.bg:SetTexture(Textures.plain)
  1605.  
  1606.         -- HealthBar Text
  1607.         UF[RAID_ID].healthtext = CreateTextFrame(UF[RAID_ID].health, "BOTTOM", "LEFT")
  1608.         SetFramePosition(UF[RAID_ID].healthtext, "MEDIUM", UF[RAID_ID].health:GetFrameLevel() + 2, 12, 12, {"BOTTOMLEFT", UF[RAID_ID].health, "BOTTOMLEFT", 8, 1})
  1609.        
  1610.         -- Health Text
  1611.         UF[RAID_ID].health.fullval = CreateTextFrame(UF[RAID_ID].health, "BOTTOM", "LEFT")
  1612. end
  1613.     ----------------
  1614.     ---- Player ----
  1615.     ----------------
  1616.     local Parent = _G[ParentFrames[PLAYER_ID]] or UIParent
  1617.     UF[PLAYER_ID] = CreateFrame("Frame", ParentFrames[PLAYER_ID].."_Overlay", Parent)
  1618.     SetFramePosition(UF[PLAYER_ID], "MEDIUM", 0, 256, 32, {"BOTTOMRIGHT", Parent, "BOTTOMRIGHT", 0, -5})
  1619.     UF[PLAYER_ID].backgroundColorID = ""
  1620.    
  1621.     -- Health
  1622.     UF[PLAYER_ID].health = CreateFrame("Frame", nil, UF[PLAYER_ID])
  1623.     UF[PLAYER_ID].health:SetParent(UF[PLAYER_ID])
  1624.     SetFramePosition(UF[PLAYER_ID].health, "MEDIUM", UF[PLAYER_ID]:GetFrameLevel(), 256, 16, {"BOTTOMRIGHT", UF[PLAYER_ID], "BOTTOMRIGHT", 0, 16})
  1625.     UF[PLAYER_ID].health.colorID = ""
  1626.     UF[PLAYER_ID].health.alpha = 1
  1627.     UF[PLAYER_ID].health.position = -1
  1628.     UF[PLAYER_ID].health.elapsed = 0
  1629.     UF[PLAYER_ID].health.interval = 0.1
  1630.     UF[PLAYER_ID].health:SetScript("OnUpdate", function(self, elapsed)
  1631.         Overlay:Health_OnUpdate(self, elapsed, PLAYER_ID)
  1632.     end)
  1633.    
  1634.         -- Surround
  1635.         UF[PLAYER_ID].health.surround = CreateArtFrame(UF[PLAYER_ID].health)
  1636.         SetFramePosition(UF[PLAYER_ID].health.surround, "MEDIUM", UF[PLAYER_ID].health:GetFrameLevel() + 2, 256, 16, {"BOTTOMRIGHT", UF[PLAYER_ID].health, "BOTTOMRIGHT", 0, 0})
  1637.         UF[PLAYER_ID].health.surround.bg:SetTexture(Textures[layoutSize].f1.health.surround)
  1638.        
  1639.         -- Background
  1640.         UF[PLAYER_ID].health.background = CreateArtFrame(UF[PLAYER_ID].health)
  1641.         SetFramePosition(UF[PLAYER_ID].health.background, "MEDIUM", UF[PLAYER_ID].health:GetFrameLevel(), 256, 16, {"BOTTOMRIGHT", UF[PLAYER_ID].health, "BOTTOMRIGHT", 0, 0})
  1642.         UF[PLAYER_ID].health.background.bg:SetTexture(Textures[layoutSize].f1.health.bar)
  1643.        
  1644.         -- Bar
  1645.         UF[PLAYER_ID].health.bar = CreateArtFrame(UF[PLAYER_ID].health.background)
  1646.         UF[PLAYER_ID].health.bar.pos = 0
  1647.         UF[PLAYER_ID].health.bar.maxwidth = HealthWidthShort[layoutSize][PLAYER_ID]
  1648.         SetFramePosition(UF[PLAYER_ID].health.bar, "MEDIUM", UF[PLAYER_ID].health.background:GetFrameLevel() + 1, 0, (layoutSize == "small") and 9 or 10, {"BOTTOMRIGHT", UF[PLAYER_ID].health.background, "BOTTOMRIGHT", -1, 1})
  1649.         UF[PLAYER_ID].health.bar.bg:SetTexture(Textures.plain)
  1650.        
  1651.         -- Bar End
  1652.         UF[PLAYER_ID].health.bar.ender = CreateArtFrame(UF[PLAYER_ID].health.background)
  1653.         SetFramePosition(UF[PLAYER_ID].health.bar.ender, "MEDIUM", UF[PLAYER_ID].health.bar:GetFrameLevel(), (layoutSize == "small") and 8 or 9, 16, {"BOTTOMRIGHT", UF[PLAYER_ID].health.bar, "BOTTOMLEFT", 0, -1})
  1654.         UF[PLAYER_ID].health.bar.ender.bg:SetTexture(Textures[layoutSize].f1.health.bar)
  1655.         UF[PLAYER_ID].health.bar.ender.bg:SetTexCoord(unpack(HealthEndBarCoords[layoutSize][PLAYER_ID]))
  1656.         UF[PLAYER_ID].health.bar.ender:Hide()
  1657.        
  1658.         -- HealthBar Text
  1659.         UF[PLAYER_ID].healthtext = CreateTextFrame(UF[PLAYER_ID].health, "BOTTOM", "RIGHT")
  1660.         SetFramePosition(UF[PLAYER_ID].healthtext, "MEDIUM", UF[PLAYER_ID].health:GetFrameLevel() + 2, 12, 12, {"BOTTOMRIGHT", UF[PLAYER_ID].health, "BOTTOMRIGHT", -6, 1})
  1661.        
  1662.         -- Health Text
  1663.         UF[PLAYER_ID].health.fullval = CreateTextFrame(UF[PLAYER_ID].health, "BOTTOM", "LEFT")
  1664.        
  1665.         -- Steps
  1666.         UF[PLAYER_ID].health.steps = {}
  1667.         for i = 1, 2 do
  1668.             UF[PLAYER_ID].health.steps[i] = CreateArtFrame(UF[PLAYER_ID].health.surround)
  1669.             SetFramePosition(UF[PLAYER_ID].health.steps[i], "MEDIUM", UF[PLAYER_ID].health.surround:GetFrameLevel() + 2, 16, 16, {"BOTTOMRIGHT", UF[PLAYER_ID].health.surround, "BOTTOMRIGHT", 0, 0})
  1670.             UF[PLAYER_ID].health.steps[i].bg:SetTexture(Textures[layoutSize].f1.health.step)
  1671.             UF[PLAYER_ID].health.steps[i]:Hide()
  1672.         end
  1673.        
  1674.         -- Arrow
  1675.         UF[PLAYER_ID].health.arrow = {}
  1676.         UF[PLAYER_ID].health.arrow.step = -1
  1677.        
  1678.             -- Surround
  1679.             UF[PLAYER_ID].health.arrow.surround = CreateArtFrame(UF[PLAYER_ID].health.bar)
  1680.             SetFramePosition(UF[PLAYER_ID].health.arrow.surround, "MEDIUM", UF[PLAYER_ID].health:GetFrameLevel(), 64, 32, {"BOTTOM", UF[PLAYER_ID].health.bar, "BOTTOMLEFT", 2, HealthArrowYOffset[layoutSize]})
  1681.             UF[PLAYER_ID].health.arrow.surround.bg:SetTexture(Textures[layoutSize].f1.health.arrow.surround)
  1682.            
  1683.             -- Background
  1684.             UF[PLAYER_ID].health.arrow.background = CreateArtFrame(UF[PLAYER_ID].health.arrow.surround)
  1685.             SetFramePosition(UF[PLAYER_ID].health.arrow.background, "MEDIUM", UF[PLAYER_ID].health:GetFrameLevel(), 64, 32, {"BOTTOM", UF[PLAYER_ID].health.arrow.surround, "BOTTOM", 0, 0})
  1686.             UF[PLAYER_ID].health.arrow.background.bg:SetTexture(Textures[layoutSize].f1.health.arrow.background)
  1687.            
  1688.             -- Percent Text
  1689.             UF[PLAYER_ID].health.arrow.percent = CreateTextFrame(UF[PLAYER_ID].health.arrow.surround, "BOTTOM", "RIGHT")
  1690.             SetFramePosition(UF[PLAYER_ID].health.arrow.percent, "MEDIUM", UF[PLAYER_ID].health:GetFrameLevel(), 12, 12, {"BOTTOMRIGHT", UF[PLAYER_ID].health.arrow.surround, "BOTTOMRIGHT", -44, 0})
  1691.        
  1692.         -- Secondary Health
  1693.         UF[PLAYER_ID].health2 = CreateArtFrame(UF[PLAYER_ID].health)
  1694.         SetFramePosition(UF[PLAYER_ID].health2, "MEDIUM", UF[PLAYER_ID].health:GetFrameLevel() + 3, HealthWidth[layoutSize][PLAYER_ID], 3, {"BOTTOMRIGHT", UF[PLAYER_ID].health, "BOTTOMRIGHT", 0, 0})
  1695.         UF[PLAYER_ID].health2:SetBackdrop(SimpleBackdrop)
  1696.         UF[PLAYER_ID].health2:SetBackdropColor(1, 1, 1, 1)
  1697.         UF[PLAYER_ID].health2:SetBackdropBorderColor(0, 0, 0, 1)
  1698.         UF[PLAYER_ID].health2.alpha = 0
  1699.         UF[PLAYER_ID].health2.visible = true
  1700.         UF[PLAYER_ID].health2:Hide()
  1701.        
  1702.     -- Power
  1703.     UF[PLAYER_ID].power = CreateFrame("Frame", nil, UF[PLAYER_ID])
  1704.     UF[PLAYER_ID].power:SetParent(UF[PLAYER_ID])
  1705.     SetFramePosition(UF[PLAYER_ID].power, "MEDIUM", UF[PLAYER_ID]:GetFrameLevel(), 256, 16, {"BOTTOMRIGHT", UF[PLAYER_ID], "BOTTOMRIGHT", 0, -1})
  1706.     UF[PLAYER_ID].power.color = ""
  1707.     UF[PLAYER_ID].power.alpha = 1
  1708.     UF[PLAYER_ID].power.position = -1
  1709.     UF[PLAYER_ID].power.elapsed = 0
  1710.     UF[PLAYER_ID].power.interval = 0.2
  1711.     UF[PLAYER_ID].power:SetScript("OnUpdate", function(self, elapsed)
  1712.         Overlay:Power_OnUpdate(self, elapsed, PLAYER_ID)
  1713.     end)
  1714.    
  1715.         -- Surround
  1716.         UF[PLAYER_ID].power.surround = CreateArtFrame(UF[PLAYER_ID].power)
  1717.         SetFramePosition(UF[PLAYER_ID].power.surround, "MEDIUM", UF[PLAYER_ID].power:GetFrameLevel() + 2, 256, 16, {"BOTTOMRIGHT", UF[PLAYER_ID].power, "BOTTOMRIGHT", 0, 0})
  1718.         UF[PLAYER_ID].power.surround.bg:SetTexture(Textures[layoutSize].f1.power.surround)
  1719.        
  1720.         -- Background
  1721.         UF[PLAYER_ID].power.background = CreateArtFrame(UF[PLAYER_ID].power)
  1722.         SetFramePosition(UF[PLAYER_ID].power.background, "MEDIUM", UF[PLAYER_ID].power:GetFrameLevel(), 256, 16, {"BOTTOMRIGHT", UF[PLAYER_ID].power, "BOTTOMRIGHT", 0, 0})
  1723.         UF[PLAYER_ID].power.background.bg:SetTexture(Textures[layoutSize].f1.power.bar)
  1724.        
  1725.         -- Bar
  1726.         UF[PLAYER_ID].power.bar = CreateArtFrame(UF[PLAYER_ID].power.background)
  1727.         UF[PLAYER_ID].power.bar.pos = 0
  1728.         UF[PLAYER_ID].power.bar.maxwidth = PowerWidthShort[layoutSize][PLAYER_ID]
  1729.         SetFramePosition(UF[PLAYER_ID].power.bar, "MEDIUM", UF[PLAYER_ID].power.background:GetFrameLevel() + 1, 0, (layoutSize == "small") and 7 or 8, {"TOPRIGHT", UF[PLAYER_ID].power.background, "TOPRIGHT", 0, -1})
  1730.         UF[PLAYER_ID].power.bar.bg:SetTexture(Textures.plain)
  1731.        
  1732.         -- Bar End
  1733.         UF[PLAYER_ID].power.bar.ender = CreateArtFrame(UF[PLAYER_ID].power.background)
  1734.         SetFramePosition(UF[PLAYER_ID].power.bar.ender, "MEDIUM", UF[PLAYER_ID].power.bar:GetFrameLevel(), (layoutSize == "small") and 6 or 7, 16, {"TOPRIGHT", UF[PLAYER_ID].power.bar, "TOPLEFT", 0, 1})
  1735.         UF[PLAYER_ID].power.bar.ender.bg:SetTexture(Textures[layoutSize].f1.power.bar)
  1736.         UF[PLAYER_ID].power.bar.ender.bg:SetTexCoord(unpack(PowerEndBarCoords[layoutSize][PLAYER_ID]))
  1737.         UF[PLAYER_ID].power.bar.ender:Hide()
  1738.        
  1739.         -- Power Text
  1740.         UF[PLAYER_ID].power.fullval = CreateTextFrame(UF[PLAYER_ID].power, "TOP", "LEFT")
  1741.        
  1742.         -- Steps
  1743.         UF[PLAYER_ID].power.steps = {}
  1744.         for i = 1, 3 do
  1745.             UF[PLAYER_ID].power.steps[i] = CreateArtFrame(UF[PLAYER_ID].power.surround)
  1746.             SetFramePosition(UF[PLAYER_ID].power.steps[i], "MEDIUM", UF[PLAYER_ID].power.surround:GetFrameLevel() + 2, 16, 16, {"BOTTOMRIGHT", UF[PLAYER_ID].power.surround, "BOTTOMRIGHT", 0, 0})
  1747.             UF[PLAYER_ID].power.steps[i].bg:SetTexture(Textures[layoutSize].f1.power.step)
  1748.             UF[PLAYER_ID].power.steps[i]:Hide()
  1749.         end
  1750.        
  1751.         -- Arrow
  1752.         UF[PLAYER_ID].power.arrow = {}
  1753.         UF[PLAYER_ID].power.arrow.step = -1
  1754.        
  1755.             -- Surround
  1756.             UF[PLAYER_ID].power.arrow.surround = CreateArtFrame(UF[PLAYER_ID].power.bar)
  1757.             SetFramePosition(UF[PLAYER_ID].power.arrow.surround, "MEDIUM", UF[PLAYER_ID].power:GetFrameLevel(), 64, 32, {"BOTTOM", UF[PLAYER_ID].power.bar, "BOTTOMLEFT", 1, PowerArrowYOffset[layoutSize]})
  1758.             UF[PLAYER_ID].power.arrow.surround.bg:SetTexture(Textures[layoutSize].f1.power.arrow.surround)
  1759.            
  1760.             -- Background
  1761.             UF[PLAYER_ID].power.arrow.background = CreateArtFrame(UF[PLAYER_ID].power.arrow.surround)
  1762.             SetFramePosition(UF[PLAYER_ID].power.arrow.background, "MEDIUM", UF[PLAYER_ID].power:GetFrameLevel(), 64, 32, {"BOTTOM", UF[PLAYER_ID].power.arrow.surround, "BOTTOM", 0, 0})
  1763.             UF[PLAYER_ID].power.arrow.background.bg:SetTexture(Textures[layoutSize].f1.power.arrow.background)
  1764.        
  1765.             -- Percent Text
  1766.             UF[PLAYER_ID].power.arrow.percent = CreateTextFrame(UF[PLAYER_ID].power.arrow.surround, "TOP", "RIGHT")
  1767.             SetFramePosition(UF[PLAYER_ID].power.arrow.percent, "MEDIUM", UF[PLAYER_ID].power:GetFrameLevel(), 12, 12, {"TOPRIGHT", UF[PLAYER_ID].power.arrow.surround, "TOPLEFT", 20, PowerArrowTextYOffset[layoutSize]})
  1768.            
  1769.         -- Secondary Power
  1770.         UF[PLAYER_ID].power2 = CreateArtFrame(UF[PLAYER_ID].power)
  1771.         SetFramePosition(UF[PLAYER_ID].power2, "MEDIUM", UF[PLAYER_ID].power:GetFrameLevel() + 3, PowerWidth[layoutSize][PLAYER_ID], 3, {"TOPRIGHT", UF[PLAYER_ID].power, "TOPRIGHT", 0, 0})
  1772.         UF[PLAYER_ID].power2:SetBackdrop(SimpleBackdrop)
  1773.         UF[PLAYER_ID].power2:SetBackdropColor(1, 1, 1, 1)
  1774.         UF[PLAYER_ID].power2:SetBackdropBorderColor(0, 0, 0, 1)
  1775.         UF[PLAYER_ID].power2.alpha = 0
  1776.         UF[PLAYER_ID].power2.visible = true
  1777.         UF[PLAYER_ID].power2:Hide()
  1778.    
  1779.     -- In Between
  1780.     UF[PLAYER_ID].inbetween = CreateArtFrame(UF[PLAYER_ID])
  1781.     SetFramePosition(UF[PLAYER_ID].inbetween, "MEDIUM", UF[PLAYER_ID]:GetFrameLevel(), PowerWidth[layoutSize][PLAYER_ID] + 2, 1, {"RIGHT", UF[PLAYER_ID], "RIGHT", 0, -1})
  1782.     UF[PLAYER_ID].inbetween.bg:SetTexture(Textures.plain)
  1783.     UF[PLAYER_ID].inbetween.bg:SetVertexColor(1, 1, 1, 0)
  1784.     UF[PLAYER_ID].inbetween.wound = false
  1785.     UF[PLAYER_ID].inbetween.woundend = 0
  1786.     UF[PLAYER_ID].inbetween.heal = false
  1787.     UF[PLAYER_ID].inbetween.healend = 0
  1788.     UF[PLAYER_ID].inbetween.incheal = false
  1789.     UF[PLAYER_ID].inbetween.elapsed = 0
  1790.     UF[PLAYER_ID].inbetween.interval = 0.1
  1791.     UF[PLAYER_ID].inbetween:SetScript("OnUpdate", function(self, elapsed)
  1792.         InBetween_OnUpdate(self, elapsed)
  1793.     end)
  1794.    
  1795.     -- End Box
  1796.     UF[PLAYER_ID].endbox = CreateStatusBox(UF[PLAYER_ID])
  1797.     SetFramePosition(UF[PLAYER_ID].endbox, "MEDIUM", UF[PLAYER_ID]:GetFrameLevel(), 16, 32, {"LEFT", UF[PLAYER_ID], "RIGHT", 1, 0})
  1798.     UF[PLAYER_ID].endbox.surround:SetTexture(Textures[layoutSize].f1.endbox.surround)
  1799.     UF[PLAYER_ID].endbox.background:SetTexture(Textures[layoutSize].f1.endbox.bar)
  1800.     UF[PLAYER_ID].endbox.bar:SetTexture(Textures[layoutSize].f1.endbox.bar)
  1801.     UF[PLAYER_ID].endbox.bar:SetVertexColor(0, 0, 0, 0)
  1802.     UF[PLAYER_ID].endbox.elapsed = 0
  1803.     UF[PLAYER_ID].endbox.interval = 0.2
  1804.     UF[PLAYER_ID].endbox:SetScript("OnUpdate", function(self, elapsed)
  1805.         if UF[PLAYER_ID].haspet then
  1806.             Overlay:Health_OnUpdate(self, elapsed, PET_ID)
  1807.             Overlay:Power_OnUpdate(self, elapsed, PET_ID)
  1808.         end
  1809.     end)
  1810.    
  1811.     -- Range Display
  1812.     UF[PLAYER_ID].rangedisplay = CreateTextFrame(UF[PLAYER_ID].endbox, "BOTTOM", "LEFT")
  1813.     SetFramePosition(UF[PLAYER_ID].rangedisplay, "MEDIUM", UF[PLAYER_ID]:GetFrameLevel(), 12, 12, {"BOTTOMLEFT", UF[PLAYER_ID].endbox, "BOTTOMRIGHT", -2, 12})
  1814.     UF[PLAYER_ID].rangedisplay.elapsed = 0
  1815.     UF[PLAYER_ID].rangedisplay.interval = 0.2
  1816.     UF[PLAYER_ID].rangedisplay.lastmin = -1
  1817.     UF[PLAYER_ID].rangedisplay.lastmax = -1
  1818.     UF[PLAYER_ID].rangedisplay:SetScript("OnUpdate", function(self, elapsed)
  1819.         Overlay:RangeDisplay_OnUpdate(self, elapsed, PET_ID)
  1820.     end)
  1821.    
  1822.     -- Status Boxes
  1823.     UF[PLAYER_ID].statusbox = {}
  1824.     for i = 1, 2 do
  1825.         UF[PLAYER_ID].statusbox[i] = CreateStatusBox(UF[PLAYER_ID].power)
  1826.         SetFramePosition(UF[PLAYER_ID].statusbox[i], "MEDIUM", UF[PLAYER_ID].power:GetFrameLevel(), 16, 16, {"BOTTOMRIGHT", UF[PLAYER_ID].power, "BOTTOMLEFT", -((i-1)*5+(i)) + (256 - PowerWidthShort[layoutSize][PLAYER_ID] - 1), 0})
  1827.         UF[PLAYER_ID].statusbox[i].surround:SetTexture(Textures[layoutSize].f1.statusbox.surround)
  1828.         UF[PLAYER_ID].statusbox[i].background:SetTexture(Textures[layoutSize].f1.statusbox.bar)
  1829.         UF[PLAYER_ID].statusbox[i].bar:SetTexture(Textures[layoutSize].f1.statusbox.bar)
  1830.         UF[PLAYER_ID].statusbox[i].bar:SetVertexColor(0, 0, 0, 0)
  1831.     end
  1832.    
  1833.     -- End Icon
  1834.     UF[PLAYER_ID].endicon = CreateArtFrame(UF[PLAYER_ID])
  1835.     UF[PLAYER_ID].endicon:Hide()
  1836.     SetFramePosition(UF[PLAYER_ID].endicon, "MEDIUM", UF[PLAYER_ID]:GetFrameLevel(), 24, 24, {"BOTTOMRIGHT", UF[PLAYER_ID], "TOPLEFT", (256 - HealthWidthShort[layoutSize][PLAYER_ID]) + 22, (layoutSize == "small") and 16 or 20})
  1837.     UF[PLAYER_ID].endicon.bg:SetTexture([[Interface\TargetingFrame\UI-RaidTargetingIcons]])
  1838.    
  1839.    
  1840.     ----------------
  1841.     ---- Target ----
  1842.     ----------------
  1843.     local Parent = _G[ParentFrames[TARGET_ID]] or UIParent
  1844.     UF[TARGET_ID] = CreateFrame("Frame", ParentFrames[TARGET_ID].."_Overlay", Parent)
  1845.     UF[TARGET_ID]:Hide()
  1846.     SetFramePosition(UF[TARGET_ID], "MEDIUM", 0, 256, 32, {"BOTTOMLEFT", Parent, "BOTTOMLEFT", 0, -5})
  1847.     UF[TARGET_ID].backgroundColorID = ""
  1848.    
  1849.     -- Health
  1850.     UF[TARGET_ID].health = CreateFrame("Frame", nil, UF[TARGET_ID])
  1851.     UF[TARGET_ID].health:SetParent(UF[TARGET_ID])
  1852.     SetFramePosition(UF[TARGET_ID].health, "MEDIUM", UF[TARGET_ID]:GetFrameLevel(), 256, 16, {"BOTTOMLEFT", UF[TARGET_ID], "BOTTOMLEFT", 0, 16})
  1853.     UF[TARGET_ID].health.colorID = ""
  1854.     UF[TARGET_ID].health.alpha = 1
  1855.     UF[TARGET_ID].health.position = -1
  1856.     UF[TARGET_ID].health.elapsed = 0
  1857.     UF[TARGET_ID].health.interval = 0.2
  1858.     UF[TARGET_ID].health:SetScript("OnUpdate", function(self, elapsed)
  1859.         Overlay:Health_OnUpdate(self, elapsed, TARGET_ID)
  1860.     end)
  1861.    
  1862.         -- Surround
  1863.         UF[TARGET_ID].health.surround = CreateArtFrame(UF[TARGET_ID].health)
  1864.         SetFramePosition(UF[TARGET_ID].health.surround, "MEDIUM", UF[TARGET_ID].health:GetFrameLevel() + 2, 256, 16, {"BOTTOMLEFT", UF[TARGET_ID].health, "BOTTOMLEFT", 0, 0})
  1865.         UF[TARGET_ID].health.surround.bg:SetTexture(Textures[layoutSize].f1.health.surround)
  1866.         UF[TARGET_ID].health.surround.bg:SetTexCoord(1, 0, 0, 1)
  1867.        
  1868.         -- Background
  1869.         UF[TARGET_ID].health.background = CreateArtFrame(UF[TARGET_ID].health)
  1870.         SetFramePosition(UF[TARGET_ID].health.background, "MEDIUM", UF[TARGET_ID].health:GetFrameLevel(), 256, 16, {"BOTTOMLEFT", UF[TARGET_ID].health, "BOTTOMLEFT", 0, 0})
  1871.         UF[TARGET_ID].health.background.bg:SetTexture(Textures[layoutSize].f1.health.bar)
  1872.         UF[TARGET_ID].health.background.bg:SetTexCoord(1, 0, 0, 1)
  1873.        
  1874.         -- Bar
  1875.         UF[TARGET_ID].health.bar = CreateArtFrame(UF[TARGET_ID].health.background)
  1876.         UF[TARGET_ID].health.bar.pos = 0
  1877.         UF[TARGET_ID].health.bar.maxwidth = HealthWidthShort[layoutSize][TARGET_ID]
  1878.         SetFramePosition(UF[TARGET_ID].health.bar, "MEDIUM", UF[TARGET_ID].health.background:GetFrameLevel() + 1, 0, (layoutSize == "small") and 9 or 10, {"BOTTOMLEFT", UF[TARGET_ID].health.background, "BOTTOMLEFT", 1, 1})
  1879.         UF[TARGET_ID].health.bar.bg:SetTexture(Textures.plain)
  1880.        
  1881.         -- Bar End
  1882.         UF[TARGET_ID].health.bar.ender = CreateArtFrame(UF[TARGET_ID].health.background)
  1883.         SetFramePosition(UF[TARGET_ID].health.bar.ender, "MEDIUM", UF[TARGET_ID].health.bar:GetFrameLevel(), (layoutSize == "small") and 8 or 9, 16, {"BOTTOMLEFT", UF[TARGET_ID].health.bar, "BOTTOMRIGHT", 0, -1})
  1884.         UF[TARGET_ID].health.bar.ender.bg:SetTexture(Textures[layoutSize].f1.health.bar)
  1885.         UF[TARGET_ID].health.bar.ender.bg:SetTexCoord(unpack(HealthEndBarCoords[layoutSize][TARGET_ID]))
  1886.         UF[TARGET_ID].health.bar.ender:Hide()
  1887.        
  1888.         -- HealthBar Text
  1889.         UF[TARGET_ID].healthtext = CreateTextFrame(UF[TARGET_ID].health, "BOTTOM", "LEFT")
  1890.         SetFramePosition(UF[TARGET_ID].healthtext, "MEDIUM", UF[TARGET_ID].health:GetFrameLevel() + 2, 12, 12, {"BOTTOMLEFT", UF[TARGET_ID].health, "BOTTOMLEFT", 8, 1})
  1891.        
  1892.         -- Health Text
  1893.         UF[TARGET_ID].health.fullval = CreateTextFrame(UF[TARGET_ID].health, "BOTTOM", "LEFT")
  1894.        
  1895.         -- Steps
  1896.         UF[TARGET_ID].health.steps = {}
  1897.         for i = 1, 2 do
  1898.             UF[TARGET_ID].health.steps[i] = CreateArtFrame(UF[TARGET_ID].health.surround)
  1899.             SetFramePosition(UF[TARGET_ID].health.steps[i], "MEDIUM", UF[TARGET_ID].health.surround:GetFrameLevel() + 2, 16, 16, {"BOTTOMLEFT", UF[TARGET_ID].health.surround, "BOTTOMLEFT", 0, 0})
  1900.             UF[TARGET_ID].health.steps[i].bg:SetTexture(Textures[layoutSize].f1.health.step)
  1901.             UF[TARGET_ID].health.steps[i].bg:SetTexCoord(1, 0, 0, 1)
  1902.             UF[TARGET_ID].health.steps[i]:Hide()
  1903.         end
  1904.        
  1905.         -- Arrow
  1906.         UF[TARGET_ID].health.arrow = {}
  1907.         UF[TARGET_ID].health.arrow.step = -1
  1908.        
  1909.             -- Surround
  1910.             UF[TARGET_ID].health.arrow.surround = CreateArtFrame(UF[TARGET_ID].health.bar)
  1911.             SetFramePosition(UF[TARGET_ID].health.arrow.surround, "MEDIUM", UF[TARGET_ID].health:GetFrameLevel(), 64, 32, {"BOTTOM", UF[TARGET_ID].health.bar, "BOTTOMRIGHT", -2, HealthArrowYOffset[layoutSize]})
  1912.             UF[TARGET_ID].health.arrow.surround.bg:SetTexture(Textures[layoutSize].f1.health.arrow.surround)
  1913.             UF[TARGET_ID].health.arrow.surround.bg:SetTexCoord(1, 0, 0, 1)
  1914.            
  1915.             -- Background
  1916.             UF[TARGET_ID].health.arrow.background = CreateArtFrame(UF[TARGET_ID].health.arrow.surround)
  1917.             SetFramePosition(UF[TARGET_ID].health.arrow.background, "MEDIUM", UF[TARGET_ID].health:GetFrameLevel(), 64, 32, {"BOTTOM", UF[TARGET_ID].health.arrow.surround, "BOTTOM", 0, 0})
  1918.             UF[TARGET_ID].health.arrow.background.bg:SetTexture(Textures[layoutSize].f1.health.arrow.background)
  1919.             UF[TARGET_ID].health.arrow.background.bg:SetTexCoord(1, 0, 0, 1)
  1920.            
  1921.             -- Percent Text
  1922.             UF[TARGET_ID].health.arrow.percent = CreateTextFrame(UF[TARGET_ID].health.arrow.surround, "BOTTOM", "LEFT")
  1923.             SetFramePosition(UF[TARGET_ID].health.arrow.percent, "MEDIUM", UF[TARGET_ID].health:GetFrameLevel(), 12, 12, {"BOTTOMLEFT", UF[TARGET_ID].health.arrow.surround, "BOTTOMRIGHT", -18, 0})
  1924.    
  1925.     -- Power
  1926.     UF[TARGET_ID].power = CreateFrame("Frame", nil, UF[TARGET_ID])
  1927.     UF[TARGET_ID].power:SetParent(UF[TARGET_ID])
  1928.     SetFramePosition(UF[TARGET_ID].power, "MEDIUM", UF[TARGET_ID]:GetFrameLevel(), 256, 16, {"BOTTOMLEFT", UF[TARGET_ID], "BOTTOMLEFT", 0, -1})
  1929.     UF[TARGET_ID].power.color = ""
  1930.     UF[TARGET_ID].power.alpha = 1
  1931.     UF[TARGET_ID].power.position = -1
  1932.     UF[TARGET_ID].power.elapsed = 0
  1933.     UF[TARGET_ID].power.interval = 0.1
  1934.     UF[TARGET_ID].power:SetScript("OnUpdate", function(self, elapsed)
  1935.         Overlay:Power_OnUpdate(self, elapsed, TARGET_ID)
  1936.     end)
  1937.    
  1938.         -- Surround
  1939.         UF[TARGET_ID].power.surround = CreateArtFrame(UF[TARGET_ID].power)
  1940.         SetFramePosition(UF[TARGET_ID].power.surround, "MEDIUM", UF[TARGET_ID].power:GetFrameLevel() + 2, 256, 16, {"BOTTOMLEFT", UF[TARGET_ID].power, "BOTTOMLEFT", 0, 0})
  1941.         UF[TARGET_ID].power.surround.bg:SetTexture(Textures[layoutSize].f1.power.surround)
  1942.         UF[TARGET_ID].power.surround.bg:SetTexCoord(1, 0, 0, 1)
  1943.        
  1944.         -- Background
  1945.         UF[TARGET_ID].power.background = CreateArtFrame(UF[TARGET_ID].power)
  1946.         SetFramePosition(UF[TARGET_ID].power.background, "MEDIUM", UF[TARGET_ID].power:GetFrameLevel(), 256, 16, {"BOTTOMLEFT", UF[TARGET_ID].power, "BOTTOMLEFT", 0, 0})
  1947.         UF[TARGET_ID].power.background.bg:SetTexture(Textures[layoutSize].f1.power.bar)
  1948.         UF[TARGET_ID].power.background.bg:SetTexCoord(1, 0, 0, 1)
  1949.        
  1950.         -- Bar
  1951.         UF[TARGET_ID].power.bar = CreateArtFrame(UF[TARGET_ID].power.background)
  1952.         UF[TARGET_ID].power.bar.pos = 0
  1953.         UF[TARGET_ID].power.bar.maxwidth = PowerWidthShort[layoutSize][TARGET_ID]
  1954.         SetFramePosition(UF[TARGET_ID].power.bar, "MEDIUM", UF[TARGET_ID].power.background:GetFrameLevel() + 1, 0, (layoutSize == "small") and 7 or 8, {"TOPLEFT", UF[TARGET_ID].power.background, "TOPLEFT", 0, -1})
  1955.         UF[TARGET_ID].power.bar.bg:SetTexture(Textures.plain)
  1956.        
  1957.         -- Bar End
  1958.         UF[TARGET_ID].power.bar.ender = CreateArtFrame(UF[TARGET_ID].power.background)
  1959.         SetFramePosition(UF[TARGET_ID].power.bar.ender, "MEDIUM", UF[TARGET_ID].power.bar:GetFrameLevel(), (layoutSize == "small") and 6 or 7, 16, {"TOPLEFT", UF[TARGET_ID].power.bar, "TOPRIGHT", 0, 1})
  1960.         UF[TARGET_ID].power.bar.ender.bg:SetTexture(Textures[layoutSize].f1.power.bar)
  1961.         UF[TARGET_ID].power.bar.ender.bg:SetTexCoord(unpack(PowerEndBarCoords[layoutSize][TARGET_ID]))
  1962.         UF[TARGET_ID].power.bar.ender:Hide()
  1963.        
  1964.         -- PowerBar Text
  1965.         UF[TARGET_ID].powertext = CreateTextFrame(UF[TARGET_ID].power, "BOTTOM", "LEFT")
  1966.         SetFramePosition(UF[TARGET_ID].powertext, "MEDIUM", UF[TARGET_ID].power:GetFrameLevel() + 2, 10, 10, {"BOTTOMLEFT", UF[TARGET_ID].power, "BOTTOMLEFT", 8, (layoutSize == "small") and 7 or 6})
  1967.        
  1968.         -- Power Text
  1969.         UF[TARGET_ID].power.fullval = CreateTextFrame(UF[TARGET_ID].power, "TOP", "RIGHT")
  1970.        
  1971.         -- Steps
  1972.         UF[TARGET_ID].power.steps = {}
  1973.         for i = 1, 3 do
  1974.             UF[TARGET_ID].power.steps[i] = CreateArtFrame(UF[TARGET_ID].power.surround)
  1975.             SetFramePosition(UF[TARGET_ID].power.steps[i], "MEDIUM", UF[TARGET_ID].power.surround:GetFrameLevel() + 2, 16, 16, {"BOTTOMLEFT", UF[TARGET_ID].power.surround, "BOTTOMLEFT", 0, 0})
  1976.             UF[TARGET_ID].power.steps[i].bg:SetTexture(Textures[layoutSize].f1.power.step)
  1977.             UF[TARGET_ID].power.steps[i].bg:SetTexCoord(1, 0, 0, 1)
  1978.             UF[TARGET_ID].power.steps[i]:Hide()
  1979.         end
  1980.        
  1981.         -- Arrow
  1982.         UF[TARGET_ID].power.arrow = {}
  1983.         UF[TARGET_ID].power.arrow.step = -1
  1984.        
  1985.             -- Surround
  1986.             UF[TARGET_ID].power.arrow.surround = CreateArtFrame(UF[TARGET_ID].power.bar)
  1987.             SetFramePosition(UF[TARGET_ID].power.arrow.surround, "MEDIUM", UF[TARGET_ID].power:GetFrameLevel(), 64, 32, {"BOTTOM", UF[TARGET_ID].power.bar, "BOTTOMRIGHT", -1, PowerArrowYOffset[layoutSize]})
  1988.             UF[TARGET_ID].power.arrow.surround.bg:SetTexture(Textures[layoutSize].f1.power.arrow.surround)
  1989.             UF[TARGET_ID].power.arrow.surround.bg:SetTexCoord(1, 0, 0, 1)
  1990.            
  1991.             -- Background
  1992.             UF[TARGET_ID].power.arrow.background = CreateArtFrame(UF[TARGET_ID].power.arrow.surround)
  1993.             SetFramePosition(UF[TARGET_ID].power.arrow.background, "MEDIUM", UF[TARGET_ID].power:GetFrameLevel(), 64, 32, {"BOTTOM", UF[TARGET_ID].power.arrow.surround, "BOTTOM", 0, 0})
  1994.             UF[TARGET_ID].power.arrow.background.bg:SetTexture(Textures[layoutSize].f1.power.arrow.background)
  1995.             UF[TARGET_ID].power.arrow.background.bg:SetTexCoord(1, 0, 0, 1)
  1996.        
  1997.             -- Percent Text
  1998.             UF[TARGET_ID].power.arrow.percent = CreateTextFrame(UF[TARGET_ID].power.arrow.surround, "TOP", "LEFT")
  1999.             SetFramePosition(UF[TARGET_ID].power.arrow.percent, "MEDIUM", UF[TARGET_ID].power:GetFrameLevel(), 12, 12, {"TOPLEFT", UF[TARGET_ID].power.arrow.surround, "TOPRIGHT", -18, PowerArrowTextYOffset[layoutSize]})
  2000.        
  2001.     -- In Between
  2002.     UF[TARGET_ID].inbetween = CreateArtFrame(UF[TARGET_ID])
  2003.     SetFramePosition(UF[TARGET_ID].inbetween, "MEDIUM", UF[TARGET_ID]:GetFrameLevel(), PowerWidth[layoutSize][TARGET_ID] + 2, 1, {"LEFT", UF[TARGET_ID], "LEFT", 0, -1})
  2004.     UF[TARGET_ID].inbetween.bg:SetTexture(Textures.plain)
  2005.     UF[TARGET_ID].inbetween.bg:SetVertexColor(1, 1, 1, 0)
  2006.     UF[TARGET_ID].inbetween.wound = false
  2007.     UF[TARGET_ID].inbetween.woundend = 0
  2008.     UF[TARGET_ID].inbetween.heal = false
  2009.     UF[TARGET_ID].inbetween.healend = 0
  2010.     UF[TARGET_ID].inbetween.incheal = false
  2011.     UF[TARGET_ID].inbetween.elapsed = 0
  2012.     UF[TARGET_ID].inbetween.interval = 0.1
  2013.     UF[TARGET_ID].inbetween:SetScript("OnUpdate", function(self, elapsed)
  2014.         InBetween_OnUpdate(self, elapsed)
  2015.     end)
  2016.    
  2017.     -- End Box
  2018.     UF[TARGET_ID].endbox = CreateStatusBox(UF[TARGET_ID])
  2019.     SetFramePosition(UF[TARGET_ID].endbox, "MEDIUM", UF[TARGET_ID]:GetFrameLevel(), 16, 32, {"RIGHT", UF[TARGET_ID], "LEFT", -1, 0})
  2020.     UF[TARGET_ID].endbox.surround:SetTexture(Textures[layoutSize].f1.endbox.surround)
  2021.     UF[TARGET_ID].endbox.surround:SetTexCoord(1, 0, 0, 1)
  2022.     UF[TARGET_ID].endbox.background:SetTexture(Textures[layoutSize].f1.endbox.bar)
  2023.     UF[TARGET_ID].endbox.background:SetTexCoord(1, 0, 0, 1)
  2024.     UF[TARGET_ID].endbox.bar:SetTexture(Textures[layoutSize].f1.endbox.bar)
  2025.     UF[TARGET_ID].endbox.bar:SetTexCoord(1, 0, 0, 1)
  2026.     UF[TARGET_ID].endbox.bar:SetVertexColor(0, 0, 0, 0)
  2027.    
  2028.     -- End Box Text
  2029.     UF[TARGET_ID].endboxtext = CreateTextFrame(UF[TARGET_ID].endbox, "CENTER", "CENTER")
  2030.     SetFramePosition(UF[TARGET_ID].endboxtext, "MEDIUM", UF[TARGET_ID].endbox:GetFrameLevel() + 1, 12, 12, {"CENTER", UF[TARGET_ID].endbox, "CENTER", 4, 0})
  2031.    
  2032.     -- Range Display
  2033.     UF[TARGET_ID].rangedisplay = CreateTextFrame(UF[TARGET_ID].endbox, "BOTTOM", "RIGHT")
  2034.     SetFramePosition(UF[TARGET_ID].rangedisplay, "MEDIUM", UF[TARGET_ID]:GetFrameLevel(), 12, 12, {"BOTTOMRIGHT", UF[TARGET_ID].endbox, "BOTTOMLEFT", 4, 12})
  2035.     UF[TARGET_ID].rangedisplay.elapsed = 0
  2036.     UF[TARGET_ID].rangedisplay.interval = 0.2
  2037.     UF[TARGET_ID].rangedisplay.lastmin = -1
  2038.     UF[TARGET_ID].rangedisplay.lastmax = -1
  2039.     UF[TARGET_ID].rangedisplay:SetScript("OnUpdate", function(self, elapsed)
  2040.         Overlay:RangeDisplay_OnUpdate(self, elapsed, TARGET_ID)
  2041.     end)
  2042.    
  2043.     -- Status Boxes
  2044.     UF[TARGET_ID].statusbox = {}
  2045.     for i = 1, 2 do
  2046.         UF[TARGET_ID].statusbox[i] = CreateStatusBox(UF[TARGET_ID].power)
  2047.         SetFramePosition(UF[TARGET_ID].statusbox[i], "MEDIUM", UF[TARGET_ID].power:GetFrameLevel(), 16, 16, {"BOTTOMLEFT", UF[TARGET_ID].power, "BOTTOMRIGHT", ((i-1)*5+(i)) - (256 - PowerWidthShort[layoutSize][TARGET_ID] - 1), 0})
  2048.         UF[TARGET_ID].statusbox[i].surround:SetTexture(Textures[layoutSize].f1.statusbox.surround)
  2049.         UF[TARGET_ID].statusbox[i].surround:SetTexCoord(1, 0, 0, 1)
  2050.         UF[TARGET_ID].statusbox[i].background:SetTexture(Textures[layoutSize].f1.statusbox.bar)
  2051.         UF[TARGET_ID].statusbox[i].background:SetTexCoord(1, 0, 0, 1)
  2052.         UF[TARGET_ID].statusbox[i].bar:SetTexture(Textures[layoutSize].f1.statusbox.bar)
  2053.         UF[TARGET_ID].statusbox[i].bar:SetTexCoord(1, 0, 0, 1)
  2054.         UF[TARGET_ID].statusbox[i].bar:SetVertexColor(0, 0, 0, 0)
  2055.     end
  2056.    
  2057.     -- End Icon
  2058.     UF[TARGET_ID].endicon = CreateArtFrame(UF[TARGET_ID])
  2059.     UF[TARGET_ID].endicon:Hide()
  2060.     SetFramePosition(UF[TARGET_ID].endicon, "MEDIUM", UF[TARGET_ID]:GetFrameLevel(), 24, 24, {"BOTTOMLEFT", UF[TARGET_ID], "TOPRIGHT", -(256 - HealthWidthShort[layoutSize][TARGET_ID]) - 22, (layoutSize == "small") and 16 or 20})
  2061.     UF[TARGET_ID].endicon.bg:SetTexture([[Interface\TargetingFrame\UI-RaidTargetingIcons]])
  2062.    
  2063.    
  2064.     ---------------
  2065.     ---- Focus ----
  2066.     ---------------
  2067.     local Parent = _G[ParentFrames[FOCUS_ID]] or UIParent
  2068.     UF[FOCUS_ID] = CreateFrame("Frame", ParentFrames[FOCUS_ID].."_Overlay", Parent)
  2069.     UF[FOCUS_ID]:Hide()
  2070.     SetFramePosition(UF[FOCUS_ID], "MEDIUM", 0, 256, 16, {"BOTTOMRIGHT", Parent, "BOTTOMRIGHT", 0, 0})
  2071.     UF[FOCUS_ID].backgroundColorID = ""
  2072.    
  2073.     -- Health
  2074.     UF[FOCUS_ID].health = CreateFrame("Frame", nil, UF[FOCUS_ID])
  2075.     UF[FOCUS_ID].health:SetParent(UF[FOCUS_ID])
  2076.     SetFramePosition(UF[FOCUS_ID].health, "MEDIUM", UF[FOCUS_ID]:GetFrameLevel(), 256, 16, {"BOTTOMRIGHT", UF[FOCUS_ID], "BOTTOMRIGHT", 0, 0})
  2077.     UF[FOCUS_ID].health.colorID = ""
  2078.     UF[FOCUS_ID].health.alpha = 1
  2079.     UF[FOCUS_ID].health.position = -1
  2080.     UF[FOCUS_ID].health.elapsed = 0
  2081.     UF[FOCUS_ID].health.interval = 0.2
  2082.     UF[FOCUS_ID].health:SetScript("OnUpdate", function(self, elapsed)
  2083.         Overlay:Health_OnUpdate(self, elapsed, FOCUS_ID)
  2084.     end)
  2085.    
  2086.         -- Surround
  2087.         UF[FOCUS_ID].health.surround = CreateArtFrame(UF[FOCUS_ID].health)
  2088.         SetFramePosition(UF[FOCUS_ID].health.surround, "MEDIUM", UF[FOCUS_ID].health:GetFrameLevel(), 256, 16, {"BOTTOMRIGHT", UF[FOCUS_ID].health, "BOTTOMRIGHT", 0, 0})
  2089.         UF[FOCUS_ID].health.surround.bg:SetTexture(Textures[layoutSize].f2.health.surround)
  2090.        
  2091.         -- Background
  2092.         UF[FOCUS_ID].health.background = CreateArtFrame(UF[FOCUS_ID].health)
  2093.         SetFramePosition(UF[FOCUS_ID].health.background, "MEDIUM", UF[FOCUS_ID].health:GetFrameLevel(), 256, 16, {"BOTTOMRIGHT", UF[FOCUS_ID].health, "BOTTOMRIGHT", 0, 0})
  2094.         UF[FOCUS_ID].health.background.bg:SetTexture(Textures[layoutSize].f2.health.bar)
  2095.        
  2096.         -- Bar
  2097.         UF[FOCUS_ID].health.bar = CreateArtFrame(UF[FOCUS_ID].health.background)
  2098.         UF[FOCUS_ID].health.bar.pos = 0
  2099.         UF[FOCUS_ID].health.bar.maxwidth = HealthWidthShort[layoutSize][FOCUS_ID]
  2100.         SetFramePosition(UF[FOCUS_ID].health.bar, "MEDIUM", UF[FOCUS_ID].health.background:GetFrameLevel() + 1, 0, (layoutSize == "small") and 7 or 8, {"BOTTOMRIGHT", UF[FOCUS_ID].health.background, "BOTTOMRIGHT", -1, 1})
  2101.         UF[FOCUS_ID].health.bar.bg:SetTexture(Textures.plain)
  2102.        
  2103.         -- Bar End
  2104.         UF[FOCUS_ID].health.bar.ender = CreateArtFrame(UF[FOCUS_ID].health.background)
  2105.         SetFramePosition(UF[FOCUS_ID].health.bar.ender, "MEDIUM", UF[FOCUS_ID].health.bar:GetFrameLevel(), (layoutSize == "small") and 6 or 7, 16, {"BOTTOMRIGHT", UF[FOCUS_ID].health.bar, "BOTTOMLEFT", 0, -1})
  2106.         UF[FOCUS_ID].health.bar.ender.bg:SetTexture(Textures[layoutSize].f2.health.bar)
  2107.         UF[FOCUS_ID].health.bar.ender.bg:SetTexCoord(unpack(HealthEndBarCoords[layoutSize][FOCUS_ID]))
  2108.         UF[FOCUS_ID].health.bar.ender:Hide()
  2109.        
  2110.         -- HealthBar Text
  2111.         UF[FOCUS_ID].healthtext = CreateTextFrame(UF[FOCUS_ID].health, "BOTTOM", "RIGHT")
  2112.         SetFramePosition(UF[FOCUS_ID].healthtext, "MEDIUM", UF[FOCUS_ID].health:GetFrameLevel() + 2, 12, 12, {"BOTTOMRIGHT", UF[FOCUS_ID].health, "BOTTOMRIGHT", -4, 0})
  2113.        
  2114.         -- Health Text
  2115.         UF[FOCUS_ID].health.fullval = CreateTextFrame(UF[FOCUS_ID].health, "BOTTOM", "LEFT")
  2116.         SetFramePosition(UF[FOCUS_ID].health.fullval, "MEDIUM", UF[FOCUS_ID].health:GetFrameLevel() + 2, 12, 12, {"BOTTOMLEFT", UF[FOCUS_ID].health, "BOTTOMLEFT", 256 - HealthWidthShort[layoutSize][FOCUS_ID], 0})
  2117.        
  2118.     -- End Box
  2119.     UF[FOCUS_ID].endbox = CreateStatusBox(UF[FOCUS_ID])
  2120.     SetFramePosition(UF[FOCUS_ID].endbox, "MEDIUM", UF[FOCUS_ID]:GetFrameLevel(), 16, 16, {"LEFT", UF[FOCUS_ID], "RIGHT", 1, 0})
  2121.     UF[FOCUS_ID].endbox.surround:SetTexture(Textures[layoutSize].f2.endbox.surround)
  2122.     UF[FOCUS_ID].endbox.background:SetTexture(Textures[layoutSize].f2.endbox.bar)
  2123.     UF[FOCUS_ID].endbox.bar:SetTexture(Textures[layoutSize].f2.endbox.bar)
  2124.     UF[FOCUS_ID].endbox.bar:SetVertexColor(0, 0, 0, 0)
  2125.    
  2126.     -- End Box Text
  2127.     UF[FOCUS_ID].endboxtext = CreateTextFrame(UF[FOCUS_ID].endbox, "CENTER", "CENTER")
  2128.     SetFramePosition(UF[FOCUS_ID].endboxtext, "MEDIUM", UF[FOCUS_ID].endbox:GetFrameLevel() + 1, 12, 12, {"CENTER", UF[FOCUS_ID].endbox, "CENTER", -2, -4})
  2129.    
  2130.     -- Range Display
  2131.     UF[FOCUS_ID].rangedisplay = CreateTextFrame(UF[FOCUS_ID].endbox, "BOTTOM", "LEFT")
  2132.     SetFramePosition(UF[FOCUS_ID].rangedisplay, "MEDIUM", UF[FOCUS_ID]:GetFrameLevel(), 12, 12, {"BOTTOMLEFT", UF[FOCUS_ID].endbox, "BOTTOMRIGHT", -2, 0})
  2133.     UF[FOCUS_ID].rangedisplay.elapsed = 0
  2134.     UF[FOCUS_ID].rangedisplay.interval = 0.2
  2135.     UF[FOCUS_ID].rangedisplay.lastmin = -1
  2136.     UF[FOCUS_ID].rangedisplay.lastmax = -1
  2137.     UF[FOCUS_ID].rangedisplay:SetScript("OnUpdate", function(self, elapsed)
  2138.         Overlay:RangeDisplay_OnUpdate(self, elapsed, FOCUS_ID)
  2139.     end)
  2140.    
  2141.     -- Status Boxes
  2142.     UF[FOCUS_ID].statusbox = {}
  2143.     for i = 1, 2 do
  2144.         UF[FOCUS_ID].statusbox[i] = CreateStatusBox(UF[FOCUS_ID].health)
  2145.         SetFramePosition(UF[FOCUS_ID].statusbox[i], "MEDIUM", UF[FOCUS_ID].health:GetFrameLevel(), 16, 16, {"BOTTOMRIGHT", UF[FOCUS_ID].health, "BOTTOMLEFT", -((i-1)*5+(i)) + (256 - HealthWidthShort[layoutSize][FOCUS_ID] - 1), (layoutSize == "small") and -7 or -6})
  2146.         UF[FOCUS_ID].statusbox[i].surround:SetTexture(Textures[layoutSize].f1.statusbox.surround)
  2147.         UF[FOCUS_ID].statusbox[i].background:SetTexture(Textures[layoutSize].f1.statusbox.bar)
  2148.         UF[FOCUS_ID].statusbox[i].bar:SetTexture(Textures[layoutSize].f1.statusbox.bar)
  2149.         UF[FOCUS_ID].statusbox[i].bar:SetVertexColor(0, 0, 0, 0)
  2150.     end
  2151.    
  2152.     -- End Icon
  2153.     UF[FOCUS_ID].endicon = CreateArtFrame(UF[FOCUS_ID])
  2154.     UF[FOCUS_ID].endicon:Hide()
  2155.     SetFramePosition(UF[FOCUS_ID].endicon, "MEDIUM", UF[FOCUS_ID]:GetFrameLevel(), 12, 12, {"BOTTOMLEFT", UF[FOCUS_ID], "TOPLEFT", (256 - HealthWidthShort[layoutSize][FOCUS_ID]) - 9, -4})
  2156.     UF[FOCUS_ID].endicon.bg:SetTexture([[Interface\TargetingFrame\UI-RaidTargetingIcons]])
  2157.    
  2158.    
  2159.     ----------------------
  2160.     ---- Focus Target ----
  2161.     ----------------------
  2162.     local Parent = _G[ParentFrames[FOCUSTARGET_ID]] or UIParent
  2163.     UF[FOCUSTARGET_ID] = CreateFrame("Frame", ParentFrames[FOCUSTARGET_ID].."_Overlay", Parent)
  2164.     UF[FOCUSTARGET_ID]:Hide()
  2165.     SetFramePosition(UF[FOCUSTARGET_ID], "MEDIUM", 0, 256, 16, {"BOTTOMRIGHT", Parent, "BOTTOMRIGHT", 0, (layoutSize == "small") and 0 or -1})
  2166.     UF[FOCUSTARGET_ID].backgroundColorID = ""
  2167.    
  2168.     -- Health
  2169.     UF[FOCUSTARGET_ID].health = CreateFrame("Frame", nil, UF[FOCUSTARGET_ID])
  2170.     UF[FOCUSTARGET_ID].health:SetParent(UF[FOCUSTARGET_ID])
  2171.     SetFramePosition(UF[FOCUSTARGET_ID].health, "MEDIUM", UF[FOCUSTARGET_ID]:GetFrameLevel(), 256, 16, {"BOTTOMRIGHT", UF[FOCUSTARGET_ID], "BOTTOMRIGHT", 0, 0})
  2172.     UF[FOCUSTARGET_ID].health.colorID = ""
  2173.     UF[FOCUSTARGET_ID].health.alpha = 1
  2174.     UF[FOCUSTARGET_ID].health.position = -1
  2175.     UF[FOCUSTARGET_ID].health.elapsed = 0
  2176.     UF[FOCUSTARGET_ID].health.interval = 0.2
  2177.     UF[FOCUSTARGET_ID].health:SetScript("OnUpdate", function(self, elapsed)
  2178.         Overlay:Health_OnUpdate(self, elapsed, FOCUSTARGET_ID)
  2179.     end)
  2180.    
  2181.         -- Surround
  2182.         UF[FOCUSTARGET_ID].health.surround = CreateArtFrame(UF[FOCUSTARGET_ID].health)
  2183.         SetFramePosition(UF[FOCUSTARGET_ID].health.surround, "MEDIUM", UF[FOCUSTARGET_ID].health:GetFrameLevel(), 256, 16, {"BOTTOMRIGHT", UF[FOCUSTARGET_ID].health, "BOTTOMRIGHT", 0, 0})
  2184.         UF[FOCUSTARGET_ID].health.surround.bg:SetTexture(Textures[layoutSize].f3.health.surround)
  2185.        
  2186.         -- Background
  2187.         UF[FOCUSTARGET_ID].health.background = CreateArtFrame(UF[FOCUSTARGET_ID].health)
  2188.         SetFramePosition(UF[FOCUSTARGET_ID].health.background, "MEDIUM", UF[FOCUSTARGET_ID].health:GetFrameLevel(), 256, 16, {"BOTTOMRIGHT", UF[FOCUSTARGET_ID].health, "BOTTOMRIGHT", 0, 0})
  2189.         UF[FOCUSTARGET_ID].health.background.bg:SetTexture(Textures[layoutSize].f3.health.bar)
  2190.        
  2191.         -- Bar
  2192.         UF[FOCUSTARGET_ID].health.bar = CreateArtFrame(UF[FOCUSTARGET_ID].health.background)
  2193.         UF[FOCUSTARGET_ID].health.bar.pos = 0
  2194.         UF[FOCUSTARGET_ID].health.bar.maxwidth = HealthWidthShort[layoutSize][FOCUSTARGET_ID]
  2195.         SetFramePosition(UF[FOCUSTARGET_ID].health.bar, "MEDIUM", UF[FOCUSTARGET_ID].health.background:GetFrameLevel() + 1, 0, (layoutSize == "small") and 7 or 8, {"BOTTOMRIGHT", UF[FOCUSTARGET_ID].health.background, "BOTTOMRIGHT", -1, 1})
  2196.         UF[FOCUSTARGET_ID].health.bar.bg:SetTexture(Textures.plain)
  2197.        
  2198.         -- Bar End
  2199.         UF[FOCUSTARGET_ID].health.bar.ender = CreateArtFrame(UF[FOCUSTARGET_ID].health.background)
  2200.         SetFramePosition(UF[FOCUSTARGET_ID].health.bar.ender, "MEDIUM", UF[FOCUSTARGET_ID].health.bar:GetFrameLevel(), (layoutSize == "small") and 6 or 7, 16, {"BOTTOMRIGHT", UF[FOCUSTARGET_ID].health.bar, "BOTTOMLEFT", 0, -1})
  2201.         UF[FOCUSTARGET_ID].health.bar.ender.bg:SetTexture(Textures[layoutSize].f3.health.bar)
  2202.         UF[FOCUSTARGET_ID].health.bar.ender.bg:SetTexCoord(unpack(HealthEndBarCoords[layoutSize][FOCUSTARGET_ID]))
  2203.         UF[FOCUSTARGET_ID].health.bar.ender:Hide()
  2204.        
  2205.         -- HealthBar Text
  2206.         UF[FOCUSTARGET_ID].healthtext = CreateTextFrame(UF[FOCUSTARGET_ID].health, "BOTTOM", "RIGHT")
  2207.         SetFramePosition(UF[FOCUSTARGET_ID].healthtext, "MEDIUM", UF[FOCUSTARGET_ID].health:GetFrameLevel() + 2, 12, 12, {"BOTTOMRIGHT", UF[FOCUSTARGET_ID].health, "BOTTOMRIGHT", -4, 0})
  2208.        
  2209.         -- Health Text
  2210.         UF[FOCUSTARGET_ID].health.fullval = CreateTextFrame(UF[FOCUSTARGET_ID].health, "BOTTOM", "LEFT")
  2211.         SetFramePosition(UF[FOCUSTARGET_ID].health.fullval, "MEDIUM", UF[FOCUSTARGET_ID].health:GetFrameLevel() + 2, 12, 12, {"BOTTOMLEFT", UF[FOCUSTARGET_ID].health, "BOTTOMLEFT", 256 - HealthWidthShort[layoutSize][FOCUSTARGET_ID], 0})
  2212.        
  2213.     -- End Box
  2214.     UF[FOCUSTARGET_ID].endbox = CreateStatusBox(UF[FOCUSTARGET_ID])
  2215.     SetFramePosition(UF[FOCUSTARGET_ID].endbox, "MEDIUM", UF[FOCUSTARGET_ID]:GetFrameLevel(), 16, 16, {"LEFT", UF[FOCUSTARGET_ID], "RIGHT", 1, 0})
  2216.     UF[FOCUSTARGET_ID].endbox.surround:SetTexture(Textures[layoutSize].f2.endbox.surround)
  2217.     UF[FOCUSTARGET_ID].endbox.background:SetTexture(Textures[layoutSize].f2.endbox.bar)
  2218.     UF[FOCUSTARGET_ID].endbox.bar:SetTexture(Textures[layoutSize].f2.endbox.bar)
  2219.     UF[FOCUSTARGET_ID].endbox.bar:SetVertexColor(0, 0, 0, 0)
  2220.    
  2221.     -- End Box Text
  2222.     UF[FOCUSTARGET_ID].endboxtext = CreateTextFrame(UF[FOCUSTARGET_ID].endbox, "CENTER", "CENTER")
  2223.     SetFramePosition(UF[FOCUSTARGET_ID].endboxtext, "MEDIUM", UF[FOCUSTARGET_ID].endbox:GetFrameLevel() + 1, 12, 12, {"CENTER", UF[FOCUSTARGET_ID].endbox, "CENTER", -2, -4})
  2224.    
  2225.     -- Range Display
  2226.     UF[FOCUSTARGET_ID].rangedisplay = CreateTextFrame(UF[FOCUSTARGET_ID].endbox, "BOTTOM", "LEFT")
  2227.     SetFramePosition(UF[FOCUSTARGET_ID].rangedisplay, "MEDIUM", UF[FOCUSTARGET_ID]:GetFrameLevel(), 12, 12, {"BOTTOMLEFT", UF[FOCUSTARGET_ID].endbox, "BOTTOMRIGHT", -2, 0})
  2228.     UF[FOCUSTARGET_ID].rangedisplay.elapsed = 0
  2229.     UF[FOCUSTARGET_ID].rangedisplay.interval = 0.2
  2230.     UF[FOCUSTARGET_ID].rangedisplay.lastmin = -1
  2231.     UF[FOCUSTARGET_ID].rangedisplay.lastmax = -1
  2232.     UF[FOCUSTARGET_ID].rangedisplay:SetScript("OnUpdate", function(self, elapsed)
  2233.         Overlay:RangeDisplay_OnUpdate(self, elapsed, FOCUSTARGET_ID)
  2234.     end)
  2235.    
  2236.     -- Status Boxes
  2237.     UF[FOCUSTARGET_ID].statusbox = {}
  2238.     for i = 1, 2 do
  2239.         UF[FOCUSTARGET_ID].statusbox[i] = CreateStatusBox(UF[FOCUSTARGET_ID].health)
  2240.         SetFramePosition(UF[FOCUSTARGET_ID].statusbox[i], "MEDIUM", UF[FOCUSTARGET_ID].health:GetFrameLevel(), 16, 16, {"BOTTOMRIGHT", UF[FOCUSTARGET_ID].health, "BOTTOMLEFT", -((i-1)*5+(i)) + (256 - HealthWidthShort[layoutSize][FOCUSTARGET_ID] - 1), (layoutSize == "small") and -7 or -6})
  2241.         UF[FOCUSTARGET_ID].statusbox[i].surround:SetTexture(Textures[layoutSize].f1.statusbox.surround)
  2242.         UF[FOCUSTARGET_ID].statusbox[i].background:SetTexture(Textures[layoutSize].f1.statusbox.bar)
  2243.         UF[FOCUSTARGET_ID].statusbox[i].bar:SetTexture(Textures[layoutSize].f1.statusbox.bar)
  2244.         UF[FOCUSTARGET_ID].statusbox[i].bar:SetVertexColor(0, 0, 0, 0)
  2245.     end
  2246.    
  2247.     -- End Icon
  2248.     UF[FOCUSTARGET_ID].endicon = CreateArtFrame(UF[FOCUSTARGET_ID])
  2249.     UF[FOCUSTARGET_ID].endicon:Hide()
  2250.     SetFramePosition(UF[FOCUSTARGET_ID].endicon, "MEDIUM", UF[FOCUSTARGET_ID]:GetFrameLevel(), 12, 12, {"TOPLEFT", UF[FOCUSTARGET_ID], "BOTTOMLEFT", (256 - HealthWidthShort[layoutSize][FOCUSTARGET_ID]) - 1, -3})
  2251.     UF[FOCUSTARGET_ID].endicon.bg:SetTexture([[Interface\TargetingFrame\UI-RaidTargetingIcons]])
  2252.    
  2253.    
  2254.     ----------------------
  2255.     ---- TargetTarget ----
  2256.     ----------------------
  2257.     local Parent = _G[ParentFrames[TARGETTARGET_ID]] or UIParent
  2258.     UF[TARGETTARGET_ID] = CreateFrame("Frame", ParentFrames[TARGETTARGET_ID].."_Overlay", Parent)
  2259.     UF[TARGETTARGET_ID]:Hide()
  2260.     SetFramePosition(UF[TARGETTARGET_ID], "MEDIUM", 0, 256, 16, {"BOTTOMLEFT", Parent, "BOTTOMLEFT", 0, 0})
  2261.     UF[TARGETTARGET_ID].backgroundColorID = ""
  2262.    
  2263.     -- Health
  2264.     UF[TARGETTARGET_ID].health = CreateFrame("Frame", nil, UF[TARGETTARGET_ID])
  2265.     UF[TARGETTARGET_ID].health:SetParent(UF[TARGETTARGET_ID])
  2266.     SetFramePosition(UF[TARGETTARGET_ID].health, "MEDIUM", UF[TARGETTARGET_ID]:GetFrameLevel(), 256, 16, {"BOTTOMLEFT", UF[TARGETTARGET_ID], "BOTTOMLEFT", 0, 0})
  2267.     UF[TARGETTARGET_ID].health.colorID = ""
  2268.     UF[TARGETTARGET_ID].health.alpha = 1
  2269.     UF[TARGETTARGET_ID].health.position = -1
  2270.     UF[TARGETTARGET_ID].health.elapsed = 0
  2271.     UF[TARGETTARGET_ID].health.interval = 0.2
  2272.     UF[TARGETTARGET_ID].health:SetScript("OnUpdate", function(self, elapsed)
  2273.         Overlay:Health_OnUpdate(self, elapsed, TARGETTARGET_ID)
  2274.     end)
  2275.    
  2276.         -- Surround
  2277.         UF[TARGETTARGET_ID].health.surround = CreateArtFrame(UF[TARGETTARGET_ID].health)
  2278.         SetFramePosition(UF[TARGETTARGET_ID].health.surround, "MEDIUM", UF[TARGETTARGET_ID].health:GetFrameLevel(), 256, 16, {"BOTTOMLEFT", UF[TARGETTARGET_ID].health, "BOTTOMLEFT", 0, 0})
  2279.         UF[TARGETTARGET_ID].health.surround.bg:SetTexture(Textures[layoutSize].f2.health.surround)
  2280.         UF[TARGETTARGET_ID].health.surround.bg:SetTexCoord(1, 0, 0, 1)
  2281.        
  2282.         -- Background
  2283.         UF[TARGETTARGET_ID].health.background = CreateArtFrame(UF[TARGETTARGET_ID].health)
  2284.         SetFramePosition(UF[TARGETTARGET_ID].health.background, "MEDIUM", UF[TARGETTARGET_ID].health:GetFrameLevel(), 256, 16, {"BOTTOMLEFT", UF[TARGETTARGET_ID].health, "BOTTOMLEFT", 0, 0})
  2285.         UF[TARGETTARGET_ID].health.background.bg:SetTexture(Textures[layoutSize].f2.health.bar)
  2286.         UF[TARGETTARGET_ID].health.background.bg:SetTexCoord(1, 0, 0, 1)
  2287.        
  2288.         -- Bar
  2289.         UF[TARGETTARGET_ID].health.bar = CreateArtFrame(UF[TARGETTARGET_ID].health.background)
  2290.         UF[TARGETTARGET_ID].health.bar.pos = 0
  2291.         UF[TARGETTARGET_ID].health.bar.maxwidth = HealthWidthShort[layoutSize][TARGETTARGET_ID]
  2292.         SetFramePosition(UF[TARGETTARGET_ID].health.bar, "MEDIUM", UF[TARGETTARGET_ID].health.background:GetFrameLevel() + 1, 0, (layoutSize == "small") and 7 or 8, {"BOTTOMLEFT", UF[TARGETTARGET_ID].health.background, "BOTTOMLEFT", 1, 1})
  2293.         UF[TARGETTARGET_ID].health.bar.bg:SetTexture(Textures.plain)
  2294.        
  2295.         -- Bar End
  2296.         UF[TARGETTARGET_ID].health.bar.ender = CreateArtFrame(UF[TARGETTARGET_ID].health.background)
  2297.         SetFramePosition(UF[TARGETTARGET_ID].health.bar.ender, "MEDIUM", UF[TARGETTARGET_ID].health.bar:GetFrameLevel(), (layoutSize == "small") and 6 or 7, 16, {"BOTTOMLEFT", UF[TARGETTARGET_ID].health.bar, "BOTTOMRIGHT", 0, -1})
  2298.         UF[TARGETTARGET_ID].health.bar.ender.bg:SetTexture(Textures[layoutSize].f2.health.bar)
  2299.         UF[TARGETTARGET_ID].health.bar.ender.bg:SetTexCoord(unpack(HealthEndBarCoords[layoutSize][TARGETTARGET_ID]))
  2300.         UF[TARGETTARGET_ID].health.bar.ender:Hide()
  2301.        
  2302.         -- HealthBar Text
  2303.         UF[TARGETTARGET_ID].healthtext = CreateTextFrame(UF[TARGETTARGET_ID].health, "BOTTOM", "LEFT")
  2304.         SetFramePosition(UF[TARGETTARGET_ID].healthtext, "MEDIUM", UF[TARGETTARGET_ID].health:GetFrameLevel() + 2, 12, 12, {"BOTTOMLEFT", UF[TARGETTARGET_ID].health, "BOTTOMLEFT", 6, 0})
  2305.        
  2306.         -- Health Text
  2307.         UF[TARGETTARGET_ID].health.fullval = CreateTextFrame(UF[TARGETTARGET_ID].health, "BOTTOM", "RIGHT")
  2308.         SetFramePosition(UF[TARGETTARGET_ID].health.fullval, "MEDIUM", UF[TARGETTARGET_ID].health:GetFrameLevel() + 2, 12, 12, {"BOTTOMRIGHT", UF[TARGETTARGET_ID].health, "BOTTOMRIGHT", -(256 - HealthWidthShort[layoutSize][TARGETTARGET_ID]) + 2, 0})
  2309.        
  2310.     -- End Box
  2311.     UF[TARGETTARGET_ID].endbox = CreateStatusBox(UF[TARGETTARGET_ID])
  2312.     SetFramePosition(UF[TARGETTARGET_ID].endbox, "MEDIUM", UF[TARGETTARGET_ID]:GetFrameLevel(), 16, 16, {"RIGHT", UF[TARGETTARGET_ID], "LEFT", -1, 0})
  2313.     UF[TARGETTARGET_ID].endbox.surround:SetTexture(Textures[layoutSize].f2.endbox.surround)
  2314.     UF[TARGETTARGET_ID].endbox.surround:SetTexCoord(1, 0, 0, 1)
  2315.     UF[TARGETTARGET_ID].endbox.background:SetTexture(Textures[layoutSize].f2.endbox.bar)
  2316.     UF[TARGETTARGET_ID].endbox.background:SetTexCoord(1, 0, 0, 1)
  2317.     UF[TARGETTARGET_ID].endbox.bar:SetTexture(Textures[layoutSize].f2.endbox.bar)
  2318.     UF[TARGETTARGET_ID].endbox.bar:SetTexCoord(1, 0, 0, 1)
  2319.     UF[TARGETTARGET_ID].endbox.bar:SetVertexColor(0, 0, 0, 0)
  2320.    
  2321.     -- End Box Text
  2322.     UF[TARGETTARGET_ID].endboxtext = CreateTextFrame(UF[TARGETTARGET_ID].endbox, "CENTER", "CENTER")
  2323.     SetFramePosition(UF[TARGETTARGET_ID].endboxtext, "MEDIUM", UF[TARGETTARGET_ID].endbox:GetFrameLevel() + 1, 12, 12, {"CENTER", UF[TARGETTARGET_ID].endbox, "CENTER", 4, -4})
  2324.    
  2325.     -- Range Display
  2326.     UF[TARGETTARGET_ID].rangedisplay = CreateTextFrame(UF[TARGETTARGET_ID].endbox, "BOTTOM", "RIGHT")
  2327.     SetFramePosition(UF[TARGETTARGET_ID].rangedisplay, "MEDIUM", UF[TARGETTARGET_ID]:GetFrameLevel(), 12, 12, {"BOTTOMRIGHT", UF[TARGETTARGET_ID].endbox, "BOTTOMLEFT", 4, 0})
  2328.     UF[TARGETTARGET_ID].rangedisplay.elapsed = 0
  2329.     UF[TARGETTARGET_ID].rangedisplay.interval = 0.2
  2330.     UF[TARGETTARGET_ID].rangedisplay.lastmin = -1
  2331.     UF[TARGETTARGET_ID].rangedisplay.lastmax = -1
  2332.     UF[TARGETTARGET_ID].rangedisplay:SetScript("OnUpdate", function(self, elapsed)
  2333.         Overlay:RangeDisplay_OnUpdate(self, elapsed, TARGETTARGET_ID)
  2334.     end)
  2335.    
  2336.     -- Status Boxes
  2337.     UF[TARGETTARGET_ID].statusbox = {}
  2338.     for i = 1, 2 do
  2339.         UF[TARGETTARGET_ID].statusbox[i] = CreateStatusBox(UF[TARGETTARGET_ID].health)
  2340.         SetFramePosition(UF[TARGETTARGET_ID].statusbox[i], "MEDIUM", UF[TARGETTARGET_ID].health:GetFrameLevel(), 16, 16, {"BOTTOMLEFT", UF[TARGETTARGET_ID].health, "BOTTOMRIGHT", ((i-1)*5+(i)) - (256 - HealthWidthShort[layoutSize][TARGETTARGET_ID] - 1), (layoutSize == "small") and -7 or -6})
  2341.         UF[TARGETTARGET_ID].statusbox[i].surround:SetTexture(Textures[layoutSize].f1.statusbox.surround)
  2342.         UF[TARGETTARGET_ID].statusbox[i].surround:SetTexCoord(1, 0, 0, 1)
  2343.         UF[TARGETTARGET_ID].statusbox[i].background:SetTexture(Textures[layoutSize].f1.statusbox.bar)
  2344.         UF[TARGETTARGET_ID].statusbox[i].background:SetTexCoord(1, 0, 0, 1)
  2345.         UF[TARGETTARGET_ID].statusbox[i].bar:SetTexture(Textures[layoutSize].f1.statusbox.bar)
  2346.         UF[TARGETTARGET_ID].statusbox[i].bar:SetTexCoord(1, 0, 0, 1)
  2347.         UF[TARGETTARGET_ID].statusbox[i].bar:SetVertexColor(0, 0, 0, 0)
  2348.     end
  2349.    
  2350.     -- End Icon
  2351.     UF[TARGETTARGET_ID].endicon = CreateArtFrame(UF[TARGETTARGET_ID])
  2352.     UF[TARGETTARGET_ID].endicon:Hide()
  2353.     SetFramePosition(UF[TARGETTARGET_ID].endicon, "MEDIUM", UF[TARGETTARGET_ID]:GetFrameLevel(), 12, 12, {"BOTTOMRIGHT", UF[TARGETTARGET_ID], "TOPRIGHT", -(256 - HealthWidthShort[layoutSize][TARGETTARGET_ID]) + 9, -4})
  2354.     UF[TARGETTARGET_ID].endicon.bg:SetTexture([[Interface\TargetingFrame\UI-RaidTargetingIcons]])
  2355. end
  2356. --------------------------------------------------------
  2357. --------------------------------------------------------
  2358.  
  2359.  
  2360. ---- EVENTS ----
  2361. -- End Icon
  2362. function Overlay:EndIconEvent()
  2363.     self:UpdateEndIcons()
  2364. end
  2365.  
  2366. -- Death Event
  2367. function Overlay:PlayerDeathEvent()
  2368.     self:UpdateUnitHealthBarInfo(PLAYER_ID)
  2369.     self:UpdateUnitPowerBarInfo(PLAYER_ID)
  2370. end
  2371.  
  2372. -- Classification Event
  2373. function Overlay:ClassificationEvent(event, UnitID)
  2374.     if not UF[UnitID] then return end
  2375.     self:UpdateUnitInfo(UnitID)
  2376. end
  2377.  
  2378. -- Status Event
  2379. local SEOtherUnitsTimer = CreateFrame("Frame")
  2380. SEOtherUnitsTimer:Hide()
  2381. SEOtherUnitsTimer.e = 0
  2382. SEOtherUnitsTimer.i = 0.25
  2383. SEOtherUnitsTimer.updateHealthInfo = false
  2384. SEOtherUnitsTimer:SetScript("OnUpdate", function(s, e)
  2385.     s.e = s.e + e
  2386.     if s.e >= s.i then
  2387.         Overlay:UpdateStatus(TARGETTARGET_ID)
  2388.         Overlay:UpdateUnitBackgroundColor(TARGETTARGET_ID)
  2389.         Overlay:UpdateStatus(FOCUSTARGET_ID)
  2390.         Overlay:UpdateUnitBackgroundColor(FOCUSTARGET_ID)
  2391.         if s.updateHealthInfo then
  2392.             Overlay:UpdateUnitHealthBarInfo(TARGETTARGET_ID, true)
  2393.             Overlay:UpdateUnitHealthBarInfo(FOCUSTARGET_ID, true)
  2394.         end
  2395.         s.e = 0
  2396.         s:Hide()
  2397.     end
  2398. end)
  2399. function Overlay:StatusEvent(event, ...)
  2400.     local UnitID = ... or PLAYER_ID
  2401.     if UF[UnitID] then
  2402.         -- Update Status of unit
  2403.         self:UpdateStatus(UnitID)
  2404.         self:UpdateUnitBackgroundColor(UnitID)
  2405.         -- Target/Focus hostility change
  2406.         if (event == "UNIT_FACTION") then
  2407.             self:UpdateUnitHealthBarInfo(UnitID, true)
  2408.             SEOtherUnitsTimer.updateHealthInfo = true
  2409.         end
  2410.         -- Update Other units
  2411.         SEOtherUnitsTimer:Show()
  2412.     end
  2413. end
  2414.  
  2415. -- Combat Event
  2416. local ceEvent, ceAIH, ceMIH
  2417. function Overlay:CombatEvent(event, ...)
  2418.     local UnitID = ...
  2419.     if not((UnitID == PLAYER_ID) or (UnitID == TARGET_ID) or (UnitID == VEHICLE_ID)) then return end
  2420.    
  2421.     local Unit, UFUnit = PlayerOrVehicleIDs(UnitID)
  2422.     if not(UnitExists(Unit)) then return end
  2423.    
  2424.     if (event == "UNIT_COMBAT") then
  2425.         local _, ceEvent = ...
  2426.         if ((ceEvent == "WOUND") or (ceEvent == "HEAL")) then
  2427.             self:SetInBetween(UFUnit, ceEvent)
  2428.         end
  2429.     elseif (event == "UNIT_HEAL_PREDICTION") then
  2430.         local ceMIH = UnitGetIncomingHeals(Unit, PLAYER_ID) or 0
  2431.         local ceAIH = UnitGetIncomingHeals(Unit) or 0
  2432.        
  2433.         if (ceAIH < ceMIH) then
  2434.             ceAIH = 0
  2435.         else
  2436.             ceAIH = ceAIH - ceMIH
  2437.         end
  2438.        
  2439.         if (ceAIH >= (UnitHealthVal[Unit] * 0.05)) then
  2440.             self:SetInBetween(UFUnit, "INCHEAL")
  2441.         else
  2442.             self:SetInBetween(UFUnit, "NOINCHEAL")
  2443.         end
  2444.     end
  2445. end
  2446.  
  2447. -- Power
  2448. function Overlay:PowerUpdateMajor(event, UnitID)
  2449.     if not((UnitID == PLAYER_ID) or (UnitID == TARGET_ID) or (UnitID == VEHICLE_ID)) then return end
  2450.    
  2451.     self:ToggleUnitPower(UnitID)
  2452.     self:UpdateUnitPowerBarInfo(UnitID)
  2453. end
  2454.  
  2455. -- Health
  2456. function Overlay:HealthUpdate(event, UnitID)
  2457.     self:UpdateUnitHealth(UnitID, true)
  2458. end
  2459.  
  2460. -- Unit Target
  2461. function Overlay:UnitTargetUpdate(event, UnitID)
  2462.     if (UnitID == PLAYER_ID) then return end
  2463.    
  2464.     local UnitTargetID = UnitID.."target"
  2465.     if not UF[UnitTargetID] then return end
  2466.    
  2467.     if UnitExists(UnitTargetID) then
  2468.         if not UF[UnitTargetID]:IsVisible() then UF[UnitTargetID]:Show() end
  2469.         self:UpdateUnitHealthBarInfo(UnitTargetID)
  2470.         self:UpdateUnitHealth(UnitTargetID, true)
  2471.         self:UpdateEndBox(UnitTargetID)
  2472.         self:UpdateStatus(UnitTargetID)
  2473.         self:UpdateUnitBackgroundColor(UnitTargetID)
  2474.         self:UpdateUnitInfo(UnitTargetID)
  2475.         self:UpdateUnitRange(UnitTargetID)
  2476.         self:UpdateEndIcons()
  2477.     else
  2478.         if UF[UnitTargetID]:IsVisible() then UF[UnitTargetID]:Hide() end
  2479.     end
  2480. end
  2481.  
  2482. -- Focus
  2483. function Overlay:FocusUpdate()
  2484.     if UnitExists(FOCUS_ID) then
  2485.         if not UF[FOCUS_ID]:IsVisible() then UF[FOCUS_ID]:Show() end
  2486.         self:UpdateUnitHealthBarInfo(FOCUS_ID)
  2487.         self:UpdateUnitHealth(FOCUS_ID, true)
  2488.         self:UpdateEndBox(FOCUS_ID)
  2489.         self:UpdateStatus(FOCUS_ID)
  2490.         self:UpdateUnitBackgroundColor(FOCUS_ID)
  2491.         self:UpdateUnitInfo(FOCUS_ID)
  2492.         self:UpdateUnitRange(FOCUS_ID)
  2493.         self:UpdateEndIcons()
  2494.         self:UnitTargetUpdate("fu", FOCUS_ID)
  2495.     else
  2496.         if UF[FOCUS_ID]:IsVisible() then UF[FOCUS_ID]:Hide() end
  2497.     end
  2498. end
  2499.  
  2500. -- Vehicle
  2501. function Overlay:VehicleEvent()
  2502.     -- Vehicle flag
  2503.     SetPlayerVehicleFlag()
  2504.    
  2505.     -- Update
  2506.     self:UpdatePetStatus()
  2507.     self:UpdateEndBox(PLAYER_ID)
  2508.     self:SetInBetween(PLAYER_ID, "NONE")
  2509.     self:ToggleUnitPower(VEHICLE_ID)
  2510.     self:UpdateUnitPowerBarInfo(VEHICLE_ID)
  2511.     self:UpdateUnitPower(VEHICLE_ID, true)
  2512.     self:UpdateUnitHealthBarInfo(VEHICLE_ID)
  2513.     self:UpdateUnitHealth(VEHICLE_ID, true)
  2514.     self:UpdateUnitBackgroundColor(VEHICLE_ID)
  2515.     self:UpdateEndIcons()
  2516. end
  2517.  
  2518. -- Pet
  2519. function Overlay:PetEvent()
  2520.     self:UpdatePetStatus()
  2521.     self:UpdateEndBox(PLAYER_ID)
  2522.     self:UpdateUnitHealth(PET_ID, true)
  2523.     self:UpdateUnitPower(PET_ID, true)
  2524.     self:UpdateUnitRange(PET_ID)
  2525. end
  2526.  
  2527. -- Player Target
  2528. function Overlay:PlayerTargetUpdate()
  2529.     if UnitExists(TARGET_ID) then
  2530.         if not UF[TARGET_ID]:IsVisible() then UF[TARGET_ID]:Show() end
  2531.         self:ToggleUnitPower(TARGET_ID)
  2532.         self:UpdateUnitPowerBarInfo(TARGET_ID)
  2533.         self:UpdateUnitPower(TARGET_ID, true)
  2534.         self:UpdateUnitHealthBarInfo(TARGET_ID)
  2535.         self:UpdateUnitHealth(TARGET_ID, true)
  2536.         self:UpdateEndBox(TARGET_ID)
  2537.         self:UpdateStatus(TARGET_ID)
  2538.         self:UpdateUnitBackgroundColor(TARGET_ID)
  2539.         self:UpdateUnitInfo(TARGET_ID)
  2540.         self:UpdateUnitRange(TARGET_ID)
  2541.         self:SetInBetween(TARGET_ID, "NONE")
  2542.         self:UpdateEndIcons()
  2543.     else
  2544.         if UF[TARGET_ID]:IsVisible() then UF[TARGET_ID]:Hide() end
  2545.         SetBarValue(UF[TARGET_ID].health.bar, 1)
  2546.         SetBarValue(UF[TARGET_ID].power.bar, 1)
  2547.     end
  2548.     self:UnitTargetUpdate("ptu", FOCUS_ID)  -- Update FocusTarget
  2549.     self:UnitTargetUpdate("ptu", TARGET_ID) -- Update TargetTarget
  2550. end
  2551.  
  2552. -- Entering World
  2553. function Overlay:PLAYER_ENTERING_WORLD()
  2554.     self:RefreshUnits()
  2555. end
  2556.  
  2557. ---- EVENTS
  2558. local function OverlayEvent(self, event, ...)
  2559.     if event == "PLAYER_ENTERING_WORLD" then
  2560.         Overlay:PLAYER_ENTERING_WORLD()
  2561.        
  2562.     elseif event == "PLAYER_TARGET_CHANGED" then
  2563.         Overlay:PlayerTargetUpdate()
  2564.        
  2565.     elseif event == "UNIT_TARGET" then
  2566.         Overlay:UnitTargetUpdate(event, ...)
  2567.        
  2568.     elseif event == "PLAYER_FOCUS_CHANGED" then
  2569.         Overlay:FocusUpdate()
  2570.        
  2571.     elseif event == "UNIT_MAXHEALTH" then
  2572.         Overlay:HealthUpdate(event, ...)
  2573.  
  2574.     elseif event == "UNIT_MAXPOWER" or event == "UNIT_DISPLAYPOWER" then
  2575.         Overlay:PowerUpdateMajor(event, ...)
  2576.        
  2577.     elseif event == "UNIT_PET" then
  2578.         Overlay:PetEvent()
  2579.        
  2580.     elseif event == "UNIT_ENTERED_VEHICLE" or event == "UNIT_EXITED_VEHICLE" then
  2581.         Overlay:VehicleEvent()
  2582.        
  2583.     elseif event == "UNIT_COMBAT" or event == "UNIT_HEAL_PREDICTION" then
  2584.         Overlay:CombatEvent(event, ...)
  2585.        
  2586.     elseif event == "PLAYER_FLAGS_CHANGED" or event == "UNIT_FLAGS" or event == "UPDATE_FACTION" or event == "UNIT_FACTION" then
  2587.         Overlay:StatusEvent(event, ...)
  2588.        
  2589.     elseif event == "UNIT_CLASSIFICATION_CHANGED" then
  2590.         Overlay:ClassificationEvent(event, ...)
  2591.        
  2592.     elseif event == "PLAYER_DEAD" or event == "PLAYER_UNGHOST" or event == "PLAYER_ALIVE" then
  2593.         Overlay:PlayerDeathEvent()
  2594.         Overlay:EndIconEvent()
  2595.        
  2596.     elseif event == "RAID_TARGET_UPDATE" or event == "INCOMING_RESURRECT_CHANGED" then
  2597.         Overlay:EndIconEvent()
  2598.        
  2599.     end
  2600. end
  2601.  
  2602. ---- INITIALIZATION ----
  2603. function Overlay:Refresh()
  2604.     -- Update Unit Frames
  2605.     self:UpdateTextures()
  2606.     self:UpdateFonts()
  2607.     self:RefreshUnits()
  2608. end
  2609.  
  2610. local function ClassColorsUpdate()
  2611.     for k,v in pairs(UF) do
  2612.         Overlay:UpdateUnitHealthBarInfo(k)
  2613.         Overlay:UpdateEndBox(k)
  2614.     end
  2615. end
  2616.  
  2617. ns.overlayinit = function()
  2618.     if nibRealUICharacter then
  2619.         if nibRealUICharacter.resolution then
  2620.             layoutSize = (nibRealUICharacter.resolution == 2) and "large" or "small"
  2621.         end
  2622.     end
  2623.    
  2624.     fontPixel1 = cfg.font[layoutSize]
  2625.    
  2626.     ---- Player info
  2627.     PlayerStepPoints = StepPoints[class] or StepPoints["default"]
  2628.     GetPowerColors()
  2629.    
  2630.     Overlay:CreateFrames()
  2631.     Overlay:Refresh()
  2632.    
  2633.     ---- Events
  2634.     Overlay:RegisterEvent("PLAYER_ENTERING_WORLD")
  2635.    
  2636.     -- Target update
  2637.     Overlay:RegisterEvent("PLAYER_TARGET_CHANGED")
  2638.     Overlay:RegisterEvent("UNIT_TARGET")
  2639.    
  2640.     -- Focus update
  2641.     Overlay:RegisterEvent("PLAYER_FOCUS_CHANGED")
  2642.    
  2643.     -- Health update
  2644.     Overlay:RegisterEvent("UNIT_MAXHEALTH")
  2645.    
  2646.     -- Power update
  2647.     Overlay:RegisterEvent("UNIT_MAXPOWER")
  2648.     Overlay:RegisterEvent("UNIT_DISPLAYPOWER")
  2649.    
  2650.     -- Pet update
  2651.     Overlay:RegisterEvent("UNIT_PET")
  2652.    
  2653.     -- Vehicle update
  2654.     Overlay:RegisterEvent("UNIT_ENTERED_VEHICLE")
  2655.     Overlay:RegisterEvent("UNIT_EXITED_VEHICLE")
  2656.    
  2657.     -- Combat Event
  2658.     Overlay:RegisterEvent("UNIT_COMBAT")
  2659.     Overlay:RegisterEvent("UNIT_HEAL_PREDICTION")
  2660.    
  2661.     -- Status
  2662.     Overlay:RegisterEvent("PLAYER_FLAGS_CHANGED")
  2663.     Overlay:RegisterEvent("UNIT_FLAGS")
  2664.     Overlay:RegisterEvent("UPDATE_FACTION")
  2665.     Overlay:RegisterEvent("UNIT_FACTION")
  2666.    
  2667.     -- Classification
  2668.     Overlay:RegisterEvent("UNIT_CLASSIFICATION_CHANGED")
  2669.    
  2670.     -- Death
  2671.     Overlay:RegisterEvent("PLAYER_DEAD")
  2672.     Overlay:RegisterEvent("PLAYER_UNGHOST")
  2673.    
  2674.     -- End Icon
  2675.     Overlay:RegisterEvent("RAID_TARGET_UPDATE")
  2676.     Overlay:RegisterEvent("PLAYER_ALIVE")
  2677.     Overlay:RegisterEvent("INCOMING_RESURRECT_CHANGED")
  2678.    
  2679.     Overlay:SetScript("OnEvent", OverlayEvent)
  2680.    
  2681.     ---- ClassColors support
  2682.     if CUSTOM_CLASS_COLORS then
  2683.         CUSTOM_CLASS_COLORS:RegisterCallback(ClassColorsUpdate)
  2684.     end
  2685.    
  2686.     ---- Combat Fader
  2687.     local nibRUI = LibStub("AceAddon-3.0"):GetAddon("nibRealUI", true)
  2688.     if nibRUI then
  2689.         local CF = nibRUI:GetModule("CombatFader", true)
  2690.         if CF then CF:FadeFrames() end
  2691.     end
  2692. end

I think the mistake is in overlay.lua anywhere around
Code:
function Overlay:CreateFrames()
	--------------
	---- RAID ----
	--------------
Also new textures arent created if there are more than one group members.
  Reply With Quote
10-23-12, 11:18 AM   #2
haste
Featured Artist
 
haste's Avatar
Premium Member
Featured
Join Date: Dec 2005
Posts: 1,027
Your code is using oUF in a very different way than anyone else is by the looks of it. The issue is most likely that you assume header frames (read raid frames) act like any other single unit frame.

Raid frames in oUF aren't really created by oUF. They're spawned dynamically by the secure frame system and through some trickery oUF lets you style them. This is where your code falls short. It expects the raid frames to be available and apparently a single frame (not multiple like they are).

I haven't really spent much time digging into your code, but it looks like you do the following:
- Spawn frames with oUF
- Style the frame externally by iterating over a fixed set of globals.

oUF is used more like a unit management system than anything else here.

A better solution (if you plan on continuing to use oUF) is to make use of the fact that oUF calls the layouts style function with the frame and make your overlay/style/updater/unitframe thingy work based on that.
__________________
「貴方は1人じゃないよ」
  Reply With Quote
10-23-12, 12:26 PM   #3
Julchen
A Deviate Faerie Dragon
Join Date: Dec 2009
Posts: 17
Thanks, thought the same the code is really different from other layouts. Dont know if I am able to rewrite it.
  Reply With Quote
10-23-12, 05:31 PM   #4
Julchen
A Deviate Faerie Dragon
Join Date: Dec 2009
Posts: 17
How can I change a Healthbar to be filled and not moved from the right to the left. eg. if I have a parallelogram as bar texture. I searched a bit but i was not able to make something of it

edit: solved but hanging on math problem
Code:
self.Healthdef:SetWidth((max / min) * Health:GetWidth())
self.Healthdef:SetTexCoord(0/128,66/128,0,40/128)
from the left site.
if i have 0% hp then the texcoords have to be max, 66/128.
Code:
self.Healthdef:SetTexCoord(0/128,66/128,0,40/128)
if i have 100% hp then the texcoords have to be min, 0.
Code:
self.Healthdef:SetTexCoord(66/128,66/128,0,40/128)
I am searching the right formula that the tex is eg not streched or sth like this and to calculate the texcoords right :/

edit2 got it
Code:
 
local d = (min / (max/100) / 100) * Health:GetWidth()
			self.Healthdef:SetWidth(Health:GetWidth() - d)
			self.Healthdef:SetHeight(40)
			self.Healthdef:SetTexCoord((min / max) * (66/128),66/128,0,40/128)

Last edited by Julchen : 10-24-12 at 06:30 AM.
  Reply With Quote
10-24-12, 02:45 PM   #5
Julchen
A Deviate Faerie Dragon
Join Date: Dec 2009
Posts: 17
Does the texture way use more ressources, particularly in raids if every Healthbar is rendered this way?
  Reply With Quote
10-25-12, 12:00 AM   #6
Phanx
Cat.
 
Phanx's Avatar
AddOn Author - Click to view addons
Join Date: Mar 2006
Posts: 5,617
You should pre-calculate the fractions; otherwise Lua has to re-do it every time the code is executed.
texture:SetTexCoord(0.515625 * (cur / max), 0.515625, 0, 0.3125)
Calling :SetTexCoords on every health update will use more resources than not doing so, yes. The same holds true of anything -- calling any function uses more resources than not calling the function. However, the actual cost of calling :SetTexCoords is so small that there is not really any reason to worry about it, especially if it's the only way to achieve the look you want.
__________________
Retired author of too many addons.
Message me if you're interested in taking over one of my addons.
Don’t message me about addon bugs or programming questions.
  Reply With Quote
10-25-12, 03:43 AM   #7
Julchen
A Deviate Faerie Dragon
Join Date: Dec 2009
Posts: 17
Thanks for the Tip.

Last edited by Julchen : 10-25-12 at 07:17 AM. Reason: problem solved
  Reply With Quote

WoWInterface » Featured Projects » oUF (Otravi Unit Frames) » RealUI include Raid - Frame and Raid not linked


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off