Помогите с диалогом

BrLoader

Участник
Автор темы
64
9
Версия MoonLoader
.027.0-preview
Делал скрипт для репорта но почему-то не сохраняется конфиг, парсил ник и айди
Код:
local sampev = require 'lib.samp.events'
local ffi = require("ffi")
local gta = ffi.load("GTASA")
local imgui = require("mimgui")
local encoding = require("encoding")
encoding.default = "CP1251"
local u8 = encoding.UTF8
local new = imgui.new
local faicons = require("fAwesome6")
local fa = faicons

-- Инициализация конфигурации
local inicfg = require "inicfg"
local ini = inicfg.load({
    cfg = {
        id = "null",
        nick = "null",
        idrep = "null"
    }
}, "rephelp.ini")

local WinState = imgui.new.bool()

-- Функция сохранения конфигурации
function cfg_save()
    pcall(function()
        inicfg.save(ini, "rephelp.ini")
        sampAddChatMessage("Конфигурация сохранена", -1)
    end)
end

imgui.OnFrame(function()
    return WinState[0]
end, function(player)
    local sizeX, sizeY = getScreenResolution()
    imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(1200, 910), imgui.Cond.FirstUseEver)
    imgui.Begin(u8'ArepHelp', WinState, imgui.WindowFlags.AlwaysAutoResize)

    if imgui.Button(u8"Слежу", imgui.ImVec2(180, 80)) then
        sampSendDialogResponse(5753, 1, 0, "Слежу")
        sampSendChat("тест "..ini.cfg.nick)
        WinState[0] = false
    end
    imgui.SameLine()
    
    if imgui.Button(u8"Иду", imgui.ImVec2(180, 80)) then
        sampSendDialogResponse(5753, 1, 0, "Иду к вам")
        sampSendChat("/g ")
        WinState[0] = false
    end
    imgui.SameLine()
    
    if imgui.Button(u8"Работаю по жб", imgui.ImVec2(180, 80)) then
        sampSendDialogResponse(5753, 1, 0, " | Работаю по вашей жалобе |")
        sampSendChat("тест "..ini.cfg.nick)
        WinState[0] = false
    end
    
    
    if imgui.IsWindowAppearing() then
        cfg_save()
    end
    
    imgui.End()
end)

function sampev.onShowDialog(id, style, title, button1, button2, text)
    if id == 5753 then
        WinState[0] = true
        
      
        local match = text:match('Жалоба от: (%a+_%a+)%[(%d+)%]')
        if match then
            local nick, id = match:match('(%a+_%a+)%[(%d+)%]')
            if nick and id then
                ini.cfg.id = id
                ini.cfg.nick = nick
                cfg_save()
                sampAddChatMessage("Сохранено: ID="..id..", Ник="..nick, -1)
            end
        end
    end
end

function main()
    sampRegisterChatCommand('reps', function()
        WinState[0] = not WinState[0]
        cfg_save()
    end)
    wait(-1)
end
 

Вложения

  • IMG_20250916_012616.jpg
    IMG_20250916_012616.jpg
    408.7 KB · Просмотры: 81
Решение
Пишет но не пишет какой ид и ник
Lua:
-- Библиотеки
local sampev = require('samp.events')
local ffi = require('ffi')
local gta = ffi.load('GTASA')
local imgui = require('mimgui')
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

-- Инициализация конфигурации
local inicfg = require('inicfg')
local ini_filepath = 'rephelp.ini'
local ini = inicfg.load({
    cfg = {
        player_nickname = 'null',
        player_id = -1,
    }
}, 'rephelp.ini')
inicfg.save(ini, ini_filepath)

-- Глобальные функция
-- Функция сохранения конфигурации
function configSave()
    inicfg.save(ini, ini_filepath)
    sampAddChatMessage('Конфигурация сохранена', -1)
end

-- Константы для фрейма имгуи
local window_state...

BrLoader

Участник
Автор темы
64
9
Последнее редактирование:

kyrtion

Известный
1,321
485
Пишет но не пишет какой ид и ник
Lua:
-- Библиотеки
local sampev = require('samp.events')
local ffi = require('ffi')
local gta = ffi.load('GTASA')
local imgui = require('mimgui')
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

-- Инициализация конфигурации
local inicfg = require('inicfg')
local ini_filepath = 'rephelp.ini'
local ini = inicfg.load({
    cfg = {
        player_nickname = 'null',
        player_id = -1,
    }
}, 'rephelp.ini')
inicfg.save(ini, ini_filepath)

-- Глобальные функция
-- Функция сохранения конфигурации
function configSave()
    inicfg.save(ini, ini_filepath)
    sampAddChatMessage('Конфигурация сохранена', -1)
end

-- Константы для фрейма имгуи
local window_state = imgui.new.bool(false)
local size_x, size_y = getScreenResolution()
local middle_size_x, middle_size_y = size_x / 2, size_y / 2

-- Фрейм imgui
local imgui_frame = imgui.OnFrame(function() return window_state[0] end, function(player)
    -- Header
    imgui.SetNextWindowPos(imgui.ImVec2(middle_size_x, middle_size_y), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(1200, 910), imgui.Cond.FirstUseEver)

    -- Body
    if imgui.Begin(u8 'ArepHelp', window_state, imgui.WindowFlags.AlwaysAutoResize) then
        if imgui.Button(u8 'Слежу', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Слежу')
            sampAddChatMessage('тест ' .. ini.cfg.player_nickname, -1)
            window_state[0] = false
        end
        imgui.SameLine()

        if imgui.Button(u8 'Иду', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Иду к вам')
            sampSendChat('/g ' .. ini.cfg.player_id)
            sampAddChatMessage('тест ' .. ini.cfg.player_id, -1)
            window_state[0] = false
        end
        imgui.SameLine()

        if imgui.Button(u8 'Работаю по жб', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, ' | Работаю по вашей жалобе |')
            sampAddChatMessage('тест ' .. ini.cfg.player_nickname, -1)
            window_state[0] = false
        end

        imgui.End()
    end
end)

-- Событие при появления диалога
function sampev.onShowDialog(id, style, title, button_1, button_2, text)
    local htitle = title:gsub('{%x%x%x%x%x%x}', '') -- удаляем hex-цветов что-то в формате {FFFFFF}
    local htext = text:gsub('{%x%x%x%x%x%x}', '')

    if (id == 5753 or htitle:find('Система репортов')) and htext:find('Жалоба от: %S-%[%d+%]') then
        local player_nickname, player_id = htext:match('Жалоба от: (%S-)%[(%d+)%]')
        ini.cfg.player_nickname = player_nickname
        ini.cfg.player_id = tonumber(player_id)
        configSave()
        sampAddChatMessage(string.format('Сохранено: ID=%d, Игровой ник=%s', ini.cfg.player_id, ini.cfg.player_nickname), -1)
        window_state[0] = true
    end
end

-- Основная функция для запуска скрипта
function main()
    sampRegisterChatCommand('reps', function()
        window_state[0] = not window_state[0]
    end)
    wait(-1)
end

Что изменилось:
- переделывал регулярное выражение
- изменил и рефакторил чтобы было понятно и читабельно код
- изменил значение в cfg

Вообще-то динамические константы, к примеру, ид игрока и быть в курсе достаточно указать в динамическую, вроде того
local data_report = {
status = false,
author = {
player_id = -1,
player_nickname = 'none'
}
}

чтобы переписывать: data_report.author.player_id = 441 и тд
data_report.author.player_id вернет 441 после изменений

%s - это пробелы, а вот есть такой нюанс в справочнике рег.выражение:
Исходник https://umodel.narod.ru/webhelp/ams/Program_Reference/Actions/RegExp_Lua.htm:
Для всех классов, представляемых одиночными символами (%a, %c, и т.п.), соответствующая прописная буква представляет отрицание класса.
Например, %S представляет все НЕ пробельные символы.
то получается %s экранирует на пробелы, а наоборот %S - на символах без пробела
 
Последнее редактирование:
  • Нравится
Реакции: fsrxvdd

BrLoader

Участник
Автор темы
64
9
Lua:
-- Библиотеки
local sampev = require('samp.events')
local ffi = require('ffi')
local gta = ffi.load('GTASA')
local imgui = require('mimgui')
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

-- Инициализация конфигурации
local inicfg = require('inicfg')
local ini_filepath = 'rephelp.ini'
local ini = inicfg.load({
    cfg = {
        player_nickname = 'null',
        player_id = -1,
    }
}, 'rephelp.ini')
inicfg.save(ini, ini_filepath)

-- Глобальные функция
-- Функция сохранения конфигурации
function configSave()
    inicfg.save(ini, ini_filepath)
    sampAddChatMessage('Конфигурация сохранена', -1)
end

-- Константы для фрейма имгуи
local window_state = imgui.new.bool(false)
local size_x, size_y = getScreenResolution()
local middle_size_x, middle_size_y = size_x / 2, size_y / 2

-- Фрейм imgui
local imgui_frame = imgui.OnFrame(function() return window_state[0] end, function(player)
    -- Header
    imgui.SetNextWindowPos(imgui.ImVec2(middle_size_x, middle_size_y), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(1200, 910), imgui.Cond.FirstUseEver)

    -- Body
    if imgui.Begin(u8 'ArepHelp', window_state, imgui.WindowFlags.AlwaysAutoResize) then
        if imgui.Button(u8 'Слежу', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Слежу')
            sampAddChatMessage('тест ' .. ini.cfg.player_nickname, -1)
            window_state[0] = false
        end
        imgui.SameLine()

        if imgui.Button(u8 'Иду', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Иду к вам')
            sampSendChat('/g ' .. ini.cfg.player_id)
            sampAddChatMessage('тест ' .. ini.cfg.player_id, -1)
            window_state[0] = false
        end
        imgui.SameLine()

        if imgui.Button(u8 'Работаю по жб', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, ' | Работаю по вашей жалобе |')
            sampAddChatMessage('тест ' .. ini.cfg.player_nickname, -1)
            window_state[0] = false
        end

        imgui.End()
    end
end)

-- Событие при появления диалога
function sampev.onShowDialog(id, style, title, button_1, button_2, text)
    local htitle = title:gsub('{%x%x%x%x%x%x}', '') -- удаляем hex-цветов что-то в формате {FFFFFF}
    local htext = text:gsub('{%x%x%x%x%x%x}', '')

    if (id == 5753 or htitle:find('Система репортов')) and htext:find('Жалоба от: %S-%[%d+%]') then
        local player_nickname, player_id = htext:match('Жалоба от: (%S-)%[(%d+)%]')
        ini.cfg.player_nickname = player_nickname
        ini.cfg.player_id = tonumber(player_id)
        configSave()
        sampAddChatMessage(string.format('Сохранено: ID=%d, Игровой ник=%s', ini.cfg.player_id, ini.cfg.player_nickname), -1)
        window_state[0] = true
    end
end

-- Основная функция для запуска скрипта
function main()
    sampRegisterChatCommand('reps', function()
        window_state[0] = not window_state[0]
    end)
    wait(-1)
end

Что изменилось:
- переделывал регулярное выражение
- изменил и рефакторил чтобы было понятно и читабельно код
- изменил значение в cfg

Вообще-то динамические константы, к примеру, ид игрока и быть в курсе достаточно указать в динамическую, вроде того
local data_report = {
status = false,
author = {
player_id = -1,
player_nickname = 'none'
}
}

чтобы переписывать: data_report.author.player_id = 441 и тд
data_report.author.player_id вернет 441 после изменений

%s - это пробелы, а вот есть такой нюанс в справочнике рег.выражение:

то получается %s экранирует на пробелы, а наоборот %S - на символах без пробела
Спасибо, лучший

Lua:
-- Библиотеки
local sampev = require('samp.events')
local ffi = require('ffi')
local gta = ffi.load('GTASA')
local imgui = require('mimgui')
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

-- Инициализация конфигурации
local inicfg = require('inicfg')
local ini_filepath = 'rephelp.ini'
local ini = inicfg.load({
    cfg = {
        player_nickname = 'null',
        player_id = -1,
    }
}, 'rephelp.ini')
inicfg.save(ini, ini_filepath)

-- Глобальные функция
-- Функция сохранения конфигурации
function configSave()
    inicfg.save(ini, ini_filepath)
    sampAddChatMessage('Конфигурация сохранена', -1)
end

-- Константы для фрейма имгуи
local window_state = imgui.new.bool(false)
local size_x, size_y = getScreenResolution()
local middle_size_x, middle_size_y = size_x / 2, size_y / 2

-- Фрейм imgui
local imgui_frame = imgui.OnFrame(function() return window_state[0] end, function(player)
    -- Header
    imgui.SetNextWindowPos(imgui.ImVec2(middle_size_x, middle_size_y), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(1200, 910), imgui.Cond.FirstUseEver)

    -- Body
    if imgui.Begin(u8 'ArepHelp', window_state, imgui.WindowFlags.AlwaysAutoResize) then
        if imgui.Button(u8 'Слежу', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Слежу')
            sampAddChatMessage('тест ' .. ini.cfg.player_nickname, -1)
            window_state[0] = false
        end
        imgui.SameLine()

        if imgui.Button(u8 'Иду', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Иду к вам')
            sampSendChat('/g ' .. ini.cfg.player_id)
            sampAddChatMessage('тест ' .. ini.cfg.player_id, -1)
            window_state[0] = false
        end
        imgui.SameLine()

        if imgui.Button(u8 'Работаю по жб', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, ' | Работаю по вашей жалобе |')
            sampAddChatMessage('тест ' .. ini.cfg.player_nickname, -1)
            window_state[0] = false
        end

        imgui.End()
    end
end)

-- Событие при появления диалога
function sampev.onShowDialog(id, style, title, button_1, button_2, text)
    local htitle = title:gsub('{%x%x%x%x%x%x}', '') -- удаляем hex-цветов что-то в формате {FFFFFF}
    local htext = text:gsub('{%x%x%x%x%x%x}', '')

    if (id == 5753 or htitle:find('Система репортов')) and htext:find('Жалоба от: %S-%[%d+%]') then
        local player_nickname, player_id = htext:match('Жалоба от: (%S-)%[(%d+)%]')
        ini.cfg.player_nickname = player_nickname
        ini.cfg.player_id = tonumber(player_id)
        configSave()
        sampAddChatMessage(string.format('Сохранено: ID=%d, Игровой ник=%s', ini.cfg.player_id, ini.cfg.player_nickname), -1)
        window_state[0] = true
    end
end

-- Основная функция для запуска скрипта
function main()
    sampRegisterChatCommand('reps', function()
        window_state[0] = not window_state[0]
    end)
    wait(-1)
end

Что изменилось:
- переделывал регулярное выражение
- изменил и рефакторил чтобы было понятно и читабельно код
- изменил значение в cfg

Вообще-то динамические константы, к примеру, ид игрока и быть в курсе достаточно указать в динамическую, вроде того
local data_report = {
status = false,
author = {
player_id = -1,
player_nickname = 'none'
}
}

чтобы переписывать: data_report.author.player_id = 441 и тд
data_report.author.player_id вернет 441 после изменений

%s - это пробелы, а вот есть такой нюанс в справочнике рег.выражение:

то получается %s экранирует на пробелы, а наоборот %S - на символах без пробела
Ещё как сделать чтоб брал айди с текста жалоб?

Lua:
-- Библиотеки
local sampev = require('samp.events')
local ffi = require('ffi')
local gta = ffi.load('GTASA')
local imgui = require('mimgui')
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8

-- Инициализация конфигурации
local inicfg = require('inicfg')
local ini_filepath = 'rephelp.ini'
local ini = inicfg.load({
    cfg = {
        player_nickname = 'null',
        player_id = -1,
    }
}, 'rephelp.ini')
inicfg.save(ini, ini_filepath)

-- Глобальные функция
-- Функция сохранения конфигурации
function configSave()
    inicfg.save(ini, ini_filepath)
    sampAddChatMessage('Конфигурация сохранена', -1)
end

-- Константы для фрейма имгуи
local window_state = imgui.new.bool(false)
local size_x, size_y = getScreenResolution()
local middle_size_x, middle_size_y = size_x / 2, size_y / 2

-- Фрейм imgui
local imgui_frame = imgui.OnFrame(function() return window_state[0] end, function(player)
    -- Header
    imgui.SetNextWindowPos(imgui.ImVec2(middle_size_x, middle_size_y), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(1200, 910), imgui.Cond.FirstUseEver)

    -- Body
    if imgui.Begin(u8 'ArepHelp', window_state, imgui.WindowFlags.AlwaysAutoResize) then
        if imgui.Button(u8 'Слежу', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Слежу')
            sampAddChatMessage('тест ' .. ini.cfg.player_nickname, -1)
            window_state[0] = false
        end
        imgui.SameLine()

        if imgui.Button(u8 'Иду', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Иду к вам')
            sampSendChat('/g ' .. ini.cfg.player_id)
            sampAddChatMessage('тест ' .. ini.cfg.player_id, -1)
            window_state[0] = false
        end
        imgui.SameLine()

        if imgui.Button(u8 'Работаю по жб', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, ' | Работаю по вашей жалобе |')
            sampAddChatMessage('тест ' .. ini.cfg.player_nickname, -1)
            window_state[0] = false
        end

        imgui.End()
    end
end)

-- Событие при появления диалога
function sampev.onShowDialog(id, style, title, button_1, button_2, text)
    local htitle = title:gsub('{%x%x%x%x%x%x}', '') -- удаляем hex-цветов что-то в формате {FFFFFF}
    local htext = text:gsub('{%x%x%x%x%x%x}', '')

    if (id == 5753 or htitle:find('Система репортов')) and htext:find('Жалоба от: %S-%[%d+%]') then
        local player_nickname, player_id = htext:match('Жалоба от: (%S-)%[(%d+)%]')
        ini.cfg.player_nickname = player_nickname
        ini.cfg.player_id = tonumber(player_id)
        configSave()
        sampAddChatMessage(string.format('Сохранено: ID=%d, Игровой ник=%s', ini.cfg.player_id, ini.cfg.player_nickname), -1)
        window_state[0] = true
    end
end

-- Основная функция для запуска скрипта
function main()
    sampRegisterChatCommand('reps', function()
        window_state[0] = not window_state[0]
    end)
    wait(-1)
end

Что изменилось:
- переделывал регулярное выражение
- изменил и рефакторил чтобы было понятно и читабельно код
- изменил значение в cfg

Вообще-то динамические константы, к примеру, ид игрока и быть в курсе достаточно указать в динамическую, вроде того
local data_report = {
status = false,
author = {
player_id = -1,
player_nickname = 'none'
}
}

чтобы переписывать: data_report.author.player_id = 441 и тд
data_report.author.player_id вернет 441 после изменений

%s - это пробелы, а вот есть такой нюанс в справочнике рег.выражение:

то получается %s экранирует на пробелы, а наоборот %S - на символах без пробела
А как ещё сделать чтоб диалог закрывался

После нажатия кнопки
 
Последнее редактирование:

kyrtion

Известный
1,321
485
Ещё как сделать чтоб брал айди с текста жалоб?
Экранировать текст жалобы и получить значение на %d+, узнать что не входит вне рамки 0-1000 ид игрока. Чекаешь он в сети ли. Если в сети, то устанавливаешь констант том что игрок жалует на определенного игрока

А как ещё сделать чтоб диалог закрывался
После нажатия кнопки
По моему если ты отправил ответ диалога, по идее должно закрыться или нет. Вроде есть такой функции sampCloseDialogButton(1) узнаешь
 

BrLoader

Участник
Автор темы
64
9
Экранировать текст жалобы и получить значение на %d+, узнать что не входит вне рамки 0-1000 ид игрока. Чекаешь он в сети ли. Если в сети, то устанавливаешь констант том что игрок жалует на определенного игрока


По моему если ты отправил ответ диалога, по идее должно закрыться или нет. Вроде есть такой функции sampCloseDialogButton(1) узнаешь
Можешь сделать? Ничего не понимаю
 

kyrtion

Известный
1,321
485
Можешь сделать? Ничего не понимаю
Что не понимаешь? Я так понял что ты просишь чего ты не понял. Изучаешь основное Lua (там которое нет функции в MoonLoader и другое, проще говоря, обычный луа), а потом уже перейдешь на MoonLoader (которые входят функция для гта-са и самп).

Lua:
-- Библиотеки
local sampev = require('samp.events')
local ffi = require('ffi')
local gta = ffi.load('GTASA')
local imgui = require('mimgui')
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local sf = string.format

-- Инициализация конфигурации
local data_report = {
    author_player_id = nil,
    author_player_nickname = 'none',
    text = 'none',
    select_player_id = nil,
    select_player_nickname = 'none',
}

-- Константы для фрейма имгуи
local window_state = imgui.new.bool(false)
local size_x, size_y = getScreenResolution()
local middle_size_x, middle_size_y = size_x / 2, size_y / 2

-- Фрейм imgui
local imgui_frame = imgui.OnFrame(function() return window_state[0] end, function(player)
    -- Header
    imgui.SetNextWindowPos(imgui.ImVec2(middle_size_x, middle_size_y), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(1200, 910), imgui.Cond.FirstUseEver)

    -- Body
    if imgui.Begin(u8 'ArepHelp', window_state, imgui.WindowFlags.AlwaysAutoResize) then
        if imgui.Button(u8 'Работаю по ЖБ', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Уважаемый игрок, начинаю работать по Вашей жалобе!')
            sampCloseCurrentDialogWithButton(0) -- hide dialog with button 0 (fix mobiles?)
            sampSendChat(sf('/re %d', data_report.author_player_id))
            window_state[0] = false
        end
        imgui.SameLine()

        if imgui.Button(u8 'Помочь автору', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Уважаемый игрок, сейчас попробую помочь Вам!')
            sampCloseCurrentDialogWithButton(0)
            sampSendChat(sf('/re %d', data_report.author_player_id))
            window_state[0] = false
        end
        imgui.SameLine()

        if imgui.Button(u8 'Следить по ID', imgui.ImVec2(180, 80)) then
            if data_report.select_player_id then
                sampSendDialogResponse(5753, 1, 0, 'Уважаемый игрок, начинаю работать по Вашей жалобе!')
                sampCloseCurrentDialogWithButton(0)
                sampSendChat(sf('/re %d', data_report.select_player_id))
                window_state[0] = false
            else
                sampAddChatMessage('В текст жалобы отсутствует ID!', -1)
            end
        end
        imgui.SameLine()

        if imgui.Button(u8 'Иду', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Уважаемый игрок, сейчас телепортирую к Вам!')
            sampCloseCurrentDialogWithButton(0)
            sampSendChat(sf('/g %d', data_report.author_player_id))
            window_state[0] = false
        end

        imgui.End()
    end
end)

-- Событие при появления диалога
function sampev.onShowDialog(dialog_id, style, title, button_1, button_2, text)
    -- удаляем hex-цветов в формате {FFFFFF}
    local htitle = title:gsub('{%x%x%x%x%x%x}', '')
    local htext = text:gsub('{%x%x%x%x%x%x}', ''):gsub('\n+', '\n')

    if
      (dialog_id == 5753 or htitle:find('Система репортов')) and -- dialog_id + title
      htext:find('Жалоба от: %S-%[%d+%]') and -- text
      htext:find('Текст жалобы:\n.-\nВведите ответ или нажмите ESC') -- text
    then
        local player_nickname, player_id = htext:match('Жалоба от: (%S-)%[(%d+)%]')
        local text_report = htext:match('Текст жалобы:\n(.-)\nВведите ответ или нажмите ESC')
        local selected_player_id = text_report:match('%d+')
        data_report.text = text_report
        data_report.author_player_nickname = player_nickname
        data_report.author_player_id = tonumber(player_id)
        data_report.select_player_id = tonumber(selected_player_id)
        if type(data_report.select_player_id) == 'number' and sampIsPlayerConnected(data_report.select_player_id) then
            data_report.select_player_nickname = sampGetPlayerNickname(data_report.select_player_id)
        else
            data_report.select_player_id = nil
            data_report.select_player_nickname = 'none'
        end
        window_state[0] = true
    end
end

-- Основная функция для запуска скрипта
function main()
    sampRegisterChatCommand('reps', function()
        window_state[0] = not window_state[0]
    end)
    wait(-1)
end
inicfg удалил, не имеет смысл
 

BrLoader

Участник
Автор темы
64
9
Что не понимаешь? Я так понял что ты просишь чего ты не понял. Изучаешь основное Lua (там которое нет функции в MoonLoader и другое, проще говоря, обычный луа), а потом уже перейдешь на MoonLoader (которые входят функция для гта-са и самп).

Lua:
-- Библиотеки
local sampev = require('samp.events')
local ffi = require('ffi')
local gta = ffi.load('GTASA')
local imgui = require('mimgui')
local encoding = require('encoding')
encoding.default = 'CP1251'
local u8 = encoding.UTF8
local sf = string.format

-- Инициализация конфигурации
local data_report = {
    author_player_id = nil,
    author_player_nickname = 'none',
    text = 'none',
    select_player_id = nil,
    select_player_nickname = 'none',
}

-- Константы для фрейма имгуи
local window_state = imgui.new.bool(false)
local size_x, size_y = getScreenResolution()
local middle_size_x, middle_size_y = size_x / 2, size_y / 2

-- Фрейм imgui
local imgui_frame = imgui.OnFrame(function() return window_state[0] end, function(player)
    -- Header
    imgui.SetNextWindowPos(imgui.ImVec2(middle_size_x, middle_size_y), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
    imgui.SetNextWindowSize(imgui.ImVec2(1200, 910), imgui.Cond.FirstUseEver)

    -- Body
    if imgui.Begin(u8 'ArepHelp', window_state, imgui.WindowFlags.AlwaysAutoResize) then
        if imgui.Button(u8 'Работаю по ЖБ', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Уважаемый игрок, начинаю работать по Вашей жалобе!')
            sampCloseCurrentDialogWithButton(0) -- hide dialog with button 0 (fix mobiles?)
            sampSendChat(sf('/re %d', data_report.author_player_id))
            window_state[0] = false
        end
        imgui.SameLine()

        if imgui.Button(u8 'Помочь автору', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Уважаемый игрок, сейчас попробую помочь Вам!')
            sampCloseCurrentDialogWithButton(0)
            sampSendChat(sf('/re %d', data_report.author_player_id))
            window_state[0] = false
        end
        imgui.SameLine()

        if imgui.Button(u8 'Следить по ID', imgui.ImVec2(180, 80)) then
            if data_report.select_player_id then
                sampSendDialogResponse(5753, 1, 0, 'Уважаемый игрок, начинаю работать по Вашей жалобе!')
                sampCloseCurrentDialogWithButton(0)
                sampSendChat(sf('/re %d', data_report.select_player_id))
                window_state[0] = false
            else
                sampAddChatMessage('В текст жалобы отсутствует ID!', -1)
            end
        end
        imgui.SameLine()

        if imgui.Button(u8 'Иду', imgui.ImVec2(180, 80)) then
            sampSendDialogResponse(5753, 1, 0, 'Уважаемый игрок, сейчас телепортирую к Вам!')
            sampCloseCurrentDialogWithButton(0)
            sampSendChat(sf('/g %d', data_report.author_player_id))
            window_state[0] = false
        end

        imgui.End()
    end
end)

-- Событие при появления диалога
function sampev.onShowDialog(dialog_id, style, title, button_1, button_2, text)
    -- удаляем hex-цветов в формате {FFFFFF}
    local htitle = title:gsub('{%x%x%x%x%x%x}', '')
    local htext = text:gsub('{%x%x%x%x%x%x}', ''):gsub('\n+', '\n')

    if
      (dialog_id == 5753 or htitle:find('Система репортов')) and -- dialog_id + title
      htext:find('Жалоба от: %S-%[%d+%]') and -- text
      htext:find('Текст жалобы:\n.-\nВведите ответ или нажмите ESC') -- text
    then
        local player_nickname, player_id = htext:match('Жалоба от: (%S-)%[(%d+)%]')
        local text_report = htext:match('Текст жалобы:\n(.-)\nВведите ответ или нажмите ESC')
        local selected_player_id = text_report:match('%d+')
        data_report.text = text_report
        data_report.author_player_nickname = player_nickname
        data_report.author_player_id = tonumber(player_id)
        data_report.select_player_id = tonumber(selected_player_id)
        if type(data_report.select_player_id) == 'number' and sampIsPlayerConnected(data_report.select_player_id) then
            data_report.select_player_nickname = sampGetPlayerNickname(data_report.select_player_id)
        else
            data_report.select_player_id = nil
            data_report.select_player_nickname = 'none'
        end
        window_state[0] = true
    end
end

-- Основная функция для запуска скрипта
function main()
    sampRegisterChatCommand('reps', function()
        window_state[0] = not window_state[0]
    end)
    wait(-1)
end
inicfg удалил, не имеет смысл
На мобайле походу нету sampCloseCurrentDialogWithButton(0)

На мобайле походу нету sampCloseCurrentDialogWithButton(0)
(error) rep99.lua: ...d/0/Android/media/com.arizona.game/monetloader/rep99.lua:35: attempt to call global 'sampCloseCurrentDialogWithButton' (a nil value)
stack traceback:
...d/0/Android/media/com.arizona.game/monetloader/rep99.lua:35: in function '_draw'
...d/media/com.arizona.game/monetloader/lib/mimgui/init.lua:100: in function <...d/media/com.arizona.game/monetloader/lib/mimgui/init.lua:84>
[19:14:01.972696] (error) rep99.lua: Script died due to an error.
 

kyrtion

Известный
1,321
485
На мобайле походу нету sampCloseCurrentDialogWithButton(0)


(error) rep99.lua: ...d/0/Android/media/com.arizona.game/monetloader/rep99.lua:35: attempt to call global 'sampCloseCurrentDialogWithButton' (a nil value)
stack traceback:
...d/0/Android/media/com.arizona.game/monetloader/rep99.lua:35: in function '_draw'
...d/media/com.arizona.game/monetloader/lib/mimgui/init.lua:100: in function <...d/media/com.arizona.game/monetloader/lib/mimgui/init.lua:84>
[19:14:01.972696] (error) rep99.lua: Script died due to an error.
ну хз тогда, монетлоадер не шарю, максимум ток мунлоадер (пк)