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

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

UoKit.com Форумы _ UO Pilot _ Новая Версия Uopilot v.2.40 (05.11.2017)

Автор: WKnight 5.11.2017, 23:43

Пожертвовать на дальнейшее развитие:
Изображение
Рубли: R849464451336
Гривны: U145931779718
Доллары: Z353114408274

Изображение
410011422550405


--v.2.40--

Вынес на форму настроек окошко для задания размера файла логов.

Добавил переменные, в которых содержится путь к текущему скрипту 'scriptPath' и имя скпирта 'scriptName'.

Добавил почти все переменные Ultima Online в Lua. Указывать со скобками, как функции.


http://uopilot.uokit.com/index_rus.php

http://uopilot.uokit.com/old/dl240.php

http://uopilot.uokit.com/dllua.php

http://uopilot.uokit.com/dlAntiFrost.php
http://uopilot.uokit.com/dlAntiGate.php
пароль на архивы: uopilot.uokit.com

Автор: cirus 6.11.2017, 0:40

Findimage при поиске на скрине не доделан?
С 12й бетки (или 11, у меня её нет) не работает 2й тип поиска. Не находит картинки.

Автор: WKnight 17.11.2017, 11:40

build 1
Добавил длл "lua5.1.dll" в ресурсы пилота. При запуске пилота проверяется ее наличие в папке, и если ее нет, то распаковываем.
В клики мышкой добавил параметр "nooffset", который позволяет игнорировать смещение, указанное в переменных "clickoffsetxy". 'kleft 100 100 nooffset'

build 2
Исправил вывод сообщения об ошибке при форматировании скрипта, если пилот располагался поверх всех окон.
Исправил тип поиска 2 в 'findimage', сломанный пару билдов назад.

Автор: cirus 17.11.2017, 12:03

Добавь в первый пост ссылку на свою страницу. Не все же знают где она и где искать бетки.

Автор: cirus 19.11.2017, 3:44

Цитата
В клики мышкой добавил параметр "nooffset", который позволяет игнорировать смещение, указанное в переменных "clickoffsetxy". 'kleft 100 100 nooffset'

Для move эффект обратный.
Код
set Clickoffsetx 50
set Clickoffsety 50

move 0 0   // смещения нет
wait 100
log mousepos_x mousepos_y

move 0 0 nooffset      // смещение есть
wait 100
log mousepos_x mousepos_y
end_script

Автор: trico 29.11.2017, 11:21

Работал себе в версии 2.32, подумал пора переходить на новую. Через час мучений вернулся обратно.

Код
left #xx, #yy ~

упорно не работает клик через шифт. Срабатывает простой клик.

Автор: cirus 29.11.2017, 12:06

Цитата
клик через шифт

Можно так попробовать:
Код
sendex ~   // зажать шифт
wait 30   // возможно без паузы будет работать
left 100 100  // клик в координаты 100 100
wait 30  // возможно без паузы будет работать
sendex   // отпустить шифт
end_script

Автор: WKnight 29.11.2017, 15:41

build 3
Исправил клики мышкой с модификаторами.


Надеюсь колесики не отвалились.

Автор: Gals 4.12.2017, 18:48

Error while creating Lua virtual mashine. При запуске любого скрипта.

Скачал lua5.1.dll положил в папку пилота. Что не так?

Автор: cirus 4.12.2017, 19:23

Удалить lua5.1.dll. Скачать бета версию пилота: http://uopilot.uokit.com/dlnight.php

Автор: Andrey1995 9.12.2017, 16:51

Есть какой-нибудь пилот, чтобы x-trap не блочил его? Обычно работал, а щас перестал...Либо сам пилот вылетает, либо игра при привязке к игре.

Автор: cirus 10.12.2017, 18:36

Код
set windowpos 100 100
End_script

В 2.38 работает.
В последующих версиях нужно указывать хендл.
Код
set windowpos 100 100 workwindow
End_script

Видимо когда в 2.39 правил:
Цитата
Исправил ошибку в команде 'set windowpos' с параметрами TOP и BOTTOM.

то, что-то сломал.

Автор: WKnight 12.12.2017, 9:43

build 4
Исправил работу команды 'set windowpos', если не указан хендл рабочего окна.


Автор: trico 20.12.2017, 15:52

Цитата(WKnight @ 29.11.2017, 14:41) *

build 3
Исправил клики мышкой с модификаторами.
Надеюсь колесики не отвалились.


отвалились.
Код
 wheel_up 597 263 2
wheel_up - (27): Ошибка! Проверьте правильность скрипта! EConvertError '' is not a valid integer value
            wheel_up 597 263 2



Автор: FREEON 24.12.2017, 3:36

Чо за переменные для Ultima и работают ли они для других игр??? просто я нуб и не понимаю для чего они нужны.
А чо еще нового в версии 2.40. В чем отличия от 2.39 хотелось бы узнать более полный список правок и нововведений.

Автор: cirus 24.12.2017, 3:42

Цитата
Чо за переменные для Ultima и работают ли они для других игр?

Только для ультимы.
Цитата
А чо еще нового в версии 2.40.

http://uopilot.uokit.com/index_rus.php

Автор: DarkMaster 25.12.2017, 11:47

Color бы переделать под способ забора изображения из findcolor. Как вариант сделать два опреатора, т.к. они дают зачастую разные координаты. Дело в том, что в связи с какими-то просто шедевральными изменениями findcolor больше не садит fps вообще. Сейчас приходится финдколор оборачивать в пользовательскую функцию либо использовать его напрямую (ну или по-стринке садим fps).

Автор: FREEON 16.1.2018, 21:14

Так же выдает ошибку: set - Error while creating Lua virtual mashine при работе с findimage, if, while да и прочих командах. Проблема возникла в свежо-скачанной версии пилота 2.40.
Пробовал скачать lua5.1.dll в папку с пилотом - не помогло.
Как лечить болячку?
...
В UOpilot 2.40 b004 вроде фурычит

Автор: cirus 16.1.2018, 22:06

Цитата
В UOpilot 2.40 b004 вроде фурычит

Потому что в этой бетке длл запакована в екзешник, перед запуском пилота проверяется наличие lua.dll, если отсутствует, то распаковывается.
P.S. Кнайт, может уже стоит убрать ссылку на 2.40 и поставить ссылку на 2.40 b004.

Автор: Varlock 17.1.2018, 1:16

На новой версии при запуске любого скрипта появляется ошибка:
"Error while creating lua virtual machine"
Длл и для 5.1 и просто луа.длл в папке есть(я даже в систем32 их скопировал.)

Так же перестал работать поиск картинки почему-то.
Запускаю один и тот же скрипт на 238 версии и на 240, 38-я всё находит, 40-я пишет что картинка не найдена.(потыкался с разными параметрами и картинками, вообще ни при каких условиях не ищет. Причём функция ошибок не возвращает - просто 0, тоесть картинок не найдено.


Винда 7-я pro со всеми обновлениями.


Вот код скрипта на котором я тестил если вдруг поможет:

Код
set #Result FindImage (0 0 800 800 (C:\Users\Владимир\Desktop\автокликер\images\test.bmp) %ResultArray 2 50 1 10)

if #Result > 0
  msg Изображение найдено в координатах X= %ResultArray[1 1] Y= %ResultArray[1 2].
else
  msg Изображение не найдено
  msg ошибка #Result
end_if


wait 10s

Автор: cirus 17.1.2018, 11:24

http://uopilot.uokit.com/index_rus.php
"Ночная" версия
Стабильная
12.12.2017 Build 004
В ней исправлены баги.

Автор: Varlock 17.1.2018, 22:50

В новой версии продолжает появляться ошибка с луа. Однако поиск по картинке у меня начал работать нормально.


Автор: cirus 17.1.2018, 23:01

Цитата
В новой версии продолжает появляться ошибка с луа.

Удалить lua.dll.

Автор: Varlock 3.2.2018, 15:32

в последней версии не работает wheel_up и wheel_down.
При попытке использования высегда выдает ошибку EConvertError " is not valid integer value.
Даже на коде:

Код
    set #x 420
    set #y 350
    wheel_down #x #y abs 3
    wait 10s

Независимо от привязки к окнам и задаю ли я координаты через переменные или прямо в функцию их числами записываю.

При этом на версии 2.38 все работает штатно. (винда стоит седьмая, если что smile.gif )

Автор: genocide 14.2.2018, 7:16

Пилот по прежнему косячит .ini ну или может что то еще сами судите..

Так вот.. в процессе разработки я периодически добавлял и убирал листы. Закрываю на крестик, автосейв при закрытии включен. Перезапускаю пилот - всё на своих местах, как должно быть. Привязываю окна к л2 запускую, и всё ок - играю... жму хоткеи для запуска скрипта 3, 4 и 6 и тут, на тебе ошибка в лог,
один хоткей не может быть назначен двум скриптам одновременно blink.gif . Смотрю скрипт 3 теперь не БД, а свс, жму открыть выбираю скрипт бд для 3 листа, всё опять на местах. Запуск - всё ок. проходит время, БАЦ! свс творит что-то не то, теперь лист 4 с свс внезапно стал c ЕЕ скриптом. Опять жму открыть - выбираю нужный скипт опять всё ок и работает как надо.
Проходит время и опять эта мешанина происходит с одним из листов 3,4 или 6, прям на ходу, ужасно бесит..

Удалить .ini и по новой настроить помогает.
Но стоит мне что-нибудь переделать приходится удалять .ini и настраивать по новой.
Надеюсь в новой версии проблему удастся устранить

Выкладываю архив с пилотом в котором этот баг регулярно выстреливает.
https://drive.google.com/open?id=1BWd5YqHmr4eg1tF97euIPEcxjILl9Zid

Кстати мой скрипт весьма крут и думаю будет востребован в мире л2, только там есть ошибка которую я не могу найти. Иногда.. оч редко.. хиллер промахивается по таргету и хилит не того. Если кто поймет в чём дело можно будет выложить в готовые скипты, а я буду благодарен.

Автор: DarkMaster 12.3.2018, 4:16

А теперь немного вкусностей из ночной кухни smile.gif
Вышла новая ночная сборка хоть и из нестабильной ветки, но весьма достойная внимания.

Теперь мы полностью избавились от проклятого Crystal Lua с его багами и фантазиями разработчика.
В связи с чем полноценно заработал require.Теперь не будет проблем с подключением сторонних плагинов и расширений.
Так же мы перешли с чистого Lua, на LuaJIT. Что это такое и чем нам грозит? Переписывать скрипты не придется. Они полностью совместимы. Разница в динамической компиляции, благодаря которой LuaJIT показывает очень существенный прирост в производительности.

Так же несколько приятных плюшек:
Wknight сделал нажатие по коду клавиши в командах 'send*' и 'sendex*'. Коды указывается в качестве параметров в фигурных скобках. При указании нескольких клавиш, пробелы между скобками обязательны. "send {49} {112}"

В старом синтаксисе исправлен 'return' в 'for' и 'repeat' из двойного 'gosub'.

Поскольку работа кипит и сборка из нестабильной ветки есть и некоторые огрехи:
переменные пилота в луа пока не передаются.


Прикрепленные файлы
Прикрепленный файл  uopilot_d_11.03.2018_Build_004.zip ( 1,68 мегабайт ) Кол-во скачиваний: 212

Автор: Cockney 12.3.2018, 14:46

Это конечно все здорово, но зачем новые фичи идут и в старый синтаксис ? Можно развернутый ответ ? Очень озадачен.

Скрипт даже не желает запускаться. Без ошибок. 0 реакции.

Автор: WKnight 6.4.2018, 22:37

--build 5--

Расширил до 16к строку параметров передаваемую в команду 'prompt'.

Исправил открытие формы параметров персонажа за пределами экрана, при наличии нескольких мониторов.

Сделал автоматическое определение ширины окна команды 'prompt'.

Заменил "Lua 5.1" на "LuaJIT 2.0.5". Убрал сторонний компонент для связи с луа.

Сделал нажатие по коду клавиши в командах 'send*' и 'sendex*'. Коды указывается в качестве параметров в фигурных скобках. При указании нескольких клавиш, пробелы между скобками обязательны. "send {49} {112}".

Исправил 'return' в 'for' и 'repeat' из двойного 'gosub'.

Добавил вывод ошибки запуска скрипта Lua и несколько строк кода вокруг указанной.

Все переменные пилота, которые были доступны из Lua (17 штук), в Lua теперь функции. Те, которые доступны для изменения (9 штук), в качестве параметра принимают новое значение, возвращают старое (включая 'workwindow()').

Починил галочку "Отображать оставшееся время ожидания".

При приостановке скрипта, текущая команда типа 'wait' прерывается.

Во время задержек в скрипте, таймер на панели параметров персонажа продолжает обновляться.

Добавил еще несколько параметров в команду 'hint (fontSize fontColor posX posY width height backColor fontStyle fontName (any text))'. Где
'backColor' - цвет фона;
'fontStyle' - "n" - normal, или комбинация следующих: "b" = bold, "i" = italic, "u" = underline, "s" = strikeout;
'fontName' - имя шрифта установленного в системе.

Добавил в меню по ПКМ того, чего там небыло.

Возвращаемое значение функции 'color' изменено на целочисленное.

Возвращаемое значение функции 'readmem' зависит от типа читаемого значения.


--build 6--

Исправил сломанные команды прокрутки колеса мыши.


Автор: WKnight 6.4.2018, 23:02

Цитата(genocide @ 14.2.2018, 4:16) *
Пилот по прежнему косячит .ini
Причина неизвестна, в результате поверхностного теста, воспроизвести что-либо подобное не удалось.

Попробуй для начала отключить "Отображать имена скриптов на закладках".

Автор: cirus 7.4.2018, 1:44

Код
hint 111

Квадрат Малевича.

Автор: cirus 7.4.2018, 10:05

Код
--lua
while 1 do
    wait (100)
end

При остановке скрипта сообщение: a runtime error. 100

Автор: WKnight 7.4.2018, 11:54

Малевича разукрасил.

Ошибка 100 не воспроизводится.

Автор: DarkMaster 7.4.2018, 12:39

Код
--lua

while 1 == 1 do
    local lastX = mousepos_x()
    local lastY = mousepos_y
    wait (100)
end

a runtime error.
2.2190437311978e-256

Автор: DarkMaster 7.4.2018, 13:33

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

Автор: WKnight 7.4.2018, 18:46

build 8
Убрал сообщение "runtime error", вызванное прерыванием Lua скрипта.

Автор: DarkMaster 8.4.2018, 7:58

Ты его подавил или lua код теперь тоже прерывается нормально?

Автор: WKnight 8.4.2018, 22:45

Отфильтровал. Но эти две вещи не связаны. Как прервать чистый луа - пока вопрос открытый.

Автор: DarkMaster 9.4.2018, 7:37

всегда можно прибить нитку с машиной)

Автор: DarkMaster 9.4.2018, 9:53

Проблемы с подключением файлов через require:

Код
--lua


local serpent = require"serpent"
--log(serpent)
end_script()



Прикрепленные файлы
Прикрепленный файл  serpent.lua ( 21,98 килобайт ) Кол-во скачиваний: 247

Автор: WKnight 4.5.2018, 17:10

build 9
Добавил переключение закладок скриптов по Ctrl+Tab, Ctrl+Shift+Tab.
Сделал функцию 'mouse_pos (["abs"])' в Lua. Возвращает два числа - x,y.

Автор: WKnight 6.5.2018, 22:44

В нестабильной ночнушке от 06.05.2018 Build 009
Сделал принудительное закрытие VM Lua, при остановке скрипта.


Автор: DarkMaster 6.5.2018, 23:38

Это соседние скрипты не рушит?

Автор: WKnight 7.5.2018, 2:51

Не проверял, но не должно, вм перезапускалась и раньше, сейчас просто принудительно прибивается. Мне это не особо нравится, но иного способа прервать скрипт на чистом Луа, я пока не нашел.

build 10
Сделал принудительное закрытие VM Lua, при остановке скрипта.
Исправил функции 'findcolor', 'findimage' в Lua.
Добавил возврат "nil" и "LuaTable", как было в предыдущей версии Lua.

Автор: DarkMaster 7.5.2018, 12:21

Хз можно ли снаружи принудительно в скрипте включить дебаг и пуш функции, но если это можно сделать, то включаем дебаг, включаем выполнение фукнции после каждого перехода строки, функцию делаем специально с ошибкой, чтобы скрипт выбило. Вывод ошибки подавляем. В луа нет встроенной функции выхода даже из самого кода. Предполагается, что выполнение закончится либо в конце скрипта либо через return снаружи функций. Беглый поиск ничего умного не дал, но этот костыль хотя бы относительно безопсный.

Автор: MAXXIMUM 22.5.2018, 0:06

В версии 2.40d b010 от 19.05 криво работают следующие функции:

set Clickoffsetx
set Clickoffsety

Для команд Kleft и Kright они работают хорошо, но вот на команду Move влиять перестали

Автор: cirus 22.5.2018, 1:53

Цитата
но вот на команду Move влиять перестали

Пока не исправлено можно использовать баг:
Код
set Clickoffsetx 50
set Clickoffsety 30

move 100 200 nooffset  // должно работать наоборот, т. е. игнорировать Clickoffset
wait 100
msg Координаты курсора: mouseposabs_x mouseposabs_y
end_script

Автор: MAXXIMUM 22.5.2018, 13:59

Цитата(cirus @ 22.5.2018, 1:53) *

Пока не исправлено можно использовать баг:
Код
set Clickoffsetx 50
set Clickoffsety 30

move 100 200 nooffset  // должно работать наоборот, т. е. игнорировать Clickoffset
wait 100
msg Координаты курсора: mouseposabs_x mouseposabs_y
end_script




Надеюсь скоро будет исправлено. У меня более 200 параметров Move в каждом скрипте из 8

Автор: WKnight 23.5.2018, 7:15

Сегодняшняя нестабильная ночнушка.

Автор: cirus 1.6.2018, 1:48

Зачем save_array добавляет табуляцию в конец строки? Она нужна вообще?

Автор: DarkMaster 1.6.2018, 8:11

Может быть убрана. Просто когда пишешь сохранение, то так получается само по себе заачастую. В противном случае первый/последний виток цикла обрабатывать приходится индивидуально. Точно так же ты можешь наблюдать пустую строку в конце герерированных файлов (не только про пилот).

Оно мешает?

Автор: cirus 1.6.2018, 11:27

Цитата
Оно мешает?

Пока нет. Но, если сохранённый файл читать из lua, то строки будут с табуляцией.

Автор: DarkMaster 1.6.2018, 13:49

Цитата
Пока нет. Но, если сохранённый файл читать из lua, то строки будут с табуляцией.

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

Автор: WKnight 8.6.2018, 15:36

build 11

При вставке в скрипт Lua из меню по пкм, к именам функций добавляются круглые скобки.

При выводе сообщений в лог, символ '\n' дополняется до '\r\n'.

Исправил 'clickoffsetx' и 'clickoffsety' в комамнде 'move'.

В Lua добавил функцию 'get_script_text (номер_скрипта)'. Возвращает в таблицу скрипт с указанным номером, либо текущий, если номер не указан.

Убрал все преобразования строки, выводимой в лог из Lua. Оставил только дополнение '\n' до '\r\n'.

Исправил утечку памяти, появившуюся при смене Lua.

Библиотека Lua загружается и инициализируется только при запуске скрипта на Lua.

Автор: cirus 9.6.2018, 1:50

Цитата
build 11

Код
--lua
log (123)

Зависает.
Если после запуска пилота открыть лог кнопкой, то потом нормально работает.

Автор: cirus 9.6.2018, 23:45

Код
--lua
local s="save"
log(s)

В 11 бете ничего не выводит. В предыдущих ошибка.

Автор: DarkMaster 16.6.2018, 9:58

После очень долгой работы (суток 10-20).
Прикрепленное изображение

Автор: AbsorbeR 27.6.2018, 16:14

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

Примерно полтора года назад столкнулся с ситуацией:
https://forum.uokit.com/index.php?showtopic=29951
У меня не получилось перехитрить игру. Делал через оконный. Если у кого-то есть спортивный интерес, то игра Sinister City в Steam. Вдруг кто-то решит заморочиться.

Ушел искать бету. Погоняю через неё актуальные скприты. Может чего сообщу. Надеюсь, что Винду не уронит.

Автор: AbsorbeR 28.6.2018, 20:18

Цитата(DarkMaster @ 16.6.2018, 9:58) *

После очень долгой работы (суток 10-20).
Прикрепленное изображение

Что у тебя до wait 500? Int ограничен в размерах, неудивительно, что он помер. Хотя, я не исключаю, что если wait опирается на внутренний таймер, считающий время с начала скрипта, то обращение к этому таймеру и завалило его.
Код

if  #timeNextBuff1 < timer              // Первый блок
    send {F1}
    wait 2000
    set #timeNextBuff1 timer + 120000   // Указываем через сколько времени повторить действие в миллисекундах (1000 = 1 cек).
end_if

Вот подобное в цикле также убьёт скрипт.

Автор: AbsorbeR 29.6.2018, 1:10

Итак, поставил последнюю версию.

Мои пожелания:
- меню, где выпадающие списки "скрипт, макрос, настройки, справка", нужно сделать ограничение по минимальной ширине, чтобы не было 2-х строк.
- внизу, кнопки управления, как видно, находятся внутри какого-то блока. Я сопоставил размеры кнопок внутри и блока. Увеличить кнопки в высоту, за счет уменьшения отступов, или даже с полным наложением упростило бы попадание по кнопкам.
- вкладки: при активации на вкладку она как бы проваливается, при этом повляются границы dotted. Эти границы мешают. Для выделения достаточно затемнять неактивные.
- так как элементы маленькие, особенно квадратики зеленые и красный (старт/стоп), то было бы круто для них сделать что-то вроде помощи в прицеливании.
- см. баг 1. Если кто-то всё же будет настолько упорот, что ему нужно будет там 10-тизначное число, то следует обозначить, что у этого наркомана за границами ещё цирфы. Хорошим решением будет вывод значения в подсказке при наведении. "100 миллисекунд - пауза между строками".

Баги:
- в паузу между строками можно писать значение, начинающееся с ноля. Можно вписать 30-тизначное число и получить "Неправильно указана задержка между строк". Кому нужно 30-тизначное число? laugh.gif Ещё можно писать туда буквы и дроби (не варит, да и не надо). Решение: input'у позволить принимать только цифры типа int с каким-то максимальным кол-вом символов.
- prompt (подсказка) вызвала окно, где кнопка OK частично перекрывает input. С окна с несколькими вариантами вообще "ОК" можно убрать, так как нажатие по варианту и так срабатывает, как подтверждение с закрытием окна.

Интерфейс случаем не через Windows Forms делается?

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

Подтверждение исправления:
- b011 при первом запуске распаковал lua5.1.dll и libgcc_s_dw2-1.dll
- log window показывает о сочетании клавиш для остановки всех скриптов

Понравилось:
- группировка по вкладкам в меню "Настройки"


Эскизы прикрепленных изображений
Прикрепленное изображение Прикрепленное изображение

Автор: AbsorbeR 30.6.2018, 0:33

UOPilot повесился. На вкладке был скрипт, которые не выполнялся. Была выделена одна буква (первая) у строки wait 500. Были выбраны #handle и имя окна через ctrl+A, которые принадлежали уже закрытой программе. Тыкнув на что-то из них, кнопку 'log' или checkbox справа, пилот повесился.

Автор: WKnight 1.7.2018, 11:36

build 12
Добавил функцию получения приоритета процесса 'GetProcessPriority ([handle|PID])'. Если хендл не указан, возвращает приоритет пилота. Возвращаемые значения: '-3' - Error; '-2' - Idle priority; '-1' - Below normal priority; '0' - Normal priority; '1' - Above normal priority; '2' - High priority; '3' - Realtime priority;

Добавил функцию установки приоритета процесса 'SetProcessPriority ([[handle|PID] priority=0])'. В случае успеха возвращает "0", иначе код ошибки. Если хендл не указан, устанавливает приоритет пилота. В качестве 'priority' используются теже значения, что возвращает 'GetProcessPriority'.

В тестовом режиме добавил функцию установки маски ядер процессора для указанного процесса 'SetProcessAffinityMask ([[handle|PID] mask=0])'. В случае успеха возвращает "0", иначе код ошибки. Если хендл не указан, устанавливает приоритет пилота. В качестве 'mask' указывается "0" - все ядра, либо сумма следующих значений: 1 = CPU 0; 2 = CPU 1; 4 = CPU 2; 8 = CPU 3; итд...

Автор: DarkMaster 1.7.2018, 11:57

Цитата
сумма следующих значений: 1 = CPU 0; 2 = CPU 1; 4 = CPU 2; 8 = CPU 3; итд...

В текущих реалиях уже можно выйти за пределы int на xeon'ах с гипертрейдингом. Может лучше строкой типа 11001101? Или маска прям так и задается через апи, как сумма значений?

Автор: WKnight 1.7.2018, 13:15

Цитата(cirus @ 9.6.2018, 20:45) *

Код
--lua
local s="save"
log(s)

В 11 бете ничего не выводит. В предыдущих ошибка.
По идее ошибка должна быть, так как недостаточно параметров. Это зарезервированное слово, для сохранения лога в файл.


Цитата
Или маска прям так и задается через апи, как сумма значений?

Там тупо двойное слово.

Каждому ядру свой бит.

Автор: WKnight 1.7.2018, 13:26

build 13

Исправил ошибку вывода первого сообщения из скрипта Lua, при ниразу не открывавшемся логе.

Добавил вывод сообщения об ошибке, при ексепшене в скрипте Lua.

Автор: DarkMaster 2.7.2018, 17:44

:start
set %a getimage (1 1 1920 1080 workwindow)
deleteimage (%a[1 1])
wait 10
goto start

Память утекает мгновенно. Вообще из этой радости можно сделать очень неплохой просмотр перекрытых окон =)

Автор: WKnight 3.7.2018, 7:18

deleteimage функция. Не заметил утечек.

Автор: DarkMaster 3.7.2018, 18:08

Забавно. Ну функция, ну не нужно мне возвращать результат. И?
deleteimage (%a[1 1]) - утечка
set #e deleteimage (%a[1 1]) - нет утечки

Автор: WKnight 4.7.2018, 7:27

Если оно функция, то оно всегда возвращает, и то, что оно возвращает надо забирать. Если оно команда, то оно ничего не возвращает, и соответственно забрать ты у него ничего не можешь. Это абсолютно разные обработчики. Включи галочку "останавливать скрипт на неопознанной команде" и ты сразу найдешь ошибку.
Можно кстати подумать на тему как всё сделать функциями с необязательной обработкой возвращаемого значения, но это в будущем, а пока так.

Автор: DarkMaster 4.7.2018, 17:38

Цитата
Можно кстати подумать на тему как всё сделать функциями с необязательной обработкой возвращаемого значения, но это в будущем, а пока так.

Имхо лучше сделать уклон на Lua.

Автор: WKnight 4.7.2018, 19:13

В луа и так всё функциями, даже вот такое работает smile.gif
log(wait (2000))

Автор: DarkMaster 4.7.2018, 22:28

Цитата
В луа и так всё функциями, даже вот такое работает smile.gif
log(wait (2000))

Это я в курсе. И в возращать там не обязательно) Я тебе про то, что с луа есть проблемки в частности конвертации типов данных. Лучше на этом сфокусироваться, если рассматривать обновы скриптового движка, нежели добавлять подобный функционал в старый движок.

Автор: DarkMaster 11.7.2018, 12:20

random() - возвращает строку, а не число.
Каждый раз после остановки скрипта луа всплывающее окошко "Операция проведена успешно". Почувствовал себя хирургом-рекордсменом =)

Что есть фикс финдимиджа? Можно какое-то более детальное описание? Что-то менялось по синтаксису?

Автор: WKnight 11.7.2018, 18:00

Рандом починил. Сегодняшняя нестабильная ночнушка.
Сообщения такого что-то не обнаружил.
Фикс десятого билда? Возвращали в луа неверное количество параметров.

Автор: DarkMaster 11.7.2018, 18:43

Каков сейчас полный синтаксис финдов в lua? Массив на свое место перекочевал? Перед знаком равно всмысле.
Прикрепленное изображение

Автор: DarkMaster 12.7.2018, 0:06

Параметры НЕ стрингом и без конвертаций скртых, а нормально можно передать в финды?

Нумерация строк в луа начинается с 1. Можно привести в соответсвие редактор?
Так же был обнаружен странный плавающий баг с require.Он переодически перестает находить скрипты. Адреса при этом вроде не съезжают... Воспроизведения добиться не получается. Лечится перезапуском пилота.

Автор: DarkMaster 12.7.2018, 16:27

Возники проблемы с dir в старом lua скрипте. Что изменено? Убрана ли конвертация? Из-за нее ранее были проблемы со слипанием макски и флага рекурсии в один параметр.

Автор: DarkMaster 15.7.2018, 20:17

После сохранения скритпа dircreate начинает работать относительно скрипта, так же при этом require в луа теряет подключаемые скрипты. Лечится перезапуском. Подозреваю, что меняется рабочая директория.
windowpos, который есть get и set, у нас остался в луа только get.

Автор: DarkMaster 25.7.2018, 21:25

filerename требует двойного экранирования кавычками при использовании в луа, если имена содержат пробелы. Т.е. сначала мы берем в кавычки строку, т.к. это строка и строки в луа передаются в кавычках, потом нужны еще одни кавычки, т.к. при получении пилотом параметров кавычки не передаются, а лишь служат признаком строки. Короче говоря опять идет конвертация параметров туда-сюда и из-за этого нужны доп экраны. Подозреваю, что это будет со всеми операторами работы с файлами.

Автор: DarkMaster 27.7.2018, 15:06

SetProcessPriority, GetProcessPriority, SetProcessAffinityMask - в луа не существуют.
При эмуляции через:
--lua
set ("SetProcessPriority(" .. handle .. ", 3")
Приоритет почему-то был выставлен высокий, а не реал тайм.

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


Автор: WKnight 5.8.2018, 1:20

--lua
setprocesspriority(workwindow() , 3)

lua чувствителен к регистру, поэтому все функции зарегистрированы только маленькими буквами.

Автор: DarkMaster 5.8.2018, 15:02

Цитата
lua чувствителен к регистру, поэтому все функции зарегистрированы только маленькими буквами.

А что-то мешает их пушить не только маленькими? =)

Кнайт, допили финды для нормального задания параметров, пожалуйста. Хочу в порядок привести скрипт по распознаванию.

Автор: WKnight 5.8.2018, 18:36

Чем больше вариантов, тем дольше работает парсер.

Так параметры у финдов вроде давно из луа нормально задаются, без преобразования в строку. Или где-то проскакивает старый вариант?

Автор: DarkMaster 5.8.2018, 19:21

Цитата
Чем больше вариантов, тем дольше работает парсер.

Каких вариантов? Он что так один, что так. Насколько я понимаю там создается некоторая таблица и из нее дергаются указатели на функции, где сложность вроде как должна равняться N, ну и дополнительно нагрузку дает длина имени функции. Размер словаря вроде вообще ни на что влиять даже теоретически не может, т.к. даже если сравниваются ключи стрингами, то там идет строгое сравнение. Или ты не напрямую функции в машину луа передаешь? Нежели ты какие-то заглушки возвращающие название функции передаешь, а потмо парсишь результат?

Цитата
Так параметры у финдов вроде давно из луа нормально задаются, без преобразования в строку. Или где-то проскакивает старый вариант?

Ну лично я смог завести только через :
local a = findimage("весь набор параметров строкой")
При этом создается глобальный массив, что сильно не есть хорошо, а параметры насколько я понимаю все так же конвертятся в стринг и после чего уходят в стандартный парсер пилота. Это кощунство.

Автор: Cockney 5.8.2018, 20:23

Цитата(DarkMaster @ 5.8.2018, 19:21) *

Размер словаря вроде вообще ни на что влиять даже теоретически не может, т.к. даже если сравниваются ключи стрингами, то там идет строгое сравнение.



Ну вот как раз если бегать по словарю и сравнивать строки хоть как, то размер будет влиять. В православных плюсах есть unordered_map и куча его братьев с хешированием, вот там все что ты описал. Только луа на си написан, а реализации хешей не увидел.

Если по делу, то либо системные функции все писать с большой, либо опять же все с маленькой. А пользовательские соответственно. Интуитивно же понятно будет что перед тобой.

Автор: DarkMaster 5.8.2018, 20:27

Цитата
Ну вот как раз если бегать по словарю и сравнивать строки хоть как, то размер будет влиять.

Только при поиске в середине строки и нечетком сравнении. Тут же по сути дела идет побитовое, т.к сравниваем мы с начала строки и ее содержимое и словарь вообще никак не интересуют. Либо точное побитовое совпадение, либо мимо. Тут скорее есть обратная проблема - при маленьком словаре выше вероятность одинакого начала имен, что будет приводить к более долгому сравнению.
Цитата
В православных плюсах есть unordered_map и куча его братьев с хешированием, вот там все что ты описал. Только луа на си написан, а реализации хешей не увидел.

Насколько я понимаю Lua это один сплошной vector. Учитывая что по сути все данные в луа есть таблица, то видимо что-то нахимичили с хеш таблицами или над тем же вектором поиздевались. Слабо представляю себе реализацию языка полностью состоящего из древообразных таблиц без использования хеш таблиц.

Автор: WKnight 5.8.2018, 22:25

Как то так
aa, c = findimage(10, 20, 1020, 810, {"C:\\tmp\\image.bmp"}, 2)

Странно, я был уверен, что все вкурсе...

Ваське числа десятого мая писал об этом. Потестить просил smile.gif

Автор: cirus 5.8.2018, 22:52

Если картинка не найдена возвращает таблицу вместо nill.
Т. е.

Код
aa = findimage(10, 20, 1020, 810, {"C:\\tmp\\image.bmp"}, 2)
if aa then
    move(aa[1][1], aa[1][2])  -- ошибка, если картинка не найдется
end


Автор: DarkMaster 6.8.2018, 7:04

Цитата
Ваське числа десятого мая писал об этом. Потестить просил

Прохлопал где-то.
Про nil уже и я писал и цирус пишет. Не нашло - должна вернуться не таблица, а nil.
Очень большой вопрос для меня почему работает вот это:
--lua
local a = findimage("297, 1, 323, 30 (images\\test.bmp) %arr 2, 90, 1 , 3")
log(a, arr)
В качестве единственной причины могу лишь предположить, что параметры переданные через луа конвертятся в стринг и обратно. Очень хочу ошибиться. Может перегрузки какие-то?

// Лог после отключения парсинга стал просто летать. Правда почему-то повяляются иногда паразитные переносы. Причину пока установить не удалось. Возможно мой косяк в дебаггере.

Автор: WKnight 6.8.2018, 7:55

Это работает для совместимости. Если параметры переданы строкой, то передаются старому парсеру, который также работает в пилотовском скрипте.

Автор: DarkMaster 6.8.2018, 14:24

можно ли мечатать не безрезультатно о хотфиксе nil?

Автор: DarkMaster 6.8.2018, 16:03

Цитата
Если картинка не найдена возвращает таблицу вместо nill.

в ночнушке появился фикс. можно тестить =)

Автор: DarkMaster 19.8.2018, 21:52

arr = dir("d:\\!lua", "*.exe", "norecursion")
работает корректно, раньше без пробела " norecursion" не работало - слепляло маску и флаг рекурсии.
НО с пробелом
arr = dir("d:\\!lua", "*.exe", " norecursion")
тоже работает. Т.е. либо любимый костыль с приведением к старой доброй строке (нет в ней ничего доброго tongue.gif) либо ошибочно проставлена функция и сравнение не строгое, а используется поиск внутри строки.

Автор: DarkMaster 20.8.2018, 15:46

findimage не допилен (вероятно и колор). Точнее массивы вроде доделали, основательно перелопатил свой скрипт по распознаванию приводя его в соответствии с реалиями и неожиданно встретил конвертацию возвращаемого имиджем результата из стрингов в числа. Убрал конвертацию - не завелось. Вся таблица состоит из стрингов:
a[1][1]=25 type: string
a[1][2]=5 type: string
a[1][3]=34 type: string
a[1][4]=16 type: string
a[1][5]=91 type: string
Прошу пофиксить пока у меня весь скрипт разобранный, чтобы потом к этому не возвращаться.

Автор: WKnight 22.8.2018, 18:30

Про этот момент как-то даже мысли не возникало.
Финдимидж и финдколор проверь в нестабильной ночнушке.

Автор: DarkMaster 23.8.2018, 13:30

Цитата
Финдимидж и финдколор проверь в нестабильной ночнушке.

table: 1
1 = "20"
2 = "56"
3 = "28"
4 = "66"
5 = "100"
.\luaPlugins\\FindStringDev.lua:828: attempt to compare number with string
Тоже самое

local a = findcolor(377, 515, 379, 519, 1, 1, {16777215}, 2)
ext.lg(a)
>> table is "nil" data type. Value: nil

local a = findcolor(377, 515, 379, 519, 1, 1, 16777215, 2)
ext.lg(a)
>>table is "number" data type. Value: 15

Итого: финдимидж возвращает так же стрингом. Финдколор не реализован синтаксис - работает в пилотовском виде.

Автор: WKnight 23.8.2018, 20:24

Упс, оказалось две похожих функции.
Финдимидж подправил.

Автор: DarkMaster 23.8.2018, 20:38

Спасибо. Отшуршало нормально. Я надеюсь там не tonumber?)) Хотя как оказалось данное преобразование настолько шустрое, что за одну секунду делает около десяти миллиардов о.О

Автор: AbsorbeR 24.8.2018, 23:27

А можно как-то улучшить редактор? От отсутствия подсветки синтаксиса колбасит. И ещё, научить UOPilot игнорировать по умолчанию своё окно, если оно перекрывает нужное.

Автор: cirus 25.8.2018, 2:27

Цитата
От отсутствия подсветки синтаксиса

http://uopilot.tati.pro/index.php?title=Подсветка_синтаксиса

Автор: Cockney 25.8.2018, 9:23

Цитата(cirus @ 25.8.2018, 2:27) *

http://uopilot.tati.pro/index.php?title=Подсветка_синтаксиса




А если луа ?

Автор: cirus 26.8.2018, 21:56

Убрать в ночной версии сообщение в лог что луа загружен, при первом запуске скрипта.

Автор: FREEON 26.8.2018, 22:46

Цитата(AbsorbeR @ 24.8.2018, 23:27) *

И ещё, научить UOPilot игнорировать по умолчанию своё окно, если оно перекрывает нужное.

Теоретически это возможно запилить. Курсор пилот игнорирует и видит сквозь него... Вот если параметры окна пилота задать как у курсора то можно воплотить... Другое дело как это реализовать.

Автор: DarkMaster 26.8.2018, 23:26

Цитата
Теоретически это возможно запилить. Курсор пилот игнорирует и видит сквозь него... Вот если параметры окна пилота задать как у курсора то можно воплотить... Другое дело как это реализовать.

По факту это будут все те же left'ы, которые не везде работают и анализ цвета через хендл такой же, как уже реализован в финдах. Итого - уже можно игнорировать и не просто пилот, а вообще все, но ограничено приложением. Если касательно именно пилота - ну сворачивайте, разворачивайте обернув функции кликов.

Автор: WKnight 27.8.2018, 12:08

Цитата
Убрать
Убрал.

Автор: WKnight 20.9.2018, 0:10

build 14

Исправил функцию 'random()' в Lua, теперь возвращает число.

Если картинка или цвет не найдены, то 'findimage' и 'findcolor' в Lua возвращают nil вместо пустой таблицы.

Убрал сообщение 'Операция успешно завершена' выводившееся при остановке Lua скрипта.

Массивы, возвращаемые функциями 'findimage' и 'findcolor' в Lua, теперь числовые.

Исправил 'findwindow' при использовании из скрипта Lua. Если ничего не найдено, то возвращает "nil", а не пустую таблицу. При вызове без параметров, возвращает данные активного окна.

Хендл, возвращаемый функцией 'findwindow' в Lua, теперь число.

Размер сообщения, выводимого в лог, сейчас увеличен до 1к.

Автор: DarkMaster 20.9.2018, 3:40

Приятный сюрприз smile.gif

Автор: WKnight 20.9.2018, 13:03

Не стабильная:

Команда 'get clipboard' очищает принимающий массив.

Убрал преобразование переменных в получаемом буфере обмена при использовании команды 'get clipboard %array'.

Починил 'clipboard' в Lua.
'clipboard(text)' - один параметр, установка;
'string = clipboard()' - без параметров, получение одной строкой;
'array = clipboard(0,"string","word")' - больше одного параметра, разбивка в массив по словам, или по строкам, или по словам и по строкам.

Автор: DarkMaster 20.9.2018, 16:39

Цитата
'array = clipboard(0,"string","word")' - больше одного параметра, разбивка в массив по словам, или по строкам, или по словам и по строкам.

Что за "0"? Костылик для количества параметров? Может тогда лучше "r" - типа read, как флаги открытия файлов?

Автор: WKnight 20.9.2018, 17:44

Оно костыль, ему пофиг кем, главное быть smile.gif
Так тоже можно 'array = clipboard("string","word")'

Автор: WKnight 13.10.2018, 14:46

build 15
Команда 'get clipboard' очищает принимающий массив.

Убрал преобразование переменных в получаемом буфере обмена при использовании команды 'get clipboard %array'.

Починил 'clipboard' в Lua.
'clipboard(text)' - один параметр, установка;
'string = clipboard()' - без параметров, получение одной строкой;
'array = clipboard(0,"string","word")' - больше одного параметра, разбивка в массив по словам, или по строкам, или по словам и по строкам.

Подправил передачу больших целых чисел из Lua. Больше не должны выводится в экспоненциальной форме.

Исправил ошибку в командах 'set hotkeystart' и 'set hotkeypause'.

Добавил в функцию 'findcolor' поиск цвета в загруженной области.

Добавил проверку захвата изображения по хендлу, при нажатии Ctrl+A для привязки скрипта к рабочему окну. Включается галочкой "Check image capture by handle", находящейся рядом с кнопкой "F" на форме скрипта. Если изображение не может быть получено, или возвращен черный квадрат, то берется родительский хендл и снова проверяется пока не будет получено изображение. В результате проверки в лог выводится цепочка проверенных хендлов и заголовок окна, необходимого для правильного определения цвета, либо сообщение об ошибке.

Добавил команду проверки захвата изображения по хендлу. Возвращает смещение по координатам и правильный хендл, либо 0.
'set #newhandle checkgetcolor (#x #y #handle)' // UoPilot, в переменные #x #y возвращает смещение.
'handle, offset_x, offset_y = checkgetcolor (handle)' -- lua

Исправил вывод в лог длинных сообщений.

Автор: DarkMaster 13.10.2018, 15:48

Цитата
Включается галочкой "Check image capture by handle", находящейся рядом с кнопкой "F" на форме скрипта.

Может в настройки вынести? Едва ли оно нужно для частого переключения. Вкл по умолчанию.

Автор: WKnight 17.10.2018, 18:09

Вынес.

Нестабильная ночнушка.
set #a findmemory (-1 value type %result 100 workwindow)
возвращает количество найденных либо код ошибки.
-1 - зарезервировано, обязательно
value - искомое значение. если строка не сплошная, то в кавычках.
type - тип предыдущего аргумента, также как в командах чтения\записи в память
%result - принимающий массив
100 - зарезервировано, обязательно
workwindow - хендл рабочего окна

Пока так.


В 64х битных процессах сканирует только первые 32 бита. Пока не нашел как вторые 32 бита перечислить.

Автор: DarkMaster 17.10.2018, 20:26

Цитата
Пока так.

Про луашные примеры не забывай. Потом очень сложно бывает понять казавшиеся когда-то очевидными вещи.
Цитата
В 64х битных процессах сканирует только первые 32 бита. Пока не нашел как вторые 32 бита перечислить.

Насколько я понимаю в данный момент при x64 адресации указатели есть 64 битные (просто гениально), но часть адресации остается 32 битной для модулей. Будь аккуратен с этим. Так же пара советов благодаря которым отказался от артмани и перешел на чит инжин:
1) поиск кратных адресов. В реалиях очень редко полезные адреса не кратны 4.
2) возможность игнорировать области памяти недоступные для записи.
3) увод приложения в suspended во время сканирования.
4) многопоточность (имхо тут прикручивать сразу т.к. разница в скорости коллосальная, а масштабировать очень легко).

Автор: cirus 19.10.2018, 2:08

Цитата
set #a findmemory (-1 value type %result 100 workwindow)
workwindow - хендл рабочего окна

Ищет в окне, к которому привязан скрипт, а не по указанному хендлу.
Может в readmem и writemem добавить параметр хендл окна. Чтобы можно было получать данные с других окон, не меняя рабочее окно.


Автор: sutra 19.10.2018, 8:46

findcolor некорректно работает с изображением в памяти. Левый верхний угол изображения обрабатывает правильно, а вот правый нижний глючит конкретно. Задаю диапазон поиска по ординате 439..444. Файнд типа нашёл требуемый пиксель, а параметр %arr[1 2] возвращает НУЛЬ. Кстати и в нулевой ординате такого пикселя нет.

И если не составит труда, просветите меня пожалуйста (хотя бы в общих чертах), в чём преимущества LUA? Насколько я понимаю сейчас именно в этом направлении развивается Пилот.

Автор: cirus 19.10.2018, 11:37

Цитата
в чём преимущества LUA?

2 одинаковых скрипта, один на lua, другой на языке пилота:
Код
--lua
local t, z = os.clock(), 0
for i=1, 100000000 do
    z = z + 1
end
log ("Затрачено времени: " .. string.format("%.3f", os.clock()-t) .. " мсек" .. " , z = " .. z)

Код
set #t timer
set #z 0
for #i 1 100000
    set #z #z + 1
end_for
set #t timer - #t
log Затрачено времени #t мсек, z = #z
end_script


Автор: sutra 19.10.2018, 16:41

Спасибо, а где бы поучиться этому?

Автор: DarkMaster 19.10.2018, 17:21

WKnight, findwindow возвращает хендл стрингом.

Цитата
Спасибо, а где бы поучиться этому?

С английским как?
http://tylerneylon.com/a/learn-lua/
По сути все, что нужно на первых парах.

Там на самом деле еще вагон плюшек помимо скорости. Чего только стоит нормальное экранирование символов и деревья.

Автор: sutra 19.10.2018, 17:40

Да-да-да... Без пол-литра не получится. Собственно мне и нужны примочки Пилота, финды .. винды, а про это там ни слова. Вот язык Пилота понятен даже с церковно-приходским образованием. Грубо говоря нужны примеры, а кто мне их на халяву даст? А за деньги ... я уже слишком стар, на пенсию учиться не получится. Всё равно спасибо Дарк,для меня ты Лайт.

Автор: DarkMaster 19.10.2018, 18:15

Цитата
Собственно мне и нужны примочки Пилота, финды .. винды, а про это там ни слова.

А они по сути никуда и не делись и не изменились. Самая большая разница - все параметры теперь передаются внутри скобок. Остальное осталось прежним.

Автор: sutra 19.10.2018, 18:26

Без конкретных примеров я не осилю. Метод тыка тут не сработает.

Автор: sutra 19.10.2018, 18:39

Если Кнайт доведёт до ума Файнды, больше ничего и не надо. А если всё-таки сделает поиск цветовой разницы с параметром типа (R-G(20), R-B(30)), то вообще не будет проблем. На этом принципе я сделал распознаватель текста, анализ 8-ми реперных точек, лично у меня даёт 100% результат, на любом фоне, при приличном рендеринге и работает достаточно быстро.

Автор: sutra 19.10.2018, 19:24

Нашёл примеры. Будем пробовать.

Автор: DarkMaster 19.10.2018, 23:44

Столкнулся со странной проблемой. Финдимидж в lua синтаксисе возвращает два числа 4 и -5 и не возвращает при этом массив. В окне скрина _белый_ малевич. Это что?

Автор: DarkMaster 20.10.2018, 2:14

Привязываемся к хрому.

set $var getwindowtext (workwindow)
log $var
set %arr findwindow($var)
log find: %arr[1 1] %arr[1 2]

вывод в лог:
2:13:10 4 (autosaved_4.txt, 16): Chrome Legacy Window
2:13:10 4 (autosaved_4.txt, 18): find:

Т.е. имя текущего рабочего окна успешно дергается, а вот найти финдом не может его.

Автор: DarkMaster 20.10.2018, 2:43

getwindow - возвращает стринг

Автор: DarkMaster 20.10.2018, 3:26

После сохранения по-прежнему съезжают относительные адреса. В случае с lua каждое сохранение = перезапуск пилота ибо все едет.

Автор: gosu 20.10.2018, 10:20

Uopilot не взаимодействует с орионом, можно как то починить? Не работает автомув, статы и прочее тоже не показывает.

Автор: WKnight 20.10.2018, 11:32

Цитата
4 и -5

4 - это скорее всего у тебя четвертым параметром идет путь к файлу,
-5 - это скорее всего загруженная картинка обработана, но в ней не обнаружено что искать.

Цитата
Т.е. имя текущего рабочего окна успешно дергается, а вот найти финдом не может его.

Chrome Legacy Window дочернее окно, мы разве умеем дочерние искать?

Автор: WKnight 20.10.2018, 13:55

Цитата
После сохранения по-прежнему съезжают относительные адреса. В случае с lua каждое сохранение = перезапуск пилота ибо все едет.
Напомни о чем речь, Че-то я запамятовал.

Автор: DarkMaster 20.10.2018, 15:30

Цитата
Chrome Legacy Window дочернее окно, мы разве умеем дочерние искать?

А что нет? о.О
Вообще имхо уже давно пара в пилот вкрутить и классы опционально задаваемые. Если есть необходимость могу дать исходники плагина своего с выдергиванием кучи инфы.
Цитата
4 - это скорее всего у тебя четвертым параметром идет путь к файлу,

Пятым параметром оно идет. Почему это вместо массива то возвращается?
Цитата
Цитата
После сохранения по-прежнему съезжают относительные адреса. В случае с lua каждое сохранение = перезапуск пилота ибо все едет.
Напомни о чем речь, Че-то я запамятовал.

Когда делаешь require, запись/чтение файла с относительными адресами, то эти адреса рассчитываются относительно ехе пилота. Если сохранить скрипт в, скажем, scripts/, то относительные адреса начнут рассчитыватья относительно scripts/, после перезапуска все приходит в норму.

Автор: WKnight 21.10.2018, 1:44

Цитата
исходники плагина своего
Скинь, почитаем для лучшего понимания.
Цитата
Почему это вместо массива то возвращается?
Оно вернуло код ошибки, в этом случае оно не может вернуть массив. Четверка - это просто где-то служебную информацию не убрал. Почистим на досуге.
Скинь строку вызова функции, и проверь из обычного скрипта, не луа. Можно еще искомую картинку проверить.
Цитата
запись/чтение файла с относительными адресами
Ааа, раньше это называли путь к файлу, поэтому недопонял smile.gif


build 16

Галочку "Check image capture by handle" перенес в настройки\разное. Включена по умолчанию.

Добавил функцию поиска значений в памяти 'findmemory (count value type %result accuracy workwindow)'.
Возвращает количество найденных элементов, либо код ошибки.
Параметры:
count - предельное количество, -1 - все;
value - искомое значение. если строка не сплошная, то в кавычках;
type - тип предыдущего аргумента, также как в командах чтения\записи в память;
%result - принимающий массив;
accuracy - точность поиска последовательности значений;
workwindow - хендл рабочего окна;
В 64х битных процессах пока сканирует только первые 32 бита.

Подправил обновление переменной 'workwindow' при нажатии Ctrl+A.

Исправил функцию 'getwindow()' в Lua, теперь возвращает число.

Дочинил. Хендл, возвращаемый функцией 'findwindow' в Lua, теперь число.

Добавил в команды 'readmem' и 'writemem' чтение\запись по хендлу.
'readmem <variable> <adress> <type> <size> [handle] [modulename]'
'writemem <variable> <adress> <type> [handle] [ModuleName] [result]'

Добавил команды скрытия курсора мыши: 'mouse <hide|show>'. Уводит курсор в правый верхний угол экрана и держит его там. При закрытии пилота освобождает курсор.

Автор: DarkMaster 21.10.2018, 2:11

Цитата
Оно вернуло код ошибки, в этом случае оно не может вернуть массив.

Ну понятно, что не может вернуть. Без проблем, что не возвращает массив при это. Проблема в том что конструкции типа:
local arr = findimage
if arr then
.....
end
Начинают сыпаться.

Цитата
Ааа, раньше это называли путь к файлу, поэтому недопонял smile.gif

Ну так путь бывает относительный и абсолютный) Ардес, путь - одна хрень)

Автор: WKnight 21.10.2018, 11:41

Цитата
Ну понятно
Нифига не понятно, если ошибка, то оно должно вернуть нил и код ошибки, откуда у тебя там четверка?

Автор: DarkMaster 21.10.2018, 19:09

Цитата
Цитата
Ну понятно
Нифига не понятно, если ошибка, то оно должно вернуть нил и код ошибки, откуда у тебя там четверка?

Понятно в смыле "этом случае оно не может вернуть массив". А вот кого черта там 4 вопрос никуда не делся и как-то ответить на него я не в состоянии. Могу лишь сказать, что создавал набор изображений с помощью getimage и из-за ошибки с хенлом съехали координаты, получились белые квадраты (возможно просто другой кусок страницы с белым фоном). Начал искать эти изображения - посыпались ошибки. Кривых изображений приводящих к коду ошибки -5 у меня не осталось.

Автор: DarkMaster 21.10.2018, 19:24

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

Автор: Cockney 21.10.2018, 22:23

getimage() под луа работает,что возвращает и как вызывать ?

Автор: DarkMaster 21.10.2018, 22:25

Работает, вызывать точно так же, возрващает массив.
local loaded_image = getimage(param1, param2, ....)

Автор: Cockney 21.10.2018, 22:31

Второй вопрос :


Цитата

<(RequiredColors)> - один или несколько цветов для поиска (в круглых скобках!). Могут указываться отдельные RGB каналы и/или цвета в виде значений и/или диапазонов:
'84235' - точный десятичный цвет
'84235-86027' - диапазон десятичных цветов
'R(11)' - значение красного канала = 11, остальные каналы не проверяются
'G(73-80)' - диапазон значений зеленого канала, остальные каналы не проверяются
'R(11)+G(73-80)+B(1)' - заданы значения по всем каналам
'84235, R(0), R(11)+G(73-80)+B(1)' - комбинированное указание искомых цветов


что в луа поддерживается и каким образом ?

Автор: DarkMaster 21.10.2018, 22:57

подозреваю, что все или почти все. Записывается только чуть иначе - скобки другие.
{param, param, param, ...}

param - стрингом.

Автор: Cockney 21.10.2018, 22:59

Т.е. прям так 'R(11)+G(73-80)+B(1)' ?

Автор: DarkMaster 21.10.2018, 23:19

Думаю да. Сам не помню, с пол года назад обсуждали, допиливали.

Вообще там все относительно нативно совместимо везде. Разница только в паре операторов, где возвращается несколько значений (например в финдах код ошибки и таблица) и в скобках, если они вложенные.
Общее правило:
Если возвращается несколько значений, то они задаются:
var1, var2 = function()
Если скобки вложенные, то они превщаюатся из круглых в фигурные:
(param, (param), param)
(param, {param}, param)

Автор: WKnight 22.10.2018, 8:09

Цитата
Если скобки вложенные, то они превщаюатся из круглых в фигурные:
Там еще не допилено как раз в районе этих фигурных скобок. Задумка передавать как массив картинок для финдимиджа, так и массив цветов для финдколора.
Цитата
белые квадраты
-5 это по сути значит "нечего искать". Когда квадраты расскрасил, массив нормально возвращать стало?

Автор: WKnight 22.10.2018, 12:18

Не стабильная ночнушка

Исправил возврат таблицы значений в команде 'findimage' в Lua, при отсутствии результата или ошибке поиска.

В команду 'findimage' добавил код ошибки '-7' - нечего искать, искомая картинка пустая.

Автор: sutra 22.10.2018, 14:06

Обнаружил случайно такую вещь, ошибкой не назовёшь, но не зная (как я до сегодня) её могут возникнуть логические ошибки, которые сразу бывает не так просто найти.
case: set #error 1 // такой оператор в конце switch не работает
case : set #error 1 // а вот так всё нормально

Автор: DarkMaster 22.10.2018, 15:18

Цитата
-5 это по сути значит "нечего искать". Когда квадраты расскрасил, массив нормально возвращать стало?

а я их не красил =) Там getimage просто новые данные собрал по новым координатам, после чего начало искать. Там чуть длинее было - с хендлами путаница была, но это мог быть либо мой косяк либо те последствия из-за 4 -5.

Автор: WKnight 23.10.2018, 22:35

Исправил 'case:'.

Автор: WKnight 24.10.2018, 0:08

Сделал восстановление "текущего каталога" при сохраненях\загрузках.

Автор: WKnight 24.10.2018, 0:52

Исправил в функции 'findcolor' поиск цвета в загруженной области.

Автор: WKnight 24.10.2018, 1:41

Поменял емайл.

Автор: cirus 27.10.2018, 22:13

Код
--lua
clipboard ("раз два три")   -- 3 слова
wait (300)
local arr = {}
arr = clipboard (0, "word")  -- разбить по словам
log (#arr[1])              -- размер 4

Автор: WKnight 27.10.2018, 23:24

ПОЧИНИЛ

Автор: cirus 28.10.2018, 2:45

Код
--lua
log(type(windowfromcursor()))    -- возвращает стринг

Автор: WKnight 28.10.2018, 12:40

Цитата
ПОЧИНИЛ


Автор: DarkMaster 28.10.2018, 12:43

Ультимы нет, тестить не на чем. Там не стринги возвращает?

Автор: WKnight 28.10.2018, 12:49

Цитата
Ультимы нет, тестить не на чем.

smile.gif

Автор: WKnight 28.10.2018, 13:20

Починил 'set windowpos' в Lua. Теперь работает как функция 'windowpos (x, y, width, height [, handle])'. Не возвращает ничего.

Автор: DarkMaster 28.10.2018, 14:11

мини-багрепорт по некрретному меню по ПКМ, типам данных и паре неработающих функций

некорректная вставка из выпадающего меню:

две пары скобок, отсутствуют запятые, курсор активен во второй паре скобок.
dayofweek (year month day) ()
setlayout (layout) ()
color (#x #y ) () -- тут еще лишний пробел после #y, решетки в луа убрать.
colortored (color) ()
colortogreen (color) ()
colortoblue (color) ()
colortorgb (color %arr) () -- %arr в луа убрать, добавить в начало указание на массив, куча пробелов перед скобкой.
getimage (startx starty endx endy ) () -- лишний пробел перед закрывающей скобкой
getimage (startx starty endx endy ) () -- лишний пробел перед закрывающей скобкой
findimage (startx starty endx endy (filename) resultarray ) () -- лишний пробел перед закрывающей скобкой


курсор активен внутри скобок, параметров быть не может:
hour ()
min ()
sec ()
year ()
month ()
day ()
timer ()
timer1 ()
timer2 ()
timer3 ()
timer4 ()
defx ()
defy ()
defxabs ()
defyabs ()
defcolor ()
mousepos_x ()
mousepos_y ()
mouseposabs_x ()
mouseposabs_y ()
screenheight ()
screenwidth ()
desktopheight ()
desktopwidth ()
monitorheight ()
monitorwidth ()
monitor ()
findoffsetx ()
findoffsety ()
clickoffsetx ()
clickoffsety ()
promptpos_x ()
promptpos_y ()

claqua ()
clblack ()
clblue ()
clfuchsia ()
clgreen ()
cllime ()
clmaroon ()
clnavy ()
clolive ()
clpurple ()
clred ()
clsilver ()
clteal ()
clwhite ()
clyellow ()
clgray ()
clltgray ()
cldkgray ()

delimiter ()
linedelay ()
emptylinedelay ()
sendexdelay ()
mouseclickdelay ()
showtimervar ()
showscriptprocessing ()
stopscrunknowncommand ()
windowhandle ()
exefilename ()
homepath ()
loghandle ()
logautoopen ()
messagesoutputto ()
scriptpath ()
scriptname ()

mousepos_x ()
mousepos_y ()
mouseposabs_x ()
mouseposabs_y ()
linedelay ()
emptylinedelay ()
sendexdelay ()
mouseclickdelay ()
mousepos_x ()
mousepos_y ()
mouseposabs_x ()
mouseposabs_y ()

getlayout ()

Непонятная подсветка:
mousepos_x ()
mousepos_y ()
mouseposabs_x ()
mouseposabs_y ()
linedelay ()
emptylinedelay ()
sendexdelay ()
mouseclickdelay ()
mousepos_x ()
mousepos_y ()
mouseposabs_x ()
mouseposabs_y ()
getlayout ()
setlayout ()

подсветка функцией переменных
showtimervar ()
showscriptprocessing ()
stopscrunknowncommand ()
windowhandle ()
exefilename ()
homepath ()

подсветка серым, как коммент
loghandle ()
logautoopen ()
messagesoutputto ()

подсветки нет
scriptpath ()
scriptname ()
getimage ()

лишние вставки сетов
set #a current_script ()
set #a active_script ()
set $var getlayout ()
set $var setlayout (layout) ()
set hotkeystart {key} () -- в рамках луа фигурные скобки убрать, key поместить внутрь круглых
set hotkeypause {key} () -- в рамках луа фигурные скобки убрать, key поместить внутрь круглых
get scripts %a () -- %a убрать, явно указать на возврать массива
get mouse_pos ()
get color() -- Он дублирующий полностью или чем-то отличается от color()?

лишние скобки
break () -- так же недопустимо в луа указывать на уровень вложенности
msg filegetattr () ()
getimage (startx starty endx endy ) ()
findimage (startx starty endx endy (filename) resultarray ) ()
findcolor ( ) () -- тут почему-то скобки пустые
dir (%resultarray ) () -- %a убрать, явно указать на возврать массива
filecopy ( ) () -- пробелы
filerename ( ) () -- пробелы
filedelete () ()
filesetdate ( ) () -- пробелы
filesetattr ( ) () -- пробелы
msg filegetattr () () -- что за мсг? Ну понятно, что месседж, но что оно тут делает?)
msg filegetdate () ()- - что за мсг? Ну понятно, что месседж, но что оно тут делает?)
msg fileexists () () -- что за мсг? Ну понятно, что месседж, но что оно тут делает?)
dircreate () ()
dirremove () ()
dir (%resultarray ) () -- пробелы, %resultarray убрать, явно указать на возвращение массива.
msg errorlevel () -- что за мсг? Ну понятно, что месседж, но что оно тут делает?)
write ( ) () -- пробелы

недопсутимые описания в луа
циклы
условия
подпрограммы
массивы
linedelay ()
emptylinedelay ()


функция не импортирована в луа:
hour ()
min ()
sec ()
timer ()
showtimervar ()
showscriptprocessing () -- спокойно реализуется через дебаг
stopscrunknowncommand ()
scriptpath ()
scriptname ()



Косяки с типами данных:
func: year () type: string
func: month () type: string
func: day () type: string
func: dayofweek (1, 1, 1) type: string
func: timer1 () type: string
func: timer2 () type: string
func: timer3 () type: string
func: timer4 () type: string
func: defx () type: string
func: defy () type: string
func: defxabs () type: string
func: defyabs () type: string
func: defcolor () type: string
func: mousepos_x () type: string
func: mousepos_y () type: string
func: mouseposabs_x () type: string
func: mouseposabs_y () type: string
func: screenheight () type: string
func: screenwidth () type: string
func: desktopheight () type: string
func: desktopwidth () type: string
func: monitorheight () type: string
func: monitorwidth () type: string
func: monitor () type: string
func: claqua () type: string
func: clblack () type: string
func: clblue () type: string
func: clfuchsia () type: string
func: clgreen () type: string
func: cllime () type: string
func: clmaroon () type: string
func: clnavy () type: string
func: clolive () type: string
func: clpurple () type: string
func: clred () type: string
func: clsilver () type: string
func: clteal () type: string
func: clwhite () type: string
func: clyellow () type: string
func: clgray () type: string
func: clltgray () type: string
func: cldkgray () type: string
func: delimiter () type: string
func: linedelay () type: string
func: windowhandle () type: string
func: loghandle () type: string
func: logautoopen () type: string
func: messagesoutputto () type: string
func: mousepos_x () type: string
func: mousepos_y () type: string
func: mouseposabs_x () type: string
func: mouseposabs_y () type: string
func: getlayout () type: string
SetLayout -> 00000409 67699721 -- не пашет. Устанавливает хрень при setlayout (getlayout ())
func: setlayout (getlayout ()) type: string
func: color (1, 1) type: number
func: colortored (564563) type: string
func: colortogreen (564563) type: string
func: colortoblue (564563) type: string
func: colortorgb (564563): table is "string" data type. Value: -- не пашет
func: current_script () type: string
func: active_script () type: string
func: scripts () type: table is "string" data type. Value: -- не пашет
func: fileexists ([[d:\!\1.vbs) type: string

дальше файлов по пкм не разбирал.

Автор: WKnight 28.10.2018, 14:49

Цитата
мини-багрепорт
Это называется МИНИ? blink.gif

Автор: DarkMaster 28.10.2018, 14:50

Цитата
Это называется МИНИ? blink.gif

Время будет - продолжу завтра-послезавтра. biggrin.gif

Автор: WKnight 28.10.2018, 18:28

Ток новую версию скачай.

Автор: cirus 28.10.2018, 18:53

Цитата
if параметр зн.оп. значение ()
while параметр зн.оп. значение ()
for #имя начало конец ()

Заменить на:
Код
if параметр зн.оп. значение then
while параметр зн.оп. значение do
for имя=начало, конец do

Цитата
end_if
end_while
end_for

Заменить на end.
Исправить форматирование скрипта на луа.

Автор: WKnight 29.10.2018, 1:01

Убрал двойные скобки при вставке команд из меню по ПКМ в Lua, курсор устанавливается за скобками.

Расставил запятые в скобках, при вcтавке команд из меню по ПКМ в Lua.

При вcтавке команд из меню по ПКМ в Lua убираем признаки переменных.

Слегка изменил алгоритм вставки команд в скрипт из контекстном меню. Обязательные параметры не убираем.

Переделал подсветку синтаксиса в редакторе. Добавил возможность изменять категорию существующих ключевых слов и добавлять новые. Список слов указывается в секции "[Highlighter]" в конфигурационном файле пилота в параметрах оканчивающихся на " List" (появятся при сохранении настроек). Пример: "RW EndScript List=end_script,konec_skripta".

Автор: DarkMaster 29.10.2018, 4:45

Вообще было бы круто по пкм вот этот списочек вставить, как операторов луа
https://www.lua.org/manual/5.1/index.html#index
Функции, а не C API и auxiliary library естественно.

Автор: WKnight 29.10.2018, 12:17

В меню по ПКМ добавил раздел "Lua".

Добавил возможность комбинировать скрипт пилота с Lua. '--lua' обозначает начало Lua скрипта, '--endlua' соответственно конец.
log start
--lua
log ("lua")
--endlua
log finish
end_script

Автор: WKnight 30.10.2018, 17:42

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

Автор: sutra 30.10.2018, 23:36

Насколько я понял, просто последовательно выполняется скрипт на разных языках. Например, сначала кусок Пилотовский, потом на ЛУА, потом опять Пилотовский. Но у меня все переменные из первого куска уже недоступны. Если так и должно быть, тогда вопрос, а не проще запускать параллельный скрипт на lua ? Такой вариант ничего не теряет. Всё равно из lua кода ничего вернуть в Пилотовский код нельзя.

Да Кнайт, что ещё хотел спросить. Мой пример по некорректной работе findimage, который я выкладывал в "пожеланиях", какие-то соображения есть на эту тему? В lua пока ещё этот пример не тестировал.

Автор: WKnight 31.10.2018, 1:13

Цитата
Но у меня все переменные из первого куска уже недоступны.
VM Lua не перезапускается, переменные из начала скрипта будут доступны в конце. То же самое про скрипт пилота.
Цитата
Всё равно из lua кода ничего вернуть в Пилотовский код нельзя.
Это следующий шаг.
Цитата
пример по некорректной работе findimage
Там чего-то нехватает для полноты картины.

Автор: sutra 31.10.2018, 2:13

.

Цитата
Там чего-то нехватает для полноты картины


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

Автор: sutra 31.10.2018, 2:26

Цитата
То же самое про скрипт пилота.

Ещё раз проверил, да работает, но я перезапускал Пилот, видимо из-за этого были глюки. До перезапуска точно не работало. В смысле ошибок не было, но значение переменной обнулилось. И не работало goto, а сейчас работает. Так-что я извиняюсь, а Вам респект и огромное спасибо. Если всё будет стабильно работать - это избавит меня от многодневного (ненужного) труда.

Автор: cirus 31.10.2018, 2:28

Цитата
Ну только если полного экрана

Вернёмся к тому с чего начали.
https://forum.uokit.com/index.php?s=&showtopic=19856&view=findpost&p=427631

Автор: sutra 31.10.2018, 2:36

При наличии функций в куске Луа goto не работает. Именно такая ситуация у меня и была. Где они должны располагаться? Первыми, в самом начале?

Автор: sutra 31.10.2018, 3:34

Ну вроде уж подробней не бывает.


Прикрепленные файлы
Прикрепленный файл  ErrorFindImage.7z ( 6,88 килобайт ) Кол-во скачиваний: 68

Автор: sutra 31.10.2018, 3:57

Это вариант при 100% совпадении и без deviation. То есть совпадение картинок 100%. Может это поможет пролить свет на проблему.

И в версии 2.39 всё работает как часы, все три варианта находит со 100% результатом.

Ну и собственно я то эту проблему методом тыка обрулил. Я же не для себя преференции выбиваю. Просто если выплыло у меня, обязательно выплывет где-нибудь и у других.


Прикрепленные файлы
Прикрепленный файл  ErrorFindImage2.7z ( 1004 байт ) Кол-во скачиваний: 56

Автор: DarkMaster 31.10.2018, 4:22

Цитата
Цитата
Всё равно из lua кода ничего вернуть в Пилотовский код нельзя.
Это следующий шаг.

А точно нужен этот франкенштейн? Ну в плане интересно написать, думаю - да, но я очень слабо представляю практическое применение.

Автор: cirus 31.10.2018, 14:19

Код
--lua
local arr, count = findimage(0, 0, 1920, 1080, "C:\\tre.bmp")
hint (a, c)

Если путь указан без скобок, то -3 вернёт в arr, а не count.

Автор: DarkMaster 31.10.2018, 14:28

там и 4 или -5? падало в arr. Подозреваю где-то не в ту переменную пишет ошибки.

Автор: WKnight 31.10.2018, 22:02

Пришлось сделать некоторое допущение, и можно сказать, что
Подправил возврат кода ошибки функциями 'findimage' и 'findcolor' в Lua, при неправильном указании параметров.

Цитата
там и 4 или -5?
"4" это просто содержимое стека. При тестах например "2" было.

Автор: WKnight 1.11.2018, 13:54

Цитата
И в версии 2.39 всё работает как часы

А кто-нить помнит, что в финдимидже в 2.39б12 не работало, что заработало в 2.40?

Автор: cirus 1.11.2018, 14:23

Возможно это: https://forum.uokit.com/index.php?s=&showtopic=67903&view=findpost&p=420953

Автор: WKnight 1.11.2018, 14:47

Точно, спасибо.

Автор: sutra 1.11.2018, 15:52

findcolor в памяти не работает.

1) вариант когда работает (хотя тоже не на всём скрине)
set %pic GetImage (508 243 970 777)
set #sp findcolor (0 0 20 0 ...

2) вариант когда НЕ работает
set %pic GetImage (0 0 970 777)
set #sp findcolor (508 243 528 243 ...


И вот ещё какая штука
GetImage (0 0 1919 1079)
Если потом сохранить в файл, то сохранит именно эту область 1920х1080 с остатками рабочего стола и чернотой, где рабочий стол закончился. В принципе ничего такого, просто для информации.

Да, вот ещё, для информации. Рабочее окно располагалось на 2-ом мониторе.

Автор: WKnight 1.11.2018, 16:38

Цитата
Возможно это:
и
Цитата
Я же не для себя

Исправил в 'findimage' поиск запомненной картинки в загруженной области. Требовало размер области больше положенного.

Переделал в Lua функции 'findimage' и 'findcolor' на новый синтаксис, все параметры передаются по одному, через запятую. Путь к файлу и набор цветов пока передаются строкой в таблице (в фигурных скобках). Принимающий массив изъят из обращения. По синтаксису Lua в пути необходимо удваивать символ обратный слеш "c:\\", либо указывать путь в двойных квадратных скобках [[c:\]]. Функции возвращают массив (таблицу) найденных элементов и код ошибки. Пример:
'arr, err = findimage(10, 20, 1020, 810, {"C:\\tmp\\image.bmp"}, 2)'
'arr, err = findcolor(10, 20, 1040, 810, {"r(255)"}, 2, -1, "abs")'


Автор: sutra 1.11.2018, 23:34

Примерно выяснил где глюк колора.
set %pic GetImage (0 0 970 777)
set #type %pic[1 1]
set #sp findcolor (508 243 528 243 1 1 (R(0-255)) %sp %pic[1 1])
save_array %sp "C:\TMP\_memory.txt"

Первый столбец всё как надо, а вот второй столбец все нули, грубо говоря путает ординату поиска.

Похоже я один только и пользуюсь (пытаюсь) поиском в памяти.

Автор: cirus 2.11.2018, 13:04

Цитата
Исправил в 'findimage' поиск запомненной картинки в загруженной области.

Видимо не всё исправлено.
Код
set %get [1] LoadImage (скрин_окна.bmp)
set %image [1] LoadImage (Original.bmp)

log clear
log mode compact
set #a Findimage(0 0 1032 956 (%image [1 1]) %arr %get [1 1] 100)
if #a > 0
    log #a    %arr [1 1] %arr [1 2]    %arr [1 3] %arr [1 4]   // координаты искомой картинки
end_if

set #a Findimage(300 0 700 956 (%image [1 1]) %arr %get [1 1] 100)
log #a   // не найдено

set #a Findimage(0 100 1032 956 (%image [1 1]) %arr %get [1 1] 100)
log #a   // не найдено
end_script

Прикрепленный файл  Original.bmp ( 654 байт ) Кол-во скачиваний: 209

Прикрепленный файл  скрин_окна.bmp ( 2,82 мегабайт ) Кол-во скачиваний: 212

Автор: DarkMaster 2.11.2018, 20:04

Пилот поверх всех окон, файл/открыть скрипт - форма за окном пилота и не видна.

Автор: sutra 3.11.2018, 16:36

--lua
arr, err = findcolor(0, 0, 100, 100, 1, 1, {"r(0-255)"})
log(arr,err) -- получаю nil 0

Что я делаю не так?

Автор: sutra 3.11.2018, 16:56

local a = findcolor("0, 0, 10, 0, 1, 1, 0, %arr, 2")
log (#arr) -- а вот так ищет

Получается новый вариант синтаксиса не работает.

Автор: DarkMaster 3.11.2018, 16:56

попробуйте явно указать метод:
arr, err = findcolor(0, 0, 100, 100, 1, 1, {"r(0-255)"},2)

Автор: sutra 3.11.2018, 17:15

r(0-255) диапазон так и не понял как искать ни в старом, ни в новом варианте.

Цитата
попробуйте явно указать метод

Всяко пробовал.

В новом синтаксисе вообще ничего не ищет.

В смысле принимающий массив = nil

arr, err = findcolor(0, 0, 199, 0, 1, 1, 0, 2)
log(arr,err) -- получаю nil 200

Массива нет, а вместо кода ошибки - количество найденных пикселей.

arr, err = findcolor(0, 0, 199, 0, 1, 1, {"r(0)"}, 2)
log(arr,err) -- получаю nil 0

Диапазон вообще не ищет.

Автор: sutra 6.11.2018, 2:34

Ещё давно возник у меня такой вопрос, конечно я обхожу эти "рифы", но решился всё-таки озвучить. Почему, например, такая конструкция у меня выполняется более 4 секунд?

set #tmp findcolor (244 639 825 922 1 1 (R(0-255)) %tmp)

Подозреваю, что что-то не так с массивом. Конечно корифеи скажут, а зачем такое вообще надо. Но мне часто требуется не просто искать конкретный цвет, а именно получить цвета всех пикселей конкретной зоны экрана (зачастую немаленькой, ввиду разброса объектов), желательно минимальным количеством вызова файнда, для детального анализа. Получать из памяти такой массив я пока не пробовал (жду доводки файнда). Но 4 секунды, на мой взгляд, как-то не вяжутся с логикой процесса.


Обработка в lua любого массива данных занимает доли секунды, вопрос как получить эти данные с минимальными затратами времени.

И всё-таки ещё раз "о главном". Конечно запрограммировать можно и "свалку" данных. Но не все будут этим заниматься, а на мой взгляд, нужна реализация поиска findcolor-ом цветовой разницы между RGB каналами. У меня без этого никак невозможно правильно запрограммировать поиск объектов при смене времени суток в игре.

Да и не только при смене времени суток, часто встречаются "переливающиеся" объекты, их тоже можно "вычислить" только анализом RGB.

Автор: sutra 6.11.2018, 2:48

И опять же. С помощью таких конструкций, скрипт собирал статистику и то, что на первый взгляд казалось в принципе невозможным запрограммировать, на поверку оказалось возможным, иногда "на грани фола", но возможным.

Автор: DarkMaster 6.11.2018, 4:39

Цитата
Почему, например, такая конструкция у меня выполняется более 4 секунд?

set #tmp findcolor (244 639 825 922 1 1 (R(0-255)) %tmp)

Указать в явном виде метод поиска (2 или хендл). Вообще у пилота есть проблема с большими массивами. Он их ворочить начинает реально медленно. Я так подозреваю он очень не оптимально выделяет память, потом выделяет еще и при этом копирует массив и т.д. Я больше склоняюсь к попыткам допинать финд в рамках луа. Учитывая заданный диапазон могу предложить указать его не по каналам, а в десятичной форме - это может решить проблему.

Автор: sutra 6.11.2018, 13:22

Цитата
Я больше склоняюсь к попыткам допинать финд в рамках луа


Абсолютно согласен.

Цитата
указать его не по каналам, а в десятичной форме


Спасибо, попробую.

Автор: sutra 6.11.2018, 14:08

Цитата
указать его не по каналам, а в десятичной форме


Попробовал всяко - результат тот же.


Может можно как-то из памяти массив вытащить? Если сначала получить скрин в память.

Автор: DarkMaster 6.11.2018, 14:48

Цитата


Может можно как-то из памяти массив вытащить? Если сначала получить скрин в память.

Когда вы получаете скрин в память, то в массив возвращается указатель на начала битовой маски. Дальше readmem и погнали. НО - я писал уже подобный обработчик и скорость его оказалась крайне печальной, я подозреваю, что это было вызвано двумя причинами:
1) Преобразование параметров из стринга в инты и обратно, парсинг параметров. Тогда это еще не было допилино нормально.
2) Вызов внешней функции не встроенной в луа занимает существенное время. Тут хотелось бы попросить кнайта попытаться разобраться в чем проблема. Хотя бы понять это косяк наш или сам луа вызывает тормознуто (создать микро функцию-заглушку и проверить время ее вызова).

Автор: sutra 6.11.2018, 15:19

Я тестировал все функции связанные с обработкой изображений, от printscreen до getimage. И все они выполняются примерно 3 сотых секунды, хоть в Пилоте, хоть в lua. Собственно поэтому я и пытаюсь вызывать эти функции ОДИН раз, потому что весь остальной скрипт на lua (далеко не маленький) выполняется 13-18 ТЫСЯЧНЫХ секунды.

С загрузкой из файла массива, потом сохранением в файл (правда всё на RAM) и всего 18 тысячных.

readmem не совсем понимаю как пристроить под это дело. В lua я мало что знаю, раньше я просто использовал move в указатель, выделив соответствующую память.

Нужно Кнайту просто сделать этот самый move.

Насколько я понял getimage возвращает параметр длины 3 байта * кол-во пикселей + 2 байта.

Хотя наверное move не прокатит. 3 байта - это формат файла, их не пристроишь никак под переменные.

Проще наверное посмотреть, почему файнд так начинает тормозить.

Автор: sutra 6.11.2018, 16:07

Вот если бы readmem мог считывать в побайтовый массив, типа как в строку, только без ограничения по длине. Тогда можно было бы сделать быстрый обработчик.

Автор: DarkMaster 6.11.2018, 18:28

Цитата
Вот если бы readmem мог считывать в побайтовый массив, типа как в строку, только без ограничения по длине. Тогда можно было бы сделать быстрый обработчик.


Дык он и делает. Там в параметрах задается тип значения которое нужно считать. Байт - b.
Для понимания, что именно вы читаете рекомендую сначала использовать writemem и редактировать область памяти с битовой маской.

set %a GetImage (100 100 1000 1000)
log %a [1 1] - адрес в памяти
log %a [1 2] - ширина изображения
log %a [1 3] - высота изображения
log %a [1 4] - длина строки в байтах
End_script

Там есть тонкость - размер таблицы выравнивается по количеству байт кратному 4, если мне память не изменяет. Т.е. длина строки в любом случае будет кратная 4. Поэтому настоятельно рекомендую сначала разобраться c writemem, чтобы не путаться в чтении каналов.
Это кстати косяк, т.к. выравнивание служит для увеличения скорости обработки процессором, но современные камни почему-то под кратность 10 точатся(для меня великая загадка почему 10 ибо это корявый размер во всех смыслах).

Пытаюсь найти скрипт в котором все это делал - пока безрезультатно.

Обработка изображения
Код
--lua
fileBinary = require"luaPlugins\\FileBinary"

do
    local tab = ""
    local deep = 0
    function table.show(t, comment)
        -- Пишем в лог комментарий.
        deep = deep + 1 -- Уровень вложенности вызовов функции.
        --log(comment .. commentSended .. deep)
        if  comment ~= nil and deep == 1 then
            log(comment)
        end


        if     type(t) == "nil"     then log("table is nil")
        elseif type(t) == "string"  then log('table is string: "'..t..'"')
        elseif type(t) == "number"  then log('table is number: '..t)
        elseif type(t) == "table"   then
            local elementsInTable = 0
            for k,v in pairs(t) do
                if  type (v) == "table" then
                    if type(k) == "string" then
                        log(tab..'table: "'..k..'"')
                    else
                        log(tab..'table: '..k)
                    end
                    tab = tab .. "    "
                    table.show(v)
                    tab = string.sub(tab, 1, -5)
                    elementsInTable = elementsInTable + 1
                else
                    elementsInTable = elementsInTable + 1
                    if type(v) == "string" then v = '"'..v..'"' end
                    if type(k) == "string" then k = '"'..k..'"' end
                    log(tab..""..k.." = "..v)
                end
            end
            if elementsInTable == 0 then log("table is empty") end
        else
            log('table is unknow data type')
        end
        -- Пишем в лог комментарий.
        deep = deep - 1 -- Уровень вложенности вызовов функции.
    end
end

log("clear")



-- Получаем изображение в массив.
function imageToArray (startX, startY, endX, endY, appWindow)
    local bitmap = {}
    local address, w, h, l = getimage(startX, startY, endX, endY, appWindow)
    log (address, w, h, l, "n56")
    local pos = 1
    for i=address, address + h*(l) - 1, l do
        for j=i, i+w*3 - 1 do
            bitmap[pos] = readmem(j .. " b")
            pos = pos + 1
        end
    end
    saveimage(address, "d:\\!lua\\!test.bmp")
    deleteimage(address)
    return bitmap
end


function binary(file, pos, val, i, j)
    file:seek("set", pos)
    if i == nil then i =  1     end
    if j == nil then
        j =  #val - 1
    else
        j = i + j - 1
    end
--    log(i, j)
    for i=i, j do
        file:write(string.char(val[i]))
    end
end

-- file - хендл или имя файла
-- w - ширина изображения
-- h - высота изображения
function writeBmp (file, bitmap, w, h)
    if type(file) == "string" then
        file = io.open(file, "w+b")
    end
    file:seek("set", 0)

    local l = math.ceil (w*3/4) * 4 -- Длина строки с выравниванием.
    local alignment = l - w*3
    local fileSize = l * h + 0x36
    log(fileSize)


    -- Заголовок
    file:write(string.char(0x42))
    file:write(string.char(0x4D))
    file:write(string.char(         -- Размер файла.
    fileSize%256,
    floor(fileSize/256),
    floor(fileSize/65536),
    floor(fileSize/16777216)))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0x36))   -- Оффсет на битовую маску.
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0x28))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(floor(w%256)))  -- Ширина
    file:write(string.char(floor(w/256)))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(floor(h%256)))  -- Высота
    file:write(string.char(floor(h/256)))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0x01))
    file:write(string.char(0))
    file:write(string.char(0x18))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0x74))
    file:write(string.char(0x12))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0x74))
    file:write(string.char(0x12))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))
    file:write(string.char(0))


    local i = #bitmap - w*3 + 1
    for i = w*3*(h-1)+1, 1, -w*3 do
--        log("!!!", #bitmap, file:seek() ,i, h, w, w*3, l)
        binary(file, file:seek(), bitmap, i, w*3)
        for j = 1, alignment do
            file:write(string.char(0))
        end
    end

--    for pos=0x36, 0x36 + #bitmap - 1, l do
--        log("!!!", #bitmap, pos ,i, h, w, w*3, l)
--        binary(file, pos, bitmap, i, w*3)
--        i = i - w*3
--    end
end

function getAvg(path, appWindow, timeout, startX, startY, endX, endY)
    local countImages = 0
    local w = endX - startX + 1
    local h = endY - startY + 1
    local s = w * h * 3 -- количество полезных пикселей (без выравнивания)
    local sum = {} -- сумма значений каждого канала всех изображений.
    for i = 1, s do
        sum[i] = 0
    end
    -- Собираем изображения в течении заданного времени.
    local myTimer = os.clock() + timeout
    while myTimer > os.clock() do
        -- Массив со значениями каналов.
        local bitmap = imageToArray (startX, startY, endX, endY, appWindow)
        --table.show(bitmap)
        -- Суммируем изображения
        for i = 1, s do
            sum[i] = sum[i] + bitmap[i]
        end
        countImages = countImages + 1
    end

    -- Находим среднее значение
    local avg = {}
    for i = 1, s do
        avg[i] = sum[i] / countImages
    end
    --table.show(avg, "avg")
    writeBmp (path, avg, w, h)
end


function getStatic (path, appWindow, timeout, startX, startY, endX, endY)
    local bitmap = imageToArray (startX, startY, endX, endY, appWindow)
    local w = endX - startX + 1
    local h = endY - startY + 1
    local countImages = 0
    -- Собираем изображения в течении заданного времени.
    local myTimer = os.clock() + timeout
    local bench = os.clock()
    while myTimer > os.clock() do
        -- Массив со значениями каналов.
        local scr = imageToArray (startX, startY, endX, endY, appWindow)
        log("Битмап в массив за:" .. os.clock() - bench .. " сек.")
        bench = os.clock()
        -- Закрашиваем нестатичные пиксели.
        for i = 1, #bitmap, 3 do
            if  bitmap[i  ] ~= scr[i  ] or
                bitmap[i+1] ~= scr[i+1] or
                bitmap[i+2] ~= scr[i+2] then

                bitmap[i  ] = 0
                bitmap[i+1] = 255
                bitmap[i+2] = 0
            end
        end
        log("Поиск статики за:" .. os.clock() - bench .. " сек.")
        countImages = countImages + 1
    end
    writeBmp(path, bitmap, w, h)
end

    if workwindow ~= tonumber(windowhandle()) then
        log("Привязка должна быть к пилоту.")
        workwindow = tonumber(windowhandle())
        alarm("online")
        return
    end


    startX, startY, endX, endY = 194, 286, 277, 434
    appWindow = findwindow("Crossout 0.")[1][1]
    log(appWindow)
    --if 1 then return end


    local cpuTime = os.clock()
    -- getAvg("d:\\!lua\\test" .. os.time().. ".bmp", appWindow, 5, startX, startY, endX, endY)
    getStatic("d:\\!lua\\test" .. os.time() ..".bmp", appWindow, 60,
    193, 286
    ,
    208, 432
    )
    getStatic("d:\\!lua\\test" .. os.time() ..".bmp", appWindow, 60,
    193, 615
    ,
    210, 762
    )

    log(os.clock() - cpuTime)
    alarm("online")

FileBinary
Код
--lua

local binary = {}

function binary.getBitmapOffset(file)
    return binary.readInt(file, 0x0A)
end

function binary.readInt(file, pos)
    file:seek("set", pos)
    local a = string.byte(file:read(1))
    file:seek("set", pos + 1)
    local b = string.byte(file:read(1))
    file:seek("set", pos + 2)
    local c = string.byte(file:read(1))
    file:seek("set", pos + 3)
    local d = string.byte(file:read(1))
    file:seek("set", pos + 4)
    return a  + b * 256 + c * 65536 + d * 16777216
end

function binary.writeInt(file, pos, val)
    file:seek("set", pos)
    return file:write(
    string.char(math.fmod(val, 256),
    math.fmod(val, 65536)/256,
    math.fmod(val, 16777216)/65536,
    val/16777216)
    )
end

function binary.readByte(file, pos)
    file:seek("set", pos)
    return string.byte(file:read(1))
end

function binary.writeByte(file, pos, val)
    file:seek("set", pos)
    return file:write(string.char(val))
end

function binary.readArray(file, pos, sz)
    local result = {}
    file:seek("set", pos)
    local s = file:read(sz)
    for i=1, #s do
        table.insert(result,string.byte(string.sub(s, i, i)))
    end
    return result
end

-- Пишет в бинарном виде данные в файл file
-- начиная с позиции pos
-- из таблицы или строки val
-- начиная с позиции i внутри val
-- размером j внутри val
-- Запись полный тормоз.
-- Массив 2.296 Мб/сек.

function binary.writeArray(file, pos, val, i, j)
    file:seek("set", pos)
    if i == nil then i =  1     end
    if j == nil then
        j =  #val - 1
    else
        j = i + j - 1
    end
    log(i, j)
    for i=i, j do
        file:write(string.char(val[i]))
    end
end

return binary

--f = io.open("d:\\test.bmp", "r+b")
--log(f)
--log(binary.readInt(f, 0))
--log(binary.writeInt(f, 0, 0x123456ab))
--log(dec2hex(v))
--v="1234567890"
--log(string.byte(v, 1, 10))
--t = binary.readArray(f, 0, 4096)


--local j = 0
--local t = {}
--for i = 1, 40100 do
--    if j < 255 then
--        j = j + 1
--    else
--        j = 1
--    end
--    t[i] = j
--end
--binary.writeArray(f, 0x36, t, 1, 40100)


--local j = 0
--local t=""
--for i = 1, 40100 do
--    if j < 255 then
--        j = j + 1
--    else
--        j = 1
--    end
--    t = t .. string.char(j)
--end
--
--f:seek("set", 0x36)
--myTimer = os.clock()
--for i=1, 1000 do
--    f:write(t)
--end
--log(os.clock() - myTimer)



Выложил ровно в том виде, в котором оно осталось. Это фактически были тесты производительности и возможностей. Т.е. там свинарник =) . FileBinary мог редактироваться отдельно и возможно не имеет обратной совместимости либо имеет баги.

Автор: sutra 7.11.2018, 1:02

Цитата
скрипт в котором все это делал

Круто, вижу глобальный подход для решения любых задач. Как ты читаешь я понял, спасибо. Но пока подожду, прежде чем ломать мозги, надеюсь Кнайт доведёт финды и чтение памяти не потребуется. Ну а если потребуется, то я наверное буду делать выборочное чтение. Из огромной области экрана требуется обычно 2-3 десятка пикселей, просто из разных мест. Для ускорения работы лучше наверно задавать какие пиксели нужны и ридмемом читать только их, конечно индекс чтения нужных байтов в памяти придётся вычислять, но всё равно это будет намного быстрее.

Автор: DarkMaster 7.11.2018, 1:44

Вообще самым быстрым вариантом будет работа с указателями и прямое чтение памяти. Но в lua этого нет. Более того в луа нет таких типов данных, как byte и int. Тут все на double. Это однозначно приведет к проблеме скорости, т.к. все byte должны будут приведены к типу double. Объем изображения приличный и эти преобразования уже начинают давать свои проблемы. Вообще для подобного анализа луа не лучший вариант, хотя однозначно можно. Если это именно в плане подготовки изображений, т.е. какой-то предварительный анализ для последующего использования статистики, кусков изображений и т.д., то этой скорости будет достаточно, если речь идет о реал тайм обработке, то могут возникнуть вопросы (очень сильно зависит от размера изображения).

Отдельная просьба к кнайту, т.к. это минимум второй человек, который озадачился данным аспектом - сделать пуш битовой маски в массив луа. Что-то вроде:
local arr = BitmaskToArray(pointer)
ArrayToBitmask(arr, pointer)
Всяко лучше, чем имиджи насиловать, трудозатраты, по идее там сиволические на это дело.

Автор: sutra 7.11.2018, 2:26

Вопрос, самый простой способ получить доступ к конкретному символу строки в lua. Случайно обнаружил, что работают и chr и ord. Оператор ord(str) возвращает значение первого символа строки.

Автор: sutra 7.11.2018, 2:37

Цитата
Вообще самым быстрым вариантом будет работа с указателями

Я правильно понял, что если прицепить плагин, ну скажем на делфи, то если задать pointer , то можно считать данные с этого участка памяти?

Автор: DarkMaster 7.11.2018, 2:42

local ch = string.sub (str, pos, 1)

Автор: sutra 7.11.2018, 2:44

Цитата
local ch = string.sub (str, pos, 1)

Спасибо, ну я так и думал, что только через функцию.

Автор: DarkMaster 7.11.2018, 2:45

Цитата
Я правильно понял, что если прицепить плагин, ну скажем на делфи, то если задать pointer , то можно считать данные с этого участка памяти?

Плагином - да. НО нужно понимать, что если будете просто передавать значения в пилот, то просто получится тот же самый readmem. Сама обработка должна быть внутри языка поддерживающего указатели(внутри плагина).

Автор: sutra 7.11.2018, 2:50

Цитата
Сама обработка должна быть внутри языка

Ну это-то понятно, там я могу делать что угодно и как угодно. Спасибо.

Автор: DarkMaster 7.11.2018, 2:54

Цитата
Спасибо, ну я так и думал, что только через функцию.

Ибо обращение через позицию - суть работа с указателями. Тут этот нет =) Лично для меня одна из самых больных тем. Ну привык я, что можно забить на все условности и самому напрямую сделать то, что хочу.

Автор: sutra 7.11.2018, 14:47

Дарк, я так и не понял в каком формате хранятся данные, которые даёт getimage. Читаю readmem по байтам и что-то не понимаю логики. Тех байтов, которые потом кладутся в bmp картинку я не нахожу.

В bmp кладутся чистые байты без минусов, для каждого канала 0-255. Может я читаю в другом формате? Типа word с минусами?

Автор: cirus 7.11.2018, 14:54

Цитата
в каком формате хранятся данные

В таком:
bgrbgrbgr
Где b-синий канал, g-зелёный, r- красный. Плюс выравнивание строки, должна быть кратна 4.
Код
--lua
log "clear" log "mode compact"
local address, w, h, len=getimage(0, 0, 5, 5)
local arr, k = {}, 1

for i=0, h-1 do
    arr[k]={}
    for j=0, len - (len - w * 3 + 1), 3 do
        local b=readmem(address + len * i + j, "b", windowhandle())
        local g=readmem(address + len * i + j + 1, "b", windowhandle())
        local r=readmem(address + len * i + j + 2, "b", windowhandle())
        -- log (r, g, b)
        table.insert(arr[k], r + g * 256 + b * 65536)
    end
    k=k+1
end

for i=1, #arr do
    log(table.concat(arr[i], "  "))     -- вывод массива в лог
end

Автор: sutra 7.11.2018, 15:16

Цитата
В таком

Вроде всё так и делаю, ладно сейчас врублюсь. Спасибо.

Просто я сильно усложнил, ещё раз спасибо.

Решил свой файнд соорудить.

Цитата
windowhandle


Вот и вся причина, как обычно незнание прописных истин.


Плохо конечно методом тыка без примеров чего-то делать, но нет худа без добра все форматы "по косточкам перебрал". Чего забыл - вспомнил, да и нового немало почерпнул.

Автор: sutra 7.11.2018, 15:31

Cirus, спасибо огромное, всё работает как часы, получился быстрый полноценный файнд, ищет только те пиксели, которые нужны.

Автор: sutra 8.11.2018, 17:53

Дарк, ты абсолютно прав, действительно скорость вызова внешних функций намного хуже всех остальных вычислений в lua.
Я пока вот так проэксперементировал и скорость выросла ровно в 2 раза. Мне обычно нужен анализ всего 2-х цветов и я стал читать сразу 2 байта вместо одного.

tmp=readmem(index+1,"w",windowhandle())
red=math.modf(tmp/256)
green=math.fmod(tmp, 256)

Поэтому по уму надо или плагин писать или может Кнайт что-то придумает.

Автор: sutra 8.11.2018, 18:28

Можно ещё в строку читать кусками до 255 байт, пока это лучший вариант.

str="0"..chr(0).."1".. chr(1).."2"
log(string.byte(str,4))

Всё анализируется без проблем.

Автор: DarkMaster 8.11.2018, 19:38

Цитата
tmp=readmem(index+1,"w",windowhandle())

заменить на:
local handle = windowhandle() -- в шапку
tmp=readmem(index+1,"w",handle) -- обновить в теле

Цитата
Можно ещё в строку читать кусками до 255 байт, пока это лучший вариант.

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

Автор: sutra 8.11.2018, 20:29

Цитата
За пределы изображения только не выйдете

Обижаешь Дарк. У меня большие проблемы с языком, но с алгоритмами пока я в ясной памяти. Пока сделал по строкам, но думаю и по вертикали додумаю. Определяю количество чтений для каждой строки и количество байт при последнем считывании.
numreed=math.ceil((x2-x1+1)*3/255)
ostatok=math.fmod((x2-x1+1)*3,255)



Цитата
tmp=readmem(index+1,"w",handle) -- обновить в теле

Спасибо, как я и говорю - проблемы ...

Автор: sutra 8.11.2018, 21:04

Обработка строками (пока правда мало вариантов тестировал) дала отличный результат. Побайтово я получал массив для 6 (2 строки по вертикали) пикселей 5 тысячных секунды, построково в 10 раз быстрее.

Автор: cirus 10.11.2018, 2:33

Код
--lua
resultarray, count = dir ([[C:\Windows]], "*.bmp", "norecursion")
log (resultarray, count)

В resultarray возвращает таблицу даже если файлы не найдены.

Автор: DarkMaster 13.11.2018, 19:59

Файлы *.lua не оторбажаются по умолчанию при открытии скриптов. Приходится выставлять маску *.*.

Автор: DarkMaster 13.11.2018, 22:10

при выключении галки "добавлять пробелы", они все равно продолжают добавляться. Для луа не удобно.

Автор: cirus 14.11.2018, 2:29

Цитата
при выключении галки "добавлять пробелы", они все равно продолжают добавляться.

1.5 года назад ещё писали про это.
https://forum.uokit.com/index.php?s=&showtopic=19856&view=findpost&p=416174

Автор: DarkMaster 14.11.2018, 19:51

В последней ночнушке стали вылетать access violation. Вылетает при старте скрипта. Стабильного воспроизведнеия добиться не удалось. Тем не менее подозреваю, что это как-то связано с остановкой скрипта, т.к. эта проблема возникала только после ручной остановки скрипта.

Автор: DarkMaster 14.11.2018, 21:09

Цитата
Стабильного воспроизведнеия добиться не удалось.

Но если начало вылетать, то только перезапускать пилот.

Автор: WKnight 15.11.2018, 0:13

А скрипт то в каком формате?

Автор: DarkMaster 15.11.2018, 0:19

lua

Автор: sutra 15.11.2018, 2:15

Цитата
access violation

Вот что значит церковно-приходская школа. А это что такое? Доступ к чему?


Доделал сегодня большой блок на lua. Конечно скорость промежуточных, вспомогательных (ну в общем for-ов и if-ов) вычислений супер. В остальном не вижу преимуществ, пожалуй даже наоборот. Так-что наверное Кнайт прав, для людей неподготовленных, сочетание Пилотовского языка и lua может стать неплохим вариантом решения своих задач. Лично я конечно перейду на lua, но только теперь уже забываю Пилотовский язык, в голове видимо только рефлексы остались.

Переход на lua отучил меня думать, раньше придумывал логику, как избежать ненужных вычислений. А на lua сделал скрин в память, проверил сразу всё (что надо и не надо) без всякой логики, скорость позволяет.

Автор: DarkMaster 15.11.2018, 2:20

Цитата
Вот что значит церковно-приходская школа. А это что такое? Доступ к чему?

Эмм... А как я узнаю то? Ну написан там адрес в памяти, адреса после перезапуска меняются. Я хз, как это распутывать. Модулей там не пишет.

Автор: sutra 15.11.2018, 2:27

Хотя - логика - это сильно сказано, под логикой я подразумеваю, что раньше запоминал какие клавиши жал, куда мышкой кликал, теперь всё это кануло в лету. Наплевать куда кликал, всё сразу анализируется.

Цитата
Ну написан там адрес в памяти, адреса после перезапуска меняются

Адреса чего?


Всё-таки видимо надо запоминать, хотя бы адреса.

Дарк, ты что-то супер-пупер программируешь, мне до этого как до Парижу, хотя мне наверное супер и не надо.

Автор: DarkMaster 15.11.2018, 2:33

Цитата
Конечно скорость промежуточных, вспомогательных (ну в общем for-ов и if-ов) вычислений супер.

В целом считается примерно 1/3 от си.
Цитата
В остальном не вижу преимуществ, пожалуй даже наоборот.

Я вас уверяю, вы просто не наступали на те грабли, которые есть в пилоте и они глобальные. Отсутствие экранирования символов, проблемы сложения строк и паразитные пробелы, отсутствие полноценных функций (с call связываться боюсь - все очень сильно аукалось), общее пространство имен. Про общее пространство имен вообще отдельный разговор. Вы представляете себе скрипт на пару тысяч строк состоящий, как и любой другой, на 90% из обработки координат, цветов, кликов и при этом ни в одном for не повториться с именем итератора? Маслом по маслу маслянному, но масло (i) сказать нельзя, т.к. где-нибудь в другом месте индексы съедут. Пилотовский синтаксис практически невозможно структурировать. Если скрипт строк 300-500, то еще все аккуратно можно сделать, когда же скрипт переваливает за 1-2к строк, а время его поддержки/разработки за пару месяцев-полгода, то бывает очень весело перед созданием новой переменной проявляеть недюжую фантазию, а потом проверять не повторилась ли эта фантазия. Пилотовский язык прост, удобен, но только при небольших объемах и, если не касаться некоторых типов обработок (парсинг, например).

Цитата
Адреса чего?

Памяти. Чего же еще? =)

Автор: sutra 15.11.2018, 2:48

Цитата
Пилотовский язык прост, удобен, но только при небольших объемах

Согласен, я и говорю ты пишешь СУПЕР-ПУПЕР. Про структурирование полностью согласен. Я то вообще в этом плане дедушка. Но я помню как всё пытался привести к логичному, структурированному коду. Сначала написал функцию вывода точки на экран, потом написал функцию вывод прямой (с использованием функции вывода точки). Обработка ошибок. Даже в 90-е годы у меня ошибки на вводе отсекались. Если недопустимо вводить отрицательное число, сколько минус не жми, не введётся. Если заложен ввод 2-х разрядов после запятой, сколько не жми 3-й разряд не введётся. Раньше возможностей было мало, но мы "вылизывали" код.


Автоматический перевод (если перепутал расклад клавы). Автозаполнение при вводе текстов, использование словарей, индексов, кеширование сначала памяти (так как была 16 разрядная, ну типа 20 разрядов, сегмент и смещение) кеширование винта. Мы всё это делали намного раньше буржуев. Уже в 91 году у меня были наработки. Потом, пришлось бросить компьютеры, вот теперь в удовольствие пытаюсь осваивать новые технологии.

Автор: DarkMaster 15.11.2018, 2:55

В этом и суть. Пилот - это кладезь недокументированных возможностей и невылизанных моментов, lua же вылизан и четко описан. Вылизывание занимает очень много времени. Реалии таковы, что вылизывать код будешь разве, что для себя - люди не готовы тратить на это время. Для себя вылизывать зачастую смысла не так много, т.к. человек с мозгами едва ли будет вводить что попало, разве, что тестер. Ирония в том, что эти "невылизанные" моменты в итоге приводят к падению серверов, когда человек использует вполне легальное и описанное API макросов. Вот и получается, что вылизывание сейчас - это для себя получая удовольствие от качественного конечного продукта.

Автор: sutra 15.11.2018, 3:03

Цитата
Вот и получается, что вылизывание сейчас - это для себя получая удовольствие от качественного конечного продукта

И опять согласен. У меня всегда была проблема что-то сделать для других, а не для себя. Для себя я знаю "как не надо на фиг делать", а если как Кнайт делать для других - это ещё тот гемор. Вот за его терпение ему огромный респект. Нам то просить и критиковать легко ...

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

Автор: DarkMaster 15.11.2018, 3:07

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

Тем не менее все вышесказанное ничуть не утратило от этого актуальность. Разве что могу лишь еще раз в этом аспекте подчеркнуть важность структурированности когда ибо в противном случае дебаг еще более трудозатратен.

Автор: sutra 15.11.2018, 3:10

Стремительный бег времени, мы несёмся к новым знаниям, не успевая закрепить старые. Когда-то я считался неплохим специалистом, многие мои друзья уехали в Америку. Но я русский, здесь родился, здесь и помру. И за 30 лет я из спеца превратился в отстой. Хотя мне уже на покой пора, так что я не переживаю.

Страшно вспомнить, была такая машинка в СССР "Наири" в машинном зале. С перфокарт я начинал. На Искре 1030 закончил.

Автор: DarkMaster 15.11.2018, 3:31

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

Автор: sutra 15.11.2018, 3:40

Спасибо Дарк на добром слове. Буду принимать участие в доводке Пилота, пока есть силы и интерес, найду ошибки - сообщу. Будут пожелания - выскажу. Собственно мне и игра не интересна, интересно когда она играет за меня. Интересен процесс. Кнайту - терпения и удачи.

Автор: sutra 15.11.2018, 4:20

Цитата
Памяти. Чего же еще?

Во, вспомнил где я это слышал, точно, к памяти, только у меня ассоциация DMA - Direct Memory Access .

Автор: sutra 16.11.2018, 13:21

Вынужден свернуть все работы по переходу на lua. Обработка изображений в памяти невозможна. Читать байтами слишком медленно, а строками невозможно.
Сия конструкция не работает ss=readmem(ind,"s",numbyte,h)
Точнее работает пока не наткнётся на нуль или 255 байт. И то и другое считает концом строки и не читает ВСЕ положенные numbyte.

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

Не совсем я понял эти строки, с одной стороны, как в старом паскале мерилом строки является нулевой байт, а с другой совершенно иная интерпретация конца строки, так возникает вопрос, а почему тогда ограничение в 255 байт?

Конечно можно извратиться и читать непрочитанное байтами, но как-то не эстетично будет, да и опять же лишние тормоза.

Кнайт, сделай пожалуйста мувик (move) без анализа содержимого.

Не совсем корректно написал, первый байт со значением 255 читает.

Автор: DarkMaster 16.11.2018, 23:47

Код
local rmem      = require "ffi".cast

print = log
print "clear"
print "mode compact"

local a = getimage(694, 146, 708, 155)
log (a)

log (readmem(a, "b"))
log (rmem("char*", a)[0])

local t = os.clock()
for i = 1, 1000 do
    local tmp = readmem(a, "b")
end
log (os.clock()-t)

local t = os.clock()
for i = 1, 400000000 do
    local tmp = rmem("char*", a)[0]
end
log (os.clock()-t)

Хвтати тебе скорости?)

Автор: DarkMaster 17.11.2018, 0:20

https://luajit.org/ext_ffi.html
тут как раз пример по изображениям. Там еще и по математике очень сильно выиграть можно.

Автор: sutra 17.11.2018, 1:22

Цитата
Хвтати тебе скорости?)

Спасибо Дарк, только я пока вообще ничего не понял, купил с горя пивка, голова плохо варит. Мне в принципе ничего и не надо, просто в игре (моей) осталась одна фишка, чтобы можно было вообще ничего не делать. Остались 2 события, которые у меня в Пилоте получается идентифицировать только с вероятностью 70% (что уже не плохо, не думаю, что глаз способен это различать, тем более просиживая достаточно много времени за игрой). Разница между ними 1 десятая секунды. Интервал рэндома 5 сотых. Определить начало события - невероятно сложно. Определяю по анализу звука - это ещё погрешность 3 сотых. В общем только lua, но мне нужен инструмент (данные) с которыми lua сможет работать. Грубо говоря 1 сотая секунды допустимо, я уж думаю, может скринить на RAM и потом считать из bmp ... То же без опыта намаюсь.


Сами события длятся 2 и 3 десятых секунды. Времени очень мало, Пилот просто не справится.

Автор: DarkMaster 17.11.2018, 1:29

Я тебе выше дал аналог реадмема, который напрямую без пилотовских функций получает доступ к памяти.
1000 итераций пилота
420 000 000 итераций прямого чтения
занимают примерно то же самое время.
Больше не нужно читать строками - читай просто память побайтовов напрямую.

Код

local rmem      = require "ffi".cast -- в шапку.

local val = rmem("char*", ADDRESS)[0] -- читаем 1 байт.

Чтение мгновенное. По ссылке выше можно будет использовать си внутри луа - это ускорит работу с матетматикой, возможно ифами.

Автор: sutra 17.11.2018, 1:37

Цитата
Чтение мгновенное

Завтра попробую разобраться (в чём большие сомнения). Если я чего-то изначально не понимаю - я в ступоре. СПАСИБО, завтра попробую.

Вот говорили мне - учи СИ. Правда тогда интернета не было, вся литература по блату (знакомству). И язык я плохо английский в школе учил, ещё и смеялся, зачем мне советскому человеку их "убогий" язык. Ну ничего, через поколение посмотрим, чей язык будет нужней.

Автор: DarkMaster 17.11.2018, 1:42

Код
local rmem      = require "ffi".cast -- в шапку.
local address, width, height, length = getimage ( 148, 253 , 228, 279  )

for h = 0, height - 1 do
    address = address + length * h
    for w = 0, width do
        address = address + 1
        log (rmem("unsigned char*", address)[0])
    end
end

Может так будет чуть понятнее.
Обрати внимание - изменил тип данных на unsigned char.

Автор: sutra 17.11.2018, 1:45

Цитата
Может так будет чуть понятнее

Да конечно разберемся, просто хандра напала на меня, 2-е суток впустую убил, ну нет худа без добра, теперь знаю "как не надо на "фиг" делать".

Автор: DarkMaster 17.11.2018, 1:53

Цитата
Да конечно разберемся, просто хандра напала на меня, 2-е суток впустую убил, ну нет худа без добра, теперь знаю "как не надо на "фиг" делать".

Это называется получение опыта wink.gif

Автор: sutra 17.11.2018, 2:03

Цитата
Это называется получение опыта

Точно, вот его то мне и не хватает. Точнее образования. Хотя всё равно - Пилот - классная программулина, меня тут дочка попросила помочь ей, я то знаю, что мне учиться и учиться, а они думают что я всё могу, как волшебник. Но смог, с помощью Пилота, заставил Шоп рисовать, то, что надо. И главное, у Пилота никогда "не дрогнет рука". На самом деле, сфера применения просто необъятна, когда нужно доделать ТО, что другие не доделали или не додумали. Кнайту респект.

Автор: cirus 17.11.2018, 2:42

Цитата
Завтра попробую разобраться

цвета в массив
Код
--lua
-- сделать привязку к нужному окну
local rmem      = require "ffi".cast
local address, width, height, length = getimage (0, 0, 10, 10)
log "clear" log "mode compact"

local addr = address
local arr, k = {}, 1

for w = 0, height - 1 do
    address =  addr + length * w
    arr[k]={}
    for i=address, address + length - (length - width * 3 + 1), 3 do
        local b=rmem("unsigned char*", i)[0]
        local g=rmem("unsigned char*", i+1)[0]
        local r=rmem("unsigned char*", i+2)[0]
        --log (r, g, b)
        table.insert(arr[k], r + g * 256 + b * 65536)
    end
    k=k+1
end

for i=1, #arr do
    log(table.concat(arr[i], "  "))     -- вывод массива в лог
end

Автор: sutra 17.11.2018, 3:16

ОК. Спасибо cirus, но всё равно завтра, сегодня я уже устал.

Автор: DarkMaster 17.11.2018, 3:33

Цитата

цвета в массив

Только этот код ни в коем случае нельзя использовать smile.gif Вся скорость сразу же убьется. Весь этот массив уже в памяти и копировать его, тем более в виде таблицы, не нужно от слова совсем. Просто напрямую работать с адресами.

Автор: sutra 17.11.2018, 3:47

Цитата
Только этот код ни в коем случае нельзя использовать

Завтра я вас обоих достану. Только без обид пожалуйста. Cirus мне, как дилетанту, более понятен. Дарк, мыслит глобальными категориями, ВМЕСТЕ мы обязательно найдём все варианты и для слабовидящих и для плохослышащих и для несоображающих, ну и для универсала (три в одном) для меня.

Вопросы у меня есть и сейчас, но я их всё-таки отложу на завтра.

А может завтра их и не будет, а может и не только вопросов ...

Автор: DarkMaster 24.11.2018, 18:20

Send217/send (say не тестил) в lua делает обрезание пробелов. Попытка отправки send(" ") приводит к остановке скрипта (видимо крашит скрыто). В последней нестабильной бете при этом еще и перезапускает скрипт о.О.

Автор: WKnight 24.11.2018, 19:39

Починим. Только я финды разобрал, а собрать вдохновения нет, та еще и приболел малость.

Автор: DarkMaster 25.11.2018, 5:39

Там вроде с точками или знаками препинания в целом какие-то проблемы еще (по слухам). А в нестабильной сдвигает каретку влево не то при перезапуске автоматическом не то при попытке пробел напечатать (сам видел).

Цитата
Починим. Только я финды разобрал, а собрать вдохновения нет, та еще и приболел малость.

А я и смотрю что-то не то. Кнайт постоянно тут, а апдейтов не видать. Странно это smile.gif Выздоравливай wink.gif

Автор: DarkMaster 29.11.2018, 12:49

log(mouseclickdelay (20))
вернет старый delay, но установит корректно. Последующий вызов
log(mouseclickdelay ())
уже вернет 20.
Т.е. логично было бы, чтобы возвращало установленное значение, а не старое при вызове с параметром.

Автор: cirus 29.11.2018, 13:04

Цитата
Переделал в Lua функции 'findimage' и 'findcolor' на новый синтаксис

А оно работает?
Код
--lua
arr, err = findcolor(0, 0, 1920, 1080, {5318912}, 2)
hint(err)

Проверял в нестабильной бете. Всегда 0 возвращает.

Автор: DarkMaster 29.11.2018, 14:54

(144)main->"[C]"->(-2)send217->"[string "--lua..."]"->(144)main->"[C]"->(-2)send217->"[string "--lua..."]"->(144)main->"[C]"->(-2)send217->"[string "--lua..."]"->(144)main->"[C]"->(-2)send217->"[string "--lua..."]"->(144)main->"[C]"->(-2)send217->"[string "--lua..."]"->(144)main->"[C]"->(-2)send217->"[string "--lua..."]"->(144)main->"[C]"->(-2)send217->"[string "--lua..."]"->(144)main->"[C]"->(-2)send217->"[string "--lua..."]"->(144)main->"[C]"->(-2)send217->"[string "--lua..."]"->(144)main->"[C]"->(-2)send217->"[string "--lua..."]"->(144)main->"[C]"->(-2)send217->"[string "--lua..."]"->(144)main->"[C]"->(-2)send217->"[string "--lua..."]"->(140)main-> end
При send217(some_func_return_none()) набирается дикий стек.
Причем этот дикий стек идет даже перед объявлением пременных в шапке скрипта.

Автор: WKnight 29.11.2018, 22:08

Цитата
Т.е. логично было бы, чтобы возвращало установленное значение, а не старое при вызове с параметром.
Всякие к примеру апишные функции, или таже джава, обычно возвращают старое значение для бекапа типа.
Цитата
дикий стек
Че-то чушь какая-то. 12 раз одно и тоже повторяется. Ты уверен, что логгер правильно его обрабатывает?

Автор: DarkMaster 29.11.2018, 22:28

Цитата
Всякие к примеру апишные функции, или таже джава, обычно возвращают старое значение для бекапа типа.

Разумно, оставляем. Где-нибудь в документуху бы добавить этот момент.
Цитата
Че-то чушь какая-то. 12 раз одно и тоже повторяется. Ты уверен, что логгер правильно его обрабатывает?

Если нет, то это будет первый баг логгера.
При этом пилот вообще ничерта не выполнял, а вставал на этой строке.

Автор: WKnight 29.11.2018, 22:58

Скинь че-нить, чтоб я в дебаге мог походить. Мож с моей стороны что-то интересное видно будет.

Автор: DarkMaster 30.11.2018, 0:11

Код
--lua
send217()
end_script ()

уже плохеет.

Не вылизано, может есть огрехи, но оно работает. По крайней мере у меня настольный инструмент. Предлагаю включить в пилот, со временем может допилится до чего-то более красивого. На данный момент технически не имею возможности выдергивать значения передаваемые в функцию. С переменными можно исключительно через Ж выдернуть значения по сути написав собственный парсер, а вот с внешних функций уже увы не получится без использования апи на стороне пилота.
Код
--lua
--log = print

    do
        local tab = ""
        local deep = 0
        function table.show(t, comment)
            -- Пишем в лог комментарий.
            deep = deep + 1 -- Уровень вложенности вызовов функции.
            --log(comment .. commentSended .. deep)
            if  comment ~= nil and deep == 1 then
                log(comment)
            end


            if     type(t) == "nil"     then log("table is nil")
            elseif type(t) == "string"  then log('table is string: "'..t..'"')
            elseif type(t) == "number"  then log('table is number: '..t)
            elseif type(t) == "table"   then
                local elementsInTable = 0
                for k,v in pairs(t) do
                    if  type (v) == "table" then
                        if type(k) == "string" then
                            log(tab..'table: "'..k..'"')
                        else
                            log(tab..'table: '..k)
                        end
                        tab = tab .. "    "
                        table.show(v)
                        tab = string.sub(tab, 1, -5)
                        elementsInTable = elementsInTable + 1
                    else
                        elementsInTable = elementsInTable + 1
                        if type(v) == "string" then v = '"'..v..'"' end
                        if type(v) == "boolean" then v = '"'.. tostring(v)..'"' end
                        if type(v) == "function" then v = '"'.. tostring(v) ..'"' end
                        if type(k) == "string" then k = '"'..k..'"' end
                        log(tab..""..k)--.." = "..v)
                    end
                end
                if elementsInTable == 0 then log("table is empty") end
            else
                log('table is unknow data type')
            end
            -- Пишем в лог комментарий.
            deep = deep - 1 -- Уровень вложенности вызовов функции.
        end
    end




local dbg    = {}
dbg.trace    = 1                   -- Отображение стека
dbg.line     = 1                   -- Отображение номеров строк
dbg.code     = 1                   -- Отображение исходного кода
dbg.source   = 1                   -- Отображение источника кода(адрес файла, строка и т.д.)
dbg.source_abs = 0                 -- Абсолютные адреса файлов.
dbg.tab      = 75                  -- Выравнивание исходного кода в символах.
--     стек                 выравнивание     код
--(213)main->                             mycall()
--(213)main->(209)mycall->                file_echo()
--     стек                 выравнивание     код
                                  
dbg.file  = {}                   -- Настройки файла лога
dbg.file.enable = 1              -- Включить логирование в файл
dbg.file.path = "lua_log.txt"    -- Путь файла лога
dbg.file.append = 0              -- Дописывать лог (не удалять старый)
dbg.file.handle = nil            -- Хендл файла
dbg.buffer = {}                  -- Буфер с файлами скриптов.

dbg.homepath = [[i:\!sandboxie\wxLua\drive\C\LuaJIT-2.0.5 x86 bin_2\]]          -- Копируем адрес директории с пилотом для
                                   -- преобразования абсолютного в относительный.
                                   -- Очень сильно экономит такты.


if  dbg.file.enable == 1 then
    if  dbg.file.append == 1 then
        dbg.file.handle = io.open("lua_log.txt", "a+b")
    else
        dbg.file.handle = io.open("lua_log.txt", "wb") -- Стираем файл.
--        dbg.file.handle:close()                       -- Стираем файл.
--        dbg.file.handle = io.open("lua_log.txt", "a+b")
    end
end


function dbg.func()
    local result = ""
    local short_src = ""
    local source_line = ""
    local source_is_file = nil

    
    local info = debug.getinfo(2,'nSl')
--    table.show(info)
    
    if  info then
    
        -- Включено логгирование строк исходника.
        -- Только вычлнение строки,
        -- конкатенция после получения стека.
        if  dbg.code == 1 then
            local source_line_n = info.currentline
            local line_pos = 0

            -- Если источник кода внешний файл, то
            -- подгружаем файл в источник вместо адреса файла.
            if string.sub(info.source,1,1) == "@" then
                source_is_file = true
                local source_file = io.open(string.sub(info.source, 2), "r")
                info.source = source_file:read("*a")
                source_file:close()
            end

            -- Находим строку с кодом в исходнике.
            for i=1, source_line_n - 1 do
                --log("i: "..i.."source_line_n: "..source_line_n - 1)
                line_pos = string.find(info.source, "\n", line_pos +1)
            end
            local line_end = string.find(info.source, "\n", line_pos +1)
            source_line = string.sub(info.source, line_pos + 1, line_end - 1)
            
--            result = result.."\t"..source_line
        end


        -- Получаем стек, пути.
        if dbg.trace == 1 then
        for i=3, 100 do
            if  info then
                if  not info.name then info.name = info.what end
                -- Добавление источника.
                if  dbg.source == 1 then
                    if  short_src ~= info.short_src then
                        if  i > 3 then
                            -- Преобразуем абсолютный путь в отностиельный.
                            if  source_is_file and dbg.source_abs == 0 then
                                local prefix = string.sub(short_src, 1, #dbg.homepath)
                                if prefix == dbg.homepath then
                                    j=i
                                    short_src = string.sub(short_src, #dbg.homepath + 1)
                                end
                            end
                            result = '"'..short_src..'"->'..result
                        end
                        short_src =  info.short_src
                    end
                end
                -- Добавление стека
                result = "("..info.currentline -1 ..")"..info.name .. "->" .. result
            else
               break
            end
            info = debug.getinfo(i,'nSl')
        end
        end
    else
        return
    end
    
    
    -- Добавляем строку исходника.
    if  dbg.code == 1 and dbg.code == 1 then
        if  dbg.trace == 1 then
            result = result..string.rep(" ", dbg.tab-#result)..source_line
        else
            result = tostring(info.currentline)
            result = result..string.rep(" ", 5-#result).."-> "..source_line
        end
    end

    log(result)

    if  string.sub(result, -1) == "\r" then
        result = result .. "\n"
    else
        result = result .. "\r\n"
    end

    if  dbg.file.enable == 1 then
        dbg.file.handle:write(result)
        dbg.file.handle:flush()
    end
--    log(source_line)
end

function dbg.enable (state)     -- Вкл|выкл лога. nil, false, 0 - выключают, любые другие значения включают.
    if  state and state ~= 0 then
        if  dbg.line == 1 or dbg.trace == 1 then
            debug.sethook (dbg.func, "l")
        end
    else
        log "disable debug"
        debug.sethook ()
    end
end


return dbg




По сути аналог log commands

Автор: WKnight 2.12.2018, 14:11

Unstable
02.12.2018 Build 016.16
Исправил эксепшен, возникающий при перезапуске Lua скриптов.

Автор: DarkMaster 2.12.2018, 14:14

worthy.gif

Автор: WKnight 7.12.2018, 13:19

Unstable
07.12.2018 Build 016.17

Добавил "*.lua" в маску по умолчанию, в диалоги открытия\сохранения скриптов.

Исправил галочку "Добавлять пробелы", слегка переделал алгоритм.

Исправил 'dir' в Lua. Если ничего не найдено, то возвращает "nil", а не пустую таблицу.

В хелп с Wiki, который вызывается по "F1" или по ПКМ на операторе в скрипте, добавил команды Lua. Какую справку показывать, Lua или обычную, определяется по предшествующему комментарию.

В "Перекачать всё с Wiki" добавил скачивание Lua вариантов команд.

Исправил эксепшен при использовании 'send' без параметров.

Убрал зацикливание одинокого скрипта Lua без признака конца скрипта "--endlua".

Добавил редактор "Подсветки синтаксиса" в меню "Настройки".

Исправил ошибку "EConvertError '^xx'", где "хх" номер скрипта, иногда возникающую при выполнении процедур.

Автор: sel 7.12.2018, 18:08

Цитата(WKnight @ 7.12.2018, 15:19) *

Unstable
07.12.2018 Build 016.17


Исправил ошибку "EConvertError '^xx'", где "хх" номер скрипта, иногда возникающую при выполнении процедур.


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

Автор: WKnight 7.12.2018, 21:39

Мне нужен пример, для воспроизведения ошибки.

Автор: sel 7.12.2018, 23:09

Цитата(WKnight @ 7.12.2018, 23:39) *

Мне нужен пример, для воспроизведения ошибки.


Попробуйте запустить этот скрипт без запущенного калькулятора.
Код
call test

proc test
set #handleWin findWindow (Калькулятор)
set workwindow #handleWin
end_proc
end_script

Автор: sutra 7.12.2018, 23:42

Цитата
Попробуйте запустить этот скрипт без запущенного калькулятора.

Здесь нет ошибки. Надо всегда проверять результат того, чего может не быть. В данном случае проверить, что #handleWin не является nil.

В лом искать пример на языке Пилота, кусочек кода на lua...
Код
local mic=findwindow("Микшер")
if mic==nil then                                                               -- Если окно Микшера громкости не найдено
...



В Пилоте есть оператор is_real. Смотрите справку. Очень нужный оператор.

Автор: sutra 8.12.2018, 0:04

В Вашем случае нужно смотреть, чтобы значение #handleWin , было более нуля.

Автор: sutra 8.12.2018, 0:36

Нет, тут вопросы к Кнайту, попробовал, без запущенного калькулятора вешает Пилот наглухо. Хотя я бы ни в жизнь не запустил такой ненужный, да ещё и глюкавый оператор как proc.

Автор: sel 8.12.2018, 0:44

Цитата(sutra @ 8.12.2018, 2:36) *

Нет, тут вопросы к Кнайту, попробовал, без запущенного калькулятора вешает Пилот наглухо. Хотя я бы ни в жизнь не запустил такой ненужный, да ещё и глюкавый оператор как proc.


Дело в том, что раньше такого не было, а сейчас да, вешает наглухо)

Автор: DarkMaster 8.12.2018, 0:47

Цитата
Хотя я бы ни в жизнь не запустил такой ненужный, да ещё и глюкавый оператор как proc.

Да оператор то как раз очень нужный. По крайней мере в пилотовском синтаксисе. В первую очередь он хорош тем, что имеет свое пространство имен. По сути это аналог функций. А вот проблемки у него случались. Это кстати одна из основных причин, почему я склонял на встраивание луа.

Автор: sutra 8.12.2018, 0:52

Цитата
Дело в том, что раньше такого не было, а сейчас да, вешает наглухо

Ну так и откажись от него, он живёт своей жизнью, никаких преимуществ не даёт, наоборот - одни проблемы. Используй gosub, просто, эффективно и понятно. А Кнайт пусть репу чешет, как решать сию проблему. Вам спасибо, запесплатно выявили ошибку.

Цитата
Да оператор то как раз очень нужный

Да нафиг он нужен. Ну своё пространство - это суперпроблема для Пилота? Ты то давно в lua.

Цитата
Да оператор то как раз очень нужный

Настолько нужный, что с версии 2.15 "чудно работал".

Автор: DarkMaster 8.12.2018, 2:38

Цитата
Ну своё пространство - это суперпроблема для Пилота?

Да, я уже писал об этом smile.gif
Цитата
Ты то давно в lua.

Ну поэтому и в луа, что в луа нет этой проблемы. Для старого синтаксиса важно. По сути я старый синтаксис рассматриваю сейчас в первую очередь, как совместимость. По большому счету нужно на lua пересаживать народ, а это тяжело. В первую очередь потому, что это не язык по умолчанию и его еще нужно включить и выглядит он сейчас больше, как пасхалка. Во вторых вика ну очень хорошо написана, но написана она не под луа и ее нужно редактировать и редактировать много. Да правки там символические, но для людей неразибрающихся они нужны и сильно.

Автор: sutra 8.12.2018, 2:54

Цитата
но для людей неразибрающихся они нужны и сильно.

Всё так, ты как всегда прав. Ну со временем всё будет как надо. Ещё раз спасибо Кнайту, высказывать пожелания и критиковать легко, а вот реально что-то сделать, не так просто.


Лично я до сих пор, все кусочки кода методом тыка сначала пробую на работоспособность, потом тестирую на скорость и только потом внедряю в рабочий скрипт. Процесс небыстрый, но потихоньку продвигаюсь. Проектирую новый код на перспективу, да, медленно, но сомнений нет, всё будет переведено на lua, и как и обещал, прибью даже блоху, в любой координате, даже если она появится на миг.

Автор: sutra 9.12.2018, 14:26

Обнаружил вот такую ошибочку.

Код
local p,w,h,l=getimage(655,938,684,938,ww)
saveimage(p,[[image.bmp]])  -- размер картинки 30 х 88 вместо 30 х 1
deleteimage(p)

Автор: DarkMaster 9.12.2018, 23:59

ctrl-Y отвалился. (Противоположность ctrl+z). Так же был странный глюк, когда ctrl+Y начинал стирать строки. Это было как-то связано с выделением строки.

Автор: sutra 10.12.2018, 9:51

По ходу дела минимальная зона захвата getimage - 2x2

Автор: sutra 10.12.2018, 10:18

Цитата
ctrl-Y отвалился.

Конечно это неплохая вещь. Однако, как говорят в народе, на скорость не влияет! У меня с давних пор выработана привычка, если придумал что-то супер эксклюзивное, немедленно сохраняй. Если нацарапал абзац - сохраняй. Раньше бесперебойников не было. Ну а бекап вроде давно уже стандарт, в Пилоте слава богу с этим проблем нет. Ну а если по собственному недосмотру удалил какую-нить хрень, ну откат то работает, остальное господа - излишества, заставляющие мозг окончательно забыть про его предназначение.

Я вообще по привычке частенько в FARе всё делаю, там нет проблем, там можно всё, хоть вертикальными блоками таскай, сдвиги влево вправо и redo работает, правда не CTRL-Y. И подсветка меня устраивает, сразу показывает какой end к чему относится.

Автор: WKnight 10.12.2018, 11:25

Во во,я и говорю - Far smile.gif

Автор: sutra 10.12.2018, 11:43

Цитата
Во во,я и говорю - Far

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


Конечно не только FAR всё это может, но зачем мне другое, если старое доброе работает как надо.

Автор: DarkMaster 11.12.2018, 0:16

Пилот свернутый в трей исчезает из трея после перезапуска проводника. Потом его не достать - только перезапускать. Я уже кидал сколько-то лет назад почему так происходит и что нужно сделать чтобы пофиксить)

Автор: WKnight 11.12.2018, 2:39

Я надеялся, что со временем оно потеряет актуальность smile.gif

Автор: DarkMaster 11.12.2018, 2:42

Цитата
Я надеялся, что со временем оно потеряет актуальность smile.gif

Слова не программиста, но админа smile.gif

Автор: DarkMaster 13.12.2018, 0:43

В последней нестабильной бете findimage встал колом. Начал разбираться - там по x не отсекает область должным образом - ищет значительно шире.

Автор: DarkMaster 13.12.2018, 2:39

set windowpos в луа отсуствует. Есть только get.

Автор: DarkMaster 13.12.2018, 3:31

После запуска/остановки lua скрипта позиция в редакторе улетает вначало. Запоминать бы. А то тестовых запусках прокручивать сотни строк глаз дергаться начнет)

Автор: sutra 13.12.2018, 4:34

Цитата
set windowpos в луа отсуствует

А у меня вроде работает.

Код
  mic=findwindow("Микшер")                                                       -- Поиск хендла окна Микшера громкости
  windowpos(100,100,800,0,mic[1][1])                                             -- Растягивание окна Микшера громкости, для гарантии отображения всех устройств


Правда в новой версии не проверял, в предыдущей версии Пилота работало. Этим кодом пока не пользовался, может и есть косяки, пока ещё всё переделываю свой скрипт - это чую надолго. Но работало точно.

Автор: sutra 13.12.2018, 5:18

Проверил, в новой версии тоже работает, во всяком случае с Микшером работает.

Цитата
findimage встал колом

А ведь мы с cirus-ом говорили, что там недопилено.

Автор: DarkMaster 13.12.2018, 6:58

Странно. Раньше не работало точно, фикса не помню. Буквально на днях не мог сдвинуть окно. Подозреваю, что версия была старая либо хендл дочерний какой-то. Вобщем вопрос снят.

Автор: DarkMaster 13.12.2018, 8:51

А что насчет доступа к переменным из параллельных скриптов луа? У нас сейчас одна машина или их пачка? Получится ли создать некоторый массив:
global = {} -- видимый из всех скриптов
Будет прилинкован некоторый массив локальный.
global[my_name] = my_array_or_table_or_what_i_want

Дабы не забивать скрипт upvalue (lua не очень это любит, тем более в корень), инициализировать его можно функцией. Т.е. выглядеть в коде должно примерно так:

local my_name_for_global = global_vars()
my_name_for_global[my_name_of_field] = my_data

От практики использования индексов вкладок в рамках lua предлагаю отказаться, т.к. это пораждает несколько проблем:
1) Скрипты путешествуют по вкладкам.
2) Зачастую это ухудшает читаемость, т.к. нужно помнить и сопоставлять индексы скриптам.
3) Использовать возврат индекса по имени скрипта тоже бывает затруднительно, т.к. скриптов может быть несколько с похожими именами, а при изменении скрипта, как правило, он сохраняется под новым именем.

Автор: DarkMaster 15.12.2018, 14:17

1) в нестабильной бете куда-то делись сообщения об ошибках (последней)

2) В пилоте не могу выполнить следующий код:

Код
package.path = [[.\luaPlugins\winapi\?.lua;]] .. package.path
--package.path = [[.\winapi\?.lua;]] .. package.path
--package.path = [[.\glue\?.lua;]] .. package.path
package.loaded.winapi = nil
package.loaded.windowclass = nil


winapi = require [[winapi]]
require'winapi.windowclass'

win = winapi.Window{
   w = 500,                --all these are "initial fields"
   h = 300,
   title = 'Lua rulez',
   autoquit = true,        --this is to quit app when the window is closed
   visible = false,        --this field is from BaseWindow
}

function win:on_close()    --this is an event handler
   print'Bye'
end

print(win.title)           --this is how to read the value of a property
win.title = 'Lua rulez!'   --this is how to set the value of a property
win:show()                 --this is a method call

os.exit(winapi.MessageLoop()) --start the message loop

При этом он же в консоли выполняется на ура, окошко вылазит, все кошерно.
Требуется:
https://luapower.com/winapi
https://luapower.com/glue

Автор: WKnight 15.12.2018, 15:23

2) Падает с эксепшеном "деление на ноль" на строке "winapi = require [[winapi]]"

Если чуть чуть поковыряться, то ему похоже не нравятся строки типа
local maxn = maxn or 1/0
если их убрать, то падает в другом месте, хотя они даже не вызываются.

Автор: DarkMaster 15.12.2018, 15:43

у меня падает ссылаясь на loop загрузку либо повторную загрузку модуля о.О

Автор: WKnight 15.12.2018, 16:24

1) какие именно, в луа там вроде ниче не ковырял.
2) че-то нет идей.

Unstable
15.12.2018 Build 016.18

Исправил присваивание 'workwindow' в процедурах. Присваивание срабатывало только на вызывающий скрипт.

Убрал кусочек отладочной информации забытый недавно в финдколоре.

В редакторе скриптов отключил горячую клавишу удаления текущей строки, и для функции Redo изменил на Ctrl+Y.

Исправил минимальные размеры захватываемой картинки в команде
'getimage' при работе по хэндлу.

Исправил исключение при работе по хэндлу в команде 'getimage', когда начальные координаты были больше конечных.

Убрал напоминание о том, что не указано рабочее окно, при старте скрипта по горячей клавише.

В подсветку синтаксиса добавил комментарии Lua "--".

Добавил восстановление иконки в трэе, при перезапуске проводника.

Слегка подправил вывод сообщений об ошибках Lua, теперь сообщает какое именно было исключение.

Автор: DarkMaster 15.12.2018, 16:35

Цитата
Слегка подправил вывод сообщений об ошибках Lua, теперь сообщает какое именно было исключение.

Выпадающая ошибка действительно изменилась. Больше нет никакой циклической загрузки, тем не менее проблемы с делением на ноль есть, причем это уже второй модуль который ругается на деление на ноль, но при этом работает в луа-консоли. Первый был serpent.
Абсолютно не ясен источник этой ошибки:
Lua error.
Floating point division by zero
syntax error during precompilation.
Ок, информация полезная бесспорно. Но там 133 файла в 4 каталогах.

Автор: DarkMaster 15.12.2018, 17:01

консоль
Код
LuaJIT 2.0.5 -- Copyright (C) 2005-2017 Mike Pall. http://luajit.org/
JIT: ON CMOV SSE2 SSE3 SSE4.1 fold cse dce fwd dse narrow loop abc sink fuse
> a = 1/0
> print(a)
inf
>

пилот
Код
--lua
a = 1/0
log(a)

вывод:
Lua error.
Floating point division by zero

Автор: WKnight 15.12.2018, 17:03

Цитата
Абсолютно не ясен источник этой ошибки:
Всё шо есть...
Цитата
Но там 133 на 4 каталогах.
Терзают меня смутные сомнения, что ищем мы где-то не там.

Автор: DarkMaster 15.12.2018, 17:10

Слабая причина - либо источник передача стрингом его в этом случае не устраивает.
Ставлю на то, что либа скомпилена не та версия/не те ключи/особенности компилятора.

Заменил либу на компиленную в студии, получил:
could not load Lua library "lua5.1.dll".

Автор: DarkMaster 15.12.2018, 17:35

А ты бету или стабильную в пилот встраивал? Стабильная - это 5.1. Бета строится вокруг 5.2. В 5.2 вроде какие-то изменения с делением на ноль.

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