|
|
|
Поиск скученности пикселей, Готовый скрипт |
|
|
dron4938 |
17.12.2021, 5:39
|
Apprentice
Сообщений: 256
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395
|
Цитата(cirus @ 30.6.2018, 17:45) Можно дописать нужные действия. Тут 2 варианта. 1. Дописать нужные действия в этом скрипте на луа. 2. Запускать другой скрипт, который можно написать хоть на луа, хоть на языке пилота. Введение в синтаксис LuaСписок функций (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 Скрипт найдет моба, кликнет по нему и запустит скрипт1 и будет ждать когда скрипт1 завершит работу, допустим убьёт моба. (IMG:https://i.ibb.co/zJ3LtMP/222.png) функция в бесконечном цикле жрет 30 фпс в игре. Как вылечить это?
|
|
|
|
Мащекус |
14.2.2023, 20:28
|
Registred
Сообщений: 4
Регистрация: 13.2.2023 Группа: Пользователи Наличность: 0
Пользователь №: 20.486
|
Всем привет! Ребятушки, а в 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
|
|
|
|
Madeus |
15.2.2023, 3:22
|
Apprentice
Сообщений: 283
Регистрация: 19.11.2019 Группа: Пользователи Наличность: 8544
Пользователь №: 19.451
Возраст: 32
|
|
|
|
|
nykep |
19.2.2023, 1:08
|
Apprentice
Сообщений: 234
Регистрация: 1.9.2012 Группа: Пользователи Наличность: 1224
Пользователь №: 15.246
Возраст: 25
|
эта функция слишком сложна для меня(хотя разбираться в ней нет необходимости), а если искать скученность вот так Код --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
насколько велика разница?
|
|
|
|
nykep |
19.2.2023, 14:57
|
Apprentice
Сообщений: 234
Регистрация: 1.9.2012 Группа: Пользователи Наличность: 1224
Пользователь №: 15.246
Возраст: 25
|
Цитата(DarkMaster @ 19.2.2023, 10:55) В минус смысла делать нет - там мы уже проверили. Т.е. должно быть: Код x = arr[1][1] y = arr[1][2] x1 = arr[1][1] + 20 y1 = arr[1][2] + 20
Результат будет в любом случае, но так он будет быстрее во многих ситуацих. и правда, спасибо за подсказку
|
|
|
|
nykep |
19.2.2023, 21:00
|
Apprentice
Сообщений: 234
Регистрация: 1.9.2012 Группа: Пользователи Наличность: 1224
Пользователь №: 15.246
Возраст: 25
|
Цитата(DarkMaster @ 19.2.2023, 9:22) просто и элегантно. рекомендую делать getimage в данном случае чтобы дергать изображение только один раз.
не могу разобраться с getimage, взял пример с вики Код address, width, height, length = getimage (100, 100, 1000, 1000) log (address) -- адрес в памяти log (width) -- ширина изображения log (height) -- высота изображения log (length) -- длина строки в байтах
какие бы значения я не записал в getimage, в логах всегда пишет ширину 1921 и длину 1081. После поиска на форуме решил что findcolor в запомненной картинке должен выглядеть так Код local a = findcolor(0, 0, width, height, 12345, '%arr', address, 1, 0)
но размеры как я понял он определяет неверно, получается надо самому прописывать вычисление ширины и высоты или я неправильно понял?
|
|
|
|
DarkMaster |
19.2.2023, 21:38
|
Модератор UOPilot
Сообщений: 9.477
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27899
Пользователь №: 11.279
|
пример фунции под имидж. Я не могу дать никакой гарантии по поводу еденичек пограничных. В плане того нужно считать с 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 Цитата какие бы значения я не записал в getimage, в логах всегда пишет ширину 1921 и длину 1081. гетимидж условно создает квадрат малевича размером с приложение или рабочий стол, потом в левый верхний угол закидывает тот кусок изображения который запрашивался. По сути баг.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
nykep |
20.2.2023, 1:02
|
Apprentice
Сообщений: 234
Регистрация: 1.9.2012 Группа: Пользователи Наличность: 1224
Пользователь №: 15.246
Возраст: 25
|
в общем у меня че то не получается, нарисовал в пэинте толстую красную линию, у меня задача сначала найти ближайшую точку, потом проверить скопление вокруг нее, перед запуском открываю картинку на весь экран без каких либо рамок Код --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 Сообщение отредактировал nykep - 20.2.2023, 14:57
|
|
|
|
DarkMaster |
20.2.2023, 8:41
|
Модератор UOPilot
Сообщений: 9.477
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27899
Пользователь №: 11.279
|
Код 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
Попробуй покрасить углы и сохранить изображение качестве отладки. img - в данном случае массив {address, h, w, l} сохранять обычным saveimage Сообщение отредактировал DarkMaster - 20.2.2023, 14:49
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
nykep |
20.2.2023, 17:08
|
Apprentice
Сообщений: 234
Регистрация: 1.9.2012 Группа: Пользователи Наличность: 1224
Пользователь №: 15.246
Возраст: 25
|
блин, это для меня темный лес. Единственное, могу сказать что 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) второй скрипт начинает находить по мере уменьшения начального Х = 60, но со смещением на величину этого Х вправо и правильно указывает мышью при начальном Х = 0, че с этим делать я сообразить не могу, может тогда в getimage вообще нету смысла в этом случае? А и еще в результате всех сохранений через saveimage у меня ни с того ни с сего одна картинка получилась без каких либо черных квадратов и смещений в верхний левый угол и размером точно как указывал, почему не знаю и повторить не смог.
|
|
|
|
Madeus |
20.2.2023, 19:01
|
Apprentice
Сообщений: 283
Регистрация: 19.11.2019 Группа: Пользователи Наличность: 8544
Пользователь №: 19.451
Возраст: 32
|
Попробуйте брать 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)
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|