Jump to content
abeliq

Поиск и вопросы по макросам

Recommended Posts

ну можно я думаю, но это будет зависеть от кастбара, ведь много есть разных аддонов, что его могут модифицировать, а разве стандартный кастбар показывает автошот?

Share this post


Link to post
Share on other sites

ну можно я думаю, но это будет зависеть от кастбара, ведь много есть разных аддонов, что его могут модифицировать, а разве стандартный кастбар показывает автошот?

Стандартный не показывает, я пользуюсь rais_AutoShot, он более стабильно работает чем bigtrouble.

Share this post


Link to post
Share on other sites

^автор писал что он по другому алгоритму работает, специально под пиратки писался.

Share this post


Link to post
Share on other sites

подскажите как взять значение из декурсива (arg1 == SPELL_FAILED_LINE_OF_SIGHT) в макрос, а вообще можно в макрос брать значения из аддонов (чтобы не писать отдельный аддон) /script arg1 = Dcr_OnEvent (event) if arg1 == 0 then CastSpellByName("Multi Shot") end

function Dcr_OnEvent (event)
    local Frame = this;

     -- Dcr_debug_bis ("Event was catch: " .. event);
    

    if (event == "UNIT_PET" and arg1 == "player" and not Dcr_CheckingPET) then
	Dcr_CheckingPET = true;
	Dcr_debug_bis ("PLAYER pet detected! Poll in 2 seconds");
	return;
    elseif (event == "UNIT_PET" and (arg1 ~= "player" or Dcr_CheckingPET)) then
	return;
    elseif (event == "PLAYER_ENTER_COMBAT") then
	Dcr_EnterCombat();
	return;
    elseif (event == "PLAYER_LEAVE_COMBAT") then
	Dcr_LeaveCombat();
	return;
    elseif (event == "UI_ERROR_MESSAGE") then
	if (arg1 == SPELL_FAILED_LINE_OF_SIGHT) then
	    Dcr_errln("Out of sight!");
	    Dcr_SpellCastFailed();
	end

спасибо

Share this post


Link to post
Share on other sites

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

Если ты часто такой трюк будешь проворачивать - заведи массив для подобных переменных, к примеру VarsForMacro={}

 

и сделать вставку

if not VarsForMacro then
	VarsForMacro = {}
end
VarsForMacro.ErrorMessage = nil

function Dcr_OnEvent (event)
............................

ну и в нужный момент записывать

elseif (event == "UI_ERROR_MESSAGE") then
	VarsForMacro.ErrorMessage = arg1
	if (arg1 == SPELL_FAILED_LINE_OF_SIGHT) then
	    Dcr_errln("Out of sight!");
	    Dcr_SpellCastFailed();
	end

Соответственно из макроса видно массив этот, пользуйся там VarsForMacro.ErrorMessage

Если переменная не локальная - она видна отовсюду - оно всё варится в одном котле так сказать.

Edited by shuraken007

Share this post


Link to post
Share on other sites

Всем привет. Помогите с макросом для друида ферала хочу что то на подобии такого макроса (/cast [nostealth] Shred; [stealth] Ravage) сделать 2 способности на одну кнопку этот макрос не работает сам пробовал на англ клиенте в общем помогите кто может )

Share this post


Link to post
Share on other sites
/script time_to_shoot = TestAddon.GetTimeToShoot() if time_to_shoot > 0.5 then CastSpellByName("Multi Shot") end

ну или какой там зазор времени надо, больше 0.5 наверное, сколько там мультик кастится

там просили за аймедшот, мы немного подровняли скрипт 

script time_to_shoot = TestAddon.GetTimeToShoot() if time_to_shoot > 0.9 then CastSpellByName("Aimed Shot") end
 

очень удобная штука, единственный недостаток нельзя начать пул с аймеда

 

Edited by Beermen

Share this post


Link to post
Share on other sites

Ну так это легко подправить. В TestAddon.autoshot хранится инфа - врублен ли автошот или нет.

if time_to_shoot > 0.9 or (not TestAddon.autoshot) then ... end

Может скобки () лишние, не у компа ща.

Edited by shuraken007

Share this post


Link to post
Share on other sites
Прикрутил аимд шот к стандартному кастбару, обозвав аддон заодно Better Aimed Shot.
если кому интересно - может глянуть код, там идет перехват(hook) функции UseAction чтобы узнать когда клацнули на каст, потом рассчитывается коэффециент изменение скорости
(стандартная берется из описания пушки и описания колчана, а модифицированная бафами всякими на скорость возвращает функция известная, и еще сделал учет пинга в 0.2).
Далее запускается на кастбар, кусок на запуск кастбара скопирован из близзардовского одноименного аддона, который по умолчанию.
 
макрос в новых условиях
/script time_to_shoot = BAS.GetTimeToShoot() if time_to_shoot > 0.9 or (not BAS.autoshot) then CastSpellByName("Aimed Shot") end

 

BAS.zip

Share this post


Link to post
Share on other sites

Шура, а к агуфу можешь патитаргет прикрутить? Луна коряво почему-то работает и не нравится.

Share this post


Link to post
Share on other sites

Подскажите что означает каждая цифра for i = 1,10,1 do Target...

Share this post


Link to post
Share on other sites

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

Edited by girk

Share this post


Link to post
Share on other sites

ты когда на макрос клацаешь клиент его выполняет, то есть он перестаёт работать и выполняет только твой скрипт.

Соответственно если тупо прописать какой-нибудь цикл на 100500 пустых итераций - клиент зафризит.

При переборе таргетов вызывается близзардовский аддон, и это дело надо хукать и отрубать, чтобы снять нагрузку.

Пример в хантовском аддоне ICU.(Всмысле на каждой смене таргета идёт перерисовка фрейма, и это сильно само по себе уже тормозит)

И надо поставить задержки от спама через GetTime() хотя бы, чтобы ты мог прожать макрос раз в 0.01 секунду например, или что-нить в этом духе.

Я бы вобще не рисковал брать больше одной цели за одно нажатие.

Edited by shuraken007

Share this post


Link to post
Share on other sites

shuraken007  Переделал я твой первый аддон для аимеда под варовский Slam, только почему то нивкакую не хочет выполнять условие UnitMana("player") >= 20 лупит им когда вздумается, иногда при 15 раги, а иногда (видимо из за пинга) доходит до 30+ раги и лупит несколько слэмов подрят, соответственно белый дамаг пропускается. Вроде другие скрипты подхватывают условие на количество раги.

Edited by girk

Share this post


Link to post
Share on other sites

Ну пока я не увижу макрос, и переделанный аддон - я не пойму что не так, UnitMana должна корректно возвращать.

По идее каст должен корректно ловить - я специально извращался чтобы не было привязки к конкретному спеллу.

А вот автоатаки не уверен, что ловит, кажется автошоты отличаются от автоатаки.

И ещё - нахрена мой аддон приделывать к Слэму - там ведь и так кастбар пашет.

 

Надо что ли, чтобы он с мейнхенда, а не оффхенды работал?

Edited by shuraken007

Share this post


Link to post
Share on other sites

Ну пока я не увижу макрос, и переделанный аддон - я не пойму что не так, UnitMana должна корректно возвращать.

По идее каст должен корректно ловить - я специально извращался чтобы не было привязки к конкретному спеллу.

А вот автоатаки не уверен, что ловит, кажется автошоты отличаются от автоатаки.

И ещё - нахрена мой аддон приделывать к Слэму - там ведь и так кастбар пашет.

 

Надо что ли, чтобы он с мейнхенда, а не оффхенды работал?

То есть PLAYER_ENTER_COMBAT и PLAYER_LEAVE_COMBAT будет криво снимать показания?(по сути только эти ивенты заменены и все ну и mainSpeed = UnitAttackSpeed("player")) По поводу зачем слэм прикручивать, дело в том что нужно кастить слэм как можно ближе  к вылету мили атаки, потому что следующий мили начинает рассчитываться с самого начала после окончания слэма. (хз может это особенность пираток)

Edited by girk

Share this post


Link to post
Share on other sites

Достаточно поставить аддон AttackBar.

	local mh, oh
	if not Abar_Mhr.et then
		mh = 0
	else
		mh= Abar_Mhr.et-GetTime()
	end
	if not Abar_Oh.et then
		oh = 0
	else
		oh= Abar_Oh.et-GetTime()
	end
	if not mh or mh < 0 then 
		mh = 0 
	end 
	if not oh or oh < 0 then 
		oh = 0 
	end 

Вот отсюда можно узнать сколько осталось до удара основной рукой, и офххендной, значения mh и oh

Можно легко отсюда сделать твой рассчет.

if mh <= 1.5 or (oh > 0 and oh <= 1.5) and UnitMana("player") >= 20 then CastSpellByName("Slam") end

код выше либо оформить в функцию, запихнув в какой-нить аддон

function TestAddon.GetMhOh()
	local mh, oh
	if not Abar_Mhr.et then
		mh = 0
	else
		mh= Abar_Mhr.et-GetTime()
	end
	if not Abar_Oh.et then
		oh = 0
	else
		oh= Abar_Oh.et-GetTime()
	end
	if not mh or mh < 0 then 
		mh = 0 
	end 
	if not oh or oh < 0 then 
		oh = 0 
	end
	return mh, oh
end
/script local mh,oh = TestAddon.GetMhOh() if mh <= 1.5 or (oh > 0 and oh < 1.5) and UnitMana("player") >= 20 then CastSpellByName("Slam") end

либо в супермакро так вбить, разумеется в одной строке

/script local mh, oh if not Abar_Mhr.et then mh = 0 else mh= Abar_Mhr.et-GetTime() end if not Abar_Oh.et then oh = 0 else oh= Abar_Oh.et-GetTime() end if not mh or mh < 0 then mh = 0 end if not oh or oh < 0 then oh = 0 end if mh <= 1.5 or (oh > 0 and oh < 1.5) and UnitMana("player") >= 20 then CastSpellByName("Slam") end 

Мне кажется переделывать тот аддон мало смысла, там сильная привязка к хантам все таки.

Edited by shuraken007

Share this post


Link to post
Share on other sites

Достаточно поставить аддон AttackBar.

Вот отсюда можно узнать сколько осталось до удара основной рукой, и офххендной, значения mh и oh

Можно легко отсюда сделать твой рассчет.

if mh <= 1.5 or (oh > 0 and oh <= 1.5) and UnitMana("player") >= 20 then CastSpellByName("Slam") end

код выше либо оформить в функцию, запихнув в какой-нить аддон


/script local mh, oh = TestAddon.GetMhOh() if mh <= 1.5 or (oh > 0 and oh < 1.5) and UnitMana("player") >= 20 then CastSpellByName("Slam") end

Чет ошибку выдает.

Share this post


Link to post
Share on other sites

Потому что ты эту функцию никуда не вставил, или если и вставлял то не в аддон TestAddon.

Просто ради удобства в начале аддона заводят массив с его именем.

Например TestAddon={}

И потом туда пихают и переменные:TestAddon.a = 10

и функции: function TestAddon.testfunc() ... end

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

Если ты запихивал в BAS аддон, то пиши

function BAS.GetMhOh() ... end

Edited by shuraken007

Share this post


Link to post
Share on other sites

 или если и вставлял то не в аддон TestAddon.

 

Ок, спасибо (просто ты написал в какойнить адддон я в любой и впихнул) Но в других аддонах я создаю функции с любым именем (ну конешно стараюсь с необычным) и всегда их подхватывало, не нужно было вставлять в одноименный.

Edited by girk

Share this post


Link to post
Share on other sites

Оффтоп
Я вобщем тут наднях копался с Ace библиотекой, и забрёл вот сюды: http://old.wowace.com/Coding_Tips
Тут говорится, что доступ к локальным переменным за O(1), а к глобальным за O(log n)

ctrl+f+  _G

Edited by shuraken007

Share this post


Link to post
Share on other sites

Помогите с макросом - замучалась уже

Нужно на Tab сделать - Цель Ближайший враг + автоатака

и что бы при повторном нажатии на tab цель менялась если их несколько, а автоатака не выключалась 

спасибо

Share this post


Link to post
Share on other sites
/script TargetNearestEnemy()
/script if not IsCurrentAction(X) then AttackTarget() end;

Где X - номер слота экшнбара в котором автоатака.

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

×