Здравствуйте, надеюсь моя темка сможет многое рассказать начинающим создателям аддонов и тем, кто решил играть на дефолте.
Начнём с самого простого.
Когда вы вбиваете какую-то команду/скрипт в игре, то эффект будет сохраняться до релога, а при следующем входе нужно вбивать все заново.
Многие начинающие разработчики аддонов/скриптов сталкиваются с проблемой того, что в обычный макрос wow можно записать не более 255 знаков, эта проблема легко очень решается аддоном Super Duper Macro.
Super Duper Macro - это world of warcraft аддон, который позволяет создавать макросы большей длины, чем через саму игру. Стандартное количество символов в макросе составляет 255, а через Super Duper Macro вы сможете написать более 1023 символов. Кроме увеличения возможной длины текста макроса, через данный аддон вы сможете обмениваться своими макросами с друзьями. Данная модификация совместима с любыми версиями вов, как 3.3.5, так и 4.0.6. Для новых версий нужно будет скачать и установить фикс.
Для открытия интерфейса аддона нужно прописать следующее:
Скачать Super Duper Macro 3.3.5a
С помощью этого аддона, мы будем предварительно (перед переносом в аддон строк) тестировать большие скрипты сразу в игре, без надобности в перезагрузках UI, как в случае с аддонами.
Как закрепить изменения и не жать скрипты каждый раз логинясь в игру?
Элементарно. Надо просто сделать свой примитивный аддон.
Покажу на примере скрипта, который заменяет портреты на иконки классов.
Скрипт выглядит так:
PHP код:
/ run UFP = "UnitFramePortrait_Update"; UICC = "Interface\\Glues\\CharacterCreate\\UI-CharacterCreate-Classes"
/ run hooksecurefunc(UFP,function(self) if self.portrait then self.portrait:SetTexture(UICC) self.portrait:SetTexCoord(unpack(CLASS_ICON_TCOORDS[select(2,UnitClass(self.unit))])) end end)
Теперь делаем из него аддон:
1. В Interface\AddOns\ создаем папку с именем нашего аддона, например "classicons"
2. Через блокнот делаем там два текстовых файла: classicons.lua и classicons.toc
3. В classicons.toc пишем:
PHP код:
## Interface: 40000
## Title: ClassIcons
## Author: DontWearSundress
## Version: 1.0
classicons.lua
4. В classicons.lua, который и есть "тело" нашего аддона, мы записываем нужный нам скрипт:
PHP код:
UFP = "UnitFramePortrait_Update"; UICC = "Interface\\TargetingFrame\\UI-Classes-Circles"; CIT = CLASS_ICON_TCOORDS
hooksecurefunc(UFP,function(self) if self.portrait then local t = CIT[select(2,UnitClass(self.unit))] if t then self.portrait:SetTexture(UICC) self.portrait:SetTexCoord(unpack(t)) end end end)
Отличие, как вы можете заметить, минимальное. Просто убираем "/ run" перед нужной командой.
Надеюсь сложностей на этом этапе ни у кого не возникнет.
Теперь далее, рассмотрим несколько возможных скриптов, которые можно внести в свой аддон:
1. Чтобы переместить фрейм игрока+таргета и закрепить его на будущее, надо добавить в аддон следующие строки:
PHP код:
local a = CreateFrame("Frame")
a:SetScript("OnEvent", function(self, event)
if event == "PLAYER_ENTERING_WORLD" then
PlayerFrame:ClearAllPoints()
PlayerFrame:SetPoint("TOPLEFT",UIParent,"TOPLEFT", 200, -158)
TargetFrame:ClearAllPoints()
TargetFrame:SetPoint("TOPLEFT",UIParent,"TOPLEFT", 448, -158)
end
end)
a:RegisterEvent("PLAYER_ENTERING_WORLD")
Эта версия работает в катаклизме. Координаты поменяйте под свои нужды.
2. Размер фрейма игрока:
PHP код:
/ run PlayerFrame:SetScale(1.4)
Параметр в круглых скобках (1.4) - означает что масштаб фрейма игрока увеличен на 40% от стандартного значения.
Можно изменить как вам нравится.
3. Размер фрейма таргета:
PHP код:
/ run TargetFrame:SetScale(1.4)
4. Размер фокус фрейма:
PHP код:
/ run FocusFrame:SetScale(1.4)
4.1 Размер КАСТБАРА у фокусфрейма:
PHP код:
/ run FocusFrameSpellBar:SetScale(1.4)
5. Арена фреймы:
PHP код:
/ run ArenaEnemyFrame1:SetScale(1.6)
/ run ArenaEnemyFrame2:SetScale(1.6)
/ run ArenaEnemyFrame3:SetScale(1.6)
5.1 Петы у арена фреймов:
PHP код:
/ run ArenaEnemyFrame1PetFrame:SetScale(1.6)
/ run ArenaEnemyFrame3PetFrame:SetScale(1.6)
/ run ArenaEnemyFrame2PetFrame:SetScale(1.6)
6. Размеры фреймов группы (самое нужное, т.к. по дефолту они весьма мелкие):
PHP код:
/ run PartyMemberFrame1:SetScale(1.4)
/ run PartyMemberFrame2:SetScale(1.4)
/ run PartyMemberFrame3:SetScale(1.4)
/ run PartyMemberFrame4:SetScale(1.4)
7. Отключение красного спама по центру экрана в стиле "Эту цель атаковать нельзя", "Нельзя применить к этой цели" и т.п.
PHP код:
/script UIErrorsFrame:SetAlpha(0)
8. Отключение драконов слева и справа:
PHP код:
/ run MainMenuBarLeftEndCap:Hide();MainMenuBarRightEndCap:Hide()
9. Прозрачные Action Bars:
PHP код:
/ run MainMenuBarTexture0:Hide()
/ run MainMenuBarTexture1:Hide()
/ run MainMenuBarTexture2:Hide()
/ run MainMenuBarTexture3:Hide()
/ run MainMenuBarLeftEndCap:Hide()
/ run MainMenuBarRightEndCap:Hide()
/ run MainMenuMaxLevelBar0:Hide()
/ run MainMenuMaxLevelBar1:Hide()
/ run MainMenuMaxLevelBar2:Hide()
/ run MainMenuMaxLevelBar3:Hide()
/ run BonusActionBarFrameTexture1:Hide()
/ run BonusActionBarFrameTexture2:Hide()
/ run BonusActionBarFrameTexture3:Hide()
/ run BonusActionBarFrameTexture4:Hide()
10. Изменение масштаба панелек:
PHP код:
/ run MainMenuBar:SetScale(0.5)
/ run MultiBarBottomLeft:SetScale(0.5)
/ run MultiBarBottomRight:SetScale(0.5)
В wow очень много команд, с которыми можно поиграться :)
Откуда можно взять эти команды? В основном, я использую эти сайты:
http://wowpedia.org/Api
http://wowpedia.org/Widget_API
http://wowprogramming.com/docs/api_categories
http://www.wowwiki.com/World_of_Warcraft_API
На этом первая часть статьи как сделать аддон закончена :)
И ещё раз напомню: в игре мы проверяем скрипты запуская их через / run, в аддоне / run писать не надо.
- - - Updated - - -
Вторая часть
- - - Updated - - -
Рассмотрим скрипты, которые использует один из лучших рогов - Neilyo.
1. PvP-тринкеты противников на арене:
Arena Trinkets
PHP код:
CTT=CreateFrame("Frame")CTT:SetParent(TargetFrame)CTT:SetPoint("Left",TargetFrame,170,-16)CTT:SetSize(20,20)CTT.t=CTT:CreateTexture(nil,BORDER)CTT.t:SetAllPoints()CTT.t:SetTexture("Interface\\Icons\\ABILITY_DUALWIELD")CTT:Hide()
local function FrameOnUpdate(self) if UnitAffectingCombat("target") then self:Show() else self:Hide() end end local g = CreateFrame("Frame") g:SetScript("OnUpdate", function(self) FrameOnUpdate(CTT) end)
CFT=CreateFrame("Frame")CFT:SetParent(FocusFrame)CFT:SetPoint("Left",FocusFrame,170,-15)CFT:SetSize(20,20)CFT.t=CFT:CreateTexture(nil,BORDER)CFT.t:SetAllPoints()CFT.t:SetTexture("Interface\\Icons\\ABILITY_DUALWIELD")CFT:Hide()
local function FrameOnUpdate(self) if UnitAffectingCombat("focus") then self:Show() else self:Hide() end end local g = CreateFrame("Frame") g:SetScript("OnUpdate", function(self) FrameOnUpdate(CFT) end)
local trinkets = {}
local events = CreateFrame("Frame")
function events:ADDON_LOADED(addonName)
if addonName ~= "Blizzard_ArenaUI" then
return
end
ArenaEnemyFrame1:ClearAllPoints()
ArenaEnemyFrame1:SetPoint("CENTER", nil, "CENTER", 295.0, 40.0)
ArenaEnemyFrames:SetScale(1.2)
local arenaFrame, trinket
for i = 1, MAX_ARENA_ENEMIES do
arenaFrame = "ArenaEnemyFrame"..i
trinket = CreateFrame("Cooldown", arenaFrame.."Trinket", ArenaEnemyFrames)
trinket:SetPoint("TOPRIGHT", arenaFrame, 30, -6)
trinket:SetSize(30, 30)
trinket.icon = trinket:CreateTexture(nil, "BACKGROUND")
trinket.icon:SetAllPoints()
trinket.icon:SetTexture("Interface\\Icons\\inv_jewelry_trinketpvp_01")
trinket:Hide()
trinkets["arena"..i] = trinket
end
self:UnregisterEvent("ADDON_LOADED")
end
function events:UNIT_SPELLCAST_SUCCEEDED(unitID, spell, rank, lineID, spellID)
if not trinkets[unitID] then
return
end
if spell == GetSpellInfo(59752) or spell == GetSpellInfo(42292) then
CooldownFrame_SetTimer(trinkets[unitID], GetTime(), 120, 1)
SendChatMessage("Trinket used by: "..GetUnitName(unitID, true), "PARTY")
elseif spell == GetSpellInfo(7744) then
CooldownFrame_SetTimer(trinkets[unitID], GetTime(), 45, 1)
SendChatMessage("WotF used by: "..GetUnitName(unitID, true), "PARTY")
end
end
function events:PLAYER_ENTERING_WORLD()
local _, instanceType = IsInInstance()
if instanceType == "arena" then
self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
elseif self:IsEventRegistered("UNIT_SPELLCAST_SUCCEEDED") then
self:UnregisterEvent("UNIT_SPELLCAST_SUCCEEDED")
for _, trinket in pairs(trinkets) do
trinket:SetCooldown(0, 0)
trinket:Hide()
end
end
end
SLASH_TESTAEF1 = "/testaef"
SlashCmdList["TESTAEF"] = function(msg, editBox)
if not IsAddOnLoaded("Blizzard_ArenaUI") then
LoadAddOn("Blizzard_ArenaUI")
end
ArenaEnemyFrames:Show()
local arenaFrame
for i = 1, 3 do
arenaFrame = _G["ArenaEnemyFrame"..i]
arenaFrame.classPortrait:SetTexture("Interface\\TargetingFrame\\UI-Classes-Circles")
arenaFrame.classPortrait:SetTexCoord(unpack(CLASS_ICON_TCOORDS["WARRIOR"]))
arenaFrame.name:SetText("Dispelme")
arenaFrame:Show()
CooldownFrame_SetTimer(trinkets["arena"..i], GetTime(), 120, 1)
end
end
events:SetScript("OnEvent", function(self, event, ...) return self[event](self, ...) end)
events:RegisterEvent("ADDON_LOADED")
events:RegisterEvent("PLAYER_ENTERING_WORLD")
hooksecurefunc("PlayerFrame_UpdateStatus", function()
if IsResting("player") then
PlayerStatusTexture:Hide()
[свернуть]
2. Скрипт отображает комбат цели и фокуса:
Combat
PHP код:
CTT=CreateFrame("Frame")CTT:SetParent(TargetFrame)CTT:SetPoint("Left",TargetFrame,-30,5)CTT:SetSize(25,25)CTT.t=CTT:CreateTexture(nil,BORDER)CTT.t:SetAllPoints()CTT.t:SetTexture("Interface\\Icons\\ABILITY_DUALWIELD")CTT:Hide()
local function FrameOnUpdate(self) if UnitAffectingCombat("target") then self:Show() else self:Hide() end end local g = CreateFrame("Frame") g:SetScript("OnUpdate", function(self) FrameOnUpdate(CTT) end)
CFT=CreateFrame("Frame")CFT:SetParent(FocusFrame)CFT:SetPoint("Left",FocusFrame,-30,5)CFT:SetSize(25,25)CFT.t=CFT:CreateTexture(nil,BORDER)CFT.t:SetAllPoints()CFT.t:SetTexture("Interface\\Icons\\ABILITY_DUALWIELD")CFT:Hide()
local function FrameOnUpdate(self) if UnitAffectingCombat("focus") then self:Show() else self:Hide() end end local g = CreateFrame("Frame") g:SetScript("OnUpdate", function(self) FrameOnUpdate(CFT) end)
[свернуть]
Координаты и размер иконки комбата настраиваются в строках:
PHP код:
CTT:SetParent(TargetFrame)CTT:SetPoint("Left",TargetFrame,-30,5)CTT:SetSize(25,25)
CFT:SetParent(FocusFrame)CFT:SetPoint("Left",FocusFrame,-30,5)CFT:SetSize(25,25)
3. Иконка класса вместо портрета игрока:
ClassIcons
PHP код:
UFP = "UnitFramePortrait_Update"
UICC = "Interface\\TargetingFrame\\UI-Classes-Circles"
CIT = CLASS_ICON_TCOORDS
hooksecurefunc(UFP,function(self) if self.portrait then if UnitIsPlayer(self.unit) and UnitIsVisible(self.unit) then self.portrait:SetTexture(UICC) self.portrait:SetTexCoord(unpack(CIT[select(2,UnitClass(self.unit))])) else self.portrait:SetTexCoord(0,1,0,1) end end end)
[свернуть]
4. Шрифт комбат текста:
CombatTextFont
PHP код:
local fontName = "Interface\\AddOns\\NeilyoScript\\font.ttf"
local fontHeight = 40
local fFlags = ""
local function FS_SetFont()
DAMAGE_TEXT_FONT = fontName
COMBAT_TEXT_HEIGHT = fontHeight
COMBAT_TEXT_CRIT_MAXHEIGHT = fontHeight + 2
COMBAT_TEXT_CRIT_MINHEIGHT = fontHeight - 2
local fName, fHeight, fFlags = CombatTextFont:GetFont()
CombatTextFont:SetFont(fontName, fontHeight, fFlags)
end
FS_SetFont()
[свернуть]
Необходимо положить файл с нужным вам шрифтом в папку с аддоном и переименовать его в font.
5. Enemy Cooldowns:
Скрипт, отображающий использованные кулдауны врагов.
Вот как эти скрипты выглядят в моем интерфейсе:
http://i.imgur.com/gc8PO.jpg
Прежде всего, вам необходимо выбрать местоположение данных абилок. Для этого в игре введите команду /fstack.
В появившемся окне будут отображаться координаты X Y относительно нижнего левого угла монитора. Координаты по X отличаются на 22 для каждой иконки и по 30 для Y.

Координаты указываются здесь:
PHP код:
t1p="Interface\\Icons\\ability_rogue_shadowdance";t1=CF(F);TrS(t1,240,560,"cd1",t1p,22,true)
Если "true" заменить на "false", то при заходе(релоге) не будут высвечиваться все кулдауны.
Как добавлять свои абилки (покажу на примере маговской Антимагии):
1)Находим нужную абилку
Антимагия
2)В ссылке
http://wowroad.info/?spell=2139 цифры после "=" показывают ID спелла.
3)Нажимаем на иконку КСа, чтобы узнать, как она называется: spell_frost_iceshock (для этой операции используем вовхед)
4)Также необходимо знать кулдаун спелла: 24 сек
Теперь все необходимое у нас есть, чтобы добавить в скрипт. Ниже показана добавленная строчка к маговским абилкам.
Жирным выделены изменения, произведенные в новой строке.
Как это выглядит
PHP код:
...
t15p="Interface\\Icons\\ability_mage_deepfreeze";t15=CF(F);TrS(t15,240,500,"cd15",t15p,22,true);t15:SetScript(OE,function(self,event,...) Ts(t15,cd15,select(1,...),select(5,...),44572,30) end);
t16p="Interface\\Icons\\spell_frost_wizardmark";t16=CF(F);TrS(t16,262,500,"cd16",t16p,22,true);t16:SetScript(OE,function(self,event,...) Ts(t16,cd16,select(1,...),select(5,...),11958,480) end);
t17p="Interface\\Icons\\spell_arcane_blink";t17=CF(F);TrS(t17,284,500,"cd17",t17p,22,true);t17:SetScript(OE,function(self,event,...) Ts(t17,cd17,select(1,...),select(5,...),1953,15) end);
...
t59p="Interface\\Icons\\[B]spell_frost_iceshock[/B]";t59=CF(F);TrS(t59,306,500,"cd59",t59p,22,true);t59:SetScript(OE,function(self,event,...) Ts(t59,cd59,select(1,...),select(5,...),[B]2139[/B],[B]24[/B]) end);
[свернуть]
В игре необходимо сделать макрос:
PHP код:
/ run for i=1,58 do _G["t"..i]:Hide() end
/ run for i=1,58 do _G["t"..i].c:Hide() end
С помощью него очищаются кулдауны после каждой арены или баттлграунда.
Значение "58" верно только для этого скрипта(для 58 спеллов), но при добавлении своих абилок его необходимо увеличивать.
6. Убрать с панелек названия биндов.
Remove Keybind Icon on Action Bars
PHP код:
/ run for i = 1, 12 do _G["BonusActionButton"..i.."HotKey"]:SetAlpha(0) end
/ run for i = 1, 12 do _G["MultiBarBottomLeftButton"..i.."HotKey"]:SetAlpha(0) end
/ run for i = 1, 12 do _G["MultiBarBottomRightButton"..i.."HotKey"]:SetAlpha(0) end
/ run for i = 1, 12 do _G["ActionButton"..i.."HotKey"]:SetAlpha(0) end
/ run for i = 1, 12 do _G["MultiBarLeftButton"..i.."HotKey"]:SetAlpha(0) end
/ run for i = 1, 12 do _G["MultiBarRightButton"..i.."HotKey"]:SetAlpha(0) end
[свернуть]
7. Убрать с панелек названия макросов.
Remove Macro Text from Action Bars
PHP код:
/ run for i = 1, 12 do _G["BonusActionButton"..i.."Name"]:Hide() end
/ run for i = 1, 12 do _G["ActionButton"..i.."Name"]:Hide() end
/ run for i = 1, 12 do _G["MultiBarBottomLeftButton"..i.."Name"]:Hide() end
/ run for i = 1, 12 do _G["MultiBarBottomRightButton"..i.."Name"]:Hide() end
[свернуть]
8. Показывать процент HP и количество здоровья на фреймах цели и фокуса:
Show Percent HP AND Health Number on Target and Focus Frame
PHP код:
Macro 1:
/ run TF=CreateFrame("Frame")TFHB=TargetFrameHealthBar.TextString;TTSB=TextStatusBar_CapDisplayOfNumericValue
/ run FF=CreateFrame("Frame")FFHB=FocusFrameHealthBar.TextString;TTSB=TextStatusBar_CapDisplayOfNumericValue
Macro 2:
/ run TF:SetScript("OnUpdate", function(target)TFHB:SetText(TTSB(UnitHealth("target")).."/"..TTSB(UnitHealthMax("target")).." ("..format("%.0f", ((UnitHealth("target")/UnitHealthMax("target"))*100)).."%)") end)
Macro 3:
/ run FF:SetScript("OnUpdate", function(focus)FFHB:SetText(TTSB(UnitHealth("focus")).."/"..TTSB(UnitHealthMax("focus")).." ("..format("%.0f", ((UnitHealth("focus")/UnitHealthMax("focus"))*100)).."%)") end)
[свернуть]
9. Передвигаем (все разом) кастбары арена врагов, также чуть увеличивая их:
Move Arena Enemy Cast Bars (all at once)
PHP код:
/ run V={B="ArenaEnemyFrame"} for i=1,5 do _G[V.B..i]:SetScale(1.23); _G[V.B..i.."CastingBar"]:SetPoint("RIGHT",95,0); end;
[свернуть]
10. Изменение, передвижение бафов\дебафов
Moving, Resizing Buffs
PHP код:
--player buffs
/ run BuffFrame:ClearAllPoints();BuffFrame:SetPoint("CENTER", PlayerFrame, "CENTER", 771, 468);BuffFrame.SetPoint = function() end
/ run BuffFrame:SetScale(1.2)
--player debuffs
/ run DebuffButton1:ClearAllPoints();DebuffButton1:SetPoint("CENTER", PlayerFrame, "CENTER", 771, 468);DebuffButton1.SetPoint = function() end
/ run DebuffButton1:SetScale(1.2)
--target buffs
/ run hooksecurefunc("TargetFrame_UpdateAuraPositions",function(self) local g=_G["TargetFrameBuff1"] if g then g:ClearAllPoints();g:SetPoint("CENTER",TargetFrame,"CENTER",67,10)end end); TargetFrame.maxBuffs = 16
/ run TargetFrameBuff1:SetScale(1.2)
/ run TargetFrameDebuff1:SetScale(1.2)
[свернуть]
11. Время кастов, для дефолт кастбаров
Cast Time To The Default Cast Bar
PHP код:
CastingBarFrame.timer =CastingBarFrame:CreateFontString(nil);
CastingBarFrame.timer:SetFont(STANDARD_TEXT_FONT,12,"OUTLINE");
--CastingBarFrame.timer:SetPoint("RIGHT",CastingBarFrame,"RIGHT",-5,-2);
CastingBarFrame.timer:SetPoint("RIGHT",CastingBarFrame,"RIGHT",2,-15);
CastingBarFrame.update =.1;
hooksecurefunc("CastingBarFrame_OnUpdate",function(self, elapsed)
if not self.timer then return end
if self.update and self.update < elapsed then
if self.casting then
self.timer:SetText(format("%2.1f/%1.1f", max(self.maxValue -self.value,0),self.maxValue))
elseif self.channeling then
self.timer:SetText(format("%.1f", max(self.value,0)))
else
self.timer:SetText("")
end
self.update =.1
else
self.update =self.update - elapsed
end
end)
[свернуть]
12. Изменение имени
Name Change Scripts
PHP код:
local frame = CreateFrame("FRAME", "NameChangeScripts")
frame:RegisterEvent("PLAYER_ENTERING_WORLD")
local function eventHandler(self, event, ...)
-- EDIT THIS LINE BELOW TO CHANGE YOUR NAME
NewName = " "
PN = GetUnitName("player")
-- Change Player UnitFrame Name
PFNC = CreateFrame("Frame", "PlayerFrameNameChange")
local function ChangePlayerName(self)
PlayerFrame.name:SetText(NewName)
end
PFNC:SetScript("OnUpdate", ChangePlayerName)
-- Change Target UnitFrame Name
TFNC = CreateFrame("Frame", "TargetFrameNameChange")
local function ChangeTargetName(self)
local TN = GetUnitName("target")
if PN == TN then
TargetFrame.name:SetText(NewName)
end
end
TFNC:SetScript("OnUpdate", ChangeTargetName)
-- Change Target's Target UnitFrame Name
TFTNC = CreateFrame("Frame", "TargetFrameTargetNameChange")
local function ChangeTargetofTargetName(self)
local TTN = GetUnitName("targettarget")
if PN == TTN then
TargetFrameToT.name:SetText(NewName)
end
end
TFTNC:SetScript("OnUpdate", ChangeTargetofTargetName)
-- Change Focus UnitFrame Name
FFNC = CreateFrame("Frame", "FocusFrameNameChange")
local function ChangeFocusName(self)
local FN = GetUnitName("focus")
if PN == FN then
FocusFrame.name:SetText(NewName)
end
end
FFNC:SetScript("OnUpdate", ChangeFocusName)
-- Change Focus' Target UnitFrame Name
FFTNC = CreateFrame("Frame", "FocusFrameTargetNameChange")
local function ChangeFocusTargetName(self)
local FTN = GetUnitName("focustarget")
if PN == FTN then
FocusFrameToT.name:SetText(NewName)
end
end
FFTNC:SetScript("OnUpdate", ChangeFocusTargetName)
end
frame:SetScript("OnEvent", eventHandler)
[свернуть]
13. Цвета полосок здоровья по цвету класса:
Health Bar Color
PHP код:
local UnitIsPlayer, UnitIsConnected, UnitClass, RAID_CLASS_COLORS =
UnitIsPlayer, UnitIsConnected, UnitClass, RAID_CLASS_COLORS
local _, class, c
local function colour(statusbar, unit)
if UnitIsPlayer(unit) and UnitIsConnected(unit) and unit == statusbar.unit and UnitClass(unit) then
_, class = UnitClass(unit)
c = CUSTOM_CLASS_COLORS and CUSTOM_CLASS_COLORS[class] or RAID_CLASS_COLORS[class]
statusbar:SetStatusBarColor(c.r, c.g, c.b)
end
end
hooksecurefunc("UnitFrameHealthBar_Update", colour)
hooksecurefunc("HealthBar_OnValueChanged", function(self)
colour(self, self.unit)
end)
local sb = _G.GameTooltipStatusBar
local addon = CreateFrame("Frame", "StatusColour")
addon:RegisterEvent("UPDATE_MOUSEOVER_UNIT")
addon:SetScript("OnEvent", function()
colour(sb, "mouseover")
end)
[свернуть]

14. Отображение диминишингов над фреймами:
Icon Diminishing return tracker for Cheap Shot, Kidney Shot, Gouge and Sap.
PHP код:
--Woundman DRTracker
USD="UNIT_SPELLCAST_SUCCEEDED";OT="OnEvent";FR="Frame";RF=CreateFrame;RD="Border";UE=UnitName
CS=RF(FR) CS.c=RF("Cooldown","CST",CS.t) CS:RegisterEvent(USD)
CS.c:SetAllPoints(CS) CS:SetPoint("TOPRIGHT",PlayerFrame,-2,-100)CS:SetSize(22,22)CS.t=CS:CreateTexture(nil,RD)CS.t:SetAllPoints()CS.t:SetTexture("Interface\\Icons\\ability_cheapshot")
CS:SetScript(OT,function(self,event,...)if UE(select(1,...))==UE("player")and select(5,...)==1833 then CST:SetCooldown(GetTime(),23) end if UE(select(1,...))==UE("player")and select(5,...)==408 then CST:SetCooldown(GetTime(),25)end end)
SP=RF(FR) SP.c=RF("Cooldown","SAP",SP.t) SP:RegisterEvent(USD)
SP.c:SetAllPoints(SP) SP:SetPoint("TOPRIGHT",PlayerFrame,-25,-100)SP:SetSize(22,22)SP.t=SP:CreateTexture(nil,RD)SP.t:SetAllPoints()SP.t:SetTexture("Interface\\Icons\\ability_sap")
SP:SetScript(OT,function(self,event,...)if UE(select(1,...))==UE("player")and select(5,...)==6770 then SAP:SetCooldown(GetTime(),27)end if UE(select(1,...))==UE("player")and select(5,...)==1776 then SAP:SetCooldown(GetTime(),23)end end)
[свернуть]

15. Красный цвет спелов на панельках если цель за пределами досягаемости:
Red Hover When OUT OF RANGE
PHP код:
hooksecurefunc("ActionButton_OnEvent",function(self, event, ...)
if ( event == "PLAYER_TARGET_CHANGED" ) then
self.newTimer = self.rangeTimer
end
end)
hooksecurefunc("ActionButton_UpdateUsable",function(self)
local icon = _G[self:GetName().."Icon"]
local valid = IsActionInRange(self.action)
if ( valid == 0 ) then
icon:SetVertexColor(1.0, 0.1, 0.1)
end
end)
hooksecurefunc("ActionButton_OnUpdate",function(self, elapsed)
local rangeTimer = self.newTimer
if ( rangeTimer ) then
rangeTimer = rangeTimer - elapsed
if ( rangeTimer <= 0 ) then
ActionButton_UpdateUsable(self)
rangeTimer = TOOLTIP_UPDATE_TIME
end
self.newTimer = rangeTimer
end
end)
[свернуть]

16. Показывает PvP-тринкеты членов группы:
Party Trinkets
PHP код:
local trinkets = {}
local events = CreateFrame("Frame")
local partyFrame, trinket
for i = 1, MAX_PARTY_MEMBERS do
partyFrame = "PartyMemberFrame"..i
trinket = CreateFrame("Cooldown", partyFrame.."Trinket")
trinket:SetPoint("TOPRIGHT", partyFrame, 30, -6)
trinket:SetSize(24, 24)
trinket.icon = trinket:CreateTexture(nil, "BACKGROUND")
trinket.icon:SetAllPoints()
trinket.icon:SetTexture("Interface\\Icons\\inv_jewelry_trinketpvp_02")
trinket:Hide()
trinkets["party"..i] = trinket
end
function events:UNIT_SPELLCAST_SUCCEEDED(unitID, spell, rank, lineID, spellID)
if not trinkets[unitID] then
return
end
if spellID == 59752 or spellID == 42292 then
CooldownFrame_SetTimer(trinkets[unitID], GetTime(), 120, 1)
elseif spellID == 7744 then
CooldownFrame_SetTimer(trinkets[unitID], GetTime(), 45, 1)
end
end
function events:PLAYER_ENTERING_WORLD()
local _, instanceType = IsInInstance()
if instanceType == "arena" then
self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
elseif instanceType == "none" then
self:RegisterEvent("UNIT_SPELLCAST_SUCCEEDED")
elseif self:IsEventRegistered("UNIT_SPELLCAST_SUCCEEDED") then
self:UnregisterEvent("UNIT_SPELLCAST_SUCCEEDED")
for _, trinket in pairs(trinkets) do
trinket:SetCooldown(0, 0)
trinket:Hide()
end end
end
events:SetScript("OnEvent", function(self, event, ...) return self[event](self, ...) end)
events:RegisterEvent("PLAYER_ENTERING_WORLD")
[свернуть]
Полный архив скриптов, которые использовал Neilyo можно скачать тут http://www.mediafire.com/download/cd...8/FullPack.rar
Скрипты помогут Вам уменьшить нагрузку на компьютер, обеспечить наилучшее быстродействие ui и принести много хороших эмоций от создания своими руками аддонов для нашей с Вами любимой игры - World of Warcraft !
Если у вас всё в порядке с английским языком, то вы можете прочитать в большем объёме основы создания аддонов по ссылке:
http://www.arenajunkies.com/topic/22...lt-ui-scripts/
Если вы были хотя бы чуть-чуть знакомы с программированием в IDE средах, таких как Visual Studio
- то Вам непременно понравится AddOn Studio for World of Warcraft
Скачать её можно на сайте https://addonstudio.codeplex.com нажав кнопку Download
Для тех, кто захочет большего - рекомендую для посещения ресурс http://www.**************/forums/world-of-warcraft/