|
|
|
Поиск картинки в игре на MEmu |
|
|
PostByMik |
2.11.2020, 21:30
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Может кто знает как заставить данный код нажимать не на край найденной картинки, а в её центр, или, хотя бы не на край картинки. Код --lua local startX, startY, endX, endY = 0, 0, 830, 465 -- координаты поиска local path = [["C:\Caravan.bmp"]] -- путь к картинке, bmp 24 бита local arr, a = findimage (startX, startY, endX, endY, {path}, 2, 70, 1, 25) -- поиск картинки hint (a) -- результат поиска, подсказка в правом нижнем углу if arr then -- если найдена log ("Изображение найдено в координатах X= " .. arr[1][1] .. " Y= " .. arr[1][2]) kleft (arr[1][1], arr[1][2]) -- кликнули end
|
|
|
|
PostByMik |
3.11.2020, 9:09
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Ох! Спасибо огромное!
Еще хотел пару вопросов задать, но то по другим функциям. Стоит ли создавать отдельную тему?
К примеру, хотел поинтересоваться где вы черпаете функции, которые вы описываете. В основных источниках, типа wiki, таких функций нет.
Еще есть вопрос по слишком длинному коду, но повторяющимся в нем частях, можно ли повторяющуюся часть вынести, грубо говоря, в шапку и сделать к ней обращение с разных мест кода/циклов?
И еще пару такого рода вопросов.
Создать тему что-то типа "вопросы по функциям" или найти схожую старую тему и там начать писать свои вопросы?
|
|
|
|
cirus |
3.11.2020, 11:02
|
Elder
Сообщений: 3.480
Регистрация: 18.8.2014 Группа: Пользователи Наличность: 26708
Пользователь №: 16.971
Возраст: 29
|
Цитата где вы черпаете функции, которые вы описываете. Например какие? Цитата можно ли повторяющуюся часть вынести, грубо говоря, в шапку и сделать к ней обращение с разных мест кода/циклов? Не можно, а нужно. Код --lua log 'clear' log 'mode compact'
function MyFunc(text, x, y) -- функция принимающая 3 параметра -- тут нужные действия log(text) -- вывод в лог return x + y -- вернуть результат сложения end
local result = MyFunc('qwerty', 100, 20) -- вызов функции передавая ей 3 параметра log(result)
result = MyFunc('фыва', 10, 40) log(result)
MyFunc('asdf', 10, 40)
|
|
|
|
PostByMik |
3.11.2020, 14:49
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Простите, но я не очень понял как именно это использовать. Вот повторяющаяся часть кода, к ней нужно обращаться, когда выполнится заданное условие, например через if Код repeat --ДЛЯ PVP! if color(56, 401) == 51541 -- Если зеленый цвет, то кд прошел (НИЖНИЙ ЛЕВЫЙ) ДЛЯ PVP! then -- если в координатах цвет 51541 move_smooth (48, 403, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика ДЛЯ PVP! wait (250) --выжидаем паузу между действиями kleft (48, 403, 5, 5, 5, 5) --нажать левую кнопку в координатах ДЛЯ PVP! wait (650) end if color(109, 318) == 51541 -- Если зеленый цвет, то кд прошел (СНИЗУ ВТОРОЙ РЯД, ЛЕВЫЙ) ДЛЯ PVP! then -- если в координатах цвет 51541 move_smooth (103, 323, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика ДЛЯ PVP! wait (650) --выжидаем паузу между действиями kleft (103, 323, 5, 5, 5, 5) --нажать левую кнопку в координатах ДЛЯ PVP! wait (650) end if color(161, 319) == 51541 -- Если зеленый цвет, то кд прошел (СНИЗУ ВТОРОЙ РЯД, ПРАВЫЙ) ДЛЯ PVP! then -- если в координатах цвет 51541 move_smooth (151, 321, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика ДЛЯ PVP! wait (650) --выжидаем паузу между действиями kleft (151, 321, 5, 5, 5, 5) --нажать левую кнопку в координатах ДЛЯ PVP! wait (650) end if color(161, 234) == 51541 -- Если зеленый цвет, то кд прошел (СНИЗУ ТРЕТИЙ РЯД, ПРАВЫЙ) ДЛЯ PVP! then -- если в координатах цвет 51541 move_smooth (153, 234, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика ДЛЯ PVP! wait (650) --выжидаем паузу между действиями kleft (153, 234, 5, 5, 5, 5) --нажать левую кнопку в координатах ДЛЯ PVP! wait (650) end if color(51, 139) == 51541 -- Если зеленый цвет, то кд прошел (САМЫЙ ВЕРХНИЙ) ДЛЯ PVP! then -- если в координатах цвет 51541 move_smooth (43, 140, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика ДЛЯ PVP! wait (650) --выжидаем паузу между действиями kleft (43, 140, 5, 5, 5, 5) --нажать левую кнопку в координатах ДЛЯ PVP! wait (650) end until color(527, 421) == 51541 and color(364, 431) == 51541 -- Если зеленый цвет, то бой завершился
Подскажите, пожалуйста, на вашем примере, как это сделать. Грубо говоря, я не понимаю куда именно вставить часть кода, к которой надо обращаться время от времени. Цитата Например какие? Например Цитата function MyFunc
|
|
|
|
DarkMaster |
3.11.2020, 17:18
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27723
Пользователь №: 11.279
|
Есть у меня комбайн под подобные задачи. Работа расписана "для себя", если что-то не понятно - спрашивайте. Вообще для себя я считаю хорошим тоном держать отдельный массив со всеми проверками на цвет для упрощения модификации при необходимости и улучшения читаемости. Например: Спойлер
Код local fi = {} fi.down_left = function() -- Если зеленый цвет, то кд прошел (НИЖНИЙ ЛЕВЫЙ) ДЛЯ PVP! -- если цвет истинный, то возвращаем координаты в таблице -- аналогичной по структуре финдимиджу/финдколору return color(56, 401) == 51541 and {{56,401}} end
fi.down_2_left = function() -- Если зеленый цвет, то кд прошел (СНИЗУ ВТОРОЙ РЯД, ЛЕВЫЙ) ДЛЯ PVP! return color(109, 318) == 51541 and {{109, 318}} end
fi.down_2_right = function() -- Если зеленый цвет, то кд прошел (СНИЗУ ВТОРОЙ РЯД, ПРАВЫЙ) ДЛЯ PVP! return color(161, 319) == 51541 and {{161, 319}} end
fi.down_3_right = function() -- Если зеленый цвет, то кд прошел (СНИЗУ ТРЕТИЙ РЯД, ПРАВЫЙ) ДЛЯ PVP! return color(161, 234) == 51541 and {{161, 234}} end
fi.upper = function() -- Если зеленый цвет, то кд прошел (САМЫЙ ВЕРХНИЙ) ДЛЯ PVP! return color(51, 139) == 51541 and {{51, 139}} end
fi.combat_end_1 = function() -- Если зеленый цвет, то бой завершился return color(527, 421) == 51541 and color(364, 431) == 51541 end
-- Далее мой комбайн. -- Обычно я его подгружаю из отдельного файла, -- чтобы не было помойки. -- В нем нет move или move_smoth перед кликом, -- т.к. обычно это не нужно. -- Если все-таки в этом есть реальная необходимость, -- могу подправить. -- Данный комбайн имеет функцию проверки на -- успешность кликов и будет повторять попытки -- пока success_func не вернет истину или -- не выйдет допустимое время. -- Так же обращаю ваше внимание, -- что для кликов используется функция click. -- Этой функции в пилоте не существует и я ее -- задаю каждый раз в ручную для того, чтобы -- в случае необходимости изменить тип кликов -- не нужно было перелопачивать весь скрипт и везде -- править left на kleft или еще какие-нибудь варианты. local click = kleft -- теперь у нас click тоже саме, что и kleft -- а можно сделать что-то свое. -- в частности у вас использует move_smoth и мы можем -- включить данные перемещения в вызов каждого клика: click = function(x,y) move_smoth(x,y,5,5,5,5) wait(250) kleft(x,y,5,5,5,5) end
-- Очень настоятельно рекомендую -- делать проверки на успех всех кликов. -- У вас нет проверок на успех клика, -- возможно они вам просто не нужны, -- тем не менее у меня они требуются. -- создаем функцию - заглушку, которая -- будет всегда возвращать истину: local true_func = function() return true end
-- Сообственно описание параметров комбайна. -- Синтаксис: --function( -- click_x, click_y, success_func, click_timeout, -- delay, first_delay, blink, limit, -- offset_x, offset_y, override_x, override_y)
-- Функция нажимает в координаты click_x, click_y -- click_x, click_y могут быть заданы сделедующими способами: -- 1) -- click_x - функция возвращающая массив кооринат (findimage/findcolor) -- click_y - Комментарий при фейле поиска либо -- НЕ указывается. Даже nil, параметр пропускается. -- При передаче функции - она будет вызываться каждый раз -- перед попыткой кликнуть, чтобы избежать клика в изменившийся интерфейс. -- 2) -- click_x - массив кооринат (findimage/findcolor) -- click_y - НЕ указывается. Даже nil, параметр пропускается. -- 3) -- click_x - x координата -- click_y - y координата
-- success_func - функция проверки успеха. -- Пока не вернет успех будут попытки кликов. -- Так же может быть задана массивом функций. -- Время попыток может быть ограничено параметром limit.
-- click_timeout - таймер для повторной попытки клика. -- Не влияет на проверки успеха результата. -- Необязательный параметр. Значение по умолчанию 2сек.
-- delay - задержка в мс перед проверкой успеха. -- необязательный параметр. Значение по умолчанию 100мс.
-- first_delay - задержка после _первого_ клика перед началом -- проверок на успех, повторных кликов. -- Необязательный параметр. Значение по умлчанию равно параметру delay * 5.
-- blink - задержка в мс перед повторной проверкой на успешность. -- исключает случаи выхватывания изображения из недогрузившегося окна. -- для выключения проверки используется nil. -- необязательный параметр. Значение по умолчанию nil.
-- limit - ограничение времени (сек) на поиск. -- для одноразвого прогона использовать 0. -- nil - бесконечный поиск. -- необязательный параметр. Значение по умолчанию nil(бесконечно).
-- offset_x, offset_y - смещения координат клика используется, -- если click_x задан функцией. -- Необязательный параметр. По умолчанию nil.
-- override_x, override_y - перезапись координат клика используется, -- если click_x задан функцией. -- Если задан override, то offset игнорируется. -- Необязательный параметр. По умолчанию nil.
local open_with_check = function( click_x, click_y, success_func, click_timeout, delay, first_delay, blink, limit, offset_x, offset_y, override_x, override_y) local x,y
if type(click_x) == "function" then -- координаты клика заданы функцией -- смещаем параметры на 1 позицию вправо. if type(click_y) == "function" or type(click_y) == "table" then override_y = override_x override_x = offset_y offset_y = offset_x offset_x = limit limit = blink blink = first_delay first_delay = delay or (click_timeout or 100) * 5 delay = click_timeout or 100 click_timeout = success_func or 2 success_func = type(click_y)=="function" and {click_y} or click_y end -- click_y содержит комментарий к функции click_timeout = click_timeout or 2 delay = delay or 100 first_delay = first_delay or delay success_func = type(success_func)=="function" and {success_func} or success_func
elseif type(click_x) == "table" then -- координата клика задана массивом -- смещаем параметры на 1 позицию вправо. override_y = override_x override_x = offset_y offset_y = offset_x offset_x = limit limit = blink blink = first_delay first_delay = delay or (click_timeout or 100) * 5 delay = click_timeout or 100 click_timeout = success_func or 2 success_func = type(click_y)=="function" and {click_y} or click_y y = click_x[1][2] x = click_x[1][1]
else -- координата клика задана двумя переменными click_timeout = click_timeout or 2 delay = delay or 100 first_delay = first_delay or delay * 5 success_func = type(success_func)=="function" and {success_func} or success_func x = click_x y = click_y end
--[[log(tostring(click_x), tostring(click_y), tostring(success_func), tostring(click_timeout), "\r\n", delay, first_delay, blink, limit, "\r\n", offset_x, offset_y, override_x, override_y) ]]
local next_click_timeout = 0 local limit_timeout = limit and os.clock() + limit local first_run = true local success = false repeat local clock = os.clock() if type(click_x) == "function" then local result = click_x() if result then x = result[1][1] y = result[1][2] if next_click_timeout < clock then if override_x then x = override_x y = override_y elseif offset_x then x = x + offset_x y = y + offset_y end click(x,y) next_click_timeout = clock + click_timeout end else if type(click_y) == "string" then log(click_y) end end else if next_click_timeout < clock then click(x,y) next_click_timeout = clock + click_timeout end end
if first_run then first_run = false wait(first_delay) else wait(delay) end
for i = 1, #success_func do success = success_func[i]() if success then break end end until success or (limit_timeout and limit_timeout < os.clock())
--log("check: " .. tostring(success and true or false)) return success and true or false end
-- соответственно ваш код при использовании данной функции принимает следуещий вид:
repeat -- ДЛЯ PVP! open_with_check(fi.down_left, true_func, 0, 0, nil, 0) open_with_check(fi.down_2_left, true_func, 0, 0, nil, 0) open_with_check(fi.down_2_right, true_func, 0, 0, nil, 0) open_with_check(fi.down_3_right, true_func, 0, 0, nil, 0) open_with_check(fi.upper, true_func, 0, 0, nil, 0) until fi.combat_end_1() -- Если зеленый цвет, то бой завершился
В самом примитивном примере это будет выглять, как: Код local my_func = function(i) log("мы получилив функцию значение "..i..", прилепили к нему текст вывели в лог.") end
for i = 1, 5 do my_func(i) end
Сообщение отредактировал DarkMaster - 3.11.2020, 17:26
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
PostByMik |
3.11.2020, 20:07
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Апд. Как я понял, при помощи function можно создать запись, дать ей имя и потом к ней просто обращаться. Но правильно ли вот такое: Код repeat if color(121, 403) == 51541 -- Если зеленый цвет, то кд прошел (НИЖНИЙ ЛЕВЫЙ) then -- если в координатах цвет 51541 move_smooth (121, 403, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика wait (250) --выжидаем паузу между действиями kleft (121, 403, 5, 5, 5, 5) --нажать левую кнопку в координатах wait (650) if color(584, 397) == 16777215 and color(577, 433) == 16777215 -- Если в двух точках цвет белый, то умению нужно указать область then -- если в координатах цвет 16777215, то умение будет применено к крайней точке от башни move_smooth (632, 437, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика wait (650) --выжидаем паузу между действиями kleft (632, 437, 5, 5, 5, 5) --нажимаем место применения умение wait (650) end end if color(172, 320) == 51541 -- Если зеленый цвет, то кд прошел (СНИЗУ ВТОРОЙ РЯД, ЛЕВЫЙ) then -- если в координатах цвет 51541 move_smooth (172, 320, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика wait (650) --выжидаем паузу между действиями kleft (172, 320, 5, 5, 5, 5) --нажать левую кнопку в координатах wait (650) if color(584, 397) == 16777215 and color(577, 433) == 16777215 -- Если в двух точках цвет белый, то умению нужно указать область then -- если в координатах цвет 16777215, то умение будет применено к крайней точке от башни move_smooth (632, 437, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика wait (650) --выжидаем паузу между действиями kleft (632, 437, 5, 5, 5, 5) --нажимаем место применения умение wait (650) end end if color(223, 320) == 51541 -- Если зеленый цвет, то кд прошел (СНИЗУ ВТОРОЙ РЯД, ПРАВЫЙ) then -- если в координатах цвет 51541 move_smooth (223, 320, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика wait (650) --выжидаем паузу между действиями kleft (223, 320, 5, 5, 5, 5) --нажать левую кнопку в координатах wait (650) if color(584, 397) == 16777215 and color(577, 433) == 16777215 -- Если в двух точках цвет белый, то умению нужно указать область then -- если в координатах цвет 16777215, то умение будет применено к крайней точке от башни move_smooth (632, 437, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика wait (650) --выжидаем паузу между действиями kleft (632, 437, 5, 5, 5, 5) --нажимаем место применения умение wait (650) end end if color(224, 234) == 51541 -- Если зеленый цвет, то кд прошел (СНИЗУ ТРЕТИЙ РЯД, ПРАВЫЙ) then -- если в координатах цвет 51541 move_smooth (224, 234, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика wait (650) --выжидаем паузу между действиями kleft (224, 234, 5, 5, 5, 5) --нажать левую кнопку в координатах wait (650) if color(584, 397) == 16777215 and color(577, 433) == 16777215 -- Если в двух точках цвет белый, то умению нужно указать область then -- если в координатах цвет 16777215, то умение будет применено к крайней точке от башни move_smooth (632, 437, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика wait (650) --выжидаем паузу между действиями kleft (632, 437, 5, 5, 5, 5) --нажимаем место применения умение wait (650) end end if color(172, 235) == 51541 -- Если зеленый цвет, то кд прошел (СНИЗУ ТРЕТИЙ РЯД, ЛЕВЫЙ) then -- если в координатах цвет 51541 move_smooth (162, 237, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика wait (250) --выжидаем паузу между действиями kleft (162, 237, 5, 5, 5, 5) --нажать левую кнопку в координатах wait (650) if color(584, 397) == 16777215 and color(577, 433) == 16777215 -- Если в двух точках цвет белый, то умению нужно указать область then -- если в координатах цвет 16777215, то умение будет применено к крайней точке от башни move_smooth (632, 437, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика wait (650) --выжидаем паузу между действиями kleft (632, 437, 5, 5, 5, 5) --нажимаем место применения умение wait (650) end end until color(530, 426) == 51541 and color(346, 420) == 51541 -- Если зеленый цвет, то бой завершился
новый варинат Код function pvp(num1, x, y, x1, y1, num2, x2, y2, x3, y3, x4, y4) if color(x, y) == num1 -- Если зеленый цвет, то кд прошел (СНИЗУ ТРЕТИЙ РЯД, ЛЕВЫЙ) then -- если в координатах цвет num1 move_smooth (x1, y1, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика wait (250) --выжидаем паузу между действиями kleft (x1, y1, 5, 5, 5, 5) --нажать левую кнопку в координатах wait (650) if color(x2, y2) == num2 and color(x3, y3) == num2 -- Если в двух точках цвет белый, то умению нужно указать область then -- если в координатах цвет num2, то умение будет применено к крайней точке от башни move_smooth (x4, y4, 5, 5, 5, 5) --перемещаем курсор в точку последующего клика wait (650) --выжидаем паузу между действиями kleft (x4, y4, 5, 5, 5, 5) --нажимаем место применения умение wait (650) end end end
repeat pvp (51541, 121, 403, 121, 403, 16777215, 577, 433, 584, 397, 632, 437) pvp (51541, 172, 320, 172, 320, 16777215, 584, 397, 577, 433, 632, 437) -- и так далее до until color(530, 426) == 51541 and color(346, 420) == 51541 -- Если зеленый цвет, то бой завершился
Или я что-то не так понял? Цитата Есть у меня комбайн Спасибо! Буду смотреть и разбираться.
|
|
|
|
DarkMaster |
3.11.2020, 20:52
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27723
Пользователь №: 11.279
|
Цитата pvp (51541, 121, 403, 121, 403, 16777215, 577, 433, 584, 397, 632, 437) Завтра утром ты не вспомнишь, что это за набор магических чисел) В частности поэтому настоятельно рекомендую все координаты/цвета реализовывать именно в виде отдельного массива функций (fi в моем коде выше).
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
PostByMik |
3.11.2020, 21:21
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Цитата Завтра утром ты не вспомнишь, что это за набор магических чисел) Да понятное дело, что твой код крутой, но я же должен дорасти. Вот первый шаг сделал в понимании. А еще, я даже не знал, что можно проверить был ли клик удачным. Вот про такие функции я и спрашиваю. Где их черпать, где почитать?
|
|
|
|
PostByMik |
3.11.2020, 21:31
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Цитата -- click_x, click_y, success_func, click_timeout, -- delay, first_delay, blink, limit, -- offset_x, offset_y, override_x, override_y) вот где почитать про все эти функции, ну кроме клик, понимаю что это название от описанного Вами кода. Нашел. Простите)
|
|
|
|
PostByMik |
3.11.2020, 21:59
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Цитата это не функции. Это имена параметров функции. Ну где описано вы нашли (выше в коде) Да, написал выше, что не углядел сразу) Спасибо!
|
|
|
|
PostByMik |
4.11.2020, 11:21
|
Neophyte
Сообщений: 47
Регистрация: 19.10.2020 Группа: Пользователи Наличность: 0
Пользователь №: 19.780
Возраст: 40
|
Цитата success_func Так и не смог понять как у Вас реализован функционал проверки удачного клика. Цитата Т.е. вы можете проверить, что скил ушел в кд основываясь на его цвете.
Не всегда такое возможно. Например, иногда, у умения есть необходимость после нажатия на умение (№1) указать область воздействия (№2). И пока (№2) не будет "кликнут" (№1) не исчезнет, т.е. будет доступен. В какой-то момент подумал, что есть возможность получить какие-то системные данные об удачности клика)
|
|
|
|
Cockney |
4.11.2020, 13:44
|
Master
Сообщений: 1.395
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 21062
Пользователь №: 16.156
|
Цитата(DarkMaster @ 3.11.2020, 17:18) Есть у меня комбайн под подобные задачи. Работа расписана "для себя", если что-то не понятно - спрашивайте. Вообще для себя я считаю хорошим тоном держать отдельный массив со всеми проверками на цвет для упрощения модификации при необходимости и улучшения читаемости. Например: Спойлер
Код local fi = {} fi.down_left = function() -- Если зеленый цвет, то кд прошел (НИЖНИЙ ЛЕВЫЙ) ДЛЯ PVP! -- если цвет истинный, то возвращаем координаты в таблице -- аналогичной по структуре финдимиджу/финдколору return color(56, 401) == 51541 and {{56,401}} end
fi.down_2_left = function() -- Если зеленый цвет, то кд прошел (СНИЗУ ВТОРОЙ РЯД, ЛЕВЫЙ) ДЛЯ PVP! return color(109, 318) == 51541 and {{109, 318}} end
fi.down_2_right = function() -- Если зеленый цвет, то кд прошел (СНИЗУ ВТОРОЙ РЯД, ПРАВЫЙ) ДЛЯ PVP! return color(161, 319) == 51541 and {{161, 319}} end
fi.down_3_right = function() -- Если зеленый цвет, то кд прошел (СНИЗУ ТРЕТИЙ РЯД, ПРАВЫЙ) ДЛЯ PVP! return color(161, 234) == 51541 and {{161, 234}} end
fi.upper = function() -- Если зеленый цвет, то кд прошел (САМЫЙ ВЕРХНИЙ) ДЛЯ PVP! return color(51, 139) == 51541 and {{51, 139}} end
fi.combat_end_1 = function() -- Если зеленый цвет, то бой завершился return color(527, 421) == 51541 and color(364, 431) == 51541 end -- Далее мой комбайн. -- Обычно я его подгружаю из отдельного файла, -- чтобы не было помойки. -- В нем нет move или move_smoth перед кликом, -- т.к. обычно это не нужно. -- Если все-таки в этом есть реальная необходимость, -- могу подправить. -- Данный комбайн имеет функцию проверки на -- успешность кликов и будет повторять попытки -- пока success_func не вернет истину или -- не выйдет допустимое время. -- Так же обращаю ваше внимание, -- что для кликов используется функция click. -- Этой функции в пилоте не существует и я ее -- задаю каждый раз в ручную для того, чтобы -- в случае необходимости изменить тип кликов -- не нужно было перелопачивать весь скрипт и везде -- править left на kleft или еще какие-нибудь варианты. local click = kleft -- теперь у нас click тоже саме, что и kleft -- а можно сделать что-то свое. -- в частности у вас использует move_smoth и мы можем -- включить данные перемещения в вызов каждого клика: click = function(x,y) move_smoth(x,y,5,5,5,5) wait(250) kleft(x,y,5,5,5,5) end
-- Очень настоятельно рекомендую -- делать проверки на успех всех кликов. -- У вас нет проверок на успех клика, -- возможно они вам просто не нужны, -- тем не менее у меня они требуются. -- создаем функцию - заглушку, которая -- будет всегда возвращать истину: local true_func = function() return true end
-- Сообственно описание параметров комбайна. -- Синтаксис: --function( -- click_x, click_y, success_func, click_timeout, -- delay, first_delay, blink, limit, -- offset_x, offset_y, override_x, override_y)
-- Функция нажимает в координаты click_x, click_y -- click_x, click_y могут быть заданы сделедующими способами: -- 1) -- click_x - функция возвращающая массив кооринат (findimage/findcolor) -- click_y - Комментарий при фейле поиска либо -- НЕ указывается. Даже nil, параметр пропускается. -- При передаче функции - она будет вызываться каждый раз -- перед попыткой кликнуть, чтобы избежать клика в изменившийся интерфейс. -- 2) -- click_x - массив кооринат (findimage/findcolor) -- click_y - НЕ указывается. Даже nil, параметр пропускается. -- 3) -- click_x - x координата -- click_y - y координата
-- success_func - функция проверки успеха. -- Пока не вернет успех будут попытки кликов. -- Так же может быть задана массивом функций. -- Время попыток может быть ограничено параметром limit.
-- click_timeout - таймер для повторной попытки клика. -- Не влияет на проверки успеха результата. -- Необязательный параметр. Значение по умолчанию 2сек.
-- delay - задержка в мс перед проверкой успеха. -- необязательный параметр. Значение по умолчанию 100мс.
-- first_delay - задержка после _первого_ клика перед началом -- проверок на успех, повторных кликов. -- Необязательный параметр. Значение по умлчанию равно параметру delay * 5.
-- blink - задержка в мс перед повторной проверкой на успешность. -- исключает случаи выхватывания изображения из недогрузившегося окна. -- для выключения проверки используется nil. -- необязательный параметр. Значение по умолчанию nil.
-- limit - ограничение времени (сек) на поиск. -- для одноразвого прогона использовать 0. -- nil - бесконечный поиск. -- необязательный параметр. Значение по умолчанию nil(бесконечно).
-- offset_x, offset_y - смещения координат клика используется, -- если click_x задан функцией. -- Необязательный параметр. По умолчанию nil.
-- override_x, override_y - перезапись координат клика используется, -- если click_x задан функцией. -- Если задан override, то offset игнорируется. -- Необязательный параметр. По умолчанию nil.
local open_with_check = function( click_x, click_y, success_func, click_timeout, delay, first_delay, blink, limit, offset_x, offset_y, override_x, override_y) local x,y
if type(click_x) == "function" then -- координаты клика заданы функцией -- смещаем параметры на 1 позицию вправо. if type(click_y) == "function" or type(click_y) == "table" then override_y = override_x override_x = offset_y offset_y = offset_x offset_x = limit limit = blink blink = first_delay first_delay = delay or (click_timeout or 100) * 5 delay = click_timeout or 100 click_timeout = success_func or 2 success_func = type(click_y)=="function" and {click_y} or click_y end -- click_y содержит комментарий к функции click_timeout = click_timeout or 2 delay = delay or 100 first_delay = first_delay or delay success_func = type(success_func)=="function" and {success_func} or success_func
elseif type(click_x) == "table" then -- координата клика задана массивом -- смещаем параметры на 1 позицию вправо. override_y = override_x override_x = offset_y offset_y = offset_x offset_x = limit limit = blink blink = first_delay first_delay = delay or (click_timeout or 100) * 5 delay = click_timeout or 100 click_timeout = success_func or 2 success_func = type(click_y)=="function" and {click_y} or click_y y = click_x[1][2] x = click_x[1][1]
else -- координата клика задана двумя переменными click_timeout = click_timeout or 2 delay = delay or 100 first_delay = first_delay or delay * 5 success_func = type(success_func)=="function" and {success_func} or success_func x = click_x y = click_y end
--[[log(tostring(click_x), tostring(click_y), tostring(success_func), tostring(click_timeout), "\r\n", delay, first_delay, blink, limit, "\r\n", offset_x, offset_y, override_x, override_y) ]] local next_click_timeout = 0 local limit_timeout = limit and os.clock() + limit local first_run = true local success = false repeat local clock = os.clock() if type(click_x) == "function" then local result = click_x() if result then x = result[1][1] y = result[1][2] if next_click_timeout < clock then if override_x then x = override_x y = override_y elseif offset_x then x = x + offset_x y = y + offset_y end click(x,y) next_click_timeout = clock + click_timeout end else if type(click_y) == "string" then log(click_y) end end else if next_click_timeout < clock then click(x,y) next_click_timeout = clock + click_timeout end end
if first_run then first_run = false wait(first_delay) else wait(delay) end for i = 1, #success_func do success = success_func[i]() if success then break end end until success or (limit_timeout and limit_timeout < os.clock())
--log("check: " .. tostring(success and true or false)) return success and true or false end -- соответственно ваш код при использовании данной функции принимает следуещий вид: repeat -- ДЛЯ PVP! open_with_check(fi.down_left, true_func, 0, 0, nil, 0) open_with_check(fi.down_2_left, true_func, 0, 0, nil, 0) open_with_check(fi.down_2_right, true_func, 0, 0, nil, 0) open_with_check(fi.down_3_right, true_func, 0, 0, nil, 0) open_with_check(fi.upper, true_func, 0, 0, nil, 0) until fi.combat_end_1() -- Если зеленый цвет, то бой завершился
В самом примитивном примере это будет выглять, как: Код local my_func = function(i) log("мы получилив функцию значение "..i..", прилепили к нему текст вывели в лог.") end
for i = 1, 5 do my_func(i) end
Интересный подход. А были попытки сериализации таких функций-проверок в массив байт/файл с последующим восстановлением на клиентской стороне через tcp, как например в джаве или .нет ? Механизм многообещающий же.
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|