Помогите с onShowDialog

sadik~

Известный
Автор темы
156
62
Версия MoonLoader
.027.0-preview
Подскажите, как лучше обрабатывать диалоговые окна, если у них одинаковый ID и Title. Не могу понять, как определить, какое именно окно открыто в данный момент.


Вот лог диалоговых окон для наглядности:


Код:
[02:22:28.982886] (script) DialogInfo: [DialogInfo]: DialogInfo Loaded! Автор: bubn
[02:22:30.998422] (script) DialogInfo: Dialog shown!
[DialogInfo]: Dialog ID: 32700
[DialogInfo]: Dialog Title: [FFCD00]База рыболовов
[DialogInfo]: Dialog text: 1. Наживки и припасы 2. Купить удочку 3. Взвесить и продать рыбу 4. Информация о рыбалке 5. Мой навык работы рыболова 6. ТОП-15 рыбаков 7. Арендовать лодку 8. Призы и награды 9. Эксклюзивные сувениры
[DialogInfo]: Dialog Style: 2
[DialogInfo]: Dialog Button1: Выбрать
[DialogInfo]: Dialog Button2: Выход


[02:22:32.593839] (script) DialogInfo: Dialog shown!
[DialogInfo]: Dialog ID: 32700
[DialogInfo]: Dialog Title: [FFCD00]База рыболовов
[DialogInfo]: Dialog text: Товар Покупка Продажа Червь 30$ 10$ Каша 75$ 20$ Опарыш 150$ 30$ Мотыль 300$ 100$ Кусочки мяса 1000$ 250$ Мусор 0$ 20$
[DialogInfo]: Dialog Style: 5
[DialogInfo]: Dialog Button1: Выбрать
[DialogInfo]: Dialog Button2: Назад


[02:22:33.298692] (script) DialogInfo: Dialog shown!
[DialogInfo]: Dialog ID: 32700
[DialogInfo]: Dialog Title: [FFCD00]База рыболовов
[DialogInfo]: Dialog text: Купить Продать
[DialogInfo]: Dialog Style: 2
[DialogInfo]: Dialog Button1: Выбрать
[DialogInfo]: Dialog Button2: Назад


[02:22:33.961900] (script) DialogInfo: Dialog shown!
[DialogInfo]: Dialog ID: 32700
[DialogInfo]: Dialog Title: [FFCD00]База рыболовов
[DialogInfo]: Dialog text: Введите необходимое вам число товара к покупке или продаже
[DialogInfo]: Dialog Style: 1
[DialogInfo]: Dialog Button1: Далее
[DialogInfo]: Dialog Button2: Назад


[02:22:36.515271] (script) DialogInfo: Dialog shown!
[DialogInfo]: Dialog ID: 32700
[DialogInfo]: Dialog Title: [FFCD00]База рыболовов
[DialogInfo]: Dialog text: Вы действительно хотите купить "Червь" в количестве 8 за 240$ (30$ за штуку)?
[DialogInfo]: Dialog Style: 0
[DialogInfo]: Dialog Button1: Да
[DialogInfo]: Dialog Button2: Нет


[02:22:37.463041] (script) DialogInfo: Dialog shown!
[DialogInfo]: Dialog ID: 32700
[DialogInfo]: Dialog Title: [FFCD00]База рыболовов
[DialogInfo]: Dialog text: Вы успешно купили "Червь" в количестве 8 за 240$ (30$ за штуку)
[DialogInfo]: Dialog Style: 0
[DialogInfo]: Dialog Button1: Назад
[DialogInfo]: Dialog Button2: Выход

Хочу сделать такую последовательность:

  • Выбрать Наживки и припасы → нажимает Button1: Выбрать
  • Выбирает Червь 30$ 10$ → нажимает Button1: Выбрать
  • Выбирает Купить → нажимает Button1: Выбрать
  • Вводит количество товара (например, 8) → нажимает Button1: Далее
  • Подтверждает покупку → нажимает Button1: Да
  • После успешной покупки → нажимает Button2: Выход


Как правильно отличать одно диалоговое окно от другого, если ID и Title одинаковые, чтобы, например, обрабатывать каждый шаг покупки последовательно? Есть ли надёжный способ ориентироваться на содержимое текста или стиль окна, чтобы понимать, какое именно диалоговое окно открыто в данный момент?
 

Tema05

Известный
1,617
535
А чем id и title такие особенные и категориально отличаются от других параметров диалога? Определение чего угодно в скриптах происходит по каким-либо условиям на основании доступных данных.

Тут данных для определения каждого конкретного диалога более чем достаточно. У них разный текст, стиль, кнопки. Так что не ясно, что именно ты хочешь услышать?
 

sadik~

Известный
Автор темы
156
62
А чем id и title такие особенные и категориально отличаются от других параметров диалога? Определение чего угодно в скриптах происходит по каким-либо условиям на основании доступных данных.

Тут данных для определения каждого конкретного диалога более чем достаточно. У них разный текст, стиль, кнопки. Так что не ясно, что именно ты хочешь услышать?
Я обрабатываю диалоги пошагово через проверку id, style и text:find(...).

Но почему-то в одном из диалогов при попытки выбрать Продать всё, сервер возвращает в чат ошибку, якобы нельзя купить этот предмет. А если самому выбрать Продать всё, тогда вылезает следующее, нужно диалоговое окно.


Вот код:​


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

function sampev.onShowDialog(id, style, title, button1, button2, text)
  
    if style == 2 and text:find("Продать") then
        sampSendDialogResponse(32700, 1, 1, "")
        return
    end
end

Всё, разобрался в чём проблема.
Ранее я пытался отправлять ответ через:
Код:
sampSendDialogResponse(32700, 1, 1, "")
и получал ошибку от сервера «Нельзя купить этот предмет».
После разбирательств оказалось, что сервер ориентируется на текст выбранной строки, а не на индекс. Поэтому правильный способ — передавать текст пункта:

Lua:
local sampev = require 'lib.samp.events'
function sampev.onShowDialog(id, style, title, button1, button2, text)
if style == 2 and text:find("Продать все") then
sampSendDialogResponse(id, 1, 1, "Продать все")
end
end
Работает корректно: диалог выбирается автоматически, сервер принимает выбор, и ошибок больше нет.
Надеюсь, это поможет другим, кто сталкивался с подобной проблемой.
 

Вложения

  • sa-mp-003.png
    sa-mp-003.png
    55.3 KB · Просмотры: 41
Последнее редактирование:

fsrxvdd

Активный
283
70
Я обрабатываю диалоги пошагово через проверку id, style и text:find(...).

Но почему-то в одном из диалогов при попытки выбрать Продать всё, сервер возвращает в чат ошибку, якобы нельзя купить этот предмет. А если самому выбрать Продать всё, тогда вылезает следующее, нужно диалоговое окно.


Вот код:​


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

function sampev.onShowDialog(id, style, title, button1, button2, text)
 
    if style == 2 and text:find("Продать") then
        sampSendDialogResponse(32700, 1, 1, "")
        return
    end
end

Всё, разобрался в чём проблема.
Ранее я пытался отправлять ответ через:
Код:
sampSendDialogResponse(32700, 1, 1, "")
и получал ошибку от сервера «Нельзя купить этот предмет».
После разбирательств оказалось, что сервер ориентируется на текст выбранной строки, а не на индекс. Поэтому правильный способ — передавать текст пункта:

Lua:
local sampev = require 'lib.samp.events'
function sampev.onShowDialog(id, style, title, button1, button2, text)
if style == 2 and text:find("Продать все") then
sampSendDialogResponse(id, 1, 1, "Продать все")
end
end
Работает корректно: диалог выбирается автоматически, сервер принимает выбор, и ошибок больше нет.
Надеюсь, это поможет другим, кто сталкивался с подобной проблемой.
мне интересно как ты передаешь название кнопки туда, где должен быть input
 
  • Bug
  • Эм
Реакции: Tema05 и XRLM

XRLM

Против ветра рождённый
Модератор
1,631
1,281
мне интересно как ты передаешь название кнопки туда, где должен быть input
если что, когда ты выбираешь listitem в диалоге, то самп так же отправляет его текст в качестве вводимых данных
 
  • Грустно
Реакции: fsrxvdd

Tema05

Известный
1,617
535
Я обрабатываю диалоги пошагово через проверку id, style и text:find(...).

Но почему-то в одном из диалогов при попытки выбрать Продать всё, сервер возвращает в чат ошибку, якобы нельзя купить этот предмет. А если самому выбрать Продать всё, тогда вылезает следующее, нужно диалоговое окно.


Вот код:​


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

function sampev.onShowDialog(id, style, title, button1, button2, text)
 
    if style == 2 and text:find("Продать") then
        sampSendDialogResponse(32700, 1, 1, "")
        return
    end
end

Всё, разобрался в чём проблема.
Ранее я пытался отправлять ответ через:
Код:
sampSendDialogResponse(32700, 1, 1, "")
и получал ошибку от сервера «Нельзя купить этот предмет».
После разбирательств оказалось, что сервер ориентируется на текст выбранной строки, а не на индекс. Поэтому правильный способ — передавать текст пункта:

Lua:
local sampev = require 'lib.samp.events'
function sampev.onShowDialog(id, style, title, button1, button2, text)
if style == 2 and text:find("Продать все") then
sampSendDialogResponse(id, 1, 1, "Продать все")
end
end
Работает корректно: диалог выбирается автоматически, сервер принимает выбор, и ошибок больше нет.
Надеюсь, это поможет другим, кто сталкивался с подобной проблемой.
99% вопросов тут о скриптах под Аризону. Там всё равно на текст при выборе пункта списка. У тебя очевидно работа с каким-то другим сервером и там это оказалось важно. Походу проблема была как раз в этом, а не в определении диалогов. Рад за тебя, что разобрался 👍