Код:
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
Специально не пользовался библиотекой UTF-8 для вывода тэгов на наши хп и мп бары, выигрываем с этого неплохую долю памяти, приятно всё-таки.