|
Hint |
|
|
DarkMaster |
29.6.2024, 13:45
|
          
Модератор UOPilot
Сообщений: 9.697
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29280
Пользователь №: 11.279

|
Собственно луашный хинт претендующий на некоторую полноценность. На данный момент доведено до состояния "вроде что-то работает". Было бы очень хорошо, если кто-то потестил. Сам я хинтом практически никогда не пользуюсь так, что тестить мне его в реальных условиях сложновато, но люди время от времени просят. Использование: Код local hint = require[[hint]] hint_obj = hint(ваш_конфиг) -- вывести сообщение. Описание cfg{} ниже. Вернет hint_obj. hint_obj = hint.hide() -- скрыть сообщение. Вернет hint_obj. hint.destroy() -- уничтожить поток с сообщением. Окно можно таскать мышкой, повторые вызовы будут в тех же координатах, куда вы поместили окно. При нажатии правой кнопкой мыши - позиция будет восстановлена.
cfg - таблица с параметрами окна, сообщения. Все параметры являются опциональными, если они не будут указаны, то будут загружены значения по умолчанию. cfg.text = "0a123456789abcT" -- текст сообщения cfg.font = "Arial" -- название шрифта который будет использован. cfg.font_size = 36 -- размер шрифта cfg.font_color = 0xcc6020 -- цвет шрифта cfg.font_alpha = 255 -- прозрачность шрифта cfg.bold = 700 -- насколько жирным делать шрифт. Стандартно 100-900 с шагом 100. cfg.anchor = "bottom_left" -- якорь от которого считать pox_x, pos_y. Размер окна может быть разным из-за разного текста, и если мы хотим, например, видеть окно в правом нижнем углу, то мы можем задать, что окно должно "заканчиваться" в этих координатах, а не начинаться. top_left/top_right/bottom_left/bottom_right. cfg.align_h = "right" -- выравнить текст по горизонтали. left/right/center cfg.align_v = "center" -- выровнить текст по вертикали. top/bottom/center cfg.pos_x = 300 -- позиция на экране x cfg.pos_y = 300 -- позиция на экране y cfg.width = 0 -- ширина. 0 - подгонит под размер текста cfg.height = 50 -- высота. 0 - подгонит под размер текста cfg.border_h = 0.15 -- размер горизонтального поля. При >-1 и <1 создаст поле пропорционально шрифту. При значениях больше - поле в пикселях cfg.border_v = -5 -- размер вертикального поля. При >-1 и <1 создаст поле пропорционально шрифту. При значениях больше - поле в пикселях cfg.bg_color = 0x40A65C -- цвет фона cfg.bg_alpha = 220 -- прозрачность фона cfg.sticky = 20 -- Расстояние на котором прилеплять окно к краю экрана при перемещении мышкой. cfg.timeout = 1000 -- время жизни окна в мс (1000 = 1 сек).
hint поддерживает вывод нескольких сообщений одновременно. Для дальнейшего понимания его работы необходимо немного углубиться в его структуру: hint - это массив с объектами которые выводят сообщения. Каждый объект является независимым от других и запущен в отдельном потоке. Каждый из этих объектов имеет методы: hint(), hide(), destroy(). По умолчанию во время запуска созадется объект default и добавляет несколько ссылок для упрощенного вызова. hint() - это hint.default() -> hint.default.hint() hint.default() - это hint.default.hint() hint.hide() - это hint.default.hide() hint.destroy() - это hint.default.destroy() local hint_obj = hint.default.hint() hint_obj - это hint.default -- соответственно вызов: local hint_obj = hint.name() -- создаст: hint_obj = hint.name hint_obj() = hint.name() hint_obj.hint() = hint.name.hint() hint_obj.hide() = hint.name.hide() hint_obj.destroy() = hint.name.destroy()
Для вызова еще одного окна одновременно достаточно вызвать: local second_hint = hint.name(ваш_конфиг) Вместо "name" укажите любое незанятое имя (default, hide, destroy заняты сразу после старта).
Из известных проблем: 1) При повторном вызове хинта может быть на мгновение отображено прошлое состояние. Почему - не знаю. Я сначала перерисовываю окно, потом делаю hint, но оно все равно на один фрейм шансово показывает старое изображение. 2) При повторных вызовах на один первый фрейм может исчезнуть текст. 3) Бэкраунд и текст являются двумя разными окнами. Устанавливать прозрачность фона отдельно от прозрачности текста при использовании одного окна не получилось. 4) Не работает стандартный флаг вертикального выравнивания текста. Написан костыль реализующий этот функционал. 5) Окно хинта стартует в подвисшем состоянии (часики при наведении). Отмирает если навести на него мышку, убрать. Причины данного поведения мне не ясны. Фикшу путем вызова user32.SendMessageA(window, WM_SETCURSOR , 0, 0). 6) Если тащите окно и в это время был повторный вызов - окно переместится. 7) cdef содержит кучу мусора. При релизе почищу. По факту это мой первый хоть сколько-то объемный код с использование winapi и работой с окнами в частности. Я не сомневаюсь, что там куча кривых моментов. С удовольствием выслушаю, как надо было. пример вызова
Код --lua local hint = require[[hint]]
hint() wait(300)
cfg = {} cfg.font_size = 72 cfg.border_h = 0.15 cfg.border_v = -5 cfg.text = "ZZZZZZZZZZZZZZ" cfg.pos_x = 600 cfg.pos_y = 600 cfg.width = 0 cfg.height = 0 cfg.bg_color = 0x990099 --math.random(0xffffff) cfg.bg_alpha = 100 cfg.bold = 700 cfg.font = "Courier New"--"Courier New" cfg.font_color = 0x999999 --math.random(0xffffff) cfg.font_alpha = 170 cfg.align_h = "center" cfg.align_v = "center" cfg.sticky = 20 cfg.anchor = "bottom_left" cfg.timeout = 5000 print"hint call" local second = hint.second(cfg) print("second", second) wait(300) second.hide() second.destroy() wait(300) print("second second call", second) second = hint.second(cfg) wait(300) print("second second hide", second) second.hide() --C.Sleep(1000)
cfg = {} cfg.font_size = 72 cfg.border_h = 0.15 cfg.border_v = -5 cfg.text = "AAAAAAAAAAAAAA" cfg.pos_x = 300 cfg.pos_y = 300 cfg.width = 0 cfg.height = 0 cfg.bg_color = 0x000099 --math.random(0xffffff) cfg.bg_alpha = 30 cfg.bold = 700 cfg.font = "Courier New"--"Courier New" cfg.font_color = 0x009900 --math.random(0xffffff) cfg.font_alpha = 170 cfg.align_h = "center" cfg.align_v = "center" cfg.sticky = 20 cfg.anchor = "bottom_left" cfg.timeout = 2000 print"hint.y" hint.y(cfg)
C.Sleep(20000)
Сообщение отредактировал DarkMaster - 27.10.2024, 3:19
Прикрепленные файлы
hint_0.9.3.zip ( 13,79 килобайт )
Кол-во скачиваний: 48
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____ Писать в личку.
|
|
|
|
Cockney |
5.7.2024, 22:55
|
       
Master
Сообщений: 1.402
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 22429
Пользователь №: 16.156

|
При всем уважении к труду - все это можно описать как "французский с нижегородским". Ну не должно на луа делать такие штуки. Не должно. Это просто архитектурная ошибка, когда мы из скриптового языка лезем через десятки ffi ради создания окошек и кнопок. Ну зачем ? Как это использовать ? Как поддерживать ? Давно вынашиваю идею, но не озвучивал ее - нужно делать копию пилота общими силами. Шанс что дальше будут апдейты от кнайта имхо мал, а смотреть на текущую кривость пилота и латать дыры вот так - ну не дело. Завести репозиторий, часть писать, условно на плюсах, часть на луа, иди еще чем то. Сделать нормальную расширяемую систему. Вот тогда будет толк, а так это просто очередная либа которая точечно что то решает, если ты ее правильно сконфижишь. Имхо.
|
|
|
|
DarkMaster |
6.7.2024, 16:34
|
          
Модератор UOPilot
Сообщений: 9.697
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29280
Пользователь №: 11.279

|
Цитата Давно вынашиваю идею, но не озвучивал ее - нужно делать копию пилота общими силами. на данный момент есть переписанные функции работы с окнами и с программами... 25 функций (не считая тот лютый findindimage до исходников которого я долез, но трогать страшно даже не смтря на то, что я знаю, где именно баг, по сути он готов.). переписано с расширением функционала. Переписано это все с "архитектурными ошибками". Глобально беды особой не вижу когда работа с отдельными функциями. С хинтом - намного сложенее ибо там лютый объем, чудесный винапи с окнами и мое полное дилетатнство в интерфейсах. Для меня основная катастрофа и непонятный момент это гуи. Для меня это катастрофа. Тыкал wx, пока скорее страшно, чем толково. По поводу архитектурных ошибок. Причин решений несколько. Причина первая - антивирусы задрали удалять пилот. Ты не представляешь сколько мы потеряли людей из-за этого. К текстовым файлам едва ли будут претензии. Т.е. концептуально там вообще не должно быть ни одного файла с бинарником кроме luajit.exe. Момент второй - я фанат луа. Да мне тупо он очень нравится своей гибкостью и простотой. Всилу вышеозученного в качестве гуя вижу из вариантов только wx - просто потому, что считаю правильным сделать максимальную интеграцию с ZeroBrane. В моем понмании гуй пилота должен превратиться в мини тулсу которая будет запускать лупу, дергать информацию об окнах, цветах и т.д. Сам редактор в самом минимальном виде (при наличии zerobrane - копировать содержимое окна его редактора). Хочешь больше - остальное через ZeroBrane, там отладка, подсветка и все-все-все. Ну и около года назад я согласовал с админами выпуск сборки без кнайта на базе форума и старанички кнайта, но мне ответили с задержкой в пару месяцев, когда времени не стало. Сообщение отредактировал DarkMaster - 6.7.2024, 16:47
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____ Писать в личку.
|
|
|
|
Cockney |
6.7.2024, 17:26
|
       
Master
Сообщений: 1.402
Регистрация: 22.6.2013 Группа: Пользователи Наличность: 22429
Пользователь №: 16.156

|
Вот в этом то и загвоздка - попытка тянуть в одного все, используя один инструмент. Да, как и сказано "в целом, если особо не вникать - работает". Можно и правильней делать все на стыке технологий - что то низкоуровневое - на си, что то для гуи - на луа. Хочешь расширить своими хотелками - вот тебе интерфейс для этого. И пилот ловится антивирусами только лишь из за упаковщика upx, которым он защищен. А от чего ? Но то уже вероятно дело прошлое. А дальше что ? Не понимаю почему договор на выпуск релизов не исполняется, понятно что не у всех есть время, но апдейты будут хоть когда то, пусть и раз в год, как раньше. Сейчас то их нет вообще.
|
|
|
|
DarkMaster |
6.7.2024, 17:34
|
          
Модератор UOPilot
Сообщений: 9.697
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29280
Пользователь №: 11.279

|
Цитата upx, которым он защищен. Насколько помню он уже им не паковался достаточно давно. Цитата Не понимаю почему договор на выпуск релизов не исполняется Потому что я торчал в **** с кучей проблем. Вернулся я пару месяцев назад. Хинт забрал очень много времени да и по приезду много чего нужно сделать было. Тут даже скорее потоки сожрали время, но это был бесценный опыт. Иметь возможность выкидывать в отдельный поток функции прямо из среды это прекрасно. И да, это было разрешение, а не договор. Ну т.е. я никому ничего не должен. Апдейты не кнайта, апдейты мои. Чтобы что-то выложить нужно что-то написать, а я в другой стране был в реально очень сложной ситуации и времени тупо не было вообще ни на что. И уехать оттуда я не мог. Ну и исходников у меня, как не было, так и нет. Т.е. все с нуля полюбому. На переходный период расширение функционала модулями с подгрузкой в виде шаблона скрипта с require. Других идей у меня особо нет. Сообщение отредактировал DarkMaster - 6.7.2024, 17:47
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____ Писать в личку.
|
|
|
|
фонарик |
21.7.2024, 0:59
|
   
Apprentice
Сообщений: 160
Регистрация: 23.11.2011 Группа: Пользователи Наличность: 0
Пользователь №: 14.305

|
Скачал файлик hint.lua (56.1 кб), положил его в папку с пилотом. Запускаем: Код --lua local hint = require[[hint]] hint() После старта окошко пилота схлопывается, исчезает мгновенно и бесследно (IMG: style_emoticons/default/unsure.gif) Как нужно по-правильному использовать, подскажите пожалуйста.
|
|
|
|
DarkMaster |
27.10.2024, 3:17
|
          
Модератор UOPilot
Сообщений: 9.697
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 29280
Пользователь №: 11.279

|
0.9.3 версия Было много чего подчищено и переработано для того чтобы hint работал в пилоте. Ввиду некоторых ограничений пилота которые я не могу преодалеть, для корректной остановки необходимо перед остановкой вызывать: getmetatable(hint).__gc(hint) Кнопка "стоп" в пилоте фактически является преднамеренным крашем lua, точно так же работают end_script() и stop_script(). Проблема заключается в том, что я не знаю, как при таких остановках заставить предварительно вызывать __gc метамод. Для end_script и stop_script мы можем просто переобъявить их, в конец скрипта мы можем поместить getmetatable(hint).__gc(hint), но как быть с кнопкой стоп придумать не могу. Переобъявленные функции поместить в шапку скрипта после local hint = require"lua_system/hint": Код local hint = require"lua_system/hint" do local stop_script_orig = stop_script stop_script = function(...) local params = {...} if not params[1] or (params[1] == current_script()) then getmetatable(hint).__gc(hint) end return stop_script_orig(...) end end
do local end_script_orig = end_script end_script = function(...) getmetatable(hint).__gc(hint) return end_script_orig(...) end end
тут_весь_ваш_скрипт
getmetatable(hint).__gc(hint)
Сообщение отредактировал DarkMaster - 3.2.2025, 1:00
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____ Писать в личку.
|
|
|
|
dron4938 |
3.2.2025, 1:51
|

   
Apprentice
Сообщений: 285
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395

|
А простой пример вызова можно увидеть? Типа такого: Код --lua local hint = require[[hint]]
hint(text, size, pos_x, pos_y, width, height) Или под каждым хинтом надо простыню параметров писать, не понимаю) Ну если скопировать пример с шапки то пилот вылетает
|
|
|
|
dron4938 |
3.2.2025, 2:08
|

   
Apprentice
Сообщений: 285
Регистрация: 20.3.2017 Группа: Пользователи Наличность: 0
Пользователь №: 18.395

|
|
|
|
|
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0
|
|