events

Kvisk

Известный
Автор темы
214
228
Версия MoonLoader
.026-beta
Как мне сделать задержку в ивенте?
Например:
Lua:
function ev.onServerMessage(c, s)
    if s:find("guch") then
        s = "gang"
        wait(3000)
        return {c, s}
    end
end
 
Решение
Lua:
texts = {} --создаем где-нибудь пустую таблицу
require('lib.samp.events').onServerMessage(color, text) --сам хук
    if text:find("Нужное сообщение") or text:find("Или другое сообщение") or text:find("И так далее") then --ищем нужные сообщения
        table.insert(texts, {color, text}) -- если найдено нужное сообщение то добавляем его в таблицу
        lua_thread.create(function() --создаём поток
            wait(2000) -- ждём нужное время
            sampAddChatMessage(texts[1].text, texts[1].color) --выводим в чат сообщение из таблицы
            table.remove(texts, 1) -- удаляем сообщение из таблицы
        end)
        return false -- если было найдено нужное сообщение то нопим его
    end
end

CaJlaT

07.11.2024 14:55
Модератор
2,848
2,695
Как мне сделать задержку в ивенте?
Например:
Lua:
function ev.onServerMessage(c, s)
    if s:find("guch") then
        s = "gang"
        wait(3000)
        return {c, s}
    end
end
Вообще, для wait() нужно создавать поток, но return нельзя использовать с потоком.
Простой пример создания потока:
Lua:
print('Сообщение сразу')
lua_thread.create(function()
    wait(1000)
    print('Сообщение спустя 1 секунду')
end)
print('Сообщение сразу №2')
 

Kvisk

Известный
Автор темы
214
228
Вообще, для wait() нужно создавать поток, но return нельзя использовать с потоком.
Простой пример создания потока:
Lua:
print('Сообщение сразу')
lua_thread.create(function()
    wait(1000)
    print('Сообщение спустя 1 секунду')
end)
print('Сообщение сразу №2')
Я знаю что для wait нужен поток, просто если я буду делать поток с задержкой - то он будет асинхронный, и из-за этого эвент будет работать не так. Он будет заменять не нужное мне сообщение, а последнее.
 

Kvisk

Известный
Автор темы
214
228
Напрямую никак, но можно создать поток, в нем использовать задержку и эмулировать пакет потом.
В ивентах и вообще в хуках использовать задержки плохая практика..
Если не сложно, можно, пожалуйста, пример? Я находил какую-то задержку через бесконечный отдельный цикл и os.time(). Но это не то что мне нужно.
 

bottom_text

Известный
673
323
Вообще, для wait() нужно создавать поток, но return нельзя использовать с потоком.
Простой пример создания потока:
Lua:
print('Сообщение сразу')
lua_thread.create(function()
    wait(1000)
    print('Сообщение спустя 1 секунду')
end)
print('Сообщение сразу №2')
Почему нельзя return? Просто вынести из потока return можно же
Lua:
local ev = require 'samp.events'


function ev.onServerMessage(color, text) 
    lua_thread.create(function()
        wait(2000)
        sampAddChatMessage('поток епта: ' .. text, -1)
    end) 
    return {color, "HOOKED | " .. text }
end
1619013928619.png
 

Kvisk

Известный
Автор темы
214
228
Почему нельзя return? Просто вынести из потока return можно же
Lua:
local ev = require 'samp.events'


function ev.onServerMessage(color, text)
    lua_thread.create(function()
        wait(2000)
        sampAddChatMessage('поток епта: ' .. text, -1)
    end)
    return {color, "HOOKED | " .. text }
end
Посмотреть вложение 94101
А ты попробуй сделать то же самое, не с одним сообщением. И поймёшь
 

Quasper

Известный
835
354
Lua:
texts = {} --создаем где-нибудь пустую таблицу
require('lib.samp.events').onServerMessage(color, text) --сам хук
    if text:find("Нужное сообщение") or text:find("Или другое сообщение") or text:find("И так далее") then --ищем нужные сообщения
        table.insert(texts, {color, text}) -- если найдено нужное сообщение то добавляем его в таблицу
        lua_thread.create(function() --создаём поток
            wait(2000) -- ждём нужное время
            sampAddChatMessage(texts[1].text, texts[1].color) --выводим в чат сообщение из таблицы
            table.remove(texts, 1) -- удаляем сообщение из таблицы
        end)
        return false -- если было найдено нужное сообщение то нопим его
    end
end