sampSendDialogResponse

w99zzl1

Участник
Автор темы
153
17
Версия MoonLoader
.026-beta
Добрый вечер!

Код:
local familyDialogId = 3115

function main()
    sampSendChat('/family')
    sampSendDialogResponse(familyDialogId, 1, 1, 1, "")
end
В коде выше, по моему опыту, должно открываться диалоговое окно (3115 на команду /family) в котором выбирается int listitem 1 (т.е. второй по счету, но так как в коде счет с 0, это 1) и нажимать button 1 (Выбрать). НО после открытия окна скриптом (с помощью команды /family) ничего не происходит. Почему? Помогите пожалуйста исправить
 

Sleash

Известный
82
155
Lua:
local familyDialogId = 3115 -- dlg id
local hook_dlg = false -- ждём ли диалог
local sampev = require 'samp.events' -- подключаем библиотеку ивентов сампа
function main()
    repeat wait(0) until isSampAvailable() -- ждём подгрузки сампа
    sampRegisterChatCommand("mycpmmand", function() -- регаем кмд /mycommand для автодиалога
        hook_dlg = true -- начинаем ждать диалог
        sampSendChat('/family') -- пишем в чат /family
    end)
    wait(-1)
end
function sampev.onShowDialog(id) -- перехватываем показ диалога
    -- в данном случае нам нужен только параметр id, берём только его
    if hook_dlg and id == familyDialogId then -- если мы ждём и id диалога равен id famdlg, то
        sampSendDialogResponse(familyDialogId, 1, 1, -1) -- закрываем диалог на Enter с 1 listitem
        hook_dlg = false -- больше не ждём диалог
        return false -- отменяем показ этого диалога, ибо нахуй надо
    end
end

либо так

Lua:
function main()
    repeat wait(0) until isSampAvailable() -- Ждём загрузки сампа
    sampRegisterChatCommand("mycpmmand", function() -- регистрируем команду /mycommand для автодиалога
           lua_thread.create(function() -- поток для wait вне main (ибо уже другая функция в команду)
               sampSendChat('/family') -- пишем в чат /family
               repeat wait(0) until isDialogActive() -- ждём появления какого0нибудь диалога
               sampSetCurrentDialogListItem(1) -- саввим позицию Listitem на 1 лист (2 с верху)
               sampCloseCurrentDialogWithButton(1) -- закрываем диалог с Enter
           end)
    end)
    wait(-1)
end
 

w99zzl1

Участник
Автор темы
153
17
Lua:
local familyDialogId = 3115 -- dlg id
local hook_dlg = false -- ждём ли диалог
local sampev = require 'samp.events' -- подключаем библиотеку ивентов сампа
function main()
    repeat wait(0) until isSampAvailable() -- ждём подгрузки сампа
    sampRegisterChatCommand("mycpmmand", function() -- регаем кмд /mycommand для автодиалога
        hook_dlg = true -- начинаем ждать диалог
        sampSendChat('/family') -- пишем в чат /family
    end)
    wait(-1)
end
function sampev.onShowDialog(id) -- перехватываем показ диалога
    -- в данном случае нам нужен только параметр id, берём только его
    if hook_dlg and id == familyDialogId then -- если мы ждём и id диалога равен id famdlg, то
        sampSendDialogResponse(familyDialogId, 1, 1, -1) -- закрываем диалог на Enter с 1 listitem
        hook_dlg = false -- больше не ждём диалог
        return false -- отменяем показ этого диалога, ибо нахуй надо
    end
end

либо так

Lua:
function main()
    repeat wait(0) until isSampAvailable() -- Ждём загрузки сампа
    sampRegisterChatCommand("mycpmmand", function() -- регистрируем команду /mycommand для автодиалога
           lua_thread.create(function() -- поток для wait вне main (ибо уже другая функция в команду)
               sampSendChat('/family') -- пишем в чат /family
               repeat wait(0) until isDialogActive() -- ждём появления какого0нибудь диалога
               sampSetCurrentDialogListItem(1) -- саввим позицию Listitem на 1 лист (2 с верху)
               sampCloseCurrentDialogWithButton(1) -- закрываем диалог с Enter
           end)
    end)
    wait(-1)
end
Привет! Спасибо за предоставленный код, но походу у меня кривые ручки) Не работает, а точнее просто не открывает нужный пункт (listitem 1 при индексе с нуля)
Вот мой код:


Lua:
local inicfg = require 'inicfg'
local familyDialogId = 3115 -- ID диалога для сохранения ников
local firstDialogId = 3109 -- ID первого диалога
local hook_dlg = false -- Ждем ли диалог
local sampev = require 'samp.events' -- Подключаем библиотеку событий сампа

function main()
    repeat wait(0) until isSampAvailable() -- Ждем подгрузки сампа
    sampSendChat('/family') -- Пишем в чат /family
    hook_dlg = true -- Начинаем ждать диалог

    while hook_dlg do
        wait(100) -- Ждем 100 мс, чтобы не перегружать процессор
    end
    wait(-1) -- Основной цикл
end

function sampev.onShowDialog(id) -- Перехватываем показ диалога
    if hook_dlg and id == firstDialogId then -- Если ждем и ID диалога равен 3109
        wait(500) -- Ждем полсекунды, чтобы убедиться, что диалог открылся
        sampSendDialogResponse(firstDialogId, 1, 1, -1) -- Выбираем второй пункт (listitem 1, если 0 - 2)
        return false -- Отменяем показ этого диалога
    elseif id == familyDialogId then
        -- Получаем текст диалога (если он доступен)
        local dialogText = "" -- текст будет передан через событие
        saveDialogText(dialogText) -- Сохраняем текст
        hook_dlg = false -- Больше не ждем диалог
        return false -- Отменяем показ этого диалога
    end
end

-- основной конфиг
local mainIni = inicfg.load({
    settings = {
        title = "Default Title",
        text_color = "0xAABBCC"
    },
})

-- Функция для извлечения ников из текста
local function extractNicks(text)
    local nicks = {}

    -- Разделяем текст на строки
    for line in text:gmatch("[^\r\n]+") do
        -- Найти ник в начале строки
        local nick = line:match("^(%S+)")
        if nick then
            table.insert(nicks, nick) -- Добавляем ник в таблицу
        end
    end

    return table.concat(nicks, "\n") -- Возвращаем ника, соединенные с новой строки
end

-- Функция для сохранения текста диалогового окна
local function saveDialogText(text)
    local extractedNicks = extractNicks(text) -- Извлекаем ники

    local dialogData = {
        dialog = {
            text = extractedNicks
        }
    }

    -- Сохраняем текст в файл
    if inicfg.save(dialogData, "family.ini") then
        print("Ники успешно сохранены.")
    else
        print("Ошибка при сохранении ников.")
    end
end

require('lib.samp.events').onShowDialog = function(did, style, title, b1, b2, text)
    if did == familyDialogId then
        saveDialogText(text) -- Сохраняем текст
    end
end
Помогите пожалуйста исправить
 

kultizdat.

Известный
158
12
Привет! Спасибо за предоставленный код, но походу у меня кривые ручки) Не работает, а точнее просто не открывает нужный пункт (listitem 1 при индексе с нуля)
Вот мой код:


Lua:
local inicfg = require 'inicfg'
local familyDialogId = 3115 -- ID диалога для сохранения ников
local firstDialogId = 3109 -- ID первого диалога
local hook_dlg = false -- Ждем ли диалог
local sampev = require 'samp.events' -- Подключаем библиотеку событий сампа

function main()
    repeat wait(0) until isSampAvailable() -- Ждем подгрузки сампа
    sampSendChat('/family') -- Пишем в чат /family
    hook_dlg = true -- Начинаем ждать диалог

    while hook_dlg do
        wait(100) -- Ждем 100 мс, чтобы не перегружать процессор
    end
    wait(-1) -- Основной цикл
end

function sampev.onShowDialog(id) -- Перехватываем показ диалога
    if hook_dlg and id == firstDialogId then -- Если ждем и ID диалога равен 3109
        wait(500) -- Ждем полсекунды, чтобы убедиться, что диалог открылся
        sampSendDialogResponse(firstDialogId, 1, 1, -1) -- Выбираем второй пункт (listitem 1, если 0 - 2)
        return false -- Отменяем показ этого диалога
    elseif id == familyDialogId then
        -- Получаем текст диалога (если он доступен)
        local dialogText = "" -- текст будет передан через событие
        saveDialogText(dialogText) -- Сохраняем текст
        hook_dlg = false -- Больше не ждем диалог
        return false -- Отменяем показ этого диалога
    end
end

-- основной конфиг
local mainIni = inicfg.load({
    settings = {
        title = "Default Title",
        text_color = "0xAABBCC"
    },
})

-- Функция для извлечения ников из текста
local function extractNicks(text)
    local nicks = {}

    -- Разделяем текст на строки
    for line in text:gmatch("[^\r\n]+") do
        -- Найти ник в начале строки
        local nick = line:match("^(%S+)")
        if nick then
            table.insert(nicks, nick) -- Добавляем ник в таблицу
        end
    end

    return table.concat(nicks, "\n") -- Возвращаем ника, соединенные с новой строки
end

-- Функция для сохранения текста диалогового окна
local function saveDialogText(text)
    local extractedNicks = extractNicks(text) -- Извлекаем ники

    local dialogData = {
        dialog = {
            text = extractedNicks
        }
    }

    -- Сохраняем текст в файл
    if inicfg.save(dialogData, "family.ini") then
        print("Ники успешно сохранены.")
    else
        print("Ошибка при сохранении ников.")
    end
end

require('lib.samp.events').onShowDialog = function(did, style, title, b1, b2, text)
    if did == familyDialogId then
        saveDialogText(text) -- Сохраняем текст
    end
end
Помогите пожалуйста исправить
Я не уверен, но по-моему, у тебя просто ещё раз вызывается команда /family, ТК она находится в потоке main(беск.цикле), а там проверки на повторный вызов команды нет
 

w99zzl1

Участник
Автор темы
153
17
Ёп .... Я попутал файлики с кодами....
Вобщем, пришел к такому коду, + - работает, но не правильно:


Lua:
local familyDialogId = 3109 -- dlg id
local hook_dlg = false -- ждём ли диалог
local sampev = require 'samp.events' -- подключаем библиотеку ивентов сампа

function main()
    repeat wait(0) until isSampAvailable() -- ждём подгрузки сампа
    hook_dlg = true -- начинаем ждать диалог
    sampSendChat('/family') -- пишем в чат /family
    while true do wait(0) end -- зацикливаем выполнение, чтобы скрипт не завершился
end

function sampev.onShowDialog(id) -- перехватываем показ диалога
    -- в данном случае нам нужен только параметр id, берём только его
    if id == familyDialogId then -- если мы ждём и id диалога равен id famdlg, то
        local dialogText = getDialogText()
        sampSendDialogResponse(familyDialogId, 1, 1, -1) -- выбираем 2 пункт в диалоге (index 1)
        writeToFile(dialogText)
        hook_dlg = false -- больше не ждём диалог
        return false -- отменяем показ этого диалога, ибо нахуй надо
    end
end

function sampGetPlayerIdByNickname(nick)
    nick = tostring(nick)
    local _, myid = sampGetPlayerIdByCharHandle(PLAYER_PED)
    if nick == sampGetPlayerNickname(myid) then return myid end
    for i = 0, 1003 do
        if sampIsPlayerConnected(i) and sampGetPlayerNickname(i) == nick then
            return i
        end
    end
end

-- Функция для получения текста из диалогового окна
function getDialogText()
    local text = ""
    local dialogID = 3114
    
    -- Ждём, пока диалоговое окно станет активным
    while not sampIsDialogActive(dialogID) do
        wait(0)
    end

    -- Получаем текст из диалогового окна
    text = sampGetDialogText()
    return text
end

-- Функция для записи текста в файл
function writeToFile(text)
    local file = io.open("moonloader/config/FamilyHelperFriends.ini", "w")
    if file then
        file:write(text)
        file:close()
        print("Текст успешно записан в файл.")
    else
        print("Ошибка при открытии файла.")
    end
end
Пишет в чат family, отерывается диалог, наконец то открывается список участников но нет, скрипт записывает информацию из первого окна, на /family, но не из списка участников(

Я СНОВА В ЗАМЕШАТЕЛЬСТВЕ! Программирование - это так сложно ааа,
Я что то нашаманил, работает все отлично, всё открывается, все записывается. Код:

Lua:
local inicfg = require 'inicfg'
local familyDialogId = 3115 -- ID диалога для сохранения ников
local firstDialogId = 3109 -- ID первого диалога
local hook_dlg = false -- Ждем ли диалог
local sampev = require 'samp.events' -- Подключаем библиотеку событий сампа

function main()
    repeat wait(0) until isSampAvailable() -- Ждем подгрузки сампа
    sampSendChat('/family') -- Пишем в чат /family
    hook_dlg = true -- Начинаем ждать диалог
    sampSendDialogResponse(firstDialogId, 1, 1, -1) -- Выбираем второй пункт (listitem 1, если 0 - 2)
    while hook_dlg do
        wait(100) -- Ждем 100 мс, чтобы не перегружать процессор
    end
    wait(-1) -- Основной цикл
end

function sampev.onShowDialog(id) -- Перехватываем показ диалога
    if hook_dlg and id == firstDialogId then -- Если ждем и ID диалога равен 3109
        wait(500) -- Ждем полсекунды, чтобы убедиться, что диалог открылся
--        sampSendDialogResponse(firstDialogId, 1, 1, -1) -- Выбираем второй пункт (listitem 1, если 0 - 2)
    elseif id == familyDialogId then
        -- Получаем текст диалога (если он доступен)
        local dialogText = "" -- текст будет передан через событие
        saveDialogText(dialogText) -- Сохраняем текст
        hook_dlg = false -- Больше не ждем диалог
        return false -- Отменяем показ этого диалога
    end
end

-- основной конфиг
local mainIni = inicfg.load({
    settings = {
        title = "Default Title",
        text_color = "0xAABBCC"
    },
})

-- Функция для извлечения ников из текста
local function extractNicks(text)
    local nicks = {}

    -- Разделяем текст на строки
    for line in text:gmatch("[^\r\n]+") do
        -- Найти ник в начале строки
        local nick = line:match("^(%S+)")
        if nick then
            table.insert(nicks, nick) -- Добавляем ник в таблицу
        end
    end

    return table.concat(nicks, "\n") -- Возвращаем ника, соединенные с новой строки
end

-- Функция для сохранения текста диалогового окна
local function saveDialogText(text)
    local extractedNicks = extractNicks(text) -- Извлекаем ники

    local dialogData = {
        dialog = {
            text = extractedNicks
        }
    }

    -- Сохраняем текст в файл
    if inicfg.save(dialogData, "family.ini") then
        print("Ники успешно сохранены.")
    else
        print("Ошибка при сохранении ников.")
    end
end

require('lib.samp.events').onShowDialog = function(did, style, title, b1, b2, text)
    if did == familyDialogId then
        saveDialogText(text) -- Сохраняем текст
    end
end
разве что есть одна незначительная проблемка - диалог виден, и диалог не закрывается сам, что будет предоставлять неудобства, помогите пожалуйста исправить это(
 
Последнее редактирование: