-- -- Clean Player Frame -- -- by Bastian Pflieger -- -- Last update: September 14, 2006 -- -- supports "myAddOns": http://www.curse-gaming.com/mod.php?addid=358 -- -- CleanPlayerFrameCombo Modes: -- 1 - Disabled -- 2 - Hide text -- 3 - Show only current value -- CleanPlayerPartyHealth Modes: -- 1 - Disabled -- 2 - Show numbersm -- 3 - Show colorized numbers -- 4 - Show colorized numbers and heal assist messages local TextStatusBar_UpdateTextString_Org; local FONTS = { { font = STANDARD_TEXT_FONT, height = 10, flags = "" }, { font = STANDARD_TEXT_FONT, height = 10, flags = "OUTLINE" } }; -- v = current value -- p = percent local TARGETFRAME_FORMAT = { "", "v", "p%", "v / p%" } local LowHealthWarnings = { ["player"] = false, ["party1"] = false, ["party2"] = false, ["party3"] = false, ["party4"] = false, ["target"] = false }; local UNIT_MODELS = { ["player"] = "CleanPlayerFrame_PlayerModel", ["party1"] = "CleanPlayerFrame_Party1Model", ["party2"] = "CleanPlayerFrame_Party2Model", ["party3"] = "CleanPlayerFrame_Party3Model", ["party4"] = "CleanPlayerFrame_Party4Model", ["target"] = "CleanPlayerFrame_TargetModel" } local UNIT_PORTRAITS = { ["player"] = "PlayerPortrait", ["target"] = "TargetPortrait", ["party1"] = "PartyMemberFrame1Portrait", ["party2"] = "PartyMemberFrame2Portrait", ["party3"] = "PartyMemberFrame3Portrait", ["party4"] = "PartyMemberFrame4Portrait" } function CleanPlayerFrame_OnLoad() CleanPlayerFrame_Mode = 2; -- defaults to hide text CleanPlayerFrame_ShowPartyHealth = 2; -- defaults to show party health CleanPlayerFrame_ColorizeHealthBars = true; CleanPlayerFrame_ShowPartyPercent = false; CleanPlayerFrame_FontIndex = 2; CleanPlayerFrame_TargetFrameIndex = 4; CleanPlayerFrame_UseSmallFont = false; CleanPlayerFrame_Show3D = true; this:RegisterEvent("VARIABLES_LOADED"); this:RegisterEvent("PARTY_MEMBERS_CHANGED"); this:RegisterEvent("PLAYER_TARGET_CHANGED"); this:RegisterEvent("UNIT_PORTRAIT_UPDATE"); this:RegisterEvent("UNIT_HEALTH"); TextStatusBar_UpdateTextString_Org = TextStatusBar_UpdateTextString; TextStatusBar_UpdateTextString = CleanPlayerFrame_TextStatusBar_UpdateTextString; SlashCmdList["CLEANPLAYERFRAME"] = function(msg) ShowUIPanel(CleanPlayerFrameOptionsFrame); end SLASH_CLEANPLAYERFRAME1 = "/cleanplayerframe"; HealthBar_OnValueChanged_Org = HealthBar_OnValueChanged; HealthBar_OnValueChanged = CleanPlayerFrame_HealthBar_OnValueChanged; TargetFrameManaBar:SetScript("OnValueChanged", CleanPlayerFrame_TextStatusBar_UpdateTextString); end function CleanPlayerFrame_Setup(mode, partyHealth, formatIndex, fontIndex, colorizeHealthBars, showPartyPercent, useSmallFont, show3D) CleanPlayerFrame_Mode = mode; if mode > 1 then ManaBarColor[0].prefix = ""; ManaBarColor[1].prefix = ""; ManaBarColor[2].prefix = ""; ManaBarColor[3].prefix = ""; SetTextStatusBarTextPrefix(PlayerFrameHealthBar, ""); else ManaBarColor[0].prefix = MANA; ManaBarColor[1].prefix = RAGE_POINTS; ManaBarColor[2].prefix = FOCUS_POINTS; ManaBarColor[3].prefix = ENERGY_POINTS; SetTextStatusBarTextPrefix(PlayerFrameHealthBar, HEALTH); end SetTextStatusBarTextPrefix(PlayerFrameManaBar, ManaBarColor[UnitPowerType("player")].prefix); TextStatusBar_UpdateTextString(PlayerFrameHealthBar); TextStatusBar_UpdateTextString(PlayerFrameManaBar); TextStatusBar_UpdateTextString(PetFrameHealthBar); TextStatusBar_UpdateTextString(PetFrameManaBar); CleanPlayerFrame_Show3D = show3D; if show3D then --PlayerPortrait:Hide(); CleanPlayerFrame_PlayerModel:Show(); CleanPlayerFrame_Update3D("player"); --TargetPortrait:Hide(); CleanPlayerFrame_TargetModel:Show(); CleanPlayerFrame_Update3D("target"); if not PartyMemberFrame1:IsVisible() then CleanPlayerFrame_Party1Model:ClearModel(); end if not PartyMemberFrame2:IsVisible() then CleanPlayerFrame_Party2Model:ClearModel(); end if not PartyMemberFrame3:IsVisible() then CleanPlayerFrame_Party3Model:ClearModel(); end if not PartyMemberFrame4:IsVisible() then CleanPlayerFrame_Party4Model:ClearModel(); end --PartyMemberFrame1Portrait:Hide(); CleanPlayerFrame_Party1Model:Show(); CleanPlayerFrame_Update3D("party1"); --PartyMemberFrame2Portrait:Hide(); CleanPlayerFrame_Party2Model:Show(); CleanPlayerFrame_Update3D("party2"); --PartyMemberFrame3Portrait:Hide(); CleanPlayerFrame_Party3Model:Show(); CleanPlayerFrame_Update3D("party3"); --PartyMemberFrame4Portrait:Hide(); CleanPlayerFrame_Party4Model:Show(); CleanPlayerFrame_Update3D("party4"); if GetNumPartyMembers() > 0 then CleanPlayerFramePartyChecker:Show(); end else CleanPlayerFramePartyChecker:Hide(); PlayerPortrait:Show(); TargetPortrait:Show(); PartyMemberFrame1Portrait:Show(); PartyMemberFrame2Portrait:Show(); PartyMemberFrame3Portrait:Show(); PartyMemberFrame4Portrait:Show(); CleanPlayerFrame_PlayerModel:Hide(); CleanPlayerFrame_TargetModel:Hide(); CleanPlayerFrame_Party1Model:Hide(); CleanPlayerFrame_Party2Model:Hide(); CleanPlayerFrame_Party3Model:Hide(); CleanPlayerFrame_Party4Model:Hide(); end CleanPlayerFrame_ShowPartyHealth = partyHealth; if not (CleanPlayerFrame_ShowPartyHealth == 1) then PartyMemberFrame1HealthBar.TextString = CleanPlayerFrame_PartyMemberFrame1HealthBarText; PartyMemberFrame2HealthBar.TextString = CleanPlayerFrame_PartyMemberFrame2HealthBarText; PartyMemberFrame3HealthBar.TextString = CleanPlayerFrame_PartyMemberFrame3HealthBarText; PartyMemberFrame4HealthBar.TextString = CleanPlayerFrame_PartyMemberFrame4HealthBarText; PartyMemberFrame1HealthBar.lockShow = 1; PartyMemberFrame2HealthBar.lockShow = 1; PartyMemberFrame3HealthBar.lockShow = 1; PartyMemberFrame4HealthBar.lockShow = 1; else PartyMemberFrame1HealthBar.TextString = nil; PartyMemberFrame2HealthBar.TextString = nil; PartyMemberFrame3HealthBar.TextString = nil; PartyMemberFrame4HealthBar.TextString = nil; -- just to make sure CleanPlayerFrame_PartyMemberFrame1HealthBarText:Hide(); CleanPlayerFrame_PartyMemberFrame2HealthBarText:Hide(); CleanPlayerFrame_PartyMemberFrame3HealthBarText:Hide(); CleanPlayerFrame_PartyMemberFrame4HealthBarText:Hide(); end TextStatusBar_UpdateTextString(PartyMemberFrame1HealthBar); TextStatusBar_UpdateTextString(PartyMemberFrame2HealthBar); TextStatusBar_UpdateTextString(PartyMemberFrame3HealthBar); TextStatusBar_UpdateTextString(PartyMemberFrame4HealthBar); CleanPlayerFrame_ColorizeHealthBars = colorizeHealthBars; -- choose font CleanPlayerFrame_FontIndex = fontIndex; CleanPlayerFrame_PartyMember1HealthBarText:SetFont(FONTS[fontIndex].font, FONTS[fontIndex].height, FONTS[fontIndex].flags); CleanPlayerFrame_PartyMember2HealthBarText:SetFont(FONTS[fontIndex].font, FONTS[fontIndex].height, FONTS[fontIndex].flags); CleanPlayerFrame_PartyMember3HealthBarText:SetFont(FONTS[fontIndex].font, FONTS[fontIndex].height, FONTS[fontIndex].flags); CleanPlayerFrame_PartyMember4HealthBarText:SetFont(FONTS[fontIndex].font, FONTS[fontIndex].height, FONTS[fontIndex].flags); CleanPlayerFrame_TargetFrameHealthBarText:SetFont(FONTS[fontIndex].font, FONTS[fontIndex].height, FONTS[fontIndex].flags); CleanPlayerFrame_TargetFrameManaBarText:SetFont(FONTS[fontIndex].font, FONTS[fontIndex].height, FONTS[fontIndex].flags); -- use selected font for player frame CleanPlayerFrame_UseSmallFont = useSmallFont; if useSmallFont then PlayerFrameHealthBarText:SetFont(FONTS[fontIndex].font, FONTS[fontIndex].height, FONTS[fontIndex].flags); PlayerFrameManaBarText:SetFont(FONTS[fontIndex].font, FONTS[fontIndex].height, FONTS[fontIndex].flags); else PlayerFrameHealthBarText:SetFont(TextStatusBarText:GetFont()); PlayerFrameManaBarText:SetFont(TextStatusBarText:GetFont()); end CleanPlayerFrame_TargetFrameIndex = formatIndex; if formatIndex > 1 then TargetFrameHealthBar.TextString = CleanPlayerFrame_TargetFrameHealthBarText; TargetFrameManaBar.TextString = CleanPlayerFrame_TargetFrameManaBarText; TargetFrameHealthBar.lockShow = 1; TargetFrameManaBar.lockShow = 1; else TargetFrameHealthBar.TextString = nil; TargetFrameManaBar.TextString = nil; CleanPlayerFrame_TargetFrameHealthBarText:Hide(); CleanPlayerFrame_TargetFrameManaBarText:Hide(); end TextStatusBar_UpdateTextString(TargetFrameHealthBar); TextStatusBar_UpdateTextString(TargetFrameManaBar); CleanPlayerFrame_ShowPartyPercent = showPartyPercent; if showPartyPercent then CleanPlayerFrame_PartyMember1HealthBarText:Show(); CleanPlayerFrame_PartyMember2HealthBarText:Show(); CleanPlayerFrame_PartyMember3HealthBarText:Show(); CleanPlayerFrame_PartyMember4HealthBarText:Show(); else CleanPlayerFrame_PartyMember1HealthBarText:Hide(); CleanPlayerFrame_PartyMember2HealthBarText:Hide(); CleanPlayerFrame_PartyMember3HealthBarText:Hide(); CleanPlayerFrame_PartyMember4HealthBarText:Hide(); end TextStatusBar_UpdateTextString(PartyMemberFrame1HealthBar); TextStatusBar_UpdateTextString(PartyMemberFrame2HealthBar); TextStatusBar_UpdateTextString(PartyMemberFrame3HealthBar); TextStatusBar_UpdateTextString(PartyMemberFrame4HealthBar); end function CleanPlayerFrame_TextStatusBar_UpdateTextString(textStatusBar) TextStatusBar_UpdateTextString_Org(textStatusBar); if not textStatusBar then textStatusBar = this; end if textStatusBar.TextString == nil then return; end local value = textStatusBar:GetValue(); local min, max = textStatusBar:GetMinMaxValues(); local percent = CleanPlayerFrame_Percent(value, max); if CleanPlayerFrame_Mode == 3 then -- handle player / pet frame if textStatusBar == PlayerFrameHealthBar or textStatusBar == PlayerFrameManaBar or textStatusBar == PetFrameHealthBar or textStatusBar == PetFrameManaBar then textStatusBar.TextString:SetText(value); end -- handle party frames if ( textStatusBar == PartyMemberFrame1HealthBar or textStatusBar == PartyMemberFrame2HealthBar or textStatusBar == PartyMemberFrame3HealthBar or textStatusBar == PartyMemberFrame4HealthBar ) then textStatusBar.TextString:SetText(value); end end --textStatusBar.TextString:GetText() if ( textStatusBar == PartyMemberFrame1HealthBar or textStatusBar == PartyMemberFrame2HealthBar or textStatusBar == PartyMemberFrame3HealthBar or textStatusBar == PartyMemberFrame4HealthBar ) then -- who r we? local id = textStatusBar:GetParent():GetID(); local unit = "party" .. id; -- show percent if necessary if CleanPlayerFrame_ShowPartyPercent then getglobal("CleanPlayerFrame_PartyMember" .. id .. "HealthBarText"):SetText(percent .. "%"); end -- colorize text if required if CleanPlayerFrame_ShowPartyHealth >= 3 then textStatusBar.TextString:SetTextColor(CleanPlayerFrame_Colorize(percent)); else textStatusBar.TextString:SetTextColor(1, 1, 1); end -- add assist messages if CleanPlayerFrame_ShowPartyHealth == 4 and (not UnitIsDead(unit)) and (not UnitIsGhost(unit)) and UnitIsConnected(unit) then local _, class = UnitClass("player"); if percent < CLEANPLAYERFRAME_MESSAGES[class].percentDanger then textStatusBar.TextString:SetText(textStatusBar.TextString:GetText() .. CLEANPLAYERFRAME_MESSAGES[class].danger); elseif percent < CLEANPLAYERFRAME_MESSAGES[class].percentWarn then textStatusBar.TextString:SetText(textStatusBar.TextString:GetText() .. CLEANPLAYERFRAME_MESSAGES[class].warn); end end -- if (not UnitIsConnected(unit)) or UnitIsGhost(unit) then textStatusBar.TextString:SetTextColor(0.5, 0.5, 0.5); elseif UnitIsDead(unit) then textStatusBar.TextString:SetTextColor(1, 0.3, 0.3); end end -- handle target frame if textStatusBar == TargetFrameHealthBar then -- automatically decide to show percent on target frame if max == 100 then -- not so good textStatusBar.TextString:SetText(value .. "%"); else textStatusBar.TextString:SetText(CleanPlayerFrame_FormatOutput(CleanPlayerFrame_TargetFrameIndex, value, percent)); end -- Hide when wow shows "dead" over the target health bar if UnitIsDead("target") then textStatusBar.TextString:Hide(); else textStatusBar.TextString:Show(); end end if textStatusBar == TargetFrameManaBar then if value > 0 then if UnitPowerType("target") == 0 then textStatusBar.TextString:SetText(CleanPlayerFrame_FormatOutput(CleanPlayerFrame_TargetFrameIndex, value, percent)); else textStatusBar.TextString:SetText(value); end else textStatusBar.TextString:SetText(""); end end end function CleanPlayerFrame_HealthBar_OnValueChanged(value, smooth) if CleanPlayerFrame_ColorizeHealthBars then HealthBar_OnValueChanged_Org(value, true); else HealthBar_OnValueChanged_Org(value, smooth); end end function CleanPlayerFrame_FormatOutput(index, value, percent) local formatString = TARGETFRAME_FORMAT[index]; formatString = string.gsub(formatString, "v", value); formatString = string.gsub(formatString, "p", percent); return formatString; end function CleanPlayerFrame_Percent(value, maxValue) if maxValue == 0 then return 0; else return math.floor(value * 100 / maxValue); end end function CleanPlayerFrame_Colorize(percent) local r = 0; local g = 0; if percent >= 50 then -- red must get up to 255 g = 1; r = (100 - percent) / 50; else -- green must get down to 0 r = 1; g = percent / 50; end return r, g, 0; end function CleanPlayerFrame_Update3D(unit) getglobal(UNIT_MODELS[unit]):ClearModel(); getglobal(UNIT_MODELS[unit]):SetUnit(unit); getglobal(UNIT_MODELS[unit]):SetCamera(0); CleanPlayerFrame_SetLights3D(unit); if CleanPlayerFrame_IsMeshLoaded(unit) then getglobal(UNIT_PORTRAITS[unit]):Hide(); else getglobal(UNIT_PORTRAITS[unit]):Show(); end end function CleanPlayerFrame_SetLights3D(unit) LowHealthWarnings[unit] = false; if (not UnitIsConnected(unit)) or UnitIsGhost(unit) then getglobal(UNIT_MODELS[unit]):SetLight(1, 0, 0, 0, 0, 1.0, 0.25, 0.25, 0.25); elseif UnitIsDead(unit) then getglobal(UNIT_MODELS[unit]):SetLight(1, 0, 0, 0, 0, 1.0, 1, 0.3, 0.3); else if CleanPlayerFrame_Percent(UnitHealth(unit), UnitHealthMax(unit)) < 20 then LowHealthWarnings[unit] = true; CleanPlayerFrameFrame:Show(); else getglobal(UNIT_MODELS[unit]):SetLight(1, 0, 0, 0, 0, 1.0, 1, 1, 1); end end end function CleanPlayerFrame_IsMeshLoaded(unit) return type(getglobal(UNIT_MODELS[unit]):GetModel()) == "string"; end function CleanPlayerFrame_LoadPartyMesh(unit) if not CleanPlayerFrame_IsMeshLoaded(unit) then CleanPlayerFrame_Update3D(unit); end end function CleanPlayerFrame_OnEvent(event) if CleanPlayerFrame_Show3D then if event == "PLAYER_TARGET_CHANGED" then CleanPlayerFrame_Update3D("target"); elseif event == "UNIT_PORTRAIT_UPDATE" and UNIT_MODELS[arg1] then CleanPlayerFrame_Update3D(arg1); elseif event == "UNIT_HEALTH" and UNIT_MODELS[arg1] then CleanPlayerFrame_SetLights3D(arg1); end end if event == "PARTY_MEMBERS_CHANGED" or event == "VARIABLES_LOADED" then -- party members changed && variables loaded if CleanPlayerFrame_Show3D and GetNumPartyMembers() > 0 then CleanPlayerFramePartyChecker:Show(); else CleanPlayerFramePartyChecker:Hide(); end CleanPlayerFrame_Setup(CleanPlayerFrame_Mode, CleanPlayerFrame_ShowPartyHealth, CleanPlayerFrame_TargetFrameIndex, CleanPlayerFrame_FontIndex, CleanPlayerFrame_ColorizeHealthBars, CleanPlayerFrame_ShowPartyPercent, CleanPlayerFrame_UseSmallFont, CleanPlayerFrame_Show3D); end end local timer = 0; local sign = 1; function CleanPlayerFrame_OnUpdate(elapsed) -- blink if party / player is low on health and 3D is on timer = timer + elapsed; if timer > 0.5 then sign = -sign; end timer = mod(timer, 0.5); local redIntensity = 0; if sign == 1 then redIntensity = 0.7 - timer; else redIntensity = timer + 0.2; end local hide = true; for unit, warn in pairs(LowHealthWarnings) do if warn and getglobal(UNIT_MODELS[unit]):IsVisible() then getglobal(UNIT_MODELS[unit]):SetLight(1, 0, 0, 0, 0, 1.0, 1, redIntensity, redIntensity); hide = false; end end if hide then CleanPlayerFrameFrame:Hide(); end end --[[ function CleanPlayerFrame_DebugParty() PartyMemberFrame1:Show(); PartyMemberFrame1Disconnect:Show(); CleanPlayerFrame_Party1Model:SetUnit("party1"); CleanPlayerFrame_Party1Model:SetCamera(0); CleanPlayerFrame_Party1Model:Show() CleanPlayerFrame_Party1Model:SetLight(1, 0, 0, 0, 0, 1.0, 0.25, 0.25, 0.25); PartyMemberFrame2:Show(); PartyMemberFrame2Disconnect:Hide(); CleanPlayerFrame_Party2Model:SetUnit("target"); CleanPlayerFrame_Party2Model:SetCamera(0); CleanPlayerFrame_Party2Model:Show() CleanPlayerFrame_Party2Model:SetLight(1, 0, 0, 0, 0, 1.0, 1, 0.3, 0.3); PartyMemberFrame3:Show(); PartyMemberFrame3Disconnect:Hide(); CleanPlayerFrame_Party3Model:SetUnit("player"); CleanPlayerFrame_Party3Model:SetCamera(0); CleanPlayerFrame_Party3Model:Show() PartyMemberFrame4:Show(); PartyMemberFrame4Disconnect:Hide(); CleanPlayerFrame_Party4Model:SetUnit("party1"); CleanPlayerFrame_Party4Model:SetCamera(0); CleanPlayerFrame_Party4Model:Show() LowHealthWarnings["player"] = true; LowHealthWarnings["party1"] = true; LowHealthWarnings["party2"] = true; LowHealthWarnings["party3"] = true; LowHealthWarnings["party4"] = true; CleanPlayerFrameFrame:Show(); end function CleanPlayerFrame_Debug2() if CleanPlayerFrame_IsMeshLoaded("party1") then ChatFrame1:AddMessage("model ist LOADED" .. CleanPlayerFrame_Party1Model:GetModel() ); else ChatFrame1:AddMessage("model ist not loaded!"); end end --]]