diff --git a/Interface/AddOns/SVUI/packages/unit/elements/essentials.lua b/Interface/AddOns/SVUI/packages/unit/elements/essentials.lua
index 17f5170..c454359 100644
--- a/Interface/AddOns/SVUI/packages/unit/elements/essentials.lua
+++ b/Interface/AddOns/SVUI/packages/unit/elements/essentials.lua
@@ -350,7 +350,6 @@ end
function MOD:SetActionPanel(frame, unit, noHealthText, noPowerText, noMiscText)
if(unit and (unit == "target" or unit == "player")) then
frame.ActionPanel = CreateActionPanel(frame, 3)
- frame.Threat = CreateThreat(frame.ActionPanel, unit)
local info = CreateFrame("Frame", nil, frame)
info:SetFrameStrata("BACKGROUND")
@@ -466,6 +465,8 @@ function MOD:SetActionPanel(frame, unit, noHealthText, noPowerText, noMiscText)
frame.InfoPanel:Point("BOTTOMRIGHT", frame.ActionPanel, "BOTTOMRIGHT", -2, 2)
end
+ frame.Threat = CreateThreat(frame.ActionPanel, unit)
+
frame.InfoPanel.Name = CreateNameText(frame.InfoPanel, unit)
local reverse = unit and (unit == "target" or unit == "focus" or unit == "boss" or unit == "arena") or false;
diff --git a/Interface/AddOns/SVUI/packages/unit/frames/raid.lua b/Interface/AddOns/SVUI/packages/unit/frames/raid.lua
new file mode 100644
index 0000000..80ca094
--- /dev/null
+++ b/Interface/AddOns/SVUI/packages/unit/frames/raid.lua
@@ -0,0 +1,1168 @@
+--[[
+##############################################################################
+_____/\\\\\\\\\\\____/\\\________/\\\__/\\\________/\\\__/\\\\\\\\\\\_ #
+ ___/\\\/////////\\\_\/\\\_______\/\\\_\/\\\_______\/\\\_\/////\\\///__ #
+ __\//\\\______\///__\//\\\______/\\\__\/\\\_______\/\\\_____\/\\\_____ #
+ ___\////\\\__________\//\\\____/\\\___\/\\\_______\/\\\_____\/\\\_____ #
+ ______\////\\\________\//\\\__/\\\____\/\\\_______\/\\\_____\/\\\_____ #
+ _________\////\\\______\//\\\/\\\_____\/\\\_______\/\\\_____\/\\\_____ #
+ __/\\\______\//\\\______\//\\\\\______\//\\\______/\\\______\/\\\_____ #
+ _\///\\\\\\\\\\\/________\//\\\________\///\\\\\\\\\/____/\\\\\\\\\\\_#
+ ___\///////////___________\///___________\/////////_____\///////////_#
+##############################################################################
+S U P E R - V I L L A I N - U I By: Munglunch #
+##############################################################################
+--]]
+--LUA
+local unpack = unpack;
+local select = select;
+local pairs = pairs;
+local type = type;
+local rawset = rawset;
+local rawget = rawget;
+local tostring = tostring;
+local error = error;
+local next = next;
+local pcall = pcall;
+local getmetatable = getmetatable;
+local setmetatable = setmetatable;
+local assert = assert;
+--BLIZZARD
+local _G = _G;
+local tinsert = _G.tinsert;
+local tremove = _G.tremove;
+local twipe = _G.wipe;
+--STRING
+local string = string;
+local format = string.format;
+local sub = string.sub;
+local upper = string.upper;
+local match = string.match;
+local gsub = string.gsub;
+--MATH
+local math = math;
+local numMin = math.min;
+--TABLE
+local table = table;
+local tsort = table.sort;
+local tremove = table.remove;
+
+local SV = select(2, ...)
+local oUF_Villain = SV.oUF
+
+assert(oUF_Villain, "SVUI was unable to locate oUF.")
+
+local L = SV.L;
+local MOD = SV.SVUnit
+
+if(not MOD) then return end
+--[[
+##########################################################
+LOCAL DATA
+##########################################################
+]]--
+local sortMapping = {
+ ["DOWN_RIGHT"] = {[1]="TOP",[2]="TOPLEFT",[3]="LEFT",[4]=1,[5]=-1,[6]=false},
+ ["DOWN_LEFT"] = {[1]="TOP",[2]="TOPRIGHT",[3]="RIGHT",[4]=1,[5]=-1,[6]=false},
+ ["UP_RIGHT"] = {[1]="BOTTOM",[2]="BOTTOMLEFT",[3]="LEFT",[4]=1,[5]=1,[6]=false},
+ ["UP_LEFT"] = {[1]="BOTTOM",[2]="BOTTOMRIGHT",[3]="RIGHT",[4]=-1,[5]=1,[6]=false},
+ ["RIGHT_DOWN"] = {[1]="LEFT",[2]="TOPLEFT",[3]="TOP",[4]=1,[5]=-1,[6]=true},
+ ["RIGHT_UP"] = {[1]="LEFT",[2]="BOTTOMLEFT",[3]="BOTTOM",[4]=1,[5]=1,[6]=true},
+ ["LEFT_DOWN"] = {[1]="RIGHT",[2]="TOPRIGHT",[3]="TOP",[4]=-1,[5]=-1,[6]=true},
+ ["LEFT_UP"] = {[1]="RIGHT",[2]="BOTTOMRIGHT",[3]="BOTTOM",[4]=-1,[5]=1,[6]=true},
+ ["UP"] = {[1]="BOTTOM",[2]="BOTTOM",[3]="BOTTOM",[4]=1,[5]=1,[6]=false},
+ ["DOWN"] = {[1]="TOP",[2]="TOP",[3]="TOP",[4]=1,[5]=1,[6]=false},
+}
+local GroupDistributor = {
+ ["CLASS"] = function(x)
+ x:SetAttribute("groupingOrder","DEATHKNIGHT,DRUID,HUNTER,MAGE,PALADIN,PRIEST,SHAMAN,WARLOCK,WARRIOR,MONK")
+ x:SetAttribute("sortMethod","NAME")
+ x:SetAttribute("groupBy","CLASS")
+ end,
+ ["MTMA"] = function(x)
+ x:SetAttribute("groupingOrder","MAINTANK,MAINASSIST,NONE")
+ x:SetAttribute("sortMethod","NAME")
+ x:SetAttribute("groupBy","ROLE")
+ end,
+ ["ROLE_TDH"] = function(x)
+ x:SetAttribute("groupingOrder","TANK,DAMAGER,HEALER,NONE")
+ x:SetAttribute("sortMethod","NAME")
+ x:SetAttribute("groupBy","ASSIGNEDROLE")
+ end,
+ ["ROLE_HTD"] = function(x)
+ x:SetAttribute("groupingOrder","HEALER,TANK,DAMAGER,NONE")
+ x:SetAttribute("sortMethod","NAME")
+ x:SetAttribute("groupBy","ASSIGNEDROLE")
+ end,
+ ["ROLE_HDT"] = function(x)
+ x:SetAttribute("groupingOrder","HEALER,DAMAGER,TANK,NONE")
+ x:SetAttribute("sortMethod","NAME")
+ x:SetAttribute("groupBy","ASSIGNEDROLE")
+ end,
+ ["ROLE"] = function(x)
+ x:SetAttribute("groupingOrder","TANK,HEALER,DAMAGER,NONE")
+ x:SetAttribute("sortMethod","NAME")
+ x:SetAttribute("groupBy","ASSIGNEDROLE")
+ end,
+ ["NAME"] = function(x)
+ x:SetAttribute("groupingOrder","1,2,3,4,5,6,7,8")
+ x:SetAttribute("sortMethod","NAME")
+ x:SetAttribute("groupBy",nil)
+ end,
+ ["GROUP"] = function(x)
+ x:SetAttribute("groupingOrder","1,2,3,4,5,6,7,8")
+ x:SetAttribute("sortMethod","INDEX")
+ x:SetAttribute("groupBy","GROUP")
+ end,
+ ["PETNAME"] = function(x)
+ x:SetAttribute("groupingOrder","1,2,3,4,5,6,7,8")
+ x:SetAttribute("sortMethod","NAME")
+ x:SetAttribute("groupBy", nil)
+ x:SetAttribute("filterOnPet", true)
+ end
+}
+--[[
+##########################################################
+FRAME HELPERS
+##########################################################
+]]--
+local DetachSubFrames = function(...)
+ for i = 1, select("#", ...) do
+ local frame = select(i,...)
+ frame:ClearAllPoints()
+ end
+end
+
+local UpdateTargetGlow = function(self)
+ if not self.unit then return end
+ local unit = self.unit;
+ if(UnitIsUnit(unit, "target")) then
+ self.TargetGlow:Show()
+ local reaction = UnitReaction(unit, "player")
+ if(UnitIsPlayer(unit)) then
+ local _, class = UnitClass(unit)
+ if class then
+ local colors = RAID_CLASS_COLORS[class]
+ self.TargetGlow:SetBackdropBorderColor(colors.r, colors.g, colors.b)
+ else
+ self.TargetGlow:SetBackdropBorderColor(1, 1, 1)
+ end
+ elseif(reaction) then
+ local colors = FACTION_BAR_COLORS[reaction]
+ self.TargetGlow:SetBackdropBorderColor(colors.r, colors.g, colors.b)
+ else
+ self.TargetGlow:SetBackdropBorderColor(1, 1, 1)
+ end
+ else
+ self.TargetGlow:Hide()
+ end
+end
+--[[
+##########################################################
+TEMPLATES AND PROTOTYPES
+##########################################################
+]]--
+local BuildTemplates = {};
+local UpdateTemplates = {};
+--[[
+##########################################################
+COMMON
+##########################################################
+]]--
+local AllowElement = function(self)
+ if InCombatLockdown() then return; end
+
+ if not self.isForced then
+ self.sourceElement = self.unit;
+ self.unit = "player"
+ self.isForced = true;
+ self.sourceEvent = self:GetScript("OnUpdate")
+ end
+
+ self:SetScript("OnUpdate", nil)
+ self.forceShowAuras = true;
+
+ UnregisterUnitWatch(self)
+ RegisterUnitWatch(self, true)
+
+ self:Show()
+ if self:IsVisible() and self.Update then
+ self:Update()
+ end
+end
+
+local RestrictElement = function(self)
+ if(InCombatLockdown() or (not self.isForced)) then return; end
+
+ self.forceShowAuras = nil
+ self.isForced = nil
+
+ UnregisterUnitWatch(self)
+ RegisterUnitWatch(self)
+
+ if self.sourceEvent then
+ self:SetScript("OnUpdate", self.sourceEvent)
+ self.sourceEvent = nil
+ end
+
+ self.unit = self.sourceElement or self.unit;
+
+ if self:IsVisible() and self.Update then
+ self:Update()
+ end
+end
+--[[
+##########################################################
+PARTY FRAMES
+##########################################################
+]]--
+local PartyUnitUpdate = function(self)
+ local db = SV.db.SVUnit.party
+ self.colors = oUF_Villain.colors;
+ self:RegisterForClicks(SV.db.SVUnit.fastClickTarget and 'AnyDown' or 'AnyUp')
+ MOD.RefreshUnitMedia(self, "party")
+ if self.isChild then
+ local altDB = db.petsGroup;
+ if self == _G[self.originalParent:GetName()..'Target'] then
+ altDB = db.targetsGroup
+ end
+ if not self.originalParent.childList then
+ self.originalParent.childList = {}
+ end
+ self.originalParent.childList[self] = true;
+ if not InCombatLockdown()then
+ if altDB.enable then
+ local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(altDB, "partychild")
+ self:SetParent(self.originalParent)
+ self:Size(UNIT_WIDTH, UNIT_HEIGHT)
+ self:ClearAllPoints()
+ SV:ReversePoint(self, altDB.anchorPoint, self.originalParent, altDB.xOffset, altDB.yOffset)
+ else
+ self:SetParent(SV.Cloaked)
+ end
+ end
+ do
+ local health = self.Health;
+ health.Smooth = nil;
+ health.frequentUpdates = nil;
+ health.colorSmooth = nil;
+ health.colorHealth = nil;
+ health.colorClass = true;
+ health.colorReaction = true;
+ health:ClearAllPoints()
+ health:Point("TOPRIGHT", self, "TOPRIGHT", -1, -1)
+ health:Point("BOTTOMLEFT", self, "BOTTOMLEFT", 1, 1)
+ end
+ do
+ local nametext = self.InfoPanel.Name
+ self:Tag(nametext, altDB.tags)
+ end
+ else
+ if not InCombatLockdown() then
+ local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(db, "party")
+ self:Size(UNIT_WIDTH, UNIT_HEIGHT)
+ end
+ MOD:RefreshUnitLayout(self, "party")
+ MOD:UpdateAuraWatch(self, "party")
+ end
+ self:EnableElement('ReadyCheck')
+ self:UpdateAllElements()
+end
+
+UpdateTemplates["party"] = function(self)
+ if(SV.NeedsFrameAudit) then return end
+ local db = SV.db.SVUnit.party
+ local groupFrame = self:GetParent()
+
+ if not groupFrame.positioned then
+ groupFrame:ClearAllPoints()
+ groupFrame:Point("LEFT",SV.Screen,"LEFT",40,0)
+ RegisterStateDriver(groupFrame, "visibility", "[group:raid][nogroup] hide;show")
+ SV.Mentalo:Add(groupFrame, L['Party Frames'], nil, nil, nil, 'ALL,PARTY,ARENA');
+ groupFrame.positioned = true;
+ end
+
+ local index = 1;
+ local attIndex = ("child%d"):format(index)
+ local childFrame = self:GetAttribute(attIndex)
+ if(not childFrame) then return end
+ local childName = childFrame:GetName()
+ local petFrame = _G[("%sPet"):format(childName)]
+ local targetFrame = _G[("%sTarget"):format(childName)]
+
+ while childFrame do
+ childFrame:UnitUpdate()
+
+ childName = childFrame:GetName()
+ petFrame = _G[("%sPet"):format(childName)]
+ targetFrame = _G[("%sTarget"):format(childName)]
+
+ if(petFrame) then
+ petFrame:UnitUpdate()
+ end
+
+ if(targetFrame) then
+ targetFrame:UnitUpdate()
+ end
+
+ index = index + 1;
+ attIndex = ("child%d"):format(index)
+ childFrame = self:GetAttribute(attIndex)
+ end
+end
+
+BuildTemplates["party"] = function(self, unit)
+ self.unit = unit
+ self.___key = "party"
+ self:SetScript("OnEnter", UnitFrame_OnEnter)
+ self:SetScript("OnLeave", UnitFrame_OnLeave)
+
+ MOD:SetActionPanel(self, "party")
+ self.Health = MOD:CreateHealthBar(self, true)
+
+ if self.isChild then
+ self.originalParent = self:GetParent()
+ else
+ self.Power = MOD:CreatePowerBar(self, true)
+ self.Power.frequentUpdates = false
+ MOD:CreatePortrait(self, true)
+ self.Buffs = MOD:CreateBuffs(self, "party")
+ self.Debuffs = MOD:CreateDebuffs(self, "party")
+ self.AuraWatch = MOD:CreateAuraWatch(self, "party")
+ self.Afflicted = MOD:CreateAfflicted(self)
+ self.ResurrectIcon = MOD:CreateResurectionIcon(self)
+ self.LFDRole = MOD:CreateRoleIcon(self)
+ self.RaidRoleFramesAnchor = MOD:CreateRaidRoleFrames(self)
+ self.RaidIcon = MOD:CreateRaidIcon(self)
+ self.ReadyCheck = MOD:CreateReadyCheckIcon(self)
+ self.HealPrediction = MOD:CreateHealPrediction(self)
+ --self.GPS = MOD:CreateGPS(self, true)
+
+ local shadow = CreateFrame("Frame", nil, self)
+ shadow:SetFrameLevel(1)
+ shadow:SetFrameStrata(self:GetFrameStrata())
+ shadow:WrapOuter(self, 3, 3)
+ shadow:SetBackdrop({
+ edgeFile = [[Interface\AddOns\SVUI\assets\artwork\Template\GLOW]],
+ edgeSize = 3,
+ insets = {
+ left = 5,
+ right = 5,
+ top = 5,
+ bottom = 5
+ }
+ })
+ shadow:SetBackdropColor(0, 0, 0, 0)
+ shadow:SetBackdropBorderColor(0, 0, 0, 0.9)
+ shadow:Hide()
+ self.TargetGlow = shadow
+ tinsert(self.__elements, UpdateTargetGlow)
+ self:RegisterEvent("PLAYER_TARGET_CHANGED", UpdateTargetGlow)
+ self:RegisterEvent("PLAYER_ENTERING_WORLD", UpdateTargetGlow)
+ self:RegisterEvent("GROUP_ROSTER_UPDATE", UpdateTargetGlow)
+ end
+
+ self.Range = { insideAlpha = 1, outsideAlpha = 1 }
+
+ self.Restrict = RestrictElement
+ self.Allow = AllowElement
+ self.UnitUpdate = PartyUnitUpdate
+
+ return self
+end
+--[[
+##########################################################
+RAID FRAMES
+##########################################################
+]]--
+local RaidUnitUpdate = function(self)
+ local db = SV.db.SVUnit.raid
+ self.colors = oUF_Villain.colors;
+ self:RegisterForClicks(SV.db.SVUnit.fastClickTarget and "AnyDown" or "AnyUp")
+
+ local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(db)
+ if not InCombatLockdown() then
+ self:Size(UNIT_WIDTH, UNIT_HEIGHT)
+ end
+
+ do
+ local rdBuffs = self.RaidDebuffs;
+ if db.rdebuffs.enable then
+ if not self:IsElementEnabled('RaidDebuffs') then
+ self:EnableElement("RaidDebuffs")
+ end
+ local actualSz = numMin(db.rdebuffs.size, (UNIT_HEIGHT - 8))
+ rdBuffs:Size(actualSz)
+ rdBuffs:Point("CENTER", self, "CENTER", db.rdebuffs.xOffset, db.rdebuffs.yOffset)
+ rdBuffs:Show()
+ else
+ self:DisableElement("RaidDebuffs")
+ rdBuffs:Hide()
+ end
+ end
+
+ MOD.RefreshUnitMedia(self, token)
+ MOD:UpdateAuraWatch(self, token)
+ MOD:RefreshUnitLayout(self, token)
+
+ if(token ~= "raidpet") then
+ self:EnableElement("ReadyCheck")
+ end
+ self:UpdateAllElements()
+end
+
+UpdateTemplates["raid"] = function(self)
+ if(SV.NeedsFrameAudit) then return end
+ local db = SV.db.SVUnit.raid
+ local groupFrame = self:GetParent()
+
+ if not groupFrame.positioned then
+ groupFrame:ClearAllPoints()
+ groupFrame:Point("LEFT", SV.Screen, "LEFT", 4, 0)
+ RegisterStateDriver(groupFrame, "visibility", "[group:raid] show; hide")
+ SV.Mentalo:Add(groupFrame, "Raid Frames")
+ groupFrame.positioned = true
+ end
+
+ local index = 1;
+ local attIndex = ("child%d"):format(index)
+ local childFrame = self:GetAttribute(attIndex)
+ if(not childFrame) then return end
+ local childName = childFrame:GetName()
+ local petFrame = _G[("%sPet"):format(childName)]
+ local targetFrame = _G[("%sTarget"):format(childName)]
+
+ while childFrame do
+ childFrame:UnitUpdate()
+
+ childName = childFrame:GetName()
+ petFrame = _G[("%sPet"):format(childName)]
+ targetFrame = _G[("%sTarget"):format(childName)]
+
+ if(petFrame) then
+ petFrame:UnitUpdate()
+ end
+
+ if(targetFrame) then
+ targetFrame:UnitUpdate()
+ end
+
+ index = index + 1;
+ attIndex = ("child%d"):format(index)
+ childFrame = self:GetAttribute(attIndex)
+ end
+end
+
+BuildTemplates["raid"] = function(self, unit)
+ self.unit = unit
+ self.___key = "raid"
+ MOD:SetActionPanel(self, "raid")
+ self.Health = MOD:CreateHealthBar(self, true)
+ self.Health.frequentUpdates = false
+ self.Power = MOD:CreatePowerBar(self, true)
+ self.Power.frequentUpdates = false
+ self.Buffs = MOD:CreateBuffs(self, "raid")
+ self.Debuffs = MOD:CreateDebuffs(self, "raid")
+ self.AuraWatch = MOD:CreateAuraWatch(self, "raid")
+ self.RaidDebuffs = MOD:CreateRaidDebuffs(self)
+ self.Afflicted = MOD:CreateAfflicted(self)
+ self.ResurrectIcon = MOD:CreateResurectionIcon(self)
+ self.LFDRole = MOD:CreateRoleIcon(self)
+ self.RaidRoleFramesAnchor = MOD:CreateRaidRoleFrames(self)
+ self.RaidIcon = MOD:CreateRaidIcon(self)
+ self.ReadyCheck = MOD:CreateReadyCheckIcon(self)
+ self.HealPrediction = MOD:CreateHealPrediction(self)
+ self.Range = { insideAlpha = 1, outsideAlpha = 1 }
+
+ self.Restrict = RestrictElement
+ self.Allow = AllowElement
+ self.UnitUpdate = RaidUnitUpdate
+
+ local shadow = CreateFrame("Frame", nil, self)
+ shadow:SetFrameLevel(1)
+ shadow:SetFrameStrata(self:GetFrameStrata())
+ shadow:WrapOuter(self, 3, 3)
+ shadow:SetBackdrop({
+ edgeFile = [[Interface\AddOns\SVUI\assets\artwork\Template\GLOW]],
+ edgeSize = 3,
+ insets = {
+ left = 5,
+ right = 5,
+ top = 5,
+ bottom = 5
+ }
+ })
+ shadow:SetBackdropColor(0, 0, 0, 0)
+ shadow:SetBackdropBorderColor(0, 0, 0, 0.9)
+ shadow:Hide()
+ self.TargetGlow = shadow
+
+ tinsert(self.__elements, UpdateTargetGlow)
+
+ self:SetScript("OnEnter", UnitFrame_OnEnter)
+ self:SetScript("OnLeave", UnitFrame_OnLeave)
+ self:RegisterEvent("PLAYER_TARGET_CHANGED", UpdateTargetGlow)
+ self:RegisterEvent("PLAYER_ENTERING_WORLD", UpdateTargetGlow)
+
+ return self
+end
+--[[
+##########################################################
+RAID PETS
+##########################################################
+]]--
+UpdateTemplates["raidpet"] = function(self)
+ if(SV.NeedsFrameAudit) then return end
+ local db = SV.db.SVUnit.raidpet
+ local groupFrame = self:GetParent()
+
+ if not groupFrame.positioned then
+ groupFrame:ClearAllPoints()
+ groupFrame:Point("BOTTOMLEFT", SV.Screen, "BOTTOMLEFT", 4, 433)
+ RegisterStateDriver(groupFrame, "visibility", "[group:raid] show; hide")
+ SV.Mentalo:Add(groupFrame, L["Raid Pet Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40")
+ groupFrame.positioned = true;
+ end
+
+ RaidPetVisibility(groupFrame)
+
+ local index = 1;
+ local attIndex = ("child%d"):format(index)
+ local childFrame = self:GetAttribute(attIndex)
+ if(not childFrame) then return end
+ local childName = childFrame:GetName()
+ local petFrame = _G[("%sPet"):format(childName)]
+ local targetFrame = _G[("%sTarget"):format(childName)]
+
+ while childFrame do
+ childFrame:UnitUpdate()
+
+ childName = childFrame:GetName()
+ petFrame = _G[("%sPet"):format(childName)]
+ targetFrame = _G[("%sTarget"):format(childName)]
+
+ if(petFrame) then
+ petFrame:UnitUpdate()
+ end
+
+ if(targetFrame) then
+ targetFrame:UnitUpdate()
+ end
+
+ index = index + 1;
+ attIndex = ("child%d"):format(index)
+ childFrame = self:GetAttribute(attIndex)
+ end
+end
+
+BuildTemplates["raidpet"] = function(self, unit)
+ self.unit = unit
+ self.___key = "raidpet"
+ self:SetScript("OnEnter", UnitFrame_OnEnter)
+ self:SetScript("OnLeave", UnitFrame_OnLeave)
+ MOD:SetActionPanel(self, "raidpet")
+ self.Health = MOD:CreateHealthBar(self, true)
+ self.Debuffs = MOD:CreateDebuffs(self, "raidpet")
+ self.AuraWatch = MOD:CreateAuraWatch(self, "raidpet")
+ self.RaidDebuffs = MOD:CreateRaidDebuffs(self)
+ self.Afflicted = MOD:CreateAfflicted(self)
+ self.RaidIcon = MOD:CreateRaidIcon(self)
+ self.Range = { insideAlpha = 1, outsideAlpha = 1 }
+
+ self.Restrict = RestrictElement
+ self.Allow = AllowElement
+ self.UnitUpdate = RaidUnitUpdate
+
+ local shadow = CreateFrame("Frame", nil, self)
+ shadow:SetFrameLevel(1)
+ shadow:SetFrameStrata(self:GetFrameStrata())
+ shadow:WrapOuter(self, 3, 3)
+ shadow:SetBackdrop({
+ edgeFile = [[Interface\AddOns\SVUI\assets\artwork\Template\GLOW]],
+ edgeSize = 3,
+ insets = {
+ left = 5,
+ right = 5,
+ top = 5,
+ bottom = 5
+ }
+ })
+ shadow:SetBackdropColor(0, 0, 0, 0)
+ shadow:SetBackdropBorderColor(0, 0, 0, 0.9)
+ shadow:Hide()
+ self.TargetGlow = shadow
+ tinsert(self.__elements, UpdateTargetGlow)
+
+ self:RegisterEvent("PLAYER_TARGET_CHANGED", UpdateTargetGlow)
+ self:RegisterEvent("PLAYER_ENTERING_WORLD", UpdateTargetGlow)
+ return self
+end
+--[[
+##########################################################
+TANK
+##########################################################
+]]--
+local TankUnitUpdate = function(self)
+ local db = SV.db.SVUnit.tank
+ self.colors = oUF_Villain.colors;
+ self:RegisterForClicks(SV.db.SVUnit.fastClickTarget and "AnyDown" or "AnyUp")
+ MOD.RefreshUnitMedia(self, "tank")
+ if self.isChild and self.originalParent then
+ local targets = db.targetsGroup;
+ if not self.originalParent.childList then
+ self.originalParent.childList = {}
+ end
+ self.originalParent.childList[self] = true;
+ if not InCombatLockdown()then
+ if targets.enable then
+ local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(targets)
+ self:SetParent(self.originalParent)
+ self:Size(UNIT_WIDTH, UNIT_HEIGHT)
+ self:ClearAllPoints()
+ SV:ReversePoint(self, targets.anchorPoint, self.originalParent, targets.xOffset, targets.yOffset)
+ else
+ self:SetParent(SV.Cloaked)
+ end
+ end
+ elseif not InCombatLockdown() then
+ local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(db)
+ self:Size(UNIT_WIDTH, UNIT_HEIGHT)
+ end
+ MOD:RefreshUnitLayout(self, "tank")
+ do
+ local nametext = self.InfoPanel.Name;
+ if oUF_Villain.colors.healthclass then
+ self:Tag(nametext, "[name:10]")
+ else
+ self:Tag(nametext, "[name:color][name:10]")
+ end
+ end
+ self:UpdateAllElements()
+end
+
+UpdateTemplates["tank"] = function(self)
+ if(SV.NeedsFrameAudit) then return end
+ local db = SV.db.SVUnit.tank
+
+ if db.enable ~= true then
+ UnregisterAttributeDriver(self, "state-visibility")
+ self:Hide()
+ return
+ end
+
+ self:Hide()
+ DetachSubFrames(self:GetChildren())
+ self:SetAttribute("startingIndex", -1)
+ RegisterAttributeDriver(self, "state-visibility", "show")
+ self.dirtyWidth, self.dirtyHeight = self:GetSize()
+ RegisterAttributeDriver(self, "state-visibility", "[@raid1, exists] show;hide")
+ self:SetAttribute("startingIndex", 1)
+ self:SetAttribute("point", "BOTTOM")
+ self:SetAttribute("columnAnchorPoint", "LEFT")
+ DetachSubFrames(self:GetChildren())
+ self:SetAttribute("yOffset", 7)
+
+ if not self.positioned then
+ self:ClearAllPoints()
+ self:Point("TOPLEFT", SV.Screen, "TOPLEFT", 4, -40)
+ SV.Mentalo:Add(self, L["Tank Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40")
+ self.Avatar.positionOverride = "TOPLEFT"
+ self:SetAttribute("minHeight", self.dirtyHeight)
+ self:SetAttribute("minWidth", self.dirtyWidth)
+ self.positioned = true
+ end
+
+ local childFrame, childName, petFrame, targetFrame
+ for i = 1, self:GetNumChildren() do
+ childFrame = select(i, self:GetChildren())
+ childFrame:UnitUpdate()
+
+ childName = childFrame:GetName()
+ petFrame = _G[("%sPet"):format(childName)]
+ targetFrame = _G[("%sTarget"):format(childName)]
+
+ if(petFrame) then
+ petFrame:UnitUpdate()
+ end
+ if(targetFrame) then
+ targetFrame:UnitUpdate()
+ end
+ end
+end
+
+BuildTemplates["tank"] = function(self, unit)
+ local db = SV.db.SVUnit.tank
+ self.unit = unit
+ self.___key = "tank"
+ self:SetScript("OnEnter", UnitFrame_OnEnter)
+ self:SetScript("OnLeave", UnitFrame_OnLeave)
+ MOD:SetActionPanel(self, "tank")
+ self.Health = MOD:CreateHealthBar(self, true)
+ self.RaidIcon = MOD:CreateRaidIcon(self)
+ self.RaidIcon:SetPoint("BOTTOMRIGHT")
+
+ self.Restrict = RestrictElement
+ self.Allow = AllowElement
+ self.UnitUpdate = TankUnitUpdate
+
+ self.Range = { insideAlpha = 1, outsideAlpha = 1 }
+ self.originalParent = self:GetParent()
+
+ self:UnitUpdate()
+ return self
+end
+--[[
+##########################################################
+ASSIST
+##########################################################
+]]--
+local AssistUnitUpdate = function(self)
+ local db = SV.db.SVUnit.assist
+ self.colors = oUF_Villain.colors;
+ self:RegisterForClicks(SV.db.SVUnit.fastClickTarget and "AnyDown" or "AnyUp")
+ MOD.RefreshUnitMedia(self, "assist")
+ if self.isChild and self.originalParent then
+ local targets = db.targetsGroup;
+ if not self.originalParent.childList then
+ self.originalParent.childList = {}
+ end
+ self.originalParent.childList[self] = true;
+ if not InCombatLockdown()then
+ if targets.enable then
+ local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(targets)
+ self:SetParent(self.originalParent)
+ self:Size(UNIT_WIDTH, UNIT_HEIGHT)
+ self:ClearAllPoints()
+ SV:ReversePoint(self, targets.anchorPoint, self.originalParent, targets.xOffset, targets.yOffset)
+ else
+ self:SetParent(SV.Cloaked)
+ end
+ end
+ elseif not InCombatLockdown() then
+ local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(db)
+ self:Size(UNIT_WIDTH, UNIT_HEIGHT)
+ end
+
+ MOD:RefreshUnitLayout(self, "assist")
+
+ do
+ local nametext = self.InfoPanel.Name;
+ if oUF_Villain.colors.healthclass then
+ self:Tag(nametext, "[name:10]")
+ else
+ self:Tag(nametext, "[name:color][name:10]")
+ end
+ end
+ self:UpdateAllElements()
+end
+
+UpdateTemplates["assist"] = function(self)
+ if(SV.NeedsFrameAudit) then return end
+ local db = SV.db.SVUnit.assist
+
+ self:Hide()
+ DetachSubFrames(self:GetChildren())
+ self:SetAttribute("startingIndex", -1)
+ RegisterAttributeDriver(self, "state-visibility", "show")
+ self.dirtyWidth, self.dirtyHeight = self:GetSize()
+ RegisterAttributeDriver(self, "state-visibility", "[@raid1, exists] show;hide")
+ self:SetAttribute("startingIndex", 1)
+ self:SetAttribute("point", "BOTTOM")
+ self:SetAttribute("columnAnchorPoint", "LEFT")
+ DetachSubFrames(self:GetChildren())
+ self:SetAttribute("yOffset", 7)
+
+ if not self.positioned then
+ self:ClearAllPoints()
+ self:Point("TOPLEFT", SV.Screen, "TOPLEFT", 4, -140)
+ SV.Mentalo:Add(self, L["Assist Frames"], nil, nil, nil, "ALL, RAID10, RAID25, RAID40")
+ self.Avatar.positionOverride = "TOPLEFT"
+ self:SetAttribute("minHeight", self.dirtyHeight)
+ self:SetAttribute("minWidth", self.dirtyWidth)
+ self.positioned = true
+ end
+
+ local childFrame, childName, petFrame, targetFrame
+ for i = 1, self:GetNumChildren() do
+ childFrame = select(i, self:GetChildren())
+ childFrame:UnitUpdate()
+
+ childName = childFrame:GetName()
+ petFrame = _G[("%sPet"):format(childName)]
+ targetFrame = _G[("%sTarget"):format(childName)]
+
+ if(petFrame) then
+ petFrame:UnitUpdate()
+ end
+ if(targetFrame) then
+ targetFrame:UnitUpdate()
+ end
+ end
+end
+
+BuildTemplates["assist"] = function(self, unit)
+ local db = SV.db.SVUnit.assist
+ self.unit = unit
+ self.___key = "assist"
+ self:SetScript("OnEnter", UnitFrame_OnEnter)
+ self:SetScript("OnLeave", UnitFrame_OnLeave)
+ MOD:SetActionPanel(self, "assist")
+ self.Health = MOD:CreateHealthBar(self, true)
+ self.RaidIcon = MOD:CreateRaidIcon(self)
+ self.RaidIcon:SetPoint("BOTTOMRIGHT")
+ self.Range = { insideAlpha = 1, outsideAlpha = 1 }
+
+ self.Restrict = RestrictElement
+ self.Allow = AllowElement
+ self.UnitUpdate = AssistUnitUpdate
+
+ self.originalParent = self:GetParent()
+
+ self:UnitUpdate()
+ return self
+end
+--[[
+##########################################################
+HEADER CONSTRUCTS
+##########################################################
+]]--
+local HeaderMediaUpdate = function(self)
+ local token = self.___groupkey
+ local index = 1;
+ local attIndex = ("child%d"):format(index)
+ local childFrame = self:GetAttribute(attIndex)
+ local childName = childFrame:GetName()
+ local petFrame = _G[("%sPet"):format(childName)]
+ local targetFrame = _G[("%sTarget"):format(childName)]
+
+ while childFrame do
+ MOD.RefreshUnitMedia(childFrame, token)
+
+ if(petFrame) then
+ MOD.RefreshUnitMedia(petFrame, token)
+ end
+
+ if(targetFrame) then
+ MOD.RefreshUnitMedia(targetFrame, token)
+ end
+
+ index = index + 1;
+ attIndex = ("child%d"):format(index)
+ childFrame = self:GetAttribute(attIndex)
+ childName = childFrame:GetName()
+ petFrame = _G[("%sPet"):format(childName)]
+ targetFrame = _G[("%sTarget"):format(childName)]
+ end
+end
+
+local HeaderUnsetAttributes = function(self)
+ self:Hide()
+ self:SetAttribute("showPlayer", true)
+ self:SetAttribute("showSolo", true)
+ self:SetAttribute("showParty", true)
+ self:SetAttribute("showRaid", true)
+ self:SetAttribute("columnSpacing", nil)
+ self:SetAttribute("columnAnchorPoint", nil)
+ self:SetAttribute("sortMethod", nil)
+ self:SetAttribute("groupFilter", nil)
+ self:SetAttribute("groupingOrder", nil)
+ self:SetAttribute("maxColumns", nil)
+ self:SetAttribute("nameList", nil)
+ self:SetAttribute("point", nil)
+ self:SetAttribute("sortDir", nil)
+ self:SetAttribute("sortMethod", "NAME")
+ self:SetAttribute("startingIndex", nil)
+ self:SetAttribute("strictFiltering", nil)
+ self:SetAttribute("unitsPerColumn", nil)
+ self:SetAttribute("xOffset", nil)
+ self:SetAttribute("yOffset", nil)
+end
+
+local HeaderEnableChildren = function(self)
+ self.isForced = true;
+ for i=1, select("#", self:GetChildren()) do
+ local childFrame = select(i, self:GetChildren())
+ childFrame:RegisterForClicks(nil)
+ childFrame:SetID(i)
+ childFrame.TargetGlow:SetAlpha(0)
+ childFrame:Allow()
+ end
+end
+
+local HeaderDisableChildren = function(self)
+ self.isForced = nil;
+ for i=1,select("#", self:GetChildren()) do
+ local childFrame = select(i, self:GetChildren())
+ childFrame:RegisterForClicks(SV.db.SVUnit.fastClickTarget and 'AnyDown' or 'AnyUp')
+ childFrame.TargetGlow:SetAlpha(1)
+ childFrame:Restrict()
+ end
+end
+
+function MOD:SetGroupHeader(parentFrame, filter, layout, headerName, token)
+ local db = SV.db.SVUnit[token]
+
+ local template1, template2
+ if(token == "raidpet") then
+ template1 = "SVUI_UNITPET"
+ template2 = "SecureGroupPetHeaderTemplate"
+ elseif(token == "tank") then
+ filter = "MAINTANK"
+ template1 = "SVUI_UNITTARGET"
+ elseif(token == "assist") then
+ filter = "MAINASSIST"
+ template1 = "SVUI_UNITTARGET"
+ end
+
+ local UNIT_WIDTH, UNIT_HEIGHT = self:GetActiveSize(db)
+ local groupHeader = oUF_Villain:SpawnHeader(headerName, template2, nil,
+ "oUF-initialConfigFunction", ("self:SetWidth(%d); self:SetHeight(%d); self:SetFrameLevel(5)"):format(UNIT_WIDTH, UNIT_HEIGHT),
+ "groupFilter", filter,
+ "showParty", true,
+ "showRaid", true,
+ "showSolo", true,
+ template1 and "template", template1
+ )
+ groupHeader.___groupkey = token
+ groupHeader:SetParent(parentFrame)
+ groupHeader.Update = UpdateTemplates[token]
+ groupHeader.MediaUpdate = HeaderMediaUpdate
+ groupHeader.UnsetAttributes = HeaderUnsetAttributes
+ groupHeader.EnableChildren = HeaderEnableChildren
+ groupHeader.DisableChildren = HeaderDisableChildren
+
+ return groupHeader
+end
+--[[
+##########################################################
+GROUP CONSTRUCTS
+##########################################################
+]]--
+local GroupUpdate = function(self)
+ local token = self.___groupkey
+ if SV.db.SVUnit[token].enable ~= true then
+ UnregisterAttributeDriver(self, "state-visibility")
+ self:Hide()
+ return
+ end
+ for i=1,#self.groups do
+ self.groups[i]:Update()
+ end
+end
+
+local GroupMediaUpdate = function(self)
+ for i=1,#self.groups do
+ self.groups[i]:MediaUpdate()
+ end
+end
+
+local GroupSetVisibility = function(self)
+ if not self.isForced then
+ local token = self.___groupkey
+ local db = SV.db.SVUnit[token]
+ if(db) then
+ for i=1,#self.groups do
+ local frame = self.groups[i]
+ if(i <= db.groupCount) then
+ frame:Show()
+ else
+ if frame.forceShow then
+ frame:Hide()
+ frame:DisableChildren()
+ frame:SetAttribute('startingIndex',1)
+ else
+ frame:UnsetAttributes()
+ end
+ end
+ end
+ end
+ end
+end
+
+local GroupConfigure = function(self)
+ local token = self.___groupkey
+ local settings = SV.db.SVUnit[token]
+ local UNIT_WIDTH, UNIT_HEIGHT = MOD:GetActiveSize(settings)
+ local sorting = settings.showBy
+ local sortMethod = settings.sortMethod
+ local widthCalc, heightCalc, xCalc, yCalc = 0, 0, 0, 0;
+ local point, anchorPoint, columnAnchor, horizontal, vertical, isHorizontal = unpack(sortMapping[sorting]);
+ local groupCount = settings.groupCount
+
+ self.groupCount = groupCount
+
+ for i = 1, groupCount do
+
+ local frame = self.groups[i]
+
+ if(frame) then
+ if(settings.showBy == "UP") then
+ settings.showBy = "UP_RIGHT"
+ end
+
+ if(settings.showBy == "DOWN") then
+ settings.showBy = "DOWN_RIGHT"
+ end
+
+ if(isHorizontal) then
+ frame:SetAttribute("xOffset", settings.wrapXOffset * horizontal)
+ frame:SetAttribute("yOffset", 0)
+ frame:SetAttribute("columnSpacing", settings.wrapYOffset)
+ else
+ frame:SetAttribute("xOffset", 0)
+ frame:SetAttribute("yOffset", settings.wrapYOffset * vertical)
+ frame:SetAttribute("columnSpacing", settings.wrapXOffset)
+ end
+
+ if(not frame.isForced) then
+ if not frame.initialized then
+ frame:SetAttribute("startingIndex", -4)
+ frame:Show()
+ frame.initialized = true
+ end
+ frame:SetAttribute("startingIndex", 1)
+ end
+
+ frame:ClearAllPoints()
+ frame:SetAttribute("columnAnchorPoint", columnAnchor)
+
+ DetachSubFrames(frame:GetChildren())
+
+ frame:SetAttribute("point", point)
+
+ if(not frame.isForced) then
+ frame:SetAttribute("maxColumns", 1)
+ frame:SetAttribute("unitsPerColumn", 5)
+ GroupDistributor[sortMethod](frame)
+ frame:SetAttribute("sortDir", settings.sortDir)
+ frame:SetAttribute("showPlayer", settings.showPlayer)
+ end
+
+ frame:SetAttribute("groupFilter", tostring(i))
+ end
+
+ if (i - 1) % settings.gRowCol == 0 then
+ if isHorizontal then
+ if(frame) then
+ frame:SetPoint(anchorPoint, self, anchorPoint, 0, heightCalc * vertical)
+ end
+
+ heightCalc = heightCalc + UNIT_HEIGHT + settings.wrapYOffset;
+ yCalc = yCalc + 1
+ else
+ if(frame) then frame:SetPoint(anchorPoint, self, anchorPoint, widthCalc * horizontal, 0) end
+
+ widthCalc = widthCalc + UNIT_WIDTH + settings.wrapXOffset;
+ xCalc = xCalc + 1
+ end
+ else
+ if isHorizontal then
+ if yCalc == 1 then
+ if(frame) then
+ frame:SetPoint(anchorPoint, self, anchorPoint, widthCalc * horizontal, 0)
+ end
+
+ widthCalc = widthCalc + (UNIT_WIDTH + settings.wrapXOffset) * 5;
+ xCalc = xCalc + 1
+ elseif(frame) then
+ frame:SetPoint(anchorPoint, self, anchorPoint, (((UNIT_WIDTH + settings.wrapXOffset) * 5) * ((i - 1) % settings.gRowCol)) * horizontal, ((UNIT_HEIGHT + settings.wrapYOffset) * (yCalc - 1)) * vertical)
+ end
+ else
+ if xCalc == 1 then
+ if(frame) then
+ frame:SetPoint(anchorPoint, self, anchorPoint, 0, heightCalc * vertical)
+ end
+
+ heightCalc = heightCalc + (UNIT_HEIGHT + settings.wrapYOffset) * 5;
+ yCalc = yCalc + 1
+ elseif(frame) then
+ frame:SetPoint(anchorPoint, self, anchorPoint, ((UNIT_WIDTH + settings.wrapXOffset) * (xCalc - 1)) * horizontal, (((UNIT_HEIGHT + settings.wrapYOffset) * 5) * ((i - 1) % settings.gRowCol)) * vertical)
+ end
+ end
+ end
+
+ if heightCalc == 0 then
+ heightCalc = heightCalc + (UNIT_HEIGHT + settings.wrapYOffset) * 5
+ elseif widthCalc == 0 then
+ widthCalc = widthCalc + (UNIT_WIDTH + settings.wrapXOffset) * 5
+ end
+ end
+
+ self:SetSize(widthCalc - settings.wrapXOffset, heightCalc - settings.wrapYOffset)
+end
+
+function MOD:GetGroupFrame(token, layout)
+ if(not self.Headers[token]) then
+ oUF_Villain:RegisterStyle(layout, BuildTemplates[token])
+ oUF_Villain:SetActiveStyle(layout)
+ local groupFrame = CreateFrame("Frame", layout, SVUI_UnitFrameParent, "SecureHandlerStateTemplate")
+ groupFrame.___groupkey = token;
+ groupFrame.groups = {}
+ groupFrame.Update = GroupUpdate
+ groupFrame.MediaUpdate = GroupMediaUpdate
+ groupFrame.SetVisibility = GroupSetVisibility
+ groupFrame.Configure = GroupConfigure
+
+ groupFrame:Show()
+ self.Headers[token] = groupFrame
+ end
+ return self.Headers[token]
+end
+
+function MOD:SetCustomFrame(token, layout)
+ if(not self.Headers[token]) then
+ oUF_Villain:RegisterStyle(layout, BuildTemplates[token])
+ oUF_Villain:SetActiveStyle(layout)
+ local groupFrame = self:SetGroupHeader(SVUI_UnitFrameParent, nil, layout, layout, token)
+ self.Headers[token] = groupFrame
+ end
+ self.Headers[token]:Show()
+ self.Headers[token]:Update()
+end
+
+function MOD:SetGroupFrame(token, forceUpdate)
+ if(InCombatLockdown()) then self:RegisterEvent("PLAYER_REGEN_ENABLED"); return end
+ if(not SV.db.SVUnit.enable) then return end
+ local settings = SV.db.SVUnit[token]
+ local realName = token:gsub("(.)", upper, 1)
+ local layout = "SVUI_"..realName
+
+ if(token == "tank" or token == "assist") then
+ return self:SetCustomFrame(token, layout)
+ end
+
+ local groupFrame = self:GetGroupFrame(token, layout)
+
+ if(token ~= "raidpet" and settings.enable ~= true) then
+ UnregisterStateDriver(groupFrame, "visibility")
+ groupFrame:Hide()
+ return
+ end
+
+ local groupName
+ for i = 1, settings.groupCount do
+ if(not groupFrame.groups[i]) then
+ groupName = layout .. "Group" .. i
+ groupFrame.groups[i] = self:SetGroupHeader(groupFrame, i, layout, groupName, token)
+ groupFrame.groups[i]:Show()
+ end
+ end
+
+ groupFrame:SetVisibility()
+
+ if(forceUpdate or not groupFrame.Avatar) then
+ groupFrame:Configure()
+ if(not groupFrame.isForced and settings.visibility) then
+ RegisterStateDriver(groupFrame, "visibility", settings.visibility)
+ end
+ else
+ groupFrame:Configure()
+ groupFrame:Update()
+ end
+
+ if(token == "raidpet" and settings.enable ~= true) then
+ UnregisterStateDriver(groupFrame, "visibility")
+ groupFrame:Hide()
+ return
+ end
+end
\ No newline at end of file
diff --git a/Interface/AddOns/SVUI/packages/unit/groups.lua b/Interface/AddOns/SVUI/packages/unit/groups.lua
index bd96a09..ea80e91 100644
--- a/Interface/AddOns/SVUI/packages/unit/groups.lua
+++ b/Interface/AddOns/SVUI/packages/unit/groups.lua
@@ -377,7 +377,6 @@ BuildTemplates["party"] = function(self, unit)
self.RaidIcon = MOD:CreateRaidIcon(self)
self.ReadyCheck = MOD:CreateReadyCheckIcon(self)
self.HealPrediction = MOD:CreateHealPrediction(self)
- --self.GPS = MOD:CreateGPS(self, true)
local shadow = CreateFrame("Frame", nil, self)
shadow:SetFrameLevel(1)
@@ -398,6 +397,7 @@ BuildTemplates["party"] = function(self, unit)
shadow:Hide()
self.TargetGlow = shadow
tinsert(self.__elements, UpdateTargetGlow)
+
self:RegisterEvent("PLAYER_TARGET_CHANGED", UpdateTargetGlow)
self:RegisterEvent("PLAYER_ENTERING_WORLD", UpdateTargetGlow)
self:RegisterEvent("GROUP_ROSTER_UPDATE", UpdateTargetGlow)