Несколько ответов

Andes

Участник
Автор темы
63
9
Версия MoonLoader
.027.0-preview
Здравствуйте, хочу сделать авто ответчик на викторину, но не понимаю как сделать чтоб скрипт отвечал на каждый вопрос нужным ответом.
IMG_20250902_031709.jpg
 

dmitry.karle

Известный
408
108
Lua:
local w = {
    {ask = 'Викторина: Сколько будет 150*10+6-4? %S+Ответ пишите в чат%S+', answ = '1 502'},
    {ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека?', answ = '32'}
}

require('lib.samp.events').onServerMessage = function(color, text)
    for i = 1, #w do
        if text:find(w[i].ask) then
            sampAddChatMessage('Найден ответ на вопрос: '..w[i].ask..' Ответ: '..w[i].answ, -1)
            sampSendChat(w[i].answ)
            return true
        end
    end
end

что-то типа такого
 

Andes

Участник
Автор темы
63
9
Lua:
local w = {
    {ask = 'Викторина: Сколько будет 150*10+6-4? %S+Ответ пишите в чат%S+', answ = '1 502'},
    {ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека?', answ = '32'}
}

require('lib.samp.events').onServerMessage = function(color, text)
    for i = 1, #w do
        if text:find(w[i].ask) then
            sampAddChatMessage('Найден ответ на вопрос: '..w[i].ask..' Ответ: '..w[i].answ, -1)
            sampSendChat(w[i].answ)
            return true
        end
    end
end

что-то типа такого
А как сделать чтоб он отвечал на 1 вопрос несколькими ответами отдельным сообщением?
 

dmitry.karle

Известный
408
108
Lua:
local w = {
    {
        ask = 'Викторина: Сколько будет 150*10+6-4?',
        answ = {'1502', '1 502'},
    },
    {
        ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека?',
        answ = {'32', 'тридцать два', '32 зуба', '32 teeth'},
    },
}

require('lib.samp.events').onServerMessage = function(color, text)
    for i = 1, #w do
        if text:find(w[i].ask, 1, true) then
            sampAddChatMessage('Найден ответ на вопрос: '..w[i].ask..' Ответ: '..w[i].answ, -1)
            for j = 1, #w[i].answ do
                sampSendChat(w[i].answ[j])
                sampAddChatMessage(string.format('Ответ %d: %s', j, w[i].answ[j]), -1)
            end
            return true
        end
    end
end

??
 

Andes

Участник
Автор темы
63
9
(error) autoquiz.lua: .../Android/media/com.arizona.game/monetloader/autoquiz.lua:15: attempt to concatenate field 'answ' (a table value) stack traceback: .../Android/media/com.arizona.game/monetloader/autoquiz.lua:15: in function 'callback' ...ia/com.arizona.game/monetloader/lib/samp/events/core.lua:79: in function <...ia/com.arizona.game/monetloader/lib/samp/events/core.lua:53> [02:36:55.095199] (error) autoquiz.lua: Script died due to an error.
 

dmitry.karle

Известный
408
108
Lua:
local w = {
    {
        ask = 'Викторина: Сколько будет 150*10+6-4?',
        answ = {'1502', '1 502'},
    },
    {
        ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека?',
        answ = {'32', 'тридцать два', '32 зуба', '32 teeth'},
    },
}

require('lib.samp.events').onServerMessage = function(color, text)
    for i = 1, #w do
        if text:find(w[i].ask, 1, true) then
            sampAddChatMessage('Найден ответ на вопрос: '..w[i].ask..' Ответ: '..w[i].answ[1], -1)
            for j = 1, #w[i].answ do
                sampSendChat(w[i].answ[j])
                sampAddChatMessage(string.format('Ответ %d: %s', j, w[i].answ[j]), -1)
            end
            return true
        end
    end
end
 

Andes

Участник
Автор темы
63
9
Lua:
local w = {
    {
        ask = 'Викторина: Сколько будет 150*10+6-4?',
        answ = {'1502', '1 502'},
    },
    {
        ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека?',
        answ = {'32', 'тридцать два', '32 зуба', '32 teeth'},
    },
}

require('lib.samp.events').onServerMessage = function(color, text)
    for i = 1, #w do
        if text:find(w[i].ask, 1, true) then
            sampAddChatMessage('Найден ответ на вопрос: '..w[i].ask..' Ответ: '..w[i].answ[1], -1)
            for j = 1, #w[i].answ do
                sampSendChat(w[i].answ[j])
                sampAddChatMessage(string.format('Ответ %d: %s', j, w[i].answ[j]), -1)
            end
            return true
        end
    end
end
Не работает
 

dmitry.karle

Известный
408
108
1756857283239.png

всё работает, ключ [1] пропустил.
Lua:
sampAddChatMessage('Найден ответ на вопрос: '..w[i].ask..' Ответ: '..w[i].answ[1], -1)

Lua:
local w = {
    {
        ask = 'Викторина: Сколько будет 150*10+6-4?',
        answ = {'1502', '1 502'},
    },
    {
        ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека?',
        answ = {'32', 'тридцать два', '32 зуба', '32 teeth'},
    },
}

require('lib.samp.events').onServerMessage = function(color, text)
    local clear = text:gsub('~%x%x%x%x%x%x', ''):gsub('~%x%x%x', '')
    for i = 1, #w do
        if clear:find(w[i].ask, 1, true) then
            sampAddChatMessage('Найден ответ на вопрос: '..w[i].ask..' Ответ: '..w[i].answ[1], -1)
            for j = 1, #w[i].answ do
                sampSendChat(w[i].answ[j])
                sampAddChatMessage(string.format('Ответ %d: %s', j, w[i].answ[j]), -1)
            end
            return true
        end
    end
end
 

Andes

Участник
Автор темы
63
9
Посмотреть вложение 277736
всё работает, ключ [1] пропустил.
Lua:
sampAddChatMessage('Найден ответ на вопрос: '..w[i].ask..' Ответ: '..w[i].answ[1], -1)

Lua:
local w = {
    {
        ask = 'Викторина: Сколько будет 150*10+6-4?',
        answ = {'1502', '1 502'},
    },
    {
        ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека?',
        answ = {'32', 'тридцать два', '32 зуба', '32 teeth'},
    },
}

require('lib.samp.events').onServerMessage = function(color, text)
    local clear = text:gsub('~%x%x%x%x%x%x', ''):gsub('~%x%x%x', '')
    for i = 1, #w do
        if clear:find(w[i].ask, 1, true) then
            sampAddChatMessage('Найден ответ на вопрос: '..w[i].ask..' Ответ: '..w[i].answ[1], -1)
            for j = 1, #w[i].answ do
                sampSendChat(w[i].answ[j])
                sampAddChatMessage(string.format('Ответ %d: %s', j, w[i].answ[j]), -1)
            end
            return true
        end
    end
end
Не отправляет 2 ответ
 

dmitry.karle

Известный
408
108
1756858016873.png



Lua:
local w = {
    {
        ask = 'Викторина: Сколько будет 150*10+6-4?',
        answ = {'1502', '1 502'},
    },
    {
        ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека?',
        answ = {'32', 'тридцать два', '32 зуба', '32 teeth'},
    },
}

require('lib.samp.events').onServerMessage = function(color, text)
    local clear = text:gsub('~%x%x%x%x%x%x', ''):gsub('~%x%x%x', '')
    for i = 1, #w do
        if clear:find(w[i].ask, 1, true) then
            sampAddChatMessage('Найден ответ на вопрос: '..w[i].ask..' Ответ: '..w[i].answ[1], -1)
            for j = 1, #w[i].answ do
                sampSendChat(w[i].answ[j])
                sampAddChatMessage(string.format('Ответ %d: %s', j, w[i].answ[j]), -1)
            end
            return true
        end
    end
end

всё отправляет, скинь строчку из чатлога или скрином. Что там?
 

Andes

Участник
Автор темы
63
9
Посмотреть вложение 277737


Lua:
local w = {
    {
        ask = 'Викторина: Сколько будет 150*10+6-4?',
        answ = {'1502', '1 502'},
    },
    {
        ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека?',
        answ = {'32', 'тридцать два', '32 зуба', '32 teeth'},
    },
}

require('lib.samp.events').onServerMessage = function(color, text)
    local clear = text:gsub('~%x%x%x%x%x%x', ''):gsub('~%x%x%x', '')
    for i = 1, #w do
        if clear:find(w[i].ask, 1, true) then
            sampAddChatMessage('Найден ответ на вопрос: '..w[i].ask..' Ответ: '..w[i].answ[1], -1)
            for j = 1, #w[i].answ do
                sampSendChat(w[i].answ[j])
                sampAddChatMessage(string.format('Ответ %d: %s', j, w[i].answ[j]), -1)
            end
            return true
        end
    end
end

всё отправляет, скинь строчку из чатлога или скрином. Что там?

Надо чтоб он вот так отвечал
 

Вложения

  • Screenshot_2025-09-03-02-52-11-21_60cbab45b17fdd51b253a76beac7b73d.jpg
    Screenshot_2025-09-03-02-52-11-21_60cbab45b17fdd51b253a76beac7b73d.jpg
    1.9 MB · Просмотры: 34
Последнее редактирование:

dmitry.karle

Известный
408
108
1756859779850.png
нашёл в чем прикол, не увидел изначально варианты. (Ответ пишите цифрой в чат) + (Ответ пишите в чат). Хотя можно было бы и просто и по зелёному тексту найти ответ что бы не вписывать каждый вариант из ответов, вдруг сейчас он под 2 номером, через час будет под 1 номером. Сделать вопрос = ответ


Lua:
local w = {
    {
        ask = 'Викторина: Сколько будет 150*10+6-4? (Ответ пишите в чат)',
        answ = {'1502', '1 502'},
        type = 'text'  --текс
    },
    {
        ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека? (Ответ пишите цифрой в чат)',
        answ = {'32', 'тридцать два', '32 зуба', '32 teeth'},
        type = 'number'  --цифра
    },
    {
        ask = 'Викторина: Кто нарисовал Мону Лизу? (Ответ пишите цифрой в чат)',
        answ = {'1. Винсент Ван Гог', '2. Леонардо Да Винчи', '3. Пабло Пикассо', '4. Клод Моне'},
        correct = '2',
        type = 'choice' --варианты
    },
}

require('lib.samp.events').onServerMessage = function(color, text)
    local clear = text:gsub('~%x%x%x%x%x%x', ''):gsub('~%x%x%x', '')
    for i = 1, #w do
        if clear:find(w[i].ask, 1, true) then
            sampAddChatMessage('Найден вопрос: '.. w[i].ask, -1)
            local responseType = w[i].type or detectResponseType(clear)
            if responseType == 'choice' and w[i].correct then
                sampSendChat(w[i].correct)
             
            elseif responseType == 'number' then
                sampSendChat(w[i].answ[1])
            else
                lua_thread.create(function()
                    for j = 1, #w[i].answ do
                        wait(100)
                        sampSendChat(w[i].answ[j])
                        sampAddChatMessage(string.format('Ответ %d: %s', j, w[i].answ[j]), -1)
                    end
                end)
            end
            return true
        end
    end
end

function detectResponseType(text)
    if text:find('пишите цифрой') or text:find('выберите цифру') or text:find('номер ответа') then
        return 'choice'
    elseif text:find('пишите в чат') or text:find('напишите ответ') then
        return 'text'
    elseif text:find('цифрой') or text:find('числом') then
        return 'number'
    end
    return 'text'  -- по умолчанию
end

Lua:
local w = {
    {
        ask = 'Викторина: Сколько будет 150*10+6-4? (Ответ пишите в чат)',
        answ = '1502'
    },
    {
        ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека? (Ответ пишите цифрой в чат)',
        answ = '32'
    },
    {
        ask = 'Викторина: Кто нарисовал Мону Лизу? (Ответ пишите цифрой в чат)',
        answ = '2'
    }
}

require('lib.samp.events').onServerMessage = function(color, text)
    local clear = text:gsub('~%x%x%x%x%x%x', ''):gsub('~%x%x%x', '')
    for i = 1, #w do
        if clear:find(w[i].ask, 1, true) then
            sampSendChat(w[i].answ)
            sampAddChatMessage('Отправлен ответ: ' .. w[i].answ, -1)
            return true
        end
    end
end

ну да, зачем делать велосипед если есть героскутер, вот упрощенный вариант. Зачем давать несколько вариантов ответов на 1 вопрос если требуется "Ответ пишите цифрой в чат + варианты ответов и что-то из ответов надо выбрать, другого варианта нет" и "Ответ пишите в чат. Пример: 150*10+6-4 = 1502 , зачем сюда еще несколько доп.ответов если оно того не требует?"). Я изначально скинул готовый вариант, разве нет?
 
Последнее редактирование:

Andes

Участник
Автор темы
63
9
Посмотреть вложение 277741нашёл в чем прикол, не увидел изначально варианты. (Ответ пишите цифрой в чат) + (Ответ пишите в чат). Хотя можно было бы и просто и по зелёному тексту найти ответ что бы не вписывать каждый вариант из ответов, вдруг сейчас он под 2 номером, через час будет под 1 номером. Сделать вопрос = ответ


Lua:
local w = {
    {
        ask = 'Викторина: Сколько будет 150*10+6-4? (Ответ пишите в чат)',
        answ = {'1502', '1 502'},
        type = 'text'  --текс
    },
    {
        ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека? (Ответ пишите цифрой в чат)',
        answ = {'32', 'тридцать два', '32 зуба', '32 teeth'},
        type = 'number'  --цифра
    },
    {
        ask = 'Викторина: Кто нарисовал Мону Лизу? (Ответ пишите цифрой в чат)',
        answ = {'1. Винсент Ван Гог', '2. Леонардо Да Винчи', '3. Пабло Пикассо', '4. Клод Моне'},
        correct = '2',
        type = 'choice' --варианты
    },
}

require('lib.samp.events').onServerMessage = function(color, text)
    local clear = text:gsub('~%x%x%x%x%x%x', ''):gsub('~%x%x%x', '')
    for i = 1, #w do
        if clear:find(w[i].ask, 1, true) then
            sampAddChatMessage('Найден вопрос: '.. w[i].ask, -1)
            local responseType = w[i].type or detectResponseType(clear)
            if responseType == 'choice' and w[i].correct then
                sampSendChat(w[i].correct)
           
            elseif responseType == 'number' then
                sampSendChat(w[i].answ[1])
            else
                lua_thread.create(function()
                    for j = 1, #w[i].answ do
                        wait(100)
                        sampSendChat(w[i].answ[j])
                        sampAddChatMessage(string.format('Ответ %d: %s', j, w[i].answ[j]), -1)
                    end
                end)
            end
            return true
        end
    end
end

function detectResponseType(text)
    if text:find('пишите цифрой') or text:find('выберите цифру') or text:find('номер ответа') then
        return 'choice'
    elseif text:find('пишите в чат') or text:find('напишите ответ') then
        return 'text'
    elseif text:find('цифрой') or text:find('числом') then
        return 'number'
    end
    return 'text'  -- по умолчанию
end

Lua:
local w = {
    {
        ask = 'Викторина: Сколько будет 150*10+6-4? (Ответ пишите в чат)',
        answ = '1502'
    },
    {
        ask = 'Викторина: Сколько зубов должно быть во рту взрослого человека? (Ответ пишите цифрой в чат)',
        answ = '32'
    },
    {
        ask = 'Викторина: Кто нарисовал Мону Лизу? (Ответ пишите цифрой в чат)',
        answ = '2'
    }
}

require('lib.samp.events').onServerMessage = function(color, text)
    local clear = text:gsub('~%x%x%x%x%x%x', ''):gsub('~%x%x%x', '')
    for i = 1, #w do
        if clear:find(w[i].ask, 1, true) then
            sampSendChat(w[i].answ)
            sampAddChatMessage('Отправлен ответ: ' .. w[i].answ, -1)
            return true
        end
    end
end

ну да, зачем делать велосипед если есть героскутер, вот упрощенный вариант. Зачем давать несколько вариантов ответов на 1 вопрос если требуется "Ответ пишите цифрой в чат + варианты ответов и что-то из ответов надо выбрать, другого варианта нет" и "Ответ пишите в чат. Пример: 150*10+6-4 = 1502 , зачем сюда еще несколько доп.ответов если оно того не требует?"). Я изначально скинул готовый вариант, разве нет?
Там вопросов полно и по этому я взял просто "{00a1fa}Викторина: " и хотел чтоб он просто писал 1 2 3 4 только не 1 сообщением
 

dmitry.karle

Известный
408
108
Ого ты захотел, а как оно поймет что туда вписывать без конкретики? Решил обойтись просто
Lua:
if text:find('Викторина: .+') then
    --cod
end

Ты так хотел? Ну с козырей получается заходишь, а как оно поймет на что отвечать без вопроса=ответа? Это базу данных в любом случае придётся заполнять, что бы давать нормальные ответы. Ты бы ещё ебанул такой формат:
Lua:
if text:find('.+') then
    --cod
end


А чего нам, пусть само ищет))

Lua:
local number = {1, 2, 3, 4}

require('lib.samp.events').onServerMessage = function(color, text)
    if text:find('Викторина: .+ %S+Ответ пишите цифрой в чат%S+') then
        for i = 1, #number do
            sampSendChat(number[i])
        end
    end
end

Если только на такой вопрос триггер, а на (Ответ пишите в чат) там нет вариантов ответа и придется самому вписывать их.
 
Последнее редактирование:

Andes

Участник
Автор темы
63
9
Ого ты захотел, а как оно поймет что туда вписывать без конкретики? Решил обойтись просто
Lua:
if text:find('Викторина: .+') then
    --cod
end

Ты так хотел? Ну с козырей получается заходишь, а как оно поймет на что отвечать без вопроса=ответа? Это базу данных в любом случае придётся заполнять, что бы давать нормальные ответы. Ты бы ещё ебанул такой формат:
Lua:
if text:find('.+') then
    --cod
end


А чего нам, пусть само ищет))

Lua:
local number = {1, 2, 3, 4}

require('lib.samp.events').onServerMessage = function(color, text)
    if text:find('Викторина: .+ %S+Ответ пишите цифрой в чат%S+') then
        for i = 1, #number do
            sampSendChat(number[i])
        end
    end
end

Если только на такой вопрос триггер, а на (Ответ пишите в чат) там нет вариантов ответа и придется самому вписывать их. И-то, подобный вопрос который был про зубы - данный вариант тоже не подойдёт.
Там по цифрам идёт ответ