Помощь - Поиск - Пользователи - Календарь
Полная версия: переменная ' ' is not a valid integer value
UoKit.com Форумы > Кликер > UO Pilot
nykep
у меня один скрипт присваивает переменным значение из другого, делает это примерно раз в секунду и делает клик в в эти переменные, может работать 10 часов без проблем, а может выдавать такую ошибку каждые полчаса. Скрипт из которого берутся значения работает всегда и эти переменные описываются сразу на старте, затем findcolor ищет цвет и только при нахождении присваивает этим переменным новые значения, то есть больше они нигде не задействованы - только в "шапке" и в условии после findcolor и по идее всегда имеют определенное целое значение. Есть третий скрипт с задержкой 1 который управляет остальными и в нем при определенном условии есть команда на остановку первых двух скриптов stop_script allex, но она срабатывает довольно редко - раз в несколько часов и даже реже, то есть те два скрипта останавливаются одновременно и вроде бы второй скрипт не должен пытаться что-то считывать с первого. Прописывал кучу всяких условий перед kleft x#, #y дабы быть уверенным что в момент считывания значений из другого скрипта он находится в рабочем состоянии, написал на всякий случай kleft round(#x), round(#y), ничего не помогает. Может быть это заглюк какой то не знаю. Есть ли какой то способ избежать ошибки при выполнении move #x, #y и kleft #x, #y если переменные имеют не подходящие значения для этих команд?
cirus
Попробуйте вместо stop_script использовать pause_script.
nykep
я уже пробовал прямо перед stop_script allex писать pause_script allex, но вроде ошибка опять была и я убрал, че то я уже запарился и не помню что там у меня выскакивало, ну да ладно попробую еще раз. А нельзя написать какое то условие на проверку типа if #x <> null или что-то такое?
cirus
Цитата
перед stop_script

Вообще не использовать stop_script.
nykep
если не использовать stop_script то после resume_script те скрипты продолжат нажимать все не впопад, я однажды включил монитор а у меня скрипт, который должен быть остановлен когда персонаж зашел в город не остановился и пытается выкидывать мои вещи, просто тыкая куда попало, хорошо что там выскакивает окно с подтверждением на выброс и он не попал по кнопке подтвердить smile.gif
Кстати проверил сейчас при выключенном скрипте 0
Код

move round(#x.0), round(#y.0)

двигает в -1 -1 без каких либо ошибок и меня это вполне устраивает, но видимо дело не в этом. Если без округления то выдает ошибку '#x.0' is not a valid integer value, и теперь я припоминаю что в моей ошибке название переменной то и не упоминается просто кавычки ' ' is not a valid integer value , но указывает на строку move round(#x.0), round(#y.0) вот что странно
Вот еще что - первый скрипт периодически останавливает второй около 3 раз в минуту, может ли быть такое что второй скрипт выполняя команду move round(#x.0), round(#y.0) останавливается прямо на ней и поэтому выдает такую ошибку ?
cirus
Причина, приводящая к ошибке при использовании stop_script, не была выявлена. Гадать смысла нет. Ответ тот же - не использовать stop_script.
Цитата
если не использовать stop_script то после resume_script те скрипты продолжат нажимать все не впопад

restart_script вместо resume_script.
nykep
спасибо, попробую
nykep
возникла проблема - когда первый скрипт ставит на паузу второй в тот момент когда во втором зажата кнопка Е, то отжать ее в первом скрипте с помощью sendex не получается, да что там сендексом, даже пальцем в кнопку не отжимается
DarkMaster
1) Вам действительно нужно 2 скирпта? При использовании считывания/записи данных нужно понимать, что для корректной работы нужна синхронизация потоков. Фактически получившаяся ситуация с залипшей клавишей, как раз частный случай подобной проблемы.
2) Если уже слишком много наворочено и исправлять все в разумное русло через чур ресурсоемко, то могу предложить проверять статус клавиш после остановки скрипта через stop_script и отжимать их через вкладку вызвавшую этот stop_script.
nykep
да у меня 4 очень больших скрипта, 3 из которых работают постоянно, переделать все в один скрипт у меня не хватит ни сил ни ума, и я не уверен что это то, что мне нужно, например раньше у меня было не 4, а 3 скрипта и мне всегда не очень нравилось как они выполняют свою работу, но после разделения одного скрипта на два и небольших корректировок, время прохождения инста сократилось с 3.5 минут до 2.5, и "качество" прохождения значительно выросло, теперь он лучше зачищает и лучше собирает лут и т д. Дело в том что для меня имеет большое значение именно скорость прохождения и качество зачистки, а этого позволяет добиться одновременная проверка цветов findcolor и поиск картинок findimage в разных скриптах. Как бы там ни было я уже решил этот вопрос с помощью всяких костылей smile.gif

еще возник вопрос - можно ли как то завершить приложение по хэндлу, у меня к примеру 2 одинаковых окна и мне надо завершить лишь одно определенное из них.
DarkMaster
Через пид можно.
https://uopilot.uokit.com/wiki/index.php?title=WorkwindowPID
будет что-то вроде:
Код
set #pid WorkwindowPID
exec taskkill /PID #pid
cirus
Цитата
одновременная проверка цветов findcolor и поиск картинок findimage в разных скриптах.

Поиск происходит поочереди, что в одном скрипте, что в нескольких.
Цитата
можно ли как то завершить приложение по хэндлу

sendmessage Пример1
Ещё можно используя луа вызвать EndTask.
nykep
Цитата(cirus @ 24.9.2020, 1:49) *

Поиск происходит поочереди, что в одном скрипте, что в нескольких.

об этом я уже слышал, просто мне нужно чтобы пока один скрипт нажимает куда то мышкой и клавишами со всеми нужным задержками, другой в это время проверял цвета и картинки, всё это делается на ходу и задержка даже в 100 миллисекунд когда он не производит поиск, приводит к тому что он пробегает мимо лута или какого-нибудь ящика, там всё происходит быстро.
спасибо за ответ
DarkMaster
Цитата
об этом я уже слышал, просто мне нужно чтобы пока один скрипт нажимает куда то мышкой и клавишами со всеми нужным задержками, другой в это время проверял цвета и картинки, всё это делается на ходу и задержка даже в 100 миллисекунд когда он не производит поиск, приводит к тому что он пробегает мимо лута или какого-нибудь ящика, там всё происходит быстро.

у финдов очень широкие возможности по оптимизации поиска. Я бы рекомендовал уменьшить до минимально возможных размеров изображения, закрасить все несущественные/дающие погрешность пиксели в цвет левого верхнего пикселя(считается фоновым). Так же возможно сделать что-то вроде шахматного порядка внутри изображения получая приличную площадь, но проверяя каждый второй-третий пиксель(точно так же закрашивая). Подобные действия могут увеличить скорость обработки в десятки раз.
Fors1k
Цитата(nykep @ 23.9.2020, 21:55) *
завершить приложение по хэндлу

Код
// Ваш код
--lua
require"luaposh";PScode('void',{[[#}
#
ps|where mainWindowHandle -eq 14483740|kill
#
]]})
--endlua
// Ваш код
end_script

Завершит приложение по хэндлу окна 14483740.
DarkMaster
Цитата
EndTask

Это где и чего?

// Вариант Cirus мне кажется наиболее разумным. Ничего лишнего подключать не требует, быстрый, паразитных окон не вылазит.
cirus
Цитата
EndTask
Это где и чего?

winapi.
Код
--lua
local ffi = require("ffi")
ffi.cdef[[ bool EndTask(int hWnd, bool fShutDown, bool fForce); ]]

ffi.C.EndTask(workwindow(), false, true)   -- закрыть рабочее окно
Fors1k
Цитата(DarkMaster @ 24.9.2020, 13:28) *

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

sendmessage?
Каких окон?
DarkMaster
Цитата
winapi.

мля) я думал очередные полускрытые фичи luajit. Типа меток. Luajit из стейбл ветки типа 5.1, а метки пашут.
Цитата
sendmessage?

Ну или postmessage в зависимости от требований.
Цитата
Каких окон?

вызов taskkill в моем варианте скорее всего вызовет появление консольки. можно убрать через vbs, но зачем этот огород когда есть готовая функция?
Fors1k
Цитата(DarkMaster @ 24.9.2020, 15:34) *

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

А, это да. Но все равно taskkill по хэндлу не закроет.
Цитата(DarkMaster @ 24.9.2020, 15:34) *

Ну или postmessage в зависимости от требований.
есть готовая функция

Эта готовая функция не подойдет, так как "An application can prompt the user for confirmation"(с)MSDN.
Вот EndTask - да, сработает как надо.
DarkMaster
Цитата
А, это да. Но все равно taskkill по хэндлу не закроет.

Зато по пиду закроет а дернуть пид по хендлу не проблема - одна строчка.
Цитата
"An application can prompt the user for confirmation"

САN - может спросить. а может и не спросить. Зависит от приложения. Через таск килл без ключа /F тоже может и не хлопнуть. Это запросы типа "вы собираетесь закрыть блокнотик, хотите сохранить изменения?".
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.