DIMITRIS Опубликовано 10 февраля, 2021 Поделиться Опубликовано 10 февраля, 2021 Добрый день. Пытаюсь написать Lua скрипт, который будет автоматически прожимать кнопку чистки при наличии дебафа на персонаже. Допустим кнопку F. То есть как только значение изменится с 0 до 1 байта, скрипт должен включаться и кликать F и соответственно отключатся, как только значение вернулось на 0. Благодаря туторам получилось худо-бедно собрать вот такой 'код', но проблема в том, он работает единоразово после выполнения скрипта. Т.е. чистит персонажа и останавливается, а хотелось, что-бы он всегда срабатывал , как только персонаж получает дебаф. Вообщем прошу помощи у знающих. Буду очень благодарен. local DebuffAdress = '["RisingForce.bin"+02F8CFBC]+39C' local Debuff = readBytes(debuffAdress) while Debuff > 0 do debuff = readBytes(debuffAdress) if debuff < 1 or doKeyPress (VK_F)then end end Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 11 февраля, 2021 Поделиться Опубликовано 11 февраля, 2021 Используй таймер. Ссылка на комментарий Поделиться на другие сайты Поделиться
DIMITRIS Опубликовано 11 февраля, 2021 Автор Поделиться Опубликовано 11 февраля, 2021 5 часов назад, Xipho сказал: Используй таймер. Поменял значение: while Debuff > 0 do НА while Debuff > -1 Скрипт работает как нужно, но при этом Cheat Engine напрочь зависает. По поводу таймера. Посмотрел в инете статьи, не совсем понимаю как это реализовать. Новичек в этом деле. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 11 февраля, 2021 Поделиться Опубликовано 11 февраля, 2021 2 минуты назад, DIMITRIS сказал: Посмотрел в инете статьи, не совсем понимаю как это реализовать Посмотри статьи и темы на форуме у нас. Несколько раз рассматривался этот вопрос. 2 минуты назад, DIMITRIS сказал: Скрипт работает как нужно, но при этом Cheat Engine напрочь зависает. Потому что ты запускаешь цикл в основном потоке. Либо создавай поток, либо используй таймер. Ссылка на комментарий Поделиться на другие сайты Поделиться
DIMITRIS Опубликовано 11 февраля, 2021 Автор Поделиться Опубликовано 11 февраля, 2021 (изменено) 4 часа назад, Xipho сказал: Потому что ты запускаешь цикл в основном потоке. Либо создавай поток, либо используй таймер. Спасибо! 4 часа назад, Xipho сказал: Посмотри статьи и темы на форуме у нас. Несколько раз рассматривался этот вопрос. Благодаря найденному примеру скрипта с таймером от Garik66 у меня получилось сделать то что планировал. Все работает как нужно, НО единственное, что смущает - это зависание CE до того момента, пока дебаф не снимется. Пользоваться скриптом можно в принципе и так, но если реально убрать зависание CE, то подскажите как это сделать. Мой обновленный скрипт с добавленным таймером: Создавался он практически методом тыка, переборов подходящих команд и перезагрузок CE из-за зависания. Уверен в нём куча элементарных ошибок, но он как то работает local function timer_tick(timer) local debuffAdress = '["RisingForce.bin"+02F8CFBC]+39C' local debuff = readBytes(debuffAdress) while debuff > 0 do debuff = readBytes(debuffAdress) if debuff < 1 or doKeyPress(VK_F) then break end end end local someTimer = createTimer() someTimer.Interval = 1 someTimer.OnTimer = timer_tick Изменено 11 февраля, 2021 пользователем DIMITRIS Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 11 февраля, 2021 Поделиться Опубликовано 11 февраля, 2021 1 час назад, DIMITRIS сказал: Пользоваться скриптом можно в принципе и так, но если реально убрать зависание CE, то подскажите как это сделать Не делай цикл в тике таймера. Делай проверку условия по каждому тику, тогда ничего подвисать не будет. Ну или вынеси цикл в отдельный поток. Что-то типа такого. За правильность не ручаюсь, в Луа не силён, да код писал на коленке. Это вариант с использованием таймера. Вариант с использованием потока поищи сам, если этот вариант не устраивает. Спойлер local function timer_tick(timer) local debuffAdress = '["RisingForce.bin"+02F8CFBC]+39C' local debuff = readBytes(debuffAdress) if debuff > 0 and debuff < 1 then doKeyPress(VK_F) end end local someTimer = createTimer() someTimer.Interval = 10 someTimer.OnTimer = timer_tick Ссылка на комментарий Поделиться на другие сайты Поделиться
DIMITRIS Опубликовано 11 февраля, 2021 Автор Поделиться Опубликовано 11 февраля, 2021 (изменено) 1 час назад, Xipho сказал: local function timer_tick(timer) local debuffAdress = '["RisingForce.bin"+02F8CFBC]+39C' local debuff = readBytes(debuffAdress) if debuff > 0 and debuff < 1 then doKeyPress(VK_F) end end local someTimer = createTimer() someTimer.Interval = 10 someTimer.OnTimer = timer_tick Спасибо за помощь!, но все равно CE при выполнении висит, как только дебаф очистит, т.е. значение станет снова 0 Byte - отвисает Изменено 11 февраля, 2021 пользователем DIMITRIS Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 11 февраля, 2021 Поделиться Опубликовано 11 февраля, 2021 1 минуту назад, DIMITRIS сказал: но все равно CE при выполнении висит Ты избавился от цикла на срабатывании таймера? Запиши краткое видео, как ты все это делаешь, так будет проще понять, что именно ты делаешь не так. Ссылка на комментарий Поделиться на другие сайты Поделиться
DIMITRIS Опубликовано 11 февраля, 2021 Автор Поделиться Опубликовано 11 февраля, 2021 12 минут назад, Xipho сказал: Ты избавился от цикла на срабатывании таймера? Запиши краткое видео, как ты все это делаешь, так будет проще понять, что именно ты делаешь не так. Нет, пока не знаю как это сделать. Ссылка на комментарий Поделиться на другие сайты Поделиться
youneuoy Опубликовано 11 февраля, 2021 Поделиться Опубликовано 11 февраля, 2021 (изменено) local debuff = readBytes(debuffAdress) if debuff > 0 and debuff < 1 then ? А почему такая проверка странная? И ещё, а почему readBytes? Сколько оно байтов читает, если их число не передать? И как оно работает вообще? Может просто читает долго очень? Т.е. наверное это должно выглядеть как-то так: local debuff = readBytes(debuffAdress,1); if (debuff > 0) then doKeyPress(VK_F); end И время ожидания маловато тоже как по мне. Изменено 11 февраля, 2021 пользователем youneuoy Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 11 февраля, 2021 Поделиться Опубликовано 11 февраля, 2021 22 минуты назад, DIMITRIS сказал: Нет, пока не знаю как это сделать. Не знаешь, как сделать что? Записать видео, или использовать предложенный мной код? 15 минут назад, youneuoy сказал: Т.е. наверное это должно выглядеть как-то так: Возможно. Как я уже упоминал, я писал этот код на коленке, и в Луа я не силён. Ссылка на комментарий Поделиться на другие сайты Поделиться
DIMITRIS Опубликовано 11 февраля, 2021 Автор Поделиться Опубликовано 11 февраля, 2021 (изменено) 33 минуты назад, youneuoy сказал: И ещё, а почему readBytes? Сколько оно байтов читает, если их число не передать? И как оно работает вообще? Может просто читает долго очень? Я затрудняюсь ответить, почему именно readBytes. При добавлении значения ('["RisingForce.bin"+02F8CFBC]+39C') в Cheat Table: Byte=0 2 Bytes=1792 4 Bytes=1792 8 Bytes = 2251799813687040 20 минут назад, Xipho сказал: 42 минуты назад, DIMITRIS сказал: Нет, пока не знаю как это сделать. Не знаешь, как сделать что? Записать видео, или использовать предложенный мной код? Не знаю как избавиться от цикла на срабатывании таймера. Видео я запишу, немного позже. Изменено 11 февраля, 2021 пользователем DIMITRIS Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 11 февраля, 2021 Поделиться Опубликовано 11 февраля, 2021 4 часа назад, DIMITRIS сказал: Нет, пока не знаю как это сделать. 4 часа назад, DIMITRIS сказал: Я затрудняюсь ответить, почему именно readBytes. Не знаю как Ты сам нашел адрес дебаффа? в каком типе значение? 4 часа назад, DIMITRIS сказал: При добавлении значения ('["RisingForce.bin"+02F8CFBC]+39C') в Cheat Table: Скинь скрин. как добавляешь адрес в таблицу. Ссылка на комментарий Поделиться на другие сайты Поделиться
DIMITRIS Опубликовано 11 февраля, 2021 Автор Поделиться Опубликовано 11 февраля, 2021 25 минут назад, Garik66 сказал: Ты сам нашел адрес дебаффа? в каком типе значение? Да нашел сам. Искал методом отсева. По типу Byte. Накладывал/снимал дебаф и искал Increase/Decrease. Так нашел нужное значение, которое указывает на кол-во дебафов на персонаже. Если дебафов нет, то значение 0. Как только вешается дебаф, это значение меняется и соответствует кол-ву дебафов. 1, 2, 3 и т.д. 35 минут назад, Garik66 сказал: Скинь скрин. как добавляешь адрес в таблицу. Я его не добавляю в принципе, я один раз его добавил, потом нашел указатель и удалил. т.к. этот адрес в таблице не нужен. Но я снова добавил: Спойлер Как выглядит в Cheat Table: Спойлер Disassemble this memory region: Спойлер Browse this memory region: Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 февраля, 2021 Поделиться Опубликовано 12 февраля, 2021 13 часов назад, DIMITRIS сказал: Да нашел сам. Попробуй скрипт: Спойлер [ENABLE] {$LUA} timer = createTimer(true) timer:setInterval(100) timer.OnTimer = function() debuff = readBytes('["RisingForce.bin"+02F8CFBC]+39C') if (debuff > 0) then doKeyPress(VK_F); end end {$ASM} [DISABLE] {$LUA} timer.destroy() 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
DIMITRIS Опубликовано 12 февраля, 2021 Автор Поделиться Опубликовано 12 февраля, 2021 1 час назад, Garik66 сказал: Попробуй скрипт: Показать контент Большое спасибо, все работает, и не зависает напрочь, когда скрипт активирует нажатие F. Теперь же при активации скрипта - CE немного фризится. Так же я только что заметил, что если выйти из игры, то CE начинает бесконечно выбивать ошибку. Спойлер Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 12 февраля, 2021 Поделиться Опубликовано 12 февраля, 2021 1 час назад, DIMITRIS сказал: то CE начинает бесконечно выбивать ошибку. Я поставил удаление таймера в секцию дизейбл - отключи скрипт, потом отключай игру Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 12 февраля, 2021 Поделиться Опубликовано 12 февраля, 2021 Не отправляйте doKeyPress(VK_F) лишнее количество раз, т.е. пока по адресу не поменяется значение на новое. Проверяйте отключился ли системный процесс. Проверяйте существование адреса (если нужно). Проверяйте растет ли объем занятой оперативной памяти или насколько быстро. Если да, то делать чистку через сборщик мусора. Возможно, подойдет и SikuliX для автоматизации действий без обращения к памяти процесса. Распознаются изображения на экране и по ним совещаются действия и в том числе отправка нажатий. Ссылка на комментарий Поделиться на другие сайты Поделиться
DIMITRIS Опубликовано 12 февраля, 2021 Автор Поделиться Опубликовано 12 февраля, 2021 6 часов назад, Garik66 сказал: Я поставил удаление таймера в секцию дизейбл - отключи скрипт, потом отключай игру Понял, еще раз большое спасибо за помощь! Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения