local AceOO = AceLibrary("AceOO-2.0") local L = AceLibrary("AceLocale-2.0"):new("ag_UnitFrames") local print = function(msg) if msg then DEFAULT_CHAT_FRAME:AddMessage(msg) end end -- UNIT CLASS ---- init ---- CreateFrame (creates the unit frame) ---- LoadPosition (loads frame position from DB) ---- ApplyTheme (reads and applies theme from ag_Themes.lua) ---- BorderBackground (sets a border and a background for the unit frame) ---- UpdateAll (calls all update methods for the unit) ---- UpdateName (updates the name string) ---- UpdateClass (updates the class string) ---- UpdateHealth (updates the health bar) ---- UpdatePower (updates the mana bar) ---- OnDragStop ---- OnDragStart aUF.classes = {} aUF.classes.aUFunit = AceOO.Class("AceEvent-2.0","AceHook-2.0") aUF.classes.aUFunitXP = AceOO.Class(aUF.classes.aUFunit) aUF.classes.aUFunitCombo = AceOO.Class(aUF.classes.aUFunit) aUF.classes.aUFunitMetro = AceOO.Class(aUF.classes.aUFunit) aUF.classes.aUFunitRaid = AceOO.Class(aUF.classes.aUFunit) aUF.hooks = {} function aUF.hooks.hookShowHide(frame) local show, hide = frame.Show, frame.Hide; frame.Show = function(self) if (not self.isVisibleFlag) then show(self); self.isVisibleFlag = true; end end frame.Hide = function(self) if (self.isVisibleFlag) then hide(self); self.isVisibleFlag = false; end end frame.WillHide = function(self) self.doShow = false; end frame.WillShow = function(self) self.doShow = true; end frame.DoShowHide = function(self) if (self.doShow) then self:Show() else self:Hide() end end frame:Show() end --[[function aUF.hooks.hookSetText(frame) local settext = frame.SetText frame.SetText = function(self, text) if (self.lasttext ~= text) then self.lasttext = text settext(self, text) end end end]] function aUF.hooks.hookSetTexture(frame) local settexture = frame.SetTexture frame.SetTexture = function(self, texture) if (self.lasttexture ~= texture) then self.lasttexture = texture settexture(self, texture) end end end --[[function aUF.hooks.hookSetVertexColor(frame) local setvertexcolor = frame.SetVertexColor; frame.SetVertexColor = function(self, r, g, b) if (self.lastr ~= r or self.lastg ~= g or self.lastb ~= b) then self.lastr, self.lastg, self.lastb = r, g, b setvertexcolor(self, r, g, b) end end end]] function aUF.classes.aUFunit.prototype:init(name,unit,db) aUF.classes.aUFunit.super.prototype.init(self) self.name = name self:CreateFrame() self:Reset(unit,db) self.eventsRegistered = false self:RegisterEvents(true) end function aUF.classes.aUFunit.prototype:Reset(unit,db) if unit then self.unit = unit if not db then self.type = string.gsub(unit, "%d", "") else self.type = db end _,_,self.number = string.find(unit, "(%d+)") if not self.number then self.number = 1 end if string.find(unit,"pet") then if self.type == "partypet" or self.type == "raidpet" then self.parent = string.gsub(unit,"pet","") else self.parent = "player" end end end self.flags = {} self.aCount = 0 self.database = aUF.db.profile[self.type] self:LoadScale() self:LoadPosition() self:ApplyTheme() self:BorderBackground() self:BarTexture() self:StatusBarsColor() self:UpdateAll() end function aUF.classes.aUFunit.prototype:RegisterEvents(allEvents,unregister) if not unregister and self.eventsRegistered == false then if self.unit == "player" or self.unit == "target" then self:RegisterEvent("UNIT_HEALTH", "UpdateHealth") self:RegisterEvent("UNIT_MANA", "UpdatePower") self:RegisterEvent("UNIT_RAGE", "UpdatePower") self:RegisterEvent("UNIT_FOCUS", "UpdatePower") self:RegisterEvent("UNIT_ENERGY", "UpdatePower") else self:RegisterBucketEvent("UNIT_HEALTH",0.3, "UpdateHealth") self:RegisterBucketEvent({"UNIT_MANA","UNIT_RAGE","UNIT_FOCUS","UNIT_ENERGY"},0.5, "UpdatePower") end self:RegisterEvent("UNIT_AURA", "UpdateAuras") self:RegisterEvent("UNIT_COMBAT","UnitCombat") self:RegisterEvent("UNIT_SPELLMISS","UnitSpellmiss") self:RegisterEvent("UNIT_LEVEL", "UpdateTextStrings") self:RegisterEvent("UNIT_NAME_UPDATE", "UpdateTextStrings") self:RegisterEvent("UPDATE_FACTION", "UpdatePvP") self:RegisterEvent("PLAYER_FLAGS_CHANGED", "UpdatePvP") self:RegisterEvent("UNIT_FACTION", "UpdatePvP") self:RegisterEvent("PARTY_LEADER_CHANGED", "LabelsCheckLeader") self:RegisterEvent("PARTY_LOOT_METHOD_CHANGED", "LabelsCheckLoot") self:RegisterEvent("RAID_TARGET_UPDATE", "UpdateRaidTargetIcon") -- Specific Events :( if self.type == "player" then self:RegisterEvent("PLAYER_REGEN_ENABLED", "UpdateInCombat") self:RegisterEvent("PLAYER_REGEN_DISABLED", "UpdateInCombat") self:RegisterEvent("PLAYER_UPDATE_RESTING", "UpdateResting") else if not self.inCombatSchedule then self.inCombatSchedule = self:ScheduleRepeatingEvent(self.UpdateInCombat, 0.5, self) end end if self.type == "partypet" or self.type == "pet" then self:RegisterEvent("UNIT_PET","UpdatePetAll") end if self.type == "pet" then self:RegisterEvent("UNIT_HAPPINESS","StatusBarsColor") end if allEvents == true then self:RegisterEvent("PLAYER_TARGET_CHANGED","UpdateHighlight") self:RegisterEvent("PARTY_MEMBERS_CHANGED","UpdateAll") self:RegisterEvent("RAID_ROSTER_UPDATE","UpdateAll") self:RegisterEvent("agUF_UpdateGroups", "UpdateVisibility") end self.eventsRegistered = true elseif self.eventsRegistered == true and unregister then local events = { "UNIT_AURA", "UNIT_HEALTH", "UNIT_MANA", "UNIT_RAGE", "UNIT_FOCUS", "UNIT_ENERGY", "UNIT_COMBAT", "UNIT_SPELLMISS", "UNIT_LEVEL", "UNIT_NAME_UPDATE", "UPDATE_FACTION", "PLAYER_FLAGS_CHANGED", "PARTY_LEADER_CHANGED", "PARTY_LOOT_METHOD_CHANGED", "PLAYER_REGEN_ENABLED", "PLAYER_REGEN_DISABLED", "PLAYER_UPDATE_RESTING", "RAID_TARGET_UPDATE", } for k,v in pairs(events) do if self:IsEventRegistered(v) then self:UnregisterEvent(v) end end if self.inCombatSchedule then self:CancelScheduledEvent(self.inCombatSchedule) self.inCombatSchedule = nil end self:UnregisterAllBucketEvents() self.eventsRegistered = false end end function aUF.classes.aUFunit.prototype:CreateFrame() local frameName = "aUF"..self.name self.framename = frameName self.frame = CreateFrame("Button",frameName,UIParent,"AGUnitTemplate") self.frame.name = self.name self.ClassText = getglobal(frameName.."_ClassText") self.NameLabel = getglobal(frameName.."_NameLabel") self.HitIndicator = getglobal(frameName.."_HitIndicator") self.HealthBar_BG = getglobal(frameName.."_HealthBar_BG") self.ManaBar_BG = getglobal(frameName.."_ManaBar_BG") self.XPBar_BG = getglobal(frameName.."_XPBar_BG") self.HealthBar = getglobal(frameName.."_HealthBar") self.HealthBar:SetScript("OnValueChanged",function() self:StatusBarsOnValueChanged(arg1) end) self.HealthBar:SetMinMaxValues(0,100) self.ManaBar = getglobal(frameName.."_ManaBar") self.ManaBar:SetMinMaxValues(0,100) self.XPBar = getglobal(frameName.."_XPBar") self.XPBar:SetMinMaxValues(0, 100) self.HealthText = getglobal(frameName.."_HealthText") self.ManaText = getglobal(frameName.."_ManaText") self.StatusText = getglobal(frameName.."_StatusText") self.Highlight = getglobal(frameName.."Highlight") self.Highlight:SetAlpha(0.5) self.DebuffHighlight = getglobal(frameName.."Debuff") self.DebuffHighlight:SetAlpha(0.7) self.RaidTargetIcon = getglobal(frameName.."_RaidTargetIcon") self.InCombatIcon = getglobal(frameName.."_InCombatIcon") self.PVPIcon = getglobal(frameName.."_PVPIcon") self.LeaderIcon = getglobal(frameName.."_LeaderIcon") self.MasterIcon = getglobal(frameName.."_MasterIcon") self.frame:SetScript("OnEnter",function() self:OnEnter() end) self.frame:SetScript("OnLeave",function() self:OnLeave() end) self.frame:SetScript("OnDragStart",function() self:OnDragStart(arg1) end) self.frame:SetScript("OnDragStop",function() self:OnDragStop(arg1) end) self.frame:SetScript("OnClick",function() self:OnClick(arg1) end) self.frame:SetScript("OnHide",function() this:StopMovingOrSizing() end) for i =1,20 do self["Aura"..i] = getglobal(frameName.."_Aura"..i) self["Aura"..i].Icon = getglobal(frameName.."_Aura"..i.."Icon") self["Aura"..i].Overlay = getglobal(frameName.."_Aura"..i.."Overlay") self["Aura"..i].Count = getglobal(frameName.."_Aura"..i.."Count") self["Aura"..i]:SetScript("OnEnter",function() self:AuraOnEnter() end) self["Aura"..i]:SetScript("OnLeave",function() GameTooltip:Hide() end) aUF.hooks.hookShowHide(self["Aura"..i]) aUF.hooks.hookSetTexture(self["Aura"..i].Icon) self["Aura"..i]:Hide() end if string.find(self.name,"player") then self.XPBar_Rest = CreateFrame("StatusBar",frameName.."_XPBar_Rest",self.frame) self.XPBar_Rest:SetMinMaxValues(0, 100) self.XPBar:SetParent(self.XPBar_Rest) end if AceOO.inherits(self, aUF.classes.aUFunitCombo) then self:CreateCombos() end self.frame:SetMovable(true) self.frame:EnableMouse(true) self.frame:RegisterForDrag("LeftButton") self.frame:RegisterForClicks("LeftButtonUp","RightButtonUp","MiddleButtonUp","Button4Up","Button5Up") end function aUF.classes.aUFunit.prototype:LoadScale() self.frame:SetScale(self.database.Scale) if self.subgroup then aUF.subgroups[self.subgroup]:LoadPosition() aUF.subgroups[self.subgroup]:UpdateScale() end end function aUF.classes.aUFunit.prototype:LoadPosition() if self.subgroup then return end if(aUF.db.profile.Positions[self.unit]) then local x = aUF.db.profile.Positions[self.unit].x local y = aUF.db.profile.Positions[self.unit].y local scale = self.frame:GetEffectiveScale() self.frame:SetPoint("TOPLEFT", UIParent,"TOPLEFT", x/scale, y/scale) else self.frame:SetPoint("CENTER", UIParent, "CENTER") end end function aUF.classes.aUFunit.prototype:SavePosition() local scale = self.frame:GetEffectiveScale() local worldscale = UIParent:GetEffectiveScale() local x,y = self.frame:GetLeft()*scale,self.frame:GetTop()*scale - (UIParent:GetTop())*worldscale if not aUF.db.profile.Positions[self.unit] then aUF.db.profile.Positions[self.unit] = {} end aUF.db.profile.Positions[self.unit].x = x aUF.db.profile.Positions[self.unit].y = y end function aUF.classes.aUFunit.prototype:ApplyTheme() local themetable = aUF.Layouts[self.database.FrameStyle] if not themetable then return end local hiddens = {} local manabarhide = false local xpbarhide = false local height = 0 local width = 0 if self.database.HideMana == true then manabarhide = true end if (self.unit ~= "player" and self.unit ~= "pet") or ((self.unit == "pet" or self.unit == "player") and self.database.ShowXP == false) then xpbarhide = true end self.flags.ResizableBar = themetable.ResizableBar self.flags.BackgroundBarColor = themetable.BackgroundBarColor self.flags.AlphaBar = themetable.AlphaBar self.flags.RaidColorName = themetable.RaidColorName self.flags.ThemeName = themetable.Name self.flags.PetClassName = themetable.PetClassName self.flags.HappinessBar = themetable.HappinessBar if self.unit == "target" then if themetable.ComboGFX == true then comboGFX = 1 else comboGFX = 0 end end height = themetable.ThemeData.all.FrameHeight width = themetable.ThemeData.all.FrameWidth if themetable.ThemeData[self.type] then if themetable.ThemeData[self.type].FrameHeight then height = themetable.ThemeData[self.type].FrameHeight end if themetable.ThemeData[self.type].FrameWidth then width = themetable.ThemeData[self.type].FrameWidth end end if manabarhide == true then self.flags.RaidColorName = true end for k,v in themetable.ThemeData.all do if self[k] then self[k]:ClearAllPoints() end end local index = "all" for j = 1,2 do if j == 2 then index = self.type end if themetable.ThemeData[index] then for key, value in pairs(themetable.ThemeData[index]) do if self[key] and value.Hidden ~= true and not (key == "ManaBar_BG" and manabarhide == true) and not (key == "XPBar_BG" and xpbarhide == true) and not hiddens[key] then if value.Hide then hiddens[value.Hide] = true end if value.HeightAdd then height = height + value.HeightAdd end if value.Width then self[key]:SetWidth(value.Width) end if value.Height then self[key]:SetHeight(value.Height) end if value.Font then self[key]:SetFont(value.Font,value.FontSize) end local RelativeTo if value.RelativeTo then if themetable.ThemeData[index][value.RelativeTo] and (themetable.ThemeData[index][value.RelativeTo].Hidden == true or (value.RelativeTo == "ManaBar_BG" and manabarhide)) and value.RelativeToSecondary then RelativeTo = self.framename.."_"..value.RelativeToSecondary else RelativeTo = self.framename.."_"..value.RelativeTo end else RelativeTo = self.framename end if value.x and value.y and value.Point and value.RelativePoint then local point if themetable.ResizableBar == true and self.database.LongStatusbars == false and (key == "HealthText" or key == "ManaText") then if value.Point == "RIGHT" then point = "LEFT" elseif value.Point == "LEFT" then point = "RIGHT" else point = value.Point end else point = value.Point end self[key]:SetPoint(point, RelativeTo, value.RelativePoint, value.x, value.y) end if value.Visibility then for k, v in pairs(value.Visibility) do if self[v] then self[v]:Show() end end end if value.Justify then self[key]:SetJustifyH(value.Justify) end elseif self[key] and (value.Hidden or (key == "ManaBar_BG" and manabarhide == true) or (key == "XPBar_BG" and xpbarhide == true) ) then self[key]:Hide() if value.Visibility then for k, v in pairs(value.Visibility) do if self[v] then self[v]:Hide() end end end end end end end for key,value in pairs(hiddens) do self[key]:Hide() end self.frame:SetHeight(height) self.frame:SetWidth(100) if self.widthAdd then self.database.Width = width end if self.flags.ResizableBar == true and self.database.LongStatusbars == false then self.HealthBar_BG:SetWidth(self.HealthBar_BG:GetWidth() - self.HealthText:GetWidth()) self.ManaBar_BG:SetWidth(self.ManaBar_BG:GetWidth() - self.ManaText:GetWidth()) end self.widthAdd = 0 self:SetWidth() end function aUF.classes.aUFunit.prototype:BorderBackground() local colortable local bordercolor = aUF.db.profile.FrameBorderColors local borderstyle = aUF.db.profile.BorderStyle if self.unit == "target" then colortable = aUF.db.profile.TargetFrameColors else colortable = aUF.db.profile.PartyFrameColors end self.frame:SetBackdrop({ bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16, edgeFile = aUF.Borders[borderstyle].texture, edgeSize = aUF.Borders[borderstyle].size, insets = {left = aUF.Borders[borderstyle].insets, right = aUF.Borders[borderstyle].insets, top = aUF.Borders[borderstyle].insets, bottom = aUF.Borders[borderstyle].insets}, }) self.frame:SetBackdropColor(colortable.r,colortable.g,colortable.b,colortable.a) self.frame:SetBackdropBorderColor(bordercolor.r,bordercolor.g,bordercolor.b,bordercolor.a) end function aUF.classes.aUFunit.prototype:SetWidth() local widthAdd = 100 if self.database.Width then widthAdd = self.database.Width end if not self.widthAdd then self.widthAdd = 0 end widthAdd = widthAdd - 100 widthAdd = widthAdd - self.widthAdd self.widthAdd = self.widthAdd + widthAdd self.frame:SetWidth(self.frame:GetWidth() + widthAdd) self.HealthBar_BG:SetWidth(self.HealthBar_BG:GetWidth() + widthAdd) self.ManaBar_BG:SetWidth(self.ManaBar_BG:GetWidth() + widthAdd) self.XPBar_BG:SetWidth(self.XPBar_BG:GetWidth() + widthAdd) if self.XPBar_Rest then self.XPBar_Rest:ClearAllPoints() self.XPBar_Rest:SetPoint("LEFT",self.XPBar_BG,"LEFT") self.XPBar_Rest:SetHeight(self.XPBar_BG:GetHeight()) self.XPBar_Rest:SetWidth(self.XPBar_BG:GetWidth()) end if self.XPBar then self.XPBar:ClearAllPoints() self.XPBar:SetPoint("LEFT",self.XPBar_BG,"LEFT") self.XPBar:SetHeight(self.XPBar_BG:GetHeight()) self.XPBar:SetWidth(self.XPBar_BG:GetWidth()) end if self.HealthBar then self.HealthBar:ClearAllPoints() self.HealthBar:SetPoint("LEFT",self.HealthBar_BG,"LEFT") self.HealthBar:SetHeight(self.HealthBar_BG:GetHeight()) self.HealthBar:SetWidth(self.HealthBar_BG:GetWidth()) end if self.ManaBar then self.ManaBar:ClearAllPoints() self.ManaBar:SetPoint("LEFT",self.ManaBar_BG,"LEFT") self.ManaBar:SetHeight(self.ManaBar_BG:GetHeight()) self.ManaBar:SetWidth(self.ManaBar_BG:GetWidth()) end self.Highlight:SetHeight(self.frame:GetHeight()-10) self.Highlight:SetWidth(self.frame:GetWidth()-10) self.DebuffHighlight:SetHeight(self.frame:GetHeight()-10) self.DebuffHighlight:SetWidth(self.frame:GetWidth()-10) if self.subgroup then aUF.subgroups[self.subgroup]:UpdateWidth() end self:AuraPosition() end function aUF.classes.aUFunit.prototype:BarTexture() local barstyle = aUF.db.profile.BarStyle self.HealthBar:SetStatusBarTexture(aUF.Bars[barstyle]) self.ManaBar:SetStatusBarTexture(aUF.Bars[barstyle]) self.XPBar:SetStatusBarTexture(aUF.Bars[barstyle]) if self.XPBar_Rest then self.XPBar_Rest:SetStatusBarTexture(aUF.Bars[barstyle]) end self.HealthBar_BG:SetTexture(aUF.Bars[barstyle]) self.ManaBar_BG:SetTexture(aUF.Bars[barstyle]) self.XPBar_BG:SetTexture(aUF.Bars[barstyle]) end -- CLASS UPDATES function aUF.classes.aUFunit.prototype:UpdateHighlight(entered) if (UnitExists("target") and UnitName("target") == UnitName(self.unit) and not (string.find(self.unit,"target")) and aUF.db.profile.HighlightSelected == true) or (entered == true and aUF.db.profile.HighlightSelected == true) then self.Highlight:Show() else self.Highlight:Hide() end end function aUF.classes.aUFunit.prototype:UpdatePetAll() if arg1 ~= self.parent then return end self:UpdateAll() end function aUF.classes.aUFunit.prototype:UpdateAll() if self:SetVisibility() then self:GroupingUpdate() self:StatusBarsColor() self:UpdateHealth(true) self:UpdatePower(true) self:UpdatePvP(true) self:UpdateAuras(true) self:UpdateRaidTargetIcon(true) self:UpdateResting() self:UpdateInCombat() self:LabelsCheckLeader() self:UpdateHighlight() self:UpdateTextStrings() self:RegisterEvents() return true else self:GroupingUpdate(true) self:RegisterEvents(false,true) return false end end function aUF.classes.aUFunit.prototype:GroupingUpdate(hide) local oldGroup = self.subgroup if hide then self.subgroup = nil elseif string.find(self.type,"raid") then if aUF.db.profile.RaidGrouping == "byclass" then _, _, _, _, _, self.subgroup = GetRaidRosterInfo(self.number) elseif aUF.db.profile.RaidGrouping == "nogroup" then self.subgroup = nil elseif aUF.db.profile.RaidGrouping == "onebiggroup" then self.subgroup = "Raid" elseif aUF.db.profile.RaidGrouping == "byrole" then local _,eClass = UnitClass(self.unit) self.subgroup = "Raid"..(aUF.RaidRole[eClass] or "none") else _,_,self.subgroup = GetRaidRosterInfo(self.number) end elseif self.type == "party" or self.type == "partypet" then if aUF.db.profile.PartyGrouping == "withoutplayer" then self.subgroup = "partyParty" elseif aUF.db.profile.PartyGrouping == "nogroup" then self.subgroup = nil else self.subgroup = "partyPlayer" end elseif self.type == "pet" then if aUF.db.profile.PetGrouping == "nogroup" then self.subgroup = nil else self.subgroup = "partyPlayer" end elseif self.type == "player" then self.subgroup = "partyPlayer" end if oldGroup ~= self.subgroup then if oldGroup then aUF.changedSubgroups[oldGroup] = true if aUF.subgroups[oldGroup].group[self.type] and aUF.subgroups[oldGroup].group[self.type][self.name] then aUF.subgroups[oldGroup].group[self.type][self.name] = nil end end if self.subgroup then if not aUF.subgroups[self.subgroup] then aUF.subgroups[self.subgroup] = aUF.classes.aUFgroup:new(self.subgroup) end if not aUF.subgroups[self.subgroup].group[self.type] then aUF.subgroups[self.subgroup].group[self.type] = {} end aUF.subgroups[self.subgroup].group[self.type][self.name] = self aUF.changedSubgroups[self.subgroup] = true end self:ScheduleEvent("UpdateGroups", function() aUF:TriggerEvent("agUF_UpdateGroups") end, 0.1, self) elseif self.subgroup then self:UpdateVisibility() end if self.subgroup == nil then self:LoadPosition() self:UpdateVisibility() end end function aUF.classes.aUFunit.prototype:SetVisibility() if aUF:CheckVisibility(self.unit) == true then self.visible = true return true else self.visible = false return false end end function aUF.classes.aUFunit.prototype:UpdateVisibility() if self.visible == true then self.frame:Show() else self.frame:Hide() end end function aUF.classes.aUFunit.prototype:LabelsCheckLeader() self.LeaderIcon:Hide() if not ( self.type == "raid" or self.type == "party" or self.unit == "player") then return end if aUF.db.profile.ShowGroupIcons == true then if self.type == "raid" then local _, rank = GetRaidRosterInfo(self.number) if rank == 2 then self.LeaderIcon:Show() end elseif self.type == "party" and tonumber(GetPartyLeaderIndex()) == tonumber(self.number) then self.LeaderIcon:Show() elseif self.unit == "player" and IsPartyLeader() then self.LeaderIcon:Show() end end end function aUF.classes.aUFunit.prototype:LabelsCheckLoot() self.MasterIcon:Hide() if not ( self.unit == "player" or self.type == "party") then return end if aUF.db.profile.ShowGroupIcons == true then local _, lootMaster = GetLootMethod() if lootMaster then if self.unit == "player" and lootMaster == 0 then self.MasterIcon:Show() elseif self.unit ~= "player" and lootMaster > 0 then if lootMaster == self.number and not (string.find(self.unit,"pet")) then self.MasterIcon:Show() end end end end end function aUF.classes.aUFunit.prototype:UpdateRaidTargetIcon(byevent) if type(byevent) == "string" and byevent ~= self.unit then return end local index = GetRaidTargetIndex(self.unit) if ( index ) and aUF.db.profile[self.type].ShowRaidTargetIcon == true then SetRaidTargetIconTexture(self.RaidTargetIcon, index) self.RaidTargetIcon:Show() else self.RaidTargetIcon:Hide() end end function aUF.classes.aUFunit.prototype:UpdateInCombat() if aUF.db.profile[self.type].ShowInCombatIcon == true and UnitAffectingCombat(self.unit) then self.combat = true -- print(self.unit) else self.combat = false end self:UpdateStatusIcon() end function aUF.classes.aUFunit.prototype:UpdateResting() if self.unit ~= "player" then return end if IsResting() then self.resting = true else self.resting = false end self:UpdateStatusIcon() end function aUF.classes.aUFunit.prototype:UpdateStatusIcon() if self.combat == true then self.InCombatIcon:Show() self.InCombatIcon:SetTexCoord(0.5,1,0,0.5) elseif self.resting == true then self.InCombatIcon:Show() self.InCombatIcon:SetTexCoord(0,0.5,0,0.421875) else self.InCombatIcon:Hide() end end function aUF.classes.aUFunit.prototype:UpdatePvP(byevent) if type(byevent) == "string" and byevent ~= self.unit then return end if aUF.db.profile.ShowPvPIcon == true then if ( UnitIsPVPFreeForAll(self.unit) ) then self.PVPIcon:SetTexture("Interface\\TargetingFrame\\UI-PVP-FFA") self.PVPIcon:Show() elseif ( UnitFactionGroup(self.unit) and UnitIsPVP(self.unit) ) then self.PVPIcon:SetTexture("Interface\\TargetingFrame\\UI-PVP-"..UnitFactionGroup(self.unit)) self.PVPIcon:Show() else self.PVPIcon:Hide() end else self.PVPIcon:Hide() end end function aUF.classes.aUFunit.prototype:UpdateTextStrings() if self.visible then if aUF.HelperFunctions[self.type] then if aUF.HelperFunctions[self.type].HealthText and self.HealthText:IsShown() then aUF.HelperFunctions[self.type].HealthText(self.unit,self.HealthText) end if aUF.HelperFunctions[self.type].ManaText and self.ManaText:IsShown() then aUF.HelperFunctions[self.type].ManaText(self.unit,self.ManaText) end if aUF.HelperFunctions[self.type].NameText and self.NameLabel:IsShown() then aUF.HelperFunctions[self.type].NameText(self.unit,self.NameLabel) end if aUF.HelperFunctions[self.type].ClassText and self.ClassText:IsShown() then aUF.HelperFunctions[self.type].ClassText(self.unit,self.ClassText) end end end end function aUF.classes.aUFunit.prototype:UpdateHealth(byevent) if type(byevent) =="table" and not byevent[self.unit] then return end local currValue,maxValue = UnitHealth(self.unit),UnitHealthMax(self.unit) local perc = currValue/maxValue * 100 if ( not UnitExists(self.unit) or UnitIsDead(self.unit) or UnitIsGhost(self.unit) or not UnitIsConnected(self.unit) or maxValue == 1) then self.HealthBar:SetValue(0) else self.HealthBar:SetValue(perc) end self:UpdateTextStrings() end function aUF.classes.aUFunit.prototype:UpdatePower(byevent) if type(byevent) =="table" and not byevent[self.unit] then return end local currValue,maxValue = UnitMana(self.unit),UnitManaMax(self.unit) local perc = currValue/maxValue * 100 local db = aUF.db.profile if ( not UnitExists(self.unit) or UnitIsDead(self.unit) or UnitIsGhost(self.unit) or not UnitIsConnected(self.unit) or (currValue == 1 and maxValue == 1) ) then self.ManaBar:SetValue(0) else if maxValue == 0 then self.ManaBar:SetValue(0) else self.ManaBar:SetValue(perc) end end local powertype = UnitPowerType(self.unit) if (self.powertype ~= powertype) then self.powertype = powertype local info = db.ManaColor[powertype] if self.flags.AlphaBar == true then self.ManaBar_BG:SetVertexColor(info.r,info.g,info.b,0.25) else self.ManaBar_BG:SetVertexColor(0,0,0,0.25) end self.ManaBar:SetStatusBarColor(info.r,info.g,info.b,0.8) end self:UpdateTextStrings() end function aUF.classes.aUFunit.prototype:AuraPosition() local scale = (self.frame:GetWidth()/170) local style,position = self.database.AuraStyle,self.database.AuraPos local yadjust = 0 for i=1,20 do self["Aura"..i]:SetScale(scale) end if not (style == "OneLine") and (position == "Right" or position == "Left") then yadjust = (self.Aura1:GetHeight()/2) end self.Aura1:ClearAllPoints() if ( position == "Below" ) then self.Aura1:SetPoint("TOPLEFT",self.frame,"BOTTOMLEFT",5, 0) elseif ( position == "Above" ) then self.Aura1:SetPoint("BOTTOMLEFT",self.frame,"TOPLEFT",5, 0) elseif ( position == "Left" ) then self.Aura1:SetPoint("RIGHT",self.frame,"LEFT",0, yadjust) elseif ( position == "Right" ) then self.Aura1:SetPoint("LEFT",self.frame,"RIGHT",0, yadjust) end if ( position == "Left" ) then for i=2,20 do self["Aura"..i]:ClearAllPoints() if i == 11 then self["Aura"..i]:SetPoint("TOP",self.Aura1,"BOTTOM",0,-1) else self["Aura"..i]:SetPoint("RIGHT",self["Aura"..i-1],"LEFT",1,0) end end else for i=2,20 do self["Aura"..i]:ClearAllPoints() if i == 11 then if position == "Above" then self["Aura"..i]:SetPoint("BOTTOM",self.Aura1,"TOP",0,1) else self["Aura"..i]:SetPoint("TOP",self.Aura1,"BOTTOM",0,-1) end else self["Aura"..i]:SetPoint("LEFT",self["Aura"..i-1],"RIGHT",1,0) end end end end function aUF.classes.aUFunit.prototype:UpdateAuras(byevent) if type(byevent) == "string" and byevent ~= self.unit then return end if aUF.auraUpdates > 4 then aUF.auraUpdatePool[self.name] = true -- print(self.name.." add to pool") return else -- print(self.name.." update "..aUF.auraUpdates) aUF.auraUpdatePool[self.name] = nil aUF.auraUpdates = aUF.auraUpdates + 1 end local filter,style,AuraDebuffC = self.database.AuraFilter,self.database.AuraStyle,self.database.AuraDebuffC local dbcount,bcount,lastDebuff = 0,0,0 local buttons,dFound self.DebuffHighlight:Hide() local hide = style == "Hide" for i=1,20 do if (not self.hidden) then self["Aura"..i]:Hide() end local debuff, _, t = aUF:UnitDebuff(self.unit,i,filter) if debuff then dbcount = dbcount + 1 lastDebuff = i if not dFound then if t and AuraDebuffC == true and UnitIsFriend("player",self.unit) then self.DebuffHighlight:Show() self.DebuffHighlight:SetVertexColor(DebuffTypeColor[t].r, DebuffTypeColor[t].g, DebuffTypeColor[t].b) dFound = true end end end if UnitBuff(self.unit,i,filter) then bcount = bcount + 1 end end if hide or bcount + dbcount == 0 then self.hidden = true return end self.hidden = false local position = self.database.AuraPos if (position == "Above" or position == "Below") and bcount + dbcount <= 10 then buttons = 10 elseif style == "OneLine" then if (position == "Right" or position == "Left") and bcount + dbcount <= 10 then buttons = bcount + dbcount else buttons = 10 end else buttons = 20 end local x,z,a,borderColor local b = 1 if (buttons > 10 and dbcount <= 10) then x = 11 z = 1 a = 10 else x = buttons z = -1 a = bcount end for i=1,max(lastDebuff,a) do local buff, count, class = aUF:UnitDebuff(self.unit,i,filter) local buffFrame = self["Aura"..x] if buff and buffFrame then buffFrame.Icon:SetTexture(buff) buffFrame:Show() buffFrame.buffFilter = "HARMFUL" buffFrame.id = i if count > 1 then buffFrame.Count:SetText(count) else buffFrame.Count:SetText("") end if class then borderColor = DebuffTypeColor[class] else borderColor = DebuffTypeColor["none"]; end buffFrame.Overlay:SetVertexColor(borderColor.r, borderColor.g, borderColor.b); buffFrame.Overlay:Show() x = x + z end buff, count = UnitBuff(self.unit,i,filter) buffFrame = self["Aura"..b] if buff and b <= a then buffFrame.Icon:SetTexture(buff) buffFrame:Show() buffFrame.buffFilter = "HELPFUL" buffFrame.id = i if count > 1 then buffFrame.Count:SetText(count) else buffFrame.Count:SetText("") end buffFrame.Overlay:Hide() b = b + 1 end end end -- STATUSBAR STUFF function aUF.classes.aUFunit.prototype:StatusBarsColor() local db = aUF.db.profile local healthColor local _,Eclass = UnitClass(self.unit) if string.find(self.unit,"target") and not UnitIsFriend(self.unit, "player") and (aUF.db.profile.TargetShowHostile == true ) then healthColor = aUF:UtilFactionColors(self.unit) self.flags.BarColor = 1 elseif self.unit == "pet" and self.flags.HappinessBar == true and class ~= "WARLOCK" then local happiness = GetPetHappiness() if ( happiness == 1 ) then healthColor = aUF.ManaColor[1] elseif ( happiness == 2 ) then healthColor = aUF.ManaColor[3] else healthColor = db.HealthColor end self.flags.BarColor = 2 elseif UnitIsFriend(self.unit, "player") and UnitIsPlayer(self.unit) and self.database.ClassColorBars == true and RAID_CLASS_COLORS[Eclass] then healthColor = RAID_CLASS_COLORS[Eclass] self.flags.BarColor = 3 else healthColor = db.HealthColor self.flags.BarColor = 4 end self.HealthBar:SetStatusBarColor(healthColor.r,healthColor.g,healthColor.b, 1) if self.flags.BackgroundBarColor == true then self.HealthBar_BG:SetVertexColor(healthColor.r,healthColor.g,healthColor.b,0.25) else self.HealthBar_BG:SetVertexColor(0,0,0,0.25) end -- mana local powertype = UnitPowerType(self.unit) local info = db.ManaColor[powertype] if self.flags.AlphaBar == true then self.ManaBar_BG:SetVertexColor(info.r,info.g,info.b,0.25) else self.ManaBar_BG:SetVertexColor(0,0,0,0.25) end self.ManaBar:SetStatusBarColor(info.r,info.g,info.b,0.8) end function aUF.classes.aUFunit.prototype:StatusBarsOnValueChanged(value) if ( aUF.db.profile.SmoothHealthBars == true ) then if self.flags.BarColor == 1 then self:SmoothTargetHealthBarOnValueChanged(value,aUF:UtilFactionColors(self.unit)) elseif self.flags.BarColor == 4 then self:SmoothHealthBarOnValueChanged(value) end end end function aUF.classes.aUFunit.prototype:SmoothTargetHealthBarOnValueChanged(value,colortable) if ( not value ) then return end local r, g, b local min, max = this:GetMinMaxValues() if ( (value < min) or (value > max) ) then return end if ( (max - min) > 0 ) then value = (value - min) / (max - min) else value = 0 end r = colortable.r*(0.35*value+0.65) g = colortable.g*(0.35*value+0.65) b = colortable.b*(0.35*value+0.65) this:SetStatusBarColor(r, g, b) end function aUF.classes.aUFunit.prototype:SmoothHealthBarOnValueChanged(value) if ( not value ) then return end local db = aUF.db.profile local r, g, b local min, max = this:GetMinMaxValues() if ( (value < min) or (value > max) ) then return end if ( (max - min) > 0 ) then value = (value - min) / (max - min) else value = 0 end if(value > 0.5) then r = (db.HealthColor.r) + (((1-value) * 2)* (1-(db.HealthColor.r))) g = db.HealthColor.g else r = 1.0 g = (db.HealthColor.g) - (0.5 - value)* 2 * (db.HealthColor.g) end b = db.HealthColor.b this:SetStatusBarColor(r, g, b) end -- MOUSE INTERACTION function aUF.classes.aUFunit.prototype:OnDragStart(button) if self.subgroup then aUF.subgroups[self.subgroup]:OnDragStart(button) return end if ( button == "LeftButton" ) and aUF.db.profile.Locked == false then self.frame:StartMoving() end end function aUF.classes.aUFunit.prototype:OnDragStop(button) if self.subgroup then aUF.subgroups[self.subgroup]:OnDragStop(button) return end self.frame:StopMovingOrSizing() self:SavePosition() end function aUF.classes.aUFunit.prototype:OnClick(button) if (IsAltKeyDown() or IsControlKeyDown()) and (button == "LeftButton" or button == "RightButton") then aUF.dewdrop:Open(self.frame, 'children', aUF:CreateDewdrop(self.type),'cursorX', true, 'cursorY', true) return end if button == "LeftButton" then if SpellIsTargeting() then SpellTargetUnit(self.unit) elseif CursorHasItem() then if UnitIsUnit(self.unit, "player") then AutoEquipCursorItem() elseif UnitIsFriend(self.unit, "player") and UnitIsPlayer(self.unit) then DropItemOnUnit("target") end else TargetUnit(self.unit) end elseif button == "RightButton" then self:DropDownUnit(self.unit) end end function aUF.classes.aUFunit.prototype:OnEnter() self.frame.unit = self.unit self:UpdateHighlight(true) UnitFrame_OnEnter() end function aUF.classes.aUFunit.prototype:OnLeave() self:UpdateHighlight() UnitFrame_OnLeave() end function aUF.classes.aUFunit.prototype:DropDownUnit() local type = nil if self.unit == "player" then type = PlayerFrameDropDown elseif self.unit == "target" then type = TargetFrameDropDown elseif self.unit == "pet" then type = PetFrameDropDown elseif self.type == "party" then type = getglobal("PartyMemberFrame"..self.number.."DropDown") elseif string.find(self.unit, "raid") then type = FriendsDropDown this.unit = self.unit this.name = UnitName(self.unit) this.id = this:GetID() FriendsDropDown.displayMode = "MENU" FriendsDropDown.initialize = RaidFrameDropDown_Initialize end if self.number then this:SetID(self.number) end if type then HideDropDownMenu(1); type.unit = self.unit type.name = UnitName(self.unit) ToggleDropDownMenu(1, nil, type,"cursor") return true end end function aUF.classes.aUFunit.prototype:AuraOnEnter() if (not this:IsVisible()) then return end GameTooltip:SetOwner(this, "ANCHOR_BOTTOMRIGHT") if ( this.buffFilter == "HELPFUL") then GameTooltip:SetUnitBuff(self.unit, this.id, self.database.AuraFilter) elseif ( this.buffFilter == "HARMFUL") then GameTooltip:SetUnitDebuff(self.unit, this.id, 0) end end function aUF.classes.aUFunit.prototype:UnitCombat(unit) if unit ~= self.unit then return end if not ( self.database.ShowCombat ) then return end self:CombatFeedback_OnCombatEvent(arg1, arg2, arg3, arg4, arg5) end function aUF.classes.aUFunit.prototype:UnitSpellmiss(unit) if unit ~= self.unit then return end if not ( self.database.ShowCombat ) then return end self:CombatFeedback_OnSpellMissEvent(arg1, arg2) end function aUF.classes.aUFunit.prototype:CombatFeedback_OnCombatEvent(unit, event, flags, amount, type) local fontHeight = 13 local text = "" local r,g,b = 1,1,1 if( event == "IMMUNE" ) then fontHeight = fontHeight * 0.75 text = CombatFeedbackText[event] elseif ( event == "WOUND" ) then if ( amount ~= 0 ) then if ( flags == "CRITICAL" or flags == "CRUSHING" ) then fontHeight = fontHeight * 1.5 elseif ( flags == "GLANCING" ) then fontHeight = fontHeight * 0.75 end if ( type > 0 ) then r = 1.0 g = 1.0 b = 0.0 end if UnitInParty(self.unit) or UnitInRaid(self.unit) then r = 1.0 g = 0.0 b = 0.0 end text = "-"..amount elseif ( flags == "ABSORB" ) then fontHeight = fontHeight * 0.75 text = CombatFeedbackText["ABSORB"] elseif ( flags == "BLOCK" ) then fontHeight = fontHeight * 0.75 text = CombatFeedbackText["BLOCK"] elseif ( flags == "RESIST" ) then fontHeight = fontHeight * 0.75 text = CombatFeedbackText["RESIST"] else text = CombatFeedbackText["MISS"] end elseif ( event == "BLOCK" ) then fontHeight = fontHeight * 0.75 text = CombatFeedbackText[event] elseif ( event == "HEAL" ) then text = "+"..amount r = 0.0 g = 1.0 b = 0.0 if ( flags == "CRITICAL" ) then fontHeight = fontHeight * 1.3 end elseif ( event == "ENERGIZE" ) then text = amount r = 0.41 g = 0.8 b = 0.94 if ( flags == "CRITICAL" ) then fontHeight = fontHeight * 1.3 end else text = CombatFeedbackText[event] end self.feedbackStartTime = GetTime() local font = self.HitIndicator:GetFont() self.HitIndicator:SetFont(font,fontHeight,"OUTLINE") self.HitIndicator:SetText(text) self.HitIndicator:SetTextColor(r, g, b) self.HitIndicator:SetAlpha(0) self.HitIndicator:Show() self.HitIndicator:SetPoint("CENTER",self.frame,"CENTER") aUF.feedback[self.name] = true aUF:ScheduleRepeatingEvent("agUF_CombatSchedule",aUF.FeedbackUpdate, 0.05, aUF) end -- UNITXP CLASS function aUF.classes.aUFunitXP.prototype:init(name,unit) aUF.classes.aUFunitXP.super.prototype.init(self,name,unit) self:RegisterXPEvents() self:UpdateXP() self:UpdateRep() end function aUF.classes.aUFunitXP.prototype:RegisterXPEvents() if self.unit == "player" then self:RegisterEvent("PLAYER_XP_UPDATE","UpdateXP") self:RegisterEvent("UPDATE_EXHAUSTION","UpdateXP") self:RegisterEvent("PLAYER_LEVEL_UP","UpdateXP") elseif self.unit == "pet" then self:RegisterEvent("UNIT_PET_EXPERIENCE","UpdateXP") end end function aUF.classes.aUFunitXP.prototype:UpdateRep(newLevel) if self.hooks["ReputationWatchBar_Update"] then self.hooks["ReputationWatchBar_Update"].orig(tonumber(newLevel)) else self:Hook("ReputationWatchBar_Update", "UpdateRep") end local repname, repreaction, repmin, repmax, repvalue = GetWatchedFactionInfo() if ( repname and UnitLevel("player") == 60) then local color = aUF.RepColor[repreaction] repmax = repmax - repmin; repvalue = repvalue - repmin; repmin = 0 if self.XPBar_Rest or repmax == 0 then self.XPBar_Rest:Hide() end self.XPBar:SetParent(self.frame) self.XPBar:Show() if repmax ~= 0 then self.XPBar:SetValue((repvalue/repmax)*100) else self.XPBar:SetValue(0) end self.XPBar:SetStatusBarColor(color.r, color.g, color.b) self.XPBar_BG:SetVertexColor(color.r, color.g, color.b, 0.25) end self:UpdateXP() end function aUF.classes.aUFunitXP.prototype:UpdateXP() local _,eClass = UnitClass("player") if self.unit == "pet" and eClass == "HUNTER" then return end local repname, repreaction, repmin, repmax, repvalue = GetWatchedFactionInfo(); if ( self.database.ShowXP == true ) then if ((( UnitLevel("player") < MAX_PLAYER_LEVEL ) or not repname) and self.unit == "player") or (self.unit == "pet") then local priorXP = self.XPBar:GetValue() local restXP local currXP, nextXP if self.unit == "player" then self.XPBar:SetParent(self.XPBar_Rest) currXP = UnitXP(self.unit) nextXP = UnitXPMax(self.unit) restXP = GetXPExhaustion() else currXP, nextXP = GetPetExperience() end if nextXP ~= 0 then self.XPBar:SetValue((currXP/nextXP)*100) else self.XPBar:SetValue(0) end if self.XPBar_Rest then if ( restXP and self.unit == "player" ) then self.XPBar_Rest:Show() if nextXP ~= 0 then self.XPBar_Rest:SetValue(((currXP+restXP)/nextXP)*100) else self.XPBar_Rest:SetValue(0) end else self.XPBar:SetParent(self.frame) self.XPBar:Show() self.XPBar_Rest:Hide() end end self.XPBar:SetStatusBarColor(0.8, 0, 0.7) if self.flags.BackgroundBarColor == true then self.XPBar_BG:SetVertexColor(0.8, 0, 0.7, 0.25) else self.XPBar_BG:SetVertexColor(0, 0, 0, 0.25) end end else self.XPBar:Hide() self.XPBar_BG:Hide() if self.XPBar_Rest then self.XPBar_Rest:Hide() end end end function aUF.classes.aUFunitCombo.prototype:init(name,unit) aUF.classes.aUFunitCombo.super.prototype.init(self,name,unit) self:RegisterComboEvents() end function aUF.classes.aUFunitCombo.prototype:RegisterComboEvents() self:RegisterEvent("PLAYER_COMBO_POINTS","UpdateComboPoints") end function aUF.classes.aUFunitCombo.prototype:CreateCombos() for i=1,5 do self["Combo"..i] = self.frame:CreateTexture(nil,"OVERLAY") self["Combo"..i]:SetTexture(aUF.imagePath.."combo.tga") self["Combo"..i]:SetHeight(10) self["Combo"..i]:SetWidth(10) self["Combo"..i]:Hide() if i > 1 then self["Combo"..i]:SetPoint("BOTTOMRIGHT",self["Combo"..i-1],"BOTTOMLEFT") end end end function aUF.classes.aUFunitCombo.prototype:UpdateComboPoints() local points = GetComboPoints() for i=0,4 do if points > i then self["Combo"..i+1]:Show() else self["Combo"..i+1]:Hide() end end end function aUF.classes.aUFunitMetro.prototype:init(name,unit) aUF.classes.aUFunitMetro.super.prototype.init(self,name,unit) end function aUF.classes.aUFunitMetro.prototype:UpdateMetro() if self:SetVisibility() then self:UpdateHealth(true) self:UpdatePower(true) self:UpdateAuras(true) self:UpdateRaidTargetIcon(true) self:StatusBarsColor() self:UpdateTextStrings() end self:UpdateVisibility() end function aUF.classes.aUFunitMetro.prototype:Start() if not self.database.HideFrame == true then self:UpdateMetro() if not self.schedule then self.schedule = self:ScheduleRepeatingEvent(self.UpdateMetro, 0.8, self) end end end function aUF.classes.aUFunitMetro.prototype:Stop() if self.schedule and self:IsEventScheduled(self.schedule) then self:CancelScheduledEvent(self.schedule) self.schedule = nil end self:UpdateMetro() end -- UNITRAID CLASS function aUF.classes.aUFunitRaid.prototype:init(name,unit) aUF.classes.aUFunitRaid.super.prototype.init(self,name,unit) self:RegisterEvent("RAID_ROSTER_UPDATE","RosterUpdate") self:RosterUpdate() end function aUF.classes.aUFunitRaid.prototype:RosterUpdate() if aUF:CheckVisibility(self.unit) then self.inRaid = true end if self.inRaid == true then if self:UpdateAll() == true then self.inRaid = true else self.inRaid = false end end end -- Group class aUF.classes.aUFgroup = AceOO.Class("AceEvent-2.0","AceHook-2.0") function aUF.classes.aUFgroup.prototype:init(objectName) aUF.classes.aUFgroup.super.prototype.init(self) self.name = objectName self.variableName = self.name.."_aUFgroup" self.index = {} self.group = {} self.raid = true self:CreateFrame() self:BorderBackground() self:UpdateTitle() end function aUF.classes.aUFgroup.prototype:CreateFrame() local frameName = "aUFgroup"..self.name self.anchor = CreateFrame("Button",frameName,UIParent,"AGraidAnchorTemplate") self.anchor:SetScript("OnDragStart",function() self:OnDragStart(arg1) end) self.anchor:SetScript("OnDragStop",function() self:OnDragStop(arg1) end) self.anchor:SetScript("OnClick",function() self:OnClick(arg1) end) self.anchor:SetMovable(true) self.anchor:EnableMouse(true) self.anchor:RegisterForDrag("LeftButton") self.anchor:RegisterForClicks("LeftButtonUp","RightButtonUp","MiddleButtonUp","Button4Up","Button5Up") self.title = getglobal("aUFgroup"..self.name.."Title") end function aUF.classes.aUFgroup.prototype:Reset() self:UpdateTitle() self:LoadPosition() end function aUF.classes.aUFgroup.prototype:UpdateTitle(player) if self.raid then if player == true then self.title:SetText("Group "..self.name.." *") else self.title:SetText("Group "..self.name) end else self.title:SetText("Group "..self.name) end end --[[ function aUF.classes.aUFgroup.prototype.groupSortClosure() local unitIdIndex = { ["player"] = 1, ["playerpet"] = 2, ["party1"] = 3, ["party1pet"] = 4, ["party2"] = 5, ["party2pet"] = 6, ["party3"] = 7, ["party3pet"] = 8, ["party4"] = 9, ["party4pet"] = 10, } return function (a, b) return (unitIdIndex[a.unit] or 99) < (unitIdIndex[b.unit] or 99) end end function aUF.classes.aUFgroup.prototype:EachMember(group) local i = 0 local sortedGroup = {} for _,member in pairs(group) do table.insert(sortedGroup, member) end if not self.groupSort then self.groupSort = self.groupSortClosure() end if self.groupSort then table.sort(sortedGroup, self.groupSort) end return function () i = i + 1 return sortedGroup[i] end end ]] function aUF.classes.aUFgroup.prototype:Update() if self.lastFrame then self.lastFrame:StopMovingOrSizing() end self.lastFrame = nil local grow = "down" local relation1, relation2,x,y local space = 5 local player = false if grow == "up" then relation1 = "BOTTOMLEFT" relation2 = "TOPLEFT" x = 0 y = -(space) elseif grow == "down" then relation1 = "TOPLEFT" relation2 = "BOTTOMLEFT" x = 0 y = space elseif grow == "left" then relation1 = "TOPRIGHT" relation2 = "TOPLEFT" x = space y = 0 elseif grow == "right" then relation1 = "TOPLEFT" relation2 = "TOPRIGHT" x = -(space) y = 0 end self.index = {} if self.group.player and self.group.player.player then table.insert(self.index, self.group.player.player) end if self.group.pet and self.group.pet.pet then table.insert(self.index, self.group.pet.pet) end if self.group.party then for _,unitObject in self.group.party do table.insert(self.index, unitObject) if self.group.partypet then for _, unitPetObject in self.group.partypet do if unitPetObject.parent and unitPetObject.parent == unitObject.unit then table.insert(self.index, unitPetObject) end end end end end if self.group.raid then for _,unitObject in self.group.raid do table.insert(self.index, unitObject) if UnitName(unitObject.unit) == UnitName("player") then player = true end if self.group.raidpet then for _, unitPetObject in self.group.raidpet do if unitPetObject.parent and unitPetObject.parent == unitObject.unit then table.insert(self.index, unitPetObject) end end end end end -- print("---"..self.name) local empty = true for k,v in ipairs(self.index) do -- print(UnitName(v.unit)) v.frame:ClearAllPoints() if self.index[k-1] then v.frame:SetPoint(relation1, self.index[k-1].frame,relation2,x,y) else empty = false self.lastFrame = v.frame self:LoadPosition() if self.raid then self.anchor:ClearAllPoints() self.anchor:SetPoint(relation2, self.lastFrame,relation1,-x,-y) self.anchor:Show() end end end if self.lastFrame then self.anchor:SetHeight(20) self:UpdateWidth() self:UpdateScale() self:UpdateTitle(player) end if empty == true or not self.lastFrame then self.anchor:Hide() end end function aUF.classes.aUFgroup.prototype:UpdateWidth() local width = 0 local scale = 0 if self.index then for _,unitObject in ipairs(self.index) do local lwidth = unitObject.frame:GetWidth() local swidth = unitObject.frame:GetWidth()*unitObject.frame:GetWidth() if lwidth > width then width = lwidth scale = unitObject.frame:GetScale() end end end self.anchor:SetWidth(width) if scale > 0 then self.anchor:SetScale(scale) end end function aUF.classes.aUFgroup.prototype:UpdateScale() self:UpdateWidth() end function aUF.classes.aUFgroup.prototype:BorderBackground() local colortable local borderstyle = aUF.db.profile.BorderStyle colortable = aUF.db.profile.PartyFrameColors self.anchor:SetBackdrop({ bgFile = "Interface\\Tooltips\\UI-Tooltip-Background", tile = true, tileSize = 16, edgeFile = aUF.Borders[borderstyle].texture, edgeSize = aUF.Borders[borderstyle].size, insets = {left = aUF.Borders[borderstyle].insets, right = aUF.Borders[borderstyle].insets, top = aUF.Borders[borderstyle].insets, bottom = aUF.Borders[borderstyle].insets}, }) self.anchor:SetBackdropColor(colortable.r,colortable.g,colortable.b,colortable.a) self.anchor:SetBackdropBorderColor(TOOLTIP_DEFAULT_COLOR.r,TOOLTIP_DEFAULT_COLOR.g,TOOLTIP_DEFAULT_COLOR.b,colortable.a) end function aUF.classes.aUFgroup.prototype:OnClick(button) for k,v in self.index do -- print(v.name) end end function aUF.classes.aUFgroup.prototype:OnDragStart(button) if ( button == "LeftButton" ) and aUF.db.profile.Locked == false then self.lastFrame:StartMoving() end end function aUF.classes.aUFgroup.prototype:OnDragStop(button) if self.lastFrame then self.lastFrame:StopMovingOrSizing() self:SavePosition() end end function aUF.classes.aUFgroup.prototype:LoadPosition() if self.lastFrame then if (aUF.db.profile.Positions[self.variableName]) then local x = aUF.db.profile.Positions[self.variableName].x local y = aUF.db.profile.Positions[self.variableName].y local scale = self.lastFrame:GetEffectiveScale() self.lastFrame:SetPoint("TOPLEFT", UIParent,"TOPLEFT", x/scale, y/scale) else self.lastFrame:SetPoint("CENTER", UIParent, "CENTER") end end end function aUF.classes.aUFgroup.prototype:SavePosition() local scale = self.lastFrame:GetEffectiveScale() local worldscale = UIParent:GetEffectiveScale() local x,y = self.lastFrame:GetLeft()*scale,self.lastFrame:GetTop()*scale - (UIParent:GetTop())*worldscale if not aUF.db.profile.Positions[self.variableName] then aUF.db.profile.Positions[self.variableName] = {} end aUF.db.profile.Positions[self.variableName].x = x aUF.db.profile.Positions[self.variableName].y = y end