ArcHUDRing_Party = ArcHUDRing:new({ name = "Party", unit = {"party1", "party2", "party3", "party4", "partypet1", "partypet2", "partypet3", "partypet4"}, defaults = { Enabled = TRUE, Outline = TRUE, ShowText = TRUE, ShowPerc = TRUE, ColorFade = TRUE, ShowBuffs = TRUE, }, def_positions = { {"BOTTOMRIGHT", ArcHUD.Rings.Anchors.Left, "BOTTOMLEFT", -450, 96}, {"BOTTOMRIGHT", ArcHUD.Rings.Anchors.Left, "TOPLEFT", -20, -230}, {"BOTTOMLEFT", ArcHUD.Rings.Anchors.Right, "TOPLEFT", 20, -230}, {"BOTTOMLEFT", ArcHUD.Rings.Anchors.Right, "BOTTOMLEFT", 450, 96}, }, options = { {name = "ShowText", text = ARCHUDOPTIONS.TEXT.SHOWTEXT, tooltip = ARCHUDOPTIONS.TOOLTIPS.SHOWTEXT}, {name = "ShowPerc", text = ARCHUDOPTIONS.TEXT.SHOWPERC, tooltip = ARCHUDOPTIONS.TOOLTIPS.SHOWPERC}, {name = "ColorFade", text = ARCHUDOPTIONS.TEXT.COLORFADE, tooltip = ARCHUDOPTIONS.TOOLTIPS.COLORFADE}, {name = "ShowBuffs", text = ARCHUDOPTIONS.TEXT.SHOWBUFFS, tooltip = ARCHUDOPTIONS.TOOLTIPS.SHOWBUFFS}, {name = "HideBlizzFrame", text = ARCHUDOPTIONS.TEXT.HIDEBLIZZ, tooltip = ARCHUDOPTIONS.TOOLTIPS.HIDEBLIZZ}, {name = "EnableMenu", text = ARCHUDOPTIONS.TEXT.ENABLEMENU, tooltip = ARCHUDOPTIONS.TOOLTIPS.ENABLEMENU}, }, disableEvents = { option = "HideBlizzFrame", }, Initialize = function(self) for i=1,4 do self[self.unit[i]] = self:CreatePartyFrame(i); self[self.unit[i]].fadeIn = 0.5; self[self.unit[i]].fadeOut = 0.5; -- Don't do updates from start self[self.unit[i]].DoCompleteUpdate = false; self[self.unit[i]].DoPetUpdate = false; -- Make nameplates register clicks self[self.unit[i]].NamePlate:RegisterForClicks("LeftButtonUp", "RightButtonUp", "MiddleButtonUp", "Button4Up", "Button5Up"); self[self.unit[i]].pet.NamePlate:RegisterForClicks("LeftButtonUp", "RightButtonUp", "MiddleButtonUp", "Button4Up", "Button5Up"); -- Enable dragging of the party rings self[self.unit[i]].NamePlate:RegisterForDrag("LeftButton"); -- Set default positions self[self.unit[i]]:SetPoint(unpack(self.def_positions[i])); self[self.unit[i]]:Hide(); -- Add disableEvents entries self.disableEvents[i] = { frame = "PartyMemberFrame"..i, hide = TRUE, events = {"PARTY_MEMBERS_CHANGED", "PARTY_LEADER_CHANGED", "PARTY_MEMBER_ENABLE", "PARTY_MEMBER_DISABLE", "PARTY_LOOT_METHOD_CHANGED", "UNIT_FACTION", "UNIT_AURA", "UNIT_PET", "UNIT_PVP_UPDATE", "VARIABLES_LOADED", "UNIT_NAME_UPDATE", "UNIT_PORTRAIT_UPDATE", "UNIT_DISPLAYPOWER"}, }; self.disableEvents[i+4] = { frame = "PartyMemberFrame"..i.."HealthBar", events = {"CVAR_UPDATE"}, }; self.disableEvents[i+8] = { frame = "PartyMemberFrame"..i.."ManaBar", events = {"CVAR_UPDATE"}, }; self.disableEvents[i+12] = { frame = "PartyMemberFrame"..i.."PetFrame", events = {"UNIT_NAME_UPDATE", "UNIT_PORTRAIT_UPDATE", "UNIT_DISPLAYPOWER"}, }; self.disableEvents[i+16] = { frame = "PartyMemberFrame"..i.."PetFrameHealthBar", events = {"CVAR_UPDATE"}, }; end end, Enable = function(self) -- If we're in a raid and the user has set to hide party interface while in raid we -- will make sure to disable ourselves if(self.hide or HIDE_PARTY_INTERFACE == "1" and GetNumRaidMembers() > 0) then self.hide = TRUE; self:Disable(); return; end for i=1,4 do if(self:Get("ShowText")) then self[self.unit[i]].Health.Text:Show(); self[self.unit[i]].Mana.Text:Show(); else self[self.unit[i]].Health.Text:Hide(); self[self.unit[i]].Mana.Text:Hide(); end if(self:Get("ShowPerc")) then self[self.unit[i]].Health.Perc:Show(); self[self.unit[i]].Mana.Perc:Show(); else self[self.unit[i]].Health.Perc:Hide(); self[self.unit[i]].Mana.Perc:Hide(); end if(self:Get("Outline")) then self[self.unit[i]].Health.BG:Show(); self[self.unit[i]].Mana.BG:Show(); else self[self.unit[i]].Health.BG:Hide(); self[self.unit[i]].Mana.BG:Hide(); end self[self.unit[i]].ColorFade = self:Get("ColorFade"); -- If ring has been moved, position accordingly local loc = self:Get(self.unit[i]); if(loc) then local x, y = self.app.SplitString(loc, ","); --self:Msg("%s has been moved. Now location: %d, %d", self.unit[i], x, y); self[self.unit[i]]:ClearAllPoints(); self[self.unit[i]]:SetPoint("BOTTOMLEFT", UIParent, "BOTTOMLEFT", x, y); end -- Hook nameplate scripts self:HookScript(self[self.unit[i]].NamePlate, "OnEnter", self.NamePlate_Enter); self:HookScript(self[self.unit[i]].NamePlate, "OnLeave", self.NamePlate_Leave); self:HookScript(self[self.unit[i]].NamePlate, "OnClick", self.NamePlate_Click); self:HookScript(self[self.unit[i]].NamePlate, "OnDragStart", self.NamePlate_DragStart); self:HookScript(self[self.unit[i]].NamePlate, "OnDragStop", self.NamePlate_DragStop); self:HookScript(self[self.unit[i]].pet.NamePlate, "OnEnter", self.NamePlate_Enter); self:HookScript(self[self.unit[i]].pet.NamePlate, "OnLeave", self.NamePlate_Leave); self:HookScript(self[self.unit[i]].pet.NamePlate, "OnClick", self.NamePlate_Click); -- Update partymember data self:UpdateMember(self.unit[i]); -- Prepare timers self.app.Metro:Register(self.unit[i] .. "Health_Fade", ArcHUDRingTemplate.DoFadeUpdate, 0.01, self[self.unit[i]].Health); self.app.Metro:Register(self.unit[i] .. "Mana_Fade", ArcHUDRingTemplate.DoFadeUpdate, 0.01, self[self.unit[i]].Mana); self.app.Metro:Register(self.unit[i] .. "PetHealth_Fade", ArcHUDRingTemplate.DoFadeUpdate, 0.01, self[self.unit[i]].pet.Health); self.app.Metro:Register(self.unit[i] .. "PetMana_Fade", ArcHUDRingTemplate.DoFadeUpdate, 0.01, self[self.unit[i]].pet.Mana); self.app.Metro:Register(self.unit[i] .. "Alpha", ArcHUDRingTemplate.AlphaUpdate, 0.01, self[self.unit[i]]); -- Activate timers self.app.Metro:Start(self.unit[i] .. "Health_Fade"); self.app.Metro:Start(self.unit[i] .. "Mana_Fade"); self.app.Metro:Start(self.unit[i] .. "PetHealth_Fade"); self.app.Metro:Start(self.unit[i] .. "PetMana_Fade"); self.app.Metro:Start(self.unit[i] .. "Alpha"); end -- Set up events if(self:Get("ShowBuffs")) then self:RegisterEvent("UNIT_AURA"); end self:RegisterEvent("UNIT_PVP_UPDATE"); self:RegisterEvent("UNIT_PET"); self:RegisterEvent("PARTY_LEADER_CHANGED"); self:RegisterEvent("PARTY_MEMBER_DISABLE"); self:RegisterEvent("PARTY_LOOT_METHOD_CHANGED"); self:RegisterEvent("ARCHUD_PARTY_LOCKED"); self:RegisterEvent("ARCHUD_PARTY_UNLOCKED"); self:RegisterEvent("ARCHUD_PARTY_RESET"); self:RegisterEvent("UNIT_HEALTH", "EventHandler"); self:RegisterEvent("UNIT_MAXHEALTH", "EventHandler"); self:RegisterEvent("UNIT_MANA", "EventHandler"); self:RegisterEvent("UNIT_MAXMANA", "EventHandler"); self:RegisterEvent("UNIT_ENERGY", "EventHandler"); self:RegisterEvent("UNIT_MAXENERGY", "EventHandler"); self:RegisterEvent("UNIT_RAGE", "EventHandler"); self:RegisterEvent("UNIT_MAXRAGE", "EventHandler"); self:RegisterEvent("UNIT_FOCUS", "EventHandler"); self:RegisterEvent("UNIT_MAXFOCUS", "EventHandler"); self:RegisterEvent("UNIT_DISPLAYPOWER", "EventHandler"); self:RegisterEvent("UNIT_COMBAT", "EventHandler"); self:RegisterEvent("UNIT_LEVEL", "EventHandler"); self:RegisterEvent("PARTY_MEMBERS_CHANGED", "EventHandler"); self:RegisterEvent("PARTY_MEMBER_ENABLE", "EventHandler"); self:RegisterEvent("RAID_ROSTER_UPDATE", "EventHandler"); self:RegisterEvent("CVAR_UPDATE", "EventHandler"); -- Prepare timers self.app.Metro:Register(self.name .. "UpdateAlpha", self.UpdateAlpha, 0.05, self); self.app.Metro:Register(self.name .. "DoUpdate", self.DoUpdate, 1, self); -- Activate timers self.app.Metro:Start(self.name .. "UpdateAlpha"); self.app.Metro:Start(self.name .. "DoUpdate"); -- Show/Hide Blizzard party frames --[[ if(self:Get("Enabled") and self:Get("HideBlizzFrame")) then if(GetNumPartyMembers() > 0 and PartyMemberFrame1:IsVisible()) then self.PartyHidden = TRUE; end HidePartyFrame(); else ShowPartyFrame(); end]] -- Check if partyrings are locked if(self.app:Get("PartyLock")) then self:TriggerEvent("ARCHUD_PARTY_LOCKED"); else self:TriggerEvent("ARCHUD_PARTY_UNLOCKED"); end end, Disable = function(self) for i=1,4 do self.app.Metro:Stop(self.unit[i] .. "Health_Fade"); self.app.Metro:Stop(self.unit[i] .. "Mana_Fade"); self.app.Metro:Stop(self.unit[i] .. "PetHealth_Fade"); self.app.Metro:Stop(self.unit[i] .. "PetMana_Fade"); self.app.Metro:Stop(self.unit[i] .. "Alpha"); self[self.unit[i]]:Hide(); end if(self:Get("Enabled") and self:Get("HideBlizzFrame") and self.PartyHidden and (HIDE_PARTY_INTERFACE == "1" and GetNumRaidMembers() == 0) or (HIDE_PARTY_INTERFACE == "0" and GetNumRaidMembers() > 0)) then self.PartyHidden = FALSE; ShowPartyFrame(); end self.app.Metro:Stop(self.name .. "UpdateAlpha"); self.app.Metro:Stop(self.name .. "DoUpdate"); ArcHUDRing.Disable(self); UnitFrame_OnEvent("PARTY_MEMBERS_CHANGED") if(self.hide) then self:RegisterEvent("PARTY_MEMBERS_CHANGED", "EventHandler"); self:RegisterEvent("RAID_ROSTER_UPDATE", "EventHandler"); self:RegisterEvent("CVAR_UPDATE", "EventHandler"); end end, UpdateAlpha = function(self) if(not self.locked) then return; end for i=1,4 do local frame = self[self.unit[i]]; if(frame.isInCombat) then ArcHUDRingTemplate.SetRingAlpha(frame, ArcHUD.FadeIC); else if((frame.Health.startValue < frame.Health.maxValue) or (UnitPowerType(frame.unit) == 1 and floor(frame.Mana.startValue) > 0) or (not UnitPowerType(frame.unit) == 1 and frame.Mana.startValue < frame.Mana.maxValue)) then ArcHUDRingTemplate.SetRingAlpha(frame, ArcHUD.FadeOOC); else ArcHUDRingTemplate.SetRingAlpha(frame, ArcHUD.FadeFull); end end end end, DoUpdate = function(self) for i=1,4 do -- If we require a complete update, do so now if(self[self.unit[i]].DoCompleteUpdate) then self:UpdateMember(self.unit[i]); end if(self[self.unit[i]].DoPetUpdate) then self:UpdatePet(self.unit[i]); end end end, UpdateMember = function(self, unit) if(not self[unit]) then return; end if(not self.locked) then return; end local frame = self[unit]; if(UnitInParty(unit)) then -- Set up rings frame.Health:SetMax(UnitHealthMax(unit)); frame.Health:SetValue(UnitHealth(unit)); frame.Mana:SetMax(UnitManaMax(unit)); frame.Mana:SetValue(UnitMana(unit)); local p=UnitHealth(unit)/UnitHealthMax(unit); local r, g = 1, 1; if ( p > 0.5 ) then r = (1.0 - p) * 2; g = 1.0; else r = 1.0; g = p * 2; end if ( r < 0 ) then r = 0; elseif ( r > 1 ) then r = 1; end if ( g < 0 ) then g = 0; elseif ( g > 1 ) then g = 1; end if(UnitIsDead(unit)) then frame.Health.Text:SetText("Dead"); frame.Health.Perc:SetText(""); frame.Mana.Text:SetText(""); frame.Mana.Perc:SetText(""); else if(frame.ColorFade) then frame.Health:UpdateColor({["r"] = r, ["g"] = g, ["b"] = 0.0}); frame.Health.Text:SetTextColor(r, g, 0); else frame.Health.Text:SetTextColor(0, 1, 0); frame.Health:UpdateColor({["r"] = 0, ["g"] = 1, ["b"] = 0.0}); end frame.Health.Text:SetText(UnitHealth(unit).."/"..UnitHealthMax(unit)); frame.Health.Perc:SetText(floor((UnitHealth(unit)/UnitHealthMax(unit))*100).."%"); if(UnitPowerType(unit) == 0) then info = { r = 0.00, g = 1.00, b = 1.00 }; else info = ManaBarColor[UnitPowerType(unit)]; end frame.Mana:UpdateColor(ManaBarColor[UnitPowerType(unit)]); frame.Mana.Text:SetVertexColor(info.r, info.g, info.b); frame.Mana.Text:SetText(UnitMana(unit).."/"..UnitManaMax(unit)); frame.Mana.Perc:SetText(floor((UnitMana(unit)/UnitManaMax(unit))*100).."%"); end -- Set name and level local tmp, class = UnitClass(unit); local color = ArcHUD.ClassColor[class]; if(color and UnitName(unit) ~= UNKNOWNOBJECT) then frame.DoCompleteUpdate = false; frame.Name:SetText("|cff"..color..UnitName(unit).."|r"); else frame.DoCompleteUpdate = true; frame.Name:SetText(UnitName(unit)); end frame.Level:SetText(UnitLevel(unit)); self:UpdateGhostMode(unit); self:PARTY_LOOT_METHOD_CHANGED(unit); if(self:Get("ShowBuffs")) then self:UNIT_AURA(unit); end self:UNIT_PVP_UPDATE(unit); self:PARTY_LEADER_CHANGED(unit); self:UNIT_PET(unit); frame:Show(); else frame:Hide(); end end, UpdateGhostMode = function(self, unit) if(not self[unit]) then return; end local color = {["r"] = 0.75, ["g"] = 0.75, ["b"] = 0.75}; local frame = self[unit]; if(UnitIsGhost(unit)) then if(not frame.pulse) then frame.pulse = true; frame.alphaPulse = 0; frame.Health:SetValue(UnitHealthMax(unit)); frame.Health:UpdateColor(color); frame.Health.Text:SetText("Dead"); frame.Health.Text:SetTextColor(1, 0, 0); frame.Health.Perc:SetText(""); frame.Mana:SetValue(UnitManaMax(unit)); frame.Mana:UpdateColor(color); frame.Mana.Text:SetText(""); frame.Mana.Text:SetTextColor(1, 0, 0); frame.Mana.Perc:SetText(""); end end end, --------------------------------------------------------------------------- --------------------------------------------------------------------------- -------- EVENT HANDLER FUNCTIONS ----------------------------------- ARCHUD_PARTY_LOCKED = function(self) self.locked = true; for i=1,4 do self[self.unit[i]].locked = true; self[self.unit[i]].pet.locked = true; if(self:Get("Enabled")) then if(self:Get("EnableMenu")) then self[self.unit[i]].NamePlate:Show(); self[self.unit[i]].pet.NamePlate:Show(); else self[self.unit[i]].NamePlate:Hide(); self[self.unit[i]].pet.NamePlate:Hide(); end for j=1,16 do self[self.unit[i]]["Buff"..j]:Hide(); self[self.unit[i]]["DeBuff"..j]:Hide(); end self:UpdateMember(self.unit[i]); else self[self.unit[i]]:Hide(); end if(self[self.unit[i]].moved) then self:Set(self.unit[i], self[self.unit[i]]:GetLeft() .. "," .. self[self.unit[i]]:GetBottom()); self[self.unit[i]].moved = FALSE; end end end, ARCHUD_PARTY_UNLOCKED = function(self) self.locked = false; for i=1,4 do self[self.unit[i]].locked = false; self[self.unit[i]].pet.locked = false; self[self.unit[i]].Name:SetText(self.unit[i]); self[self.unit[i]].pet.Name:SetText(self.unit[i+4]); if(self:Get("Enabled")) then self[self.unit[i]]:Show(); self[self.unit[i]].NamePlate:Show(); for j=1,16 do self[self.unit[i]]["Buff"..j]:Show(); self[self.unit[i]]["DeBuff"..j]:Show(); end self[self.unit[i]].pet:Show(); ArcHUDRingTemplate.SetRingAlpha(self[self.unit[i]], 1.0); else self[self.unit[i]]:Hide(); end end end, ARCHUD_PARTY_RESET = function(self) for i=1,4 do self[self.unit[i]]:ClearAllPoints(); self[self.unit[i]]:SetPoint(unpack(self.def_positions[i])); self[self.unit[i]].moved = FALSE; if(self:Get(self.unit[i])) then self:Set(self.unit[i], nil); end end end, PARTY_LOOT_METHOD_CHANGED = function(self, unit) if(not unit) then unit = arg1; end -- Check loot settings local lootmethod, master = GetLootMethod(); if(not self[unit]) then for i=1,4 do if(lootmethod == "master" and master == self[self.unit[i]]:GetID()) then self[self.unit[i]].MasterIcon:Show(); else self[self.unit[i]].MasterIcon:Hide(); end end else local frame = self[unit]; if(lootmethod == "master" and master == frame:GetID()) then frame.MasterIcon:Show(); else frame.MasterIcon:Hide(); end end end, UNIT_PET = function(self, unit) if(not unit) then unit = arg1; end if(not self[unit]) then return; end local frame = self[unit].pet; if(UnitExists(frame.unit)) then frame.Name:SetText(UnitName(frame.unit)); frame.Health:UpdateColor({["r"] = 0, ["g"] = 1, ["b"] = 0}); frame.Health:SetMax(UnitHealthMax(frame.unit)); frame.Health:SetValue(UnitHealth(frame.unit)); frame.Health.Perc:SetText(floor((UnitHealth(frame.unit)/UnitHealthMax(frame.unit))*100).."%"); frame.Mana:UpdateColor(ManaBarColor[UnitPowerType(frame.unit)]); frame.Mana:SetMax(UnitManaMax(frame.unit)); frame.Mana:SetValue(UnitMana(frame.unit)); frame.Mana.Perc:SetText(floor((UnitMana(frame.unit)/UnitManaMax(frame.unit))*100).."%"); if(UnitName(frame.unit) == UNKNOWNOBJECT) then frame.DoPetUpdate = true; else frame.DoPetUpdate = false; end frame:Show(); else frame:Hide(); end end, UNIT_PVP_UPDATE = function(self, unit) if(not unit) then unit = arg1; end if(not self[unit]) then return; end local icon = self[unit].PVPIcon; local factionGroup = UnitFactionGroup(unit); if (UnitIsPVPFreeForAll(unit)) then icon:SetTexture("Interface\\TargetingFrame\\UI-PVP-FFA"); icon:ClearAllPoints(); icon:SetPoint("CENTER", self[unit], "BOTTOMLEFT", 136, 0); icon:Show(); elseif(factionGroup and UnitIsPVP(unit)) then icon:SetTexture("Interface\\GroupFrame\\UI-Group-PVP-"..factionGroup); icon:ClearAllPoints(); icon:SetPoint("CENTER", self[unit], "BOTTOMLEFT", 128, 0); icon:Show(); else icon:Hide(); end end, PARTY_LEADER_CHANGED = function(self, unit) if(not unit) then unit = arg1; end if(not self[unit]) then for i=1,4 do -- Check party leader status if(UnitIsPartyLeader(self.unit[i])) then self[self.unit[i]].LeaderIcon:Show(); else self[self.unit[i]].LeaderIcon:Hide(); end end else -- Check party leader status if(UnitIsPartyLeader(unit)) then self[unit].LeaderIcon:Show(); else self[unit].LeaderIcon:Hide(); end end end, PARTY_MEMBER_DISABLE = function(self, unit) if(not unit) then unit = arg1; end if(not self[unit]) then return; end if(UnitIsConnected(unit)) then return; end local frame = self[unit]; frame.pulse = false; frame.Health:SetMax(1); frame.Health:SetValue(1); frame.Mana:SetMax(1); frame.Mana:SetValue(1); frame.Health:UpdateColor({ ["r"] = 0.5, ["g"] = 0.5, ["b"] = 0.5}); frame.Mana:UpdateColor({ ["r"] = 0.5, ["g"] = 0.5, ["b"] = 0.5}); frame.Health.Text:SetText("Offline"); frame.Health.Text:SetTextColor(1, 1, 0); frame.Health.Perc:SetText(""); frame.Mana.Text:SetText(""); frame.Mana.Perc:SetText(""); end, UNIT_AURA = function(self, unit) if(not unit) then unit = arg1; end if(not self[unit]) then return; end local frame = self[unit]; -- Don't update frames if they're not locked if(not frame.locked) then return; end local i, icon, buff, debuff, debuffborder, debuffcount, color; for i = 1, 16 do buff = UnitBuff(unit, i); button = frame["Buff"..i]; if (buff) then button.Icon:SetTexture(buff); button:Show(); button.unit = unit; else button:Hide(); end end for i = 1, 16 do debuff, debuffApplications, debuffType = UnitDebuff(unit, i); button = frame["DeBuff"..i]; if (debuff) then button.Icon:SetTexture(debuff); button:Show(); button.Border:Show(); button.isdebuff = 1; button.unit = unit; if ( debuffType ) then color = DebuffTypeColor[debuffType]; else color = DebuffTypeColor["none"]; end debuffborder:SetVertexColor(color.r, color.g, color.b); if (debuffApplications > 1) then button.Count:SetText(debuffApplications); button.Count:Show(); else button.Count:Hide(); end else button:Hide(); end end end, EventHandler = function(self) local unit = arg1; local frame, pet; if(unit and string.find(unit, "partypet")) then frame = self[string.gsub(unit,"pet","")]; pet = 1; elseif(unit and string.find(unit, "party")) then frame = self[unit]; end -- No unit information passed along if(not frame) then -- Handle party events first if(event == "PARTY_MEMBERS_CHANGED" or event == "RAID_ROSTER_UPDATE" or event == "CVAR_UPDATE") then if(self:Get("Enabled")) then if(HIDE_PARTY_INTERFACE == "1" and GetNumRaidMembers() > 0 and self.disabled == FALSE) then self.hide = TRUE; self:Disable(); return; elseif(HIDE_PARTY_INTERFACE == "1" and GetNumRaidMembers() == 0 and self.disabled == TRUE) then self.hide = FALSE; self.disabled = FALSE; self:Enable(); return; else if(not self.hide) then for i=1,4 do self:UpdateMember(self.unit[i]); end end end end end else if(string.find(event, "PARTY")) then self:UpdateMember(unit); end -- We got unit information, process it based on if it's a pet or not if(UnitAffectingCombat(unit)) then frame.isInCombat = TRUE; else frame.isInCombat = FALSE; end if(not pet) then if(event == "UNIT_LEVEL") then frame.Level:SetText(UnitLevel(unit)); elseif(event == "UNIT_NAME_UPDATE") then local _, class = UnitClass(unit); local color = ArcHUD.ClassColor[class]; frame.Name:SetText("|cff"..color..UnitName(unit).."|r"); elseif(event == "UNIT_HEALTH" or event == "UNIT_MAXHEALTH") then local p=UnitHealth(unit)/UnitHealthMax(unit); local r, g = 1, 1; if ( p > 0.5 ) then r = (1.0 - p) * 2; g = 1.0; else r = 1.0; g = p * 2; end if ( r < 0 ) then r = 0; elseif ( r > 1 ) then r = 1; end if ( g < 0 ) then g = 0; elseif ( g > 1 ) then g = 1; end if(UnitIsDead(unit)) then frame.Health:SetValue(0); frame.Health.Text:SetText("Dead"); frame.Health.Perc:SetText(""); elseif(UnitIsGhost(unit)) then self:UpdateGhostMode(unit); else self.pulse = false; if(frame.ColorFade) then frame.Health:UpdateColor({["r"] = r, ["g"] = g, ["b"] = 0.0}); frame.Health.Text:SetTextColor(r, g, 0); else frame.Health.Text:SetTextColor(0, 1, 0); frame.Health:UpdateColor({["r"] = 0, ["g"] = 1, ["b"] = 0.0}); end frame.Health.Text:SetText(UnitHealth(unit).."/"..UnitHealthMax(unit)); frame.Health.Perc:SetText(floor((UnitHealth(unit) / UnitHealthMax(unit)) * 100).."%"); if (event == "UNIT_MAXHEALTH") then frame.Health:SetMax(UnitHealthMax(unit)); else frame.Health:SetValue(UnitHealth(unit)); end end else if(UnitIsGhost(unit)) then self:UpdateGhostMode(unit); else self.pulse = false; if(UnitPowerType(unit) == 0) then info = { r = 0.00, g = 1.00, b = 1.00 }; else info = ManaBarColor[UnitPowerType(unit)]; end frame.Mana:UpdateColor(ManaBarColor[UnitPowerType(unit)]); if(UnitIsDead(unit)) then frame.Mana.Text:SetText(""); frame.Mana.Perc:SetText(""); else frame.Mana.Text:SetText(UnitMana(unit).."/"..UnitManaMax(unit)); frame.Mana.Text:SetVertexColor(info.r, info.g, info.b); frame.Mana.Perc:SetText(floor((UnitMana(unit)/UnitManaMax(unit))*100).."%"); end if(event == "UNIT_MAXMANA" or event == "UNIT_MAXENERGY" or event == "UNIT_MAXRAGE") then frame.Mana:SetMax(UnitManaMax(unit)); else frame.Mana:SetValue(UnitMana(unit)); end end end else if(event == "UNIT_HEALTH" or event == "UNIT_MAXHEALTH") then if(UnitIsDead(unit)) then frame.pet.Health.Perc:SetText("Dead"); else frame.pet.Health.Perc:SetText(floor((UnitHealth(unit)/UnitHealthMax(unit))*100).."%"); end if (event == "UNIT_MAXHEALTH") then frame.pet.Health:SetMax(UnitHealthMax(unit)); else frame.pet.Health:SetValue(UnitHealth(unit)); end else if(UnitIsDead(unit)) then frame.pet.Mana.Perc:SetText(""); else frame.pet.Mana.Perc:SetText(floor((UnitMana(unit)/UnitManaMax(unit))*100).."%"); end frame.pet.Mana:UpdateColor(ManaBarColor[UnitPowerType(unit)]); if(event == "UNIT_MAXMANA" or event == "UNIT_MAXENERGY" or event == "UNIT_MAXRAGE" or event == "UNIT_MAXFOCUS") then frame.pet.Mana:SetMax(UnitManaMax(unit)); else frame.pet.Mana:SetValue(UnitMana(unit)); end end end end end; --------------------------------------------------------------------------- --------------------------------------------------------------------------- -------- NAMEPLATE EVENT FUNCTIONS ----------------------------------- NamePlate_Enter = function() if(this:GetParent().locked) then if(SpellIsTargeting()) then if (SpellCanTargetUnit(this:GetParent().unit)) then SetCursor("CAST_CURSOR"); else SetCursor("CAST_ERROR_CURSOR"); end end --GameTooltip_SetDefaultAnchor(GameTooltip, this); GameTooltip:SetOwner(this, ANCHOR_CURSOR); GameTooltip:SetUnit(this:GetParent().unit); GameTooltip:Show(); end end, NamePlate_Leave = function() if(this:GetParent().locked) then if(SpellIsTargeting()) then SetCursor("CAST_ERROR_CURSOR"); end if(GameTooltip:IsOwned(this)) then GameTooltip:Hide(); end end end, NamePlate_Click = function() if(this:GetParent().locked) then if((ArcHUD_CustomClick and type(ArcHUD_CustomClick) == "function" and not ArcHUD_CustomClick(arg1, this:GetParent().unit)) or not ArcHUD_CustomClick) then if(SpellIsTargeting() and arg1 == "RightButton") then SpellStopTargeting(); return; end if(arg1 == "LeftButton") then if (SpellIsTargeting()) then SpellTargetUnit(this:GetParent().unit); elseif(CursorHasItem()) then DropItemOnUnit(this:GetParent().unit); else TargetUnit(this:GetParent().unit); end elseif(arg1 == "RightButton" and not string.find(this:GetParent().unit, "pet")) then ToggleDropDownMenu(1, nil, getglobal("PartyMemberFrame"..this:GetParent():GetID().."DropDown"), "cursor", 0, 0); end end else ArcHUD.cmd:msg("Party rings currently unlocked, lock party rings to enable clicking"); end end, NamePlate_DragStart = function() if(not this:GetParent().locked) then this:GetParent():ClearAllPoints(); this:GetParent():StartMoving(); end end, NamePlate_DragStop = function() if(not this:GetParent().locked) then this:GetParent():StopMovingOrSizing(); this:GetParent().moved = TRUE; end end, --------------------------------------------------------------------------- --------------------------------------------------------------------------- -------- FRAME CREATION FUNCTIONS ----------------------------------- CreatePartyFrame = function(self, unitid, parent) ----------------------------------------------------------------------- ------ PARTY ---- -- Frame: Party unit local frame = CreateFrame("Frame", nil, parent); frame.unit = self.unit[unitid]; frame:SetID(unitid); frame:SetWidth(256); frame:SetHeight(256); frame:SetScale(0.3); frame:SetFrameStrata("LOW"); frame:SetMovable(true); local t, fs; -- FontString: Name frame.Name = self:CreateFontString(frame, "BACKGROUND", {256, 28}, 28, "CENTER", {1.0, 1.0, 1.0}, {"TOPLEFT", frame, "TOPLEFT", 0, 35}); frame.Name:SetText("party"..unitid); -- FontString: Level frame.Level = self:CreateFontString(frame, "BACKGROUND", {256, 26}, 26, "CENTER", {1.0, 1.0, 0.0}, {"TOP", frame.Name, "BOTTOM", 0, -10}); -- Texture: Leader Icon frame.LeaderIcon = self:CreateTexture(frame, "BACKGROUND", {32, 32}, "Interface\\GroupFrame\\UI-Group-LeaderIcon", {"TOPLEFT", frame.Level, "BOTTOMLEFT", 76, 5}); -- Texture: Master Looter Icon frame.MasterIcon = self:CreateTexture(frame, "BACKGROUND", {32, 32}, "Interface\\GroupFrame\\UI-Group-MasterLooter", {"TOPLEFT", frame.Level, "BOTTOMLEFT", 150, 9}); -- Texture: PvP Icon frame.PVPIcon = self:CreateTexture(frame, "BACKGROUND", {64, 64}, nil, {"CENTER", frame, "BOTTOMLEFT", 128, 0}); local y; -- 1-16 Buff icons frame.Buff1 = self:CreatePartyBuffIcon(frame, unitid, 1, 36, 36); frame.Buff1:SetPoint("TOPRIGHT", frame, "TOPLEFT", -8, 35); for i=2,16 do frame["Buff"..i] = self:CreatePartyBuffIcon(frame, unitid, i, 36, 36); if(i == 6 or i == 14) then y = -2 else y = -3 end frame["Buff"..i]:SetPoint("TOP", frame["Buff"..(i-1)], "BOTTOM", 0, y); end frame.Buff9:ClearAllPoints(); frame.Buff9:SetPoint("TOPRIGHT", frame.Buff1, "TOPLEFT", -3, 0); -- 1-16 DeBuff icons frame.DeBuff1 = self:CreatePartyBuffIcon(frame, unitid, 1, 36, 36); frame.DeBuff1:SetPoint("TOPLEFT", frame, "TOPRIGHT", 8, 35); for i=2,16 do frame["DeBuff"..i] = self:CreatePartyBuffIcon(frame, unitid, i, 36, 36); if(i == 6 or i == 14) then y = -2 else y = -3 end frame["DeBuff"..i]:SetPoint("TOP", frame["DeBuff"..(i-1)], "BOTTOM", 0, y); end frame.DeBuff9:ClearAllPoints(); frame.DeBuff9:SetPoint("TOPLEFT", frame.DeBuff1, "TOPRIGHT", 3, 0); -- Ring: Party unit health frame.Health = self:CreateRing(true, frame); frame.Health.BG:SetAlpha(0.4); frame.Health:SetPoint("TOPLEFT", frame, "TOPLEFT", 128, 128); -- FontString: Health text frame.Health.Text = self:CreateFontString(frame.Health, "ARTWORK", {256, 24}, 24, "CENTER", nil, {"TOPLEFT", frame.Health, "BOTTOMLEFT", -128, 68}); -- FontString: Health percentage frame.Health.Perc = self:CreateFontString(frame.Health, "ARTWORK", {128, 20}, 20, "LEFT", {1.0, 1.0, 1.0}, {"TOPRIGHT", frame.Health, "BOTTOMLEFT", 0, -112}); -- Ring: Party unit mana frame.Mana = self:CreateRing(true, frame); frame.Mana:SetReversed(true); frame.Mana.BG:SetReversed(true); frame.Mana.BG:SetAlpha(0.4); frame.Mana.BG:SetAngle(180); frame.Mana:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 128, 128); -- FontString: Mana text frame.Mana.Text = self:CreateFontString(frame.Mana, "ARTWORK", {256, 24}, 24, "CENTER", nil, {"TOPLEFT", frame.Mana, "BOTTOMLEFT", -128, 40}); -- FontString: Mana percentage frame.Mana.Perc = self:CreateFontString(frame.Mana, "ARTWORK", {128, 20}, 20, "RIGHT", {1.0, 1.0, 1.0}, {"TOPLEFT", frame.Mana, "BOTTOMLEFT", 0, -112}); ----------------------------------------------------------------------- ------ PARTYPET ---- -- Frame: Party unit pet frame.pet = CreateFrame("Frame", nil, frame); frame.pet.unit = self.unit[unitid+4]; frame.pet:SetWidth(180); frame.pet:SetHeight(128); frame.pet:SetPoint("CENTER", frame, "BOTTOMLEFT", 128, 32); -- FontString: Partypet name frame.pet.Name = self:CreateFontString(frame.pet, "BACKGROUND", {180, 24}, 24, "CENTER", {1.0, 1.0, 0.0}, {"TOPLEFT", frame.pet, "TOPLEFT", 0, 35}); -- Ring: Partypet health frame.pet.Health = self:CreateRing(true, frame.pet); frame.pet.Health.BG:SetAlpha(0.4); frame.pet.Health:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 128+18, 128); -- FontString: Partypet health percentage frame.pet.Health.Perc = self:CreateFontString(frame.pet.Health, "BACKGROUND", {128, 20}, 20, "RIGHT", {1.0, 1.0, 1.0}, {"BOTTOMLEFT", frame.pet.Health, "BOTTOMLEFT", -160, -64}); -- Ring: Partypet mana frame.pet.Mana = self:CreateRing(true, frame.pet); frame.pet.Mana:SetReversed(true); frame.pet.Mana.BG:SetReversed(true); frame.pet.Mana.BG:SetAlpha(0.4); frame.pet.Mana.BG:SetAngle(180); frame.pet.Mana:SetPoint("TOPRIGHT", frame, "TOPRIGHT", 128-18, 128); -- FontString: Partypet health percentage frame.pet.Mana.Perc = self:CreateFontString(frame.pet.Mana, "BACKGROUND", {128, 20}, 20, "RIGHT", {1.0, 1.0, 1.0}, {"BOTTOMLEFT", frame.pet.Mana, "BOTTOMLEFT", -36, -64}); ----------------------------------------------------------------------- ------ NAMEPLATES ---- -- Party unit frame.NamePlate = CreateFrame("Button", nil, frame); frame.NamePlate:SetID(unitid); frame.NamePlate:SetWidth(256); frame.NamePlate:SetHeight(28); frame.NamePlate:SetPoint("TOPLEFT", frame, "TOPLEFT", 0, 35); frame.NamePlate:SetToplevel(true); frame.NamePlate:EnableMouse(true); -- Partypet frame.pet.NamePlate = CreateFrame("Button", nil, frame.pet); frame.pet.NamePlate:SetWidth(180); frame.pet.NamePlate:SetHeight(24); frame.pet.NamePlate:SetPoint("TOPLEFT", frame.pet, "TOPLEFT", 0, 35); frame.pet.NamePlate:SetToplevel(true); frame.pet.NamePlate:EnableMouse(true); return frame; end, CreatePartyBuffIcon = function(self, parent, unitid, buffid, width, height) local icon = CreateFrame("Button", nil, parent); icon:SetWidth(width); icon:SetHeight(height); icon:SetID(buffid); icon.Icon = icon:CreateTexture(nil, "ARTWORK"); icon.Icon:SetAllPoints(icon); icon.Border = icon:CreateTexture(nil, "OVERLAY"); icon.Border:SetTexture("Interface\\Buttons\\UI-Debuff-Overlays"); icon.Border:SetWidth(width); icon.Border:SetHeight(height); icon.Border:SetPoint("CENTER", icon, "CENTER", 0, 0); icon.Count = icon:CreateFontString(nil, "OVERLAY"); icon.Count:SetFont("Fonts\\ARIALN.TTF", 12, "THICKOUTLINE, MONOCHROME"); icon.Count:SetPoint("BOTTOMRIGHT", icon, "BOTTOMRIGHT", -1, 0); icon.Icon:SetTexture("Interface\\Icons\\INV_Misc_Ear_Human_02"); icon:SetScript("OnEnter", function() if(this:GetParent().locked) then ArcHUD:SetAuraTooltip(this); end end); icon:SetScript("OnLeave", function() GameTooltip:Hide(); end); return icon; end, }); ArcHUD:Register(ArcHUDRing_Party);