Какая функция делает проверку в каком элементе диалога находиться определённое название элемента?

.EOS

Участник
Автор темы
60
3
Версия SA-MP
  1. 0.3.7 (R1)
Какая функция делает проверку в диалоге типа dialog_style_list допустим есть ли в этом типе элемент жареное мясо?
 

Adrian G.

Известный
Проверенный
521
454
Типа в какой строчке находится тот или иной текст?
Lua:
function sampGetListboxItemByText(text, plain)
    if not sampIsDialogActive() then return -1 end
        plain = not (plain == false)
    for i = 0, sampGetListboxItemsCount() - 1 do
        if sampGetListboxItemText(i):find(text, 1, plain) then
            return i
        end
    end
    return -1
end

Юзается так
Lua:
listbox = sampGetListboxItemByText('Жареное мясо') --выведет номер строчки диалога с этими словами
 

Hatiko

Известный
Проверенный
1,471
612
Тут двумя способами можно сделать проверку, но покажу пример на одном, он более оптимальный мне кажется.
1. Получаем общее кол-во элементов в списке с помощью функции sampGetListboxItemsCount(), далее в цикле просто перебираешь от 0 до N элементов и в процессе цикла получать текст элемента через функцию sampGetListboxItemText(id)

Lua:
if style == 2 then -- Проверка на стиль диалога, который должен иметь стиль list.
    local count = sampGetListboxItemsCount()-1 -- получаем макс. с вычитанием 1, т.к. ID элементов от нуля считаются
    for i = 0, count do
        if sampGetListboxItemText(i):find("Жаренное мясо") then
            -- OK. При удачном совпадении выходим из цикла.
            break
        end
    end
end

2. Получаем текст всего диалога и перебираем построчно через gmatch.
 

.EOS

Участник
Автор темы
60
3
Тут двумя способами можно сделать проверку, но покажу пример на одном, он более оптимальный мне кажется.
1. Получаем общее кол-во элементов в списке с помощью функции sampGetListboxItemsCount(), далее в цикле просто перебираешь от 0 до N элементов и в процессе цикла получать текст элемента через функцию sampGetListboxItemText(id)

Lua:
if style == 2 then -- Проверка на стиль диалога, который должен иметь стиль list.
    local count = sampGetListboxItemsCount()-1 -- получаем макс. с вычитанием 1, т.к. ID элементов от нуля считаются
    for i = 0, count do
        if sampGetListboxItemText(i):find("Жаренное мясо") then
            -- OK. При удачном совпадении выходим из цикла.
            break
        end
    end
end

2. Получаем текст всего диалога и перебираем построчно через gmatch.
Можете написать код 2 способа а то у меня первый способ не работает
 

.EOS

Участник
Автор темы
60
3
Тут двумя способами можно сделать проверку, но покажу пример на одном, он более оптимальный мне кажется.
1. Получаем общее кол-во элементов в списке с помощью функции sampGetListboxItemsCount(), далее в цикле просто перебираешь от 0 до N элементов и в процессе цикла получать текст элемента через функцию sampGetListboxItemText(id)

Lua:
if style == 2 then -- Проверка на стиль диалога, который должен иметь стиль list.
    local count = sampGetListboxItemsCount()-1 -- получаем макс. с вычитанием 1, т.к. ID элементов от нуля считаются
    for i = 0, count do
        if sampGetListboxItemText(i):find("Жаренное мясо") then
            -- OK. При удачном совпадении выходим из цикла.
            break
        end
    end
end

2. Получаем текст всего диалога и перебираем построчно через gmatch.
а работает с dialog_style_tablist?
 

Hatiko

Известный
Проверенный
1,471
612
способ не работает
Где пытаешься использовать, в цикле каком-то или в хуке события? Какой результат должен быть после определения, что имеется пункт жаренное мясо?
Также убедись, что файл сохранён в кодировке ANSI 1251 или Windows 1251
Вот к примеру, в хуке события:

Lua:
local ev = require 'lib.samp.events'

function ev.onShowDialog(id, st, tit, b1, b2, tx)
    lua_thread.create(function() -- В данном способе приходится создавать доп.поток, чтобы функция sampGetListboxItemsCount корректно работала
        wait(0)
        local count = sampGetListboxItemsCount()-1
        for i = 0, count do
            if sampGetListboxItemText(i):find("Жаренное мясо") then
                print("Жаренное мясо в пункте: "..i)
                break
            end
        end
    end)
end

Второй способ такой подразумевал. В моём примере не учтены некоторые моменты, но если потребуется в дальнейшем разберёмся.
Lua:
local ev = require 'lib.samp.events'

function ev.onShowDialog(id, st, tit, b1, b2, tx)
    local count = 0
    for line in tx:gmatch("[^\n\r]+") do
        if line:find("Жаренное мясо") then
            print("Жаренное мясо в пункте: "..count)
        end
        count = count + 1
    end  
end
Прикрепи скриншот этого диалога на всякий случай.
 

.EOS

Участник
Автор темы
60
3
Где пытаешься использовать, в цикле каком-то или в хуке события? Какой результат должен быть после определения, что имеется пункт жаренное мясо?
Также убедись, что файл сохранён в кодировке ANSI 1251 или Windows 1251
Вот к примеру, в хуке события:

Lua:
local ev = require 'lib.samp.events'

function ev.onShowDialog(id, st, tit, b1, b2, tx)
    lua_thread.create(function() -- В данном способе приходится создавать доп.поток, чтобы функция sampGetListboxItemsCount корректно работала
        wait(0)
        local count = sampGetListboxItemsCount()-1
        for i = 0, count do
            if sampGetListboxItemText(i):find("Жаренное мясо") then
                print("Жаренное мясо в пункте: "..i)
                break
            end
        end
    end)
end

Второй способ такой подразумевал. В моём примере не учтены некоторые моменты, но если потребуется в дальнейшем разберёмся.
Lua:
local ev = require 'lib.samp.events'

function ev.onShowDialog(id, st, tit, b1, b2, tx)
    local count = 0
    for line in tx:gmatch("[^\n\r]+") do
        if line:find("Жаренное мясо") then
            print("Жаренное мясо в пункте: "..count)
        end
        count = count + 1
    end 
end
Прикрепи скриншот этого диалога на всякий случай.
Это будет работать со стилем dialog_style_tablist?