|
Вопрос по массивам и окнам |
|
|
sel |
13.11.2018, 15:08
|
Neophyte
Сообщений: 32
Регистрация: 4.7.2018 Группа: Пользователи Наличность: 0
Пользователь №: 18.986
Возраст: 27
|
Вопрос в следующем, мне необходимо отследить количество запущенных окон игры, скрипт у меня ходит между окнами и выполняет разные задачи, ходит в цикле for.
Выглядит примерно так:
set %handle FindWindow ("Игра") set #f 1 while (#f = 1) for #i 1 size(%handle) ... скрипт ... end_for end_while
Иногда случается так, что окно с игрой крашится с ошибкой, и скрипт заводит обратно вылетевшее окно с новым хендлом, в этом основная загвоздка, если бы не это обстоятельство то я бы мог записывать в массив %handle [#i 3] допустим цифру 0 если окно вылетело и проводить в цикле ещё один цикл for который бы складывал значения в столбце %handle [#i 3] и если оно будет равняться 0 то скрипт начнёт заводить все окна, но из за краша окон добавляется новая строчка в массиве с новым хендлом.
Задача - определить, что вылетели все окна игры, есть идеи как это можно сделать? Заранее спасибо за ответ.
p.s. определить какое окно вылетело с ошибкой трудно, может вылететь абсолютно любое, всё что есть это хендл окна.
|
|
|
|
sutra |
13.11.2018, 15:20
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Цитата set %handle FindWindow ("Игра") Эту строку помести в while если тормозов не будет, то так правильнее. Можешь запоминать массив в другой массив, сравнивая старый и новый поймёшь какое окно вылетело. Цитата всё что есть это хендл окна Так этого и достаточно. Просто копируй %handle в %handleold и сравнивай.
|
|
|
|
DarkMaster |
13.11.2018, 20:17
|
Модератор UOPilot
Сообщений: 9.467
Регистрация: 2.12.2008 Группа: Супермодераторы Наличность: 27723
Пользователь №: 11.279
|
Цитата я могу задать окну игры хендл вручную?
Его выдает винда при создании окна и он никак не может быть задан. Это внутренний (винды) ид. Вам правильно предложили периодически делать findwindow на появление различий в списке хендлов. Соответственно, если появились новые - добавлять, исчезли старые - удалять. Как именно "красиво подсунуть" новое окно в работающий скрипт сказать невозможно не понимая и не видя всего скрипта. Если это просто перебор всех окон с одинаковыми действиями для всех окон, то проблемы нет, если дейсвтия разные либо нужно отслеживать этап этих действий(стартовая позиция после перезапуска окна может отличатся от той, что ожидает скрипт, например, стартовые менюшки), то нужно продумывать логику.
--------------------
Скрипты UOPilot под заказ. Консультации по UOpilot 15$/час. Услуги Lua разработчика (не пилот, проекты, постоянка) Disсоrd: Kov____
|
|
|
|
sel |
15.12.2018, 1:34
|
Neophyte
Сообщений: 32
Регистрация: 4.7.2018 Группа: Пользователи Наличность: 0
Пользователь №: 18.986
Возраст: 27
|
Придумал более интересный способ определения вылетевших окон, но пока не могу понять как реализовать это. Задумка следующая: 1.Персонажи заводятся в игру, окно переименовывается в: "Персонаж1_Игра", "Персонаж2_Игра" и т.д. 2. В переменную с именами записываются имена всех персонажей: init_arr %names (1 1) Персонаж1 Персонаж2. 3. Скрипт находит все окна игры за счёт префикса _Игра: set %handle findwindow ("_Игра") 4. И проверяет массив %handle на наличие в нём имён всех персонажей. Для начала я хочу что бы он вывел хотя бы имена всех персонажей которые сейчас в сети, как это сделать? Код init_arr %names (1 1) Персонаж1 Персонаж2 Персонаж3 set %handle findwindow ("_Игра") set #namesize size(%names) for #i 1 #namesize set %result indexOf ( %handle noabs (%names [#r 2]) ) log %names [%result [1 #i]] end_for end_script С текущим кодом он показывает пару ников которые нашёл, и выдаёт ошибку: set - (7): Ошибка! Проверьте правильность скрипта! EConvertError '' is not a valid integer value set logging %names [%result [1 #i]]
|
|
|
|
sutra |
15.12.2018, 4:26
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Видимо проблема определения вылетевших окон не решена в течении целого месяца. В чём проблема, я так и не понял. "Уровень конспирации не позволяет оценить уровень опасности."
Есть окно, у него есть имя - его хендл, нет окна - нет имени. Есть функция, которая создаёт (ищет) список этих имён. Какие могут ещё возникнуть вопросы? Если технические, опиши какие. Логические? Так тоже расшифруйся чуток, измени переменные и дай реальный код, что не так? Если проблема сидит глубже, чем просто поиск уже не существующего окна, так опиши суть вопроса, а иначе будем гадать на кофейной гуще.
Что-то мне подсказывает, что не всё так просто. И что-то недоговаривается. Возникает ошибка в игре, нужно её решить. Как уже говорили опиши подробнейшим образом. А просто найти или не найти любое окно, ну это уже просто не интересно выглядит.
Интуиция подсказывает мне, что проблема не в окнах, а в порядке их обработки в цикле. Значит и вопрос,как правильно организовать цикл, который бы учитывал исчезнувшие окна. Тогда возникает другой вопрос... работать с оставшимися окнами? Заводить новые и адаптировать цикл? Опиши ПОДРОБНЕЕ.
|
|
|
|
sutra |
15.12.2018, 4:59
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Количество окон игры должно быть постоянным? или может произвольно варьироваться? Порядок обработки окон произвольный? или должен быть соблюдён приоритет (порядок) ... сначала Персонаж1, далее Персонаж2 , или без разницы. Без ответов на эти вопросы - адекватной помощи лично я дать не смогу. Цитата ходит в цикле for Если окна вылетают, то цикл for в принципе не годится. Должен быть бесконечный глобальный цикл, выход из которого впрочем конечно может быть, например количеством итераций (выполнений) цикла, временем работы цикла и т.д. Организация этого бесконечного цикла должна быть осуществлена при помощи переменных. И первой такой переменной должно быть значение количества обрабатываемых окон. Ну и далее по списку, максимальное значение, минимальное, действия при таком раскладе, действия при ином. По теории всё, нужна практика. Не подумал, сам ересь написАл, как можно что-то глобально делать в цикле for? Это от и до. Когда выполняется этот цикл что? происходит сбой? Или цикл для муляжа, типа от 1 до 10 000, типа бесконечный? Нужны ПОДРОБНОСТИ.
|
|
|
|
sel |
17.12.2018, 16:16
|
Neophyte
Сообщений: 32
Регистрация: 4.7.2018 Группа: Пользователи Наличность: 0
Пользователь №: 18.986
Возраст: 27
|
В общем написал преемлемый для меня вариант(есть список персонажей, скрипт ищет каждый ник в %handle, если не находит какого то ника, передаёт на подпрограмму, которая потом перенаправит в скрипт завода персонажа в игру): Код log clear log mode compact set %handle findwindow ("Игра") // ищем окна init_arr %list (1 1) Персонаж1 Персонаж2 Персонаж3 Персонаж4 // сюда через пробел записываем ники всех персонажей set #listsize size(%list) for #i 1 #listsize set #result indexOf (%handle noabs (%list [#i]) ) if #result = -1 log Вылетел: %list [#i 1] //если персонаж из списка не найден, скрипт начнет заводить его в игру gosub %list [#i 1] end_if end_for wait 100 set %handle findwindow ("Игра") end_script
:Персонаж1 log заводим Персонаж1 return
:Персонаж2 log заводим Персонаж2 return
:Персонаж3 log заводим Персонаж3 return
:Персонаж4 log заводим Персонаж4 return
К вопросам выше, список персонажей статический, т.е. его число неизменно(скажем их всего 20), порядок обработки не важен, скрипт представляет из себя банального бота, который ходит по всем окнам и берёт нужную инфу из окон, допустим если персонаж умер, то он поднимает его и ведёт обратно на спот с мобами. Я не хочу раскрывать все карты, во первых там говнокод)) в идеале 1500 строчек кода давно пора переделать, ну а во вторых там есть конфиденциальная информация в виде ников персонажей логинов и паролей от них.
|
|
|
|
sutra |
17.12.2018, 18:22
|
Adept
Сообщений: 923
Регистрация: 10.8.2018 Группа: Пользователи Наличность: 0
Пользователь №: 19.007
|
Ну на 100% не вникал, но логика правильная, если в наименовании окна присутствует строка Персонаж... (как я понял вроде должна присутствовать). Если это чисто логический кусок, то всё нормально. В данном примере одноразово всё делается. Наверное надо встраивать это в бесконечный цикл. Ничего больше давать не надо, как раз этого примера выше крыши. Кроме, повторюсь, не понятно, это тебе каждый раз руками надо запускать скрипт, если это нормально, тогда вопрос исчерпан.
|
|
|
|
sel |
23.12.2018, 4:28
|
Neophyte
Сообщений: 32
Регистрация: 4.7.2018 Группа: Пользователи Наличность: 0
Пользователь №: 18.986
Возраст: 27
|
Итак, у меня новый затуп, пытаюсь красиво сохранять массив, но ничего не выходит, есть какие то способы автоматически скриптом генерировать красивый файл? Ближе к делу, вот мой скрипт: Код set %handle FindWindow ("_Игра") // найти все окна с именем set linedelay 40 init_arr %list (1 1) персонаж1 персонаж2 перс3 перс4 set %cash [1 1] Nickname: set %cash [1 2] now money: set %cash [1 3] past money: set %cash [1 4] profit: set %cash [1 6] Summary: set #handlesize size(%handle) set #listsize size(%list) for #i 1 #handlesize set #resultat set workwindow %handle [#i 1] // сделать окно рабочим ShowWindow %handle [#i 1] TOP set $namewimdow GetWindowtext (workwindow) set #sizename size ($namewimdow) // удалялка префикса _ИГРА из названия окна set #sizename #sizename - 2 set $namewimdow Delete($namewimdow #sizename 3) // не обращайте внимания что числа немного не сходятся set #name indexOf (%list noabs ($namewimdow) ) start_script 16 wait // на этой вкладке у меня скрипт из вики "Поиск ближайшего числа в массиве" load_array %oldcash ДЕНЬГИ.txt set #q #name + 1 set %cash [#q 1] %list [#name 1] // 1 столбик - имя персонажа set %cash [#q 2] #resultat // записываем текущие деньги персонажа set %cash [#q 4] %oldcash [#q 2] // Загружаем из файла старые деньги set %cash [#q 6] %cash [#q 2] - %oldcash [#q 2] // показываем величину нафармленного set #allmoney #allmoney + #resultat // собираем здесь нафармленную сумму всех персонажей end_for set %cash [2 8] #allmoney save_array %cash ДЕНЬГИ.txt end_script Переменную #resultat я получаю из скрипта на 16 вкладке, в результате у меня получается вот такой вот файл: Nickname: now money: past money: profit: Summary: Персонаж1 3477782 3477782 0 10320006 Персонаж2 4349346 4348499 847 Перс3 2174866 2174866 0 Перс4 318012 318012 0 Я так понимаю, что вся проблема в количестве символов в нике, есть способ сделать ровное форматирование, что бы каждый столбик шёл в ряд? Получившийся файл так же прилагаю.
Прикрепленные файлы
деньги.txt ( 191 байт )
Кол-во скачиваний: 95
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|