Объясните принцип работы автоответа на lua

Статус
В этой теме нельзя размещать новые ответы.

qojqva

Известный
Автор темы
56
2
Как сделать автоответ на lua, небольшой пример и объяснение принципа работы, плиз :3
[18:58:59] {S} Вопрос Shady Scruggs[415]: Как и где приобрести лицензию на ношение оружия?
 

Bogach

Активный
558
27
Подключаешь библиотеку:

Lua:
local res,sampev = pcall(require,'lib.samp.events')
assert(res,'Библиотека SAMP Events не найдена')

С помощью данного хука ловишь нужный текст:

Lua:
function sampev.onServerMessage(color, text)
id,message = string.match(text,'{S} Вопрос %g+%[(%d+)%]: (.*)') -- Примерный паттерн, может и не сработать.
end

Далее, делаешь условие

Lua:
function sampev.onServerMessage(color, text)
id,message = string.match(text,'{S} Вопрос %g+%[(%d+)%]: (.*)')
if id ~= nil then
  if message == "Как и где приобрести лицензию на ношение оружия?" then
     sampSendChat('/ans '..id..' У лицензёра.')
  end
end
end

Все это конечно примерно, тут есть свои заморочки.
 

ImPasha

Software Developer & System Administrator
Друг
1,788
2,143
1) Подключаем библиотеку "Events"
Lua:
local res,sampev = pcall(require,'lib.samp.events')
assert(res,'SAMPEV not found')
2) Используем библиотеку, чтобы отловить вопрос
Lua:
function sampev.onServerMessage(color, text)
    local id, message = string.match(text,'Вопрос.+%[(%d+)%]: (.*)')
    if id ~= nil and message ~= nil then
        for k, v in pairs(answers) do
            if string.find(message, k) then
                sampSendChat(string.format('/ans %s %s', id, v))
            end
        end
    end
end
3) Создаём массив с вопросами/ответами
Lua:
local answers = {
    ['Как открыть меню'] = "Введите /mm",
    ['Как войти в дверь'] = "Нажмите ALT",
}

Через массивы удобнее работать, нежели делать миллионы условий :sneaky:
 

qojqva

Известный
Автор темы
56
2
pw2G2mWKvWc.jpg


Забыл кинуть скрин сразу, я сделал всё что надо было, и в итоге это не работает
 

trefa

3d print
Всефорумный модератор
2,114
1,281
1) Подключаем библиотеку "Events"
Lua:
local res,sampev = pcall(require,'lib.samp.events')
assert(res,'SAMPEV not found')
2) Используем библиотеку, чтобы отловить вопрос
Lua:
function sampev.onServerMessage(color, text)
    local id, message = string.match(text,'Вопрос.+%[(%d+)%]: (.*)')
    if id ~= nil and message ~= nil then
        for k, v in pairs(answers) do
            if string.find(message, k) then
                sampSendChat(string.format('/ans %s %s', id, v))
            end
        end
    end
end
3) Создаём массив с вопросами/ответами
Lua:
local answers = {
    ['Как открыть меню'] = "Введите /mm",
    ['Как войти в дверь'] = "Нажмите ALT",
}

Через массивы удобнее работать, нежели делать миллионы условий :sneaky:
Подключаешь библиотеку:

Lua:
local res,sampev = pcall(require,'lib.samp.events')
assert(res,'Библиотека SAMP Events не найдена')

С помощью данного хука ловишь нужный текст:

Lua:
function sampev.onServerMessage(color, text)
id,message = string.match(text,'{S} Вопрос %g+%[(%d+)%]: (.*)') -- Примерный паттерн, может и не сработать.
end

Далее, делаешь условие

Lua:
function sampev.onServerMessage(color, text)
id,message = string.match(text,'{S} Вопрос %g+%[(%d+)%]: (.*)')
if id ~= nil then
  if message == "Как и где приобрести лицензию на ношение оружия?" then
     sampSendChat('/ans '..id..' У лицензёра.')
  end
end
end

Все это конечно примерно, тут есть свои заморочки.
Перед sendchat нужно делать задержку хоть на 1 мс, а то не будет сообщение показыватся.
 

Bogach

Активный
558
27
Перед sendchat нужно делать задержку хоть на 1 мс, а то не будет сообщение показыватся.
Я вкурсе, но в данной функции нельзя задержку делать, надо с помощью переменной переносить действие в цикл.
 

qojqva

Известный
Автор темы
56
2
Lua:
local res,sampev = pcall(require,'lib.samp.events')
assert(res,'SAMPEV not found')
function sampev.onServerMessage(color, text)
    local id, message = string.match(text,'[S] Вопрос.+%[(%d+)%]: (.*)')
    if id ~= nil and message ~= nil then
        for k, v in pairs(answers) do
            if string.find(message, k) then
              lua_thread.create(function()
wait(1)
sampSendChat(string.format('/ans %s %s', id, v))
end)
            end
        end
    end
end
local answers = {
    ['Как открыть меню'] = "123",
    ['Как войти в дверь'] = "123",
}
То есть должно выйти типа что то этого?
 

ImPasha

Software Developer & System Administrator
Друг
1,788
2,143
@qojqva


Lua:
require 'lib.moonloader'
require 'lib.sampfuncs'
local res,sampev = pcall(require,'lib.samp.events')
assert(res,'SAMPEV not found')

local answers = {
    ['Как открыть меню'] = "Введите /mm",
    ['Как войти в дверь'] = "Нажмите ALT",
}

function sampev.onServerMessage(color, text)
    local id, message = string.match(text,'Вопрос.+%[(%d+)%]: (.*)')
    if id ~= nil and message ~= nil then
        for k, v in pairs(answers) do
            if string.find(message, k) then
                lua_thread.create(function()
                    wait(1000)
                    sampSendChat(string.format('/ans %s %s', id, v))
                end)
            end
        end
    end
end

function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('Скрипт включился, можно удалить эту строку',-1)
    wait(-1)
end
 
  • Нравится
Реакции: qojqva

клешь рояль

Известный
1,254
550
@qojqva


Lua:
require 'lib.moonloader'
require 'lib.sampfuncs'
local res,sampev = pcall(require,'lib.samp.events')
assert(res,'SAMPEV not found')

local answers = {
    ['Как открыть меню'] = "Введите /mm",
    ['Как войти в дверь'] = "Нажмите ALT",
}

function sampev.onServerMessage(color, text)
    local id, message = string.match(text,'Вопрос.+%[(%d+)%]: (.*)')
    if id ~= nil and message ~= nil then
        for k, v in pairs(answers) do
            if string.find(message, k) then
                lua_thread.create(function()
                    wait(1000)
                    sampSendChat(string.format('/ans %s %s', id, v))
                end)
            end
        end
    end
end

function main()
    if not isSampLoaded() and not isSampfuncsLoaded() then return end
    while not isSampAvailable() do wait(100) end
    sampAddChatMessage('Скрипт включился, можно удалить эту строку',-1)
    wait(-1)
end
Hi, тут читаю и думаю можно ли убрать "Вопрос" 12 строка. Если просто будет приходить вопрос в репорт и будет ли на него отвечать скрипт ?
 
Статус
В этой теме нельзя размещать новые ответы.