Специально не пользовался библиотекой UTF-8 для вывода тэгов на наши хп и мп бары, выигрываем с этого неплохую долю памяти, приятно всё-таки.Код:local CreateStyle = function(self, unit) Главная функция, основная, запоминаем её название.(CreateStyle) self:RegisterForClicks('AnyUp') self:SetScript('OnEnter', UnitFrame_OnEnter) self:SetScript('OnLeave', UnitFrame_OnLeave) Делаем фреймы кликабельными. self.colors = SetColors Прописываем цвета фреймов которые берутся из metatable. self:SetAttribute('type2', 'menu') self.menu = menu Помните я писал про функцию меню? Не забываем прописать. self.Health = CreateFrame('StatusBar', nil, self) Создаем полоску с хп, статусбар. self.Health:SetStatusBarTexture(texture) self.Health:SetHeight(25) На высоту полоски хп выделим 25 пикселей. self.Health:SetPoint('TOPLEFT') self.Health:SetPoint('TOPRIGHT') self.Health.PostUpdate = PostUpdateHealthBar Указываем к чему относятся наши переменные, а то не видать нам текста хп. self.Health.frequentUpdates = true Обновление хп по функции OnUpdate, это значит при каждой новой отрисовке фрейма, т.е. (ваше фпс) то есть изменению вашего фрейма раз в секунду. Он будет обновляться, не указав это он попросту "забудет" об этом. То же самое будет и с маной (задастся в соотв. месте) self.Health.colorTapping = true self.Health.colorClass = true О чем я и писал где-то, цвет хп бара по цвету класса. self.Health.colorReaction = true Это для НПС и мобов, делаем цвета по отношению к вам(дружелюбны ли, враждебны и т.д.) self.Health.bg = self.Health:CreateTexture(nil, 'BORDER') Фон полоски хп. self.Health.bg:SetAllPoints() self.Health.bg:SetTexture(texture) self.Health.bg.multiplier = 0.25 Делаем фон полоски хп по-темнее чем цвет самой полоски. self.Health.background = CreateBackdrop(self.Health) Прописываем подложку (бэкдроп.) self.Health.value = CreateFontString(self.Health) (!) важно. Прописываем текст хп, где он будут отображаться, как видно тут используется конструкция которую можно посмотреть в блоке моего гайда под названием 'Coding'. if unit == 'player' or unit == 'target' then self.Health.value:SetPoint('RIGHT', 0, 4) elseif unit == 'pet' or unit == 'focus' or unit == 'targettarget' then self.Health.value:SetPoint('LEFT', 0, 1) end self.Power = CreateFrame('StatusBar', nil, self) Создаем полоску маны, статусбар. self.Power:SetStatusBarTexture(texture) self.Power:SetHeight(4) Делаем её высоту 4 пикселя. self.Power:SetFrameLevel(10) Устанавливаем её поверх полоски с хп. self.Power:SetPoint('TOPRIGHT', self.Health, 'BOTTOMRIGHT', 0, 0) Положение полоски. Цепляем за нижний правый и нижний левый края полоски со здоровьем. self.Power:SetPoint('TOPLEFT', self.Health, 'BOTTOMLEFT', 0, 0) self.Power.PreUpdate = PreUpdatePower self.Power.PostUpdate = PostUpdatePower Не забываем указывать к чему относятся наши переменные. self.Power.bg = self.Power:CreateTexture(nil, 'BORDER') self.Power.bg:SetAllPoints() self.Power.bg:SetTexture(texture) self.Power.bg.multiplier = 0.3 self.Power.background = CreateBackdrop(self.Power) self.Power.frequentUpdates = true Аналогично с хп баром (смотрим туда). self.Power.colorDisconnected = true self.Power.colorTapping = true self.Power.colorPower = true Делаем цвет полоски маны по цвету маны, энергии, ярости, рун, в зависимости от вашего класса. self.Power.value = CreateFontString(self.Power) if unit == 'player' or unit == 'target' then self.Power.value:SetPoint('RIGHT', 0, 3) end (!) важно. Прописываем текст маны, где он будут отображаться, как видно тут используется конструкция которую можно посмотреть в блоке моего гайда под названием 'Coding'. self.Info = CreateFontString(self.Health) Прописываем тэги, difficulty и level означают, что на полоске с хп будет отоборажаться уровень цели. Тут же можно задать и сокращение имени. if unit == 'target' then self.Info:SetPoint('LEFT', 0, 4) self:Tag(self.Info, '[difficulty][level][shortclassification] [raidcolor][name]') raidcolor, name - Соответственно цвет вашего никнейма по классу. elseif (not unit == 'player') or unit == 'pet' or unit == 'focus' or unit == 'targettarget' then self.Info:SetPoint('RIGHT', 0, 1) self:Tag(self.Info, '[raidcolor][name]') end if unit == 'player' or unit == 'target' then Размеры всех фреймов, 205 это ширина player и target фреймов. self:SetAttribute('initial-height', 25) self:SetAttribute('initial-width', 205) elseif unit == 'pet' or unit == 'focus' or unit == 'targettarget' then self:SetAttribute('initial-height', 15) self:SetAttribute('initial-width', 130) Аналогично только с фреймами пэта, ТоТ и фокуса. self.Health:SetHeight(15) Отводим 15 пикселей под высоту их хп бара. self.Power:SetHeight(2) Точно так же, но с мана баром. end if unit == 'player' then Блок аур, тут уже жестко прописываем их положение, размер и их обновление. self.Buffs = CreateFrame("Frame", nil, self) self.Buffs:SetPoint('TOPRIGHT', UIParent, 'TOPRIGHT', -150, -9) self.Buffs.initialAnchor = 'TOPRIGHT' Привязка фрейма баффов идёт к верхнему правому углу. self.Buffs["growth-y"] = 'DOWN' Расти будем вниз self.Buffs["growth-x"] = 'LEFT' И влево... self.Buffs:SetHeight(55) Максимальная высота бара с баффами. self.Buffs:SetWidth(450) Максимальная ширина бара с баффами. self.Buffs.spacing = 3 Расстояние между аурами. self.Buffs.size = 26 Размер аур. self.Buffs.num = 32 Количество аур (баффы). self.Buffs.disableCooldown = true Отключаем спиральку на эффектах об их окончании. self.Buffs.PostCreateIcon = PostCreateAuraIcon self.Buffs.PostUpdateIcon = PostUpdateBuff Указываем переменные. self.Debuffs = CreateFrame("Frame", nil, self) self.Debuffs:SetPoint('TOPRIGHT', UIParent, 'TOPRIGHT', -150, -116) self.Debuffs.initialAnchor = 'TOPRIGHT' self.Debuffs["growth-x"] = 'LEFT' self.Debuffs["growth-y"] = 'DOWN' self.Debuffs:SetHeight(55) self.Debuffs:SetWidth(450) self.Debuffs.spacing = 3 self.Debuffs.size = 26 self.Debuffs.num = 32 self.Debuffs.disableCooldown = true self.Debuffs.PostCreateIcon = PostCreateAuraIcon self.Debuffs.PostUpdateIcon = PostUpdateDebuff end if unit == 'target' then self.Auras = CreateFrame("Frame", nil, self) self.Auras:SetPoint('BOTTOMLEFT', self, 'TOPLEFT', 0, 3) self.Auras.initialAnchor = 'BOTTOMLEFT' self.Auras["growth-x"] = 'RIGHT' self.Auras["growth-y"] = 'UP' self.Auras.numDebuffs = 16 self.Auras.numBuffs = 32 self.Auras:SetHeight(165) self.Auras:SetWidth(221) self.Auras.spacing = 3 self.Auras.size = 23 self.Auras.gap = true self.Auras.disableCooldown = true self.Auras.PostCreateIcon = PostCreateAuraIcon self.Auras.PostUpdateIcon = PostUpdateBuff end self.Castbar = CreateFrame("StatusBar", nil, self) Создаем простенький кастбар. self.Castbar:SetStatusBarTexture(texture) self.Castbar:SetStatusBarColor(0.31, 0.45, 0.63) Цвет кастбара когда мы кастуем. self.Castbar.bg = CreateBackdrop(self.Castbar) Прописываем подложку (бэкдроп.) self.Castbar.Text = CreateFontString(self.Castbar) self.Castbar.Text:SetPoint('LEFT', 0, 1) Положение на кастбаре текста заклинания. self.Castbar.Time = CreateFontString(self.Castbar) self.Castbar.Time:SetPoint('RIGHT', 0, 1) Положение на кастбаре времени сколько произносится заклинание. self.Castbar.Button = CreateFrame('Frame', nil, self.Castbar) Добавляем иконку заклинания. self.Castbar.Button:SetHeight(18) self.Castbar.Button:SetWidth(18) if unit == 'player' then self.Castbar.Button:SetPoint('BOTTOMRIGHT', self.Castbar, 'BOTTOMLEFT', -3, 0) elseif unit == 'target' then self.Castbar.Button:SetPoint('BOTTOMLEFT', self.Castbar, 'BOTTOMRIGHT', 3, 0) end self.Castbar.Button.bg = CreateBackdrop(self.Castbar.Button) self.Castbar.Icon = self.Castbar.Button:CreateTexture(nil, 'ARTWORK') self.Castbar.Icon:SetAllPoints(self.Castbar.Button) self.Castbar.Icon:SetTexCoord(0.08, 0.92, 0.08, 0.92) if unit == 'player' or unit == 'target' then Условия для player и target фреймов, размер кастбара и его положение. self.Castbar:SetWidth(205) self.Castbar:SetHeight(15) self.Castbar:SetPoint('BOTTOM', self.Health, 0, -22) end