Jump to content
abeliq

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

Recommended Posts

Только он немного коряво работает, я не помню что там коряво, но коряво.

Share this post


Link to post
Share on other sites

Можно ли сделать макрос, позволяющий отображать серверное время в чат, а также делать это с оффсетом (то есть накидывать +час, + 5 мин и.т.д) ?

 

Также нужна помощь с макросом на отображение секунд с последнего каста спирит хилера на бг, в API что-то есть такое, но сделать рабочий макрос не могу.

Share this post


Link to post
Share on other sites

http://www.wowwiki.com/World_of_Warcraft_API?oldid=335546

вот все функции для взаимодействия с клиентом

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

Пересмотрел всё - можно все макросы, спеллы на панельках перемещать, вещи в сумках, а из лута нельзя.

Share this post


Link to post
Share on other sites

crucialdude - а что касается тебя, то

/script DEFAULT_CHAT_FRAME:AddMessage(GetAreaSpiritHealerTime())

Возвращает время в секундах, либо 0, либо что-то осмысленное когда мёртв и рядом с духом.

/script local UTC = 120 local h, m = GetGameTime() all_t = h*60 + m + UTC h = ceil(all_t/60) - 1 if h >= 24 then h = h - 24 all_t = all_t - 24*60 end m = all_t - h*60 msg="124cff00FFFF["..h..":"..m.."]124r" DEFAULT_CHAT_FRAME:AddMessage(msg) 

Выводит время серверное со сдвигом UTC в минутах. Т.е. UTC = 125 - время со сдвигом в 2 часа с лишним к примеру(разумеется и назад тоже можно). Адекватно переводится в часо-минуты с учётом 00:00 перехода.

Edited by shuraken007

Share this post


Link to post
Share on other sites

А ещё можно получше сделать, но это потребует подключение аддона SuperMacro

/script SLASH_SERVTIME1 = "/servtime" SLASH_SERVTIME2 = "/st" SlashCmdList["SERVTIME"] = function(message) _, _, UTC = string.find(message, "(%d+)") if not UTC then UTC = 0 end local h, m = GetGameTime() all_t = h*60 + m + UTC h = ceil(all_t/60) - 1 if h >= 24 then h = h - 24 all_t = all_t - 24*60 end m = all_t - h*60 msg="124cff00FFFF["..h..":"..m.."]124r" Printd(msg) end

одно нажатие макроса - и можно писать в чат команды

/st UTC

/servtime UTS

ну например /st - без сдвига, /st 45  - с 45-минутным сдвигом, если сдвиг не хочется каждый раз писать - то можно в макросе написать 

вместо if not UTC then UTC = 0 end  ------> if not UTC then UTC = 45 end

 

Update:

/script SLASH_SERVTIME1 = "/servtime" SLASH_SERVTIME2 = "/st" SlashCmdList["SERVTIME"] = function(message) _, _, UTC = string.find(message, "(%d+)") if not UTC then UTC = 0 end local h, m = GetGameTime() all_t = h*60 + m + UTC h = ceil(all_t/60) - 1 if h >= 24 then h = h - 24 all_t = all_t - 24*60 end if h < 0 then h = h + 24 all_t = all_t + 24*60 end m = all_t - h*60 if h < 10 then h = "0"..tostring(h) end if m < 10 then m = "0"..tostring(m) end msg="124cff00FFFF["..h..":"..m.."]124r" Printd(msg)
Edited by shuraken007

Share this post


Link to post
Share on other sites

А вот - думаю наибольшая польза от такого макроса будет, ежели он сам будет в чат спамить с каким-то промеждутком время(опять таки нужен SuperMacro аддон. Дабы с бонгосами всякими не было конфликтов - убирай в настройках у аддона всё кроме показать кнопку в меню/на миникарте). Заодно нашёл пару ошибок - не читался отрицательный сдвиг и при скачке назад 00:00 были некорректные данные.

/script SLASH_SERVTIME1 = "/servtime" SLASH_SERVTIME2 = "/st" SlashCmdList["SERVTIME"] = function(message) _, _, UTC = string.find(message, "([0-9%-]+)") if not UTC then UTC = 0 end SM_IN(10, [[/script local h, m = GetGameTime() all_t = h*60 + m + UTC h = ceil(all_t/60) - 1 if h >= 24 then h = h - 24 all_t = all_t - 24*60 end if h < 0 then h = h + 24 all_t = all_t + 24*60 end m = all_t - h*60 if h < 10 then h = "0"..tostring(h) end if m < 10 then m = "0"..tostring(m) end msg="124cff00FFFF["..h..":"..m.."]124r" Printd(msg)]], 1) end

Тут где SM_IN(10, .......) вместо 10 надо вставить своё время - ну например раз в 3 минуты - вставь 180. жмякаешь макрос, нажимаешь например         /st -60

и через 3 минуты появляется первое напечатанное время. В чат команду более одного раза не пиши - ибо в 2 раза чаще будут сообщения приходить. Дабы убрать это безумие - пропиши в чате /script ReloadUI()

Edited by shuraken007

Share this post


Link to post
Share on other sites

наваяйте ктонить макрос на екип оружия в оффхенд пожалуйста

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

/run item_n = "Argent Avenger" for i=0,4 do for j=1,GetContainerNumSlots(i) do _,_,name = string.find(GetContainerItemLink(i,j) or "","%[(.+)%]") if(name==item_n) then PickupContainerItem(i,j) AutoEquipCursorItem() end end end

Где вместо "Argent Avenger" своё имя вставляй, этим макросом достигается эффект клацанья правой мышкой по предмету с тем названием.

 

А вообще проще поставить аддон Weapon Quick Swap

дабы одеть два конкретных одноруча - пиши нечто вроде  /script WeaponSwap("пуха1", "пуха2")

если в руке ничего нет - это "" если похрен что там, то "*"

т.е. одеть токо оффхенд без мейнхенда WeaponSwap("", "пуха2")

оставить мейнхенд WeaponSwap("*", "пуха2")

если надо переключаться между наборами пушек - то

WeaponSwap("сет1_пуха1", "сет1_пуха2", "сет2_пуха1", "сет2_пуха2", "сет3_пух.."...)

например двуруч указвается как "двуруч", ""

readme почитай - там всё есть вобщем

Edited by shuraken007

Share this post


Link to post
Share on other sites

Почему не работает мини-аддон http://eu.battle.net/wow/en/forum/topic/3061919039 ?Я нашёл одну причину - использование IsStealthed() - и вроде исправил, но он всё равно не работает. Подозреваю, что дело в UPDATE_STEALTH, вернее в его отсутствии, и нужно использовать COMBAT_LOG_EVENT и SPELL_AURA_APPLIED. Я прав? Хелп!

У нас нету функции IsStealthed(), InCombatLockdown(), time(), нет ивента "UPDATE_STEALTH", также (event, arg1, ...) , аргументы и троеточия не из этой оперы. Оно из новой версии луа, которую наш клиент не поддерживает. И вообще вроде написано всё через одно место. Зачем он настраивал невидимый фрейм тоже непонятно. Я подправил - теперь он работает, но с описанием не совпадает немного - хотя афкшить и периодически доставать/прятать пухи - довольно интересная идея, зачем оно в стелсе - ума не приложу, делать что ле нечего было. Мне лень дальше копаться, но думаю тебе будет интересно. Я там использовал PLAYER_AURAS_CHANGED - при получении/снятия стелса или любого другого бафа вызовется - ну и там нет проблем проверить - получил ты стелс или он пропал, ориентираясь на WasStealth.  Хотя при переполнении строки бафов возможно актуальнее комбат лог, впрочем сомнительно, что стелс вытеснится. Нужен супермакро аддон, я использовал его ф-ю buffed

Аддон:

Sheats = {}local DotheSheat = time()function Sheats.OnLoad()	this:RegisterEvent("PLAYER_AURAS_CHANGED")	this:RegisterEvent("LOOT_OPENED")	this:RegisterEvent("PLAYER_LEAVE_COMBAT")	if buffed("Stealth", "player") then		WasStealth = 1	endendfunction Sheats.OnEvent(event)	if event == "PLAYER_AURAS_CHANGED" then		if buffed("Stealth", "player") then 			DoSheat = -1			WasStealth = 1		else 			if WasStealth == 1 then				DoSheat = 0;			end			WasStealth = 0		end	elseif event == "LOOT_OPENED" then 		DoSheat = 0 	elseif event == "PLAYER_LEAVE_COMBAT" then 		DotheSheat = GetTime() 		DoSheat = 1 	endendfunction Sheats.OnUpdate()	local what_class, _ = UnitClass("player"); 	if DoSheat == -1 then  		if GetTime() - DotheSheat > 2 then  			ToggleSheath(); 			DoSheat = 0;  		end 	elseif DoSheat == -2 then  		if GetTime() - DotheSheat > 2 then  			ToggleSheath();  			DoSheat = -1;  		end  	end    if DoSheat == 1 then 		if UnitAffectingCombat("player") then 			DotheSheat = GetTime(); 		else 			if what_class == "Rogue" then 				DoSheat = -2; 				ToggleSheath();  				DotheSheat = GetTime(); 			elseif what_class == "Shaman" then 				DoSheat = 0; 				ToggleSheath();  				DotheSheat = GetTime(); 			else  				DoSheat = -1; 				ToggleSheath();  				DotheSheat = GetTime(); 			end 		end 	end end
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/....FrameXMLUI.xsd"> 	<Script file="WeaponSheat.lua"/> 	<Frame name="WeaponSheats_toggler" parent="UIParent" enableMouse="false" frameStrata="LOW" hidden="false" > 		<Size> 			<AbsDimension x="1" y="1" /> 		</Size> 		<Anchors> 			<Anchor point="CENTER" relativeTo="UIParent" >				<Offset> 					<AbsDimension x="0" y="0" /> 				</Offset> 			</Anchor> 		</Anchors> 		<Scripts> 			<OnLoad>				Sheats.OnLoad()			</OnLoad>			<OnEvent>				Sheats.OnEvent(event)			</OnEvent> 			<OnUpdate>  				Sheats.OnUpdate() 			</OnUpdate> 		</Scripts> 	</Frame></Ui>

Хотя лучше даже

 <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/....FrameXMLUI.xsd"> 	<Script file="WeaponSheat.lua"/> 	<Frame name="WeaponSheatsFrame"> 		<Scripts> 			<OnLoad>				Sheats.OnLoad()			</OnLoad>			<OnEvent>				Sheats.OnEvent(event)			</OnEvent> 			<OnUpdate>  				Sheats.OnUpdate() 			</OnUpdate> 		</Scripts> 	</Frame></Ui>
## Interface: 11200## Title: WeaponSheat## Notes: WeaponSheat## SavedVariables: ## SavedVariablesPerCharacter:WeaponSheat.luaWeaponSheat.xml

 

А вот могу тебе ещё подкинуть пару своих функций для работы со временем:

 

Таймеры:

ShurakenPack.Timers={}function ShurakenPack.NewTimer(shuraken_pack_timer, shuraken_pack_time)	ShurakenPack.Timers[shuraken_pack_timer] = {[1]=GetTime(), [2]=shuraken_pack_time}endfunction ShurakenPack.GetTimer(shuraken_pack_timer)	local return_value	if not ShurakenPack.Timers[shuraken_pack_timer] then 		return_value = nil	else		return_value = ShurakenPack.Timers[shuraken_pack_timer][2] - (GetTime() - ShurakenPack.Timers[shuraken_pack_timer][1])		if return_value<0 then 			return_value = nil			tremove(ShurakenPack.Timers[shuraken_pack_timer])			tremove(ShurakenPack.Timers[shuraken_pack_timer])			ShurakenPack.Timers[shuraken_pack_timer] = nil		end	end	return return_valueendfunction ShurakenPack.PrintTimers()	for key, value in pairs(ShurakenPack.Timers) do		if ShurakenPack.GetTimer(key) then			Printd(key..": "..ShurakenPack.GetTimer(key))		end	endend 

пример работы с ними:

ShurakenPack.NewTimer("AntiSpam", 2)

if not ShurakenPack.GetTimer("AntiSpam") then ...

 

и ещё секундумеры

ShurakenPack = {}ShurakenPack.Stopwatchs = {}function ShurakenPack.Stopwatch(stopwatch, start_or_stop)	if start_or_stop and start_or_stop == "start" then		if not ShurakenPack.Stopwatchs[stopwatch] then 			ShurakenPack.Stopwatchs[stopwatch] = {[1] = 0, [2] = GetTime(), [3] = 1}		else			if ShurakenPack.Stopwatchs[stopwatch][3] == 0 then				ShurakenPack.Stopwatchs[stopwatch][2] = GetTime()				ShurakenPack.Stopwatchs[stopwatch][3] = 1			end		end	elseif start_or_stop and start_or_stop == "stop" then		if ShurakenPack.Stopwatchs[stopwatch] then			ShurakenPack.Stopwatchs[stopwatch][1] = ShurakenPack.Stopwatchs[stopwatch][1] + ShurakenPack.Stopwatchs[stopwatch][3]*(GetTime() - ShurakenPack.Stopwatchs[stopwatch][2])			ShurakenPack.Stopwatchs[stopwatch][3] = 0		end	endendfunction ShurakenPack.GetStopwatch(stopwatch)	local return_value	if not ShurakenPack.Stopwatchs[stopwatch] then 		return_value = nil	else		return_value = ShurakenPack.Stopwatchs[stopwatch][1] + ShurakenPack.Stopwatchs[stopwatch][3]*(GetTime() - ShurakenPack.Stopwatchs[stopwatch][2])	end	return return_valueendfunction ShurakenPack.DelStopwatch(stopwatch)	if ShurakenPack.Stopwatchs[stopwatch] then		ShurakenPack.Stopwatchs[stopwatch][1] = nil		ShurakenPack.Stopwatchs[stopwatch][2] = nil		ShurakenPack.Stopwatchs[stopwatch][3] = nil		ShurakenPack.Stopwatchs[stopwatch] = nil	endendfunction ShurakenPack.PrintStopwatchs()	for key, value in pairs(ShurakenPack.Stopwatchs) do		if ShurakenPack.GetStopwatch(key) then			Printd(key..": "..ShurakenPack.GetStopwatch(key))		end	endend 

аналогично

ShurakenPack.DelStopwatch("combat")

ShurakenPack.Stopwatch("combat", "stop")

ShurakenPack.Stopwatch("combat", "start")

ShurakenPack.GetStopwatch("combat")

 

Вобщем если это дело прихреначить к тому, то получится более понятная картина, удобнее должно быть.

Edited by shuraken007

Share this post


Link to post
Share on other sites

Да - оно из SuperMacro, лень было писать вручную, можешь написать так:

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

/script i=1 while( UnitBuff("player", i) ) do icon, _ = UnitBuff("player", i) DEFAULT_CHAT_FRAME:AddMessage(icon) i = i + 1 end

а в коде тогда уже вместо buffed нечто вроде

i = 1Stealth = 0while(UnitBuff("player", i)) do   icon, _ = UnitBuff("player", i)   if string.find(icon, "Spell_Holy_DevotionAura") then (или "DevotionAura" - паловская бронеаура)      Stealth = 1      break   endendif Stealth == 1 then...end

А вот в супермакро похитрее поступают - ведь можно читать надписи на всех иконках, если знать куда подключиться, в кратце оно выглядит как-то так

/script SM_Tooltip:SetOwner(UIParent, "ANCHOR_NONE") SM_Tooltip:SetUnitBuff("player", 1) b = getglobal(SM_Tooltip:GetName().."TextLeft1"):GetText() DEFAULT_CHAT_FRAME:AddMessage(

где SM_Tooltip

<GameTooltip name="SM_Tooltip" frameStrata="TOOLTIP" hidden="true" parent="UIParent" inherits="GameTooltipTemplate">   <Scripts>	<OnLoad>	   this:SetOwner(WorldFrame, "ANCHOR_NONE");	</OnLoad>   </Scripts></GameTooltip> 

функция FindBuff( obuff, unit, item) в файле SM_Slash.lua, фрейм в SuperMacro.xml

Edited by shuraken007

Share this post


Link to post
Share on other sites

Нужна помощь с макросом на /whisper с текстом текущему таргету, возможно ли такой сделать?

Share this post


Link to post
Share on other sites
/script msg = "ку краб" tar_name = UnitName("target") if tar_name then SendChatMessage(msg, "WHISPER", "COMMON", tar_name) end

Что-нить в этом духе.

 

Если за орду, то "COMMON" смени на "ORCISH"

Edited by shuraken007

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

Как сделать макрос с проверкой спелла на КД?

Т.е. чтобы по умолчанию кастовать например mind blist, а если он на кд то Smite.

/cast mind blast

/cast smite   работает, но всегда вылазит красное сообщение в центре экрана и это напрягает

Share this post


Link to post
Share on other sites

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

/run sp="Mind BLast" i=1 while true do local spellN = GetSpellName(i, BOOKTYPE_SPELL) if not spellN then break end if string.find(spellN, sp) then SPELLN=i end i=i+1 end DEFAULT_CHAT_FRAME:AddMessage(SPELLN)

тогда макрос выглядит как-то так, где mindblast_num число, найденное при юзе предыдущего макроса

/script start, duration = GetSpellCooldown(mindblast_num, BOOKTYPE_SPELL) if duration and duration > 0 then CastSpellByName("Smite") else CastSpellByName("Mind BLast") end

Можно написать макрос, который и сам найдет mindblast_num , точнее объеденить два предыдущих, но он уже больше 255 символов, нужен супермакро аддон

 

p.s. мог перепутать имена спеллов малость, если что сам подправь

Edited by shuraken007

Share this post


Link to post
Share on other sites

Я бы не советовал запускать макрос от товарища выше, у вас удалятся все вещи в сумках.

И вобще советую просматривать макросы на наличие DeleteCursorItem().

Да и штука эта, если не брать в рассчет удаление вещей - привязана к спеллу на 1-м слоте - там должен быть майндбласт, что неудобно, ибо надо 1 кнопко вместо 2-х, а тут всё равно 2.

Понахватались тут всяких гадостей от меня.

е дай Бог с дураком найти!"

 

p.s. И вобще суммоню модератора какого-нить.

Edited by shuraken007

Share this post


Link to post
Share on other sites

А ты уверен что у макросов корректно кулдаун отображается? Иногда это наибольшее кд спелла, что там кастится, но это в более менее простом коде.

Часто вобще кд нету, ты проверял и пашет?

Share this post


Link to post
Share on other sites

Jorn Skyseer

Очень отличная шутка с макросом на удаление всех вещей. Я его попробовал использовать и у меня почему-то удалилось ваше сообщение. Извините. 

Share this post


Link to post
Share on other sites

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

/run sp="Mind BLast" i=1 while true do local spellN = GetSpellName(i, BOOKTYPE_SPELL) if not spellN then break end if string.find(spellN, sp) then SPELLN=i end i=i+1 end DEFAULT_CHAT_FRAME:AddMessage(SPELLN)

тогда макрос выглядит как-то так, где mindblast_num число, найденное при юзе предыдущего макроса

/script start, duration = GetSpellCooldown(mindblast_num, BOOKTYPE_SPELL) if duration and duration > 0 then CastSpellByName("Smite") else CastSpellByName("Mind BLast") end

Можно написать макрос, который и сам найдет mindblast_num , точнее объеденить два предыдущих, но он уже больше 255 символов, нужен супермакро аддон

 

p.s. мог перепутать имена спеллов малость, если что сам подправь

Огромное спасибо! второй макрос работает как надо. по нажатии первого ничего не происходит. Поэтому номер спелла высчитал вручную в книге спеллов)

Может кому пригодится: номер считается с первой страницы, сверху вниз, слева направо. При изучении нового заклинания номер может измениться

Edited by Osiris62ru

Share this post


Link to post
Share on other sites

макрос для БГ /script for i=1,10 do TargetNearestEnemy(); проверка UnitClass() и наличие дебафа, каст  Curse;начинает притормаживать когда рядом много врагов. Что можно придумать вместо перебирания всех врагов заново на каждом нажатии? (Хотя в этом есть свой бонуст, т.к постоянно диспелят).Может лучше создавать список потенциальных целей каждые несколько секунд, и обновлять их? к тому же у нас есть окно в 1 ГКД.Если есть какие нибудь альтернативные подходы- пишите. 

Edited by tunecx

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

×