Редактор диалогов самп

Обновлено: 07.07.2024

Создание диалоговых окон может показаться сложнее чем это есть на самом деле. В этом уроке описано как можно создать диалоговое окно, с выбором элемента. В данном диалоге не будет использовано много функций, так как это только демонстрация.

В этом примере показано, как сделать диалоговое окно, дающее возможность купить себе напитки (используя SetPlayerSpecialAction) за определенное количество денег.

Диалоговое окно будет вызываться командой. Добавьте это в паблик - public OnPlayerCommandText(playerid, cmdtext[])

if(! strcmp ( cmdtext , "/выпивка" , true ))
ShowPlayerDialog ( playerid , 1 , DIALOG_STYLE_LIST , "Что из этого вы хотите выпить?" , "Sprunk ($1)\nПиво ($2)\nВино ($3)" , "Купить" , "Отмена" );
return 1 ;
>

Как вы видите, использована функция ShowPlayerDialog со вторым типом диалогового окна.
Используя \n можно добавлять несколько элементов. ( \n - перенос строки (добавление новой строки))
Сейчас мы должны указать что будет выполнятся при выборе какого-либо элемента, используя авто вызываемую функцию OnDialogResponse .

В паблик - public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) вставляем:

Если вы всё правильно делали, то диалоговое окно будет работать отлично. Чтобы его вызвать, надо набрать команду /выпивка .

В дальнейших уроках мы рассмотрим все типы диалогов по сложности и работу с ними. Для начала нужно ознакомиться со всеми диалогами, а затем постараюсь добавить уроки по каждому типу диалога.

Вызывается диалоговое окно функцией ShowPlayerDialog , структура функции такая:

Рассмотрим обычный пример: мы вводим команду, и появляется диалоговое окно с запросом о подтверждении выполнения команды. Для начала мы напишем скрипт простейшей команды в автовызываемую функцию OnPlayerCommandText

Затем с помощью функции ShowPlayerDialog мы вызовем данное диалоговое окно. Так как вызывать меню мы будем с помощью команды, то и пишем данную функцию, приведенную ниже внутри нее.

Цифра 0 - это идентификатор (ID) диалога, у каждого диалога свой ID.
DIALOG_STYLE_MSGBOX - название стиля диалога.

После стиля пишем название диалога. Далее пишем текст диалога и название первой и второй кнопки.
В общем, код будет выглядеть следующим образом:

Вид диалога в прикрепленном файле снизу, т.к мне нельзя вставлять картинку в текст.

В следующем уроке я разберу как создать диалог более сложного строения, с выполнением чего-либо



Выглядит данный диалог таким образом:

Идём дальше. DIALOG_STYLE_MSGBOX - данный диалог используется для красивого вывода информации,дабы не создавать лишний флуд в чат игроку.
Ко всем командам:
Для DC_CMD:

Информация: У вас в моде паблик отвечающий за диалоги может называться по другому
И в вставляем следующий код:
Информация: Измените id диалога,что бы он не совпадал уже с существующими



Данный диалог выглядит таким образом:

DIALOG_STYLE_INPUT и DIALOG_STYLE_PASSWORD одинаковы по своей сути. Отличаются они тем,что DIALOG_STYLE_PASSWORD - скрывает вводимые символы в диалоговое окно,вместо набранного текста появятся звёздочки,а DIALOG_STYLE_INPUT - не скрывает вводимые вами символы.
Ко всем командам:
Для DC_CMD:

Информация: У вас в моде паблик отвечающий за диалоги может называться по другому
И в вставляем следующий код:
Информация: Измените id диалога,что бы он не совпадал уже с существующими


Выглядит данный диалог таким образом:

Диалоги которые ввели в 0.3.7 версии
В новой версии SA:MP были введены два новых видов диалогов а именно:


DIALOG_STYLE_TABLIST - данный диалог зачастую используется на различных серверах при покупке чего либо,где указано название,цену и количество которое продастся вам.
Ко всем командам:
Для DC_CMD:



Выглядит данный диалог таким образом:

DIALOG_STYLE_TABLIST_HEADERS: - выглядит так-же как и предыдущий тип диалога,но в этом диалоге вы можете указать название чего-либо над диалоговым окном.
Ко всем командам:
Для DC_CMD:


Выглядит данный диалог таким образом:

Возвращаемые значения:
Данная функция не возвращает какого-либо конкретного значения.

Стили диалога:

0DIALOG_STYLE_MSGBOXОбычный диалог с 2-мя кнопками
1DIALOG_STYLE_INPUTДиалог с полем для ввода
2DIALOG_STYLE_LISTСписок из нескольких элементов
3DIALOG_STYLE_PASSWORDПозволяет игрокам вводить пароль не раскрывая его

Функция:
Вызывается диалоговое окно функцией ShowPlayerDialog, структура функции такая:

Упрощение:
Обычно, чтобы не запоминать цифры и не писать длинное название стилей диалогов, я заменяю их такими макросами:

Или можно использовать <ID> стиля диалогового окна

Для написания основного текста диалогового окна вы можете использовать нижеприведенную таблицу:

\bbackspaсe
\fForm feed
\nПереход на новую строку
\rВозврат каретки
\tТабуляция
\vВертикальная табуляция
\'Одиночная кавычка
\"Двойные кавычки
\?Вопросительный знак
Ответ на диалог:
Мы сделали диалоговое меню, состоящее из 9 пунктов. А нам надо сделать так, чтобы при нажатии на первый пункт, у нас появлялся другой диалог с другой информацией. Для этот мы будем использовать вот такой код:
Условные конструкции:
Вот примет одной конструкции

Пример диалога с использование условной конструкцией

Создадим команду с использование ZCMD (командный процессор)

Спойлер: Пример команды на стандартном командном процессере И в public OnDialogResponse мы добавим ответ на наш диалог
Креативизация:
Вы решили создать диалог, а он серы и скучный?
Мы можем раскрасить наш диалог в любые цвета формата RGB.
Пример:

Цвет мы заключаем в фигурную скобку "<" и ">"
FFFFFF - это белый цвет
3DB6F2 - светло-голубой
Думаю цвета вам не доставит большого труда отыскать. Для этого есть множество поисковых система.

Что же такое этот оператор switch?
Оператор switch – это оператор выбора. Он удобен в первую очередь тем, что может заменить много условий if, которые проверяют значение одной переменной.
Пример построения с этим оператором:
! Стоить отметить, что в официальной документации к языку написано: ‘In pawn, switch is a structured “if”‘, а это значит, что конструкция switch — это набор структурированных if’ов, отсюда следует, что switch не может работать быстрее if. Но это не всегда так.
Как видим — switch/case медленнее(значительно) if только на больших промежутках значений.

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

Данный метод подходит, когда есть некоторые переменные, которые нужно внедрить в текст.

Есть еще один метод, который более менее мне известный - это константная переменная. Этот пример часто встречается в RLS/SRL модах. Мне же не очень нравится этот метод.Причины: не очень читабельный для человека, в отличии от первого примера.

В пером случаи делается все давольно просто и знакомо, где после обьявления макроса, мы задаем имя и параметр.

Совет: для объявления макроса/директивы, лучше использовать имена в ВЕРХНЕМ регистре. Почему? А вот почему: если мы будем исползовать имена в нижнем регистре, то есть вероятность того, что мы сможем перепутать их с переменными.

Во втором случае мы добавим перечисление enum <>.

Само слово перечисление говорит нам о том, что мы будет перечислять по порядку от нуля до N-ного числа.

Читайте также: