Скрипт позволяет находить объекты различной формы по нескольким цветам.
Файл с функцией распаковать и положить рядом с exe пилота.
find = {0, 0, 1920, 1080, -- координаты поиска (через запятую можно указать шаг поиска, если требуется, по умолчанию шаг 1 1)
radius = 10, -- радиус разброса пикселей
min_pixel_count = 15, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {63232, 4727553, 10213092}, -- цвет или несколько цветов
min_pixel_color = {0, 0, 0}, -- минимально количество пикселей каждого цвета (необязательный параметр, по умолчанию 0)
deviation = {2, 0, 1}, -- погрешность оттенка для каждого цвета (необязательный параметр, по умолчанию 0)
min_color = 2} -- минимальное количество цветов, которые должны присутствовать в группе
find = {0, 0, 1920, 1080,
x = 10, y = 15, deltaX = 0, -- размер искомого объекта и смещение области поиска (необязательный параметр)
min_pixel_count = 15, max_pixel_count = 1000,
color = {63232, "84235-86027", "R(11)+G(73-80)+B(1)"},
min_pixel_color = {0, 0, 0},
deviation = {2, 0, 1},
min_color = 2}
КоординатаX КоординатаY Всего_пикселей в группе_1 Количество_пикселей_первого_цвета Второго_цвета и т. д
КоординатаX КоординатаY Всего_пикселей в группе_2 Количество_пикселей_первого_цвета Второго_цвета и т. д
--lua
require("find_heap_pixel") -- загрузка функции
-- таблица с параметрами поиска
local find = {0, 0, 1920, 1080, -- координаты поиска
radius = 10, -- радиус разброса пикселей
min_pixel_count = 15, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {63232}, -- цвет или несколько цветов
min_pixel_color = {0}, -- минимально количество пикселей каждого цвета
deviation = {2}, -- погрешность оттенка для каждого цвета
min_color = 1} -- минимальное количество цветов, которые должны присутствовать в группе
log ("clear") log ("mode compact") log ("open", 0, 700, 400, 300)
time = os.clock()
local a, group = find_heap_pixel(find) -- вызов функции
log ("Всего найдено пикселей: " .. a)
log ("Затрачено времени: " .. string.format("%.3f", os.clock() - time) .. " мсек")
if group then
for i = 1, #group do
log (i .. " " .. table.concat(group[i], " ", 1, 2))
move (group[i][1], group[i][2])
wait (500)
end
end
--lua
require("find_heap_pixel")
local find = {0, 0, 1920, 1080,
radius = 50,
min_pixel_count = 20, max_pixel_count = 1000,
color = {3289082},
min_pixel_color = {0},
deviation = {1},
min_color = 1}
local find2 = {0, 0, 1920, 1080,
radius = 50,
min_pixel_count = 10, max_pixel_count = 100,
color = {16183289, 11762371},
deviation = {1, 1},
min_color = 1}
log ("clear") log ("mode compact") log ("open", 0, 700, 400, 300)
time = os.clock()
local a, group = find_heap_pixel(find)
log ("Всего найдено пикселей: " .. a)
log ("Затрачено времени: " .. string.format("%.3f", os.clock() - time) .. " мсек")
if group then
for i = 1, #group do
log (i .. " " .. table.concat(group[i], " ", 1, 2))
move (group[i][1], group[i][2])
wait (500)
end
end
time = os.clock()
local b, group2 = find_heap_pixel(find2)
log ("Всего найдено пикселей: " .. b)
log ("Затрачено времени: " .. string.format("%.3f", os.clock() - time) .. " мсек")
if group2 then
for i = 1, #group2 do
log (i .. " " .. table.concat(group2[i], " ", 1, 2))
move (group2[i][1], group2[i][2])
wait (500)
end
end
--lua
require("find_heap_pixel")
local find = {0, 0, 1920, 1080,
radius = 45,
min_pixel_count = 50, max_pixel_count = 1000,
color = {7590904, 14870765},
min_pixel_color = {0, 0},
deviation = {2,2},
min_color = 2}
log ("clear") log ("mode compact") log ("open", 0, 700, 400, 300)
time = os.clock()
local a, group = find_heap_pixel(find)
log ("Всего найдено пикселей: " .. a)
log ("Затрачено времени: " .. string.format("%.3f", os.clock() - time) .. " мсек")
if group then
for i = 1, #group do
log ("Группа " .. i .. ", Координаты: " .. table.concat(group[i], " ", 1, 2) .. ", Пикселей в группе: " .. group[i][3])
move (group[i][1], group[i][2])
wait (500)
end
end
set #r2 40 //радиус разброса точек
set #min 3 //минимальное количество всех пикселей в группе
set #max 500 //максимальное количество всех пикселей в группе
init_arr %xy (1) 0 0 1920 1080 //область поиска
init_arr %color (1) 3466222 7138805 2209471 3399657 //цвета для поиска (от 1 до 5 цветов)
init_arr %m (1) 0 0 0 0 0 //минимальное количество пикселей каждого цвета с учётом % отклонения (всегда должно быть 5 чисел)
init_arr %deviat (1) 1 1 1 1 0 // % отклонения для каждого цвета (всегда должно быть 5 чисел)
set #mincol 2 //минимальное количество любого из указанных цветов (от 1 до 5)
set #timeproc 0 // время для поиска, если 0 не выйдет из процедуры пока не найдётся хотя бы 1 цвет
set linedelay 0
log mode compact
while 1 = 1
log clear
set size(%result) // уничтожить массив с прошлыми результатами поиска
call heap %xy %color %m %deviat #r2 #min #max #mincol #timeproc
if size(%result) > 0 // если найдено хотя бы 1 группа
//save_array %result C:\resultarray.txt // массив с результатами поиска
log Всего найдено size(%result) групп из #pixel пикселей.
log
for #i 1 size(%result)
log Группа #i --- из %result [#i 3] пикселей %result [#i 4] %result [#i 5] %result [#i 6] %result [#i 7] %result [#i 8]
log Начальные координаты группы: %result [#i 1] %result [#i 2]
log
end_for
// Вывод в hint (можно убрать), если рабочее окно находится не в левом верхнем углу монитора будет отображать со смещением
set #timeout 1000 // сколько времени отображать hint
call hint %result size(%result) #size1 #group #timeout
set #group 0
set #size1 0
proc hint %result #size #size1 #group #timeout
set #size1 #size1 + 1
set #group #group + 1
if #size = #size1
while 1 = 1 and timer < #timeout
hint (16 clRed %result [#size1 1] %result [#size1 2] (#group))
wait 100
end_while
else
hint (16 clRed %result [#size1 1] %result [#size1 2] (#group))
call hint %result #size #size1 #group #timeout
end_if
end_proc
//
end_if
end_while
end_script
// процедура поиска
proc heap %xy %color %m %deviat #r2 #min #max #mincol #timeproc
set #current_script current_script
set delimiter ' '
set #Xstart %xy[1 1]
set #Ystart %xy[1 2]
set #Xend %xy[1 3]
set #Yend %xy[1 4]
set #deviat maxx(%deviat[1])
set #pix 0
set #pix1 0
set #g 0
set size(%b)
set size(%result)
while size(%a) = 0 and (#timeproc > timer or #timeproc = 0)
set #a findcolor(#Xstart #Ystart #Xend #Yend (%color[1]) %a 2 -1 #deviat)
wait 10
end_while
set #pixel.#current_script #a
if #a > 0
gosub rgb
for #i 1 size(%a)
set #g #g +1
set #c1 0
set #c2 0
set #c3 0
set #c4 0
set #c5 0
for #j #i size(%a)
set #r round(point_distance(%a[#i 1] %a[#i 2] %a[#j 1] %a[#j 2]))
if #r < #r2
set #pixl #pix
if %a[#j 3] >= %color[2 1] and %a[#j 3] <= %color[3 1]
set #c1 #c1 +1
else
if %a[#j 3] >= %color[2 2] and %a[#j 3] <= %color[3 2]
set #c2 #c2 +1
else
if %a[#j 3] >= %color[2 3] and %a[#j 3] <= %color[3 3]
set #c3 #c3 +1
else
if %a[#j 3] >= %color[2 4] and %a[#j 3] <= %color[3 4]
set #c4 #c4 +1
else
if %a[#j 3] >= %color[2 5] and %a[#j 3] <= %color[3 5]
set #c5 #c5 +1
end_if
end_if
end_if
end_if
end_if
set #pix #c1 +#c2 +#c3 +#c4 +#c5
if #pixl != #pix
set %a[#j 4] #g
else
set %a[#j 4] 0
end_if
end_if
end_for
init_arr %b (#g) %a[#i 1] %a[#i 2] #pix #c1 #c2 #c3 #c4 #c5
for #i #i size(%a)
if %a[#i 4] = ""
set #i #i -1
break
end_if
end_for
end_for
set #z 0
for #l 1 size(%b)
if %b[#l 3] >= #min and %b[#l 3] <= #max
if (%b[#l 4] >= %m[1 1] or %m[1 1] = 0) and (%b[#l 5] >= %m[1 2] or %m[1 2] = 0) and (%b[#l 6] >= %m[1 3] or %m[1 3] = 0) and (%b[#l 7] >= %m[1 4] or %m[1 4] = 0) and (%b[#l 8] >= %m[1 5] or %m[1 5] = 0)
set #z1 0
for #m 4 8
if %b[#l #m] > 0
set #z1 #z1 +1
end_if
end_for
if #z1 >= #mincol
set #z #z +1
init_arr %result (#z) %b[#l]
end_if
end_if
end_if
end_for
for #i 1 size(%result)
for #j 1 size(%result[])
set %result.#current_script [#i #j] %result [#i #j]
end_for
end_for
end_if
goto end
:rgb
for #n 1 size(%color[1])
set #cvet %color[1 #n]
set #a1 colortorgb(#cvet %rgb)
set #dev 255*%deviat[1 #n]/100
set #bmin %rgb[1 3]-#dev
set #bmax %rgb[1 3]+#dev
if #bmax > 255
set #bmax 255
end_if
if #bmin < 0
set #bmin 0
end_if
set #gmin %rgb[1 2]-#dev
set #gmax %rgb[1 2]+#dev
if #gmax > 255
set #gmax 255
end_if
if #gmin < 0
set #gmin 0
end_if
set #rmin %rgb[1 1]-#dev
set #rmax %rgb[1 1]+#dev
if #rmax > 255
set #rmax 255
end_if
if #rmin < 0
set #rmin 0
end_if
set %color[2 #n] #bmin *256*256+#gmin *256+#rmin
set %color[3 #n] #bmax *256*256+#gmax *256+#rmax
end_for
return
:end
end_proc
Перенесено в первый пост.
Производительность сравнивал?
Здравствуйте ваш скрипт отлично работает но при попытки дописать к нему нажатие скилов и тюд выдает ошибку это возможно или нада писать 2й который который запускался после этого? тока после move прописал строчку на left работает нормального остальные дополнение выдают ошибку
Скрипт, который на луа или языке пилота?
Можно дописать нужные действия. Тут 2 варианта.
1. Дописать нужные действия в этом скрипте на луа.
2. Запускать другой скрипт, который можно написать хоть на луа, хоть на языке пилота.
http://uopilot.tati.pro/index.php?title=Введение_в_синтаксис_Lua
http://uopilot.tati.pro/index.php?title=Список_функций_(Lua)
--lua
require("find_heap_pixel") -- загрузка функции
-- таблица с параметрами поиска
find = {0, 0, 1920, 1080, -- координаты поиска
radius = 100, -- радиус разброса пикселей
min_pixel_count = 5, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {9896023, 35807}, -- цвет или несколько цветов
min_pixel_color = {0, 0}, -- минимально количество пикселей каждого цвета
deviation = {5, 5}, -- погрешность оттенка для каждого цвета
min_color = 2} -- минимальное количество цветов, которые должны присутствовать в группе
while 1 do -- выполнять бесконечно
local a, group = find_heap_pixel(find) -- вызов функции
if group and #group > 0 then -- если моб найден
kleft (group[1][1], group[1][2]) -- клик по нему
-- тут нужные действия, например:
start_script(1, "wait") -- запустить скрипт 1 и ждать когда он завершит работу
end
end
--lua
require("find_heap_pixel") -- загрузка функции
-- таблица с параметрами поиска
find = {0, 0, 1920, 1080, -- координаты поиска
radius = 100, -- радиус разброса пикселей
min_pixel_count = 5, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {9896023, 35807}, -- цвет или несколько цветов
min_pixel_color = {0, 0}, -- минимально количество пикселей каждого цвета
deviation = {5, 5}, -- погрешность оттенка для каждого цвета
min_color = 2} -- минимальное количество цветов, которые должны присутствовать в группе
while 1 do -- выполнять бесконечно
local a, group = find_heap_pixel(find) -- вызов функции
if group and #group > 0 then -- если моб найден
kleft (group[1][1], group[1][2]) -- клик по нему
-- тут нужные действия, например:
start_script(1, "wait") -- запустить скрипт 1 и ждать когда он завершит работу
end
end
Обновил скрипт (в первом посте), исправлен небольшой баг. Скачайте его.
111.zip ( 2,5 мегабайт )
Кол-во скачиваний: 378
В архиве видео. Пример как найти координаты перса, найти координаты мобов и навести курсор на ближайшего к персу моба.
Файл с функцией распаковать и положить рядом с exe пилота, открыть картинку в пайнте и запустить скрипт.
2018_07_03_153211.bmp ( 1,12 мегабайт )
Кол-во скачиваний: 618
--lua
require("find_heap_pixel") -- загрузка функции
-- функция находит ближайшего к персу моба
-- принимает координаты перса и массив с координатами мобов
function min_distance(persX, persY, arr)
local function distance(x1, y1, x2, y2)
return math.sqrt((x1-x2)^2+(y1-y2)^2)
end
local min, minNum, dist = 9999999, -1
for i=1, #arr do
dist=distance(persX, persY, arr[i][1], arr[i][2])
if dist < min then min=dist minNum=i end
end
return arr[minNum][1], arr[minNum][2] -- возвращает координаты ближайшего моба
end
----------------
-- таблица с параметрами поиска мобов
local mob = {0, 0, 1920, 1080, -- координаты поиска
radius = 100, -- радиус разброса пикселей
min_pixel_count = 30, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {14122975}, -- цвет или несколько цветов
min_pixel_color = {0}, -- минимально количество пикселей каждого цвета
deviation = {5}, -- погрешность оттенка для каждого цвета
min_color = 1} -- минимальное количество цветов, которые должны присутствовать в группе
-- таблица с параметрами поиска перса
local pers = {0, 0, 1920, 1080, -- координаты поиска
radius = 80, -- радиус разброса пикселей
min_pixel_count = 50, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {4145143 , 1032191, 48127}, -- цвет или несколько цветов
min_pixel_color = {0, 0, 0}, -- минимально количество пикселей каждого цвета
deviation = {5, 5, 5}, -- погрешность оттенка для каждого цвета
min_color = 3} -- минимальное количество цветов, которые должны присутствовать в группе
local a, group = find_heap_pixel(mob) -- вызов функции
local b, group2 = find_heap_pixel(pers) -- вызов функции
--log (group, group2) -- результат поиска, если nill - не найдено, LuaTable - найдено
if group and group2 then -- если моб и перс найдены
local x, y = min_distance(group2[1][1], group2[1][2], group) -- передаём в функцию координаты перса и массив с координатами мобов
move (x, y) -- навести курсор на моба
-- тут нужные действия
end
--lua
require("find_heap_pixel") -- загрузка функции
-- функция находит ближайшего к персу моба
-- принимает координаты перса и массив с координатами мобов
function min_distance(persX, persY, arr)
local function distance(x1, y1, x2, y2)
return math.sqrt((x1-x2)^2+(y1-y2)^2)
end
local min, minNum, dist = 9999999, -1
for i=1, #arr do
dist=distance(persX, persY, arr[i][1], arr[i][2])
if dist < min then min=dist minNum=i end
end
return arr[minNum][1], arr[minNum][2] -- возвращает координаты ближайшего моба
end
----------------
-- таблица с параметрами поиска мобов
local mob = {0, 0, 1920, 1080, -- координаты поиска
radius = 100, -- радиус разброса пикселей
min_pixel_count = 30, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {14122975}, -- цвет или несколько цветов
min_pixel_color = {0}, -- минимально количество пикселей каждого цвета
deviation = {5}, -- погрешность оттенка для каждого цвета
min_color = 1} -- минимальное количество цветов, которые должны присутствовать в группе
-- таблица с параметрами поиска перса
local pers = {0, 0, 1920, 1080, -- координаты поиска
radius = 80, -- радиус разброса пикселей
min_pixel_count = 50, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {4145143 , 1032191, 48127}, -- цвет или несколько цветов
min_pixel_color = {0, 0, 0}, -- минимально количество пикселей каждого цвета
deviation = {5, 5, 5}, -- погрешность оттенка для каждого цвета
min_color = 3} -- минимальное количество цветов, которые должны присутствовать в группе
local a, group = find_heap_pixel(mob) -- вызов функции
local b, group2 = find_heap_pixel(pers) -- вызов функции
--log (group, group2) -- результат поиска, если nill - не найдено, LuaTable - найдено
if group and group2 then -- если моб и перс найдены
local x, y = min_distance(group2[1][1], group2[1][2], group) -- передаём в функцию координаты перса и массив с координатами мобов
move (x, y) -- навести курсор на моба
-- тут нужные действия
end
Кроме while 1 do надо ещё end добавлять.
while 1 do
-- тут действия, которые выполняются в цикле
wait (1) -- пауза чтобы не грузить процесор
end
--lua
require("find_heap_pixel") -- загрузка функции
-- функция находит ближайшего к персу моба
-- принимает координаты перса и массив с координатами мобов
function min_distance(persX, persY, arr)
local function distance(x1, y1, x2, y2)
return math.sqrt((x1-x2)^2+(y1-y2)^2)
end
local min, minNum, dist = 9999999, -1
for i=1, #arr do
dist=distance(persX, persY, arr[i][1], arr[i][2])
if dist < min then min=dist minNum=i end
end
return arr[minNum][1], arr[minNum][2] -- возвращает координаты ближайшего моба
end
----------------
-- таблица с параметрами поиска мобов
local mob = {0, 0, 1920, 1080, -- координаты поиска
radius = 100, -- радиус разброса пикселей
min_pixel_count = 30, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {14122975}, -- цвет или несколько цветов
min_pixel_color = {0}, -- минимально количество пикселей каждого цвета
deviation = {5}, -- погрешность оттенка для каждого цвета
min_color = 1} -- минимальное количество цветов, которые должны присутствовать в группе
-- таблица с параметрами поиска перса
local pers = {0, 0, 1920, 1080, -- координаты поиска
radius = 80, -- радиус разброса пикселей
min_pixel_count = 50, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {4145143 , 1032191, 48127}, -- цвет или несколько цветов
min_pixel_color = {0, 0, 0}, -- минимально количество пикселей каждого цвета
deviation = {5, 5, 5}, -- погрешность оттенка для каждого цвета
min_color = 3} -- минимальное количество цветов, которые должны присутствовать в группе
while 1 do
local a, group = find_heap_pixel(mob) -- вызов функции
local b, group2 = find_heap_pixel(pers) -- вызов функции
--log (group, group2) -- результат поиска, если nill - не найдено, LuaTable - найдено
if group and group2 then -- если моб и перс найдены
local x, y = min_distance(group2[1][1], group2[1][2], group) -- передаём в функцию координаты перса и массив с координатами мобов
move (x, y) -- навести курсор на моба
-- тут нужные действия
wait (3000)
end
end
while 1 do
-- тут действия, которые выполняются в цикле
wait (1) -- пауза чтобы не грузить процесор
end
--lua
require("find_heap_pixel") -- загрузка функции
-- функция находит ближайшего к персу моба
-- принимает координаты перса и массив с координатами мобов
function min_distance(persX, persY, arr)
local function distance(x1, y1, x2, y2)
return math.sqrt((x1-x2)^2+(y1-y2)^2)
end
local min, minNum, dist = 9999999, -1
for i=1, #arr do
dist=distance(persX, persY, arr[i][1], arr[i][2])
if dist < min then min=dist minNum=i end
end
return arr[minNum][1], arr[minNum][2] -- возвращает координаты ближайшего моба
end
----------------
-- таблица с параметрами поиска мобов
local mob = {0, 0, 1920, 1080, -- координаты поиска
radius = 100, -- радиус разброса пикселей
min_pixel_count = 30, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {14122975}, -- цвет или несколько цветов
min_pixel_color = {0}, -- минимально количество пикселей каждого цвета
deviation = {5}, -- погрешность оттенка для каждого цвета
min_color = 1} -- минимальное количество цветов, которые должны присутствовать в группе
-- таблица с параметрами поиска перса
local pers = {0, 0, 1920, 1080, -- координаты поиска
radius = 80, -- радиус разброса пикселей
min_pixel_count = 50, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {4145143 , 1032191, 48127}, -- цвет или несколько цветов
min_pixel_color = {0, 0, 0}, -- минимально количество пикселей каждого цвета
deviation = {5, 5, 5}, -- погрешность оттенка для каждого цвета
min_color = 3} -- минимальное количество цветов, которые должны присутствовать в группе
while 1 do
local a, group = find_heap_pixel(mob) -- вызов функции
local b, group2 = find_heap_pixel(pers) -- вызов функции
--log (group, group2) -- результат поиска, если nill - не найдено, LuaTable - найдено
if group and group2 then -- если моб и перс найдены
local x, y = min_distance(group2[1][1], group2[1][2], group) -- передаём в функцию координаты перса и массив с координатами мобов
move (x, y) -- навести курсор на моба
-- тут нужные действия
wait (3000)
end
end
ФУНКЦИЯ ПЕРЕМЕЩАЕТ КУРСОР В ТОЧКУ 1,1 ЭКРАНА
Воспользовался данным скриптом, лог выдает
23:31:24 4 (autosaved_4.txt, 0): LuaTable LuaTable
23:31:40 4 (autosaved_4.txt, 0): LuaTable LuaTable
т.е. находит? но мышь в верхний левый угол экрана передвигает.
--lua
require("find_heap_pixel") -- загрузка функции
-- функция находит ближайшего к персу моба
-- принимает координаты перса и массив с координатами мобов
function min_distance(persX, persY, arr)
local function distance(x1, y1, x2, y2)
return math.sqrt((x1-x2)^2+(y1-y2)^2)
end
local min, minNum, dist = 9999999, -1
for i=1, #arr do
dist=distance(persX, persY, arr[i][1], arr[i][2])
if dist < min then min=dist minNum=i end
end
return arr[minNum][1], arr[minNum][2] -- возвращает координаты ближайшего моба
end
----------------
-- таблица с параметрами поиска мобов
local mob = {0, 0, 1920, 1080, -- координаты поиска
radius = 100, -- радиус разброса пикселей
min_pixel_count = 3, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {8286081}, -- цвет или несколько цветов
min_pixel_color = {0}, -- минимально количество пикселей каждого цвета
deviation = {5}, -- погрешность оттенка для каждого цвета
min_color = 1} -- минимальное количество цветов, которые должны присутствовать в группе
-- таблица с параметрами поиска перса
local pers = {0, 0, 1920, 1080, -- координаты поиска
radius = 80, -- радиус разброса пикселей
min_pixel_count = 5, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {5652309, 5586516, 5652052}, -- цвет или несколько цветов
min_pixel_color = {0, 0, 0}, -- минимально количество пикселей каждого цвета
deviation = {5, 5, 5}, -- погрешность оттенка для каждого цвета
min_color = 2} -- минимальное количество цветов, которые должны присутствовать в группе
local a, group = find_heap_pixel(mob) -- вызов функции
local b, group2 = find_heap_pixel(pers) -- вызов функции
log (group, group2) -- результат поиска, если nill - не найдено, LuaTable - найдено
if group and group2 then -- если моб и перс найдены
local x, y = min_distance(group2[1][1], group2[1][2], group) -- передаём в функцию координаты перса и массив с координатами мобов
move (x, y) -- навести курсор на моба
-- тут нужные действия
end
Версия пилота какая? Попробуйте 2.40, в 2.41 менялся синтаксис findcolor.
https://ibb.co/7WC8b3z
Не очень понял. Радиус ищет только вниз, т.е область полумесяца?
или и вверх тоже?
И какой пиксель находится первым? Тот что указан в строке поиска первым? Или тут без разницы.
Если я укажу зеленый первым, то все равно первый найдет фиолетовый?
https://ibb.co/rsCjG7T
--lua
require("find_heap_pixel") -- загрузка функции
-- таблица с параметрами поиска
find = {0, 0, 1920, 1080, -- координаты поиска
radius = 100, -- радиус разброса пикселей
min_pixel_count = 5, max_pixel_count = 1000, -- минимальное и максимальное количество всех пикселей в группе
color = {9896023, 35807}, -- цвет или несколько цветов
min_pixel_color = {0, 0}, -- минимально количество пикселей каждого цвета
deviation = {5, 5}, -- погрешность оттенка для каждого цвета
min_color = 2} -- минимальное количество цветов, которые должны присутствовать в группе
while 1 do -- выполнять бесконечно
local a, group = find_heap_pixel(find) -- вызов функции
if group and #group > 0 then -- если моб найден
kleft (group[1][1], group[1][2]) -- клик по нему
-- тут нужные действия, например:
start_script(1, "wait") -- запустить скрипт 1 и ждать когда он завершит работу
end
end
Всем привет!
Ребятушки, а в Lua вообще отдельно Findcolor есть, как в пилоте?
Просто скрипт огонь (автору огромный респектос). Мне бы в условие Findcolor вставить, чтобы понять когда тормозить клики... т.к. даже при радиусе 5 пикселей, иногда не попадает в нужную область с первого раза.
--lua
require("find_heap_pixel")
local find = {0, 0, 1920, 1080,
radius = 5,
min_pixel_count = 0, max_pixel_count = 1000,
color = {870911, 8411405},
min_pixel_color = {0, 0},
deviation = {0,5},
min_color = 2}
local a, group = find_heap_pixel(find)
if group then
for i = 1, #group do
double_kleft (group[i][1], group[i][2])
wait (500)
----- ВОТ ТУТ БЫ ВСТАВИТЬ Findcolor и break, для понимания, что по мобу попали, на нем появился таргет
end
end
https://forum.uokit.com/index.php?showtopic=70978&hl=findcolor&st=0
эта функция слишком сложна для меня(хотя разбираться в ней нет необходимости), а если искать скученность вот так
--lua
local x, y, x1, y1 = 0, 0, 0, 0
while 1 == 1 do
local a = findcolor(0, 0, 1920, 1080, "(12225101-12291882)", '%arr', 2, 1, 0) --найти один пиксель или сколько захотите
if a then
x = arr[1][1] - 10
y = arr[1][2] - 10
x1 = arr[1][1] + 10
y1 = arr[1][2] + 10
local b = findcolor(x, y, x1, y1, "(12225101-12291882)", '%arr', 2, -1, 0) --проверить область 20х20 вокруг найденного пикселя
if b > 5 then --если в квадрате больше 5 нужных цветов то
end
end
end
просто и элегантно. рекомендую делать getimage в данном случае чтобы дергать изображение только один раз.
x = arr[1][1]
y = arr[1][2]
x1 = arr[1][1] + 20
y1 = arr[1][2] + 20
x = arr[1][1]
y = arr[1][2]
x1 = arr[1][1] + 20
y1 = arr[1][2] + 20
наверное по Х все таки надо отнимать, например если объект имеет какую-нибудь такую форму
Пожалуй соглашусь.
address, width, height, length = getimage (100, 100, 1000, 1000)
log (address) -- адрес в памяти
log (width) -- ширина изображения
log (height) -- высота изображения
log (length) -- длина строки в байтах
local a = findcolor(0, 0, width, height, 12345, '%arr', address, 1, 0)
пример фунции под имидж.
Я не могу дать никакой гарантии по поводу еденичек пограничных. В плане того нужно считать с 0 или с 1 и заканчивать x2-x1 (+1-1 или 0?).
local my_find = function(x1, y1, x2, y2, image, method, acc, count, deviation, edge)
local img, h, w, l = getimage(x1, y1, x2, y2, method)
ext.black_and_white(img, h, w, l, edge)
local arr, err = findimage(0, 0, x2-x1, y2-y1, image, method, acc, count, deviation)
return arr, err
end
с размерами понятно, спасибо, хочу только уточнить - адрес нужно записывать туда где тип поиска и в findcolor и в findimage?
да
в общем у меня че то не получается, нарисовал в пэинте толстую красную линию, у меня задача сначала найти ближайшую точку, потом проверить скопление вокруг нее, перед запуском открываю картинку на весь экран без каких либо рамок
--lua
local gip, min, x, y, x1, x2, y1, y2 = 0, 0, 0, 0, 0, 0, 0, 0
while 1 == 1 do
fog = getimage (179, 84, 1049, 651)
local A = findcolor(0, 0, 870, 567, 2366701, '%arr', fog, -1, 0)
if A then
for i = 1, A do -- поиск ближайшей точки
gip = math.sqrt((960 - arr[i][1])^2 + (520 - arr[i][2])^2)
if i == 1 then
min = gip
end
if min >= gip then
min = gip
x = arr[i][1]
y = arr[i][2]
end
end
--move (x + 179, y + 84) --до сюда всё работает как надо указывает на ближайшую точку
x1 = x - 10
y1 = y - 10 --это в случае с ближайшей точкой тоже нужно, так как она может быть в самом низу
x2 = x + 10
y2 = y + 10
local B = findcolor(x1, y1, x2, y2, 2366701, '%arr2', fog, -1, 0) -- не может найти ни одной точки, как будто что-то со смещением, но не могу понять что.
-- Визуально и по логам указывает на ту область(x1, y1, x2, y2) где была найдена эта ближайшая точка.
-- Если поменять +-10 на +-50 тогда что-то находит, но ясности это не вносит
if B and B > 3 then
x = x + 179
y = y + 84
move (x, y)
wait (1000)
end
deleteimage (fog)
end
end
local ffi=require "ffi"
local rmem=ffi.cast
local ext = {}
ext.color_to_rgb = function(c)
local r,g,b
b = math.floor(c/65536)
g = math.floor(c/256-b*256)
r = c-b*256*256-g*256
return r, g ,b
end
ext.pix_painting = function(img, x, y, color)
local r, g, b = ext.color_to_rgb(color)
local pix = rmem("unsigned char*", img[1])
pix[ img[4]*y + x*3 ] = b
pix[ img[4]*y + x*3+1] = g
pix[ img[4]*y + x*3+2] = r
end
блин, это для меня темный лес. Единственное, могу сказать что saveimage сохраняет картинку слева сверху обрезанную по координатам указанным в getimage, а справа вниз весь оставшийся экран независимо от того какие конечные координаты я напишу. Но по-моему проблема не в этом, потому что этот скрипт выше я делю пополам, сначала выполняю первый поиск и всё нормально, потом из него беру полученную область для второго поиска, записываю в отдельный скрипт тот же самый getimage и этот второй поиск с координатами которые получил в первом и никакого толку. Может я какую то ошибку делаю, но у меня уже терпения не хватает, если с getimage всё так сложно я пожалуй отложу его до лучших времен
--lua
fog = getimage (200, 100, 1000, 500)
local A = findcolor(0, 0, 800, 300, 2366701, '%arr', fog, -1, 0)
if A then
x1 = arr[1][1] - 10
y1 = arr[1][2] - 10
x2 = arr[1][1] + 10
y2 = arr[1][2] + 10
log (x1, y1, x2, y2)
end
deleteimage (fog)
--lua
fog = getimage (200, 100, 1000, 500)
local B = findcolor(60, 5, 80, 25, 2366701, '%arr2', fog, -1, 0)
if B and B > 2 then
move (arr2[1][1] + 200, arr2[1][2] + 100)
end
deleteimage (fog)
Попробуйте брать getimage с привязанного окна, обычно это помогает взять картинку без бага с черной областью или же брать абсолютные координаты.
--lua
local handle = findwindow('Paint')
if not handle then
log('Окно не найдено')
end
fog = getimage(200, 100, 1000, 500, handle[1]][1])
-- fog = getimage(200, 100, 1000, 500, 'abs')
local B = findcolor(60, 5, 80, 25, 2366701, '%arr2', fog, -1, 0)
if B and B > 2 then
move (arr2[1][1] + 200, arr2[1][2] + 100)
end
deleteimage (fog)
переделал свой вариант, теперь не застревает на первом найденном пикселе, а ищет первое скопление которое удовлетворяет условию внутри for
--lua
local A = findcolor(827, 417, 1029, 555, 2767576, '%arr', 2, -1, 0)
if A then
for i = 1, A do
local B = findcolor(arr[i][1] - 20, arr[i][2] - 20, arr[i][1] + 20, arr[i][2] + 20, 2767576, '%arr2', 2, -1, 0)
if B and B > 300 then
move (arr[i][1], arr[i][2])
break
end
end
end
find = {540, 160, 857, 428,
radius = 10,
min_pixel_count = 50, max_pixel_count = 1000,
color = {'0x9EFCFF-0xA2FDFF'}}
local a, group = find_heap_pixel(find)
Чет так и не завелось - нули возвращало.
-- result_arr_sorted = pool_size(arr, distance)
-- arr - массив координат, где arr[i][1] и arr[i][2] x и y координаты.
-- т.е. принимает в формате результата работы findimage/findcolor
-- distance - дистанция которая считается единым объектом.
--
-- Вернет массив в котором у каждого элемента будут дополнительные поля:
-- pool_size содержащие количество объектов в группе для каждой точки,
-- массив будет отсортирован в порядке убывания result[1] - будет соответственно
-- содержать самый крупный объект.
-- pool_x - x координата середины группы объектов
-- pool_y - y координата середины группы объектов
-- Внимание! Исходный массив так же будет модифицирован!
-- В него будут добавлены поля, но порядок изменен не будет.
-- Массив с результатом просто набор ссылок на исходные вложенные таблицы.
local function pool_size(arr, distance)
-- copy array
local result = {}
for i = 1, #arr do
result[i] = arr[i]
end
-- add pool_size for each point
for i = 1, #result do
result[i].pool_size = 0
result[i].pool_x = 0
result[i].pool_y = 0
for j = 1, #result do
if ((result[i][1]-result[j][1])^2 + (result[i][2]-result[j][2])^2)^0.5 <= distance then
result[i].pool_size = result[i].pool_size + 1
result[i].pool_x = result[i].pool_x + result[j][1]
result[i].pool_y = result[i].pool_y + result[j][2]
end
end
result[i].pool_x = math.floor(result[i].pool_x / result[i].pool_size + 0.5)
result[i].pool_y = math.floor(result[i].pool_y / result[i].pool_size + 0.5)
end
table.sort(result, function(a, b) return a.pool_size > b.pool_size end)
return result
end
local arr = {{1, 1}, {1, 2}, {2, 2}, {3, 3}}
local arr_p = pool_size(arr, 1)
Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)