Quantcast

Fix for #5 Nameplates aggro

Joe Vaughan [10-23-16 - 09:21]
Fix for #5 Nameplates aggro

Nameplates weren’t showing the aggro highlight.
Filename
SVUI_NamePlates/OLD_SVUI_NamePlates.lua
SVUI_NamePlates/SVUI_NamePlates.lua
SVUI_NamePlates/assets/UNIT-AGGRO.blp
diff --git a/SVUI_NamePlates/OLD_SVUI_NamePlates.lua b/SVUI_NamePlates/OLD_SVUI_NamePlates.lua
deleted file mode 100644
index f42b616..0000000
--- a/SVUI_NamePlates/OLD_SVUI_NamePlates.lua
+++ /dev/null
@@ -1,1555 +0,0 @@
---[[
-##############################################################################
-S V U I   By: Failcoder
-##############################################################################
-credit: Elv.       NamePlatess was parently nameplates.lua adapted from ElvUI #
-##############################################################################
-##########################################################
-LOCALIZED LUA FUNCTIONS
-##########################################################
-]]--
---[[ GLOBALS ]]--
-local _G = _G;
-local unpack    = _G.unpack;
-local select    = _G.select;
-local pairs     = _G.pairs;
-local ipairs    = _G.ipairs;
-local type      = _G.type;
-local error     = _G.error;
-local pcall     = _G.pcall;
-local tostring  = _G.tostring;
-local tonumber  = _G.tonumber;
-local tinsert   = _G.tinsert;
-local string    = _G.string;
-local math      = _G.math;
-local bit       = _G.bit;
-local table     = _G.table;
---[[ STRING METHODS ]]--
-local lower, upper = string.lower, string.upper;
-local find, format, split = string.find, string.format, string.split;
-local match, gmatch, gsub = string.match, string.gmatch, string.gsub;
---[[ MATH METHODS ]]--
-local floor, ceil = math.floor, math.ceil;  -- Basic
---[[ BINARY METHODS ]]--
-local band, bor = bit.band, bit.bor;
---[[ TABLE METHODS ]]--
-local tremove, tcopy, twipe, tsort, tconcat = table.remove, table.copy, table.wipe, table.sort, table.concat;
---[[
-##########################################################
-GET ADDON DATA
-##########################################################
-]]--
-local SV = _G['SVUI'];
-local L = SV.L;
-local MOD = SV.NamePlates;
-if(not MOD) then return end;
-
-local LSM = _G.LibStub("LibSharedMedia-3.0")
---[[
-##########################################################
-LOCALIZED GLOBALS
-##########################################################
-]]--
-local SetCVar           	= _G.SetCVar;
-local UIParent              = _G.UIParent;
-local WorldFrame           	= _G.WorldFrame;
-local GameTooltip           = _G.GameTooltip;
-
-local CreateFrame           = _G.CreateFrame;
-local InCombatLockdown      = _G.InCombatLockdown;
---[[
-##########################################################
-LOCAL VARS
-##########################################################
-]]--
-local numChildren = -1;
-local PlateRegistry, VisiblePlates = {}, {};
-local WorldFrameUpdateHook, UpdatePlateElements, PlateForge;
-local BLIZZ_PLATE, SVUI_PLATE, PLATE_REF, PLATE_ARGS, PLATE_AURAS, PLATE_AURAICONS, PLATE_REALNAME;
-local CURRENT_TARGET_NAME;
-local TARGET_CHECKS = 0;
-local PLATE_TOP = MOD.media.topArt;
-local PLATE_BOTTOM = MOD.media.bottomArt;
-local PLATE_RIGHT = MOD.media.rightArt;
-local PLATE_LEFT = MOD.media.leftArt;
---[[
-	Quick explaination of what Im doing with all of these locals...
-	Unlike many of the other modules, NamePlatess has to continuously
-	reference config settings which can start to get sluggish. What
-	I have done is set local variables for every database value
-	that the module can read efficiently. The function "UpdateLocals"
-	is used to refresh these any time a change is made to configs
-	and once when the mod is loaded.
-]]--
-local NPBaseAlpha = 0.6;
-local NPCombatHide = false;
-local NPNameMatch = false;
-local NPComboColor={
-	[1]={0.69,0.31,0.31},
-	[2]={0.69,0.31,0.31},
-	[3]={0.65,0.63,0.35},
-	[4]={0.65,0.63,0.35},
-	[5]={0.33,0.59,0.33}
-}
-
-local NPBarTex = [[Interface\BUTTONS\WHITE8X8]];
-
-local NPUsePointer = true;
-local NPPointerMatch = false;
-local NPUseModel = true;
-local NPPointerColor = {0.9, 1, 0.9, 0.5};
-
-local NPUseThreat = false;
-local NPThreatGS = 1;
-local NPThreatBS = 1;
-local NPReactTap = {0.3,0.3,0.3}
-local NPReactNPCGood = {0.31,0.45,0.63}
-local NPReactPlayerGood = {0.29,0.68,0.3}
-local NPReactNeutral = {0.85,0.77,0.36}
-local NPReactEnemy = {0.78,0.25,0.25}
-
-local RIconCoords = {[0]={[0]="STAR", [0.25]="MOON"}, [0.25]={[0]="CIRCLE", [0.25]="SQUARE"}, [0.5]={[0]="DIAMOND", [0.25]="CROSS"}, [0.75]={[0]="TRIANGLE", [0.25]="SKULL"}};
-local RIAnchor = "LEFT";
-local RIXoffset = -4;
-local RIYoffset = 6;
-local RISize = 36;
-
-local HBThresh = 0.4;
-local HBTextFormat = false;
-local HBTextAnchor = "CENTER";
-local HBXoffset = 0;
-local HBYoffset = 0;
-local HBWidth = 108;
-local HBHeight = 9;
-
-local NPIcons = 14;
-local ICON_SIZE = 20;
-
-local CBColor = {0.1,0.81,0}
-local CBNoInterrupt = {1,0.25,0.25}
-local CBHeight = 6;
-local CBText = true;
-local CBXoffset = 0;
-local CBYoffset = 0;
-
-local AuraFilterName, AuraFilter;
-local AuraMaxCount = 5;
-
-local NPFindHealers = false;
-
-local RestrictedPlates = {
-	["Army of the Dead Ghoul"] = true,
-	["Venomous Snake"] = true,
-	["Healing Tide Totem"] = true,
-	["Dragonmaw War Banner"] = true
-};
-local RIconData = {["STAR"] = 0x00000001, ["CIRCLE"] = 0x00000002, ["DIAMOND"] = 0x00000004, ["TRIANGLE"] = 0x00000008, ["MOON"] = 0x00000010, ["SQUARE"] = 0x00000020, ["CROSS"] = 0x00000040, ["SKULL"] = 0x00000080};
-local RIconNames = {"STAR", "CIRCLE", "DIAMOND", "TRIANGLE", "MOON", "SQUARE", "CROSS", "SKULL"}
-local UnitPlateAuras = {};
-local AuraByRaidIcon = {};
-local AuraByName = {};
-local CachedAuraDurations = {};
-local AurasCache = {};
-local AuraClocks = {};
-local ClockIsTicking = false;
-local TickTock = 0;
-local LastKnownTarget;
---[[
-##########################################################
-COLORING THREAT/REACTIONS
-##########################################################
-]]--
-local CONFIG_THREAT_HOSTILE = { {0.29,0.68,0.3}, {0.85,0.77,0.36}, {0.94,0.6,0.06}, {0.78,0.25,0.25} };
-local CONFIG_THREAT_SCALE = { 1,1,1,1 };
-local PLATE_CLASS_COLORS = {};
-
-do
-	for classToken, colorData in pairs(RAID_CLASS_COLORS) do
-			PLATE_CLASS_COLORS[classToken] = {colorData.r, colorData.g, colorData.b}
-	end
-end
-
-local REACTION_COLORING = {
-	-- (1) PLAYER
-	function(token)
-		if(not token) then
-			return NPReactPlayerGood,NPThreatGS
-		else
-			return PLATE_CLASS_COLORS[token],NPThreatGS
-		end
-	end,
-	-- (2) TAPPED
-	function() return NPReactTap,NPThreatGS end,
-	-- (3) FRIENDLY
-	function() return NPReactNPCGood,NPThreatGS end,
-	-- (4) NEUTRAL
-	function(threatLevel)
-		local color,scale;
-		if((not threatLevel) or (not NPUseThreat) or (not InCombatLockdown())) then
-			color = NPReactNeutral
-			scale = NPThreatGS
-		else
-			color = CONFIG_THREAT_HOSTILE[threatLevel]
-			scale = CONFIG_THREAT_SCALE[threatLevel]
-		end
-		return color,scale
-	end,
-	-- (5) HOSTILE
-	function(threatLevel)
-		local color,scale;
-		if((not threatLevel) or (not NPUseThreat) or (not InCombatLockdown())) then
-			color = NPReactEnemy
-			scale = NPThreatGS
-		else
-			color = CONFIG_THREAT_HOSTILE[threatLevel]
-			scale = CONFIG_THREAT_SCALE[threatLevel]
-		end
-		return color,scale
-	end,
-};
---[[
-##########################################################
-UTILITY FRAMES
-##########################################################
-]]--
-local NPGrip = _G.SVUI_PlateParentFrame
-local NPGlow = _G.SVUI_PlateGlowFrame
-local AuraClockManager = CreateFrame("Frame")
---[[
-##########################################################
-PRE VARS/FUNCTIONS
-##########################################################
-]]--
-local formatting = {
-	["CURRENT"] = "%s",
-	["CURRENT_MAX"] = "%s - %s",
-	["CURRENT_PERCENT"] = "%s - %s%%",
-	["CURRENT_MAX_PERCENT"] = "%s - %s | %s%%",
-	["PERCENT"] = "%s%%",
-	["DEFICIT"] = "-%s"
-};
-
-local function IsEnemyPlayer(flags)
-	if((band(flags, COMBATLOG_OBJECT_REACTION_FRIENDLY) == 0) and (band(flags, COMBATLOG_OBJECT_CONTROL_PLAYER) > 0)) then
-		return true
-	end
-end
-
-local function TruncateString(value)
-    if value  >= 1e9 then
-        return ("%.1fb"):format(value / 1e9):gsub("%.?0 + ([kmb])$", "%1")
-    elseif value  >= 1e6 then
-        return ("%.1fm"):format(value / 1e6):gsub("%.?0 + ([kmb])$", "%1")
-    elseif value  >= 1e3 or value  <= -1e3 then
-        return ("%.1fk"):format(value / 1e3):gsub("%.?0 + ([kmb])$", "%1")
-    else
-        return value
-    end
-end
-
-local function SetTextStyle(style, min, max)
-	if max == 0 then max = 1 end
-	local result;
-	local textFormat = formatting[style]
-	if style == "DEFICIT" then
-		local result = max - min;
-		if result  <= 0 then
-			return ""
-		else
-			return format(textFormat, TruncateString(result))
-		end
-	elseif style == "PERCENT" then
-		result = format(textFormat, format("%.1f", min  /  max  *  100))
-		result = result:gsub(".0%%", "%%")
-		return result
-	elseif style == "CURRENT" or (style == "CURRENT_MAX" or style == "CURRENT_MAX_PERCENT" or style == "CURRENT_PERCENT") and min == max then
-		return format(formatting["CURRENT"], TruncateString(min))
-	elseif style == "CURRENT_MAX" then
-		return format(textFormat, TruncateString(min), TruncateString(max))
-	elseif style == "CURRENT_PERCENT" then
-		result = format(textFormat, TruncateString(min), format("%.1f", min  /  max  *  100))
-		result = result:gsub(".0%%", "%%")
-		return result
-	elseif style == "CURRENT_MAX_PERCENT" then
-		result = format(textFormat, TruncateString(min), TruncateString(max), format("%.1f", min  /  max  *  100))
-		result = result:gsub(".0%%", "%%")
-		return result
-	end
-end
-
-local function CreatePlateBorder(plate)
-
-	if(not plate.backdrop) then
-		plate.backdrop = plate:CreateTexture(nil, "BORDER")
-		plate.backdrop:SetDrawLayer("BORDER", -4)
-		plate.backdrop:SetAllPoints(plate)
-		plate.backdrop:SetTexture(SV.media.statusbar.default)
-		plate.backdrop:SetVertexColor(0.1,0.1,0.1)
-
-		plate.bordertop = plate:CreateTexture(nil, "BORDER")
-		plate.bordertop:SetPoint("TOPLEFT", plate, "TOPLEFT", -2, 2)
-		plate.bordertop:SetPoint("TOPRIGHT", plate, "TOPRIGHT", 2, 2)
-		plate.bordertop:SetHeight(2)
-		plate.bordertop:SetColorTexture(0,0,0)
-		plate.bordertop:SetDrawLayer("BORDER", 1)
-
-		plate.borderbottom = plate:CreateTexture(nil, "BORDER")
-		plate.borderbottom:SetPoint("BOTTOMLEFT", plate, "BOTTOMLEFT", -2, -2)
-		plate.borderbottom:SetPoint("BOTTOMRIGHT", plate, "BOTTOMRIGHT", 2, -2)
-		plate.borderbottom:SetHeight(2)
-		plate.borderbottom:SetColorTexture(0,0,0)
-		plate.borderbottom:SetDrawLayer("BORDER", 1)
-
-		plate.borderleft = plate:CreateTexture(nil, "BORDER")
-		plate.borderleft:SetPoint("TOPLEFT", plate, "TOPLEFT", -2, 2)
-		plate.borderleft:SetPoint("BOTTOMLEFT", plate, "BOTTOMLEFT", 2, -2)
-		plate.borderleft:SetWidth(2)
-		plate.borderleft:SetColorTexture(0,0,0)
-		plate.borderleft:SetDrawLayer("BORDER", 1)
-
-		plate.borderright = plate:CreateTexture(nil, "BORDER")
-		plate.borderright:SetPoint("TOPRIGHT", plate, "TOPRIGHT", 2, 2)
-		plate.borderright:SetPoint("BOTTOMRIGHT", plate, "BOTTOMRIGHT", -2, -2)
-		plate.borderright:SetWidth(2)
-		plate.borderright:SetColorTexture(0,0,0)
-		plate.borderright:SetDrawLayer("BORDER", 1)
-	end
-
-	if(not plate.eliteborder) then
-		plate.eliteborder = CreateFrame("Frame", nil, plate)
-		plate.eliteborder:SetAllPoints(plate)
-		plate.eliteborder:SetFrameStrata("BACKGROUND")
-		plate.eliteborder:SetFrameLevel(0)
-
-		plate.eliteborder.top = plate.eliteborder:CreateTexture(nil, "BACKGROUND")
-		plate.eliteborder.top:SetPoint("BOTTOMLEFT", plate.eliteborder, "TOPLEFT", 0, 0)
-		plate.eliteborder.top:SetPoint("BOTTOMRIGHT", plate.eliteborder, "TOPRIGHT", 0, 0)
-		plate.eliteborder.top:SetHeight(22)
-		plate.eliteborder.top:SetTexture(PLATE_TOP)
-		plate.eliteborder.top:SetVertexColor(1, 1, 0)
-		plate.eliteborder.top:SetBlendMode("BLEND")
-
-		plate.eliteborder.bottom = plate.eliteborder:CreateTexture(nil, "BACKGROUND")
-		plate.eliteborder.bottom:SetPoint("TOPLEFT", plate.eliteborder, "BOTTOMLEFT", 0, 0)
-		plate.eliteborder.bottom:SetPoint("TOPRIGHT", plate.eliteborder, "BOTTOMRIGHT", 0, 0)
-		plate.eliteborder.bottom:SetHeight(32)
-		plate.eliteborder.bottom:SetTexture(PLATE_BOTTOM)
-		plate.eliteborder.bottom:SetVertexColor(1, 1, 0)
-		plate.eliteborder.bottom:SetBlendMode("BLEND")
-
-		-- plate.eliteborder.right = plate.eliteborder:CreateTexture(nil, "BACKGROUND")
-		-- plate.eliteborder.right:SetPoint("TOPLEFT", plate.eliteborder, "TOPRIGHT", 0, 0)
-		-- plate.eliteborder.right:SetPoint("BOTTOMLEFT", plate.eliteborder, "BOTTOMRIGHT", 0, 0)
-		-- plate.eliteborder.right:SetWidth(plate:GetHeight() * 4)
-		-- plate.eliteborder.right:SetTexture(PLATE_RIGHT)
-		-- plate.eliteborder.right:SetVertexColor(1, 1, 0)
-		-- plate.eliteborder.right:SetBlendMode("BLEND")
-
-		-- plate.eliteborder.left = plate.eliteborder:CreateTexture(nil, "BACKGROUND")
-		-- plate.eliteborder.left:SetPoint("TOPRIGHT", plate.eliteborder, "TOPLEFT", 0, 0)
-		-- plate.eliteborder.left:SetPoint("BOTTOMRIGHT", plate.eliteborder, "BOTTOMLEFT", 0, 0)
-		-- plate.eliteborder.left:SetWidth(plate:GetHeight() * 4)
-		-- plate.eliteborder.left:SetTexture(PLATE_LEFT)
-		-- plate.eliteborder.left:SetVertexColor(1, 1, 0)
-		-- plate.eliteborder.left:SetBlendMode("BLEND")
-
-		plate.eliteborder:SetAlpha(0.35)
-
-		plate.eliteborder:Hide()
-	end
-end
---[[
-##########################################################
-UPVALUE PROXYS
-##########################################################
-]]--
-local function ProxyThisPlate(plate, updateName)
-	if(not plate or not plate.frame) then return false; end
-	BLIZZ_PLATE = plate
-	SVUI_PLATE = plate.frame
-	PLATE_AURAS = plate.frame.auras
-	PLATE_AURAICONS = plate.frame.auraicons
-	PLATE_ARGS = plate.setting
-	if updateName then
-		plate.nametext = gsub(plate.name:GetText(), '%s%(%*%)','');
-	end
-	PLATE_REALNAME = plate.nametext
-	return true
-end
---[[
-##########################################################
-LOCAL HELPERS
-##########################################################
-]]--
-local function ParseByGUID(guid)
-	for plate, _ in pairs(VisiblePlates) do
-		if plate and plate:IsShown() and plate.guid == guid then
-			return plate
-		end
-	end
-end
-
-local function CheckRaidIcon(plate)
-	if(plate and plate.frame) then
-		SVUI_PLATE = plate.frame
-	end
-	if PLATE_REF.raidicon:IsShown() then
-		local ULx,ULy,LLx,LLy,URx,URy,LRx,LRy = PLATE_REF.raidicon:GetTexCoord()
-		PLATE_REF.raidicontype = RIconCoords[ULx][ULy]
-		SVUI_PLATE.raidicon:Show()
-		SVUI_PLATE.raidicon:SetTexCoord(ULx,ULy,LLx,LLy,URx,URy,LRx,LRy)
-	else
-		PLATE_REF.raidicontype = nil;
-		SVUI_PLATE.raidicon:Hide()
-	end
-end
-
-local function UpdateComboPoints()
-	local guid = UnitGUID("target")
-	if (not guid) then return end
-	local numPoints = GetComboPoints(UnitHasVehicleUI('player') and 'vehicle' or 'player', 'target')
-	numPoints = numPoints or 0
-	if(numPoints > 0) then
-		if(LastKnownTarget and LastKnownTarget.guid and LastKnownTarget.guid ~= guid) then
-			LastKnownTarget.frame.combo[1]:Hide()
-			LastKnownTarget.frame.combo[2]:Hide()
-			LastKnownTarget.frame.combo[3]:Hide()
-			LastKnownTarget.frame.combo[4]:Hide()
-			LastKnownTarget.frame.combo[5]:Hide()
-			LastKnownTarget = nil
-		end
-	end
-	local plate = ParseByGUID(guid)
-	if(plate) then
-		for i=1, MAX_COMBO_POINTS do
-			if(i <= numPoints) then
-				plate.frame.combo[i]:Show()
-			else
-				plate.frame.combo[i]:Hide()
-			end
-		end
-		LastKnownTarget = plate
-	end
-end
---[[
-##########################################################
-AURA HELPERS
-##########################################################
-]]--
-local ClockUpdateHandler = function(self, elapsed)
-	local curTime = GetTime()
-	if curTime < TickTock then return end
-	local deactivate = true;
-	TickTock = curTime + 0.1
-	for frame, expiration in pairs(AuraClocks) do
-		local calc = 0;
-		local expires = expiration - curTime;
-		if expiration < curTime then
-			frame:Hide();
-			AuraClocks[frame] = nil
-		else
-			if expires < 60 then
-				calc = floor(expires)
-				if expires >= 4 then
-					frame.TimeLeft:SetFormattedText("|cffffff00%d|r", calc)
-				elseif expires >= 1 then
-					frame.TimeLeft:SetFormattedText("|cffff0000%d|r", calc)
-				else
-					frame.TimeLeft:SetFormattedText("|cffff0000%.1f|r", expires)
-				end
-			elseif expires < 3600 then
-				calc = ceil(expires / 60);
-				frame.TimeLeft:SetFormattedText("|cffffffff%.1f|r", calc)
-			elseif expires < 86400 then
-				calc = ceil(expires / 3600);
-				frame.TimeLeft:SetFormattedText("|cff66ffff%.1f|r", calc)
-			else
-				calc = ceil(expires / 86400);
-				frame.TimeLeft:SetFormattedText("|cff6666ff%.1f|r", calc)
-			end
-			deactivate = false
-		end
-	end
-	if deactivate then
-		self:SetScript("OnUpdate", nil);
-		ClockIsTicking = false
-	end
-end
-
-local function RegisterAuraClock(frame, expiration)
-	if(not frame) then return end
-	if expiration == 0 then
-		frame:Hide()
-		AuraClocks[frame] = nil
-	else
-		AuraClocks[frame] = expiration
-		frame:Show()
-		if(not ClockIsTicking) then
-			AuraClockManager:SetScript("OnUpdate", ClockUpdateHandler)
-			ClockIsTicking = true
-		end
-	end
-end
-
-local function GetUnitPlateAuras(guid)
-	if guid and UnitPlateAuras[guid] then return UnitPlateAuras[guid] end
-end
-
-local function SetAuraInstance(guid, spellID, expiration, stacks, caster, duration, texture)
-	if(spellID == 65148) then return end
-	local filter = true;
-	if (caster == UnitGUID('player')) then
-		filter = nil;
-	end
-	if(AuraFilter and AuraFilterName) then
-		local name = GetSpellInfo(spellID)
-		if(AuraFilter[name] and AuraFilter[name].enable and ((AuraFilterName ~= 'BlackList') and (AuraFilterName ~= 'Allowed'))) then
-			filter = nil;
-		end
-	end
-	if(not filter and (guid and spellID and caster and texture)) then
-		local auraID = spellID..(tostring(caster or "UNKNOWN_CASTER"))
-		UnitPlateAuras[guid] = UnitPlateAuras[guid] or {}
-			UnitPlateAuras[guid][auraID] = {
-			spellID = spellID,
-			expiration = expiration or 0,
-			stacks = stacks,
-			duration = duration,
-			texture = texture
-		}
-	end
-end
-
-local function UpdateAuraIcon(aura, texture, expiration, stacks, test)
-	if aura and texture and expiration then
-		aura.Icon:SetTexture(texture)
-		if(stacks and stacks > 1) then
-			aura.Stacks:SetText(stacks)
-		else
-			aura.Stacks:SetText("")
-		end
-		aura:Show()
-		RegisterAuraClock(aura, expiration)
-	else
-		RegisterAuraClock(aura, 0)
-	end
-end
-
-local function SortExpires(t)
-	tsort(t, function(a,b) return a.expiration < b.expiration end)
-	return t
-end
-
-local function UpdateAuraIconGrid(plate)
-	local frame = plate.frame;
-	local guid = plate.guid;
-	local iconCache = frame.auraicons;
-	local AurasOnUnit = GetUnitPlateAuras(guid);
-	local AuraSlotIndex = 1;
-	local auraID;
-	if AurasOnUnit then
-		frame.auras:Show()
-		local auraCount = 1
-		for auraID,aura in pairs(AurasOnUnit) do
-			if tonumber(aura.spellID) then
-				aura.name = GetSpellInfo(tonumber(aura.spellID))
-				aura.unit = plate.unit
-				if(aura.expiration > GetTime()) then
-					AurasCache[auraCount] = aura
-					auraCount = auraCount + 1
-				end
-			end
-		end
-	end
-	AurasCache = SortExpires(AurasCache)
-	for index = 1,  #AurasCache do
-		local cachedaura = AurasCache[index]
-		local gridaura = iconCache[AuraSlotIndex]
-		if gridaura and cachedaura.spellID and cachedaura.expiration then
-			UpdateAuraIcon(gridaura, cachedaura.texture, cachedaura.expiration, cachedaura.stacks)
-			AuraSlotIndex = AuraSlotIndex + 1
-		end
-		if(AuraSlotIndex > AuraMaxCount) then
-			break
-		end
-	end
-	if(iconCache[AuraSlotIndex]) then
-		RegisterAuraClock(iconCache[AuraSlotIndex], 0)
-	end
-	twipe(AurasCache)
-end
-
-local function LoadDuration(spellID)
-	if spellID then
-		return CachedAuraDurations[spellID] or 0
-	end
-	return 0
-end
-
-local function SaveDuration(spellID, duration)
-	duration = duration or 0
-	if spellID then CachedAuraDurations[spellID] = duration end
-end
-
-local function CreateAuraIcon(auras, plate)
-
-	local button = CreateFrame("Frame", nil, auras)
-
-	button.bord = button:CreateTexture(nil, "BACKGROUND")
-	button.bord:SetDrawLayer('BACKGROUND', 2)
-	button.bord:SetColorTexture(0,0,0,1)
-	button.bord:SetPoint("TOPLEFT", button, "TOPLEFT", -2, 2)
-	button.bord:SetPoint("BOTTOMRIGHT", button, "BOTTOMRIGHT", 2, -2)
-
-	button.Icon = button:CreateTexture(nil, "BORDER")
-	button.Icon:SetPoint("TOPLEFT",button,"TOPLEFT")
-	button.Icon:SetPoint("BOTTOMRIGHT",button,"BOTTOMRIGHT")
-	button.Icon:SetTexCoord(.1, .9, .2, .8)
-
-	button.TimeLeft = button:CreateFontString(nil, 'OVERLAY')
-	button.TimeLeft:SetFontObject(SVUI_Font_NamePlate_Aura)
-	button.TimeLeft:SetPoint("BOTTOMLEFT",button,"TOPLEFT",-3,-1)
-	button.TimeLeft:SetJustifyH('CENTER')
-
-	button.Stacks = button:CreateFontString(nil,"OVERLAY")
-	button.Stacks:SetFontObject(SVUI_Font_NamePlate_Aura)
-	button.Stacks:SetPoint("BOTTOMRIGHT",button,"BOTTOMRIGHT",3,-3)
-
-	button:SetScript('OnHide', function()
-		if plate.guid then
-			UpdateAuraIconGrid(plate)
-		end
-	end)
-
-	button:Hide()
-
-	return button
-end
-
-function MOD:UpdateAuras(plate)
-	if plate.setting.tiny then return end
-	local guid = plate.guid
-	local frame = plate.frame
-	if(NPFindHealers and plate.isHealer) then
-		frame.health.icon:Show()
-	end
-	if not guid then
-		if RAID_CLASS_COLORS[plate.setting.classToken] then
-			local pn = plate.name:GetText()
-			local name = pn:gsub("%s%(%*%)", "")
-			guid = AuraByName[name]
-		--elseif plate.raidicon:IsShown() then
-			--guid = AuraByRaidIcon[plate.raidicontype]
-		end
-		if guid then
-			plate.guid = guid
-		else
-			frame.auras:Hide()
-			return
-		end
-	end
-	UpdateAuraIconGrid(plate)
-	if(self.UseCombo) then
-		local numPoints = GetComboPoints(UnitHasVehicleUI("player") and "vehicle" or "player", "target")
-		for i = 1, MAX_COMBO_POINTS do
-			if(i <= numPoints) then
-				frame.combo[i]:Show()
-			else
-				frame.combo[i]:Hide()
-			end
-		end
-	end
-
-end
-
-function MOD:UpdateAurasByUnitID(unitid)
-	local guid = UnitGUID(unitid)
-	if(guid and UnitPlateAuras[guid]) then
-		local auras = UnitPlateAuras[guid]
-		for auraID, _ in pairs(auras) do
-			UnitPlateAuras[guid][auraID] = nil
-		end
-	end
-	for i = 1, 40 do
-		local spellname , _, texture, count, dispelType, duration, expirationTime, unitCaster, _, _, spellid, _, isBossDebuff = UnitAura(unitid, i, "HARMFUL")
-		if(not spellname) then break end
-		SaveDuration(spellid, duration)
-		SetAuraInstance(guid, spellid, expirationTime, count, UnitGUID(unitCaster or ""), duration, texture)
-	end
-	local name;
-	if UnitPlayerControlled(unitid) then
-		name = UnitName(unitid)
-		AuraByName[name] = guid
-	end
-	local raidIcon = RIconNames[GetRaidTargetIndex(unitid) or ""];
-	if(raidIcon) then
-		AuraByRaidIcon[raidIcon] = guid
-	end
-	self:RequestScanUpdate(guid, raidIcon, name, "UpdateAuras")
-end
---[[
-##########################################################
-PLATE COLORING
-##########################################################
-]]--
-do
-	local function GetPlateThreatReaction(plate)
-		if plate.aggroHighlight:IsShown() then
-			local r, g, b = plate.aggroHighlight:GetVertexColor()
-			local lastThreat = plate.reaction or 1
-			if g + b < 1 then
-				plate.reaction = 4
-				return 4
-			else
-				if lastThreat > 2 then
-					plate.reaction = 2
-					return 2
-				elseif lastThreat < 3 then
-					plate.reaction = 3
-					return 3
-				end
-			end
-		end
-		plate.reaction = 1
-		return 1
-	end
-
-	local function GetPlateReaction(plate)
-		if plate.guid ~= nil then
-			local class, classToken, _, _, _, _, _ = GetPlayerInfoByGUID(plate.guid)
-			if RAID_CLASS_COLORS[classToken] then
-				plate.setting.classToken = classToken
-				return REACTION_COLORING[1](classToken)
-			end
-		end
-
-		local oldR,oldG,oldB = plate.healthBar:GetStatusBarColor()
-		local r = floor(oldR * 100 + .5) * 0.01;
-		local g = floor(oldG * 100 + .5) * 0.01;
-		local b = floor(oldB * 100 + .5) * 0.01;
-		--print(plate.health:GetStatusBarColor())
-		for classToken, _ in pairs(RAID_CLASS_COLORS) do
-			local bb = b
-			if classToken == 'MONK' then
-				bb = bb - 0.01
-			end
-			if RAID_CLASS_COLORS[classToken].r == r and RAID_CLASS_COLORS[classToken].g == g and RAID_CLASS_COLORS[classToken].b == bb then
-				plate.setting.classToken = classToken
-				return REACTION_COLORING[1](classToken)
-			end
-		end
-
-		plate.setting.classToken = nil
-		if(r + b < 0.25) then
-			return REACTION_COLORING[3]()
-		else
-			local threatReaction = GetPlateThreatReaction(plate)
-			if(r + g > 1.8) then
-				return REACTION_COLORING[4](threatReaction)
-			elseif(g + b < 0.25) then
-				return REACTION_COLORING[5](threatReaction)
-			elseif((r > 0.45 and r < 0.55) and (g > 0.45 and g < 0.55) and (b > 0.45 and b < 0.55)) then
-				REACTION_COLORING[2]()
-			else
-				REACTION_COLORING[1]()
-			end
-		end
-	end
-
-	local function ColorizeAndScale(plate, frame)
-		local unitType = GetPlateReaction(plate)
-
-		plate.setting.classToken = unitType
-
-		local latestColor, scale = GetPlateReaction(plate);
-		local r,g,b
-		if(latestColor) then
-			r,g,b = unpack(latestColor)
-		else
-			r,g,b = plate.healthBar:GetStatusBarColor()
-		end
-
-		frame.health:SetStatusBarColor(r,g,b)
-		if(NPUsePointer and (NPPointerMatch == true) and plate.setting.unit == "target") then
-			NPGlow:SetBackdropColor(r,g,b,0.5)
-			NPGlow:SetBackdropBorderColor(r,g,b,0.5)
-		end
-		--frame.health.elite.bottom:SetVertexColor(r,g,b)
-		--frame.health.elite.right:SetVertexColor(r,g,b)
-		--frame.health.elite.left:SetVertexColor(r,g,b)
-		scale = scale or 1
-		if(not plate.setting.scaled and not plate.setting.tiny and frame.health:GetWidth() ~= (HBWidth * scale)) then
-			frame.health:SetSize(HBWidth * scale, HBHeight * scale)
-			local scaledIconSize = CBHeight + (HBHeight * scale) + 5;
-			plate.castBar.Icon:SetSize(scaledIconSize, scaledIconSize)
-		end
-	end
-
-	function UpdatePlateElements(plate, frame)
-		ColorizeAndScale(plate, frame)
-		frame.health.elitetop:Hide()
-		frame.health.elitebottom:Hide()
-		if(frame.name.SetText) then
-			frame.name:SetText(plate.name:GetText())
-		end
-	end
-end
---[[
-##########################################################
-PLATE UPDATE HANDLERS
-##########################################################
-]]--
-do
-	local function IsNamePlate(frame)
-		local frameName = frame:GetName()
-		if frameName and frameName:find('^NamePlate%d') then
-			local textObj = select(2, frame:GetChildren())
-			if textObj then
-				local textRegions = textObj:GetRegions()
-				return (textRegions and textRegions:GetObjectType() == 'FontString')
-			end
-		end
-	end
-
-	local function SetPlateAlpha(plate, frame)
-		if plate:GetAlpha() < 1 then
-			frame:SetAlpha(NPBaseAlpha)
-		else
-			frame:SetAlpha(1)
-		end
-	end
-
-	local function UpdatePlateUnit()
-		local plateName = BLIZZ_PLATE.nametext
-
-		if BLIZZ_PLATE:GetAlpha() == 1 and CURRENT_TARGET_NAME and (CURRENT_TARGET_NAME == plateName) then
-			BLIZZ_PLATE.guid = UnitGUID("target")
-			PLATE_ARGS.unit = "target"
-			SVUI_PLATE:SetFrameLevel(2)
-			SVUI_PLATE.highlight:Hide()
-			if(NPUsePointer) then
-				NPGlow:SetParent(SVUI_PLATE)
-				NPGlow:WrapPoints(SVUI_PLATE.health,2,2)
-				NPGlow:SetFrameLevel(0)
-				NPGlow:SetFrameStrata("BACKGROUND")
-				if(not NPGlow:IsShown()) then
-					NPGlow:Show()
-					if(NPUseModel) then
-						NPGlow.FX:Show()
-						NPGlow.FX:SetEffect("platepoint")
-					end
-				end
-			end
-			if((TARGET_CHECKS > 0) or PLATE_ARGS.allowed) then
-				TARGET_CHECKS = TARGET_CHECKS + 1
-				if(TARGET_CHECKS == 2) then
-					TARGET_CHECKS = 0
-				end
-				MOD:UpdateAurasByUnitID('target')
-				if MOD.UseCombo then
-					UpdateComboPoints()
-				end
-				PLATE_ARGS.allowed = nil
-			end
-		elseif UnitExists("mouseover") and (UnitName("mouseover") == plateName) then
-			if(PLATE_ARGS.unit ~= "mouseover" or PLATE_ARGS.allowed) then
-				SVUI_PLATE:SetFrameLevel(1)
-				SVUI_PLATE.highlight:Show()
-				MOD:UpdateAurasByUnitID('mouseover')
-				if MOD.UseCombo then
-					UpdateComboPoints()
-				end
-				PLATE_ARGS.allowed = nil
-			end
-			BLIZZ_PLATE.guid = UnitGUID("mouseover")
-			PLATE_ARGS.unit = "mouseover"
-		else
-			SVUI_PLATE:SetFrameLevel(0)
-			SVUI_PLATE.highlight:Hide()
-			PLATE_ARGS.unit = nil
-		end
-		--CheckRaidIcon()
-		UpdatePlateElements(BLIZZ_PLATE,SVUI_PLATE)
-	end
-
-	function MOD:NAME_PLATE_CREATED(event, ...)
-		local frame = ...;
-		if(not PlateRegistry[frame]) then
-			PlateForge(frame)
-		end
-	end
-
-	function MOD:NAME_PLATE_UNIT_ADDED(event, ...)
-		local namePlateUnitToken = ...;
-		local frame = C_NamePlate.GetNamePlateForUnit(namePlateUnitToken);
-		if(not PlateRegistry[frame]) then
-			PlateForge(frame)
-		end
-	end
-end
---[[
-##########################################################
-SCRIPT HANDLERS
-##########################################################
-]]--
-do
-	local function HealthBarSizeChanged(self, width, height)
-		if(not ProxyThisPlate(self.sync)) then return; end
-		width = floor(width + 0.5)
-		local numAuras = AuraMaxCount
-		local auraWidth = ((width - (4 * (numAuras - 1))) / numAuras)
-		local auraHeight = (auraWidth * 0.7)
-		for index = 1, numAuras do
-			if not PLATE_AURAICONS[index] then
-				PLATE_AURAICONS[index] = CreateAuraIcon(PLATE_AURAS, SVUI_PLATE);
-			end
-			PLATE_AURAICONS[index]:SetWidth(auraWidth)
-			PLATE_AURAICONS[index]:SetHeight(auraHeight)
-			PLATE_AURAICONS[index]:ClearAllPoints()
-			if(index == 1) then
-				PLATE_AURAICONS[index]:SetPoint("LEFT", PLATE_AURAS, 0, 0)
-			else
-				PLATE_AURAICONS[index]:SetPoint("LEFT", PLATE_AURAICONS[index-1], "RIGHT", 4, 0)
-			end
-		end
-		if(numAuras > #PLATE_AURAICONS) then
-			for index = (numAuras + 1), #PLATE_AURAICONS do
-				RegisterAuraClock(PLATE_AURAICONS[index], 0)
-			end
-		end
-	end
-
-	local function HealthBarValueChanged(self, value)
-		local healthBar = self.sync;
-		local alert = healthBar.alert;
-		local minValue, maxValue = self:GetMinMaxValues()
-		local showText = false
-		healthBar:SetMinMaxValues(minValue, maxValue)
-		healthBar:SetValue(value)
-		local percentValue = (value/maxValue)
-		if percentValue < HBThresh then
-			alert:Show()
-			if percentValue < (HBThresh / 2) then
-				alert:SetBackdropBorderColor(1, 0, 0, 0.9)
-			else
-				alert:SetBackdropBorderColor(1, 1, 0, 0.9)
-			end
-		elseif alert:IsShown() then
-			alert:Hide()
-		end
-		if((value and value > 0) and (maxValue and maxValue > 1) and self:GetScale() == 1) then
-			showText = true
-		end
-		if(HBTextFormat and showText) then
-			healthBar.text:Show()
-			healthBar.text:SetText(SetTextStyle(HBTextFormat, value, maxValue))
-		elseif healthBar.text:IsShown() then
-			healthBar.text:Hide()
-		end
-	end
-
-	local function CastBarValueChanged(self, value)
-		local castBar = self.sync
-		local min, max = self:GetMinMaxValues()
-		local isChannel = value < castBar:GetValue()
-		castBar:SetMinMaxValues(min, max)
-		castBar:SetValue(value)
-		castBar.Text:SetFormattedText("%.1f ", value)
-		local color
-		if(self.shield and self.shield:IsShown()) then
-			color = CBNoInterrupt
-		else
-			if value > 0 and (isChannel and (value/max) <= 0.02 or (value/max) >= 0.98) then
-				color = {0,1,0}
-			else
-				color = CBColor
-			end
-		end
-		castBar:SetStatusBarColor(unpack(color))
-	end
-
-	local function ShowThisPlate(plate)
-		if(not ProxyThisPlate(plate, true)) then return; end
-
-		if RestrictedPlates[PLATE_REALNAME] then
-			SVUI_PLATE:Hide()
-			return
-		elseif(not SVUI_PLATE:IsShown()) then
-			SVUI_PLATE:Show()
-		end
-
-		VisiblePlates[BLIZZ_PLATE] = true
-
-		PLATE_ARGS.tiny = (BLIZZ_PLATE.healthBar:GetEffectiveScale() < 1)
-		SVUI_PLATE:SetSize(BLIZZ_PLATE:GetSize())
-
-		SVUI_PLATE.name:ClearAllPoints()
-		if(PLATE_ARGS.tiny) then
-			SVUI_PLATE.health:SetSize(BLIZZ_PLATE.healthBar:GetWidth() * (BLIZZ_PLATE.healthBar:GetEffectiveScale() * 1.25), HBHeight)
-			SVUI_PLATE.name:SetPoint("BOTTOM", SVUI_PLATE.health, "TOP", 0, 3)
-		else
-			SVUI_PLATE.name:SetPoint("BOTTOMLEFT", SVUI_PLATE.health, "TOPLEFT", 0, 3)
-			SVUI_PLATE.name:SetPoint("BOTTOMRIGHT", SVUI_PLATE.level, "BOTTOMLEFT", -2, 0)
-		end
-
-		UpdatePlateElements(BLIZZ_PLATE, SVUI_PLATE)
-
-		HealthBarValueChanged(BLIZZ_PLATE.healthBar, BLIZZ_PLATE.healthBar:GetValue())
-
-		if(not PLATE_ARGS.tiny) then
-			--CheckRaidIcon()
-			MOD:UpdateAuras(BLIZZ_PLATE)
-		else
-			PLATE_ARGS.allowed = true
-		end
-
-		if(NPUsePointer and (not NPPointerMatch)) then
-			NPGlow:SetBackdropColor(unpack(NPPointerColor))
-			NPGlow:SetBackdropBorderColor(unpack(NPPointerColor))
-		end
-	end
-
-	local function HideThisPlate(plate)
-		if(not ProxyThisPlate(plate)) then return; end
-
-		SVUI_PLATE:Hide()
-		VisiblePlates[plate] = nil
-		PLATE_ARGS.classToken = nil
-		plate.guid = nil
-		PLATE_ARGS.unit = nil
-		PLATE_ARGS.scaled = nil
-		PLATE_ARGS.tiny = nil
-		PLATE_ARGS.allowed = nil
-		if(NPGlow:GetParent() == SVUI_PLATE) then
-			NPGlow:Hide()
-			if(NPGlow.FX:IsShown()) then
-				NPGlow.FX:Hide()
-			end
-		end
-		SVUI_PLATE.health.alert:Hide()
-		SVUI_PLATE.health.icon:Hide()
-		if SVUI_PLATE.health then
-			SVUI_PLATE.health:SetSize(HBWidth, HBHeight)
-			plate.castBar.Icon:SetSize(ICON_SIZE, ICON_SIZE)
-		end
-		if PLATE_AURAS then
-			for index = 1, #PLATE_AURAICONS do
-				RegisterAuraClock(PLATE_AURAICONS[index], 0)
-			end
-		end
-		if MOD.UseCombo then
-			for i=1, MAX_COMBO_POINTS do
-				SVUI_PLATE.combo[i]:Hide()
-			end
-		end
-
-		SVUI_PLATE:SetPoint("BOTTOMLEFT", plate, "BOTTOMLEFT")
-	end
-
-	local function UpdateThisPlate(plate)
-		--print("NamePlate UpdateThisPlate Start")
-		if(not ProxyThisPlate(plate, true)) then return; end
-		SVUI_PLATE.name:SetFontObject(SVUI_Font_NamePlate)
-		SVUI_PLATE.name:SetTextColor(1, 1, 1)
-		-- SVUI_PLATE.level:SetFontObject(SVUI_Font_NamePlate_Number)
-		-- if not PLATE_ARGS.scaled and not PLATE_ARGS.tiny then
-		-- 	SVUI_PLATE.health:SetSize(HBWidth, HBHeight)
-		-- end
-		-- SVUI_PLATE.health:SetStatusBarTexture(NPBarTex)
-		-- SVUI_PLATE.health.text:SetFontObject(SVUI_Font_NamePlate_Number)
-		-- SVUI_PLATE.cast:SetSize(HBWidth, CBHeight)
-		-- SVUI_PLATE.cast:SetStatusBarTexture(NPBarTex)
-		-- SVUI_PLATE.cast.text:SetFont(SV.media.font.default, 8, "OUTLINE")
-		-- SVUI_PLATE.health.icon:ClearAllPoints()
-		-- SV:SetReversePoint(SVUI_PLATE.health.icon, RIAnchor, SVUI_PLATE.health, RIXoffset, RIYoffset)
-		-- SVUI_PLATE.health.icon:SetSize(RISize, RISize)
-		-- for index = 1, #PLATE_AURAICONS do
-		-- 	if PLATE_AURAICONS and PLATE_AURAICONS[index] then
-		-- 		PLATE_AURAICONS[index].TimeLeft:SetFontObject(SVUI_Font_NamePlate_Aura)
-		-- 		PLATE_AURAICONS[index].Stacks:SetFontObject(SVUI_Font_NamePlate_Aura)
-		-- 		PLATE_AURAICONS[index].Icon:SetTexCoord(.07, 0.93, .23, 0.77)
-		-- 	end
-		-- end
-		--
-		-- if(MOD.UseCombo and not SVUI_PLATE.combo:IsShown()) then
-		-- 	SVUI_PLATE.combo:Show()
-		-- elseif(SVUI_PLATE.combo:IsShown()) then
-		-- 	SVUI_PLATE.combo:Hide()
-		-- end
-		--
-		-- ShowThisPlate(plate)
-		-- HealthBarSizeChanged(SVUI_PLATE.health, SVUI_PLATE.health:GetSize())
-	end
-
-	function PlateForge(source)
-		local plate = source.UnitFrame;
-		if(not plate) then return end;
-		--print("NamePlate Creation Start")
-		local ref, skin = {}, {};
-
-		plate.healthBar:SetStatusBarTexture(SV.NoTexture)
-		plate.castBar:SetStatusBarTexture(SV.NoTexture)
-
-		plate.healthBar:Hide()
-		plate.castBar:Hide()
-		plate.name:ClearAllPoints()
-		plate.name:Hide()
-
-		local frame = CreateFrame("Frame", nil, plate)
-
-		--[[ HEALTH BAR ]]--
-		--print("NamePlate Creating Health")
-		frame.health = CreateFrame("StatusBar", nil, frame)
-		frame.health:SetPoint('BOTTOM', frame, 'BOTTOM', 0, 5)
-		frame.health:SetFrameStrata("BACKGROUND")
-		frame.health:SetFrameLevel(1)
-		frame.health:SetStyle("Frame", "Nameplate")
-		frame.health:SetScript("OnSizeChanged", HealthBarSizeChanged)
-		frame.health.elitetop = frame.health.Panel.Top
-		frame.health.elitebottom = frame.health.Panel.Bottom
-		frame.health.sync = plate.healthBar;
-
-		--CreatePlateBorder(frame.health)
-
-		frame.health.text = frame.health:CreateFontString(nil, 'OVERLAY')
-		frame.health.text:SetPoint("CENTER", frame.health, HBTextAnchor, HBXoffset, HBYoffset)
-		frame.health.text:SetJustifyH("CENTER")
-
-		--print("NamePlate Creating LevelText")
-		frame.level = frame.health:CreateFontString(nil, 'OVERLAY')
-		frame.level:SetPoint("BOTTOMRIGHT", frame.health, "TOPRIGHT", 3, 3)
-		frame.level:SetJustifyH("RIGHT")
-
-		frame.name = frame.health:CreateFontString(nil, 'OVERLAY')
-		frame.name:SetJustifyH("LEFT")
---print("NamePlate Creating Icons")
-		frame.eliteicon = frame:CreateTexture(nil, "OVERLAY")
-		frame.skullicon = frame:CreateTexture(nil, "OVERLAY")
-
-		frame.raidicon = frame:CreateTexture(nil, "ARTWORK")
-		frame.raidicon:SetSize(NPIcons,NPIcons)
-		frame.raidicon:SetPoint("RIGHT", frame.health, "LEFT", -3, 0)
-		--frame.raidicon:SetTexture("Interface\\TargetingFrame\\UI-RaidTargetingIcons")
-		frame.raidicon:SetTexture("")
-
-		frame.health.icon = frame:CreateTexture(nil, 'ARTWORK')
-		frame.health.icon:SetSize(14,14)
-		frame.health.icon:SetPoint("BOTTOMRIGHT", frame.health, "TOPLEFT", -3, 3)
-
-		frame.health.icon:SetTexture(MOD.media.roles)
-		frame.health.icon:SetTexCoord(0,0.5,0.5,1)
-		frame.health.icon:Hide()
-
-		frame.highlight = frame:CreateTexture(nil, 'OVERLAY')
-		frame.highlight:SetAllPoints(frame.health)
-		frame.highlight:SetColorTexture(1, 1, 1, 0.3)
-		frame.highlight:Hide()
---print("NamePlate Creating Alert")
-		local alert = CreateFrame("Frame", nil, frame)
-		alert:SetFrameLevel(0)
-		alert:WrapPoints(frame.health,2,2)
-		alert:SetBackdrop({
-			edgeFile = SV.media.border.shadow,
-			edgeSize = 2
-		});
-		alert:SetBackdropColor(0, 0, 0, 0)
-		alert:SetBackdropBorderColor(1, 1, 0, 0.9)
-		alert:SetScale(1.5)
-		alert:Hide()
-		frame.health.alert = alert
-
-		plate.healthBar.sync = frame.health
-
-		--[[ CAST BAR ]]--
---print("NamePlate Creating CastBar")
-		frame.cast = CreateFrame("StatusBar", nil, frame)
-		frame.cast:SetPoint('TOPLEFT', frame.health, 'BOTTOMLEFT', 0, -8)
-		frame.cast:SetPoint('TOPRIGHT', frame.health, 'BOTTOMRIGHT', 0, -8)
-		frame.cast:SetFrameStrata("BACKGROUND")
-		frame.cast:SetStyle("Frame", 'Bar')
-		frame.cast:SetFrameLevel(0)
-
-		frame.cast.text = frame.cast:CreateFontString(nil, 'OVERLAY')
-		frame.cast.text:SetPoint("RIGHT", frame.cast, "LEFT", -4, CBYoffset)
-		frame.cast.text:SetJustifyH("LEFT")
-
-		-- plate.castBar.Text:SetParent(frame.cast)
-		-- plate.castBar.Text:ClearAllPoints()
-		-- plate.castBar.Text:SetPoint("LEFT", frame.cast, "LEFT", CBXoffset, CBYoffset)
-		-- plate.castBar.Text:SetJustifyH("LEFT")
-		--
-		-- plate.castBar.Icon:SetParent(frame.cast)
-		-- plate.castBar.Icon:SetTexCoord(.07, .93, .07, .93)
-		-- plate.castBar.Icon:SetDrawLayer("OVERLAY")
-		-- plate.castBar.Icon:ClearAllPoints()
-		-- plate.castBar.Icon:SetPoint("TOPLEFT", frame.health, "TOPRIGHT", 5, 0)
-
-		-- local bgFrame = CreateFrame("Frame", nil, frame.cast)
-		-- bgFrame:WrapPoints(plate.castBar.Icon)
-		-- bgFrame:SetFrameLevel(bgFrame:GetFrameLevel() - 1)
-		-- bgFrame:SetStyle("Frame", "Bar", true, 2, 0, 0)
-
-		plate.castBar.sync = frame.cast
---print("NamePlate Creating Combo")
-		frame.combo = CreateFrame("Frame", nil, frame.health)
-		frame.combo:SetPoint("CENTER", frame.health, "BOTTOM")
-		frame.combo:SetSize(68, 1)
-		frame.combo:Hide()
-
-		if MOD.UseCombo then
-			for i = 1, MAX_COMBO_POINTS do
-				frame.combo[i] = frame.combo:CreateTexture(nil, 'OVERLAY')
-				frame.combo[i]:SetTexture(MOD.media.comboIcon)
-				frame.combo[i]:SetSize(12, 12)
-				frame.combo[i]:SetVertexColor(unpack(NPComboColor[i]))
-				if(i == 1) then
-					frame.combo[i]:SetPoint("TOPLEFT", frame.combo, "TOPLEFT")
-				else
-					frame.combo[i]:SetPoint("LEFT", frame.combo[i-1], "RIGHT", 2, 0)
-				end
-				frame.combo[i]:Hide()
-			end
-		end
---print("NamePlate Creating Auras")
-		frame.auras = CreateFrame("Frame", nil, frame)
-		frame.auras:SetHeight(32); frame.auras:Show()
-		frame.auras:SetPoint('BOTTOMRIGHT', frame.health, 'TOPRIGHT', 0, 10)
-		frame.auras:SetPoint('BOTTOMLEFT', frame.health, 'TOPLEFT', 0, 10)
-		frame.auras:SetFrameStrata("BACKGROUND")
-		frame.auras:SetFrameLevel(0)
-		frame.auraicons = {}
-
-		plate.frame = frame;
-		plate.setting = {};
---print("NamePlate UpdateThisPlate")
-		UpdateThisPlate(plate)
---print("NamePlate Setting Hooks")
-		plate:HookScript("OnShow", ShowThisPlate)
-		plate:HookScript("OnHide", HideThisPlate)
-		plate:HookScript("OnSizeChanged", function(self, width, height)
-			self.frame:SetSize(width, height)
-		end)
-
-		plate.healthBar:HookScript("OnValueChanged", HealthBarValueChanged)
-
-		plate.castBar:HookScript("OnShow", function(self) self.sync:Show() end)
-		plate.castBar:HookScript("OnHide", function(self) self.sync:Hide() end)
-		plate.castBar:HookScript("OnValueChanged", CastBarValueChanged)
-
-		VisiblePlates[plate] = true
-		PlateRegistry[source] = true;
-		--print("NamePlate Added")
-	end
-
-	function MOD:UpdateAllPlates()
-		self:UpdateLocals()
-		for plate, _ in pairs(VisiblePlates) do
-			if(plate) then
-				UpdateThisPlate(plate)
-			end
-		end
-	end
-end
---[[
-##########################################################
-SCANNER
-##########################################################
-]]--
-do
-	local function ParseByName(sourceName)
-		if not sourceName then return; end
-		local SearchFor = split("-", sourceName)
-		for plate, _ in pairs(VisiblePlates) do
-			if plate and plate:IsShown() and plate.nametext == SearchFor and RAID_CLASS_COLORS[plate.setting.classToken] then
-				return plate
-			end
-		end
-	end
-
-	local function ParseByIconName(raidIcon)
-		for plate, _ in pairs(VisiblePlates) do
-			--CheckRaidIcon(plate)
-			if plate and plate:IsShown() and plate.raidicon:IsShown() and (plate.raidicontype and plate.raidicontype == raidIcon) then
-				return plate
-			end
-		end
-	end
-
-	function MOD:RequestScanUpdate(guid, raidIcon, name, callbackFunc, ...)
-		local plate
-		if guid then plate = ParseByGUID(guid) end
-		if (not plate) and name then plate = ParseByName(name) end
-		--if (not plate) and raidIcon then plate = ParseByIconName(raidIcon) end
-		if(plate and callbackFunc and MOD[callbackFunc]) then
-			MOD[callbackFunc](MOD, plate, ...)
-		end
-	end
-end
---[[
-##########################################################
-EVENTS
-##########################################################
-]]--
-function MOD:PLAYER_ENTERING_WORLD()
-	self:UpdateLocals();
-end
-
-function MOD:UPDATE_MOUSEOVER_UNIT()
-	WorldFrame.elapsed = 0.1
-end
-
-function MOD:PLAYER_REGEN_DISABLED()
-	SetCVar("nameplateShowEnemies", 1)
-end
-
-function MOD:PLAYER_REGEN_ENABLED()
-	SetCVar("nameplateShowEnemies", 0)
-end
-
-function MOD:PLAYER_TARGET_CHANGED()
-	NPGlow:Hide()
-	if(NPGlow.FX:IsShown()) then
-		NPGlow.FX:Hide()
-	end
-	if(UnitExists("target")) then
-		CURRENT_TARGET_NAME = UnitName("target");
-		TARGET_CHECKS = 1;
-		WorldFrame.elapsed = 0.1;
-	else
-		CURRENT_TARGET_NAME = nil;
-		TARGET_CHECKS = 0;
-	end
-end
-
-function MOD:UNIT_COMBO_POINTS(event, unit)
-	if(unit == "player" or unit == "vehicle") then
-		UpdateComboPoints()
-	end
-end
-
-function MOD:UNIT_AURA(event, unit)
-  if(unit == "target" or unit == "focus") then
-    self:UpdateAurasByUnitID(unit)
-		if(self.UseCombo) then
-			UpdateComboPoints()
-		end
-  end
-end
-
-do
-	local COMBAT_HEAL_EVENTS = {
-		["SPELL_HEAL"] = true,
-		["SPELL_AURA_APPLIED"] = true,
-		["SPELL_CAST_START"] = true,
-		["SPELL_CAST_SUCCESS"] = true,
-		["SPELL_PERIODIC_HEAL"] = true,
-	}
-
-	local COMBAT_AURA_EVENTS = {
-		["SPELL_AURA_BROKEN"] = 1,
-		["SPELL_AURA_BROKEN_SPELL"] = 1,
-		["SPELL_AURA_REMOVED"] = 1,
-		["SPELL_AURA_APPLIED"] = 2,
-		["SPELL_AURA_REFRESH"] = 2,
-		["SPELL_AURA_APPLIED_DOSE"] = 3,
-		["SPELL_AURA_REMOVED_DOSE"] = 3,
-	}
-
-	function MOD:COMBAT_LOG_EVENT_UNFILTERED(event, timestamp, combatevent, hideCaster, ...)
-	  local sourceGUID, sourceName, sourceFlags, sourceRaidFlags, destGUID, destName, destFlags, destRaidFlags, spellID, spellname = ...;
-		local hasChange = false;
-		local eventCheck = COMBAT_AURA_EVENTS[combatevent];
-		if(eventCheck and destGUID and spellID) then
-			if(eventCheck > 1) then
-				local stackCount = 1
-				local duration = LoadDuration(spellID)
-				local texture = GetSpellTexture(spellID)
-				if(eventCheck == 3) then stackCount = select(16, ...) end
-				SetAuraInstance(destGUID, spellID, (GetTime() + duration), stackCount, sourceGUID, duration, texture)
-			else
-				local auraID = spellID..(tostring(sourceName or "UNKNOWN_CASTER"))
-				if(auraID and UnitPlateAuras[destGUID] and UnitPlateAuras[destGUID][auraID]) then
-				  UnitPlateAuras[destGUID][auraID] = nil
-				end
-			end
-			hasChange = true;
-		end
-
-		if(NPFindHealers and COMBAT_HEAL_EVENTS[combatevent] and IsEnemyPlayer(sourceFlags) and sourceName) then
-			local healerName = split("-", sourceName)
-			self:RequestScanUpdate(sourceGUID, false, healerName, "UpdateHealer", healerName, spellID)
-			hasChange = true;
-		end
-
-	  if(not hasChange) then
-	    return
-	  end
-
-	  local rawName, raidIcon
-	  if(destName and (band(destFlags, COMBATLOG_OBJECT_CONTROL_PLAYER) > 0)) then
-	    rawName = split("-", destName)
-	    AuraByName[rawName] = destGUID
-	  end
-	  for iconName, bitmask in pairs(RIconData) do
-	    if band(destRaidFlags, bitmask) > 0  then
-	      raidIcon = iconName
-	      AuraByRaidIcon[raidIcon] = destGUID
-	      break
-	    end
-	  end
-	  self:RequestScanUpdate(destGUID, raidIcon, rawName, "UpdateAuras")
-	end
-end
---[[
-##########################################################
-UPDATE AND BUILD
-##########################################################
-]]--
-local function PlayerRoleUpdate()
-	MOD:UpdateAllPlates()
-end
-
-function MOD:UpdateLocals()
-	local db = SV.db.NamePlates
-	if not db then return end
-
-	NPBarTex = LSM:Fetch("statusbar", db.barTexture);
-
-	NPBaseAlpha = db.nonTargetAlpha;
-	NPCombatHide = db.combatHide;
-
-	RIAnchor = db.raidHealIcon.attachTo;
-	RIXoffset = db.raidHealIcon.xOffset;
-	RIYoffset = db.raidHealIcon.yOffset;
-	RISize = db.raidHealIcon.size;
-
-	HBThresh = db.healthBar.lowThreshold;
-	NPNameMatch = db.colorNameByValue;
-	HBTextFormat = db.healthBar.text.enable and db.healthBar.text.format or false;
-	HBTextAnchor = db.healthBar.text.attachTo;
-	HBXoffset = db.healthBar.text.xOffset;
-	HBYoffset = db.healthBar.text.yOffset;
-	HBWidth = db.healthBar.width;
-	HBHeight = db.healthBar.height;
-
-	NPIcons = HBHeight * 1.5
-
-	CBColor = {db.castBar.color[1], db.castBar.color[2], db.castBar.color[3]}
-	CBNoInterrupt = {db.castBar.noInterrupt[1], db.castBar.noInterrupt[2], db.castBar.noInterrupt[3]}
-	CBHeight = db.castBar.height;
-	CBText = db.castBar.text.enable;
-	CBXoffset = db.castBar.text.xOffset;
-	CBYoffset = db.castBar.text.yOffset;
-
-	ICON_SIZE = CBHeight + HBHeight + 5
-
-	NPUsePointer = db.pointer.enable;
-	NPPointerMatch = db.pointer.colorMatchHealthBar;
-	NPPointerColor = {db.pointer.color[1], db.pointer.color[2], db.pointer.color[3], 0.5};
-	NPUseModel = db.pointer.useArrowEffect
-
-	local rc = db.reactions
-	NPReactTap = {rc.tapped[1], rc.tapped[2], rc.tapped[3]}
-	NPReactNPCGood = {rc.friendlyNPC[1], rc.friendlyNPC[2], rc.friendlyNPC[3]}
-	NPReactPlayerGood = {rc.friendlyPlayer[1], rc.friendlyPlayer[2], rc.friendlyPlayer[3]}
-	NPReactNeutral = {rc.neutral[1], rc.neutral[2], rc.neutral[3]}
-	NPReactEnemy = {rc.enemy[1], rc.enemy[2], rc.enemy[3]}
-
-	AuraMaxCount = db.auras.numAuras;
-	AuraFilterName = db.auras.additionalFilter
-	AuraFilter = SV.db.Filters[AuraFilterName]
-
-	NPFindHealers = db.findHealers
-
-	local tc = SV.db.NamePlates.threat
-	NPUseThreat = tc.enable;
-	NPThreatGS = tc.goodScale;
-	NPThreatBS = tc.badScale;
-	if(SV.ClassRole == 'TANK') then
-		CONFIG_THREAT_HOSTILE = {
-			{tc.badColor[1], tc.badColor[2], tc.badColor[3]},
-			{tc.badTransitionColor[1], tc.badTransitionColor[2], tc.badTransitionColor[3]},
-			{tc.goodTransitionColor[1], tc.goodTransitionColor[2], tc.goodTransitionColor[3]},
-			{tc.goodColor[1], tc.goodColor[2], tc.goodColor[3]}
-		};
-		CONFIG_THREAT_SCALE = { NPThreatBS, NPThreatBS, NPThreatGS, NPThreatGS };
-	else
-		CONFIG_THREAT_HOSTILE = {
-			{tc.goodColor[1], tc.goodColor[2], tc.goodColor[3]},
-			{tc.goodTransitionColor[1], tc.goodTransitionColor[2], tc.goodTransitionColor[3]},
-			{tc.badTransitionColor[1], tc.badTransitionColor[2], tc.badTransitionColor[3]},
-			{tc.badColor[1], tc.badColor[2], tc.badColor[3]}
-		};
-		CONFIG_THREAT_SCALE = { NPThreatGS, NPThreatGS, NPThreatBS, NPThreatBS };
-	end
-
-	if(not db.themed) then
-		PLATE_TOP = SV.NoTexture
-		PLATE_BOTTOM = SV.NoTexture
-		PLATE_RIGHT = SV.NoTexture
-		PLATE_LEFT = SV.NoTexture
-	else
-		PLATE_TOP = self.media.topArt
-		PLATE_BOTTOM = self.media.bottomArt
-		PLATE_RIGHT = self.media.rightArt
-		PLATE_LEFT = self.media.leftArt
-	end
-
-	if (db.comboPoints and (SV.class == 'ROGUE' or SV.class == 'DRUID')) then
-		self.UseCombo = true
-		self:RegisterEvent("UNIT_COMBO_POINTS")
-	else
-		self.UseCombo = false
-		self:UnregisterEvent("UNIT_COMBO_POINTS")
-	end
-
-	if (NPFindHealers) then
-		self:RegisterEvent("UPDATE_BATTLEFIELD_SCORE")
-	else
-		self:UnregisterEvent("UPDATE_BATTLEFIELD_SCORE")
-	end
-end
-
-function MOD:CombatToggle(noToggle)
-	if(NPCombatHide) then
-		self:RegisterEvent("PLAYER_REGEN_DISABLED")
-		self:RegisterEvent("PLAYER_REGEN_ENABLED")
-		if(not noToggle) then
-			SetCVar("nameplateShowEnemies", 0)
-		end
-	else
-		self:UnregisterEvent("PLAYER_REGEN_DISABLED")
-		self:UnregisterEvent("PLAYER_REGEN_ENABLED")
-		if(not noToggle) then
-			SetCVar("nameplateShowEnemies", 1)
-		end
-	end
-end
-
-function MOD:ReLoad()
-	self:UpdateAllPlates();
-end
-
-function MOD:Load()
-	--SV.SpecialFX:Register("platepoint", [[Spells\Arcane_missile_lvl1.m2]], -12, 48, 12, -48, 0.25, 0, 0)
-	SV.SpecialFX:Register("platepoint", [[Spells\Arrow_state_animated.m2]], -12, 12, 12, -50, 0.75, 0, 0.1)
-	--SV.SpecialFX:Register("platepoint", [[Spells\Cast_arcane_01.m2]], -12, 48, 12, -48, 0.25, 0, 0)
-	--SV.SpecialFX:Register("platepoint", [[Spells\Cast_arcane_01.m2]], -12, 48, 12, -48, 0.25, 0, 0)
-	--SV.SpecialFX:Register("platepoint", [[Spells\Shadow_precast_uber_hand.m2]],  -12, 22, 12, -22, 0.23, -0.1, 0.1)
-	SV.SpecialFX:SetFXFrame(NPGlow, "platepoint", true)
-	NPGlow.FX:SetParent(SV.Screen)
-	NPGlow.FX:SetFrameStrata("BACKGROUND")
-	NPGlow.FX:SetFrameLevel(0)
-	NPGlow.FX:Hide()
-	self:UpdateLocals()
-	self:RegisterEvent("PLAYER_ENTERING_WORLD")
-	self:RegisterEvent("COMBAT_LOG_EVENT_UNFILTERED")
-	self:RegisterEvent("UNIT_AURA")
-	self:RegisterEvent("PLAYER_TARGET_CHANGED")
-	self:RegisterEvent("UPDATE_MOUSEOVER_UNIT")
-	self:RegisterEvent("NAME_PLATE_CREATED")
-	self:RegisterEvent("NAME_PLATE_UNIT_ADDED")
-	--WorldFrame:HookScript('OnUpdate', WorldFrameUpdateHook)
-	self:CombatToggle(true)
-	SV.Events:On("PLAYER_ROLE_CHANGED", PlayerRoleUpdate, true)
-end
diff --git a/SVUI_NamePlates/SVUI_NamePlates.lua b/SVUI_NamePlates/SVUI_NamePlates.lua
index 5669c62..ffb9c17 100644
--- a/SVUI_NamePlates/SVUI_NamePlates.lua
+++ b/SVUI_NamePlates/SVUI_NamePlates.lua
@@ -1,1265 +1,1276 @@
---[[
-##############################################################################
-S V U I NAMEPLATES   By: joev
-##############################################################################
-credit: Abu.       NamePlates was adapted from AbuNameplates                 #
-##############################################################################
-##########################################################
-LOCALIZED LUA FUNCTIONS
-##########################################################
-]]--
---[[ GLOBALS ]]--
-local _G = _G;
-local unpack    = _G.unpack;
-local select    = _G.select;
-local pairs     = _G.pairs;
-local ipairs    = _G.ipairs;
-local type      = _G.type;
-local error     = _G.error;
-local pcall     = _G.pcall;
-local tostring  = _G.tostring;
-local tonumber  = _G.tonumber;
-local tinsert   = _G.tinsert;
-local string    = _G.string;
-local math      = _G.math;
-local bit       = _G.bit;
-local table     = _G.table;
---[[ STRING METHODS ]]--
-local lower, upper = string.lower, string.upper;
-local find, format, split = string.find, string.format, string.split;
-local match, gmatch, gsub = string.match, string.gmatch, string.gsub;
---[[ MATH METHODS ]]--
-local floor, ceil = math.floor, math.ceil;  -- Basic
---[[ BINARY METHODS ]]--
-local band, bor = bit.band, bit.bor;
---[[ TABLE METHODS ]]--
-local tremove, tcopy, twipe, tsort, tconcat = table.remove, table.copy, table.wipe, table.sort, table.concat;
---[[
-##########################################################
-GET ADDON DATA
-##########################################################
-]]--
-local SV = _G['SVUI'];
-local L = SV.L;
-local MOD = SV.NamePlates;
-if(not MOD) then return end;
-
-local LSM = _G.LibStub("LibSharedMedia-3.0")
-
---[[
-##########################################################
-LOCAL VARS
-##########################################################
-]]--
-local PLATE_TOP = MOD.media.topArt;
-local PLATE_BOTTOM = MOD.media.bottomArt;
-local PLATE_RIGHT = MOD.media.rightArt;
-local PLATE_LEFT = MOD.media.leftArt;
-
-local DriverFrame = CreateFrame('Frame', 'SVUI_Nameplates_DriverFrame', UIParent)
-local UnitFrameMixin = {}
-local UnitBuffMixin = {}
-
-local path= "Interface\\Addons\\SVUI_NamePlates\\assets\\"
-
-local NPUseThreat = false;
-local NPThreatGS = 1;
-local NPThreatBS = 1;
-local NPReactTap = {0.3,0.3,0.3}
-local NPReactNPCGood = {0.31,0.45,0.63}
-local NPReactPlayerGood = {0.29,0.68,0.3}
-local NPReactNeutral = {0.85,0.77,0.36}
-local NPReactEnemy = {0.78,0.25,0.25}
---[[
-##########################################################
-COLORING THREAT/REACTIONS
-##########################################################
-]]--
-local CONFIG_THREAT_HOSTILE = { {0.29,0.68,0.3}, {0.85,0.77,0.36}, {0.94,0.6,0.06}, {0.78,0.25,0.25} };
-local CONFIG_THREAT_SCALE = { 1,1,1,1 };
-local PLATE_CLASS_COLORS = {};
-
-do
-	for classToken, colorData in pairs(RAID_CLASS_COLORS) do
-			PLATE_CLASS_COLORS[classToken] = {colorData.r, colorData.g, colorData.b}
-	end
-end
-
-local REACTION_COLORING = {
-	-- (1) PLAYER
-	function(token)
-		if(not token) then
-			return NPReactPlayerGood,NPThreatGS
-		else
-			return PLATE_CLASS_COLORS[token],NPThreatGS
-		end
-	end,
-	-- (2) TAPPED
-	function() return NPReactTap,NPThreatGS end,
-	-- (3) FRIENDLY
-	function() return NPReactNPCGood,NPThreatGS end,
-	-- (4) NEUTRAL
-	function(threatLevel)
-		local color,scale;
-		if((not threatLevel) or (not NPUseThreat) or (not InCombatLockdown())) then
-			color = NPReactNeutral
-			scale = NPThreatGS
-		else
-			color = CONFIG_THREAT_HOSTILE[threatLevel]
-			scale = CONFIG_THREAT_SCALE[threatLevel]
-		end
-		return color,scale
-	end,
-	-- (5) HOSTILE
-	function(threatLevel)
-		local color,scale;
-		if((not threatLevel) or (not NPUseThreat) or (not InCombatLockdown())) then
-			color = NPReactEnemy
-			scale = NPThreatGS
-		else
-			color = CONFIG_THREAT_HOSTILE[threatLevel]
-			scale = CONFIG_THREAT_SCALE[threatLevel]
-		end
-		return color,scale
-	end,
-};
-
-
-local config = {
-	Colors = {
-		Frame 	= { 0, 0, 0 },
-		Border   = { 0.5, 0.5, 0.4 },
-		Interrupt = { 0.5, 0.5, 0.4 },
-	},
-
-	IconTextures = {
-		White = path..'Border\\textureWhite',
-		Normal = path..'Border\\textureNormal',
-		Shadow = path..'Border\\textureShadow',
-	},
-
-	-- Nameplates
-	StatusbarTexture = SV.media.statusbar.default,
-	Font = SV.media.font.default,
-	FontSize = 10,
-
-	SuperStyled = false,
-
-	CombatHide = false,
-
-	friendlyConfig = {
-		useClassColors = false,
-		displaySelectionHighlight = true,
-		colorHealthBySelection = true,
-		considerSelectionInCombatAsHostile = true,
-		displayNameByPlayerNameRules = true,
-		colorHealthByRaidIcon = true,
-		displayName = true,
-		filter = "NONE",
-
-		castBarHeight = 8,
-		healthBarHeight = 4*2,
-
-		displayAggroHighlight = false,
-		displaySelectionHighlight = true,
-		--fadeOutOfRange = false,
-		--displayStatusText = true,
-		displayHealPrediction = true,
-		--displayDispelDebuffs = true,
-		colorNameBySelection = true,
-		colorNameWithExtendedColors = true,
-		colorHealthWithExtendedColors = true,
-		colorHealthBySelection = true,
-		considerSelectionInCombatAsHostile = true,
-		--smoothHealthUpdates = false,
-		displayNameWhenSelected = true,
-		displayNameByPlayerNameRules = true,
-	},
-
-	enemyConfig = {
-		useClassColors = true,
-		displayAggroHighlight = true,
-		--playLoseAggroHighlight = true,
-		displaySelectionHighlight = true,
-		colorHealthBySelection = true,
-		considerSelectionInCombatAsHostile = true,
-		displayNameByPlayerNameRules = true,
-		colorHealthByRaidIcon = true,
-		tankBorderColor = true,
-		castBarHeight = 8,
-		healthBarHeight = 4*2,
-		filter = "HARMFUL|INCLUDE_NAME_PLATE_ONLY",
-		displayName = true,
-		--fadeOutOfRange = false,
-		displayHealPrediction = true,
-		colorNameBySelection = true,
-		--smoothHealthUpdates = false,
-		displayNameWhenSelected = true,
-		greyOutWhenTapDenied = true,
-		--showClassificationIndicator = true,
-	},
-
-	playerConfig = {
-		displayHealPrediction = true,
-		filter = "HELPFUL",
-		useClassColors = true,
-		hideCastbar = true,
-		healthBarHeight = 4*2,
-		manaBarHeight = 4*2,
-
-		displaySelectionHighlight = false,
-		displayAggroHighlight = false,
-		displayName = false,
-		fadeOutOfRange = false,
-		colorNameBySelection = true,
-		smoothHealthUpdates = false,
-		displayNameWhenSelected = false,
-	},
-}
-
-MOD.config = config
-MOD.DriverFrame = DriverFrame
-MOD.UnitFrameMixin = UnitFrameMixin
-
-local BorderTex = path..'Border\\Plate.blp'
-local BorderTexGlow = path..'Border\\PlateGlow.blp'
-local MarkTex = path..'Border\\Mark.blp'
-local HighlightTex = path..'Border\\Highlight.blp'
-
-
-local TexCoord 		= {24/256, 186/256, 35/128, 59/128}
-local CbTexCoord 	= {24/256, 186/256, 59/128, 35/128}
-
-local GlowTexCoord 	= {15/256, 195/256, 21/128, 73/128}
-local CbGlowTexCoord= {15/256, 195/256, 73/128, 21/128}
-
-local HiTexCoord 	= {5/128, 105/128, 20/32, 26/32}
-
-local raidIconColor = {
-	[1] = {r = 1.0,  g = 0.92, b = 0,     },
-	[2] = {r = 0.98, g = 0.57, b = 0,     },
-	[3] = {r = 0.83, g = 0.22, b = 0.9,   },
-	[4] = {r = 0.04, g = 0.95, b = 0,     },
-	[5] = {r = 0.7,  g = 0.82, b = 0.875, },
-	[6] = {r = 0,    g = 0.71, b = 1,     },
-	[7] = {r = 1.0,  g = 0.24, b = 0.168, },
-	[8] = {r = 0.98, g = 0.98, b = 0.98,  },
-}
-
-local Backdrop = {
-	bgFile = 'Interface\\Buttons\\WHITE8x8',
-}
-
-local NPComboColor={
-	[1]={0.69,0.31,0.31},
-	[2]={0.69,0.31,0.31},
-	[3]={0.65,0.63,0.35},
-	[4]={0.65,0.63,0.35},
-	[5]={0.33,0.59,0.33},
-	[6]={0.22,0.79,0.22},
-	[7]={0.11,0.99,0.11},
-	[8]={0.11,0.99,0.11}
-}
-
-
---------
--- Utils
---------
-
-function MOD.GetPlateThreatReaction(plate)
-	if plate.aggroHighlight:IsShown() then
-		local r, g, b = plate.aggroHighlight:GetVertexColor()
-		local lastThreat = plate.reaction or 1
-		if g + b < 1 then
-			plate.reaction = 4
-			return 4
-		else
-			if lastThreat > 2 then
-				plate.reaction = 2
-				return 2
-			elseif lastThreat < 3 then
-				plate.reaction = 3
-				return 3
-			end
-		end
-	end
-	plate.reaction = 1
-	return 1
-end
-
-function MOD.GetPlateReaction(plate)
-	if plate.unit ~= nil then
-		local class, classToken, _, _, _, _, _ = GetPlayerInfoByGUID(UnitGUID(plate.unit))
-		if RAID_CLASS_COLORS[classToken] then
-			return REACTION_COLORING[1](classToken)
-		end
-	end
-
-	local oldR,oldG,oldB = plate.healthBar:GetStatusBarColor()
-	local r = floor(oldR * 100 + .5) * 0.01;
-	local g = floor(oldG * 100 + .5) * 0.01;
-	local b = floor(oldB * 100 + .5) * 0.01;
-	--print(plate.health:GetStatusBarColor())
-	for classToken, _ in pairs(RAID_CLASS_COLORS) do
-		local bb = b
-		if classToken == 'MONK' then
-			bb = bb - 0.01
-		end
-		if RAID_CLASS_COLORS[classToken].r == r and RAID_CLASS_COLORS[classToken].g == g and RAID_CLASS_COLORS[classToken].b == bb then
-			return REACTION_COLORING[1](classToken)
-		end
-	end
-
-	if(r + b < 0.25) then
-		return REACTION_COLORING[3]()
-	else
-		local threatReaction = MOD.GetPlateThreatReaction(plate)
-		if(r + g > 1.8) then
-			return REACTION_COLORING[4](threatReaction)
-		elseif(g + b < 0.25) then
-			return REACTION_COLORING[5](threatReaction)
-		elseif((r > 0.45 and r < 0.55) and (g > 0.45 and g < 0.55) and (b > 0.45 and b < 0.55)) then
-			REACTION_COLORING[2]()
-		else
-			REACTION_COLORING[1]()
-		end
-	end
-end
-
-function MOD.Colorize(plate)
-
-	local latestColor, scale = MOD.GetPlateReaction(plate);
-	local r,g,b
-	if(latestColor) then
-		r,g,b = unpack(latestColor)
-	else
-		r,g,b = plate.healthBar:GetStatusBarColor()
-	end
-	plate.healthBar:SetStatusBarColor(r,g,b)
-end
-
-function MOD.IsPlayerEffectivelyTank()
-	local assignedRole = UnitGroupRolesAssigned("player");
-	if ( assignedRole == "NONE" ) then
-		local spec = GetSpecialization();
-		return spec and GetSpecializationRole(spec) == "TANK";
-	end
-
-	return assignedRole == "TANK";
-end
-
-local scanner = CreateFrame("GameTooltip", "SVUI_NameplatesScanner", nil, "GameTooltipTemplate")
-local questtipLine = setmetatable({}, { __index = function(k, i)
-	local line = _G["SVUI_NameplatesScannerTextLeft" .. i]
-	if line then rawset(k, i, line) end
-	return line
-end })
-
-function MOD.IsEliteUnit(namePlateUnitToken)
-	local isElite = false
-	if not UnitIsUnit('player', namePlateUnitToken) and not UnitIsFriend('player', namePlateUnitToken) then
-		if 	(UnitClassification(namePlateUnitToken) == "worldboss" or UnitLevel(namePlateUnitToken) == -1 or
-			UnitClassification(namePlateUnitToken) == "rare" or UnitClassification(namePlateUnitToken) =="rareelite" or
-			UnitClassification(namePlateUnitToken) == "elite") then
-			isElite = true
-		end
-	end
-	return isElite
-end
-
-function MOD.GetUnitQuestInfo(namePlateUnitToken)
-	if not namePlateUnitToken or UnitIsPlayer(namePlateUnitToken) then
-		return false
-	end
-
-	local is_quest
-	local num_left = 0
-
-	scanner:SetOwner(UIParent, "ANCHOR_NONE")
-	scanner:SetUnit(namePlateUnitToken)
-
-	for i = 3, scanner:NumLines() do
-		local str = questtipLine[i]
-		if (not str) then break; end
-		local r,g,b = str:GetTextColor()
-		if (r > .99) and (g > .82) and (g < .83) and (b < .01) then -- quest title (yellow)
-			is_quest = true
-		else
-			local done, total = str:GetText():match('(%d+)/(%d+)')  -- kill objective
-			if (done and total) then
-				local left = total - done
-				if (left > num_left) then
-					num_left = left
-				end
-			end
-		end
-	end
-	return is_quest, num_left
-end
-
-function MOD.CreatePlateBorder(plate)
-
-	plate.bordertop = plate:CreateTexture(nil, "BORDER")
-	plate.bordertop:SetPoint("TOPLEFT", plate, "TOPLEFT", -2, 2)
-	plate.bordertop:SetPoint("TOPRIGHT", plate, "TOPRIGHT", 2, 2)
-	plate.bordertop:SetHeight(2)
-	plate.bordertop:SetColorTexture(0,0,0)
-	plate.bordertop:SetDrawLayer("BORDER", 1)
-
-	plate.borderbottom = plate:CreateTexture(nil, "BORDER")
-	plate.borderbottom:SetPoint("BOTTOMLEFT", plate, "BOTTOMLEFT", -2, -2)
-	plate.borderbottom:SetPoint("BOTTOMRIGHT", plate, "BOTTOMRIGHT", 2, -2)
-	plate.borderbottom:SetHeight(2)
-	plate.borderbottom:SetColorTexture(0,0,0)
-	plate.borderbottom:SetDrawLayer("BORDER", 1)
-
-	plate.borderleft = plate:CreateTexture(nil, "BORDER")
-	plate.borderleft:SetPoint("TOPLEFT", plate, "TOPLEFT", -2, 2)
-	plate.borderleft:SetPoint("BOTTOMLEFT", plate, "BOTTOMLEFT", 2, -2)
-	plate.borderleft:SetWidth(2)
-	plate.borderleft:SetColorTexture(0,0,0)
-	plate.borderleft:SetDrawLayer("BORDER", 1)
-
-	plate.borderright = plate:CreateTexture(nil, "BORDER")
-	plate.borderright:SetPoint("TOPRIGHT", plate, "TOPRIGHT", 2, 2)
-	plate.borderright:SetPoint("BOTTOMRIGHT", plate, "BOTTOMRIGHT", -2, -2)
-	plate.borderright:SetWidth(2)
-	plate.borderright:SetColorTexture(0,0,0)
-	plate.borderright:SetDrawLayer("BORDER", 1)
-
-	if(not plate.eliteborder) then
-		plate.eliteborder = CreateFrame("Frame", nil, plate)
-		plate.eliteborder:SetAllPoints(plate)
-		plate.eliteborder:SetFrameStrata("BACKGROUND")
-		plate.eliteborder:SetFrameLevel(0)
-
-		plate.eliteborder.top = plate.eliteborder:CreateTexture(nil, "BACKGROUND")
-		plate.eliteborder.top:SetPoint("BOTTOMLEFT", plate.eliteborder, "TOPLEFT", 0, 0)
-		plate.eliteborder.top:SetPoint("BOTTOMRIGHT", plate.eliteborder, "TOPRIGHT", 0, 0)
-		plate.eliteborder.top:SetHeight(22)
-		plate.eliteborder.top:SetTexture(PLATE_TOP)
-		plate.eliteborder.top:SetVertexColor(1, 1, 0)
-		plate.eliteborder.top:SetBlendMode("BLEND")
-
-		plate.eliteborder.bottom = plate.eliteborder:CreateTexture(nil, "BACKGROUND")
-		plate.eliteborder.bottom:SetPoint("TOPLEFT", plate.eliteborder, "BOTTOMLEFT", 0, 0)
-		plate.eliteborder.bottom:SetPoint("TOPRIGHT", plate.eliteborder, "BOTTOMRIGHT", 0, 0)
-		plate.eliteborder.bottom:SetHeight(32)
-		plate.eliteborder.bottom:SetTexture(PLATE_BOTTOM)
-		plate.eliteborder.bottom:SetVertexColor(1, 1, 0)
-		plate.eliteborder.bottom:SetBlendMode("BLEND")
-
-		plate.eliteborder.right = plate.eliteborder:CreateTexture(nil, "BACKGROUND")
-		plate.eliteborder.right:SetPoint("TOPLEFT", plate.eliteborder, "TOPRIGHT", 0, 0)
-		plate.eliteborder.right:SetPoint("BOTTOMLEFT", plate.eliteborder, "BOTTOMRIGHT", 0, 0)
-		plate.eliteborder.right:SetWidth(plate:GetHeight() * 4)
-		plate.eliteborder.right:SetTexture(PLATE_RIGHT)
-		plate.eliteborder.right:SetVertexColor(1, 1, 0)
-		plate.eliteborder.right:SetBlendMode("BLEND")
-
-		plate.eliteborder.left = plate.eliteborder:CreateTexture(nil, "BACKGROUND")
-		plate.eliteborder.left:SetPoint("TOPRIGHT", plate.eliteborder, "TOPLEFT", 0, 0)
-		plate.eliteborder.left:SetPoint("BOTTOMRIGHT", plate.eliteborder, "BOTTOMLEFT", 0, 0)
-		plate.eliteborder.left:SetWidth(plate:GetHeight() * 4)
-		plate.eliteborder.left:SetTexture(PLATE_LEFT)
-		plate.eliteborder.left:SetVertexColor(1, 1, 0)
-		plate.eliteborder.left:SetBlendMode("BLEND")
-
-		plate.eliteborder:SetAlpha(0.35)
-
-		plate.eliteborder:Hide()
-	end
-
-end
-
-
-function MOD:ComboToggle()
-	if(config.ComboPoints) then
-		config.ComboPoints = false
-		SetCVar("nameplateResourceOnTarget", 0)
-	else
-		config.ComboPoints = true
-		SetCVar("nameplateResourceOnTarget", 1)
-	end
-	DriverFrame:UpdateComboPointsBar()
-end
-
-function MOD:CombatToggle()
-	if(config.CombatHide) then
-		config.CombatHide = false
-		SetCVar("nameplateShowEnemies", 0)
-	else
-		config.CombatHide = true
-		SetCVar("nameplateShowEnemies", 1)
-	end
-end
-
-function MOD:UpdateAllPlates()
-	self:UpdateLocals()
-	DriverFrame:UpdateNamePlateOptions()
-end
-
-function MOD:UpdateLocals()
-	local db = SV.db.NamePlates
-	if not db then return end
-
-	config.StatusbarTexture = LSM:Fetch("statusbar", db.barTexture);
-
-	config.CombatHide = db.combatHide;
-	config.ComboPoimts = db.comboPoints;
-
-	config.SuperStyled = db.themed;
-
-	config.friendlyConfig.healthBarHeight = db.healthBar.height;
-	config.enemyConfig.healthBarHeight = db.healthBar.height;
-	config.playerConfig.healthBarHeight = db.healthBar.height;
-
-
-	config.friendlyConfig.castBarHeight = db.castBar.height;
-	config.enemyConfig.castBarHeight = db.castBar.height;
-	config.playerConfig.manaBarHeight = db.castBar.height;
-
-end
-
-function MOD:Load()
-	self:UpdateLocals();
-	DriverFrame:SetScript('OnEvent', DriverFrame.OnEvent)
-	DriverFrame:RegisterEvent'PLAYER_ENTERING_WORLD'
-end
--------
---  DriverFrame
-------
-
-function DriverFrame:OnEvent(event, ...)
-
-	if event == 'PLAYER_ENTERING_WORLD' then
-		self:OnLoad();
-	elseif (event == 'NAME_PLATE_CREATED') then
-		local namePlateFrameBase = ...
-		self:OnNamePlateCreated(namePlateFrameBase)
-	elseif (event == 'NAME_PLATE_UNIT_ADDED') then
-		local namePlateUnitToken = ...
-		self:OnNamePlateAdded(namePlateUnitToken)
-	elseif (event == 'NAME_PLATE_UNIT_REMOVED') then
-		local namePlateUnitToken = ...
-		self:OnNamePlateRemoved(namePlateUnitToken)
-	elseif event == 'PLAYER_TARGET_CHANGED' then
-		self:OnTargetChanged();
-	elseif event == 'DISPLAY_SIZE_CHANGED' then -- resolution change
-		self:UpdateNamePlateOptions()
-	elseif event == "CVAR_UPDATE" then
-		local name = ...;
-		if name == "SHOW_CLASS_COLOR_IN_V_KEY" or name == "SHOW_NAMEPLATE_LOSE_AGGRO_FLASH" then
-			self:UpdateNamePlateOptions();
-		end
-	elseif event == 'UPDATE_MOUSEOVER_UNIT' then
-		self:UpdateMouseOver()
-	elseif event == 'UNIT_FACTION' then
-		self:OnUnitFactionChanged(...)
-	elseif event == 'RAID_TARGET_UPDATE' then
-		self:OnRaidTargetUpdate()
-	elseif event == 'QUEST_LOG_UPDATE' then
-		self:OnQuestLogUpdate()
-	end
-end
-
-function DriverFrame:DisableBlizzard()
-	NamePlateDriverFrame:UnregisterAllEvents()
-	NamePlateDriverFrame:Hide()
-
-	NamePlateDriverFrame.UpdateNamePlateOptions = function()
-		DriverFrame:UpdateNamePlateOptions()
-	end
-end
-
-function DriverFrame:OnLoad()
-
-	self:DisableBlizzard()
-
-	self:RegisterEvent'NAME_PLATE_CREATED'
-	self:RegisterEvent'NAME_PLATE_UNIT_ADDED'
-	self:RegisterEvent'NAME_PLATE_UNIT_REMOVED'
-
-	self:RegisterEvent'PLAYER_TARGET_CHANGED'
-
-	self:RegisterEvent'DISPLAY_SIZE_CHANGED' -- Resolution change
-	self:RegisterEvent'CVAR_UPDATE'
-
-	self:RegisterEvent'UPDATE_MOUSEOVER_UNIT'
-	self:RegisterEvent'UNIT_FACTION'
-
-	self:RegisterEvent'RAID_TARGET_UPDATE'
-	self:RegisterEvent'QUEST_LOG_UPDATE'
-	self:UpdateNamePlateOptions();
-
-end
-
-function DriverFrame:UpdateNamePlateOptions()
-	self.baseNamePlateWidth = 110;
-	self.baseNamePlateHeight = 45;
-
-	local namePlateVerticalScale = tonumber(GetCVar("NamePlateVerticalScale"));
-	local horizontalScale = tonumber(GetCVar("NamePlateHorizontalScale"));
-	C_NamePlate.SetNamePlateOtherSize(self.baseNamePlateWidth * horizontalScale, self.baseNamePlateHeight);
-	C_NamePlate.SetNamePlateSelfSize(self.baseNamePlateWidth * horizontalScale, self.baseNamePlateHeight);
-
-
-	for i, frame in ipairs(C_NamePlate.GetNamePlates()) do
-		frame.UnitFrame:ApplyFrameOptions(frame.UnitFrame.unit);
-		frame.UnitFrame:UpdateAllElements()
-	end
-
-	self:UpdateClassResourceBar()
-	self:UpdateManaBar()
-	self:UpdateComboPointsBar()
-end
-
-function DriverFrame:OnNamePlateCreated(nameplate)
-	local f = CreateFrame('Button', nameplate:GetName()..'UnitFrame', nameplate)
-	f:SetAllPoints(nameplate)
-	f:Show()
-	Mixin(f, UnitFrameMixin)
-	f:Create(nameplate)
-	f:EnableMouse(false)
-
-	nameplate.UnitFrame = f
-end
-
-function DriverFrame:OnNamePlateAdded(namePlateUnitToken)
-	local nameplate = C_NamePlate.GetNamePlateForUnit(namePlateUnitToken)
-	nameplate.UnitFrame:ApplyFrameOptions(namePlateUnitToken)
-	nameplate.UnitFrame:OnAdded(namePlateUnitToken)
-	nameplate.UnitFrame:UpdateAllElements()
-
-	self:UpdateClassResourceBar()
-	self:UpdateManaBar()
-	self:UpdateComboPointsBar()
-end
-
-function DriverFrame:OnNamePlateRemoved(namePlateUnitToken)
-	local nameplate = C_NamePlate.GetNamePlateForUnit(namePlateUnitToken)
-	nameplate.UnitFrame:OnAdded(nil)
-end
-
-function DriverFrame:OnTargetChanged()
-	local nameplate = C_NamePlate.GetNamePlateForUnit'target'
-	if nameplate then
-		if nameplate.UnitFrame then nameplate.UnitFrame:OnUnitAuraUpdate() end
-	end
-
-	self:UpdateClassResourceBar()
-	self:UpdateManaBar()
-	self:UpdateComboPointsBar()
-end
-
-function DriverFrame:OnRaidTargetUpdate()
-	for _, frame in pairs(C_NamePlate.GetNamePlates()) do
-		frame.UnitFrame:UpdateRaidTarget()
-		CompactUnitFrame_UpdateHealthColor(frame.UnitFrame)
-	end
-end
-
-function DriverFrame:OnUnitFactionChanged(unit)
-	local nameplate = C_NamePlate.GetNamePlateForUnit(unit);
-	if (nameplate) then
-		CompactUnitFrame_UpdateName(nameplate.UnitFrame);
-		CompactUnitFrame_UpdateHealthColor(nameplate.UnitFrame);
-	end
-end
-
-function DriverFrame:OnQuestLogUpdate()
-	for _, frame in pairs(C_NamePlate.GetNamePlates()) do
-		frame.UnitFrame:UpdateQuestVisuals()
-	end
-end
-
-local mouseoverframe -- if theres a better way im all ears
-function DriverFrame:OnUpdate(elapsed)
-	local nameplate = C_NamePlate.GetNamePlateForUnit('mouseover')
-	if not nameplate or nameplate ~= mouseoverframe then
-		mouseoverframe.UnitFrame.hoverHighlight:Hide()
-		mouseoverframe = nil
-		self:SetScript('OnUpdate', nil)
-	end
-end
-
-function DriverFrame:UpdateMouseOver()
-	local nameplate = C_NamePlate.GetNamePlateForUnit('mouseover')
-
-	if mouseoverframe == nameplate then
-		return
-	elseif mouseoverframe then
-		mouseoverframe.UnitFrame.hoverHighlight:Hide()
-		self:SetScript('OnUpdate', nil)
-	end
-
-	if nameplate then
-		nameplate.UnitFrame.hoverHighlight:Show()
-		mouseoverframe = nameplate
-		self:SetScript('OnUpdate', self.OnUpdate) --onupdate until mouse leaves frame
-	end
-end
-
--------------------------
---	Class Resource bar
--------------------------
-
-function DriverFrame:UpdateClassResourceBar()
-	local classResourceBar = NamePlateDriverFrame.nameplateBar;
-	if ( not classResourceBar ) then
-		return;
-	end
-	classResourceBar:Hide();
-
-	local showSelf = GetCVar("nameplateShowSelf");
-	if ( showSelf == "0" ) then
-		return;
-	end
-
-	local targetMode = GetCVarBool("nameplateResourceOnTarget");
-	if (classResourceBar.overrideTargetMode ~= nil) then
-		targetMode = classResourceBar.overrideTargetMode;
-	end
-
-	if ( targetMode ) then
-		local namePlateTarget = C_NamePlate.GetNamePlateForUnit("target");
-		if ( namePlateTarget ) then
-			classResourceBar:SetParent(NamePlateTargetResourceFrame);
-			NamePlateTargetResourceFrame:SetParent(namePlateTarget.UnitFrame);
-			NamePlateTargetResourceFrame:ClearAllPoints();
-			NamePlateTargetResourceFrame:SetPoint("BOTTOM", namePlateTarget.UnitFrame.name, "TOP", 0, 9);
-			classResourceBar:Show();
-		end
-		NamePlateTargetResourceFrame:SetShown(namePlateTarget ~= nil);
-	elseif ( not targetMode ) then
-		local namePlatePlayer = C_NamePlate.GetNamePlateForUnit("player");
-		if ( namePlatePlayer ) then
-			classResourceBar:SetParent(NamePlatePlayerResourceFrame);
-			NamePlatePlayerResourceFrame:SetParent(namePlatePlayer.UnitFrame);
-			NamePlatePlayerResourceFrame:ClearAllPoints();
-			--NamePlatePlayerResourceFrame:SetPoint("TOP",ClassNameplateManaBarFrame, "BOTTOM", 0, -3);
-			classResourceBar:Show();
-		end
-		NamePlatePlayerResourceFrame:SetShown(namePlatePlayer ~= nil);
-	end
-end
-
--------------------------
---	Class Mana Bar
--------------------------
-
-local manabar = ClassNameplateManaBarFrame
-manabar:SetStatusBarTexture(config.StatusbarTexture, 'BACKGROUND', 1)
-manabar:SetBackdrop(Backdrop)
-manabar:SetBackdropColor(0, 0, 0, .8)
-manabar.Border:Hide()
-
-manabar.FeedbackFrame.BarTexture:SetTexture(config.StatusbarTexture)
-
-manabar.border = manabar:CreateTexture(nil, 'ARTWORK', nil, 2)
--- manabar.border:SetTexture(BorderTex)
--- manabar.border:SetTexCoord(unpack(TexCoord))
-MOD.CreatePlateBorder(manabar)
-manabar.border:SetPoint('TOPLEFT', manabar, -4, 6)
-manabar.border:SetPoint('BOTTOMRIGHT', manabar, 4, -6)
-manabar.border:SetVertexColor(unpack(config.Colors.Frame))
-manabar:SetFrameLevel(90)
-
-function ClassNameplateManaBarFrame:OnOptionsUpdated()
-	local width, height = C_NamePlate.GetNamePlateSelfSize();
-	self:SetHeight(config.playerConfig.manaBarHeight);
-	self:SetStatusBarTexture(config.StatusbarTexture, 'BACKGROUND', 1)
-end
-
-
--------------------------
---	Class ComboPoints Bar
--------------------------
-local comboBar = nil
-
-local _, myclass = UnitClass("player")
-if (myclass == "ROGUE" or myclass=="DRUID") then
-	comboBar=ClassNameplateBarRogueDruidFrame
-	comboBar:SetSize(68, 1)
-	comboBar:SetFrameStrata("HIGH")
-	comboBar:SetFrameLevel(50) -- Make sure it's always on top, even over castBar...
-
-	for i = 1, #comboBar.ComboPoints do
-		comboBar.ComboPoints[i].Background:SetTexture(nil)
-		comboBar.ComboPoints[i].Point:SetTexture(MOD.media.comboIcon)
-		comboBar.ComboPoints[i].Point:SetSize(12, 12)
-		comboBar.ComboPoints[i].Point:SetVertexColor(unpack(NPComboColor[i]))
-		comboBar.ComboPoints[i]:SetFrameLevel(49)
-	end
-end
-
-function DriverFrame:UpdateComboPointsBar()
-	if ( not comboBar ) then
-		return;
-	end
-
-	local targetMode = GetCVarBool("nameplateResourceOnTarget");
-
-	local showSelf = GetCVar("nameplateShowSelf");
-	if (not targetMode and showSelf == "0") then
-		return;
-	end
-	local h = nil
-	if ( targetMode ) then
-		local namePlateTarget = C_NamePlate.GetNamePlateForUnit("target");
-		if ( namePlateTarget ) then
-			h = namePlateTarget.UnitFrame.healthBar;
-		end
-	elseif ( not targetMode ) then
-		local namePlatePlayer = C_NamePlate.GetNamePlateForUnit("player");
-		if ( namePlatePlayer ) then
-			h = namePlatePlayer.UnitFrame.healthBar;
-		end
-	end
-	if (h) then
-		comboBar:ClearAllPoints()
-		comboBar:SetPoint("CENTER", h, "CENTER",0,0)
-		comboBar:SetSize(68, 1)
-		comboBar:SetFrameStrata("HIGH")
-		comboBar:SetFrameLevel(50)
-	end
-end
-
-function DriverFrame:UpdateManaBar()
-	manabar:Hide()
-
-	local showSelf = GetCVar("nameplateShowSelf");
-	if ( showSelf == "0" ) then
-		return;
-	end
-
-	local namePlatePlayer = C_NamePlate.GetNamePlateForUnit("player");
-	if ( namePlatePlayer ) then
-		manabar:SetParent(namePlatePlayer);
-		manabar:ClearAllPoints();
-		manabar:SetPoint("TOPLEFT", namePlatePlayer.UnitFrame.healthBar, "BOTTOMLEFT", 0, -6);
-		manabar:SetPoint("TOPRIGHT", namePlatePlayer.UnitFrame.healthBar, "BOTTOMRIGHT", 0, -6);
-		manabar:Show();
-	end
-end
-
-------------------------
---	Nameplate
-------------------------
-
-function UnitFrameMixin:Create(unitframe)
-	-- Healthbar
-	local h = CreateFrame('Statusbar', '$parentHealthBar', unitframe)
-	self.healthBar = h
-	h:SetFrameLevel(90)
-    h:SetStatusBarTexture(config.StatusbarTexture, 'BACKGROUND', 1)
-	h:SetBackdrop(Backdrop)
-	h:SetBackdropColor(0, 0, 0, .8)
-
-	-- 	Healthbar textures --blizzard capital letters policy
-	self.myHealPrediction = h:CreateTexture(nil, 'BORDER', nil, 5)
-	self.myHealPrediction:SetVertexColor(0.0, 0.659, 0.608)
-	self.myHealPrediction:SetTexture[[Interface\TargetingFrame\UI-TargetingFrame-BarFill]]
-
-	self.otherHealPrediction = h:CreateTexture(nil, 'ARTWORK', nil, 5)
-	self.otherHealPrediction:SetVertexColor(0.0, 0.659, 0.608)
-	self.otherHealPrediction:SetTexture[[Interface\TargetingFrame\UI-TargetingFrame-BarFill]]
-
-	self.totalAbsorb = h:CreateTexture(nil, 'ARTWORK', nil, 5)
-	self.totalAbsorb:SetTexture[[Interface\RaidFrame\Shield-Fill]]
-	--
-	self.totalAbsorbOverlay = h:CreateTexture(nil, 'BORDER', nil, 6)
-	self.totalAbsorbOverlay:SetTexture([[Interface\RaidFrame\Shield-Overlay]], true, true);	--Tile both vertically and horizontally
-	self.totalAbsorbOverlay:SetAllPoints(self.totalAbsorb);
-	self.totalAbsorbOverlay.tileSize = 20;
-	--
-	self.myHealAbsorb = h:CreateTexture(nil, 'ARTWORK', nil, 1)
-	self.myHealAbsorb:SetTexture([[Interface\RaidFrame\Absorb-Fill]], true, true)
-
-	self.myHealAbsorbLeftShadow = h:CreateTexture(nil, 'ARTWORK', nil, 1)
-	self.myHealAbsorbLeftShadow:SetTexture[[Interface\RaidFrame\Absorb-Edge]]
-
-	self.myHealAbsorbRightShadow = h:CreateTexture(nil, 'ARTWORK', nil, 1)
-	self.myHealAbsorbRightShadow:SetTexture[[Interface\RaidFrame\Absorb-Edge]]
-	self.myHealAbsorbRightShadow:SetTexCoord(1, 0, 0, 1)
-	--
-	h.border = h:CreateTexture(nil, 'ARTWORK', nil, 2)
-
-	MOD.CreatePlateBorder(h)
-
-	h.border:SetVertexColor(unpack(config.Colors.Frame))
-
-	self.level = h:CreateFontString(nil, 'OVERLAY',"SVUI_Font_NamePlate_Number")
-	self.level:SetPoint("RIGHT", h, "RIGHT", 2, 0)
-	self.level:SetJustifyH("RIGHT")
-
-	--
-	self.overAbsorbGlow = h:CreateTexture(nil, 'ARTWORK', nil, 3)
-	self.overAbsorbGlow:SetTexture[[Interface\RaidFrame\Shield-Overshield]]
-	self.overAbsorbGlow:SetBlendMode'ADD'
-	self.overAbsorbGlow:SetPoint('BOTTOMLEFT', h, 'BOTTOMRIGHT', -4, -1)
-	self.overAbsorbGlow:SetPoint('TOPLEFT', h, 'TOPRIGHT', -4, 1)
-	self.overAbsorbGlow:SetWidth(8);
-
-	self.overHealAbsorbGlow = h:CreateTexture(nil, 'ARTWORK', nil, 3)
-	self.overHealAbsorbGlow:SetTexture[[Interface\RaidFrame\Absorb-Overabsorb]]
-	self.overHealAbsorbGlow:SetBlendMode'ADD'
-	self.overHealAbsorbGlow:SetPoint('BOTTOMRIGHT', h, 'BOTTOMLEFT', 2, -1)
-	self.overHealAbsorbGlow:SetPoint('TOPRIGHT', h, 'TOPLEFT', 2, 1)
-	self.overHealAbsorbGlow:SetWidth(8);
-
-	-- Castbar
-	local c = CreateFrame('StatusBar', '$parentCastBar', nameplate)
-	do
-		self.castBar = c
-		c:SetFrameLevel(90)
-		c:Hide()
-		c:SetStatusBarTexture(config.StatusbarTexture, 'BACKGROUND', 1)
-		c:SetBackdrop(Backdrop)
-		c:SetBackdropColor(0, 0, 0, .5)
-
-		--		Castbar textures
-		c.border = c:CreateTexture(nil, 'ARTWORK', nil, 0)
-		--c.border:SetTexCoord(unpack(CbTexCoord))
-		-- c.border:SetTexture(BorderTex)
-		-- c.border:SetPoint('TOPLEFT', c, -4, 6)
-		-- c.border:SetPoint('BOTTOMRIGHT', c, 4, -6)
-		MOD.CreatePlateBorder(c)
-		c.border:SetVertexColor(unpack(config.Colors.Frame))
-
-		c.BorderShield = c:CreateTexture(nil, 'ARTWORK', nil, 1)
-		c.BorderShield:SetTexture(MarkTex)
-		c.BorderShield:SetTexCoord(unpack(CbTexCoord))
-		c.BorderShield:SetAllPoints(c.border)
-		c.BorderShield:SetBlendMode'ADD'
-		c.BorderShield:SetVertexColor(1, .9, 0, 0.7)
-		CastingBarFrame_AddWidgetForFade(c, c.BorderShield)
-
-		c.Text = c:CreateFontString(nil, 'OVERLAY', "SVUI_Font_NamePlate")
-		c.Text:SetPoint('CENTER', c, 0, 0)
-		c.Text:SetPoint('LEFT', c, 0, 0)
-		c.Text:SetPoint('RIGHT', c, 0, 0)
-		--c.Text:SetFont(config.Font, config.FontSize, 'THINOUTLINE')
-		c.Text:SetShadowColor(0, 0, 0, 0)
-
-		c.Icon = c:CreateTexture(nil, 'OVERLAY', nil, 1)
-		c.Icon:SetTexCoord(.1, .9, .1, .9)
-		c.Icon:SetPoint('BOTTOMRIGHT', c, 'BOTTOMLEFT', -7, 0)
-		c.Icon:SetPoint('TOPRIGHT', h, 'TOPLEFT', -7, 0)
-		CastingBarFrame_AddWidgetForFade(c, c.Icon)
-
-		c.IconBorder = c:CreateTexture(nil, 'OVERLAY', nil, 2)
-		c.IconBorder:SetTexture(config.IconTextures.Normal)
-		c.IconBorder:SetVertexColor(unpack(config.Colors.Border))
-		c.IconBorder:SetPoint('TOPRIGHT', c.Icon, 2, 2)
-		c.IconBorder:SetPoint('BOTTOMLEFT', c.Icon, -2, -2)
-		CastingBarFrame_AddWidgetForFade(c, c.IconBorder)
-
-		c.Spark = c:CreateTexture(nil, 'OVERLAY', nil, 2)
-		c.Spark:SetTexture[[Interface\CastingBar\UI-CastingBar-Spark]]
-		c.Spark:SetBlendMode'ADD'
-		c.Spark:SetSize(16,16)
-		c.Spark:SetPoint('CENTER', c, 0, 0)
-
-		c.Flash = c:CreateTexture(nil, 'OVERLAY', nil, 2)
-		c.Flash:SetTexture(config.StatusbarTexture)
-		c.Flash:SetBlendMode'ADD'
-
-		c:SetScript('OnEvent', CastingBarFrame_OnEvent)
-		c:SetScript('OnUpdate',CastingBarFrame_OnUpdate)
-		c:SetScript('OnShow', CastingBarFrame_OnShow)
-		CastingBarFrame_OnLoad(c, nil, false, true);
-		--CastingBarFrame_SetNonInterruptibleCastColor(c, 0.7, 0.7, 0.7)
-	end
-
-	self.raidTargetIcon = h:CreateTexture(nil, 'OVERLAY', nil)
-	self.raidTargetIcon:SetSize(18,18)
-	self.raidTargetIcon:SetPoint('LEFT', h, 'RIGHT', 4, 1)
-	self.raidTargetIcon:SetTexture[[Interface\TargetingFrame\UI-RaidTargetingIcons]]
-
-	self.name = h:CreateFontString(nil, 'ARTWORK', "SVUI_Font_NamePlate")
-	self.name:SetPoint('BOTTOM', h, 'TOP', 0, 4)
-	self.name:SetWordWrap(false)
-	self.name:SetJustifyH'CENTER'
-	--self.name:SetFont(config.Font, config.FontSize, 'THINOUTLINE')
-
-	self.aggroHighlight = h:CreateTexture(nil, 'BORDER', nil, 4)
-	self.aggroHighlight:SetTexture(BorderTexGlow)
-	self.aggroHighlight:SetTexCoord(unpack(GlowTexCoord))
-	self.aggroHighlight:SetPoint('TOPLEFT', h.border, -7, 15)
-	self.aggroHighlight:SetPoint('BOTTOMRIGHT', h.border, 7, -15)
-	self.aggroHighlight:SetAlpha(.7)
-	self.aggroHighlight:Hide()
-
-	self.hoverHighlight = h:CreateTexture(nil, 'ARTWORK', nil, 1)
-	self.hoverHighlight:SetTexture(HighlightTex)
-	self.hoverHighlight:SetAllPoints(h)
-	self.hoverHighlight:SetVertexColor(1, 1, 1)
-	self.hoverHighlight:SetBlendMode('ADD')
-	self.hoverHighlight:SetTexCoord(unpack(HiTexCoord))
-	self.hoverHighlight:Hide()
-
-	self.selectionHighlight = h:CreateTexture(nil, 'ARTWORK', nil, 4)
-	self.selectionHighlight:SetTexture(MarkTex)
-	self.selectionHighlight:SetTexCoord(unpack(TexCoord))
-	self.selectionHighlight:SetAllPoints(h.border)
-	self.selectionHighlight:SetBlendMode('ADD')
-	self.selectionHighlight:SetVertexColor(.8, .8, 1, .7)
-	self.selectionHighlight:Hide()
-
-	self.BuffFrame = CreateFrame('StatusBar', '$parentBuffFrame', self, 'HorizontalLayoutFrame')
-	Mixin(self.BuffFrame, NameplateBuffContainerMixin)
-	self.BuffFrame:SetPoint('LEFT', self.healthBar, -1, 0)
-	self.BuffFrame.spacing = 4
-	self.BuffFrame.fixedHeight = 14
-	self.BuffFrame:SetScript('OnEvent', self.BuffFrame.OnEvent)
-	self.BuffFrame:SetScript('OnUpdate', self.BuffFrame.OnUpdate)
-	self.BuffFrame:OnLoad()
-
-	-- Quest
-	self.questIcon = self:CreateTexture(nil, nil, nil, 0)
-	self.questIcon:SetSize(12, 12)
-
-	self.questIcon:SetTexture(path..'QUEST-BG-ICON.blp')
-	self.questIcon:SetPoint('LEFT', h, 'RIGHT', 2, 0)
-
-	self.questText = self:CreateFontString(nil, nil, "SVUI_Font_NamePlate_Number")
-	self.questText:SetPoint('CENTER', self.questIcon, 0, 0)
-	self.questText:SetShadowOffset(1, -1)
-	self.questText:SetTextColor(1,.82,0)
-
-
-
-end
-
-function UnitFrameMixin:ApplyFrameOptions(namePlateUnitToken)
-	if UnitIsUnit('player', namePlateUnitToken) then
-		self.optionTable = config.playerConfig
-		self.healthBar:SetPoint('LEFT', self, 'LEFT', 12, 5);
-		self.healthBar:SetPoint('RIGHT', self, 'RIGHT', -12, 5);
-		self.healthBar:SetHeight(self.optionTable.healthBarHeight);
-		self.healthBar.eliteborder:Hide()
-	else
-
-		if UnitIsFriend('player', namePlateUnitToken) then
-			self.optionTable = config.friendlyConfig
-		else
-			self.optionTable = config.enemyConfig
-		end
-
-		self.castBar:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', 12, 6);
-		self.castBar:SetPoint('BOTTOMRIGHT', self, 'BOTTOMRIGHT', -12, 6);
-		self.castBar:SetHeight(self.optionTable.castBarHeight);
-		self.castBar.Icon:SetWidth(self.optionTable.castBarHeight + self.optionTable.healthBarHeight + 6)
-
-		self.healthBar:SetPoint('BOTTOMLEFT', self.castBar, 'TOPLEFT', 0, 6);
-		self.healthBar:SetPoint('BOTTOMRIGHT', self.castBar, 'TOPRIGHT', 0, 6);
-		self.healthBar:SetHeight(self.optionTable.healthBarHeight);
-	end
-end
-
-function UnitFrameMixin:OnAdded(namePlateUnitToken)
-	self.unit = namePlateUnitToken
-	self.displayedUnit = namePlateUnitToken
-	self.inVehicle = false;
-
-	if namePlateUnitToken then
-		self:RegisterEvents()
-	else
-		self:UnregisterEvents()
-	end
-
-	if self.castBar then
-		if namePlateUnitToken and (not self.optionTable.hideCastbar) then
-			CastingBarFrame_SetUnit(self.castBar, namePlateUnitToken, false, true);
-		else
-			CastingBarFrame_SetUnit(self.castBar, nil, nil, nil);
-		end
-	end
-end
-
-function UnitFrameMixin:RegisterEvents()
-	self:RegisterEvent'UNIT_NAME_UPDATE'
-	self:RegisterEvent'PLAYER_TARGET_CHANGED'
-
-	self:RegisterEvent'UNIT_ENTERED_VEHICLE'
-	self:RegisterEvent'UNIT_EXITED_VEHICLE'
-	self:RegisterEvent'UNIT_PET'
-
-	self:UpdateUnitEvents();
-	self:SetScript('OnEvent', self.OnEvent);
-end
-
-function UnitFrameMixin:UpdateUnitEvents()
-	local unit = self.unit;
-	local displayedUnit;
-	if ( unit ~= self.displayedUnit ) then
-		displayedUnit = self.displayedUnit;
-	end
-	self:RegisterUnitEvent('UNIT_MAXHEALTH', unit, displayedUnit);
-	self:RegisterUnitEvent('UNIT_HEALTH', unit, displayedUnit);
-	self:RegisterUnitEvent('UNIT_HEALTH_FREQUENT', unit, displayedUnit);
-
-	self:RegisterUnitEvent('UNIT_AURA', unit, displayedUnit);
-	self:RegisterUnitEvent('UNIT_THREAT_SITUATION_UPDATE', unit, displayedUnit);
-	self:RegisterUnitEvent('UNIT_THREAT_LIST_UPDATE', unit, displayedUnit);
-	self:RegisterUnitEvent('UNIT_HEAL_PREDICTION', unit, displayedUnit);
-
-	self:RegisterUnitEvent('UNIT_ABSORB_AMOUNT_CHANGED', unit.displayedUnit);
-	self:RegisterUnitEvent('UNIT_HEAL_ABSORB_AMOUNT_CHANGED', unit.displayedUnit);
-end
-
-function UnitFrameMixin:UnregisterEvents()
-	self:SetScript('OnEvent', nil)
-end
-
-
-function UnitFrameMixin:UpdateAllElements()
-	self:UpdateInVehicle()
-
-	if UnitExists(self.displayedUnit) then
-		CompactUnitFrame_UpdateSelectionHighlight(self)
-		CompactUnitFrame_UpdateMaxHealth(self)
-		CompactUnitFrame_UpdateHealth(self)
-		CompactUnitFrame_UpdateHealPrediction(self)
-
-		self:UpdateRaidTarget()
-		CompactUnitFrame_UpdateHealthColor(self)
-		CompactUnitFrame_UpdateName(self);
-		self:UpdateThreat()
-		self:OnUnitAuraUpdate()
-		self:UpdateQuestVisuals()
-		self:UpdateStatusBar()
-	end
-end
-
-function UnitFrameMixin:OnEvent(event, ...)
-	local arg1, arg2, arg3, arg4 = ...
-	if ( event == 'PLAYER_TARGET_CHANGED' ) then
-		CompactUnitFrame_UpdateSelectionHighlight(self);
-		CompactUnitFrame_UpdateName(self);
-
-	elseif ( arg1 == self.unit or arg1 == self.displayedUnit ) then
-		if ( event == 'UNIT_MAXHEALTH' ) then
-			CompactUnitFrame_UpdateMaxHealth(self)
-			CompactUnitFrame_UpdateHealth(self)
-			CompactUnitFrame_UpdateHealPrediction(self)
-		elseif ( event == 'UNIT_HEALTH' or event == 'UNIT_HEALTH_FREQUENT' ) then
-			CompactUnitFrame_UpdateHealth(self)
-			CompactUnitFrame_UpdateHealPrediction(self)
-		elseif ( event == 'UNIT_NAME_UPDATE' ) then
-			CompactUnitFrame_UpdateName(self)
-			CompactUnitFrame_UpdateHealthColor(self)
-		elseif ( event == 'UNIT_AURA' ) then
-			self:OnUnitAuraUpdate()
-		elseif ( event == 'UNIT_THREAT_SITUATION_UPDATE' ) then
-			self:UpdateThreat()
-			--CompactUnitFrame_UpdateHealthBorder(self)
-		elseif ( event == 'UNIT_THREAT_LIST_UPDATE' ) then
-			if ( self.optionTable.considerSelectionInCombatAsHostile ) then
-				CompactUnitFrame_UpdateHealthColor(self)
-				CompactUnitFrame_UpdateName(self)
-			end
-			self:UpdateThreat()
-		elseif ( event == 'UNIT_HEAL_PREDICTION' or event == 'UNIT_ABSORB_AMOUNT_CHANGED' or event == 'UNIT_HEAL_ABSORB_AMOUNT_CHANGED' ) then
-			CompactUnitFrame_UpdateHealPrediction(self)
-		elseif ( event == 'UNIT_ENTERED_VEHICLE' or event == 'UNIT_EXITED_VEHICLE' or event == 'UNIT_PET' ) then
-			self:UpdateAllElements()
-		end
-	end
-end
-
-function UnitFrameMixin:UpdateInVehicle()
-	if ( UnitHasVehicleUI(self.unit) ) then
-		if ( not self.inVehicle ) then
-			self.inVehicle = true
-			local prefix, id, suffix = string.match(self.unit, '([^%d]+)([%d]*)(.*)')
-			self.displayedUnit = prefix..'pet'..id..suffix
-			self:UpdateUnitEvents()
-		end
-	else
-		if ( self.inVehicle ) then
-			self.inVehicle = false
-			self.displayedUnit = self.unit
-			self:UpdateUnitEvents()
-		end
-	end
-end
-
-function UnitFrameMixin:UpdateRaidTarget()
-	local icon = self.raidTargetIcon;
-	local index = GetRaidTargetIndex(self.unit)
-	if ( index ) then
-		SetRaidTargetIconTexture(icon, index);
-		icon:Show();
-		if self.optionTable.colorHealthByRaidIcon then
-			self.optionTable.healthBarColorOverride = raidIconColor[index]
-		end
-	else
-		self.optionTable.healthBarColorOverride = nil
-		icon:Hide();
-	end
-end
-
-function UnitFrameMixin:UpdateThreat()
-	local tex = self.aggroHighlight
-	if not self.optionTable.tankBorderColor then
-		tex:Hide()
-		return
-	end
-
-	local isTanking, status = UnitDetailedThreatSituation('player', self.displayedUnit)
-	if status ~= nil then
-		if MOD.IsPlayerEffectivelyTank() then
-			status = math.abs(status - 3)
-		end
-		if status > 0 then
-			tex:SetVertexColor(GetThreatStatusColor(status))
-			if not tex:IsShown() then
-				tex:Show()
-			end
-			return
-		end
-	end
-	tex:Hide()
-end
-
-function UnitFrameMixin:UpdateStatusBar()
-	self.healthBar:SetStatusBarTexture(config.StatusbarTexture, 'BACKGROUND', 1)
-	self.castBar:SetStatusBarTexture(config.StatusbarTexture, 'BACKGROUND', 1)
-	if not UnitIsUnit(self.displayedUnit,'player') then
-		self.level:SetText(UnitLevel(self.displayedUnit))
-
-		if config.SuperStyled and MOD.IsEliteUnit(self.displayedUnit) then
-			self.healthBar.eliteborder:Show()
-		else
-			self.healthBar.eliteborder:Hide()
-		end
-		MOD.Colorize(self)
-	else
-		self.level:SetText(nil)
-		self.healthBar.eliteborder:Hide()
-	end
-end
-
-function UnitFrameMixin:UpdateQuestVisuals()
-	local isQuest, numLeft = MOD.GetUnitQuestInfo(self.displayedUnit)
-	if (isQuest) then
-		if (numLeft > 0) then
-			self.questText:SetText(numLeft)
-		else
-			self.questText:SetText('?')
-		end
-		self.questIcon:Show()
-	else
-		self.questText:SetText(nil)
-		self.questIcon:Hide()
-	end
-end
-
-function UnitFrameMixin:OnUnitAuraUpdate()
-	self.BuffFrame:UpdateBuffs(self.displayedUnit, self.optionTable.filter)
-
-
-end
-
+--[[
+##############################################################################
+S V U I NAMEPLATES   By: joev
+##############################################################################
+credit: Abu.       NamePlates was adapted from AbuNameplates                 #
+##############################################################################
+##########################################################
+LOCALIZED LUA FUNCTIONS
+##########################################################
+]]--
+--[[ GLOBALS ]]--
+local _G = _G;
+local unpack    = _G.unpack;
+local select    = _G.select;
+local pairs     = _G.pairs;
+local ipairs    = _G.ipairs;
+local type      = _G.type;
+local error     = _G.error;
+local pcall     = _G.pcall;
+local tostring  = _G.tostring;
+local tonumber  = _G.tonumber;
+local tinsert   = _G.tinsert;
+local string    = _G.string;
+local math      = _G.math;
+local bit       = _G.bit;
+local table     = _G.table;
+--[[ STRING METHODS ]]--
+local lower, upper = string.lower, string.upper;
+local find, format, split = string.find, string.format, string.split;
+local match, gmatch, gsub = string.match, string.gmatch, string.gsub;
+--[[ MATH METHODS ]]--
+local floor, ceil = math.floor, math.ceil;  -- Basic
+--[[ BINARY METHODS ]]--
+local band, bor = bit.band, bit.bor;
+--[[ TABLE METHODS ]]--
+local tremove, tcopy, twipe, tsort, tconcat = table.remove, table.copy, table.wipe, table.sort, table.concat;
+--[[
+##########################################################
+GET ADDON DATA
+##########################################################
+]]--
+local SV = _G['SVUI'];
+local L = SV.L;
+local MOD = SV.NamePlates;
+if(not MOD) then return end;
+
+local LSM = _G.LibStub("LibSharedMedia-3.0")
+
+--Debug
+local Debug
+if AdiDebug then
+	Debug = AdiDebug:GetSink("Nameplates")
+else
+	Debug = function() end
+end
+--[[
+##########################################################
+LOCAL VARS
+##########################################################
+]]--
+local PLATE_TOP = MOD.media.topArt;
+local PLATE_BOTTOM = MOD.media.bottomArt;
+local PLATE_RIGHT = MOD.media.rightArt;
+local PLATE_LEFT = MOD.media.leftArt;
+
+local DriverFrame = CreateFrame('Frame', 'SVUI_Nameplates_DriverFrame', UIParent)
+local UnitFrameMixin = {}
+local UnitBuffMixin = {}
+
+local path= "Interface\\Addons\\SVUI_NamePlates\\assets\\"
+
+local NPUseThreat = false;
+local NPThreatGS = 1;
+local NPThreatBS = 1;
+local NPReactTap = {0.3,0.3,0.3}
+local NPReactNPCGood = {0.31,0.45,0.63}
+local NPReactPlayerGood = {0.29,0.68,0.3}
+local NPReactNeutral = {0.85,0.77,0.36}
+local NPReactEnemy = {0.78,0.25,0.25}
+--[[
+##########################################################
+COLORING THREAT/REACTIONS
+##########################################################
+]]--
+local CONFIG_THREAT_HOSTILE = { {0.29,0.68,0.3}, {0.85,0.77,0.36}, {0.94,0.6,0.06}, {0.78,0.25,0.25} };
+local CONFIG_THREAT_SCALE = { 1,1,1,1 };
+local PLATE_CLASS_COLORS = {};
+
+do
+	for classToken, colorData in pairs(RAID_CLASS_COLORS) do
+			PLATE_CLASS_COLORS[classToken] = {colorData.r, colorData.g, colorData.b}
+	end
+end
+
+local REACTION_COLORING = {
+	-- (1) PLAYER
+	function(token)
+		if(not token) then
+			return NPReactPlayerGood,NPThreatGS
+		else
+			return PLATE_CLASS_COLORS[token],NPThreatGS
+		end
+	end,
+	-- (2) TAPPED
+	function() return NPReactTap,NPThreatGS end,
+	-- (3) FRIENDLY
+	function() return NPReactNPCGood,NPThreatGS end,
+	-- (4) NEUTRAL
+	function(threatLevel)
+		local color,scale;
+		if((not threatLevel) or (not NPUseThreat) or (not InCombatLockdown())) then
+			color = NPReactNeutral
+			scale = NPThreatGS
+		else
+			color = CONFIG_THREAT_HOSTILE[threatLevel]
+			scale = CONFIG_THREAT_SCALE[threatLevel]
+		end
+		return color,scale
+	end,
+	-- (5) HOSTILE
+	function(threatLevel)
+		local color,scale;
+		if((not threatLevel) or (not NPUseThreat) or (not InCombatLockdown())) then
+			color = NPReactEnemy
+			scale = NPThreatGS
+		else
+			color = CONFIG_THREAT_HOSTILE[threatLevel]
+			scale = CONFIG_THREAT_SCALE[threatLevel]
+		end
+		return color,scale
+	end,
+};
+
+
+local config = {
+	Colors = {
+		Frame 	= { 0, 0, 0 },
+		Border   = { 0.5, 0.5, 0.4 },
+		Interrupt = { 0.5, 0.5, 0.4 },
+	},
+
+	IconTextures = {
+		White = path..'Border\\textureWhite',
+		Normal = path..'Border\\textureNormal',
+		Shadow = path..'Border\\textureShadow',
+	},
+
+	-- Nameplates
+	StatusbarTexture = SV.media.statusbar.default,
+	Font = SV.media.font.default,
+	FontSize = 10,
+
+	SuperStyled = false,
+
+	CombatHide = false,
+
+	friendlyConfig = {
+		useClassColors = false,
+		displaySelectionHighlight = true,
+		colorHealthBySelection = true,
+		considerSelectionInCombatAsHostile = true,
+		displayNameByPlayerNameRules = true,
+		colorHealthByRaidIcon = true,
+		displayName = true,
+		filter = "NONE",
+
+		castBarHeight = 8,
+		healthBarHeight = 4*2,
+
+		displayAggroHighlight = false,
+		displaySelectionHighlight = true,
+		--fadeOutOfRange = false,
+		--displayStatusText = true,
+		displayHealPrediction = true,
+		--displayDispelDebuffs = true,
+		colorNameBySelection = true,
+		colorNameWithExtendedColors = true,
+		colorHealthWithExtendedColors = true,
+		colorHealthBySelection = true,
+		considerSelectionInCombatAsHostile = true,
+		--smoothHealthUpdates = false,
+		displayNameWhenSelected = true,
+		displayNameByPlayerNameRules = true,
+	},
+
+	enemyConfig = {
+		useClassColors = true,
+		displayAggroHighlight = true,
+		--playLoseAggroHighlight = true,
+		displaySelectionHighlight = true,
+		colorHealthBySelection = true,
+		considerSelectionInCombatAsHostile = true,
+		displayNameByPlayerNameRules = true,
+		colorHealthByRaidIcon = true,
+		tankBorderColor = true,
+		castBarHeight = 8,
+		healthBarHeight = 4*2,
+		filter = "HARMFUL|INCLUDE_NAME_PLATE_ONLY",
+		displayName = true,
+		--fadeOutOfRange = false,
+		displayHealPrediction = true,
+		colorNameBySelection = true,
+		--smoothHealthUpdates = false,
+		displayNameWhenSelected = true,
+		greyOutWhenTapDenied = true,
+		--showClassificationIndicator = true,
+	},
+
+	playerConfig = {
+		displayHealPrediction = true,
+		filter = "HELPFUL",
+		useClassColors = true,
+		hideCastbar = true,
+		healthBarHeight = 4*2,
+		manaBarHeight = 4*2,
+
+		displaySelectionHighlight = false,
+		displayAggroHighlight = false,
+		displayName = false,
+		fadeOutOfRange = false,
+		colorNameBySelection = true,
+		smoothHealthUpdates = false,
+		displayNameWhenSelected = false,
+	},
+}
+
+MOD.config = config
+MOD.DriverFrame = DriverFrame
+MOD.UnitFrameMixin = UnitFrameMixin
+
+local BorderTex = path..'Border\\Plate.blp'
+local BorderTexGlow = path..'Border\\PlateGlow.blp'
+local MarkTex = path..'Border\\Mark.blp'
+local HighlightTex = path..'Border\\Highlight.blp'
+
+local TexCoord 		= {24/256, 186/256, 35/128, 59/128}
+local CbTexCoord 	= {24/256, 186/256, 59/128, 35/128}
+
+local GlowTexCoord 	= {15/256, 195/256, 21/128, 73/128}
+local CbGlowTexCoord= {15/256, 195/256, 73/128, 21/128}
+
+local HiTexCoord 	= {5/128, 105/128, 20/32, 26/32}
+
+local AggroTexCoords = {  0.00781250, 0.55468750, 0.00781250, 0.27343750 }
+
+local raidIconColor = {
+	[1] = {r = 1.0,  g = 0.92, b = 0,     },
+	[2] = {r = 0.98, g = 0.57, b = 0,     },
+	[3] = {r = 0.83, g = 0.22, b = 0.9,   },
+	[4] = {r = 0.04, g = 0.95, b = 0,     },
+	[5] = {r = 0.7,  g = 0.82, b = 0.875, },
+	[6] = {r = 0,    g = 0.71, b = 1,     },
+	[7] = {r = 1.0,  g = 0.24, b = 0.168, },
+	[8] = {r = 0.98, g = 0.98, b = 0.98,  },
+}
+
+local Backdrop = {
+	bgFile = 'Interface\\Buttons\\WHITE8x8',
+}
+
+local NPComboColor={
+	[1]={0.69,0.31,0.31},
+	[2]={0.69,0.31,0.31},
+	[3]={0.65,0.63,0.35},
+	[4]={0.65,0.63,0.35},
+	[5]={0.33,0.59,0.33},
+	[6]={0.22,0.79,0.22},
+	[7]={0.11,0.99,0.11},
+	[8]={0.11,0.99,0.11}
+}
+
+
+--------
+-- Utils
+--------
+
+function MOD.GetPlateThreatReaction(plate)
+	if plate.aggroHighlight:IsShown() then
+		local r, g, b = plate.aggroHighlight:GetVertexColor()
+		local lastThreat = plate.reaction or 1
+		if g + b < 1 then
+			plate.reaction = 4
+			return 4
+		else
+			if lastThreat > 2 then
+				plate.reaction = 2
+				return 2
+			elseif lastThreat < 3 then
+				plate.reaction = 3
+				return 3
+			end
+		end
+	end
+	plate.reaction = 1
+	return 1
+end
+
+function MOD.GetPlateReaction(plate)
+	if plate.unit ~= nil then
+		local class, classToken, _, _, _, _, _ = GetPlayerInfoByGUID(UnitGUID(plate.unit))
+		if RAID_CLASS_COLORS[classToken] then
+			return REACTION_COLORING[1](classToken)
+		end
+	end
+
+	local oldR,oldG,oldB = plate.healthBar:GetStatusBarColor()
+	local r = floor(oldR * 100 + .5) * 0.01;
+	local g = floor(oldG * 100 + .5) * 0.01;
+	local b = floor(oldB * 100 + .5) * 0.01;
+	--print(plate.health:GetStatusBarColor())
+	for classToken, _ in pairs(RAID_CLASS_COLORS) do
+		local bb = b
+		if classToken == 'MONK' then
+			bb = bb - 0.01
+		end
+		if RAID_CLASS_COLORS[classToken].r == r and RAID_CLASS_COLORS[classToken].g == g and RAID_CLASS_COLORS[classToken].b == bb then
+			return REACTION_COLORING[1](classToken)
+		end
+	end
+
+	if(r + b < 0.25) then
+		return REACTION_COLORING[3]()
+	else
+		local threatReaction = MOD.GetPlateThreatReaction(plate)
+		if(r + g > 1.8) then
+			return REACTION_COLORING[4](threatReaction)
+		elseif(g + b < 0.25) then
+			return REACTION_COLORING[5](threatReaction)
+		elseif((r > 0.45 and r < 0.55) and (g > 0.45 and g < 0.55) and (b > 0.45 and b < 0.55)) then
+			REACTION_COLORING[2]()
+		else
+			REACTION_COLORING[1]()
+		end
+	end
+end
+
+function MOD.Colorize(plate)
+
+	local latestColor, scale = MOD.GetPlateReaction(plate);
+	local r,g,b
+	if(latestColor) then
+		r,g,b = unpack(latestColor)
+	else
+		r,g,b = plate.healthBar:GetStatusBarColor()
+	end
+	plate.healthBar:SetStatusBarColor(r,g,b)
+end
+
+function MOD.IsPlayerEffectivelyTank()
+	local assignedRole = UnitGroupRolesAssigned("player");
+	if ( assignedRole == "NONE" ) then
+		local spec = GetSpecialization();
+		return spec and GetSpecializationRole(spec) == "TANK";
+	end
+
+	return assignedRole == "TANK";
+end
+
+local scanner = CreateFrame("GameTooltip", "SVUI_NameplatesScanner", nil, "GameTooltipTemplate")
+local questtipLine = setmetatable({}, { __index = function(k, i)
+	local line = _G["SVUI_NameplatesScannerTextLeft" .. i]
+	if line then rawset(k, i, line) end
+	return line
+end })
+
+function MOD.IsEliteUnit(namePlateUnitToken)
+	local isElite = false
+	if not UnitIsUnit('player', namePlateUnitToken) and not UnitIsFriend('player', namePlateUnitToken) then
+		if 	(UnitClassification(namePlateUnitToken) == "worldboss" or UnitLevel(namePlateUnitToken) == -1 or
+			UnitClassification(namePlateUnitToken) == "rare" or UnitClassification(namePlateUnitToken) =="rareelite" or
+			UnitClassification(namePlateUnitToken) == "elite") then
+			isElite = true
+		end
+	end
+	return isElite
+end
+
+function MOD.GetUnitQuestInfo(namePlateUnitToken)
+	if not namePlateUnitToken or UnitIsPlayer(namePlateUnitToken) then
+		return false
+	end
+
+	local is_quest
+	local num_left = 0
+
+	scanner:SetOwner(UIParent, "ANCHOR_NONE")
+	scanner:SetUnit(namePlateUnitToken)
+
+	for i = 3, scanner:NumLines() do
+		local str = questtipLine[i]
+		if (not str) then break; end
+		local r,g,b = str:GetTextColor()
+		if (r > .99) and (g > .82) and (g < .83) and (b < .01) then -- quest title (yellow)
+			is_quest = true
+		else
+			local done, total = str:GetText():match('(%d+)/(%d+)')  -- kill objective
+			if (done and total) then
+				local left = total - done
+				if (left > num_left) then
+					num_left = left
+				end
+			end
+		end
+	end
+	return is_quest, num_left
+end
+
+function MOD.CreatePlateBorder(plate)
+
+	plate.bordertop = plate:CreateTexture(nil, "BORDER")
+	plate.bordertop:SetPoint("TOPLEFT", plate, "TOPLEFT", -2, 2)
+	plate.bordertop:SetPoint("TOPRIGHT", plate, "TOPRIGHT", 2, 2)
+	plate.bordertop:SetHeight(2)
+	plate.bordertop:SetColorTexture(0,0,0)
+	plate.bordertop:SetDrawLayer("BORDER", 1)
+
+	plate.borderbottom = plate:CreateTexture(nil, "BORDER")
+	plate.borderbottom:SetPoint("BOTTOMLEFT", plate, "BOTTOMLEFT", -2, -2)
+	plate.borderbottom:SetPoint("BOTTOMRIGHT", plate, "BOTTOMRIGHT", 2, -2)
+	plate.borderbottom:SetHeight(2)
+	plate.borderbottom:SetColorTexture(0,0,0)
+	plate.borderbottom:SetDrawLayer("BORDER", 1)
+
+	plate.borderleft = plate:CreateTexture(nil, "BORDER")
+	plate.borderleft:SetPoint("TOPLEFT", plate, "TOPLEFT", -2, 2)
+	plate.borderleft:SetPoint("BOTTOMLEFT", plate, "BOTTOMLEFT", 2, -2)
+	plate.borderleft:SetWidth(2)
+	plate.borderleft:SetColorTexture(0,0,0)
+	plate.borderleft:SetDrawLayer("BORDER", 1)
+
+	plate.borderright = plate:CreateTexture(nil, "BORDER")
+	plate.borderright:SetPoint("TOPRIGHT", plate, "TOPRIGHT", 2, 2)
+	plate.borderright:SetPoint("BOTTOMRIGHT", plate, "BOTTOMRIGHT", -2, -2)
+	plate.borderright:SetWidth(2)
+	plate.borderright:SetColorTexture(0,0,0)
+	plate.borderright:SetDrawLayer("BORDER", 1)
+
+	if(not plate.eliteborder) then
+		plate.eliteborder = CreateFrame("Frame", nil, plate)
+		plate.eliteborder:SetAllPoints(plate)
+		plate.eliteborder:SetFrameStrata("BACKGROUND")
+		plate.eliteborder:SetFrameLevel(0)
+
+		plate.eliteborder.top = plate.eliteborder:CreateTexture(nil, "BACKGROUND")
+		plate.eliteborder.top:SetPoint("BOTTOMLEFT", plate.eliteborder, "TOPLEFT", 0, 0)
+		plate.eliteborder.top:SetPoint("BOTTOMRIGHT", plate.eliteborder, "TOPRIGHT", 0, 0)
+		plate.eliteborder.top:SetHeight(22)
+		plate.eliteborder.top:SetTexture(PLATE_TOP)
+		plate.eliteborder.top:SetVertexColor(1, 1, 0)
+		plate.eliteborder.top:SetBlendMode("BLEND")
+
+		plate.eliteborder.bottom = plate.eliteborder:CreateTexture(nil, "BACKGROUND")
+		plate.eliteborder.bottom:SetPoint("TOPLEFT", plate.eliteborder, "BOTTOMLEFT", 0, 0)
+		plate.eliteborder.bottom:SetPoint("TOPRIGHT", plate.eliteborder, "BOTTOMRIGHT", 0, 0)
+		plate.eliteborder.bottom:SetHeight(32)
+		plate.eliteborder.bottom:SetTexture(PLATE_BOTTOM)
+		plate.eliteborder.bottom:SetVertexColor(1, 1, 0)
+		plate.eliteborder.bottom:SetBlendMode("BLEND")
+
+		plate.eliteborder.right = plate.eliteborder:CreateTexture(nil, "BACKGROUND")
+		plate.eliteborder.right:SetPoint("TOPLEFT", plate.eliteborder, "TOPRIGHT", 0, 0)
+		plate.eliteborder.right:SetPoint("BOTTOMLEFT", plate.eliteborder, "BOTTOMRIGHT", 0, 0)
+		plate.eliteborder.right:SetWidth(plate:GetHeight() * 4)
+		plate.eliteborder.right:SetTexture(PLATE_RIGHT)
+		plate.eliteborder.right:SetVertexColor(1, 1, 0)
+		plate.eliteborder.right:SetBlendMode("BLEND")
+
+		plate.eliteborder.left = plate.eliteborder:CreateTexture(nil, "BACKGROUND")
+		plate.eliteborder.left:SetPoint("TOPRIGHT", plate.eliteborder, "TOPLEFT", 0, 0)
+		plate.eliteborder.left:SetPoint("BOTTOMRIGHT", plate.eliteborder, "BOTTOMLEFT", 0, 0)
+		plate.eliteborder.left:SetWidth(plate:GetHeight() * 4)
+		plate.eliteborder.left:SetTexture(PLATE_LEFT)
+		plate.eliteborder.left:SetVertexColor(1, 1, 0)
+		plate.eliteborder.left:SetBlendMode("BLEND")
+
+		plate.eliteborder:SetAlpha(0.35)
+
+		plate.eliteborder:Hide()
+	end
+
+end
+
+
+function MOD:ComboToggle()
+	if(config.ComboPoints) then
+		config.ComboPoints = false
+		SetCVar("nameplateResourceOnTarget", 0)
+	else
+		config.ComboPoints = true
+		SetCVar("nameplateResourceOnTarget", 1)
+	end
+	DriverFrame:UpdateComboPointsBar()
+end
+
+function MOD:CombatToggle()
+	if(config.CombatHide) then
+		config.CombatHide = false
+		SetCVar("nameplateShowEnemies", 0)
+	else
+		config.CombatHide = true
+		SetCVar("nameplateShowEnemies", 1)
+	end
+end
+
+function MOD:UpdateAllPlates()
+	self:UpdateLocals()
+	DriverFrame:UpdateNamePlateOptions()
+end
+
+function MOD:UpdateLocals()
+	local db = SV.db.NamePlates
+	if not db then return end
+
+	config.StatusbarTexture = LSM:Fetch("statusbar", db.barTexture);
+
+	config.CombatHide = db.combatHide;
+	config.ComboPoimts = db.comboPoints;
+
+	config.SuperStyled = db.themed;
+
+	config.friendlyConfig.healthBarHeight = db.healthBar.height;
+	config.enemyConfig.healthBarHeight = db.healthBar.height;
+	config.playerConfig.healthBarHeight = db.healthBar.height;
+
+
+	config.friendlyConfig.castBarHeight = db.castBar.height;
+	config.enemyConfig.castBarHeight = db.castBar.height;
+	config.playerConfig.manaBarHeight = db.castBar.height;
+
+end
+
+function MOD:Load()
+	self:UpdateLocals();
+	DriverFrame:SetScript('OnEvent', DriverFrame.OnEvent)
+	DriverFrame:RegisterEvent'PLAYER_ENTERING_WORLD'
+end
+-------
+--  DriverFrame
+------
+
+function DriverFrame:OnEvent(event, ...)
+
+	if event == 'PLAYER_ENTERING_WORLD' then
+		self:OnLoad();
+	elseif (event == 'NAME_PLATE_CREATED') then
+		local namePlateFrameBase = ...
+		self:OnNamePlateCreated(namePlateFrameBase)
+	elseif (event == 'NAME_PLATE_UNIT_ADDED') then
+		local namePlateUnitToken = ...
+		self:OnNamePlateAdded(namePlateUnitToken)
+	elseif (event == 'NAME_PLATE_UNIT_REMOVED') then
+		local namePlateUnitToken = ...
+		self:OnNamePlateRemoved(namePlateUnitToken)
+	elseif event == 'PLAYER_TARGET_CHANGED' then
+		self:OnTargetChanged();
+	elseif event == 'DISPLAY_SIZE_CHANGED' then -- resolution change
+		self:UpdateNamePlateOptions()
+	elseif event == "CVAR_UPDATE" then
+		local name = ...;
+		if name == "SHOW_CLASS_COLOR_IN_V_KEY" or name == "SHOW_NAMEPLATE_LOSE_AGGRO_FLASH" then
+			self:UpdateNamePlateOptions();
+		end
+	elseif event == 'UPDATE_MOUSEOVER_UNIT' then
+		self:UpdateMouseOver()
+	elseif event == 'UNIT_FACTION' then
+		self:OnUnitFactionChanged(...)
+	elseif event == 'RAID_TARGET_UPDATE' then
+		self:OnRaidTargetUpdate()
+	elseif event == 'QUEST_LOG_UPDATE' then
+		self:OnQuestLogUpdate()
+	end
+end
+
+function DriverFrame:DisableBlizzard()
+	NamePlateDriverFrame:UnregisterAllEvents()
+	NamePlateDriverFrame:Hide()
+
+	NamePlateDriverFrame.UpdateNamePlateOptions = function()
+		DriverFrame:UpdateNamePlateOptions()
+	end
+end
+
+function DriverFrame:OnLoad()
+
+	self:DisableBlizzard()
+
+	self:RegisterEvent'NAME_PLATE_CREATED'
+	self:RegisterEvent'NAME_PLATE_UNIT_ADDED'
+	self:RegisterEvent'NAME_PLATE_UNIT_REMOVED'
+
+	self:RegisterEvent'PLAYER_TARGET_CHANGED'
+
+	self:RegisterEvent'DISPLAY_SIZE_CHANGED' -- Resolution change
+	self:RegisterEvent'CVAR_UPDATE'
+
+	self:RegisterEvent'UPDATE_MOUSEOVER_UNIT'
+	self:RegisterEvent'UNIT_FACTION'
+
+	self:RegisterEvent'RAID_TARGET_UPDATE'
+	self:RegisterEvent'QUEST_LOG_UPDATE'
+	self:UpdateNamePlateOptions();
+
+end
+
+function DriverFrame:UpdateNamePlateOptions()
+	self.baseNamePlateWidth = 110;
+	self.baseNamePlateHeight = 45;
+
+	local namePlateVerticalScale = tonumber(GetCVar("NamePlateVerticalScale"));
+	local horizontalScale = tonumber(GetCVar("NamePlateHorizontalScale"));
+	C_NamePlate.SetNamePlateOtherSize(self.baseNamePlateWidth * horizontalScale, self.baseNamePlateHeight);
+	C_NamePlate.SetNamePlateSelfSize(self.baseNamePlateWidth * horizontalScale, self.baseNamePlateHeight);
+
+
+	for i, frame in ipairs(C_NamePlate.GetNamePlates()) do
+		frame.UnitFrame:ApplyFrameOptions(frame.UnitFrame.unit);
+		frame.UnitFrame:UpdateAllElements()
+	end
+
+	self:UpdateClassResourceBar()
+	self:UpdateManaBar()
+	self:UpdateComboPointsBar()
+end
+
+function DriverFrame:OnNamePlateCreated(nameplate)
+	local f = CreateFrame('Button', nameplate:GetName()..'UnitFrame', nameplate)
+	f:SetAllPoints(nameplate)
+	f:Show()
+	Mixin(f, UnitFrameMixin)
+	f:Create(nameplate)
+	f:EnableMouse(false)
+
+	nameplate.UnitFrame = f
+end
+
+function DriverFrame:OnNamePlateAdded(namePlateUnitToken)
+	local nameplate = C_NamePlate.GetNamePlateForUnit(namePlateUnitToken)
+	nameplate.UnitFrame:ApplyFrameOptions(namePlateUnitToken)
+	nameplate.UnitFrame:OnAdded(namePlateUnitToken)
+	nameplate.UnitFrame:UpdateAllElements()
+
+	self:UpdateClassResourceBar()
+	self:UpdateManaBar()
+	self:UpdateComboPointsBar()
+end
+
+function DriverFrame:OnNamePlateRemoved(namePlateUnitToken)
+	local nameplate = C_NamePlate.GetNamePlateForUnit(namePlateUnitToken)
+	nameplate.UnitFrame:OnAdded(nil)
+end
+
+function DriverFrame:OnTargetChanged()
+	local nameplate = C_NamePlate.GetNamePlateForUnit'target'
+	if nameplate then
+		if nameplate.UnitFrame then nameplate.UnitFrame:OnUnitAuraUpdate() end
+	end
+
+	self:UpdateClassResourceBar()
+	self:UpdateManaBar()
+	self:UpdateComboPointsBar()
+end
+
+function DriverFrame:OnRaidTargetUpdate()
+	for _, frame in pairs(C_NamePlate.GetNamePlates()) do
+		frame.UnitFrame:UpdateRaidTarget()
+		CompactUnitFrame_UpdateHealthColor(frame.UnitFrame)
+	end
+end
+
+function DriverFrame:OnUnitFactionChanged(unit)
+	local nameplate = C_NamePlate.GetNamePlateForUnit(unit);
+	if (nameplate) then
+		CompactUnitFrame_UpdateName(nameplate.UnitFrame);
+		CompactUnitFrame_UpdateHealthColor(nameplate.UnitFrame);
+	end
+end
+
+function DriverFrame:OnQuestLogUpdate()
+	for _, frame in pairs(C_NamePlate.GetNamePlates()) do
+		frame.UnitFrame:UpdateQuestVisuals()
+	end
+end
+
+local mouseoverframe -- if theres a better way im all ears
+function DriverFrame:OnUpdate(elapsed)
+	local nameplate = C_NamePlate.GetNamePlateForUnit('mouseover')
+	if not nameplate or nameplate ~= mouseoverframe then
+		mouseoverframe.UnitFrame.hoverHighlight:Hide()
+		mouseoverframe = nil
+		self:SetScript('OnUpdate', nil)
+	end
+end
+
+function DriverFrame:UpdateMouseOver()
+	local nameplate = C_NamePlate.GetNamePlateForUnit('mouseover')
+
+	if mouseoverframe == nameplate then
+		return
+	elseif mouseoverframe then
+		mouseoverframe.UnitFrame.hoverHighlight:Hide()
+		self:SetScript('OnUpdate', nil)
+	end
+
+	if nameplate then
+		nameplate.UnitFrame.hoverHighlight:Show()
+		mouseoverframe = nameplate
+		self:SetScript('OnUpdate', self.OnUpdate) --onupdate until mouse leaves frame
+	end
+end
+
+-------------------------
+--	Class Resource bar
+-------------------------
+
+function DriverFrame:UpdateClassResourceBar()
+	local classResourceBar = NamePlateDriverFrame.nameplateBar;
+	if ( not classResourceBar ) then
+		return;
+	end
+	classResourceBar:Hide();
+
+	local showSelf = GetCVar("nameplateShowSelf");
+	if ( showSelf == "0" ) then
+		return;
+	end
+
+	local targetMode = GetCVarBool("nameplateResourceOnTarget");
+	if (classResourceBar.overrideTargetMode ~= nil) then
+		targetMode = classResourceBar.overrideTargetMode;
+	end
+
+	if ( targetMode ) then
+		local namePlateTarget = C_NamePlate.GetNamePlateForUnit("target");
+		if ( namePlateTarget ) then
+			classResourceBar:SetParent(NamePlateTargetResourceFrame);
+			NamePlateTargetResourceFrame:SetParent(namePlateTarget.UnitFrame);
+			NamePlateTargetResourceFrame:ClearAllPoints();
+			NamePlateTargetResourceFrame:SetPoint("BOTTOM", namePlateTarget.UnitFrame.name, "TOP", 0, 9);
+			classResourceBar:Show();
+		end
+		NamePlateTargetResourceFrame:SetShown(namePlateTarget ~= nil);
+	elseif ( not targetMode ) then
+		local namePlatePlayer = C_NamePlate.GetNamePlateForUnit("player");
+		if ( namePlatePlayer ) then
+			classResourceBar:SetParent(NamePlatePlayerResourceFrame);
+			NamePlatePlayerResourceFrame:SetParent(namePlatePlayer.UnitFrame);
+			NamePlatePlayerResourceFrame:ClearAllPoints();
+			--NamePlatePlayerResourceFrame:SetPoint("TOP",ClassNameplateManaBarFrame, "BOTTOM", 0, -3);
+			classResourceBar:Show();
+		end
+		NamePlatePlayerResourceFrame:SetShown(namePlatePlayer ~= nil);
+	end
+end
+
+-------------------------
+--	Class Mana Bar
+-------------------------
+
+local manabar = ClassNameplateManaBarFrame
+manabar:SetStatusBarTexture(config.StatusbarTexture, 'BACKGROUND', 1)
+manabar:SetBackdrop(Backdrop)
+manabar:SetBackdropColor(0, 0, 0, .8)
+manabar.Border:Hide()
+
+manabar.FeedbackFrame.BarTexture:SetTexture(config.StatusbarTexture)
+
+manabar.border = manabar:CreateTexture(nil, 'ARTWORK', nil, 2)
+-- manabar.border:SetTexture(BorderTex)
+-- manabar.border:SetTexCoord(unpack(TexCoord))
+MOD.CreatePlateBorder(manabar)
+manabar.border:SetPoint('TOPLEFT', manabar, -4, 6)
+manabar.border:SetPoint('BOTTOMRIGHT', manabar, 4, -6)
+manabar.border:SetVertexColor(unpack(config.Colors.Frame))
+manabar:SetFrameLevel(90)
+
+function ClassNameplateManaBarFrame:OnOptionsUpdated()
+	local width, height = C_NamePlate.GetNamePlateSelfSize();
+	self:SetHeight(config.playerConfig.manaBarHeight);
+	self:SetStatusBarTexture(config.StatusbarTexture, 'BACKGROUND', 1)
+end
+
+
+-------------------------
+--	Class ComboPoints Bar
+-------------------------
+local comboBar = nil
+
+local _, myclass = UnitClass("player")
+if (myclass == "ROGUE" or myclass=="DRUID") then
+	comboBar=ClassNameplateBarRogueDruidFrame
+	comboBar:SetSize(68, 1)
+	comboBar:SetFrameStrata("HIGH")
+	comboBar:SetFrameLevel(50) -- Make sure it's always on top, even over castBar...
+
+	for i = 1, #comboBar.ComboPoints do
+		comboBar.ComboPoints[i].Background:SetTexture(nil)
+		comboBar.ComboPoints[i].Point:SetTexture(MOD.media.comboIcon)
+		comboBar.ComboPoints[i].Point:SetSize(12, 12)
+		comboBar.ComboPoints[i].Point:SetVertexColor(unpack(NPComboColor[i]))
+		comboBar.ComboPoints[i]:SetFrameLevel(49)
+	end
+end
+
+function DriverFrame:UpdateComboPointsBar()
+	if ( not comboBar ) then
+		return;
+	end
+
+	local targetMode = GetCVarBool("nameplateResourceOnTarget");
+
+	local showSelf = GetCVar("nameplateShowSelf");
+	if (not targetMode and showSelf == "0") then
+		return;
+	end
+	local h = nil
+	if ( targetMode ) then
+		local namePlateTarget = C_NamePlate.GetNamePlateForUnit("target");
+		if ( namePlateTarget ) then
+			h = namePlateTarget.UnitFrame.healthBar;
+		end
+	elseif ( not targetMode ) then
+		local namePlatePlayer = C_NamePlate.GetNamePlateForUnit("player");
+		if ( namePlatePlayer ) then
+			h = namePlatePlayer.UnitFrame.healthBar;
+		end
+	end
+	if (h) then
+		comboBar:ClearAllPoints()
+		comboBar:SetPoint("CENTER", h, "CENTER",0,0)
+		comboBar:SetSize(68, 1)
+		comboBar:SetFrameStrata("HIGH")
+		comboBar:SetFrameLevel(50)
+	end
+end
+
+function DriverFrame:UpdateManaBar()
+	manabar:Hide()
+
+	local showSelf = GetCVar("nameplateShowSelf");
+	if ( showSelf == "0" ) then
+		return;
+	end
+
+	local namePlatePlayer = C_NamePlate.GetNamePlateForUnit("player");
+	if ( namePlatePlayer ) then
+		manabar:SetParent(namePlatePlayer);
+		manabar:ClearAllPoints();
+		manabar:SetPoint("TOPLEFT", namePlatePlayer.UnitFrame.healthBar, "BOTTOMLEFT", 0, -6);
+		manabar:SetPoint("TOPRIGHT", namePlatePlayer.UnitFrame.healthBar, "BOTTOMRIGHT", 0, -6);
+		manabar:Show();
+	end
+end
+
+------------------------
+--	Nameplate
+------------------------
+
+function UnitFrameMixin:Create(unitframe)
+	-- Healthbar
+	local h = CreateFrame('Statusbar', '$parentHealthBar', unitframe)
+	self.healthBar = h
+	h:SetFrameLevel(90)
+    h:SetStatusBarTexture(config.StatusbarTexture, 'BACKGROUND', 1)
+	h:SetBackdrop(Backdrop)
+	h:SetBackdropColor(0, 0, 0, .8)
+
+	-- 	Healthbar textures --blizzard capital letters policy
+	self.myHealPrediction = h:CreateTexture(nil, 'BORDER', nil, 5)
+	self.myHealPrediction:SetVertexColor(0.0, 0.659, 0.608)
+	self.myHealPrediction:SetTexture[[Interface\TargetingFrame\UI-TargetingFrame-BarFill]]
+
+	self.otherHealPrediction = h:CreateTexture(nil, 'ARTWORK', nil, 5)
+	self.otherHealPrediction:SetVertexColor(0.0, 0.659, 0.608)
+	self.otherHealPrediction:SetTexture[[Interface\TargetingFrame\UI-TargetingFrame-BarFill]]
+
+	self.totalAbsorb = h:CreateTexture(nil, 'ARTWORK', nil, 5)
+	self.totalAbsorb:SetTexture[[Interface\RaidFrame\Shield-Fill]]
+	--
+	self.totalAbsorbOverlay = h:CreateTexture(nil, 'BORDER', nil, 6)
+	self.totalAbsorbOverlay:SetTexture([[Interface\RaidFrame\Shield-Overlay]], true, true);	--Tile both vertically and horizontally
+	self.totalAbsorbOverlay:SetAllPoints(self.totalAbsorb);
+	self.totalAbsorbOverlay.tileSize = 20;
+	--
+	self.myHealAbsorb = h:CreateTexture(nil, 'ARTWORK', nil, 1)
+	self.myHealAbsorb:SetTexture([[Interface\RaidFrame\Absorb-Fill]], true, true)
+
+	self.myHealAbsorbLeftShadow = h:CreateTexture(nil, 'ARTWORK', nil, 1)
+	self.myHealAbsorbLeftShadow:SetTexture[[Interface\RaidFrame\Absorb-Edge]]
+
+	self.myHealAbsorbRightShadow = h:CreateTexture(nil, 'ARTWORK', nil, 1)
+	self.myHealAbsorbRightShadow:SetTexture[[Interface\RaidFrame\Absorb-Edge]]
+	self.myHealAbsorbRightShadow:SetTexCoord(1, 0, 0, 1)
+	--
+	h.border = h:CreateTexture(nil, 'ARTWORK', nil, 2)
+
+	MOD.CreatePlateBorder(h)
+
+	h.border:SetVertexColor(unpack(config.Colors.Frame))
+
+	self.level = h:CreateFontString(nil, 'OVERLAY',"SVUI_Font_NamePlate_Number")
+	self.level:SetPoint("RIGHT", h, "RIGHT", 2, 0)
+	self.level:SetJustifyH("RIGHT")
+
+	--
+	self.overAbsorbGlow = h:CreateTexture(nil, 'ARTWORK', nil, 3)
+	self.overAbsorbGlow:SetTexture[[Interface\RaidFrame\Shield-Overshield]]
+	self.overAbsorbGlow:SetBlendMode'ADD'
+	self.overAbsorbGlow:SetPoint('BOTTOMLEFT', h, 'BOTTOMRIGHT', -4, -1)
+	self.overAbsorbGlow:SetPoint('TOPLEFT', h, 'TOPRIGHT', -4, 1)
+	self.overAbsorbGlow:SetWidth(8);
+
+	self.overHealAbsorbGlow = h:CreateTexture(nil, 'ARTWORK', nil, 3)
+	self.overHealAbsorbGlow:SetTexture[[Interface\RaidFrame\Absorb-Overabsorb]]
+	self.overHealAbsorbGlow:SetBlendMode'ADD'
+	self.overHealAbsorbGlow:SetPoint('BOTTOMRIGHT', h, 'BOTTOMLEFT', 2, -1)
+	self.overHealAbsorbGlow:SetPoint('TOPRIGHT', h, 'TOPLEFT', 2, 1)
+	self.overHealAbsorbGlow:SetWidth(8);
+
+	-- Castbar
+	local c = CreateFrame('StatusBar', '$parentCastBar', nameplate)
+	do
+		self.castBar = c
+		c:SetFrameLevel(90)
+		c:Hide()
+		c:SetStatusBarTexture(config.StatusbarTexture, 'BACKGROUND', 1)
+		c:SetBackdrop(Backdrop)
+		c:SetBackdropColor(0, 0, 0, .5)
+
+		--		Castbar textures
+		c.border = c:CreateTexture(nil, 'ARTWORK', nil, 0)
+		--c.border:SetTexCoord(unpack(CbTexCoord))
+		-- c.border:SetTexture(BorderTex)
+		-- c.border:SetPoint('TOPLEFT', c, -4, 6)
+		-- c.border:SetPoint('BOTTOMRIGHT', c, 4, -6)
+		MOD.CreatePlateBorder(c)
+		c.border:SetVertexColor(unpack(config.Colors.Frame))
+
+		c.BorderShield = c:CreateTexture(nil, 'ARTWORK', nil, 1)
+		c.BorderShield:SetTexture(MarkTex)
+		c.BorderShield:SetTexCoord(unpack(CbTexCoord))
+		c.BorderShield:SetAllPoints(c.border)
+		c.BorderShield:SetBlendMode'ADD'
+		c.BorderShield:SetVertexColor(1, .9, 0, 0.7)
+		CastingBarFrame_AddWidgetForFade(c, c.BorderShield)
+
+		c.Text = c:CreateFontString(nil, 'OVERLAY', "SVUI_Font_NamePlate")
+		c.Text:SetPoint('CENTER', c, 0, 0)
+		c.Text:SetPoint('LEFT', c, 0, 0)
+		c.Text:SetPoint('RIGHT', c, 0, 0)
+		--c.Text:SetFont(config.Font, config.FontSize, 'THINOUTLINE')
+		c.Text:SetShadowColor(0, 0, 0, 0)
+
+		c.Icon = c:CreateTexture(nil, 'OVERLAY', nil, 1)
+		c.Icon:SetTexCoord(.1, .9, .1, .9)
+		c.Icon:SetPoint('BOTTOMRIGHT', c, 'BOTTOMLEFT', -7, 0)
+		c.Icon:SetPoint('TOPRIGHT', h, 'TOPLEFT', -7, 0)
+		CastingBarFrame_AddWidgetForFade(c, c.Icon)
+
+		c.IconBorder = c:CreateTexture(nil, 'OVERLAY', nil, 2)
+		c.IconBorder:SetTexture(config.IconTextures.Normal)
+		c.IconBorder:SetVertexColor(unpack(config.Colors.Border))
+		c.IconBorder:SetPoint('TOPRIGHT', c.Icon, 2, 2)
+		c.IconBorder:SetPoint('BOTTOMLEFT', c.Icon, -2, -2)
+		CastingBarFrame_AddWidgetForFade(c, c.IconBorder)
+
+		c.Spark = c:CreateTexture(nil, 'OVERLAY', nil, 2)
+		c.Spark:SetTexture[[Interface\CastingBar\UI-CastingBar-Spark]]
+		c.Spark:SetBlendMode'ADD'
+		c.Spark:SetSize(16,16)
+		c.Spark:SetPoint('CENTER', c, 0, 0)
+
+		c.Flash = c:CreateTexture(nil, 'OVERLAY', nil, 2)
+		c.Flash:SetTexture(config.StatusbarTexture)
+		c.Flash:SetBlendMode'ADD'
+
+		c:SetScript('OnEvent', CastingBarFrame_OnEvent)
+		c:SetScript('OnUpdate',CastingBarFrame_OnUpdate)
+		c:SetScript('OnShow', CastingBarFrame_OnShow)
+		CastingBarFrame_OnLoad(c, nil, false, true);
+		--CastingBarFrame_SetNonInterruptibleCastColor(c, 0.7, 0.7, 0.7)
+	end
+
+	self.raidTargetIcon = h:CreateTexture(nil, 'OVERLAY', nil)
+	self.raidTargetIcon:SetSize(18,18)
+	self.raidTargetIcon:SetPoint('LEFT', h, 'RIGHT', 4, 1)
+	self.raidTargetIcon:SetTexture[[Interface\TargetingFrame\UI-RaidTargetingIcons]]
+
+	self.name = h:CreateFontString(nil, 'ARTWORK', "SVUI_Font_NamePlate")
+	self.name:SetPoint('BOTTOM', h, 'TOP', 0, 4)
+	self.name:SetWordWrap(false)
+	self.name:SetJustifyH'CENTER'
+
+	self.aggroHighlight = h:CreateTexture(nil, 'OVERLAY', nil, 1)
+	self.aggroHighlight:SetTexture("Interface\\RaidFrame\\Raid-FrameHighlights");
+	self.aggroHighlight:SetTexCoord(unpack(AggroTexCoords));
+	self.aggroHighlight:SetAllPoints(h);
+	self.aggroHighlight:Hide()
+
+
+
+	self.hoverHighlight = h:CreateTexture(nil, 'ARTWORK', nil, 1)
+	self.hoverHighlight:SetTexture(HighlightTex)
+	self.hoverHighlight:SetAllPoints(h)
+	self.hoverHighlight:SetVertexColor(1, 1, 1)
+	self.hoverHighlight:SetBlendMode('ADD')
+	self.hoverHighlight:SetTexCoord(unpack(HiTexCoord))
+	self.hoverHighlight:Hide()
+
+	self.selectionHighlight = h:CreateTexture(nil, 'ARTWORK', nil, 4)
+	self.selectionHighlight:SetTexture(MarkTex)
+	self.selectionHighlight:SetTexCoord(unpack(TexCoord))
+	self.selectionHighlight:SetAllPoints(h.border)
+	self.selectionHighlight:SetBlendMode('ADD')
+	self.selectionHighlight:SetVertexColor(.8, .8, 1, .7)
+	self.selectionHighlight:Hide()
+
+	self.BuffFrame = CreateFrame('StatusBar', '$parentBuffFrame', self, 'HorizontalLayoutFrame')
+	Mixin(self.BuffFrame, NameplateBuffContainerMixin)
+	self.BuffFrame:SetPoint('LEFT', self.healthBar, -1, 0)
+	self.BuffFrame.spacing = 4
+	self.BuffFrame.fixedHeight = 14
+	self.BuffFrame:SetScript('OnEvent', self.BuffFrame.OnEvent)
+	self.BuffFrame:SetScript('OnUpdate', self.BuffFrame.OnUpdate)
+	self.BuffFrame:OnLoad()
+
+	-- Quest
+	self.questIcon = self:CreateTexture(nil, nil, nil, 0)
+	self.questIcon:SetSize(12, 12)
+
+	self.questIcon:SetTexture(path..'QUEST-BG-ICON.blp')
+	self.questIcon:SetPoint('LEFT', h, 'RIGHT', 2, 0)
+
+	self.questText = self:CreateFontString(nil, nil, "SVUI_Font_NamePlate_Number")
+	self.questText:SetPoint('CENTER', self.questIcon, 0, 0)
+	self.questText:SetShadowOffset(1, -1)
+	self.questText:SetTextColor(1,.82,0)
+
+
+
+end
+
+function UnitFrameMixin:ApplyFrameOptions(namePlateUnitToken)
+	if UnitIsUnit('player', namePlateUnitToken) then
+		self.optionTable = config.playerConfig
+		self.healthBar:SetPoint('LEFT', self, 'LEFT', 12, 5);
+		self.healthBar:SetPoint('RIGHT', self, 'RIGHT', -12, 5);
+		self.healthBar:SetHeight(self.optionTable.healthBarHeight);
+		self.healthBar.eliteborder:Hide()
+	else
+
+		if UnitIsFriend('player', namePlateUnitToken) then
+			self.optionTable = config.friendlyConfig
+		else
+			self.optionTable = config.enemyConfig
+		end
+
+		self.castBar:SetPoint('BOTTOMLEFT', self, 'BOTTOMLEFT', 12, 6);
+		self.castBar:SetPoint('BOTTOMRIGHT', self, 'BOTTOMRIGHT', -12, 6);
+		self.castBar:SetHeight(self.optionTable.castBarHeight);
+		self.castBar.Icon:SetWidth(self.optionTable.castBarHeight + self.optionTable.healthBarHeight + 6)
+
+		self.healthBar:SetPoint('BOTTOMLEFT', self.castBar, 'TOPLEFT', 0, 6);
+		self.healthBar:SetPoint('BOTTOMRIGHT', self.castBar, 'TOPRIGHT', 0, 6);
+		self.healthBar:SetHeight(self.optionTable.healthBarHeight);
+	end
+end
+
+function UnitFrameMixin:OnAdded(namePlateUnitToken)
+	self.unit = namePlateUnitToken
+	self.displayedUnit = namePlateUnitToken
+	self.inVehicle = false;
+
+	if namePlateUnitToken then
+		self:RegisterEvents()
+	else
+		self:UnregisterEvents()
+	end
+
+	if self.castBar then
+		if namePlateUnitToken and (not self.optionTable.hideCastbar) then
+			CastingBarFrame_SetUnit(self.castBar, namePlateUnitToken, false, true);
+		else
+			CastingBarFrame_SetUnit(self.castBar, nil, nil, nil);
+		end
+	end
+end
+
+function UnitFrameMixin:RegisterEvents()
+	self:RegisterEvent'UNIT_NAME_UPDATE'
+	self:RegisterEvent'PLAYER_TARGET_CHANGED'
+
+	self:RegisterEvent'UNIT_ENTERED_VEHICLE'
+	self:RegisterEvent'UNIT_EXITED_VEHICLE'
+	self:RegisterEvent'UNIT_PET'
+
+	self:UpdateUnitEvents();
+	self:SetScript('OnEvent', self.OnEvent);
+end
+
+function UnitFrameMixin:UpdateUnitEvents()
+	local unit = self.unit;
+	local displayedUnit;
+	if ( unit ~= self.displayedUnit ) then
+		displayedUnit = self.displayedUnit;
+	end
+	self:RegisterUnitEvent('UNIT_MAXHEALTH', unit, displayedUnit);
+	self:RegisterUnitEvent('UNIT_HEALTH', unit, displayedUnit);
+	self:RegisterUnitEvent('UNIT_HEALTH_FREQUENT', unit, displayedUnit);
+
+	self:RegisterUnitEvent('UNIT_AURA', unit, displayedUnit);
+	self:RegisterUnitEvent('UNIT_THREAT_SITUATION_UPDATE', unit, displayedUnit);
+	self:RegisterUnitEvent('UNIT_THREAT_LIST_UPDATE', unit, displayedUnit);
+	self:RegisterUnitEvent('UNIT_HEAL_PREDICTION', unit, displayedUnit);
+
+	self:RegisterUnitEvent('UNIT_ABSORB_AMOUNT_CHANGED', unit.displayedUnit);
+	self:RegisterUnitEvent('UNIT_HEAL_ABSORB_AMOUNT_CHANGED', unit.displayedUnit);
+end
+
+function UnitFrameMixin:UnregisterEvents()
+	self:SetScript('OnEvent', nil)
+end
+
+
+function UnitFrameMixin:UpdateAllElements()
+	self:UpdateInVehicle()
+
+	if UnitExists(self.displayedUnit) then
+		CompactUnitFrame_UpdateSelectionHighlight(self)
+		CompactUnitFrame_UpdateMaxHealth(self)
+		CompactUnitFrame_UpdateHealth(self)
+		CompactUnitFrame_UpdateHealPrediction(self)
+
+		self:UpdateRaidTarget()
+		CompactUnitFrame_UpdateHealthColor(self)
+		CompactUnitFrame_UpdateName(self);
+		self:UpdateThreat()
+		self:OnUnitAuraUpdate()
+		self:UpdateQuestVisuals()
+		self:UpdateStatusBar()
+	end
+end
+
+function UnitFrameMixin:OnEvent(event, ...)
+	local arg1, arg2, arg3, arg4 = ...
+	if ( event == 'PLAYER_TARGET_CHANGED' ) then
+		CompactUnitFrame_UpdateSelectionHighlight(self);
+		CompactUnitFrame_UpdateName(self);
+
+	elseif ( arg1 == self.unit or arg1 == self.displayedUnit ) then
+		if ( event == 'UNIT_MAXHEALTH' ) then
+			CompactUnitFrame_UpdateMaxHealth(self)
+			CompactUnitFrame_UpdateHealth(self)
+			CompactUnitFrame_UpdateHealPrediction(self)
+		elseif ( event == 'UNIT_HEALTH' or event == 'UNIT_HEALTH_FREQUENT' ) then
+			CompactUnitFrame_UpdateHealth(self)
+			CompactUnitFrame_UpdateHealPrediction(self)
+		elseif ( event == 'UNIT_NAME_UPDATE' ) then
+			CompactUnitFrame_UpdateName(self)
+			CompactUnitFrame_UpdateHealthColor(self)
+		elseif ( event == 'UNIT_AURA' ) then
+			self:OnUnitAuraUpdate()
+		elseif ( event == 'UNIT_THREAT_SITUATION_UPDATE' ) then
+			self:UpdateThreat()
+			--CompactUnitFrame_UpdateHealthBorder(self)
+		elseif ( event == 'UNIT_THREAT_LIST_UPDATE' ) then
+			if ( self.optionTable.considerSelectionInCombatAsHostile ) then
+				CompactUnitFrame_UpdateHealthColor(self)
+				CompactUnitFrame_UpdateName(self)
+			end
+			self:UpdateThreat()
+		elseif ( event == 'UNIT_HEAL_PREDICTION' or event == 'UNIT_ABSORB_AMOUNT_CHANGED' or event == 'UNIT_HEAL_ABSORB_AMOUNT_CHANGED' ) then
+			CompactUnitFrame_UpdateHealPrediction(self)
+		elseif ( event == 'UNIT_ENTERED_VEHICLE' or event == 'UNIT_EXITED_VEHICLE' or event == 'UNIT_PET' ) then
+			self:UpdateAllElements()
+		end
+	end
+end
+
+function UnitFrameMixin:UpdateInVehicle()
+	if ( UnitHasVehicleUI(self.unit) ) then
+		if ( not self.inVehicle ) then
+			self.inVehicle = true
+			local prefix, id, suffix = string.match(self.unit, '([^%d]+)([%d]*)(.*)')
+			self.displayedUnit = prefix..'pet'..id..suffix
+			self:UpdateUnitEvents()
+		end
+	else
+		if ( self.inVehicle ) then
+			self.inVehicle = false
+			self.displayedUnit = self.unit
+			self:UpdateUnitEvents()
+		end
+	end
+end
+
+function UnitFrameMixin:UpdateRaidTarget()
+	local icon = self.raidTargetIcon;
+	local index = GetRaidTargetIndex(self.unit)
+	if ( index ) then
+		SetRaidTargetIconTexture(icon, index);
+		icon:Show();
+		if self.optionTable.colorHealthByRaidIcon then
+			self.optionTable.healthBarColorOverride = raidIconColor[index]
+		end
+	else
+		self.optionTable.healthBarColorOverride = nil
+		icon:Hide();
+	end
+end
+
+function UnitFrameMixin:UpdateThreat()
+	local tex = self.aggroHighlight
+	if not self.optionTable.tankBorderColor then
+		tex:Hide()
+		return
+	end
+
+	local isTanking, status = UnitDetailedThreatSituation('player', self.displayedUnit)
+	if status ~= nil then
+		Debug("Aggro...")
+		if MOD.IsPlayerEffectivelyTank() then
+			Debug("... and I'm the tank")
+			status = math.abs(status - 2)
+		end
+		if status > 0 then
+			Debug("...and I have the threat")
+			tex:SetVertexColor(GetThreatStatusColor(status))
+			if not tex:IsShown() then
+				Debug("showing the aggroHighlight")
+				tex:Show()
+			end
+			return
+		end
+	end
+	tex:Hide()
+end
+
+function UnitFrameMixin:UpdateStatusBar()
+	self.healthBar:SetStatusBarTexture(config.StatusbarTexture, 'BACKGROUND', 1)
+	self.castBar:SetStatusBarTexture(config.StatusbarTexture, 'BACKGROUND', 1)
+	if not UnitIsUnit(self.displayedUnit,'player') then
+		self.level:SetText(UnitLevel(self.displayedUnit))
+
+		if config.SuperStyled and MOD.IsEliteUnit(self.displayedUnit) then
+			self.healthBar.eliteborder:Show()
+		else
+			self.healthBar.eliteborder:Hide()
+		end
+		MOD.Colorize(self)
+	else
+		self.level:SetText(nil)
+		self.healthBar.eliteborder:Hide()
+	end
+end
+
+function UnitFrameMixin:UpdateQuestVisuals()
+	local isQuest, numLeft = MOD.GetUnitQuestInfo(self.displayedUnit)
+	if (isQuest) then
+		if (numLeft > 0) then
+			self.questText:SetText(numLeft)
+		else
+			self.questText:SetText('?')
+		end
+		self.questIcon:Show()
+	else
+		self.questText:SetText(nil)
+		self.questIcon:Hide()
+	end
+end
+
+function UnitFrameMixin:OnUnitAuraUpdate()
+	self.BuffFrame:UpdateBuffs(self.displayedUnit, self.optionTable.filter)
+
+
+end
+
diff --git a/SVUI_NamePlates/assets/UNIT-AGGRO.blp b/SVUI_NamePlates/assets/UNIT-AGGRO.blp
deleted file mode 100644
index 35ad289..0000000
Binary files a/SVUI_NamePlates/assets/UNIT-AGGRO.blp and /dev/null differ