[Помощь] Как брать информацию с диалога, и вывести в чат

hinazuki

Потрачен
Автор темы
344
94
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Версия MoonLoader
.026-beta
У меня есть вот такой самповский диалог со списком. Мне теперь надо как то брать информацию со списка, а именно название и номер списка. И куда то вывести. Например в чат.
Думаю понятно обьяснил
IMG_20210204_124156.jpg
 

hinazuki

Потрачен
Автор темы
344
94
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

hinazuki

Потрачен
Автор темы
344
94
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

hinazuki

Потрачен
Автор темы
344
94
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

Vintik

Через тернии к звёздам
Проверенный
1,556
1,027
Привет, кину тебе полный код, чтобы не было крашей и т. д. 😀

Lua:
local sampev = require 'lib.samp.events'
local imgui = require 'mimgui'
local vkeys = require 'vkeys'
local encoding = require 'encoding'
encoding.default = 'CP1251'
u8 = encoding.UTF8
local wm = require 'windows.message'
local new = imgui.new
local renderWindow = new.bool()
local sizeX, sizeY = getScreenResolution()

local dialog_list = {} -- список, состоящий их строк; каждая из них – текст соответствующего пункта

function sampev.onShowDialog(dialogId, style, title, button1, button2, text)
  if title == 'MainMenu' then -- проверка, что это твой диалог (по заголовку)
    dialog_list = {} -- очищаем список
    local cstr = '' -- текущая строка
    for i = 1, text:len() do -- проходимся по всем символам строки
      if text:sub(i, i) == '\n' then -- если перенос строки
        table.insert(dialog_list, cstr) -- добавляем в список последнюю строку (до предыдущего переноса)
        cstr = '' -- очищаем текущую строку
      else -- если проверяемный символ – НЕ перенос строки
        cstr = cstr .. text:sub(i, i) -- добавляем символ в "текущую строку"
        if i == text:len() then -- если последний символ
          table.insert(dialog_list, cstr)
        end
      end
    end
  end
end

local newFrame = imgui.OnFrame(
    function() return renderWindow[0] end,
    function(player)
        imgui.SetNextWindowPos(imgui.ImVec2(sizeX / 2, sizeY / 2), imgui.Cond.FirstUseEver, imgui.ImVec2(0.5, 0.5))
        imgui.SetNextWindowSize(imgui.ImVec2(200, 150), imgui.Cond.FirstUseEver)
        imgui.Begin('Dialog text window', renderWindow)
        imgui.Text(u8'Текст последнего диалога:\n')
        for i = 1, #dialog_list do
          imgui.Text(u8(dialog_list[i]))
        end
        imgui.End()
    end
)

function main()
    addEventHandler('onWindowMessage', function(msg, wparam, lparam)
        if msg == wm.WM_KEYDOWN or msg == wm.WM_SYSKEYDOWN then
            if wparam == vkeys.VK_X and not sampIsCursorActive() then
                renderWindow[0] = not renderWindow[0] -- при нажатии X изменяем состояние окна (вкл. на выкл. и наоборот)
            end
        end
    end)
    wait(-1)
end

Теперь по идее при нажатии X должно открываться imgui окно и выводиться в него текст последнего диалога. Комментарии к коду читай. Кодировку скрипта поставь Win-1251.
Ну и скачай это для работы: mimgui, SAMP.Lua.

P. S. Особенность в том, что каждая строка отдельно – то есть можно сделать так, что, например, при клике на какую-то из них будет происходить одно действие, а ну другую – другое. Так же можно менять цвет строк.
 
Последнее редактирование:
  • Нравится
Реакции: monolith04