Перейти к содержанию

[RisingForce] Автоматизация чистки дебафов


Рекомендуемые сообщения

Добрый день. 

 

Пытаюсь написать 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

 

Ссылка на комментарий
Поделиться на другие сайты

5 часов назад, Xipho сказал:

Используй таймер.

Поменял значение:

while Debuff > 0 do НА while Debuff > -1

Скрипт работает как нужно, но при этом Cheat Engine напрочь зависает.

 

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

Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, DIMITRIS сказал:

Посмотрел в инете статьи, не совсем понимаю как это реализовать

Посмотри статьи и темы на форуме у нас. Несколько раз рассматривался этот вопрос.

 

2 минуты назад, DIMITRIS сказал:

Скрипт работает как нужно, но при этом Cheat Engine напрочь зависает.

Потому что ты запускаешь цикл в основном потоке. Либо создавай поток, либо используй таймер.

Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, Xipho сказал:

Потому что ты запускаешь цикл в основном потоке. Либо создавай поток, либо используй таймер.

Спасибо!

 

4 часа назад, Xipho сказал:

Посмотри статьи и темы на форуме у нас. Несколько раз рассматривался этот вопрос.

Благодаря найденному примеру скрипта с таймером от Garik66 у меня получилось сделать то что планировал. Все работает как нужно, НО единственное, что смущает - это зависание CE до того момента, пока дебаф не снимется. Пользоваться скриптом можно в принципе и так, но если реально убрать зависание CE, то подскажите как это сделать.

 

Мой обновленный скрипт с добавленным таймером:

Создавался он практически методом тыка, переборов подходящих команд и перезагрузок CE из-за зависания. Уверен в нём куча элементарных ошибок, но он как то работает :D

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

 

Изменено пользователем DIMITRIS
Ссылка на комментарий
Поделиться на другие сайты

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

 

 

Ссылка на комментарий
Поделиться на другие сайты

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 - отвисает :( 

Изменено пользователем DIMITRIS
Ссылка на комментарий
Поделиться на другие сайты

1 минуту назад, DIMITRIS сказал:

но все равно CE при выполнении висит

Ты избавился от цикла на срабатывании таймера? Запиши краткое видео, как ты все это делаешь, так будет проще понять, что именно ты делаешь не так.

Ссылка на комментарий
Поделиться на другие сайты

12 минут назад, Xipho сказал:

Ты избавился от цикла на срабатывании таймера? Запиши краткое видео, как ты все это делаешь, так будет проще понять, что именно ты делаешь не так.

Нет, пока не знаю как это сделать.

Ссылка на комментарий
Поделиться на другие сайты

  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

И время ожидания маловато тоже как по мне. 

Изменено пользователем youneuoy
Ссылка на комментарий
Поделиться на другие сайты

22 минуты назад, DIMITRIS сказал:

Нет, пока не знаю как это сделать.

Не знаешь, как сделать что? Записать видео, или использовать предложенный мной код?

 

15 минут назад, youneuoy сказал:

Т.е. наверное это должно выглядеть как-то так:

Возможно. Как я уже упоминал, я писал этот код на коленке, и в Луа я не силён.

Ссылка на комментарий
Поделиться на другие сайты

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 сказал:

Нет, пока не знаю как это сделать.

Не знаешь, как сделать что? Записать видео, или использовать предложенный мной код?

 

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

 

Изменено пользователем DIMITRIS
Ссылка на комментарий
Поделиться на другие сайты

4 часа назад, DIMITRIS сказал:

Нет, пока не знаю как это сделать.

 

4 часа назад, DIMITRIS сказал:

Я затрудняюсь ответить, почему именно readBytes.

Не знаю как 

Ты сам нашел адрес дебаффа?
в каком типе значение?

 

4 часа назад, DIMITRIS сказал:

При добавлении значения ('["RisingForce.bin"+02F8CFBC]+39C') в Cheat Table:   

Скинь скрин. как добавляешь адрес в таблицу.

Ссылка на комментарий
Поделиться на другие сайты

25 минут назад, Garik66 сказал:

Ты сам нашел адрес дебаффа?
в каком типе значение?

Да нашел сам. Искал методом отсева. По типу Byte. Накладывал/снимал дебаф и искал Increase/Decrease. Так нашел нужное значение, которое указывает на кол-во дебафов на персонаже. Если дебафов нет, то значение 0. Как только вешается дебаф, это значение меняется и соответствует кол-ву дебафов. 1, 2, 3  и т.д.

 

35 минут назад, Garik66 сказал:

Скинь скрин. как добавляешь адрес в таблицу.

Я его не добавляю в принципе, я один раз его добавил, потом нашел указатель и удалил. т.к. этот адрес в таблице не нужен.

Но я снова добавил:

Спойлер

Как выглядит в Cheat Table:

snimok.png

 

 

Спойлер

Disassemble this memory region:

snimok.png

 

Спойлер

Browse this memory region:

snimok.png

 

Ссылка на комментарий
Поделиться на другие сайты

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
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, Garik66 сказал:

Попробуй скрипт:

  Показать контент

Большое спасибо, все работает, и не зависает напрочь, когда скрипт активирует нажатие F. Теперь же при активации скрипта - CE немного фризится. Так же я только что заметил, что если выйти из игры, то CE начинает бесконечно выбивать ошибку. 

Спойлер

snimok.png

 

Ссылка на комментарий
Поделиться на другие сайты

1 час назад, DIMITRIS сказал:

то CE начинает бесконечно выбивать ошибку. 

Я поставил удаление таймера в секцию дизейбл  - отключи скрипт, потом отключай игру

 

Ссылка на комментарий
Поделиться на другие сайты

Не отправляйте doKeyPress(VK_F) лишнее количество раз, т.е. пока по адресу не поменяется значение на новое.

Проверяйте отключился ли системный процесс.

Проверяйте существование адреса (если нужно).

Проверяйте растет ли объем занятой оперативной памяти или насколько быстро. Если да, то делать чистку через сборщик мусора.

 

Возможно, подойдет и SikuliX для автоматизации действий без обращения к памяти процесса. Распознаются изображения на экране и по ним совещаются действия и в том числе отправка нажатий.

 

 

Ссылка на комментарий
Поделиться на другие сайты

6 часов назад, Garik66 сказал:

Я поставил удаление таймера в секцию дизейбл  - отключи скрипт, потом отключай игру

Понял, еще раз большое спасибо за помощь!

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...

Важная информация

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