Здравствуйте, гость ( Вход | Регистрация )

4 страниц V < 1 2 3 4 >  
Ответить в эту темуОткрыть новую тему
> Поиск картинки в игре на MEmu
PostByMik
сообщение 27.10.2020, 17:47
Сообщение #21


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Всем спасибо за помощь!

В итоге, для меня легче напрямую указать координаты кликов с проверкой по цвету.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 2.11.2020, 21:30
Сообщение #22


**

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

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 2.11.2020, 21:54
Сообщение #23


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Код
kleft (arr[1][1] + 10, arr[1][2] + 10)

самый примитивный вариант. Вообще можно и центр взять т.к. у нас в arr падают и конечные координаты, но оно надо?


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 3.11.2020, 1:37
Сообщение #24


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26708
Пользователь №: 16.971
Возраст: 29



Цитата
а в её центр

Код
kleft (arr[1][1] + math.floor((arr[1][3] - arr[1][1]) / 2), arr[1][2] + math.floor((arr[1][4] - arr[1][2]) / 2))
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 3.11.2020, 2:21
Сообщение #25


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



тогда уж:
Код
kleft (math.floor((arr[1][1] + arr[1][3]) / 2), math.floor((arr[1][2] + arr[1][4]) / 2))


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 3.11.2020, 9:09
Сообщение #26


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Ох! Спасибо огромное!

Еще хотел пару вопросов задать, но то по другим функциям. Стоит ли создавать отдельную тему?

К примеру, хотел поинтересоваться где вы черпаете функции, которые вы описываете. В основных источниках, типа wiki, таких функций нет.

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

И еще пару такого рода вопросов.

Создать тему что-то типа "вопросы по функциям" или найти схожую старую тему и там начать писать свои вопросы?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 3.11.2020, 11:02
Сообщение #27


**********

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)
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 3.11.2020, 14:49
Сообщение #28


**

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

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 3.11.2020, 17:18
Сообщение #29


***********

Модератор 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____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 3.11.2020, 20:07
Сообщение #30


**

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 -- Если зеленый цвет, то бой завершился


Или я что-то не так понял?


Цитата
Есть у меня комбайн

Спасибо! Буду смотреть и разбираться.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 3.11.2020, 20:30
Сообщение #31


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Апд.

Проверил, работает! )
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 3.11.2020, 20:52
Сообщение #32


***********

Модератор 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____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 3.11.2020, 21:21
Сообщение #33


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Цитата
Завтра утром ты не вспомнишь, что это за набор магических чисел)

Да понятное дело, что твой код крутой, но я же должен дорасти. Вот первый шаг сделал в понимании.

А еще, я даже не знал, что можно проверить был ли клик удачным. Вот про такие функции я и спрашиваю. Где их черпать, где почитать?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 3.11.2020, 21:31
Сообщение #34


**

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)

вот где почитать про все эти функции, ну кроме клик, понимаю что это название от описанного Вами кода.

Нашел. Простите)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 3.11.2020, 21:50
Сообщение #35


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Цитата
вот где почитать про все эти функции

это не функции. Это имена параметров функции. Ну где описано вы нашли (выше в коде)

Цитата
А еще, я даже не знал, что можно проверить был ли клик удачным

Проверить точно так же, как вы проверяете доступность скила. Т.е. вы можете проверить, что скил ушел в кд основываясь на его цвете.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 3.11.2020, 21:59
Сообщение #36


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Цитата
это не функции. Это имена параметров функции. Ну где описано вы нашли (выше в коде)

Да, написал выше, что не углядел сразу)
Спасибо!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
PostByMik
сообщение 4.11.2020, 11:21
Сообщение #37


**

Neophyte
Сообщений: 47
Регистрация: 19.10.2020
Группа: Пользователи
Наличность: 0
Пользователь №: 19.780
Возраст: 40



Цитата
success_func

Так и не смог понять как у Вас реализован функционал проверки удачного клика.

Цитата
Т.е. вы можете проверить, что скил ушел в кд основываясь на его цвете.

Не всегда такое возможно. Например, иногда, у умения есть необходимость после нажатия на умение (№1) указать область воздействия (№2). И пока (№2) не будет "кликнут" (№1) не исчезнет, т.е. будет доступен.

В какой-то момент подумал, что есть возможность получить какие-то системные данные об удачности клика)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Cockney
сообщение 4.11.2020, 13:44
Сообщение #38


********

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, как например в джаве или .нет ? Механизм многообещающий же.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 4.11.2020, 17:52
Сообщение #39


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Цитата
Интересный подход. А были попытки сериализации таких функций-проверок в массив байт/файл с последующим восстановлением на клиентской стороне через tcp, как например в джаве или .нет ? Механизм многообещающий же.

Были еще до этого комбайна - работает. Тут правда есть некоторые ограничения. "На лету" байт-код не подгружается, нужено темп файлик либо передавать чистым стрингом. Это ограничение связано с версией луа. В 5.2 или 5.3 такой проблемы нет, но luaJIT это нечто среднее между 5.1 и 5.2.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 4.11.2020, 20:42
Сообщение #40


***********

Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27723
Пользователь №: 11.279



Цитата

Так и не смог понять как у Вас реализован функционал проверки удачного клика.

В конкретно этом случае - никак. Это просто заглушка. Нужно писать проверку аналогичную другим колорам из шапки.
Цитата
В какой-то момент подумал, что есть возможность получить какие-то системные данные об удачности клика)

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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

4 страниц V < 1 2 3 4 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 26.4.2024, 3:01
Designed by Nickostyle