Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ UO Pilot _ Скрипт на запись макроса

Автор: Zenogiasu 25.1.2024, 23:50

Привет. Написал простой скрипт чтоб записывал передвижение мыши а затем в точности воспроизводил. Но не уверен что все по уму сделано. Можете поправить? К тому-же столкнулся с проблемой того, что на разных компьютерах воспроизводится с разной скоростью. где-то за 40 сек исполняет, где-то за 38 к примеру.

это скрипт записи макроса

Код

set #s 1
get mouse_pos #x #y
kright_down #x #y
:ss
get mouse_pos #x #y
init_arr %s (#s) #x #y // записываем в массив текущие корды мыши
save_array %s C:\123.txt    // сохраняем этот массив в текстовый файл
set #s #s + 1           // чтоб следующие координаты прописывал на след строчку
wait 10
goto ss    // и так пока не остановлю.

Это скрипт воспроизведения макроса
Код

set $massiv ddd12       // какой массив воспроизводить

set linedelay 0         // воспроизведение плавного макроса
set size(%s)
set #s
set $txt .txt
load_array %s c:\$massiv$txt   // загружаем нужный массив с координатами
set #skolkostrok size(%s)     // узнаем сколько там строк
set #s #s + 1    // устанавливаем строку на 1
move_smooth %s [#s 1] %s [#s 2]   // перемещаем на первоначальные нужные координаты 1 строки
wait 100 + random (10)
kright_down %s [#s 1] %s [#s 2]   // и стартуем
set #a #skolkostrok - 1     // повторять столько сколько строк в массиве
repeat #a
    set #s #s + 1
    move %s [#s 1] %s [#s 2]
    wait 16 + random (1)       // а это время пришлось выверять вручную долгими тестами чтобы совпадало
end_repeat
kright_up %s [#s 1] %s [#s 2]
end_script

Я так понял язык пилота в этом плане чучуть ущербный правильно? Потому-что меняешь тайминги там где ваит 16 на любые другие с разницей в несколько милисекунд, а время выполнения скрипта не меняется почему-то. разница будет только если на 7+ мс менять тайминг
К ктому-же столкнулся с проблемой что на разных компах сходу те же скрипты с разной скоростью работают. Тот-же код на луа решшит данные проблемы с таймингами? Чтобы на всех компах и системах работало одинакого и не приходилось переживать. Да и к тому-же в скрипте записи там каждые 10мс файл текстовый пересоздается на диске с. Это не вызывает дополниительных нагрузок и микрозадержек в виду этого? Варианта записывать в массив чтобы потом сохранился одним разом в файл я не придумал, так как когда надо сотановить запись я жму кнопочку стоп скрипт.

Автор: cirus 26.1.2024, 2:30

Цитата
Тот-же код на луа решшит данные проблемы с таймингами?

Нет. Так устроена функция Sleep в Windows.
Скорость работы скрипта зависит от процессора.

Автор: Zenogiasu 26.1.2024, 3:07

Цитата(cirus @ 26.1.2024, 2:30) *

Нет. Так устроена функция Sleep в Windows.
Скорость работы скрипта зависит от процессора.

если это дейстивительно так, то как тогда люди продают ботов в разных проектах, типа вов, где боты передвигаются посути по массивамии-макросами подобного рода, по макросам с микроскопически выверенными таймингами? Ведь тогда они должны будут у каждого юзера работать по разному. И массовая продажа будет невозможна. Я давно как-то задавал похожий вопрос в другом контексте, когда под старого доброго работающего бота вдруг поставил другую винду, и он стал работать по другому. Вы ответили то-же самое помню.

Автор: DarkMaster 26.1.2024, 18:21

Под lua есть решения с высокоточными таймерами. Вроде работают. Если сделать:

Код
ffi.cdef[[
void Sleep(int ms);
]]
-- Подменяем пилотный wait
_G.wait = ffi.C.Sleep

То мы переобъявим функцию сна и будем использовать напрямую виндовую. У меня она относительно стабильно дает 1мс. Разница обычно не более 2%, бывают редкие просадки до 0.6мс не знаю с чем связано. Ну либо использовать высокоточные таймеры - они жрут камень сильно. Вообще это даже не виндовая фишка. Эти моменты решены на железном уровне в камне.

Автор: Zenogiasu 27.1.2024, 2:08

Понял, но себя на понял не беру поэтому ничего не понял
чтож тогда если поправок в мой текущий скрипт записи макроса нет - ряд других вопросов:
1. можно ли считывать ИД курсора на языке пилота?
2. по умолчанию элементы массива являются строковыми переменными?
3. гет имидж, как вы выражаетесь, выгядет вкусной вещью, но перекапав форум, любой увидит то что по факту эта вещь, к сожалению не работает. решены ли проблемы на луа?
4. На какие массивы распостраняется делимитер? например тебе надо поставить пробел в делиметре. после ттого как ты это сделал, на какие массивы оно будет распостранено? на все что заданы в текущий момент в скрипте или как? и как обнулить делимитер?
5. можно ли как-то без использования функции Ярлыка и бат файла сделать так, чтобы при запуске основного exe пилота был автоматически сразу запущен нужный скрипт?
6. Можно ли привязать одну вкладку скрипта к приложению из другого скрипта?
7. забыл(

Автор: DarkMaster 27.1.2024, 16:47

Цитата
1. можно ли считывать ИД курсора на языке пилота?

встроенными средствами нет. возможно на луа либы какие-то есть. подозреваю, что решается простым биндингом.
Цитата
2. по умолчанию элементы массива являются строковыми переменными?

в пилоте на самом деле вообще все строковое. Но все, что #var обрабатывается, несколько иначе в плане парсера и считается условно числовым.
Цитата
3. гет имидж, как вы выражаетесь, выгядет вкусной вещью, но перекапав форум, любой увидит то что по факту эта вещь, к сожалению не работает. решены ли проблемы на луа?

а что с ним не так? прекрасно шуршит. как минимум в луа.
Цитата
4. На какие массивы распостраняется делимитер? например тебе надо поставить пробел в делиметре. после ттого как ты это сделал, на какие массивы оно будет распостранено? на все что заданы в текущий момент в скрипте или как? и как обнулить делимитер?

по сути на все при загрузке/сохранении. обнулить никак, но можно поставить исходное значение "\t".
Цитата
5. можно ли как-то без использования функции Ярлыка и бат файла сделать так, чтобы при запуске основного exe пилота был автоматически сразу запущен нужный скрипт?

вроде нет. а в чем проблема батника или ярлыка?
Цитата
6. Можно ли привязать одну вкладку скрипта к приложению из другого скрипта?

да. старый синтаксис помню плохо. будет что-то вроде:
set workwindow workwindow.2
где 2 номер влкадки другого скрипта.

переходите на луа - решите много проблем.

Автор: Zenogiasu 28.1.2024, 3:05

Цитата(DarkMaster @ 27.1.2024, 16:47) *

встроенными средствами нет. возможно на луа либы какие-то есть. подозреваю, что решается простым биндингом.
переходите на луа - решите много проблем.

спасибо за ответы. мистер цирус вот выдал на луа в свое время изменение курсора, работатет отлично. просто поинтересовался относительно старого синтаксиса.
https://forum.uokit.com/index.php?showtopic=30151
в гет имаге что не так? ну как бы то что у вас там постоянные проблемы с тем, что скринит квадраты малевича вместо того что нужно скринить... и решение там только одно было - определять необходимую оласть скрина абсолютными координатами экрана, а не координатами окна. да и вроде как принт скрин работает точно также криво. мне сейчас если надо сделать скрин приходится использовать дефолт, чтобы скринил тупо весь экран а не ную часть рабочего окна. ибо будет черный скрин...

Автор: DarkMaster 28.1.2024, 17:53

Цитата
скринит квадраты малевича вместо того что нужно скринить

эмм... у меня на луа скрипт бегал на getimage + геометрический/математический анализ полученного участка окна. Бегало ~20 окон на протяжении 1.5 лет. Проблемы не было. Свежую версию, луа, дальше смотреть по обстоятельствам.

Цитата
https://forum.uokit.com/index.php?showtopic=30151

не умоляя заслуги, но там вроде через вин апи id курсора можно дергать.

Автор: Zenogiasu 5.2.2024, 15:14

Возникла ужасная проблема. на компе не работают скрипты потому-что не работают wait ' ы, какое бы время не указать чтобы ждал - проскипцывает строчки моментально. хоть ваит 1000 хоть 99999, что за ужас?

Автор: DarkMaster 5.2.2024, 15:53

проблема наблюдалась у некоторых людей, если система ОЧЕНЬ долго не перезагружалась. Используйте данный код в шапке и забудьте о проблеме.

Код
ffi.cdef[[
void Sleep(int ms);
]]
-- Подменяем пилотный wait
_G.wait = ffi.C.Sleep

Автор: Zenogiasu 5.2.2024, 15:59

Цитата(DarkMaster @ 5.2.2024, 15:53) *

проблема наблюдалась у некоторых людей, если система ОЧЕНЬ долго не перезагружалась. Используйте данный код в шапке и забудьте о проблеме.
Код
ffi.cdef[[
void Sleep(int ms);
]]
-- Подменяем пилотный wait
_G.wait = ffi.C.Sleep


да, уже почитал форум, вижу что наблюдалась на протяжении десятилетий, решения найдено небыло кроме подмены вайта. Спасибо за супер быстрый ответ. Перезагрузка в моем случае, конечно, не помогла, также дело не в виндусе, тк на другом компе та-же. И луа на помощь не придет тк код на пилотовском.
Попробую еще скачать чистую версию пилота с сайта и туда вбухать старые скрипты. Кто знает, может постоянное скачивание архива с пилотом с облака на компы в течении времени как-то Шакализирует пилот?)

Кстати на счет луа, вы придумали способ как обойти ф-цию Sleep через луа, я правильно понимаю, тоесть когда я пойду учить луа и писать на нем, лучше сразу писать через ваш обход этой ф-ции слип, нежели использовать обычный ваит, верно? Тк эта функция слип очень критично влияет на микротайминги, и писать макрос для каждого компа отдельно это как-то не круто.
Однажды просто на новую винду поставил код который стабильно долго работал, а на новой он вместо 500мс ждал наверно 100. и интвентарь в игре просто не успевал открыться чтобы проверить ботом открыт ли он. И возникала критическая ошибка) пришлось увеличивать все тайминги банально дддля этой системы.

Автор: DarkMaster 5.2.2024, 16:10

Цитата
лучше сразу писать через ваш обход этой ф-ции слип, нежели использовать обычный ваит, верно?

По сути без разницы - они полностью совместимы, но смысла в стандартном вэйте нет. Он дает чуть большую нагрузку на камень и имеет данный баг. У меня в шапке подгружается отдельный скрипт который чуть расширяет/заменяет стандартный функционал. Я не пользуюсь стандартным вейтом.

Автор: Zenogiasu 5.2.2024, 17:54

Проблема с неработающими Wait - РЕШЕНА. Решена была путем обновления виндувс тупо через центр обновлений. Винда - неактивированная лицензия с надписью активируйте виндовс. За 2 года не обновлялась через ЦО, нажали сейчас, скачались там какие-то пакеты которые доступны для неактивированной винды и заработали вайты. Можете добавить это в свою базу решения проблем, если такая есть. Полагаю дела были либо во всяких этих обновах на с++ фрамеворка директ икса итд

Автор: Aqualon 5.2.2024, 20:06

Цитата(DarkMaster @ 5.2.2024, 16:53) *

проблема наблюдалась у некоторых людей, если система ОЧЕНЬ долго не перезагружалась. Используйте данный код в шапке и забудьте о проблеме.
Код
ffi.cdef[[
void Sleep(int ms);
]]
-- Подменяем пилотный wait
_G.wait = ffi.C.Sleep


Забавный момент.
Помню сталкивался с этой проблемой, как раз в ситуации описанной вами - долго не перезагружал комп.
После перехода на луа почему то эта проблема пропала сама собой, даже без переопределения слипа через ffi.

Автор: nykep 5.2.2024, 23:10

Цитата(DarkMaster @ 5.2.2024, 15:53) *

Код
ffi.cdef[[
void Sleep(int ms);
]]
-- Подменяем пилотный wait
_G.wait = ffi.C.Sleep


а что нужно чтоб этот код работал? у меня выдает ошибку
a runtime error
attempt to index global 'ffi' (a nil value)

Автор: DarkMaster 7.2.2024, 17:51

Код

local ffi           = require[[ffi]]
ffi.cdef[[
void Sleep(int ms);
]]
-- Подменяем пилотный wait
_G.wait = ffi.C.Sleep

ffi подключить надо было. По умолчанию он не подгружен.

Автор: Zenogiasu 14.2.2024, 2:51

Подскажите пожалуйста как разбить элемент на элементы?
есть массив %arr [1 1] равный dddddd
а нужно чтобы каждая буковка приняла вид либо отдельного столбца либо строки и стало [1 2] = d, [1 3] = d итд

Автор: DarkMaster 14.2.2024, 18:22

переходите на луа - всем будет проще.
за синтаксис не отвечаю - давно перешел на луа. Считайте наброском.

set %arr [1 1] "dddddd"
set #limit size(%arr[1 1])
log limit #limit
for #i #limit 1 -1
set %arr[1 #i] copy (%arr[1 1], #i, 1)
log #i %arr[1 #i]
end_for

Автор: Zenogiasu 24.2.2024, 1:47

Благодарю добрый человек. На вас весь форум держится по большей части.
Если кто прочитает и обладает необходимыми знаниями, сможет кто-нибудь научить пробрасывать видяху на гипер-в на виндусе 10? заплачу 10к если сможете на мои бомже компики это сделать чтобы хотябы в 2 окна фармить на каждом а не в одно. виртуализацию поддерживают процессоры, а винду 11 - нет, на ней вроде как с пробросом проблем нет Пендосский гайд по пробросу смотрел - чето не получилось, код ошибки 43

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)