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

> lua поставить скрипт на паузу, while true do - скрипт с циклом не ставится на паузу!
фонарик
сообщение 3.12.2023, 19:40
Сообщение #1


****

Apprentice
Сообщений: 160
Регистрация: 23.11.2011
Группа: Пользователи
Наличность: 0
Пользователь №: 14.305



Здравствуйте. Вот такой банальный вопрос: обнаружил намедни что если в скрипте луа есть цикл, то при постановке скрипта на паузу, скрипт все равно продолжает работать:
Код
--lua
while true do
  msg('ok')
end
Подскажите пожалуйста кто знает, как сделать так, чтобы если я нажал кнопочку постановки скрипта на паузу - чтобы он слушался! И прекращал вести всякую деятельность. А после снятия с паузы - продолжал. Обычные скрипты пилота так и делают.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов
DarkMaster
сообщение 5.12.2023, 6:10
Сообщение #2


***********

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



Код
local winapi
do
    -- У меня пути не стандартные, чтобы избежать свинарника.
    -- Поэтому тут есть пара "лишних" строк.
    -- Сохраняем _текущие_ пути по которым ищутся модули.
    local back = package.path
    -- Дописываю путь по которому у меня лежат модули.
    package.path = "lua_plugins\\winapi\\?.lua;"..package.path
    -- Подгружаем собственно модуль.
    -- Хз почему, но грузить нужно именно так.
    -- Просто require 'winapi' не пашет.
    winapi = require 'winapi'
    -- Подгружаем кусок отвечающий за клавиатуру
    require[[winapi.keyboard]]
    -- Возвращаем пути поиска модулей на исходные.
    package.path = back
end

local pause_hook = function()
    if winapi.GetKeyState(17) and winapi.GetKeyState(18) and winapi.GetKeyState(90) then
        repeat
            wait(1)
        until not (winapi.GetKeyState(17) and winapi.GetKeyState(18) and winapi.GetKeyState(90))

        while not (winapi.GetKeyState(17) and winapi.GetKeyState(18) and winapi.GetKeyState(90)) do
            wait(1)
        end
        repeat
            wait(1)
        until not (winapi.GetKeyState(17) and winapi.GetKeyState(18) and winapi.GetKeyState(90))
    end
end
debug.sethook (pause_hook, "l")

-- ДАЛЕЕ ВАШ СКРИПТ
while 1 do
    log(os.clock())
    wait(1)
end

Мой вариант без особых заморочек. Через дебаг луа и хуки. По поводу безопасности кода - в манах луа написано, что дебагне безопасен с точке зрения доступа к данным. Ну в том смысле, что это создает потенциальные пути для взлома. Если, скажем, взять варкрафт в котором огромный кусок написан на луа и включить там дебаг, то при желании можно получить доступ далеко не только к пользовательским функциям. Из минусов так же будет некторое падение производительности. В стандартном использовании будет не заметно, но если будет идти жесткий перебор массивов, то может быть существенно. Например, если используется findcolor на чистом луа - скорость просядет.
Данный код не совместим с моей дебаг либой (котора dbg, dbg.enable()). Если есть необходимость могу их скрестить.

Пауза на ctrl+alt+z

Получение кодов клавиш:
Код

--lua
local winapi
do
    -- У меня пути не стандартные, чтобы избежать свинарника.
    -- Поэтому тут есть пара "лишних" строк.
    -- Сохраняем _текущие_ пути по которым ищутся модули.
    local back = package.path
    -- Дописываю путь по которому у меня лежат модули.
    package.path = "lua_plugins\\winapi\\?.lua;"..package.path
    -- Подгружаем собственно модуль.
    -- Хз почему, но грузить нужно именно так.
    -- Просто require 'winapi' не пашет.
    winapi = require 'winapi'
    --ext.lg(winapi)
    -- Подгружаем кусок отвечающий за клавиатуру
    require[[winapi.keyboard]]
    -- Возвращаем пути поиска модулей на исходные.
    package.path = back

    socket = require 'socket'
end

-- Поолучаем состояние клавиши:
-- state - нажата/отжата
-- toggle - для лампочек горит/не горит.
--local state, toggle = GetKeyState(0x14)
--log(tostring(state),tostring(toggle))

local state_arr = {}


while 1 do
    for i = 0, 255 do
        local state, toggle = winapi.GetKeyState(i)
        if state and not state_arr[i] then
            state_arr[i] = true
            log(string.format("%.3f", os.clock())..": "..i.." down")
        elseif not state and state_arr[i] then
            state_arr[i] = false
            log(string.format("%.3f", os.clock())..": "..i.." up")
        end
    end
    wait(1)
end


Сообщение отредактировал DarkMaster - 5.12.2023, 6:11


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

Сообщений в этой теме
фонарик   lua поставить скрипт на паузу   3.12.2023, 19:40
DarkMaster   в нормальном виде никак. это нужно кнайта. вообще ...   3.12.2023, 23:51
фонарик   врубить дебагА что это значит :D И почему он неб...   4.12.2023, 0:08
Cockney   А что это значит :D И почему он небезопасен? :...   4.12.2023, 1:07
фонарик   Если коротко - супер профессиональная фича. Включа...   4.12.2023, 1:13
Cockney   Ставить скрипт на паузу в цикле - норма, но нужно ...   4.12.2023, 11:24
DarkMaster   Когда-то давно гуглил ничего толкого не нашел. Мы ...   4.12.2023, 16:32
Cockney   Азиаты тоже озаботились этим вопросом https://gith...   4.12.2023, 17:19
DarkMaster   вообще брейки давно в zerobrane реализованы, но до...   4.12.2023, 18:14
DarkMaster   в zerobrane кстати отладка идет через remotedebug ...   4.12.2023, 18:52
Cockney   Спроси у мейнтейнера) этож опенсурс, кто как хочет...   4.12.2023, 18:52
Cockney   Имхо - это не брекпоинт (но ты вроде говорил про к...   5.12.2023, 10:07
DarkMaster   была задача сделать паузу. пауза есть. надо полноц...   5.12.2023, 11:47
DarkMaster   Кстати zerobrane может через remotedebug и пилотов...   5.12.2023, 13:25
Cockney   Да я и не смею спорить, что по ссылке тоже костыль...   5.12.2023, 16:46
DarkMaster   Дык вроде как раз таки нет. Автоматически внутрь...   5.12.2023, 17:00
Cockney   Видимо замылились глаза - ты прав, нужно по нажати...   6.12.2023, 10:26
DarkMaster   =) Если мне надо будет в пилоте встать на 15 ст...   6.12.2023, 10:35
Cockney   Ладно, ладно, убедил)   10.12.2023, 22:50


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

 

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