как использовать скрипты вов
Click-wow.ru
Наверняка многие игроки не раз сталкивались с необходимостью выполнять множество однообразных действий в игре. Давайте подумаем, что можно с этим сделать.
На самом деле разработчики это предусмотрели и добавили в игровой движок возможность избавиться от такого рода работы, для этого нужно использовать скрипты для wow. Проблема в том, что не все игроки знают об этом, в данной статье мне хотелось бы рассказать о наиболее популярных скриптах для wow.
Список скриптов для wow
Первым таким подарком от разработчиков является скрипт, который поможет обменять абсолютно любое количество баджей в один клик. Итак приступим.
Создайте макрос (команда /macro ) и впишите туда следующее (без кавычек):
» /script local function buy (n,q) for i=1,100 do if n==GetMerchantItemInfo(i) then BuyMerchantItem(i,q) end end end buy («Emblem of Heroism»,140) «
В последних скобочках мы вписываем название вашей эмблемки и количество без ошибок, язык эмблемки зависит от того, какой у вас клиент.
2) Сломался рекаунт? Он больше не отображает правильную информацию про ДПС и ХПс? Рекаунт одним словом работает не правильно? Скрипт для ремонта рекаунта ниже.
По схеме описанной выше сделайте новый макрос. Напоминаю, что макросы из общего списка макросов (тавтология во как) можно вытаскивать на панельки, это очень удобно. Пишем без кавычек.
3) Скрипт на добавление игроков в гильдию. Не нужно им злоупотреблять.
» /script n=GetNumWhoResults(); i=1; while(i «
4) Существует необходимость линкануть предмет в макрос?
5) Скрипт на выход из группы
6) Полная перезагрузка интерфейса без релога
7) Скрипт для отдаления камеры от персонажа или его ездового (летающего) животного.
» /console cameraDistanceMaxFactor 3.4 «
Оговорюсь, но его нужно использовать вновь после релога или входа в игру.
8) Скрипт для отмены дуэли вов:
9) На пиратках часто бывает так, после того, как вы стали призраком, подбегаете к телу а реснуться нельзя, этот скрипт должен помочь.
11) Не редко может помочь хилу на арене. Берем напарника в таргет.
» /target «имя» (без кавычек)
12) Выбор цели цели.
Так же макросы могут помочь и в управлении петами ваших персонажей.
13) Наиболее популярные команды для петов.
а) Ваш пет атакует ваш таргет.
б) Пет просто бегает за вами.
в) Ваш пет застынет на месте и не будет ничего делать
г) Бывают ситуации, когда панель управления питомцем пропадает, в частности я сталкивался с этим во время игры за своего варлока и ДК. Исправить это можно скриптом ниже.
14) А этот скрипт автоматически изучает все недостающие спеллы у тренера.
/ run LoadAddOn»Blizzard_TrainerUI» f=ClassTrainerTrainButton f.e = 0 if f:GetScript»OnUpdate» then f:SetScript(«OnUpdate», nil)else f:SetScript(«OnUpdate», function(f,e) f.e=f.e+e if f.e>.01 then f.e=0 f:Click() end end)end
15) Довольно-таки забавный макрос, часто им пользовался. Если у вас есть множество маунтов и хочется внести в игру разнообразие вписываем в начале макроса команду, а затем перечисляем маунтов (заклинаний, вещей). Теперь вы тоже знаете макрос на вызов случайного маунта.
16) Макрос Спешиваться.
17) Кастует спелл, указанный в макросе. Например:
/target SolBadGuy
/castsequence reset=5 Молитва духа, Молитва стойкости, Молитва защита от темной магии.
19) Возвращаем себе первоначальный облик. Неважно кто вы дру, шп, вар или еще кто-нибудь.
World of Warcraft: одна строка кода, чтобы потерять все
Интерфейс WoW (например, строка меню, окно чата и другие 2D графические элементы) и также дополнения написаны на языке Lua. Обе стороны строки — RemoveExtraSpaces и также RunScript — легальные функции и часть WoW Lua API. Но введение этой строки кода в диалоговом окне изменяет поведение интерфейса WoW.
Что делает эта команда на самом деле?
/run — команда для интерпретации следующего текста как сценария Lua.
RemoveExtraSpaces — встроенная функция, которая удаляет ненужные пробелы из текста.
RunScript — функция, которая выполняет текст в качестве кода Lua (аналогично команде /run )
Чем это опасно?
Неосторожный игрок вводит в своем диалоговом окне вредоносную строку кода, потому что его убедили слова нападавшего. Но вместо того, чтобы получить редкие предметы, он становится жертвой.
Ничего не подозревающий игрок собирается отправить вредоносную строку кода
Злоумышленник отправляет сообщение в чате жертве
Полученное сообщение интерпретируется как Lua код и затем выполняется
То, что было показано выше, является довольно безвредным примером этой уязвимости, доказательства концепции. Но на самом деле — это означает, что злоумышленник теперь может удаленно контролировать интерфейс жертвы. Это очень похоже на поведение троянов, которые изображают из себя что-то полезное и затем выполняют свою вредоносную функцию. В реальном случае, вместо того, чтобы создавать сообщения с текстом «Test», злоумышленники запускает другой сценарий, пример которого будет приведен ниже.
Временное скрытие и сохранение команды
После того как жертва открыла бэкдор в свой интерфейс, злоумышленник отправляет следующее сообщение:
Атакующий устанавливает новый канал передачи данных
В случае, если команда была выполнена, сообщение, которое показано выше, не будет видно жертве, но будет выполнено немедленно. Тот факт, что функция чата больше не работает может показаться подозрительным и жертва, возможно, попробует перезапустить игру. Злоумышленник действует достаточно быстро, чтобы решить эту проблему. Отправив команду, показанную выше, которая устанавливает новый канал связи, они снова восстанавливают нормальную работу чата не вызывая подозрений.
Для того, чтобы понять цель этой команды, нужно знать что в WoW есть возможность общаться с помощью скрытого канала (локально и удаленно). Этот канал установлен через использование событий “CHAT_MSG_ADDON”.
Сценарий создает фрейм (строка 2), к которому можно установить различные свойства. Сценарий регистрирует события CHAT_MSG_ADDON с конкретным префиксом (строка 6 и 25). Только тот, кто знает выбранный префикс, может тайно управлять интерфейсом жертвы. Это все равно что пароль для бэкдор.
Каждый раз, когда угнанный интерфейс получает CHAT_MSG_ADDON, событие с секретным префиксом, код будет выполняться тихо и без ведома жертвы.
Вывод: пока злоумышленник не решит Вам показать, что происходит, Вы, к сожалению, про это не узнаете.
Даже при том, что речь идет о дополнениях, которые могут связаться через скрытый канал, у жертвы не обязательно должны быть установлены дополнения, чтобы атаки прошла успешно.
Какой вред может быть причинен?
В виду того, что злоумышленник будет иметь полный доступ к интерфейсу жертвы, он может собрать полную информацию про него. Но взломщик не сможет собрать какую-либо подробную информацию о других игроках. В WoW игроки имеют возможность делится/продавать предметы друг другу. Если злоумышленник знает местонахождение персонажа жертвы и находится в пределах досягаемости, он может удаленно открыть окно торговли и передать себе золото, предметы и все, что можно передать. Практически ограбить жертву.
Описанный сценарий демонстрирует социальную атаку на ряду с технической. Теперь хакер может с помощью жертвы отправлять убедительные сообщение ее друзьям, коллегам и другим игрокам, с которыми тесно общается персонаж, тем самым увеличивая количество захваченных персонажей.
Как можно себя защитить?
Ответ простой и очевидный: не нужно вводить такого рода команду или любую другую, которая будет предложена даже Вам давнишним другом.
В данном примере мы говорили об атакующем персонаже в игре, кто принадлежал к популярной гильдии. Но по факту он не принадлежал к этой гильдии. Он выбрал известную гильдию и скопировал имя, заменив “L” на “I”. Возможно, Вы уже знакомы с такими методом фишинг-атак.
Кроме того, будьте осторожны при загрузке дополнений используйте защищенные и популярные веб-сайты, сохраните свои дополнения, чтобы их можно было в любой момент заменить. Возможно, что некоторые из этих обновлений могут уже содержать вредоносный код. Подобная проблема была замечена в 2014, когда так называемый “ElvUI Backdoor” был обнаружен в одном из дополнений.
Сам глюк может быть исправлено только Blizzard. Они должны убедиться, что перезапись такой функции будет невозможен в дальнейшем. Blizzard уже выпустили предварительный релиз для предстоящего дополнения «Legion». В данном дополнении они учли обсуждаемый тут сценарий и добавили предупреждение перед отправкой сообщения, которое содержит вредоносный характер.
Выбор “Yes” отключает сообщение навсегда, даже перезапуск не вернет его – по этой причине вопрос нельзя считать решенным. Чтобы повторно активировать данное сообщение, нужно вручную удалить одну строку кода в конфиг-файле.
Тема: Макросы/скрипты для WoW
Опции темы
Отображение
Отмена очереди заклинаний (Добавлено в 4.1)
Начиная с катаклизма, в wow внедрена система, которая компенсирует задержку между применением заклинаний. Предположим, GCD 1,5 сек. Если заспамить заклинание за 0,1-0,5 сек до его отката, то оно будет произноситься автоматически после завершения первого. Следующий макрос отменяет автоприменение при спаме, либо высокой задержке.
Перезагрузка интерфейса. Из игры не выходит. Во время перезагрузки вы находитесь в игровом мире!
Включает режим «Отошел от клавиатуры» — все люди, вам написавшие, будут уведомлены об этом соответствующей фразой. Например: /afk Ушел курить.
У макроса снизу принцип работы тот же, только включает режим «Не беспокоить».
Если у вас пропала панелька умений для питомцев, то этот скрипт для вас. Охотникам этот скрипт не подходит, только Чернокнижники и Рыцари Смерти (актуально для FUN реалма):
Макрос на автоматическое изучение профессий/обучение у тренера.
Для отмены /reload, перезайти или повторно ввести макрос:
Макрос на подтверждение сбора добычи/покупки (Нажатие кнопки «Да»). Тут аддон для автоматического принятия лута.
Использование предметов и аксессуаров.
Рисунок
Макросы на воскрешение.
Достает дух из тела, если кнопка «Покинуть тело» не активна (Выручает в 99% случаев).
Берет в цель юнит с точно указанным именем. Если имя написано неверно или юнит далеко от вас, то ваша цель не изменится.
Макрос на смену комплекта экипировки.
Манипуляции с панелями заклинаний
Существует две команды, которые позволяют изменять страницы панелей заклинаний: /changeactionbar и /swapactionbar. /changeactionbar использует в качестве значения одно число и всегда переключается на страницу с этим номером. Примером использования может быть аспекты охотника. Например:
Другое
Включает звуковые + текстовые сообщения об ошибках.
Макрос для удаления вещей белого качества.
Макрос для удаления вещей зеленого качества. Принцип такой же, что и у макроса выше.
Макрос на удаление определенных вещей. Удаляет из сумок определенный предмет.
Макрос для покупки реагентов и прочего. Как работает?! Подходим к нужному вендору, открываем страницу, где находится нужная покупка и активируем макрос. В кавычках вводить можно любой итем: Первобытный дух, Фолиант ясного разума и т.д., затем сразу же количество, в нашем случае это 10.
Отключение слежения за персонажем на которого направлено ваше потоковое заклинание:
На простом примере. Используем Исповедь, а затем Кара во время произнесения потокового заклинания. Макрос не позволяет произносить Кара, пока полностью не закончится каст Исповедь.
Выключаются все аддоны + перегружает UI (Пользовательский Интерфейс):
Перезагружает полностью все аддоны.
Макрос позволяет выйти с команды 2х2\3х3\5х5,если не получается выйти привычным способом. В основном такая проблема возникает при смене ника.
Отмена квестов из журнала.
По 1 квесту, начиная сверху:
Для охоты на рарников. Если в таргете появится нужный рарник, оповестит в пм любого игрока или даже Вас самих, саундтреком и красным текстом по середине экрана. (Можно вводить названия рарника вручную, текст сообщения пм, либо вообще его убрать.) Если в таргете нет рарника, которого ищете макросом, оповещать не будет.
*click*
Инструкция F.A.Q.
## Title: Script
## Interface: 60000
Более-менее разобравшиеся в кодах lua задаются вопросом, откуда брать код самой текстуры (например, чтобы скрыть какой-то объект в игре).
Ответ: используем макрос /fstack.
Важно : можно вставить в любой имеющийся аддон, например, Bartender4. В самом конце, между имеющимся кодом и тем, что собираемся добавить, должна быть пустая разделяющая строка.
Автоматическая отправка письма в чат. (работало на WoD, сейчас не знаю)
Каналы
Далее, просто добавляем коды в первоначально созданный аддон.
Удаление циферок со стандартных фреймов (лечение/урон):
P.S Немного побольше о функции макроса /click и /fstack
Команда /fstack открывает доступ к наименованиям панелей API интерфейса. В сочетании с /click можно добиться возможностей, о которых до этого момента могли только задумываться или искали особый аддон.
Это работает не так, как функции /run или /script, хотя в целом они практически взаимозаменяемы.
Например, чтобы отменить какой-то квест, нужно ввести /script SetAbandonQuest(); AbandonQuest(); — в этом случае отменится выбранный квест. Во втором варианте это выглядит так: /click QuestLogFrameAbandonButton /click StaticPopup1Button1. Итог будет одинаковым. Но вариант с квестами слишком заурядный и бесполезный, ведь можно нажать 3 кнопки самостоятельно и убрать кв без особых усилий. Есть фишки покруче, например в связке с другими макросами или даже скиллами на панелях. Допустим, у Вас есть макрос, но он полностью не вписывается в ограничение 255 символов (согласен, можно поставить аддон на макросы), мы сделаем еще один макрос, который дополнит предыдущий и прожмется вместе с ним, используя команду в нем /click. В зависимости от установленных аддонов строка может отличаться. Если стоит Bartender4, то выглядеть будет примерно так: /click BT4Button1, что нажмет клавишу 1. Можно использовать в рыбалке для очистки хлама, при закидывании удочки. Но не стоит этим ограничиваться, это один из самый простых способов использования возможностей данной команды.
В итоге, выставив Первый макрос на клавишу 1, второй на 2 и третий 3 мы нажимаем только одну кнопку 1, попутно открывая коробки и моллюсков, а также удаляя ненужные вещи (да-да, луциана даже вендору лень продавать).
Как использовать скрипты вов
В последнее время стали часто спрашивать, что за аддоны использует легендарный разбойник Neilyo.
Я решил приоткрыть завесу таинственности и выложить те скрипты, которые он использует.
Чтобы лучше разбираться в происходящем, рекомендую скачать программу notepad++ http://notepad-plus-plus.org/.
означает, что скрипт работает в MoP.
Blizzard Loss Of Control
f=CreateFrame(«Frame») f:RegisterEvent(«LOSS_OF_CONTROL_ADDED») f:RegisterEvent(«LOSS_OF_CONTROL_UPDATE»)
f:SetScript(«OnEvent»,function()for b in pairs(ActionBarActionEventsFrame.frames)do b.cooldown:SetLossOfControlCooldown(0,0)end end)
Как двигать фрейм луз контроля:
Как двигать иконку луз контроля:
Как скрыть темную текстуру у фрейма:
Как скрыть красные полосы сверху и снизу:
Как сделать текст контроля под иконкой:
Как удалить отсчет времени около иконки:
Как сделать запятые в комбат-тексте
Разобрался как поставить запятую, разделяющую большие числа в комбат тексте как на еу клиентах.
Нужно прописать в любом луа файле LARGE_NUMBER_SEPERATOR = «,»
На ру клиентах эта переменная почему-то равна пустой строке.
PvP-тринкеты противников на арене.
Чтобы выбрать позиции арена фреймов, необходимо указать их координаты в строчке под номером 9.
Координаты иконок тринкета и размер указываются в строчках 14 и 15 соответственно.
Для отображения арена фреймов вне арены используется команда /testaef.
Можно использовать эти макросы:
Для выбора масштаба арена фреймов добавьте строчку:
ArenaEnemyFrame1:SetPoint(«CENTER», nil, «CENTER», 209.0, 204.0)
ArenaEnemyFrames:SetScale(1.3)
Скрипт отображает комбат цели и фокуса
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)
Координаты и размер иконки комбата настраиваются в строках:
Иконка класса вместо портрета игрока
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)
Шрифт комбат текста
Для этого необходимо положить файл с нужным вам шрифтом в папку с аддоном и переименовать его в font.
local fontName = «Interface\\AddOns\\NeilyoScript\\font.ttf»
local fontHeight = 40
local fFlags = «»
Enemy Cooldowns
Скрипт, отображающий использованные кулдауны врагов. Этот код я нашел на одном из китайских форумов, где умельцы смогли привести его в рабочее состояние.
Вот как эти скрипты выглядят в моем интерфейсе:http://i.imgur.com/gc8PO.jpg
Прежде всего, вам необходимо выбрать местоположение данных абилок. Для этого в игре введите команду /fstack.
В появившемся окне будут отображаться координаты X Y относительно нижнего левого угла монитора. Координаты по X отличаются на 22 для каждой иконки и по 30 для Y. Координаты указываются здесь:
Если «true» заменить на «false», то при заходе(релоге) не будут высвечиваться все кулдауны.
Как добавлять свои абилки (покажу на примере маговского КСа).
2)В ссылке http://www.wowhead.com/spell=2139 цифры после «=» показывают ID спелла.
3)Нажимаем на иконку КСа, чтобы узнать, как она называется: spell_frost_iceshock
4)Также необходимо знать кулдаун спелла: 24 сек
Теперь все необходимое у нас есть, чтобы добавить в скрипт. Ниже показана добавленная строчка к маговским абилкам.
Жирным выделены изменения, произведенные в новой строке.
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\\spell_frost_iceshock«;t59=CF(F);TrS(t59,306,500,»cd59«,t59p,22,true);t59:SetScript(OE,function(self,event. ) Ts(t59,cd59,select(1. ),select(5. ),2139,24) end);
Можно назначить условия, когда будут отображаться необходимые кулдауны. Для этого в строчке 85:
необходимо добавить нужные аргументы, например:
чтобы отображать кулдауны ваших сопартийцев.
В игре необходимо сделать макрос:
С помощью него очищаются кулдауны после каждой арены или баттлграунда.
Значение «58» верно только для этого скрипта(для 58 спеллов), но при добавлении своих абилок его необходимо увеличивать.
Еще несколько полезных скриптов.
/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
/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
/run px,py=GetPlayerMapPosition(«player»); DEFAULT_CHAT_FRAME:AddMessage(format(«You are at: %s (%0.1f, %0.1f)»,GetZoneText(),px*100,py*100));
— Class colors in target name background
local frame = CreateFrame(«FRAME»)
frame:RegisterEvent(«PLAYER_ENTERING_WORLD»)
frame:RegisterEvent(«PARTY_MEMBERS_CHANGED»)
frame:RegisterEvent(«PLAYER_TARGET_CHANGED»)
frame:RegisterEvent(«PLAYER_FOCUS_CHANGED»)
frame:RegisterEvent(«UNIT_FACTION»)
if (event == «UNIT_FACTION» and unitid
= «focus») then return end
if UnitIsPlayer(«target») then
_,/> c = RAID_CLASS_COLORS[class]
TargetFrameNameBackground:SetVertexColor(c.r, c.g, c.b )
end
if UnitIsPlayer(«focus») then
_,/> c = RAID_CLASS_COLORS[class]
FocusFrameNameBackground:SetVertexColor(c.r, c.g, c.b )
end
end
— Class colors in focus name background
local frame = CreateFrame(«FRAME»)
frame:RegisterEvent(«PLAYER_ENTERING_WORLD»)
frame:RegisterEvent(«PARTY_MEMBERS_CHANGED»)
frame:RegisterEvent(«PLAYER_FOCUS_CHANGED»)
frame:RegisterEvent(«UNIT_FACTION»)
if (event == «UNIT_FACTION» and unitid
= «focus») then return end
if UnitIsPlayer(«focus») then
_,/> c = RAID_CLASS_COLORS[class]
FocusFrameNameBackground:SetVertexColor(c.r, c.g, c.b)
end
end
frame:SetScript(«OnEvent», eventHandler)
— Brighter targetname and focusname textures (fix)
for _, BarTextures in pairs(
do
BarTextures:SetTexture(«Interface\\TargetingFrame\\UI-StatusBar»)
end
—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)
etc
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
— 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)
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
_,/> 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)
—Scripts by Firebug—
cs = actionbar cooldown text size
ps = player/focus/target/raid cooldown text size(disable if ps is 1)
ctp = actionbar cooldown position(DEFAULT : CENTER)
ptp = player cooldown position(DEFAULT : BOTTOMRIGHT)
ct = font
— text position list
CETNER / RIGHT / LEFT
TOP / TOPRIGHT / TOPLEFT
BOTTOM / BOTTOMRIGHT / BOTTOMLEFT
— show cooldown text until 1 sec
— disable to show 0.x sec with enabling red text
— DEATH KNIGHT RUNE COOLDOWN DISABLE
instead of macro 6, use this two macro
/run function gct(f)if not cDB[f]then local c=gict(f)c:SetSize(c.s*crt,c.s*crt)sf(c,1)cDB[f]=c;end return cDB[f]end
/run function cvf(f,s,d)if(string.find(f:GetName(),»Rune»)
= nil)then return end local c=gct(f)if(s and d)then c.b=s;c.d=d;if(s>0 and d>1.5)then c.c=0;c.r=d-(GetTime()-s);suc(c)else rt(c)end end end
/run function rt(f)f.e=nil f.t:SetText(«»)f:SetScript(co,nil)end function sf(f,v)f.t:SetFont(ct,f.s*v,ol)end function acv(b)local x=b.cooldown x.a=b.action action[x]=x end function scv(p,f,po,s)if(s>1)then f.t:SetPoint(po,p)end f.s=s;end
/run function sr(f,e)if(e>60)then sf(f,0.7)if(f.s==cs)then return»%d:%02d»,e,e else return»%dm»,e+60,e end elseif(e>=cp)then sf(f,1)f.t:SetTextColor(1,1,0,1)return»%d»,e elseif(e>0)then sf(f,0.9)f.t:SetTextColor(1,0,0,1)return»%.1f»,e else return end end
/run function suc(f)if not f.e then f.e=1;f:SetScript(co,function(s,e)f.c=f.c+e;local fo,v1,v2=sr(f,f.r-f.c)if not fo then rt(f)elseif not v2 then f.t:SetFormattedText(fo,v1)else f.t:SetTextColor(1,1,1,1)f.t:SetFormattedText(fo,v1/60,v2%60)end end)end end
/run function scs(p,f)if(p:GetSize() 0 and d>1.5)then c.c=0;c.r=d-(GetTime()-s);suc(c)else rt(c)end end end
/run function cvc(DB)for c in pairs(DB)do if c.a then local s,d=gac(c.a)cvf(c,s,d)end end end function pcv(_,e)if e==cau then cvc(action)else cvc(cDB)end end for _,b in pairs(ActionBarButtonEventsFrame.frames)do acv(b)end
ic = icon size
xp = x position of interrupt bar
yp = y positon of interrupt bar
n = x icons per line
fl=0 : Enable in world
fl=1 : Enable only in Arena]]—
—[[
* use this line when use macro *
/run fl=0;ic=40;xp=-500;yp=320;n=6;sfc=CooldownFrame_SetTimer;crf=CreateFrame;ce=math.ceil;ih=IsInInstance;gsi=GetSpellInfo;up=UIParent pe=»PLAYER_ENTERING_WORLD»cdf=»Cooldown»
/run function cf(i,s,x,y)local _,_,t=gsi(s)local f=crf(«Frame»,nil,up)f:SetPoint(«CENTER»,x,y)f:SetSize(ic,ic)f.t = f:CreateTexture(nil,»BORDER»)f.t:SetAllPoints(true)f.t:SetTexture(t)f.c=CreateFrame(cdf,nil,f)f.c:SetAllPoints(f)return f;end
/run function ud(f,ls,lc)f:SetScript(«OnEvent»,function(_,_,_,e,_,_,_,b,_,_,_,_,_,s)if((bit.band(b,0x40) == 0x40)and e==»SPELL_CAST_SUCCESS»and s==ls)then sfc(f.c,GetTime(),lc,1)end end)f:RegisterEvent(«COMBAT_LOG_EVENT_UNFILTERED»)end
/run for i,s in ipairs(li)do _G[«ib»..i] = cf(i,s,xp+(ic+5)*ce((i-1)%n),yp-(ic+5)*ce(i/n))ud(_G[«ib»..i],s,cd[i])end
/run ik=crf(«Frame»)ik:SetScript(«OnEvent»,function()local _,t=ih()for i,s in ipairs(li)do local f=_G[«ib»..i]if(t==»arena»or fl==0)then f:Show()f.c:Show()else f:Hide()f.c:Hide()end end end)ik:RegisterEvent(pe)
bl = icon list
bs = icon size
xb = x positon of buff Tracker
yb = y positon of buff Tracker
br = x buffs per line
/run bs=30;xb=-360;yb=-140;br=6;bdr=»BORDER»be=»UNIT_AURA»cbf=CreateFrame;gi=GetSpellInfo;bm=math.ceil;fm=math.floor;st=STANDARD_TEXT_FONT;function cu(s) return UnitBuff(«player»,gi(s))end
/run function Cb(i,s)local _,_,t3=gi(s)local f=cbf(«Frame»)f:SetSize(bs,bs)f.t=f:CreateTexture(nil,bdr)f.t:SetAllPoints(true)f.t:SetTexture(t3)f.f=f:CreateFontString(nil,bdr)f.f:SetFont(st,12,»OUTLINE»)f.f:SetPoint(«BOTTOMRIGHT»,0,0)return f;end
/run function vb(s,i,row)local b1,_,_,b4=cu(s)local f=_G[«B»..i]if b1 then f:Show()f:SetPoint(«CENTER»,xb+(bs+5)*bm((row-1)%br),yb-(bs+10)*bm(row/br))if(b4>1)then f.f:SetText(b4)end row=row+1;end return row;end
/run function ub()for i,s in ipairs(bl)do local b,_,_,_,_,_,k=cu(s)if b then local vt=fm(k-GetTime())if (vt>=60)then vt=bm(vt/60)_G[«B»..i].c:SetText(vt..»m»)elseif vt >= 0 then _G[«B»..i].c:SetText(vt..»s»)end end end end
/run function Cc(f)f.c=f:CreateFontString(nil,bdr)f.c:SetFont(st,12,»OUTLINE»)f.c:SetPoint(«CENTER»,0,-20)end function db()for i in ipairs(bl)do _G[«B»..i]:Hide()end end
/run for i,s in ipairs(bl)do _G[«B»..i]=Cb(i,s)Cc(_G[«B»..i])_G[«B»..i]:Hide()end function bb()db()local bw=1;for i,s in ipairs(bl)do bw=vb(s,i,bw)end end bk=cbf(«Frame»)bk:SetScript(«OnEvent»,bb)bk:SetScript(«OnUpdate»,ub)bk:RegisterEvent(be)
drx = x position
drs = icon size
— show frame in left of arena enemyframe
and insert in macro 5
/run drx=110;drs=40;dp=»RIGHT»;dre=»COMBAT_LOG_EVENT_UNFILTERED»drp=»PLAYER_ENTERING_WORLD»dra=»ARENA_OPPONENT_UPDATE»LoadAddOn(«Blizzard_ArenaUI»)function gaef(f,n)return _G[«ArenaEnemyFrame»..n..»HealthBar»]end
/run function rDR(f)f.e=1;f.t:SetTexture(nil)f.c:Hide()end function sDR(f)f.e=f.e+1;f.c:Show()end function gDRt(i,j)return _G[«drc»..i..»:»..j]end function runDR(f,n)CooldownFrame_SetTimer(f.c,GetTime(),18,1)eDR(f,n)sDR(f)oDR(n)end
—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)
—Scripts from IboUI—
hooksecurefunc(«ActionButton_UpdateUsable»,function(self)
local icon = _G[self:GetName()..»Icon»]
local valid = IsActionInRange(self.action)
if ( valid == false ) then
icon:SetVertexColor(1.0, 0.1, 0.1)
end
end)
hooksecurefunc(«ActionButton_OnUpdate»,function(self, elapsed)
local rangeTimer = self.newTimer
if ( rangeTimer
ActionButton_UpdateUsable(self)
rangeTimer = TOOLTIP_UPDATE_TIME
end
self.newTimer = rangeTimer
end
end)
Внутренний кулдаун тринек.
You only need to change 3 things: inv_potion_85, 109721 and 30(cooldown).
Check out the list below.
Vial of Shadows inv_potion_85
Cunning of the Cruel inv_misc_coin_09
Bone-Link Fetish inv_misc_coin_12
Insignia of the Corrupted Mind inv_bijou_purple
Creche of the Final Dragon creatureportrait_twilightshammer_dragonegg_01
Starcatcher Compass inv_relics_sundial
Seal of the Seven Signs inv_relics_runestone
use this Macro to drag the icon:
/run local f=t; f:SetMovable(true); f:EnableMouse(true); f:SetUserPlaced(true); f:SetScript(«OnMouseDown», f.StartMoving); f:SetScript(«OnMouseUp», f.StopMovingOrSizing);
http://www.arenajunkies.com/topic/11575-post-your-ui/page__st__2880#entry3773919
Party Cooldowns
Аддон PartyCooldowns отображает кулдауны игроков, находящихся в вашей группе. Все настраивается самостоятельно, настройки аналогичны EnemyCooldowns(вы выбираете спеллы, координаты и т.п.).
Значения t не меняйте, так и начинайте с t100. Например, если будет 20 пати абилок, то значения переименовывайте в t100 по t120.
func1(t100,640,560,»cd100«,t101p,22,true);t100:SetScript(E,function(self,event. ) func2(t100,cd100,select(1. ),select(5. ),51713,60) end);
Соответственно макрос будет выглядеть так:
t101p=»Interface\\Icons\\spell_shadow_psychicscream»;t101=CFrame(Frame);func1(t101,549,650,»cd101″,t101p,22,true);
t101:SetScript(E,function(self,event. ) func2(t101,cd101,select(1. ),select(5. ),8122,30) end);
t102p=»Interface\\Icons\\spell_shadow_shadowfiend»;t102=CFrame(Frame);func1(t102,571,650,»cd102″,t102p,22,true);
t102:SetScript(E,function(self,event. ) func2(t102,cd102,select(1. ),select(5. ),34433,300) end);
t103p=»Interface\\Icons\\ability_golemstormbolt»;t103=CFrame(Frame);func1(t103,593,650,»cd103″,t103p,22,true);
t103:SetScript(E,function(self,event. ) func2(t103,cd103,select(1. ),select(5. ),19503,30) end);
t104p=»Interface\\Icons\\ability_hunter_aspectofthemonkey»;t104=CFrame(Frame);func1(t104,615,650,»cd104″,t104p,22,true);
t104:SetScript(E,function(self,event. ) func2(t104,cd104,select(1. ),select(5. ),90337,60) end);
t105p=»Interface\\Icons\\ability_theblackarrow»;t105=CFrame(Frame);func1(t105,637,650,»cd105″,t105p,22,true);
t105:SetScript(E,function(self,event. ) func2(t105,cd105,select(1. ),select(5. ),34490,20) end);
t106p=»Interface\\Icons\\spell_shadow_mindsteal»;t106=CFrame(Frame);func1(t106,659,650,»cd106″,t106p,22,true);
t106:SetScript(E,function(self,event. ) func2(t106,cd106,select(1. ),select(5. ),2094,120) end);
Class Colored Party Frames
Default Gladius
Сборка скриптов, включающая дефолтные арена фреймы, тринки, диминишинги, анонсы.
Improved Hamstring Tracker
Показывает внутренний кулдаун Улучшенного подрезания сухожилий.
Party Trinkets
Показывает PvP-тринкеты членов группы.
Recuperate/SnD Tracker
Русифицированная версия аддона SafeQueue
Благодаря пользователю портала Отрицание удалось локализовать аддон для русского клиента WoW.
По моей просьбе он сделал две версии аддона. В light-версии вырезаны все настройки и есть только самое
необходимое (скрытие кнопки «Leave Queue» и таймер очереди). Обсуждение можно найти в этой теме.
Выбор позиции всплывающего комбат текста.
PlayerFrame tweaks
Прозрачный бэкграунд у таргета и фокуса
hooksecurefunc(‘TargetFrame_CheckFaction’, function(self)
if ( not UnitPlayerControlled(self.unit)
and UnitIsTapped(self.unit)
and not UnitIsTappedByPlayer(self.unit)
and not UnitIsTappedByAllThreatList(self.unit) ) then
self.nameBackground:SetVertexColor(0.0, 0.0, 0.0, 0.5);
if ( self.portrait ) then
self.portrait:SetVertexColor(0.5, 0.5, 0.5);
end
else
self.nameBackground:SetVertexColor(0.0, 0.0, 0.0, 0.5);
if ( self.portrait ) then
self.portrait:SetVertexColor(1.0, 1.0, 1.0);
end
end
end)
текстуру меняем в SetStatusBarTexture
(название штуки можно узнать командой /fstack)
в данном случае это минимапа, список задач, чат
идея: заменяем ф-цию создания окна своей, в ней
добавляем темплейт SecureHandlerShowHideTemplate и потом используем
кондишн драйвер. в нем можно использовать не только [combat], но и
многие другие условия макросов, такие как [target=focus,exists] и прочее
local mcf, fth = CreateFrame, <'MinimapCluster', 'WatchFrame', 'ChatFrame1'>
CreateFrame
= function(f,n,p,t) for _,v in pairs(fth) do t = (n == v) and
t..’,SecureHandlerShowHideTemplate’ or t end return mcf(f,n,p,t) end
for _,v in pairs(fth) do RegisterStateDriver(_G[v],’visibility’,'[combat]hide;show’) end
UnitSelectionColor = function(unit)
if not UnitExists(unit) then return 1,1,1,1 end
local ocolor = <0, 0, 0, 1>
local eventframe=CreateFrame(«Frame»)
eventframe:RegisterEvent(«ADDON_LOADED»)
eventframe:RegisterEvent(«PLAYER_ENTERING_WORLD»)
eventframe:SetScript(«OnEvent», function(self, event, addon)
for _, obj in ipairs(
if (obj and (obj:GetObjectType() == «Frame» or obj:GetObjectType() == «Button»)) then
for _, tex in ipairs(
if (tex and tex:GetObjectType() == «Texture») then
if tex:GetTexture() == «Interface\\Minimap\\MiniMap-TrackingBorder» then
tex:SetDesaturated(true)
tex:SetVertexColor(unpack(ocolor))
end
end
end
end
end
for i,v in pairs( <
PlayerFrameTexture,
TargetFrameTextureFrameTexture,
PetFrameTexture,
PartyMemberFrame1Texture,
PartyMemberFrame2Texture,
PartyMemberFrame3Texture,
PartyMemberFrame4Texture,
PartyMemberFrame1PetFrameTexture,
PartyMemberFrame2PetFrameTexture,
PartyMemberFrame3PetFrameTexture,
PartyMemberFrame4PetFrameTexture,
FocusFrameTextureFrameTexture,
TargetFrameToTTextureFrameTexture,
FocusFrameToTTextureFrameTexture,
MinimapBackdrop,
MinimapBorder,
MiniMapMailBorder,
MiniMapTrackingButtonBorder,
MinimapBorderTop,
MinimapZoneTextButton,
MiniMapWorldMapButton,
MiniMapWorldMapButton,
MiniMapWorldIcon,
MinimapZoomIn:GetRegions(),
MinimapZoomOut:GetRegions(),
MiniMapWorldMapButton:GetRegions(),
MiniMapBattlefieldBorder,
MiniMapLFGFrameBorder,
CastingBarFrameBorder,
FocusFrameSpellBarBorder,
TargetFrameSpellBarBorder,
StanceBarLeft,
StanceBarRight,
StanceBarMiddle,
— Other
select(2, CastingBarFrame:GetRegions()),
select(2, MirrorTimer1:GetRegions()),
BonusActionBarFrameTexture0,
BonusActionBarFrameTexture1,
BonusActionBarFrameTexture2,
BonusActionBarFrameTexture3,
BonusActionBarFrameTexture4,
MainMenuBarTexture0,
MainMenuBarTexture1,
MainMenuBarTexture2,
MainMenuBarTexture3,
MainMenuMaxLevelBar0,
MainMenuMaxLevelBar1,
MainMenuMaxLevelBar2,
MainMenuMaxLevelBar3,
MainMenuXPBarTextureMid,
MainMenuXPBarTextureLeftCap,
MainMenuXPBarTextureRightCap,
SlidingActionBarTexture0,
SlidingActionBarTexture1,
ShapeshiftBarLeft,
ShapeshiftBarMiddle,
ShapeshiftBarRight,
select(5, ShardBarFrameShard1:GetRegions()),
select(5, ShardBarFrameShard2:GetRegions()),
select(5, ShardBarFrameShard3:GetRegions()),
>) do
if v and v:GetObjectType() == «Texture» then
v:SetDesaturated(true)
v:SetVertexColor(unpack(ocolor))
end
end
for i=1,19 do _G[«MainMenuXPBarDiv»..i]:SetVertexColor(unpack(ocolor)) end
if TimeManagerClockButton then
for i,v in pairs( <
select(1, TimeManagerClockButton:GetRegions()),
select(1, GameTimeFrame:GetRegions()),
>) do
if v and v:GetObjectType() == «Texture» then
v:SetDesaturated(true)
v:SetVertexColor(unpack(ocolor))
end
end
end
for i,v in pairs( <
ArenaEnemyFrame1Texture,
ArenaEnemyFrame2Texture,
ArenaEnemyFrame3Texture,
ArenaEnemyFrame4Texture,
ArenaEnemyFrame5Texture,
>) do
v:SetDesaturated(true)
v:SetVertexColor(unpack(ocolor))
end
end)