PowerBarColor = {}; PowerBarColor["MANA"] = { r = 0.00, g = 0.00, b = 1.00 }; PowerBarColor["RAGE"] = { r = 1.00, g = 0.00, b = 0.00 }; PowerBarColor["FOCUS"] = { r = 1.00, g = 0.50, b = 0.25 }; PowerBarColor["ENERGY"] = { r = 1.00, g = 1.00, b = 0.00 }; PowerBarColor["HAPPINESS"] = { r = 0.00, g = 1.00, b = 1.00 }; PowerBarColor["RUNES"] = { r = 0.50, g = 0.50, b = 0.50 }; PowerBarColor["RUNIC_POWER"] = { r = 0.00, g = 0.82, b = 1.00 }; -- vehicle colors PowerBarColor["AMMOSLOT"] = { r = 0.80, g = 0.60, b = 0.00 }; PowerBarColor["FUEL"] = { r = 0.0, g = 0.55, b = 0.5 }; -- these are mostly needed for a fallback case (in case the code tries to index a power token that is missing from the table, -- it will try to index by power type instead) PowerBarColor[0] = PowerBarColor["MANA"]; PowerBarColor[1] = PowerBarColor["RAGE"]; PowerBarColor[2] = PowerBarColor["FOCUS"]; PowerBarColor[3] = PowerBarColor["ENERGY"]; PowerBarColor[4] = PowerBarColor["HAPPINESS"]; PowerBarColor[5] = PowerBarColor["RUNES"]; PowerBarColor[6] = PowerBarColor["RUNIC_POWER"]; --[[ This system uses "update" functions as OnUpdate, and OnEvent handlers. This "Initialize" function registers the events to handle. The "update" function is set as the OnEvent handler (although they do not parse the event), as well as run from the parent's update handler. TT: I had to make the spellbar system differ from the norm. I needed a seperate OnUpdate and OnEvent handlers. And needed to parse the event. ]]-- function UnitFrame_Initialize (self, unit, name, portrait, healthbar, healthtext, manabar, manatext, threatIndicator, threatFeedbackUnit, threatNumericIndicator) self.unit = unit; self.name = name; self.portrait = portrait; self.healthbar = healthbar; self.manabar = manabar; self.threatIndicator = threatIndicator; self.threatNumericIndicator = threatNumericIndicator; if (self.healthbar) then self.healthbar.capNumericDisplay = true; end if (self.manabar) then self.manabar.capNumericDisplay = true; end UnitFrameHealthBar_Initialize(unit, healthbar, healthtext, true); UnitFrameManaBar_Initialize(unit, manabar, manatext, (unit == "player" or unit == "pet" or unit == "vehicle")); UnitFrameThreatIndicator_Initialize(unit, self, threatFeedbackUnit); UnitFrame_Update(self); self:RegisterForClicks("LeftButtonUp", "RightButtonUp"); self:RegisterEvent("UNIT_NAME_UPDATE"); self:RegisterEvent("UNIT_PORTRAIT_UPDATE"); self:RegisterEvent("UNIT_DISPLAYPOWER"); end function UnitFrame_SetUnit (self, unit, healthbar, manabar) self.unit = unit; healthbar.unit = unit; if ( manabar ) then --Party Pet frames don't have a mana bar. manabar.unit = unit; end self:SetAttribute("unit", unit); if ( (self==PlayerFrame or self==PetFrame) and unit=="player") then local _,class = UnitClass("player"); if ( class=="DEATHKNIGHT" ) then if ( self==PlayerFrame ) then RuneFrame:SetScale(1) RuneFrame:ClearAllPoints() RuneFrame:SetPoint("TOP", self,"BOTTOM", 52, 34) elseif ( self==PetFrame ) then RuneFrame:SetScale(0.6) RuneFrame:ClearAllPoints() RuneFrame:SetPoint("TOP",self,"BOTTOM",25,20) end end end securecall("UnitFrame_Update", self); end function UnitFrame_Update (self) if ( self.overrideName ) then self.name:SetText(GetUnitName(self.overrideName)); else self.name:SetText(GetUnitName(self.unit)); end UnitFramePortrait_Update(self); UnitFrameHealthBar_Update(self.healthbar, self.unit); UnitFrameManaBar_Update(self.manabar, self.unit); UnitFrame_UpdateThreatIndicator(self.threatIndicator, self.threatNumericIndicator); end function UnitFramePortrait_Update (self) if ( self.portrait ) then SetPortraitTexture(self.portrait, self.unit); end end function UnitFrame_OnEvent(self, event, ...) local arg1 = ... local unit = self.unit; if ( event == "UNIT_NAME_UPDATE" ) then if ( arg1 == unit ) then self.name:SetText(GetUnitName(unit)); end elseif ( event == "UNIT_PORTRAIT_UPDATE" ) then if ( arg1 == unit ) then UnitFramePortrait_Update(self); end elseif ( event == "UNIT_DISPLAYPOWER" ) then if ( arg1 == unit and self.manabar ) then UnitFrameManaBar_UpdateType(self.manabar); end end end function UnitFrame_OnEnter (self) -- If showing newbie tips then only show the explanation if ( SHOW_NEWBIE_TIPS == "1" ) then if ( self == PlayerFrame ) then GameTooltip_SetDefaultAnchor(GameTooltip, self); GameTooltip_AddNewbieTip(self, PARTY_OPTIONS_LABEL, 1.0, 1.0, 1.0, NEWBIE_TOOLTIP_PARTYOPTIONS); return; elseif ( self == TargetFrame and UnitPlayerControlled("target") and not UnitIsUnit("target", "player") and not UnitIsUnit("target", "pet") ) then GameTooltip_SetDefaultAnchor(GameTooltip, self); GameTooltip_AddNewbieTip(self, PLAYER_OPTIONS_LABEL, 1.0, 1.0, 1.0, NEWBIE_TOOLTIP_PLAYEROPTIONS); return; end end UnitFrame_UpdateTooltip(self); end function UnitFrame_OnLeave () if ( SHOW_NEWBIE_TIPS == "1" ) then GameTooltip:Hide(); else GameTooltip:FadeOut(); end end function UnitFrame_UpdateTooltip (self) GameTooltip_SetDefaultAnchor(GameTooltip, self); if ( GameTooltip:SetUnit(self.unit, self.hideStatusOnTooltip) ) then self.UpdateTooltip = UnitFrame_UpdateTooltip; else self.UpdateTooltip = nil; end local r, g, b = GameTooltip_UnitColor(self.unit); --GameTooltip:SetBackdropColor(r, g, b); GameTooltipTextLeft1:SetTextColor(r, g, b); end function UnitFrameManaBar_UpdateType (manaBar) if ( not manaBar ) then return; end local unitFrame = manaBar:GetParent(); local powerType, powerToken, altR, altG, altB = UnitPowerType(manaBar.unit); local prefix = _G[powerToken]; local info = PowerBarColor[powerToken]; if ( info ) then if ( not manaBar.lockColor ) then manaBar:SetStatusBarColor(info.r, info.g, info.b); end else if ( not altR) then -- couldn't find a power token entry...default to indexing by power type or just mana if we don't have that either info = PowerBarColor[powerType] or PowerBarColor["MANA"]; else if ( not manaBar.lockColor ) then manaBar:SetStatusBarColor(altR, altG, altB); end end end manaBar.powerType = powerType; -- Update the manabar text if ( not unitFrame.noTextPrefix ) then SetTextStatusBarTextPrefix(manaBar, prefix); end TextStatusBar_UpdateTextString(manaBar); -- Setup newbie tooltip -- FIXME: Fix this to use powerToken instead of powerType if ( manaBar.unit ~= "pet" or powerToken == "HAPPINESS" ) then if ( unitFrame:GetName() == "PlayerFrame" ) then manaBar.tooltipTitle = prefix; manaBar.tooltipText = _G["NEWBIE_TOOLTIP_MANABAR_"..powerType]; else manaBar.tooltipTitle = nil; manaBar.tooltipText = nil; end end end function UnitFrameHealthBar_Initialize (unit, statusbar, statustext, frequentUpdates) if ( not statusbar ) then return; end statusbar.unit = unit; SetTextStatusBarText(statusbar, statustext); statusbar.frequentUpdates = frequentUpdates; if ( frequentUpdates ) then statusbar:RegisterEvent("VARIABLES_LOADED"); end if ( GetCVarBool("predictedHealth") and frequentUpdates ) then statusbar:SetScript("OnUpdate", UnitFrameHealthBar_OnUpdate); else statusbar:RegisterEvent("UNIT_HEALTH"); end statusbar:RegisterEvent("UNIT_MAXHEALTH"); statusbar:SetScript("OnEvent", UnitFrameHealthBar_OnEvent); -- Setup newbie tooltip if ( statusbar and (statusbar:GetParent() == PlayerFrame) ) then statusbar.tooltipTitle = HEALTH; statusbar.tooltipText = NEWBIE_TOOLTIP_HEALTHBAR; else statusbar.tooltipTitle = nil; statusbar.tooltipText = nil; end end function UnitFrameHealthBar_OnEvent(self, event, ...) if ( event == "CVAR_UPDATE" ) then TextStatusBar_OnEvent(self, event, ...); elseif ( event == "VARIABLES_LOADED" ) then self:UnregisterEvent("VARIABLES_LOADED"); if ( GetCVarBool("predictedHealth") and self.frequentUpdates ) then self:SetScript("OnUpdate", UnitFrameHealthBar_OnUpdate); self:UnregisterEvent("UNIT_HEALTH"); else self:RegisterEvent("UNIT_HEALTH"); self:SetScript("OnUpdate", nil); end else UnitFrameHealthBar_Update(self, ...); end end function UnitFrameHealthBar_OnUpdate(self) if ( not self.disconnected and not self.lockValues) then local currValue = UnitHealth(self.unit); if ( currValue ~= self.currValue ) then self:SetValue(currValue); self.currValue = currValue; TextStatusBar_UpdateTextString(self); end end end function UnitFrameHealthBar_Update(statusbar, unit) if ( not statusbar or statusbar.lockValues ) then return; end if ( unit == statusbar.unit ) then local maxValue = UnitHealthMax(unit); -- Safety check to make sure we never get an empty bar. statusbar.forceHideText = false; if ( maxValue == 0 ) then maxValue = 1; statusbar.forceHideText = true; end statusbar:SetMinMaxValues(0, maxValue); statusbar.disconnected = not UnitIsConnected(unit); if ( statusbar.disconnected ) then if ( not statusbar.lockColor ) then statusbar:SetStatusBarColor(0.5, 0.5, 0.5); end statusbar:SetValue(maxValue); statusbar.currValue = maxValue; else local currValue = UnitHealth(unit); if ( not statusbar.lockColor ) then statusbar:SetStatusBarColor(0.0, 1.0, 0.0); end statusbar:SetValue(currValue); statusbar.currValue = currValue; end end TextStatusBar_UpdateTextString(statusbar); end function UnitFrameHealthBar_OnValueChanged(self, value) TextStatusBar_OnValueChanged(self, value); HealthBar_OnValueChanged(self, value); end function UnitFrameManaBar_UnregisterDefaultEvents(self) self:UnregisterEvent("UNIT_MANA"); self:UnregisterEvent("UNIT_RAGE"); self:UnregisterEvent("UNIT_FOCUS"); self:UnregisterEvent("UNIT_ENERGY"); self:UnregisterEvent("UNIT_HAPPINESS"); self:UnregisterEvent("UNIT_RUNIC_POWER"); end function UnitFrameManaBar_RegisterDefaultEvents(self) self:RegisterEvent("UNIT_MANA"); self:RegisterEvent("UNIT_RAGE"); self:RegisterEvent("UNIT_FOCUS"); self:RegisterEvent("UNIT_ENERGY"); self:RegisterEvent("UNIT_HAPPINESS"); self:RegisterEvent("UNIT_RUNIC_POWER"); end function UnitFrameManaBar_Initialize (unit, statusbar, statustext, frequentUpdates) if ( not statusbar ) then return; end statusbar.unit = unit; SetTextStatusBarText(statusbar, statustext); statusbar.frequentUpdates = frequentUpdates; if ( frequentUpdates ) then statusbar:RegisterEvent("VARIABLES_LOADED"); end if ( GetCVarBool("predictedPower") and frequentUpdates ) then statusbar:SetScript("OnUpdate", UnitFrameManaBar_OnUpdate); else UnitFrameManaBar_RegisterDefaultEvents(statusbar); end statusbar:RegisterEvent("UNIT_MAXMANA"); statusbar:RegisterEvent("UNIT_MAXRAGE"); statusbar:RegisterEvent("UNIT_MAXFOCUS"); statusbar:RegisterEvent("UNIT_MAXENERGY"); statusbar:RegisterEvent("UNIT_MAXHAPPINESS"); statusbar:RegisterEvent("UNIT_MAXRUNIC_POWER"); statusbar:RegisterEvent("UNIT_DISPLAYPOWER"); statusbar:SetScript("OnEvent", UnitFrameManaBar_OnEvent); end function UnitFrameManaBar_OnEvent(self, event, ...) if ( event == "CVAR_UPDATE" ) then TextStatusBar_OnEvent(self, event, ...); elseif ( event == "VARIABLES_LOADED" ) then self:UnregisterEvent("VARIABLES_LOADED"); if ( GetCVarBool("predictedPower") and self.frequentUpdates ) then self:SetScript("OnUpdate", UnitFrameManaBar_OnUpdate); UnitFrameManaBar_UnregisterDefaultEvents(self); else UnitFrameManaBar_RegisterDefaultEvents(self); self:SetScript("OnUpdate", nil); end else UnitFrameManaBar_Update(self, ...); end end function UnitFrameManaBar_OnUpdate(self) if ( not self.disconnected and not self.lockValues ) then local currValue = UnitPower(self.unit, self.powerType); if ( currValue ~= self.currValue ) then self:SetValue(currValue); self.currValue = currValue; TextStatusBar_UpdateTextString(self); end end end function UnitFrameManaBar_Update(statusbar, unit) if ( not statusbar or statusbar.lockValues ) then return; end if ( unit == statusbar.unit ) then -- be sure to update the power type before grabbing the max power! UnitFrameManaBar_UpdateType(statusbar); local maxValue = UnitPowerMax(unit, statusbar.powerType); statusbar:SetMinMaxValues(0, maxValue); statusbar.disconnected = not UnitIsConnected(unit); if ( statusbar.disconnected ) then statusbar:SetValue(maxValue); statusbar.currValue = maxValue; if ( not statusbar.lockColor ) then statusbar:SetStatusBarColor(0.5, 0.5, 0.5); end else local currValue = UnitPower(unit, statusbar.powerType); statusbar:SetValue(currValue); statusbar.currValue = currValue; end end TextStatusBar_UpdateTextString(statusbar); end function UnitFrameThreatIndicator_Initialize(unit, unitFrame, feedbackUnit) local indicator = unitFrame.threatIndicator; if ( not indicator ) then return; end indicator.unit = unit; indicator.feedbackUnit = feedbackUnit or unit; unitFrame:RegisterEvent("UNIT_THREAT_SITUATION_UPDATE"); if ( unitFrame.OnEvent == nil ) then unitFrame.OnEvent = unitFrame:GetScript("OnEvent") or false; end unitFrame:SetScript("OnEvent", UnitFrameThreatIndicator_OnEvent); end function UnitFrameThreatIndicator_OnEvent(self, event, ...) if ( self.OnEvent ) then self.OnEvent(self, event, ...); end if ( event == "UNIT_THREAT_SITUATION_UPDATE" ) then UnitFrame_UpdateThreatIndicator(self.threatIndicator, self.threatNumericIndicator,...); end end function UnitFrame_UpdateThreatIndicator(indicator, numericIndicator, unit) if ( not indicator ) then return; end if ( not unit or unit == indicator.feedbackUnit ) then local status; if ( indicator.feedbackUnit ~= indicator.unit ) then status = UnitThreatSituation(indicator.feedbackUnit, indicator.unit); else status = UnitThreatSituation(indicator.feedbackUnit); end if ( IsThreatWarningEnabled() ) then if (status and status > 0) then indicator:SetVertexColor(GetThreatStatusColor(status)); indicator:Show(); else indicator:Hide(); end if ( numericIndicator ) then if ( ShowNumericThreat() ) then local isTanking, status, percentage = UnitDetailedThreatSituation(indicator.feedbackUnit, indicator.unit); if ( percentage and percentage ~= 0 ) then numericIndicator.text:SetText(format("%d", percentage).."%"); numericIndicator.bg:SetVertexColor(GetThreatStatusColor(status)); numericIndicator:Show(); else numericIndicator:Hide(); end else numericIndicator:Hide(); end end else indicator:Hide(); if ( numericIndicator ) then numericIndicator:Hide(); end end end end function GetUnitName(unit, showServerName) local name, server = UnitName(unit); if ( server and server ~= "" ) then if ( showServerName ) then return name.." - "..server; else return name..FOREIGN_SERVER_LABEL; end else return name; end end function ShowNumericThreat() if ( GetCVar("threatShowNumeric") == "1" ) then return true; else return false; end end