Модератор форума: staford11 |
Форум Хитрости Пиратских серверов Читы для WoW Использование Lua скриптов. |
Использование Lua скриптов. |
Всем привет. В общем, есть такой вопрос: как указать в скрипте стаки баффа. Мне надо , чтобы применялась способность только при 6 стаках Искра злости (колба). В баффах вне зависимости от количества стаков пишется просто "Искра злости". Лич кинг
Сообщение # 2282 написано 08.05.2017 в 20:56
|
Прошу помощи)
Нужен макрос на воина 3,3,5. Суть: Каст Вихрь, если Вихрь на кд, то каст Кровожадность, если Вихрь и Кровожадность на кд, и возможно применение Победный Раж, то каст Победный Раж если Вихрь и Кровожадность на кд, и применение способности Победный Раж невозможно, и возможно применить Казнь, то каст Казнь если Вихрь и Кровожадность на кд, и применение способности Победный Раж и Казнь невозможно, и прокнула способность Прилив Крови, то каст Мощный Удар. Буду очень благодарен. Или хоть просто дайте ключевые каманды (которые прописывать нужно), я сам сделаю. По сути будет готовая ротация для фурика.
Сообщение # 2283 написано 09.05.2017 в 01:16
|
Всем привет. В общем, есть такой вопрос: как указать в скрипте стаки баффа. Мне надо , чтобы применялась способность только при 6 стаках Искра злости (колба). В баффах вне зависимости от количества стаков пишется просто "Искра злости". Лич кинг countow количество стаков,или nil если нет бафа
Сообщение # 2284 написано 09.05.2017 в 07:31
|
Прошу помощи)Нужен макрос на воина 3,3,5. Суть: Каст Вихрь, если Вихрь на кд, то каст Кровожадность, если Вихрь и Кровожадность на кд, и возможно применение Победный Раж, то каст Победный Раж если Вихрь и Кровожадность на кд, и применение способности Победный Раж невозможно, и возможно применить Казнь, то каст Казнь если Вихрь и Кровожадность на кд, и применение способности Победный Раж и Казнь невозможно, и прокнула способность Прилив Крови, то каст Мощный Удар. Буду очень благодарен. Или хоть просто дайте ключевые каманды (которые прописывать нужно), я сам сделаю. По сути будет готовая ротация для фурика. /run j={UnitChannelInfo("target")} if j[8]==(false) and UnitPower("Player") > 22 then SpellStopCasting() CastSpellByName("Зуботычина") end /run local _,a,_ = GetSpellCooldown("Кровожадность") if (a == 0) then CastSpellByName("Кровожадность") end /run local _,a,_ = GetSpellCooldown("Вихрь") if (a == 0) then CastSpellByName("Вихрь") end /run if UnitBuff("player", "Сокрушить!") then CastSpellByName("Мощный удар") end /run if GetSpellCooldown("Победный раж")==0 and IsUsableSpell("Победный раж") then CastSpellByName("Победный раж") end /run local _,a,_ = GetSpellCooldown("Героический бросок") if (a == 0) then CastSpellByName("Героический бросок") end /run i=1 d=120 while(i<=40)do a={UnitDebuff("target",i)} if a[1]=="Раскол брони" and a[8]=="player" then d=a[7]-GetTime() if a[4]==5 then break end end i=i+1 end if i>40 or d<4 then CastSpellByName("Раскол брони") end /run if GetSpellCooldown("Казнь")==0 and IsUsableSpell("Казнь") and UnitPower("Player") > 42 then CastSpellByName("Казнь") end /run if UnitPower("Player") > 37 then CastSpellByName("Удар героя") end /startattack /cancelaura Длань защиты
Пишу макросы и профили PQR
Моя подборка пве скриптов-ротаций 3.3.5
Сообщение # 2285 написано 09.05.2017 в 08:42
|
Не ну в принципе так даже лучше я думаю (только раскол убрать), только не работает почему то...
Добавлено (09.05.2017, 13:11)
Сообщение # 2288 написано 09.05.2017 в 13:11
|
Каст Вихрь, если Вихрь на кд, то каст Кровожадность, если Вихрь и Кровожадность на кд, и возможно применение Победный Раж, то каст Победный Раж если Вихрь и Кровожадность на кд, и применение способности Победный Раж невозможно, и возможно применить Казнь, то каст Казнь если Вихрь и Кровожадность на кд, и применение способности Победный Раж и Казнь невозможно, и прокнула способность Прилив Крови, то каст Мощный Удар. Слэм на личе кастуется? Все это должно происходить в каком стансе, фури, армс? или там денс между стойками должен быть?
Сообщение # 2289 написано 09.05.2017 в 14:03
|
Punisher45, В стойке Берсерка, переходов между стойками там нету, лич 3,3,5
Код local war = CreateFrame("Frame") war:SetScript("OnUpdate", function(_,e) if UnitExists("target") and UnitAffectingCombat("player") == 1 then local rage = UnitPower("player") if GetSpellCooldown("Âèõðü")==0 and rage >= 25 and IsSpellInRange("Êðîâîæàäíîñòü", "target")==1 then CastSpellByName("Âèõðü") end if GetSpellCooldown("Êðîâîæàäíîñòü")==0 and rage >= 20 and IsSpellInRange("Êðîâîæàäíîñòü", "target")==1 then CastSpellByName("Êðîâîæàäíîñòü") end if UnitBuff("player", "Ñîêðóøèòü!") and rage >= 15 and IsSpellInRange("Êðîâîæàäíîñòü", "target")==1 then CastSpellByName("Ìîùíûé óäàð") end if GetSpellCooldown("Ãåðîè÷åñêèé áðîñîê")==0 and IsSpellInRange("Êðîâîæàäíîñòü", "target")==1 then CastSpellByName("Ãåðîè÷åñêèé áðîñîê") end if GetSpellCooldown("Êàçíü") and IsUsableSpell("Êàçíü") and rage >= 15 and IsSpellInRange("Êàçíü", "target")==1 then CastSpellByName("Êàçíü") end if GetSpellCooldown("Ïîáåäíûé ðàæ") and IsUsableSpell("Ïîáåäíûé ðàæ") and IsSpellInRange("Ïîáåäíûé ðàæ", "target")==1 then CastSpellByName("Ïîáåäíûé ðàæ") end end end) Вот я что то пытался сделать, только как выставить приоритеты я хз |
local war = CreateFrame("Frame") war:SetScript("OnUpdate", function(_,e) if UnitExists("target") and UnitAffectingCombat("player") == 1 then local rage = UnitPower("player") if GetSpellCooldown("Âèõðü")==0 and rage >= 25 and IsSpellInRange("Êðîâîæàäíîñòü", "target")==1 then CastSpellByName("Âèõðü") end if GetSpellCooldown("Êðîâîæàäíîñòü")==0 and rage >= 20 and IsSpellInRange("Êðîâîæàäíîñòü", "target")==1 then CastSpellByName("Êðîâîæàäíîñòü") end if UnitBuff("player", "Ñîêðóøèòü!") and rage >= 15 and IsSpellInRange("Êðîâîæàäíîñòü", "target")==1 then CastSpellByName("Ìîùíûé óäàð") end if GetSpellCooldown("Ãåðîè÷åñêèé áðîñîê")==0 and IsSpellInRange("Êðîâîæàäíîñòü", "target")==1 then CastSpellByName("Ãåðîè÷åñêèé áðîñîê") end if GetSpellCooldown("Êàçíü") and IsUsableSpell("Êàçíü") and rage >= 15 and IsSpellInRange("Êàçíü", "target")==1 then CastSpellByName("Êàçíü") end if GetSpellCooldown("Ïîáåäíûé ðàæ") and IsUsableSpell("Ïîáåäíûé ðàæ") and IsSpellInRange("Ïîáåäíûé ðàæ", "target")==1 then CastSpellByName("Ïîáåäíûé ðàæ") end end end) Красиво кодировочка полетела) Ладно щас я накатаю скелет какой-нибудь, а ты потом сам под себя допишешь Добавлено (09.05.2017, 14:37) --------------------------------------------- Ну на, пробуй, по идее должно работать Код local war = CreateFrame("Frame") war:SetScript("OnUpdate", function(_,e) if UnitExists("target") and UnitAffectingCombat("player") == 1 and IsSpellInRange("Кровожадность", "target")==1 then local rage = UnitPower("player") if GetSpellCooldown("Вихрь") == 0 and rage >= 25 then CastSpellByName("Вихрь") elseif GetSpellCooldown("Вихрь") ~= 0 and rage >= 20 and GetSpellCooldown("Кровожадность") == 0 then CastSpellByName("Кровожадность") elseif GetSpellCooldown("Вихрь") ~= 0 and GetSpellCooldown("Кровожадность") ~= 0 and IsUsableSpell("Победный раж") and GetSpellCooldown("Победный раж") == 0 then CastSpellByName("Победный раж") elseif GetSpellCooldown("Вихрь") ~= 0 and GetSpellCooldown("Кровожадность") ~= 0 and not IsUsableSpell("Победный раж") and IsUsableSpell("Казнь") and rage >= 15 and GetSpellCooldown("Казнь") == 0 then CastSpellByName("Казнь") elseif GetSpellCooldown("Вихрь") ~= 0 and GetSpellCooldown("Кровожадность") ~= 0 and not IsUsableSpell("Победный раж") and not IsUsableSpell("Казнь") and UnitBuff("player","Прилив крови") and rage >= 15 and GetSpellCooldown("Мощный удар") == 0 then CastSpellByName("Мощный удар") end if GetSpellCooldown("Героический бросок")==0 then CastSpellByName("Героический бросок") end end end) |
Punisher45, Не, что-то не работает. Вообще. Ошибка интерфейсной операции, вызваная модификацией (в чате сообщение). Остальные скрипты рабоют.... Запустил на катаклизме (вотлк клиента нет и не было) все пашет Попробуй еще раз аккуратно скопировать код с форума и в настройках игры убрать галочку с "Ошибки сценариев луа" по пути Esc -> Интерфейс -> Помощь
Сообщение # 2293 написано 09.05.2017 в 15:12
|
Punisher45, Все работает шикарно) Спасибо большое) А еще вопрос-Реально как то скриптом определить сколько противников рядом? Что бы если 1 противник то кастовался Удар героя, а если больше то Рассекающий удар? У меня такая фишка была в боте короче, там он написан был на С# и там вся эта шляпа описывалась, для афли лока и масфира, то есть через оболочку этого бота такое было возможно, там если было больше 2 игроков то кастовался фир) Если честно я не уверен что внутри клиента используя одни функции апи можно что-то такое нарисовать, думаю чуваки поопытнее могут дать пару вариков
Сообщение # 2295 написано 09.05.2017 в 15:23
|
Количество врагов можно определить вот этим скриптом
/run local count = 0 for i = 0, 10000, 1 do if _G["NamePlate"..i] ~= nil and _G["NamePlate"..i]:IsVisible() then count = count + 1 end end print(count) Но он считает не только тех что рядом, но вообще всех которые есть в радиусе видимости.
Пишу макросы и профили PQR
Моя подборка пве скриптов-ротаций 3.3.5
Сообщение # 2296 написано 09.05.2017 в 15:31
|
Количество врагов можно определить вот этим скриптом/run local count = 0 for i = 0, 10000, 1 do if _G["NamePlate"..i] ~= nil and _G["NamePlate"..i]:IsVisible() then count = count + 1 end end print(count) Но он считает не только тех что рядом, но вообще всех которые есть в радиусе видимости. Код /run SetCVar("nameplateMaxDistance", 5)
reverse engineering your soul... балуюсь C++, C#, SQL, LUA. Владыка 1C. Окончательно забил на emuDev
Сообщение # 2298 написано 10.05.2017 в 05:50
|
сам не пробовал, т.к. не играю давно, но способы определить со спины или нет - есть
однако подозреваю, что GetPlayerMapPosition не сработает для враждебных целей, хотя я думаю это вполне себе патчится заменой одной-двух проверок в памяти клиента, и вряд ли кто-то в своем Вардене вообще догадается эти места проверять. Если сильно нужно то могу на досуге покопаться в отладчике.
reverse engineering your soul... балуюсь C++, C#, SQL, LUA. Владыка 1C. Окончательно забил на emuDev
|
Как раз по ссылке она есть. Там даже по теме потом далее люди обсуждали что этот скрипт полезен хилам которые хилят заклинаниями требующими смотреть на танка. Ну если совсем лениво искать то вот ещё один, даже куда более наглядный пример - клик сюда Насчет того что нельзя врагов проверить - это наверняка можно пропатчить... И как бы тут практически всё очевидно Клик сюда чтобы поглядеть (нам нужно по красной стрелке) . Я возможно бы даже встроил это в Гагарина, но некому интерфейс рисовать... К тому же Targetnearestdistance, как правило, выделяет цели впереди игрока по некоторой "дуге", могут выбираться цели и сбоку/сзади, но только если они очень близко. Лично мне этого хватало и тупо не заморачивался что-то ещё доделывать, т.к. 4 вара были на мультибоксе и бегали кружили вокруг цели как шпареные, на катаклизме отлично прокатывало. Раньше (до лич кинга) были специальные CVar отвечающие за дистанцию выделения целей табом и за его "окружность", возможно это до сих пор есть в клиенте, просто стало константой. В целом да, без изменения клиента неюзабельно...
reverse engineering your soul... балуюсь C++, C#, SQL, LUA. Владыка 1C. Окончательно забил на emuDev
|
function GetTargetsCount() local t,c,saveT = {},0,UnitGUID("target") for i = 1,1e3 do TargetNearestEnemy() local g = IsSpellInRange("Оглушить","target") == 1 and UnitGUID("target") if g and not t [g]then t [g]= true c = c+1 else t={} break end end if not saveT then ClearTarget() else for i = 1,c+1 do TargetNearestEnemy() local g = UnitGUID("target") if not g or g == saveT then break else ClearTarget() end end end return c Подскажи что такое for i = 1,1e3 do а именно 1e3 . Это какой-то период? И вообще где можно почитать луа именно по вову а не общий язык
Сообщение # 2304 написано 10.05.2017 в 17:25
|
в чтении памяти и с# я на нубском уровне, пытался научится, но после луа чета не идет. вообще много полезного можно добавить в апи, но не GetPlayerMapPosition("target"). зачем? чтобы в луа делать сложные расчеты? надо свои делать. где то я видел пример, как в апи добавляют функции, но найти не могу. чтобы добавлять в API нужно вносить немало изменений в клиент, я в своих читах избегаю писанины в память, поэтому не задавался таким вопросом, существующих API более чем достаточно, те что работают не так как нужно, всегда можно пропатчить... Например необходимый нам GetPlayerMapPosition() патчится заменой проверки в 0x5458FC на двухбайтовый NOP, т.е. 0x90 0x90 , либо делается JMP из 0x5458D7 в 0x5458FE. Разумеется если буду добавлять в Гагарин то там это без изменения клиента произойдет. В общем, после любого из двух вариантов изменений можно юзать и на target и вообще на что угодно, однако срабатывает только на игроках, возможно там ещё где-то намного глубже зашиты проверки, я не проверял дальше. Если чешутся руки протестить то быстрее всего будет в CheatEngine: А) выбираешь процесс, аттачишься, жмешь Memory View, жмешь CTRL+G, вводишь адрес 0x5458FC, правой кнопкой по найденной строке и ищешь строку Replace with code that does nothing (далее назовем как NOP), однако этот вариант лучше не юзать на серверах где админы не совсем бомжи, чтобы не уметь добавить новый адрес в варден, и к тому же не читают такие важные темы как эта :S Б) Второй вариант это вместо "NOP" нажать Change register at this location и в поле EIP ввести 0x5458FC, на вопрос про дебаггер подтвердить согласие. Для второго варианта лучше заранее убедиться что в настройках Cheat Engine в разделе Debugger Options выбраны именно Hardware Breakpoints... В игре проверяется через макрос /run print(GetPlayerMapPosition("target")) на вражеского героя или союзника вне группы.
reverse engineering your soul... балуюсь C++, C#, SQL, LUA. Владыка 1C. Окончательно забил на emuDev
|
Подскажи что такое for i = 1,1e3 do а именно 1e3 . Это какой-то период? И вообще где можно почитать луа именно по вову а не общий язык чтобы добавлять в API нужно вносить немало изменений в клиент, я в своих читах избегаю писанины в память, поэтому не задавался таким вопросом, существующих API более чем достаточно, те что работают не так как нужно, всегда можно пропатчить...Например необходимый нам GetPlayerMapPosition() патчится заменой проверки в 0x5458FC на двухбайтовый NOP, т.е. 0x90 0x90 , либо делается JMP из 0x5458D7 в 0x5458FE. Разумеется если буду добавлять в Гагарин то там это без изменения клиента произойдет. В общем, после любого из двух вариантов изменений можно юзать и на target и вообще на что угодно, однако срабатывает только на игроках, возможно там ещё где-то намного глубже зашиты проверки, я не проверял дальше. а если нужно поменять функцию так, что она не будет юзабельна в первоначальном виде? аддоны использующие её перестанут работать?
Сообщение # 2306 написано 10.05.2017 в 20:37
|
xGhostx, У меня пишет ошибку "A macro script has been blocked from an action only available to the Blizzard UI" на команду RunMacroText, СastSpellByName/Id и тд. Не под скажешь в чём проблема? Версия 3.3.5а гагарин использую как анлокер. Но всё равно не получается
Сообщение # 2307 написано 10.05.2017 в 21:07
|
Множество применений... как на арене, для вычислений не находится ли противник за колонной (заранее внести данные расположения всех колонн на каждой арене, разделять по MapID), придется знатно приложить математические усилия, но это того стоит; Для банальной проверки не находится ли цель за спиной, для кастеров очень полезно будет, особенно если взаимодействие с целью используется для преследования цели без участия игрока, при надобности развернуться, т.е. можно делать разворот без ожиданий всяких там ошибок "цель позади" и перехвата эвентов; Проверка на дальность до цели, максимально точная. Есть сомнения? У меня пишет ошибку "A macro script has been blocked from an action only available to the Blizzard UI" на команду RunMacroText, СastSpellByName/Id и тд. Не под скажешь в чём проблема? Версия 3.3.5а гагарин использую как анлокер. Но всё равно не получается Обычно требуется прописывать /reload интерфейса если анлокер был активирован после входа на персонажа. Этакая особенность используемого метода анлока LUA, зато он анлокает абсолютно все функции LUA и не ломает работу многих аддонов (правда аддоны не анлокает ровно по той же причине)
reverse engineering your soul... балуюсь C++, C#, SQL, LUA. Владыка 1C. Окончательно забил на emuDev
|
Множество применений... как на арене, для вычислений не находится ли противник за колонной (заранее внести данные расположения всех колонн на каждой арене, разделять по MapID), придется знатно приложить математические усилия, но это того стоит;Для банальной проверки не находится ли цель за спиной, для кастеров очень полезно будет, особенно если взаимодействие с целью используется для преследования цели без участия игрока, при надобности развернуться, т.е. можно делать разворот без ожиданий всяких там ошибок "цель позади" и перехвата эвентов; Проверка на дальность до цели, максимально точная. Есть сомнения? внутри этой функции юзается большая таблица карт с сеткой координат, берутся координаты юнитов, те что в гагарине юзаются для телепортации, и из них переделывается для конкретной карты. так вот нам не нужно их переделывать, нам и исходных бы хватило и даже больше, там есть Z, без которой во многих случиях не узнать находится ли чар за текстурами или нет. для проверки IsUnitVisible нужно отдельную функцию делать, в которой узнается у сервера, в клиенте это реализовано как одна из проверок. вообщем GetPlayerMapPosition() это отстой, её юзают только потому что других вариантов нету, но в нашем случае они есть!
Сообщение # 2309 написано 11.05.2017 в 12:53
|
GetPlayerMapPosition() это отстой, её юзают только потому что других вариантов нету, но в нашем случае они есть! Ну товарищ не ищет легких путей, у каждого свой подход) Добавлено (11.05.2017, 15:17) Это все замечательно, но если я просто прочитаю код, это не значит, что я пойму как он работает) Уйдет гораздо больше времени, чем по учебнику, но если его нет, значит нет
Сообщение # 2310 написано 11.05.2017 в 15:17
|
| |||