Цикл багается

Antala

Новичок
Автор темы
8
0
Версия MoonLoader
.026-beta
Всем привет,

Пишу небольшого бота, задача - нажимать попеременно кнопки согласно надписи на экране. Надпись выводится в Textdraw и я её читаю:

Вытягивание текста:
 function sampev.onShowTextDraw(id, data)
   if fisher == 1 then
     if data.text == "N" then
       cmd_fish("N")
     elseif data.text == "Y" then
       cmd_fish("Y")
     elseif data.text == "SUCCESS" then
       cmd_fish("S")
     end
   end

end

Как только текст определен, я запускаю функцию с аргументом, который содержит кнопку, в котором есть такой цикл:

Lua:
    while arg ~= nil and fisher == 1 do
        wait(400)
        if arg == "N" then
          setVirtualKeyDown(VK_N, true)
          setVirtualKeyDown(VK_N, false)
        elseif arg == "Y" then
          setVirtualKeyDown(VK_Y, true)
          setVirtualKeyDown(VK_Y, false)
        elseif arg == "S" then
          setVirtualKeyDown(VK_H, true)
          setVirtualKeyDown(VK_H, false)
          wait(4000)
        end
      end

Как я думал это будет работать: каждые 0.4 секунды он будет жать кнопку, которая соответствует заданному аргументу. Однако иногда так случается, что цикл багается и он начинает очень быстро (быстрее, чем раз в 0.4 секунды), жать клавишу N.

Есть подозрения, что я как-то не очень правильно делаю нажатие клавиши, но другого способа не нашёл.

В чем может быть проблема? Заранее спасибо за помощь!

Upd.: Пытался ставить задержку между setVirtualKeyDown - не помогло.
 

Sidney31

Известный
1,132
385
Зачем создавать какую-то переменную, отдельный цикл, если можно запихнуть всё в onShowTextdraw?


Lua:
function sampev.onShowTextDraw(id, data)
    lua_thread.create(function ()
        if data.text == "N" then --если N, то
            setVirtualKeyDown(0x4E, true) --нажимает n
            wait(300)
            setVirtualKeyDown(0x4E, true) --отпускает n
        elseif data.text == "Y" then --аналогично
            setVirtualKeyDown(0x59, true)
            wait(300)
            setVirtualKeyDown(0x59, true)
        end
    end)
end
 

Antala

Новичок
Автор темы
8
0
Ты для функции cmd_fish создаешь поток?
Да.

В начале кода:
Lua:
  thread = lua_thread.create_suspended(thread_function)

И потом:
Lua:
  function cmd_fish(arg)
    thread:run("fish", arg)
  end

Зачем создавать какую-то переменную, отдельный цикл, если можно запихнуть всё в onShowTextdraw?


Lua:
function sampev.onShowTextDraw(id, data)
    lua_thread.create(function ()
        if data.text == "N" then --если N, то
            setVirtualKeyDown(0x4E, true) --нажимает n
            wait(300)
            setVirtualKeyDown(0x4E, true) --отпускает n
        elseif data.text == "Y" then --аналогично
            setVirtualKeyDown(0x59, true)
            wait(300)
            setVirtualKeyDown(0x59, true)
        end
    end)
end
Не особо разбираюсь в .LUA, поэтому сделал так, как получилось.

Попробую твой метод, спасибо за вариант! Upd.: Переменная существует для того, чтобы можно было запустить код по нажатию Num2.
 

Sidney31

Известный
1,132
385
Да.

В начале кода:
Lua:
  thread = lua_thread.create_suspended(thread_function)

И потом:
Lua:
  function cmd_fish(arg)
    thread:run("fish", arg)
  end


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

Попробую твой метод, спасибо за вариант! Upd.: Переменная существует для того, чтобы можно было запустить код по нажатию Num2.
Lua:
local status = false

function main()
    while not isSampAvailable() do wait(0) end
       
    while true do
        wait(0)
        if isKeyDown(0x62) then --num 2
            status = not status
        end
    end
end

function sampev.onShowTextDraw(id, data)
    if status then
        lua_thread.create(function ()
            if data.text == "N" then --если N, то
                setVirtualKeyDown(0x4E, true) --нажимает n
                wait(300)
                setVirtualKeyDown(0x4E, false) --отпускает n
            elseif data.text == "Y" then --аналогично
                setVirtualKeyDown(0x59, true)
                wait(300)
                setVirtualKeyDown(0x59, false)
            end
        end)
    end
end
 
Последнее редактирование:

Antala

Новичок
Автор темы
8
0
Lua:
local status = false

function main()
    while not isSampAvailable() do wait(0) end
       
    while true do
        wait(0)
        if isKeyDown(0x62) then --num 2
            status = not status
        end
    end
end

function sampev.onShowTextDraw(id, data)
    if status then
        lua_thread.create(function ()
            if data.text == "N" then --если N, то
                setVirtualKeyDown(0x4E, true) --нажимает n
                wait(300)
                setVirtualKeyDown(0x4E, true) --отпускает n
            elseif data.text == "Y" then --аналогично
                setVirtualKeyDown(0x59, true)
                wait(300)
                setVirtualKeyDown(0x59, true)
            end
        end)
    end
end
Один вопрос: разве второй setVirtualKeyDown не должен устанавливать значение на false?
 

Antala

Новичок
Автор темы
8
0
1652732930207.png

скинь скрин, как выглядит текстдрав

Попробовал ловить не по тексту, а по Id textdraw (у текста N и Y разные ID), но результат тот же - всё равно почему-то иногда зафлуживает букву N.
 
Последнее редактирование:

Hideme Flow

Известный
555
193

Antala

Новичок
Автор темы
8
0
Адванс.

Немного исследовал баг: в какой-то момент кнопка N зажимается, но не отжимается, поэтому происходит флуд. Т.е. она застревает в этом цикле:

Lua:
          setVirtualKeyDown(VK_N, true)
          wait(100)
          setVirtualKeyDown(VK_N, false)

Причем, что интересно, багает только N цикл. Y работает корректно.