MAX_FOCUS_DEBUFFS = 8; function FocusFrame_OnLoad (self) self.statusCounter = 0; self.statusSign = -1; self.unitHPPercent = 1; FocusFrame.debuffTotal = 0; self:RegisterForDrag("LeftButton"); FocusFrame_Update(self); self:RegisterEvent("PLAYER_ENTERING_WORLD"); self:RegisterEvent("PLAYER_FOCUS_CHANGED"); self:RegisterEvent("UNIT_HEALTH"); self:RegisterEvent("UNIT_LEVEL"); self:RegisterEvent("UNIT_FACTION"); self:RegisterEvent("UNIT_CLASSIFICATION_CHANGED"); self:RegisterEvent("UNIT_AURA"); self:RegisterEvent("PLAYER_FLAGS_CHANGED"); self:RegisterEvent("PARTY_MEMBERS_CHANGED"); self:RegisterEvent("RAID_TARGET_UPDATE"); self:RegisterEvent("VARIABLES_LOADED"); local frameLevel = FocusFrameTextureFrame:GetFrameLevel(); FocusFrameHealthBar:SetFrameLevel(frameLevel-1); FocusFrameManaBar:SetFrameLevel(frameLevel-1); FocusFrameSpellBar:SetFrameLevel(frameLevel-1); local showmenu = function() ToggleDropDownMenu(1, nil, FocusFrameDropDown, "FocusFrame", 120, 10); end SecureUnitButton_OnLoad(self, "focus", showmenu); end function FocusFrame_Update (self) -- This check is here so the frame will hide when the target goes away -- even if some of the functions below are hooked by addons. if ( not UnitExists("focus") ) then self:Hide(); else self:Show(); -- Moved here to avoid taint from functions below TargetofFocus_Update(); UnitFrame_Update(self); FocusFrame_CheckFaction(self); FocusFrame_UpdateAuras(self); FocusPortrait:SetAlpha(1.0); end end function FocusFrame_OnEvent (self, event, ...) UnitFrame_OnEvent(self, event, ...); local arg1 = ...; if ( event == "PLAYER_ENTERING_WORLD" ) then FocusFrame_Update(self); elseif ( event == "PLAYER_FOCUS_CHANGED" ) then -- Moved here to avoid taint from functions below FocusFrame_Update(self); FocusFrame_UpdateRaidTargetIcon(self); CloseDropDownMenus(); if ( UnitExists("focus") ) then if ( UnitIsEnemy("focus", "player") ) then PlaySound("igCreatureAggroSelect"); elseif ( UnitIsFriend("player", "focus") ) then PlaySound("igCharacterNPCSelect"); else PlaySound("igCreatureNeutralSelect"); end end elseif ( event == "UNIT_FACTION" ) then if ( arg1 == "focus" or arg1 == "player" ) then FocusFrame_CheckFaction(self); end elseif ( event == "UNIT_AURA" ) then if ( arg1 == "focus" ) then FocusFrame_UpdateAuras(self); end elseif ( event == "PARTY_MEMBERS_CHANGED" ) then TargetofFocus_Update(); FocusFrame_CheckFaction(self); elseif ( event == "RAID_TARGET_UPDATE" ) then FocusFrame_UpdateRaidTargetIcon(self); elseif ( event == "VARIABLES_LOADED" ) then FocusFrame_SetFullSize(GetCVarBool("fullSizeFocusFrame")); end end function FocusFrame_OnHide (self) PlaySound("INTERFACESOUND_LOSTTARGETUNIT"); CloseDropDownMenus(); end function FocusFrame_CheckFaction (self) if ( not UnitPlayerControlled("focus") and UnitIsTapped("focus") and not UnitIsTappedByPlayer("focus") and not UnitIsTappedByAllThreatList("focus") ) then FocusFrameNameBackground:SetVertexColor(0.5, 0.5, 0.5); FocusPortrait:SetVertexColor(0.5, 0.5, 0.5); else FocusFrameNameBackground:SetVertexColor(UnitSelectionColor("focus")); FocusPortrait:SetVertexColor(1.0, 1.0, 1.0); end end function FocusFrame_OnUpdate (self, elapsed) if ( TargetofFocusFrame:IsShown() ~= UnitExists("focus-target") ) then TargetofFocus_Update(); end end function FocusFrame_UpdateAuras (self) RefreshDebuffs(self, "focus", MAX_FOCUS_DEBUFFS); end function FocusFrame_HealthUpdate (self, elapsed, unit) if ( UnitIsPlayer(unit) ) then if ( (self.unitHPPercent > 0) and (self.unitHPPercent <= 0.2) ) then local alpha = 255; local counter = self.statusCounter + elapsed; local sign = self.statusSign; if ( counter > 0.5 ) then sign = -sign; self.statusSign = sign; end counter = mod(counter, 0.5); self.statusCounter = counter; if ( sign == 1 ) then alpha = (127 + (counter * 256)) / 255; else alpha = (255 - (counter * 256)) / 255; end FocusPortrait:SetAlpha(alpha); end end end function FocusHealthCheck (self) if ( UnitIsPlayer("focus") ) then local unitHPMin, unitHPMax, unitCurrHP; unitHPMin, unitHPMax = self:GetMinMaxValues(); unitCurrHP = self:GetValue(); self:GetParent().unitHPPercent = unitCurrHP / unitHPMax; if ( UnitIsDead("focus") ) then FocusPortrait:SetVertexColor(0.35, 0.35, 0.35, 1.0); elseif ( UnitIsGhost("focus") ) then FocusPortrait:SetVertexColor(0.2, 0.2, 0.75, 1.0); elseif ( (self:GetParent().unitHPPercent > 0) and (self:GetParent().unitHPPercent <= 0.2) ) then FocusPortrait:SetVertexColor(1.0, 0.0, 0.0); else FocusPortrait:SetVertexColor(1.0, 1.0, 1.0, 1.0); end end end function FocusFrameDropDown_OnLoad (self) UIDropDownMenu_Initialize(self, FocusFrameDropDown_Initialize, "MENU"); end function FocusFrameDropDown_Initialize (self) UnitPopup_ShowMenu(self, "FOCUS", "focus", SET_FOCUS); end function FocusFrame_UpdateRaidTargetIcon (self) local index = GetRaidTargetIndex("focus"); if ( index ) then SetRaidTargetIconTexture(FocusRaidTargetIcon, index); FocusRaidTargetIcon:Show(); else FocusRaidTargetIcon:Hide(); end end function TargetofFocus_OnLoad (self) local frameLevel = FocusFrame:GetFrameLevel(); TargetofFocusFrame:SetFrameLevel(frameLevel-1); UnitFrame_Initialize(self, "focus-target", TargetofFocusName, TargetofFocusPortrait, TargetofFocusHealthBar, TargetofFocusHealthBarText, TargetofFocusManaBar, TargetofFocusFrameManaBarText, TargetofFocusThreatIndicator, "player"); SetTextStatusBarTextZeroText(TargetofFocusHealthBar, DEAD); self:RegisterEvent("UNIT_AURA"); SecureUnitButton_OnLoad(self, "focus-target"); end function TargetofFocus_Update (self, elapsed) if ( not self ) then self = TargetofFocusFrame; end local show; if ( SHOW_TARGET_OF_TARGET == "1" and UnitExists("focus") and UnitExists("focus-target") and --[[( not UnitIsUnit(PlayerFrame.unit, "focus") ) and ]]( UnitHealth("focus") > 0 ) ) then if ( ( SHOW_TARGET_OF_TARGET_STATE == "5" ) or ( SHOW_TARGET_OF_TARGET_STATE == "4" and ( (GetNumRaidMembers() > 0) or (GetNumPartyMembers() > 0) ) ) or ( SHOW_TARGET_OF_TARGET_STATE == "3" and ( (GetNumRaidMembers() == 0) and (GetNumPartyMembers() == 0) ) ) or ( SHOW_TARGET_OF_TARGET_STATE == "2" and ( (GetNumPartyMembers() > 0) and (GetNumRaidMembers() == 0) ) ) or ( SHOW_TARGET_OF_TARGET_STATE == "1" and ( GetNumRaidMembers() > 0 ) ) ) then show = true; end end if ( show ) then if ( not TargetofFocusFrame:IsShown() ) then TargetofFocusFrame:Show(); Focus_Spellbar_AdjustPosition(); end UnitFrame_Update(self); TargetofFocus_CheckDead(); TargetofFocusHealthCheck(); RefreshDebuffs(TargetofFocusFrame, "focus-target"); else if ( TargetofFocusFrame:IsShown() ) then TargetofFocusFrame:Hide(); Focus_Spellbar_AdjustPosition(); end end end function TargetofFocus_CheckDead () if ( (UnitHealth("focus-target") <= 0) and UnitIsConnected("focus-target") ) then TargetofFocusBackground:SetAlpha(0.9); TargetofFocusDeadText:Show(); else TargetofFocusBackground:SetAlpha(1); TargetofFocusDeadText:Hide(); end end function TargetofFocusHealthCheck () if ( UnitIsPlayer("focus-target") ) then local unitHPMin, unitHPMax, unitCurrHP; unitHPMin, unitHPMax = TargetofFocusHealthBar:GetMinMaxValues(); unitCurrHP = TargetofFocusHealthBar:GetValue(); TargetofFocusFrame.unitHPPercent = unitCurrHP / unitHPMax; if ( UnitIsDead("focus-target") ) then TargetofFocusPortrait:SetVertexColor(0.35, 0.35, 0.35, 1.0); elseif ( UnitIsGhost("focus-target") ) then TargetofFocusPortrait:SetVertexColor(0.2, 0.2, 0.75, 1.0); elseif ( (TargetofFocusFrame.unitHPPercent > 0) and (TargetofFocusFrame.unitHPPercent <= 0.2) ) then TargetofFocusPortrait:SetVertexColor(1.0, 0.0, 0.0); else TargetofFocusPortrait:SetVertexColor(1.0, 1.0, 1.0, 1.0); end end end function SetFocusSpellbarAspect() local frameText = _G[FocusFrameSpellBar:GetName().."Text"]; if ( frameText ) then frameText:SetFontObject(SystemFont_Shadow_Small); frameText:ClearAllPoints(); frameText:SetPoint("TOP", FocusFrameSpellBar, "TOP", 0, 4); end local frameBorder = _G[FocusFrameSpellBar:GetName().."Border"]; if ( frameBorder ) then frameBorder:SetTexture("Interface\\CastingBar\\UI-CastingBar-Border-Small"); frameBorder:SetWidth(177); frameBorder:SetHeight(49); frameBorder:ClearAllPoints(); frameBorder:SetPoint("TOP", FocusFrameSpellBar, "TOP", 0, 20); end local frameBorderShield = _G[FocusFrameSpellBar:GetName().."BorderShield"]; if ( frameBorderShield ) then --frameBorderShield:SetTexture("Interface\\CastingBar\\UI-CastingBar-Small-FocusShield"); frameBorderShield:SetWidth(177); frameBorderShield:SetHeight(49); frameBorderShield:ClearAllPoints(); frameBorderShield:SetPoint("TOP", FocusFrameSpellBar, "TOP", -6, 20); end local frameFlash = _G[FocusFrameSpellBar:GetName().."Flash"]; if ( frameFlash ) then frameFlash:SetTexture("Interface\\CastingBar\\UI-CastingBar-Flash-Small"); frameFlash:SetWidth(177); frameFlash:SetHeight(49); frameFlash:ClearAllPoints(); frameFlash:SetPoint("TOP", FocusFrameSpellBar, "TOP", -2, 20); end end function Focus_Spellbar_OnLoad (self) self:RegisterEvent("PLAYER_FOCUS_CHANGED"); self:RegisterEvent("CVAR_UPDATE"); self:RegisterEvent("VARIABLES_LOADED"); CastingBarFrame_OnLoad(self, "focus", false, false); local barIcon = _G[self:GetName().."Icon"]; barIcon:Show(); barIcon:ClearAllPoints(); barIcon:SetPoint("RIGHT", self:GetName(), "LEFT", -5, 0); SetFocusSpellbarAspect(); self.showShield = true; _G[self:GetName().."Text"]:SetWidth(130); -- check to see if the castbar should be shown if ( GetCVar("showTargetCastbar") == "0") then self.showCastbar = false; end end function Focus_Spellbar_OnEvent (self, event, ...) local arg1 = ... -- Check for target specific events if ( (event == "VARIABLES_LOADED") or ((event == "CVAR_UPDATE") and (arg1 == "SHOW_TARGET_CASTBAR")) ) then if ( GetCVar("showTargetCastbar") == "0") then self.showCastbar = false; else self.showCastbar = true; end if ( not self.showCastbar ) then self:Hide(); elseif ( self.casting or self.channeling ) then self:Show(); end return; elseif ( event == "PLAYER_FOCUS_CHANGED" ) then -- check if the new target is casting a spell local nameChannel = UnitChannelInfo(self.unit); local nameSpell = UnitCastingInfo(self.unit); if ( nameChannel ) then event = "UNIT_SPELLCAST_CHANNEL_START"; arg1 = "focus"; elseif ( nameSpell ) then event = "UNIT_SPELLCAST_START"; arg1 = "focus"; else self.casting = nil; self.channeling = nil; self:SetMinMaxValues(0, 0); self:SetValue(0); self:Hide(); return; end -- The position depends on the classification of the target Focus_Spellbar_AdjustPosition(); end CastingBarFrame_OnEvent(self, event, arg1, select(2, ...)); end function Focus_Spellbar_AdjustPosition () local yPos = 3; if ( FocusFrame.debuffTotal > 4 ) then yPos = 25; elseif ( TargetofFocusFrame:IsShown() ) then yPos = 30; elseif ( FocusFrame.debuffTotal > 0 ) then yPos = 15 end FocusFrameSpellBar:SetPoint("BOTTOM", "FocusFrame", "BOTTOM", 20, -yPos); end FOCUS_FRAME_LOCKED = true; function FocusFrame_IsLocked() return FOCUS_FRAME_LOCKED; end function FocusFrame_SetLock(locked) FOCUS_FRAME_LOCKED = locked; end function FocusFrame_OnDragStart(self, button) FOCUS_FRAME_MOVING = false; if ( not FOCUS_FRAME_LOCKED ) then local cursorX, cursorY = GetCursorPosition(); self:SetFrameStrata("DIALOG"); self:StartMoving(); FOCUS_FRAME_MOVING = true; end end function FocusFrame_OnDragStop(self) if ( not FOCUS_FRAME_LOCKED and FOCUS_FRAME_MOVING ) then self:StopMovingOrSizing(); self:SetFrameStrata("BACKGROUND"); ValidateFramePosition(self, 25); FOCUS_FRAME_MOVING = false; end end --------Support for a full-size Focus Frame--------- local dimsAndAnchors = {setDims = true, numAnchorsToCopy = 1}; --This way we don't have to have duplicate tables... local justAnchors = { setDims = false, numAnchorsToCopy = 1}; local framesToDuplicate = { ["Frame"] = { setDims = true, numAnchorsToCopy = 0, }, ["FrameFlash"] = dimsAndAnchors, ["FrameBackground"] = dimsAndAnchors, ["FrameNameBackground"] = dimsAndAnchors, ["Portrait"] = dimsAndAnchors, ["Name"] = dimsAndAnchors, ["FrameHealthBarText"] = justAnchors, ["FrameManaBarText"] = justAnchors, ["RaidTargetIcon"] = dimsAndAnchors, ["FrameHealthBar"] = dimsAndAnchors, ["FrameManaBar"] = dimsAndAnchors, ["FrameNumericalThreat"] = dimsAndAnchors, } -- temp fixes to focus frame TargetPortrait = TargetFramePortrait; TargetFrameManaBarText = TargetFrameTextureFrameManaBarText; TargetFrameHealthBarText = TargetFrameTextureFrameHealthBarText; TargetRaidTargetIcon = TargetFrameTextureFrameRaidTargetIcon; TargetName = TargetFrameTextureFrameName; function FocusFrame_SetFullSize(fullSize) if ( fullSize and not FocusFrame.fullSize) then --It copies the TargetFrame. That way we don't have to explicitly maintain a bunch of alternate coordinates. FocusFrame.fullSize = true; for name, value in pairs(framesToDuplicate) do local frame = _G["Focus"..name]; local equivFrame = _G["Target"..name]; if ( value.setDims ) then --Save off the old dimensions so that we can set them back later (the or stops it from overwriting if there are already values) frame.oldHeight = frame.oldHeight or frame:GetHeight(); frame.oldWidth = frame.oldWidth or frame:GetWidth(); frame:SetHeight(equivFrame:GetHeight()); frame:SetWidth(equivFrame:GetWidth()); end if ( value.numAnchorsToCopy > 0 ) then frame.oldAnchors = frame.oldAnchors or {}; for i=1, frame:GetNumPoints() do frame.oldAnchors[i] = frame.oldAnchors[i] or {frame:GetPoint(i)}; end frame:ClearAllPoints(); for i=1, value.numAnchorsToCopy do local point, relativeTo, relativePoint, xOffset, yOffset = equivFrame:GetPoint(i); relativeTo = string.gsub(relativeTo:GetName(), "Target", "Focus", 1); frame:SetPoint(point, relativeTo, relativePoint, xOffset, yOffset); end end end for i=1, MAX_FOCUS_DEBUFFS do _G["FocusFrameDebuff"..i]:SetHeight(21); _G["FocusFrameDebuff"..i]:SetWidth(21); end TargetofFocusFrame:SetPoint("BOTTOMRIGHT", -35, -10); FocusFrameFlash:SetTexture("Interface\\TargetingFrame\\UI-FocusFrame-Large-Flash"); FocusFrameFlash:SetTexCoord(0.0, 0.945, 0.0, 0.73125); FocusFrameTextureFrameSmall:Hide(); FocusFrameTextureFrameFullSize:Show(); elseif ( not fullSize and FocusFrame.fullSize ) then FocusFrame.fullSize = false; for name, value in pairs(framesToDuplicate) do local frame = _G["Focus"..name]; if ( frame.oldHeight ) then frame:SetHeight(frame.oldHeight); end if ( frame.oldWidth ) then frame:SetWidth(frame.oldWidth); end if ( frame.oldAnchors ) then frame:ClearAllPoints(); for i=1, #frame.oldAnchors do frame:SetPoint(unpack(frame.oldAnchors[i])); end end end for i=1, MAX_FOCUS_DEBUFFS do _G["FocusFrameDebuff"..i]:SetHeight(15); _G["FocusFrameDebuff"..i]:SetWidth(15); end TargetofFocusFrame:SetPoint("BOTTOMRIGHT", 14, -9); FocusFrameFlash:SetTexture("Interface\\TargetingFrame\\UI-TargetingFrame-Flash"); FocusFrameFlash:SetTexCoord(0.55078125, 0, 0.400390625, 0.52734375); FocusFrameTextureFrameSmall:Show(); FocusFrameTextureFrameFullSize:Hide(); end end