Jump to content
Luchik

Все, что вы хотели знать о макросах, но боялись спросить

Recommended Posts

Обновлено:

Список подготовленных частей найдете внизу поста. Рекомендуется чтение по порядку

====================

 

Как любителя побегать (делать квесты и ходить в инсты) в несколько окон, меня некоторое время назад заинтересовал вопрос макросов на ванилу. Долгое время бродя по забугорным форумам, описаниям функций АПИ, я вполне разобрался с тем, что на ваниле можно писать в макросах, а что нет (что-то приходится выносить в аддоны, макросом не написать)По просьбе согильдейца решил создать тему и поделиться некоторым приобретенным опытом.Начнем с простого и дойдем до более интересных вопросов.В. Почему у меня не работают мои макросы с БК/ЛК/Каты/Панд?О. Потому что синтаксис написания макросов существенно изменился. Начиная с БК, основным материалом создания макросов являются слэш-команды (/petattack, /stopspellcast) и т.д. На ваниле нет 95% этих слешкоманд, и все макросы, по большей части, начинаются со /script или /run (это команда выполнения блока кода на Lua)В. Получается, что здесь я не могу сделать то, что делали мои макросы на БК/ЛК/Кате/Пандах?О. Чаще всего можете, потому что слешкоманды, по большей части, представляют собой упрощенный доступ к функциям АПИ. Например вместо команды /stopspellcast здесь используется функция SpellStopCasting()В. А что такое АПИ?О. АПИ (API), применительно к ВоВ в частности, это набор функций, с помощью которых можно выполнять определенные игровые действия. На воввики вы найдете полный список доступных вам функций и их описание. Но не все функции можно вызывать через макрос или аддон, в списке присутствует определенное число защищенных методов, которые может вызывать только близовский интерфейс (то есть сама игра)В. Получается, что использование АПИ даст мне больше возможностей, по сравнению с привычными мне слеш-командами?О. В общем да, использование АПИ дает существенные преимущества перед использованием обычных слеш-команд. Расплатой за это, однако, служит размер самого макроса (в символах). А как вы знаете, по умолчанию он не может превышать 255. (Об этом ниже)В. То есть мои возможности практически безграничны? Что я не смогу делать с помощью макроса?О. Вы не сможете двигаться с помощью макроса (функции передвижения защищены), А так же не сможете написать макрос для автолута (особенно обидно если вы rogue и вам надоело щелкать по луту прошаренных карманов). Все остальное в той или иной степени реализуемо с помощью макросов.B. Хорошо. А что мне нужно знать, чтобы начать делать свои макросы?О. В первую очередь, вам пригодится школьный курс информатики, где вас учили рисовать кружочки в цикле на экране с помощью Бейсик или Паскаль. А так же знание названий и возможностей самих функцийВ. Но я не умею программировать! Неужели нет другого способа?О. На самом деле можете. Если вы можете сформировать в голове порядок действий, какие действия выполняются за какими и при каких условиях, то вы можете написать мини программу-макрос.В. А еще вопрос. Я смогу написать макрос, чтобы нажать один раз и смотреть, как мой персонаж сам производит действия одно за другим?О. Нет. Макрос выполняется один раз за нажатие. Если в нем предусмотрено выполнение нескольких действий, вам, скорее всего, придется нажать на макрос несколько раз (обычно по количеству выполняемых действий). Исключение составляют макросы отправки сообщений в чат или каст нескольких заклинаний без ГКД (Общий кулдаун на все спеллы - 1.5с).Макросов на одновременную активацию какого-либо итема и каста спелла сделать нельзя, поскольку активация итема в большинстве случаев вызывает ГКД.В. Ротация моего персонажа очень простая. Мне все время приходится нажимать одни и те же кнопки, особенно в инстах. Я же смогу написать общую ротацию своего персонажа и нажимать только одну кнопку?О. Да, сможетеВ. Но мой крутой макрос не вмещается в положенные 255 символов! Значит макросы на ваниле все таки не так полезны?О. Это значит что вы еще не скачали аддон SuperMacro, который позволяет расширить размер макроса с 255 до 7000 символов. Этот аддон мастхэв если вы решили сделать макрос посерьезней, чем простая комбинация действий вроде "Привет *помахать*"В. Теперь вроде более или менее понятно. С чего мне начать писать свои макросы?О. Начните с ответа в этой теме :)=======================================Список подготовленных частей:1. Введение

2. Первый полезный макрос.

3. Макрос на автохил (прист).

4. Немного теории о типах данных и паладинский макрос на автобаф.

5. Общие переменные на несколько макросов, улучшение логики авто-макросов.

Edited by Maus

Share this post


Link to post
Share on other sites

пиши конечно. сам я макросы юзаю и пописываю (или скорее собираю из кусочков), но углубление познаний о функциях мне бы не помешало.вот кстати актуальная для нас версия статьи о функциях на воввики: http://www.wowwiki.com/Useful_macros?oldid=283592

Share this post


Link to post
Share on other sites

А возможно делать проверку на возможность что-нибудь скастить в цель? всмысле узнать - является ли текущий таргет в зоне действия(узнать расстояние до него, и вручную сравнить с требуемым), является ли этот таргет в зоне видимости(вдруг за стенкой где-то, или еще черт знает где, это уже наверно к клиенту больше обращение - если он знает координаты таргета, то знает - видна ли цель), и узнать какие-то его доступные характеристики(имя, количество жизней). Больше всего первые 2 пункта интересуют.Хочу импрувнуть флешкоспам.

Edited by shuraken007

Share this post


Link to post
Share on other sites

знаю, что скриптом можно определить твое текущее место положение, а вот оппонента - сомнительно, т.к. нужен запрос от сервера.(но это всё подозрения))

по поводу имени, хп,мп :

/script t="target"; if (UnitIsVisible(t)) then SendChatMessage(""..UnitLevel(t).." уровень, %t: жизнь "..UnitHealth(t).."/ "..UnitHealthMax(t)..", мана "..UnitMana(t).." / "..UnitManaMax(t).."", "whisper", "common", "твойник" ) end

Выделенное измени на свой ник, выбери цель в таргет и напиши этот код в чат либо создай макрос.

Edited by lastdays

Share this post


Link to post
Share on other sites

А возможно делать проверку на возможность что-нибудь скастить в цель? всмысле узнать - является ли текущий таргет в зоне действия(узнать расстояние до него, и вручную сравнить с требуемым),

Можно) На ваниле свои причуды с проверкой дальности спеллов, но проверять можноВ соседней теме "ищу макрос" я скинул макрос на ресуррект, посмотриНачну тогда писать руководство в блог) Буду отписываться тут по мере появления новых записей)

Share this post


Link to post
Share on other sites

писал бы лучше прямо сюда. кто будет по блогам шастать в поисках?наш флуд можно удалить при помощи модераторов или сознательности овер9000

Share this post


Link to post
Share on other sites

нужен макрос который выбирал бы по нажатию первого члена пати, второе нажатие 2 члена пати...  (for i=1, GetNumPartyMembers() do TargetUnit("party"..i))  end этот макторс выбирает сразу последнего в пати. задумка такая выбрали 1 посмотрели если здоровье больше 0.6 выбираем следующего из пати (/script if(UnitHealth("target")/UnitHealthMax("target") < 0.6) then cast("Heal") else RunMacro("44") end) 

Share this post


Link to post
Share on other sites

макрос который выбирает по очереди в таргет членов группы или рейда. при одном нажатии первого из пати второе нажатие второго и т.д.

Share this post


Link to post
Share on other sites

В супермакро запускай - берёт в таргет, тебя в том числе если в пати, ну а в рейде само собой тоже.

/script type_pr="nil" NumMembers = 0 if (GetNumPartyMembers()~=0) then NumMembers =  GetNumPartyMembers()+1 type_pr = "party" end if((GetNumRaidMembers()~=0)) then NumMembers = GetNumRaidMembers() type_pr = "raid" end if not brix_index then brix_index = 1 else brix_index = brix_index+1 end if brix_index==NumMembers+1 then brix_index = 1 end if type_pr~="nil" then if type_pr=="raid" then unit=type_pr..brix_index else if brix_index~=1 then unit=type_pr..(brix_index-1 ) else unit="player" end end else unit="player" end TargetUnit(unit)

У тебя же на каждом нажатии всех сразу перебирало. Тут надо сохранять индекс последнего выбранного, и с ним работать.

Edited by shuraken007

Share this post


Link to post
Share on other sites

Какой макрос работает как /stopcasting? Вызов функций /script StopSpellCasting() и StopCasting() выдает ошибку.

Share this post


Link to post
Share on other sites

Прерывает каст, но не потоковые спеллы типа дрейн лайфа. Ищу способ сделать макрос, который прерывает все касты.

Share this post


Link to post
Share on other sites

Прерывает каст, но не потоковые спеллы типа дрейн лайфа. Ищу способ сделать макрос, который прерывает все касты.

я часто использую для стоп каста декурсив, она прерывает все в том числе и мф, но есть недостаток - если на тебе висит магия, то идет сразу автоматический диспел. в случае, если висит магия, можно просто стопнуть движением

Share this post


Link to post
Share on other sites

Пожалуйста напишите макрос на каст по моусоверу,на каст по таргету и хил! И макрос на каст вандом,чтобы при спаме не отменялся каст. Очень прошу...

Share this post


Link to post
Share on other sites

А 5 параллельно пересекающихся синих линий красного цвета тебе не нарисовать?

ты не знаешь:(

Share this post


Link to post
Share on other sites

поправьте макрос пожалуйста: 

/script CastSpellByName("Distracting Shot")
/script StopCasting(1)смысл в том чтобы после выстрела Distracting Shot, не включалась автоатака(Auto Shot). но макрос в таком виде вообще стрелять не хочет, жму на кнопку и ничего не происходит.и еще если кто знает есть ли макрос чтобы соединить в одну кнопку призвать пета, воскресить пета и лечить пета, что бы это все корректно работало. спасибо

Share this post


Link to post
Share on other sites

По хорошему, чтобы автоатака не врубалась, надо сделать дистракт, и скинуть таргет, типа

/script CastSpellByName("Distracting Shot") ClearTarget()

потом к какому-нить спеллу можно прикрутить приставку

/script if not UnitName("target") then TargetLastTarget() end

и будет браться последняя цель

 

с петами пока лень разбираться

Edited by shuraken007

Share this post


Link to post
Share on other sites

Вот, настроение всё ж таки появилось, пришлось на тестовом разбираться как петов приручать.

/script local sp = nil if not UnitExists("pet") then sp = "Call Pet" elseif UnitIsDead("pet") then sp = "Revive Pet" elseif UnitHealthMax("pet") - UnitHealth("pet") > 245 then sp = "Mend Pet" end if sp then CastSpellByName(sp) end
Edited by shuraken007

Share this post


Link to post
Share on other sites

Хотел бы еще спросить макрос на спам мили ударов для охотника. Скомбинировать в одну кнопку такие абилки как Wing Clip, Raptor Strike, Mongoose Bite и Counterattack. Причем так чтобы Wing Clip вешался один раз на таргет и больше не спамился до тех пока на таргете висит Wing Clip.

Я пробовал макросы на этом сайте, но к сожалению они выдают ошибку.
http://web.archive.org/web/20061109011349/http://tkasomething.com/lazyfaq.php
 

Edited by dragbeerman

Share this post


Link to post
Share on other sites

Надоело мне писать все эти макросы на ротацию, вот макрос, выполняет любые ротации, с приоритетом спеллов, проверкой на кд спелла, и на возможность каста.

 

Т.е. если кд нету, и спелл кастится(к примеру нужен додж, и парри, или ещё хрен знает что, дабы он стал активным), то кастится то, что раньше по приоритету.

Внимание: все спеллы, учавствующие в ротации должны быть на панельку вынесены, можно передвинуть их в какой-нить отдельный набор слотов - на задворки, и скрыть , например в бонгосе. Макрос естественно для супермакро. Вырубите все опции кроме показать кнопку/миникарту, дабы не конфликтовал с бонгосом.

rotation = {"Wing Clip","Counterattack", "Mongoose Bite", "Raptor Strike"}   задаётся тут набор спеллов в порядке приоритета

/script local rotation = {"Wing Clip","Counterattack", "Mongoose Bite", "Raptor Strike"} if not FindInBook then function FindInBook(spell) local i = 1 local SPELLNUM = nil while true do local spellName, spellRank = GetSpellName(i, BOOKTYPE_SPELL) if not spellName then break end if string.find(spellName .. '(Rank ' .. spellRank .. ')', spell) then SPELLNUM = i end i = i + 1 end return SPELLNUM end end if not FindInBar then function FindInBar(spell) local lActionSlot for lActionSlot = 1, 120 do GameTooltip:SetOwner(GameTooltip, "ANCHOR_NONE") GameTooltip:SetAction(lActionSlot) result = "" leftline = getglobal("GameTooltipTextLeft"..1):GetText() or "" rightline = getglobal("GameTooltipTextRight"..1):IsVisible() if rightline then rightline = getglobal("GameTooltipTextRight"..1):GetText() end result = leftline if rightline and string.find(rightline, "Rank") then rightline = "("..rightline..")" result = result..rightline elseif rightline and leftline ~= "" then result = result.." "..rightline end if string.find(result, spell) then return lActionSlot end GameTooltip:Hide() GameTooltip:ClearLines() end return nil end end if not cd then cd = {} for i = 1, getn(rotation) do cd[i] = {} cd[i].name = rotation[i] cd[i].spellnum = FindInBook(cd[i].name) cd[i].slot = FindInBar(cd[i].name) end end for i = 1, getn(cd) do start, duration = GetSpellCooldown(cd[i].spellnum, BOOKTYPE_SPELL) if duration ~= 0 then cd[i].cd = duration - GetTime() + start else cd[i].cd = 0 end end if buffed("Wing Clip", "target") then cd[1].cd = 10 end for i = 1, getn(cd) do if cd[i].cd == 0 and IsUsableAction(cd[i].slot) then cast(cd[i].name) break end end

p.s. за проверку дебафа от винд клипа, отвечает

if buffed("Wing Clip", "target") then cd[1].cd = 10 end

Так сказать единственное отклонение от обощения.

Впрочем и другие возможные зависимости спеллов друг от друга - легко в подобном формате задать.

p.p.s. макрос большой да, но там 70-80% работает только при первом нажатии, так что при последующих нажатиях можно сказать работает макрос симоволов в 350.

Edited by shuraken007

Share this post


Link to post
Share on other sites

Нужен супермакро*

 

милиабилки/винглкип

/script if not buffed("Wing Clip", 'target') then cast("Wing Clip") end/cast Mongoose Bite(Rank 4)/cast Counterattack(Rank 3)

вайпер/вингклип спам для прока

/cast Viper Sting(Rank 3)/script if not buffed("Wing Clip", 'target') then cast("Wing Clip") end/script if buffed("Wing Clip", 'target') then cast("Wing Clip(Rank 1)") end
Edited by фткyн

Share this post


Link to post
Share on other sites

ЩИТО, ПРОСТИТЕ??? Кто сломал ссылки из этой темы??? :angry:

 

К сожалению, не удалось найти запрашиваемую вами страницу.

 

Edited by KiM38RuS

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×