OmniCC в 3 макроса и прочие штуки
Автор | Сообщение |
---|---|
|
0
Fernir писал(а): Упростил насколько мог и спрессовал OmniCC в 3 макроса. Еще не тестил, макросы надо запускать по очереди (каждый раз после входа в игру) Код: /run qft=function(s) if s<3600 and s>=60 then return format("%dm",floor(s/60+1)) elseif s<1 then return format("%.1f",s) elseif s<60 then return floor(s+1) else return format("%dh",floor(s/3600+1)) end end /run ou="OnUpdate" sc="SetCooldown" gh=GameFontHighlight ab=ActionButton1Cooldown fna=function(s,elapsed) s.r=s.et-GetTime() if s.r>0 and s.t:IsShown() then s.t:SetText(qft(s.r)) else s.t:SetText("") s.t:Hide() s:SetScript(ou,nil) end end /run hooksecurefunc(getmetatable(ab).__index,sc,function(s,st,d) if st>0 then s.et=st+d s.t=s.t or s:CreateFontString(nil,"OVERLAY",gh) s.t:SetPoint("BOTTOM",0,2) s:SetScript(ou,fna) s.t:Show() elseif s.t then s.t:Hide() s:SetScript(ou,nil) end end) я конечно могу ошибаться. первая строка всего лишь преобразование секунд в минуты, красиво но не жизненно необходимо а вот переменная ab=ActionButton1Cooldown разве это не определение первой кнопки ? и весь этот скрипт будет обрабатывать кд только для 1й кнопки. для ликвидации данного скрипта можно использовать команду /script ReloadUI() |
21 дек 2011, 21:02 |
|
|
0
дома потестил - оказалось что не все так просто, с 4.3 патча изменили систему интерфейса кд, так что в три макроса точно не получится (нужны хуки) - попробую все же дальше.
Hexus, от ActionButton1Cooldown берется хук на метод "SetCooldown" для всех фреймов |
21 дек 2011, 21:04 |
|
|
0
может лучше пробовать так ab=ActionButton1.Cooldown раз уж это метод
|
21 дек 2011, 21:13 |
|
|
0
ActionButton1Cooldown это именно обьект фрейма, а то что ты написал - такого нет, это похоже на какой-то метод, но его не существует на самом деле. вот ActionButton1Cooldown.SetCooldown - этот метод существует. Посмотри
|
22 дек 2011, 06:22 |
|
|
0
Я немного недопонял определение области видимости переменных для так называемых "chunk" луа кода. Из того, что читал в офф мануале я так понял, что каждый "chunk" кода является анонимной функцией и имеет свою область видимости переменных. Но как эти "chunk" разделяются? Оператором ";"? А весь мой аддон является одним большим "chunk" кода, если только в нем не встречаются ";"? Вообще какой смысл использования ";"? Когда-то читал, что если ты вводишь весь свой код одной строкой без переносов строки (энтеров), то там, где по логике должен стоять энтер (типа выполнение какого-то следующего действия), то там нужно ставить ";", но на практике все работает и без них. Ну и при запуске кода через /run, каждый новый /run это отдельный "chunk" имеющий свою область видимости переменных, и если в одном /run у тебя local zxc = 1, то в следующем /run она уже не существует. Или ";" вообще что-то левое и устаревшее, а разделение кода на "chunk" происходит при запуске функций аналогичных dofile (ну а /run это ее близовский аналог). Пока писал ^, понял, что надо просто пойти почитать еще раз офф мануал, но все-же оставлю это здесь. |
22 дек 2011, 10:54 |
|
|
0
Правильней конечно же разделять через ";"
Если объявить local param - оно видно только для следующего после обьявления кода, а если просто param - уже глобальная переменная, и она должна быть видна в других участках кода, включая процедуры (если что-то ее по дороге не переопределит) /run /script - обычный RunScript |
22 дек 2011, 11:17 |
|
|
0
Угу, а все глобальные переменные хранятся в таблице _G, из чего следует забавный способ самоубийства интерфейса, прописать _G = nil
А для того, что-бы не захламлять среду глобальных переменных в начале аддона не плохо делать что-то в таком роде: MyAddonName = {} setmetatable(MyAddonName, {__index = _G}) setfenv(1, MyAddonName) Таким образом, внутри нашего аддона нам будут доступны все стандартные функции (как метаметоды из метаталлицы _G), и в то-же время, если мы объявляем глобальную переменную, то она в таблице _G окажется вложенной внутри таблицы с названием нашего аддона, то есть единственное что мы "выставляем" в общую _G это переменную с именем аддона. |
22 дек 2011, 18:41 |
|
|
0
Фернир,если свободное времичко будет,на триню по арена фреймам подскажи
|
22 дек 2011, 20:57 |
|
|
0
макрос на приоритет отображения анстейбла и вампирика для диспелеров на стандартных рейд фреймах
Код: /run local d,o={[30108]=1,[87100]=1},CompactUnitFrame_UtilIsPriorityDebuff CompactUnitFrame_UtilIsPriorityDebuff=function(...) local u,i,f=... if d[select(11,UnitDebuff(u,i,f))]==1 then return true end return o(...) end |
23 дек 2011, 15:59 |
|
|
0
оставлю это тут, не тестировал - 3 макроса (добавление тринкетов к стандартным арена фреймам)
в оригинале их 5 или 6 Код: /run CF=CreateFrame AEF="ArenaEnemyFrame" BRD="BORDER" TTX="Interface\\Icons\\inv_jewelry_trinketpvp_01" USCS="UNIT_SPELLCAST_SUCCEEDED" FR="Frame" CLD="Cooldown" /run MTF=function(i) f=CF(FR,nil,_G[AEF..i]) f:SetPoint("TOPLEFT") f:SetSize(20,20) f.c=CF(CLD,nil,f) f.c:SetAllPoints(f) f.t=f:CreateTexture(nil,BRD) f.t:SetAllPoints() f.t:SetTexture(TTX) f:Hide() f:RegisterEvent(USCS) f.u="arena"..i return f end /run TFU=function(s,e,u,n,r,l,si) if(s.u==u)then if(si==59752 or si==42292)then s:Show() s.c:SetCooldown(GetTime(),120) elseif si==7744 then s:Show() s.c:SetCooldown(GetTime(),45) end end end for i=1,3 do f=MTF(i) f:SetScript("OnEvent",TFU) end |
28 дек 2011, 15:05 |
|
|
0
Не работает на OmniCC. На тринкеты работает? А то, что были на AJ перестали работать (двигал стандартные фреймы скриптами)
|
28 дек 2011, 20:46 |
|
|
0
fuss писал(а): Не работает на OmniCC. На тринкеты работает? А то, что были на AJ перестали работать (двигал стандартные фреймы скриптами) |
29 дек 2011, 11:10 |
|
|
0
Fernir писал(а): fuss писал(а): Не работает на OmniCC. На тринкеты работает? А то, что были на AJ перестали работать (двигал стандартные фреймы скриптами) Я далек от всего этого, но разве отображение спелов\тринкетов и прочего на AJ не по ID было? Но вопрос еще актуален, работает или нет? А то не работает и тот, что скидывали адоном в теме про UI (до патча он точно работал) И еще вопрос, если аренафреймы подвинуть не скриптом (а то у меня периодически, особенно после стелса, начинает с ними херня творится), с адоном MoveAnything, отображение тринкетов так же будет привязано к фрейму, или останутся на месте где стандартно должны быть расположены фреймы? P.S. Надо отдельную прикрепленную тему, в которой будут собраны все скрипты (от тринкетов и фреймов, до простых на скалинг и убирание панелек), но только 100% рабочие и без обсуждения (просто такой себе мини-гайд)) |
29 дек 2011, 19:52 |
|