Luchik 55 Report post Posted June 5, 2013 (edited) Обновлено: Список подготовленных частей найдете внизу поста. Рекомендуется чтение по порядку ==================== Как любителя побегать (делать квесты и ходить в инсты) в несколько окон, меня некоторое время назад заинтересовал вопрос макросов на ванилу. Долгое время бродя по забугорным форумам, описаниям функций АПИ, я вполне разобрался с тем, что на ваниле можно писать в макросах, а что нет (что-то приходится выносить в аддоны, макросом не написать)По просьбе согильдейца решил создать тему и поделиться некоторым приобретенным опытом.Начнем с простого и дойдем до более интересных вопросов.В. Почему у меня не работают мои макросы с БК/ЛК/Каты/Панд?О. Потому что синтаксис написания макросов существенно изменился. Начиная с БК, основным материалом создания макросов являются слэш-команды (/petattack, /stopspellcast) и т.д. На ваниле нет 95% этих слешкоманд, и все макросы, по большей части, начинаются со /script или /run (это команда выполнения блока кода на Lua)В. Получается, что здесь я не могу сделать то, что делали мои макросы на БК/ЛК/Кате/Пандах?О. Чаще всего можете, потому что слешкоманды, по большей части, представляют собой упрощенный доступ к функциям АПИ. Например вместо команды /stopspellcast здесь используется функция SpellStopCasting()В. А что такое АПИ?О. АПИ (API), применительно к ВоВ в частности, это набор функций, с помощью которых можно выполнять определенные игровые действия. На воввики вы найдете полный список доступных вам функций и их описание. Но не все функции можно вызывать через макрос или аддон, в списке присутствует определенное число защищенных методов, которые может вызывать только близовский интерфейс (то есть сама игра)В. Получается, что использование АПИ даст мне больше возможностей, по сравнению с привычными мне слеш-командами?О. В общем да, использование АПИ дает существенные преимущества перед использованием обычных слеш-команд. Расплатой за это, однако, служит размер самого макроса (в символах). А как вы знаете, по умолчанию он не может превышать 255. (Об этом ниже)В. То есть мои возможности практически безграничны? Что я не смогу делать с помощью макроса?О. Вы не сможете двигаться с помощью макроса (функции передвижения защищены), А так же не сможете написать макрос для автолута (особенно обидно если вы rogue и вам надоело щелкать по луту прошаренных карманов). Все остальное в той или иной степени реализуемо с помощью макросов.B. Хорошо. А что мне нужно знать, чтобы начать делать свои макросы?О. В первую очередь, вам пригодится школьный курс информатики, где вас учили рисовать кружочки в цикле на экране с помощью Бейсик или Паскаль. А так же знание названий и возможностей самих функцийВ. Но я не умею программировать! Неужели нет другого способа?О. На самом деле можете. Если вы можете сформировать в голове порядок действий, какие действия выполняются за какими и при каких условиях, то вы можете написать мини программу-макрос.В. А еще вопрос. Я смогу написать макрос, чтобы нажать один раз и смотреть, как мой персонаж сам производит действия одно за другим?О. Нет. Макрос выполняется один раз за нажатие. Если в нем предусмотрено выполнение нескольких действий, вам, скорее всего, придется нажать на макрос несколько раз (обычно по количеству выполняемых действий). Исключение составляют макросы отправки сообщений в чат или каст нескольких заклинаний без ГКД (Общий кулдаун на все спеллы - 1.5с).Макросов на одновременную активацию какого-либо итема и каста спелла сделать нельзя, поскольку активация итема в большинстве случаев вызывает ГКД.В. Ротация моего персонажа очень простая. Мне все время приходится нажимать одни и те же кнопки, особенно в инстах. Я же смогу написать общую ротацию своего персонажа и нажимать только одну кнопку?О. Да, сможетеВ. Но мой крутой макрос не вмещается в положенные 255 символов! Значит макросы на ваниле все таки не так полезны?О. Это значит что вы еще не скачали аддон SuperMacro, который позволяет расширить размер макроса с 255 до 7000 символов. Этот аддон мастхэв если вы решили сделать макрос посерьезней, чем простая комбинация действий вроде "Привет *помахать*"В. Теперь вроде более или менее понятно. С чего мне начать писать свои макросы?О. Начните с ответа в этой теме =======================================Список подготовленных частей:1. Введение. 2. Первый полезный макрос. 3. Макрос на автохил (прист). 4. Немного теории о типах данных и паладинский макрос на автобаф. 5. Общие переменные на несколько макросов, улучшение логики авто-макросов. Edited April 23, 2015 by Maus 7 Share this post Link to post Share on other sites
Motorbreath 923 Report post Posted June 5, 2013 пиши конечно. сам я макросы юзаю и пописываю (или скорее собираю из кусочков), но углубление познаний о функциях мне бы не помешало.вот кстати актуальная для нас версия статьи о функциях на воввики: http://www.wowwiki.com/Useful_macros?oldid=283592 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted June 5, 2013 (edited) А возможно делать проверку на возможность что-нибудь скастить в цель? всмысле узнать - является ли текущий таргет в зоне действия(узнать расстояние до него, и вручную сравнить с требуемым), является ли этот таргет в зоне видимости(вдруг за стенкой где-то, или еще черт знает где, это уже наверно к клиенту больше обращение - если он знает координаты таргета, то знает - видна ли цель), и узнать какие-то его доступные характеристики(имя, количество жизней). Больше всего первые 2 пункта интересуют.Хочу импрувнуть флешкоспам. Edited June 5, 2013 by shuraken007 0 Share this post Link to post Share on other sites
lastdays 46 Report post Posted June 5, 2013 (edited) знаю, что скриптом можно определить твое текущее место положение, а вот оппонента - сомнительно, т.к. нужен запрос от сервера.(но это всё подозрения)) по поводу имени, хп,мп : /script t="target"; if (UnitIsVisible(t)) then SendChatMessage(""..UnitLevel(t).." уровень, %t: жизнь "..UnitHealth(t).."/ "..UnitHealthMax(t)..", мана "..UnitMana(t).." / "..UnitManaMax(t).."", "whisper", "common", "твойник" ) end Выделенное измени на свой ник, выбери цель в таргет и напиши этот код в чат либо создай макрос. Edited June 5, 2013 by lastdays 0 Share this post Link to post Share on other sites
Luchik 55 Report post Posted June 6, 2013 А возможно делать проверку на возможность что-нибудь скастить в цель? всмысле узнать - является ли текущий таргет в зоне действия(узнать расстояние до него, и вручную сравнить с требуемым),Можно) На ваниле свои причуды с проверкой дальности спеллов, но проверять можноВ соседней теме "ищу макрос" я скинул макрос на ресуррект, посмотриНачну тогда писать руководство в блог) Буду отписываться тут по мере появления новых записей) 0 Share this post Link to post Share on other sites
Motorbreath 923 Report post Posted June 6, 2013 писал бы лучше прямо сюда. кто будет по блогам шастать в поисках?наш флуд можно удалить при помощи модераторов или сознательности овер9000 0 Share this post Link to post Share on other sites
Luchik 55 Report post Posted June 6, 2013 Буду дополнять первый пост ссылками) 0 Share this post Link to post Share on other sites
iki201 7 Report post Posted August 3, 2014 нужен макрос который выбирал бы по нажатию первого члена пати, второе нажатие 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) 0 Share this post Link to post Share on other sites
Xudojnik 904 Report post Posted August 3, 2014 Если кто-нибудь понял, чего он хочет, объясните плз 1 Share this post Link to post Share on other sites
iki201 7 Report post Posted August 3, 2014 макрос который выбирает по очереди в таргет членов группы или рейда. при одном нажатии первого из пати второе нажатие второго и т.д. 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted August 3, 2014 (edited) В супермакро запускай - берёт в таргет, тебя в том числе если в пати, ну а в рейде само собой тоже. /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 August 3, 2014 by shuraken007 1 Share this post Link to post Share on other sites
Rheeza 3 Report post Posted August 21, 2014 Какой макрос работает как /stopcasting? Вызов функций /script StopSpellCasting() и StopCasting() выдает ошибку. 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted August 21, 2014 http://www.wowwiki.com/World_of_Warcraft_API?oldid=335546 /script SpellStopCasting() 0 Share this post Link to post Share on other sites
Rheeza 3 Report post Posted August 21, 2014 Прерывает каст, но не потоковые спеллы типа дрейн лайфа. Ищу способ сделать макрос, который прерывает все касты. 0 Share this post Link to post Share on other sites
Denise 758 Report post Posted August 22, 2014 Прерывает каст, но не потоковые спеллы типа дрейн лайфа. Ищу способ сделать макрос, который прерывает все касты. я часто использую для стоп каста декурсив, она прерывает все в том числе и мф, но есть недостаток - если на тебе висит магия, то идет сразу автоматический диспел. в случае, если висит магия, можно просто стопнуть движением 0 Share this post Link to post Share on other sites
Proba 6 Report post Posted March 13, 2015 Пожалуйста напишите макрос на каст по моусоверу,на каст по таргету и хил! И макрос на каст вандом,чтобы при спаме не отменялся каст. Очень прошу... 0 Share this post Link to post Share on other sites
Proba 6 Report post Posted March 13, 2015 А 5 параллельно пересекающихся синих линий красного цвета тебе не нарисовать? ты не знаешь 0 Share this post Link to post Share on other sites
dragbeerman 2 Report post Posted March 14, 2015 поправьте макрос пожалуйста: /script CastSpellByName("Distracting Shot") /script StopCasting(1)смысл в том чтобы после выстрела Distracting Shot, не включалась автоатака(Auto Shot). но макрос в таком виде вообще стрелять не хочет, жму на кнопку и ничего не происходит.и еще если кто знает есть ли макрос чтобы соединить в одну кнопку призвать пета, воскресить пета и лечить пета, что бы это все корректно работало. спасибо 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted March 14, 2015 (edited) По хорошему, чтобы автоатака не врубалась, надо сделать дистракт, и скинуть таргет, типа /script CastSpellByName("Distracting Shot") ClearTarget() потом к какому-нить спеллу можно прикрутить приставку /script if not UnitName("target") then TargetLastTarget() end и будет браться последняя цель с петами пока лень разбираться Edited March 14, 2015 by shuraken007 1 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted March 14, 2015 (edited) Вот, настроение всё ж таки появилось, пришлось на тестовом разбираться как петов приручать. /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 March 14, 2015 by shuraken007 3 Share this post Link to post Share on other sites
dragbeerman 2 Report post Posted March 15, 2015 shuraken007 огромное спасибо, хорошо что еще остались такие люди как вы! 2 Share this post Link to post Share on other sites
dragbeerman 2 Report post Posted April 26, 2015 (edited) Хотел бы еще спросить макрос на спам мили ударов для охотника. Скомбинировать в одну кнопку такие абилки как Wing Clip, Raptor Strike, Mongoose Bite и Counterattack. Причем так чтобы Wing Clip вешался один раз на таргет и больше не спамился до тех пока на таргете висит Wing Clip.Я пробовал макросы на этом сайте, но к сожалению они выдают ошибку.http://web.archive.org/web/20061109011349/http://tkasomething.com/lazyfaq.php Edited April 26, 2015 by dragbeerman 0 Share this post Link to post Share on other sites
shuraken007 345 Report post Posted April 27, 2015 (edited) Надоело мне писать все эти макросы на ротацию, вот макрос, выполняет любые ротации, с приоритетом спеллов, проверкой на кд спелла, и на возможность каста. Т.е. если кд нету, и спелл кастится(к примеру нужен додж, и парри, или ещё хрен знает что, дабы он стал активным), то кастится то, что раньше по приоритету. Внимание: все спеллы, учавствующие в ротации должны быть на панельку вынесены, можно передвинуть их в какой-нить отдельный набор слотов - на задворки, и скрыть , например в бонгосе. Макрос естественно для супермакро. Вырубите все опции кроме показать кнопку/миникарту, дабы не конфликтовал с бонгосом. 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 November 3, 2015 by shuraken007 2 Share this post Link to post Share on other sites
фткyн 1,469 Report post Posted May 5, 2015 (edited) Нужен супермакро* милиабилки/винглкип /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 May 5, 2015 by фткyн 1 Share this post Link to post Share on other sites
KiM38RuS 1 Report post Posted September 23, 2016 (edited) ЩИТО, ПРОСТИТЕ??? Кто сломал ссылки из этой темы??? 1. Введение. 2. Первый полезный макрос. 3. Макрос на автохил (прист). 4. Немного теории о типах данных и паладинский макрос на автобаф. 5. Общие переменные на несколько макросов, улучшение логики авто-макросов. К сожалению, не удалось найти запрашиваемую вами страницу. Edited September 23, 2016 by KiM38RuS 0 Share this post Link to post Share on other sites