Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  1 2 3 >  
Ответить в эту темуОткрыть новую тему
> Вопрос по массивам и окнам
sel
сообщение 13.11.2018, 15:08
Сообщение #1


**

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. определить какое окно вылетело с ошибкой трудно, может вылететь абсолютно любое, всё что есть это хендл окна.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 13.11.2018, 15:20
Сообщение #2


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Цитата
set %handle FindWindow ("Игра")

Эту строку помести в while если тормозов не будет, то так правильнее.

Можешь запоминать массив в другой массив, сравнивая старый и новый поймёшь какое окно вылетело.

Цитата
всё что есть это хендл окна

Так этого и достаточно. Просто копируй %handle в %handleold и сравнивай.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 13.11.2018, 17:46
Сообщение #3


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



После анализа массива ненужный элемент можно удалить оператором delete_array.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sel
сообщение 13.11.2018, 18:05
Сообщение #4


**

Neophyte
Сообщений: 32
Регистрация: 4.7.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 18.986
Возраст: 27



Есть где то примеры анализа массивов?
Массив примерно выглядит так:

1118712 "Игра" 1 18:04
529038 "Игра" 1 18:00
791706 "Игра" 0 17:44
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 13.11.2018, 18:27
Сообщение #5


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Я не совсем понял что именно надо. Смысл примерно таков.
set %handle FindWindow ("Игра")
set #sizearr size(%handle) // запоминаешь количество окон
for #i 1 #sizearr
set %handleold[#i] %handle[#i] // делаешь копию массива
end_for
set #f 1
while (#f = 1)
for #i 1 #sizearr
if %handleold[#i] <> %handle[#i] // значит это окно вылетело
...
end_if
end_for

for #i 1 size(%handle)
...
скрипт
...
end_for
set %handle FindWindow ("Игра")
end_while
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 13.11.2018, 18:55
Сообщение #6


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Можно отсортировать оба массива, тогда наверное ещё проще будет.

По размерам массивов старого и нового можно понять сколько окон вылетело.

Если новое окно заводится автоматом тогда ещё проще, просто сравнивая хендлы, как в моем примере.

Цитата
скрипт заводит обратно вылетевшее окно с новым хендлом

Вот этот момент интересен. Разве этот момент ты не можешь контролировать?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sel
сообщение 13.11.2018, 19:39
Сообщение #7


**

Neophyte
Сообщений: 32
Регистрация: 4.7.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 18.986
Возраст: 27



Цитата(sutra @ 13.11.2018, 20:55) *

Можно отсортировать оба массива, тогда наверное ещё проще будет.

По размерам массивов старого и нового можно понять сколько окон вылетело.

Если новое окно заводится автоматом тогда ещё проще, просто сравнивая хендлы, как в моем примере.
Вот этот момент интересен. Разве этот момент ты не можешь контролировать?



я могу задать окну игры хендл вручную?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 13.11.2018, 20:17
Сообщение #8


***********

Модератор UOPilot
Сообщений: 9.462
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27674
Пользователь №: 11.279



Цитата

я могу задать окну игры хендл вручную?

Его выдает винда при создании окна и он никак не может быть задан. Это внутренний (винды) ид.

Вам правильно предложили периодически делать findwindow на появление различий в списке хендлов. Соответственно, если появились новые - добавлять, исчезли старые - удалять. Как именно "красиво подсунуть" новое окно в работающий скрипт сказать невозможно не понимая и не видя всего скрипта. Если это просто перебор всех окон с одинаковыми действиями для всех окон, то проблемы нет, если дейсвтия разные либо нужно отслеживать этап этих действий(стартовая позиция после перезапуска окна может отличатся от той, что ожидает скрипт, например, стартовые менюшки), то нужно продумывать логику.


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 13.11.2018, 23:00
Сообщение #9


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Цитата
скрипт заводит обратно вылетевшее окно с новым хендлом

Опиши подробнее. Скрипт заводит или игра сама создаёт новое окно. Если как ты пишешь скрипт, так тут вообще нет проблем. Значение переменной цикла #i у тебя есть на каком этапе произошла ошибка. Скрипт создает новое окно. Получаешь его хендл и подправь свой массив set %handle[#i 1] handleworkwindow , где handleworkwindow хендл вновь созданного окна игры. Если править нельзя и нужен новый элемент массива, тогда удали элемент с индексом #i. Смотри справку Пилота и потренируйся удалять.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 13.11.2018, 23:11
Сообщение #10


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Цитата
я могу задать окну игры хендл вручную?

Ты можешь присвоить окну свой порядковый номер set %handle[#i 5] num , где num порядковый номер который тебе нужен. Хендл нужен для активации рабочего окна, а внутри цикла ты можешь ативировать то окно, которое нужно, сравнивая переменную цикла с порядковым номером. В общем нужны подробности, чем подробней, тем проще решить проблему, а решить можно 100%.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 14.11.2018, 2:23
Сообщение #11


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26689
Пользователь №: 16.971
Возраст: 29



Цитата
while (#f = 1)

Скобки не нужны.
Цитата
for #i 1 #sizearr
set %handleold[#i] %handle[#i] // делаешь копию массива
end_for

Тоже самое:
Код
set %handleold %handle   // скопировать %handle в %handleold

Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sel
сообщение 15.12.2018, 1:34
Сообщение #12


**

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]]
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
cirus
сообщение 15.12.2018, 2:40
Сообщение #13


**********

Elder
Сообщений: 3.480
Регистрация: 18.8.2014
Группа: Пользователи
Наличность: 26689
Пользователь №: 16.971
Возраст: 29



Цитата
#r

Откуда это?

Запустить любое количество окон, в имени которых есть "_Игра". Запустить скрипт, закрыть любое окно, скрипт напишет какое окно было закрыто.
Код
set %handle findwindow ("_Игра")  // ищем окна
set %names %handle                // копия массива
log clear
log mode compact

set #namesize size(%names)  // количество окон
while 1 = 1
    for #i 1 #namesize
        set #result indexOf ( %handle noabs (%names[#i 2]))   // ищем окна
        if  #result = -1  // если не найдено, значит окно вылетело
            log Вылетел %names[#i 2]
            break 2    // выход из цикла while
        end_if
    end_for
    wait 300
    set %handle findwindow ("_Игра")
end_while
end_script
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 15.12.2018, 4:26
Сообщение #14


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Видимо проблема определения вылетевших окон не решена в течении целого месяца. В чём проблема, я так и не понял. "Уровень конспирации не позволяет оценить уровень опасности."

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

Что-то мне подсказывает, что не всё так просто. И что-то недоговаривается. Возникает ошибка в игре, нужно её решить. Как уже говорили опиши подробнейшим образом. А просто найти или не найти любое окно, ну это уже просто не интересно выглядит.

Интуиция подсказывает мне, что проблема не в окнах, а в порядке их обработки в цикле. Значит и вопрос,как правильно организовать цикл, который бы учитывал исчезнувшие окна. Тогда возникает другой вопрос... работать с оставшимися окнами? Заводить новые и адаптировать цикл? Опиши ПОДРОБНЕЕ.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 15.12.2018, 4:59
Сообщение #15


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Количество окон игры должно быть постоянным? или может произвольно варьироваться? Порядок обработки окон произвольный? или должен быть соблюдён приоритет (порядок) ... сначала Персонаж1, далее Персонаж2 , или без разницы. Без ответов на эти вопросы - адекватной помощи лично я дать не смогу.

Цитата
ходит в цикле for

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

Не подумал, сам ересь написАл, как можно что-то глобально делать в цикле for? Это от и до. Когда выполняется этот цикл что? происходит сбой? Или цикл для муляжа, типа от 1 до 10 000, типа бесконечный? Нужны ПОДРОБНОСТИ.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 15.12.2018, 5:14
Сообщение #16


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Про ошибку конкретного примера кода уже более опытные коллеги указали. Могу только понятно перевести. "Нет значения целого числа". log пытался вывести не существующий элемент массива.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
DarkMaster
сообщение 15.12.2018, 5:47
Сообщение #17


***********

Модератор UOPilot
Сообщений: 9.462
Регистрация: 2.12.2008
Группа: Супермодераторы
Наличность: 27674
Пользователь №: 11.279



Цитата
set - (7): Ошибка! Проверьте правильность скрипта! EConvertError '' is not a valid integer value
set logging %names [%result [1 #i]]

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


--------------------
Скрипты UOPilot под заказ.
Консультации по UOpilot 15$/час.
Услуги Lua разработчика (не пилот, проекты, постоянка)
Disсоrd:
Kov____
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sel
сообщение 17.12.2018, 16:16
Сообщение #18


**

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 строчек кода давно пора переделать, ну а во вторых там есть конфиденциальная информация в виде ников персонажей логинов и паролей от них.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sutra
сообщение 17.12.2018, 18:22
Сообщение #19


*******

Adept
Сообщений: 923
Регистрация: 10.8.2018
Группа: Пользователи
Наличность: 0
Пользователь №: 19.007



Ну на 100% не вникал, но логика правильная, если в наименовании окна присутствует строка Персонаж... (как я понял вроде должна присутствовать). Если это чисто логический кусок, то всё нормально. В данном примере одноразово всё делается. Наверное надо встраивать это в бесконечный цикл. Ничего больше давать не надо, как раз этого примера выше крыши. Кроме, повторюсь, не понятно, это тебе каждый раз руками надо запускать скрипт, если это нормально, тогда вопрос исчерпан.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
sel
сообщение 23.12.2018, 4:28
Сообщение #20


**

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
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

3 страниц V  1 2 3 >
Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 16.4.2024, 19:45
Designed by Nickostyle