Код:local SetColors = setmetatable({ Та самая metatable, она будет использоваться не только для хп или мана бара, а так же для цветов текста маны, энергии, ярости. power = setmetatable({ ["MANA"] = {0.31, 0.45, 0.63}, Цвет маны, для кастеров :3 ["RAGE"] = {0.69, 0.31, 0.31}, Для воинов и мобов. ["FOCUS"] = {0.71, 0.43, 0.27}, ["ENERGY"] = {0.65, 0.63, 0.35}, Энергия разбойников и друидов. ["HAPPINESS"] = {0.19, 0.58, 0.58}, ["RUNES"] = {0.55, 0.57, 0.61}, ["RUNIC_POWER"] = {0, 0.82, 1}, РП для дк. Ну и так далее. }, {__index = oUF.colors.power}), reaction = setmetatable({ [1] = {0.85, 0.27, 0.27}, -- Hated (Цвет ненависти) [2] = {0.85, 0.27, 0.27}, -- Hostile (Неприязнь) [3] = {0.85, 0.27, 0.27}, -- Unfriendly(Недружелюбие) [4] = {0.85, 0.77, 0.36}, -- Neutral(Нейтральное отношение) [5] = {0.33, 0.59, 0.33}, -- Friendly(Дружеское) [6] = {0.33, 0.59, 0.33}, -- Honored(Почти Уважение) [7] = {0.33, 0.59, 0.33}, -- Revered(Уважение) [8] = {0.33, 0.59, 0.33}, -- Exalted(Превознесение) Это для фракций, какой цвет будет у хп баров для мобов и НПС. }, {__index = oUF.colors.reaction}), }, {__index = oUF.colors})Что такое metatable читаем тут.Код:local ShortValue = function(value) Это нужно для точных вычислений значений, к слову, с помощью этого формата числа уменьшаются в 10млн. раз с точностью до 1(!) знака. if value >= 10000000 then return string.format('%.1fm', value / 1000000) elseif value >= 1000000 then return string.format('%.2fm', value / 1000000) elseif value >= 100000 then return string.format('%.0fk', value / 1000) elseif value >= 10000 then return string.format('%.1fk', value / 1000) else return value end end local PostUpdateHealthBar = function(health, unit, min, max) if not UnitIsConnected(unit) or UnitIsGhost(unit) or UnitIsDead(unit) then if not UnitIsConnected(unit) then health.value:SetText("|cffD7BEA5".."Offline".."|r") Тут цвет когда юнит оффлайн. elseif UnitIsDead(unit) then health.value:SetText("|cffD7BEA5".."Dead".."|r") Серенький цвет для тех, кто не очень жив. elseif UnitIsGhost(unit) then health.value:SetText("|cffD7BEA5".."Ghost".."|r") По-серее цвет для тех кто бежит с кладбища. end else local r, g, b if min ~= max then r, g, b = oUF.ColorGradient(min/max, 0.69, 0.31, 0.31, 0.65, 0.63, 0.35, 0.33, 0.59, 0.33) Цветовой градиент для значений на 100% хп будет зеленый, на половине желтый, >30% будет красный. if unit == "player" and health:GetAttribute("normalUnit") ~= "pet" then health.value:SetFormattedText("|cffAF5050%d|r |cffD7BEA5-|r |cff%02x%02x%02x%s%%|r", min, r * 255, g * 255, b * 255, math.floor(min /max*100+.5)) SetFormattedText очень сильная и эффективная штука, намного экономней чем ***:SetText(text), но есть минус, это временный файл, то есть нельзя использовать как FontString. Описание есть в интернете. Здесь я поставил разделитель текста символ "-", тут же и сокращаются цифры. elseif unit == "pet" then health.value:SetFormattedText("|cff%02x%02x%02x%s|r", r * 255, g * 255, b * 255, ShortValue(min)) else health.value:SetFormattedText("|cffAF5050%s|r |cffD7BEA5-|r |cff%02x%02x%02x%s%%|r", ShortValue(min), r * 255, g * 255, b * 255, math.floor(min /max*100+.5)) end else if unit ~= "player" and unit ~= "pet" then health.value:SetText("|cff559655"..ShortValue(max).."|r") else health.value:SetText("|cff559655"..max.."|r") end end end end PreUpdatePower = function(power, unit) local _, pType = UnitPowerType(unit) local color = SetColors.power[pType] Тут прописываем что бы цвет текста мп был по типу маны, или энергии, опять же зависит от класса. if color then power:SetStatusBarColor(color[1], color[2], color[3]) end end PostUpdatePower = function(power, unit, min, max) Тут аналогично с PostUpdateHealthBar, смотрим там же. Но все же есть некоторые косметические правки, не показывать ману у мертвых, не показывать ману для духов и прочее. local self = power:GetParent() local pType, pToken = UnitPowerType(unit) local color = SetColors.power[pToken] if color then power.value:SetTextColor(color[1], color[2], color[3]) end if not UnitIsPlayer(unit) and not UnitPlayerControlled(unit) or not UnitIsConnected(unit) then power.value:SetText() elseif UnitIsDead(unit) or UnitIsGhost(unit) then power.value:SetText() else if min ~= max then if pType == 0 then if unit == "target" then power.value:SetText(ShortValue(min)) elseif unit == "player" and power:GetAttribute("normalUnit") == "pet" or unit == "pet" or unit == 'arena' then power.value:SetFormattedText("%%s%%", math.floor(min /max*100+.5)) elseif unit == "player" then power.value:SetFormattedText("%s%% |cffD7BEA5-|r %d", math.floor(min /max*100+.5), min) else power.value:SetText(min) end else power.value:SetText(min) end else if unit == "player" or unit == 'arena' then power.value:SetText(min) else power.value:SetText(ShortValue(min)) end end end end




Ответить с цитированием
