Многофункциональная современная библиотека для работы с диалоговыми окнами, позволяющая создавать, как отдельные самостоятельные диалоги, так и связанные в цепочку. Простота взаимодействия с DialogTree экономит большое количество времени при разработке собственных проектов. Подключать необходимо после стандартных библиотек.
#include <DialogTree>
Преимущества данной библиотеки:
- ■ Возможность задать отображаемую информацию в виде статичных данных или результата выполняемой функции в момент открытия диалога.
■ Создание связей между диалогами и быстрый переход от одного к другому без необходимости каждый раз указывать параметры для открытия.
■ Дополнительные стили диалогов для вывода информации по страницам работающие в автоматическом режиме.
■ Встроенный редактор диалогов с возможностью экспорта готового кода для использования.
■ Обработка каждого диалога в отдельной функции по имени, без необходимости следить за порядковым ID диалогов.
Встроенный редактор диалогов |
---|
[Показать]
- Для включения встроенного редактора необходимо активировать опцию:
#define DIALOG_TREE_EDITOR
- * При включённой опции DIALOG_TREE_LITE редактор будет отключён автоматически
Функция для перехода в редактор [Показать]
- ■ playerid - игрок
* одновременно может быть включён только 1 редактор
DialogTreeEditor(playerid)
Основные функции библиотеки |
---|
[Показать]
Тег для указания имени диалога [Показать]
- ■ name - имя элемента
Dialog:name
Создать новый диалог [Показать]
- ■ parent - имя родительского элемента (дерево)
■ dialog - имя нового элемента, необязательный параметр (ветвь)
* если указан один параметр - функция создаёт элемент не привязанный к другим
CreateDialog(const parent[], const dialog[]="")
Обработчик диалога [Показать]
- ■ name - имя элемента
OnDialog:name(playerid)
Открыть диалог [Показать]
- ■ playerid - игрок
■ dialog - имя элемента, необязательный параметр
■ style - стиль диалога, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
■ caption - название диалога, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
■ info - информация диалога, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
■ left - левая кнопка, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
■ right - правая кнопка, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
* если не указано имя элемента - произойдёт переоткрытие текущего диалога
OpenPlayerDialog(playerid, const dialog[]="", const style=INVALID_DIALOG_ID, const caption[]="", const info[]="", const left[]="", const right[]="")
Вернуться к предыдущему диалогу в цепочке [Показать]
- ■ playerid - игрок
■ style - стиль диалога, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
■ caption - название диалога, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
■ info - информация диалога, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
■ left - левая кнопка, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
■ right - правая кнопка, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
* в случае, если нынешний элемент является начальным - функция вернёт 0
OpenBackPlayerDialog(playerid, const style=INVALID_DIALOG_ID, const caption[]="", const info[]="", const left[]="", const right[]="")
Перейти на следующий диалог в цепочке [Показать]
- ■ playerid - игрок
■ dialog - имя дочернего элемента, необязательный параметр
■ style - стиль диалога, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
■ caption - название диалога, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
■ info - информация диалога, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
■ left - левая кнопка, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
■ right - правая кнопка, необязательный параметр (внесённые данные заменяет данные по-умолчанию)
* в случае, если нынешний элемент является последним - функция вернёт 0
* без указания диалога, откроется следующий первый привязанный диалог
OpenNextPlayerDialog(playerid, const dialog[]="", const style=INVALID_DIALOG_ID, const caption[]="", const info[]="", const left[]="", const right[]="")
Закрыть диалог [Показать]
- ■ playerid - игрок
ClosePlayerDialog(playerid)
Получить дочерний элемент [Показать]
- ■ dialog - имя элемента
■ offset - смещение по ветвям (перечисление начинается с 0)
■ string - массив для записи результата
* если у элемента нет дочерних элементов или указан недействительный сдвиг - string будет пуст
GetDialogReferral(const dialog[], offset, string[])
Получить общее количество используемых диалогов [Показать]
- * функция возвращает int
GetDialogCount()
Функции по настройке диалога |
---|
[Показать]
Установить стиль диалога по умолчанию [Показать]
- ■ dialog - имя элемента
■ style - стиль диалога
SetDefaultDialogStyle(const dialog[], const style)
Установить название и цвет диалога по умолчанию [Показать]
- ■ dialog - имя элемента
■ caption - название диалога
■ color - цвет текста, необязательный параметр (в формате string "rrggbb")
* если указан цвет - передаваемый текст будет окрашен в него, исключение в случае указанного цвета в начале строки
SetDefaultDialogCaption(const dialog[], const caption[], const color[]="")
Установить информацию и цвет диалога по умолчанию [Показать]
- ■ dialog - имя элемента
■ info - информация диалога
■ color - цвет текста, необязательный параметр (в формате string "rrggbb")
* если указан цвет - передаваемый текст будет окрашен в него, исключение в случае указанного цвета в начале строки. Не применяется на стили диалога "Список" и ему подобных.
SetDefaultDialogInfo(const dialog[], const info[], const color[]="")
Установить левую кнопку и цвет по умолчанию [Показать]
- ■ dialog - имя элемента
■ left - левая кнопка
■ color - цвет текста, необязательный параметр (в формате string "rrggbb")
* если указан цвет - передаваемый текст будет окрашен в него, исключение в случае указанного цвета в начале строки
SetDefaultDialogLeft(const dialog[], const left[], const color[]="")
Установить правую кнопку и цвет по умолчанию [Показать]
- ■ dialog - имя элемента
■ right - правая кнопка
■ color - цвет текста, необязательный параметр (в формате string "rrggbb")
* если указан цвет - передаваемый текст будет окрашен в него, исключение в случае указанного цвета в начале строки
SetDefaultDialogRight(const dialog[], const right[], const color[]="")
Установить функцию для определения стиля диалога по умолчанию [Показать]
- ■ dialog - имя элемента
■ function - имя функции
SetFunctionDialogStyle(const dialog[], const function[])
Установить функцию для определения названия диалога по умолчанию [Показать]
- ■ dialog - имя элемента
■ function - имя функции
SetFunctionDialogCaption(const dialog[], const function[])
Установить функцию для определения информации диалога по умолчанию [Показать]
- ■ dialog - имя элемента
■ function - имя функции
SetFunctionDialogInfo(const dialog[], const function[])
Установить функцию для определения левой кнопки по умолчанию [Показать]
- ■ dialog - имя элемента
■ function - имя функции
SetFunctionDialogLeft(const dialog[], const function[])
Установить функцию для определения правой кнопки по умолчанию [Показать]
- ■ dialog - имя элемента
■ function - имя функции
SetFunctionDialogRight(const dialog[], const function[])
Обработчик диалоговой функции [Показать]
- ■ name - имя элемента
DialogFunction:name(playerid)
Обновить стиль диалога [Показать]
- ■ playerid - игрок
■ dialog - имя элемента
■ style - стиль диалога
* данная функция должна использоваться в функции, которая указана в SetFunctionDialogStyle
UpdateDialogStyle(playerid, const style)
Обновить название диалога [Показать]
- ■ playerid - игрок
■ dialog - имя элемента
■ caption - название диалога
* данная функция должна использоваться в функции, которая указана в SetFunctionDialogCaption
UpdateDialogCaption(playerid, const caption[])
Обновить информацию диалога [Показать]
- ■ playerid - игрок
■ dialog - имя элемента
■ info - информация диалога
* данная функция должна использоваться в функции, которая указана в SetFunctionDialogInfo
UpdateDialogInfo(playerid, const info[])
Обновить левую кнопку диалога [Показать]
- ■ playerid - игрок
■ dialog - имя элемента
■ left - левая кнопка диалога
* данная функция должна использоваться в функции, которая указана в SetFunctionDialogLeft
UpdateDialogLeft(playerid, const left[])
Обновить правую кнопку диалога [Показать]
- ■ playerid - игрок
■ dialog - имя элемента
■ right - правая кнопка диалога
* данная функция должна использоваться в функции, которая указана в SetFunctionDialogRight
UpdateDialogRight(playerid, const right[])
Функции взаимодействия с игроком |
---|
[Показать]
Вызывается перед показом диалога [Показать]
- ■ playerid - игрок
■ dialog - обрабатываемый элемент
* если в функции вернуть 0 - диалог не будет показан
OnPlayerDialogReceived(playerid, const dialog[])
Узнать открыт ли у игрока диалог [Показать]
- ■ playerid - игрок
* функция возвращает bool
IsPlayerOpenDialog(playerid)
Получить нынешний элемент [Показать]
- ■ playerid - игрок
■ string - массив для записи результата
GetPlayerDialog(playerid, string[])
Узнать нажата ли левая кнопка [Показать]
IsDialogResponseLeft()
Узнать нажата ли правая кнопка [Показать]
IsDialogResponseRight()
Узнать нажат ли ESC [Показать]
- * возможно использовать при активной опции DIALOG_BUTTON_ESC
IsDialogResponseESC()
Получить выбранный элемент в диалоге [Показать]
- * функция возвращает int
GetDialogListitem()
Получить введённый (выбранный) текст [Показать]
- * функция возвращает string
GetDialogInputtext()
Получить открытую страницу диалога [Показать]
- ■ playerid - игрок
GetPlayerDialogPage(playerid)
Опции библиотеки |
---|
[Показать]
Включить редактор диалогов [Показать]
#define DIALOG_TREE_EDITOR
Активировать режим «Lite» [Показать]
- «Lite» версия упрощает функционал DialogTree, позволяя не использовать функцию CreateDialog для создания диалога, но при этом пропадает возможность использовать функции OpenNextPlayerDialog и OpenBackPlayerDialog.
#define DIALOG_TREE_LITE
Активировать режим «Parent» [Показать]
- При активации данного режима, в обработчике диалога необходимо указывать имя родительского элемента.
OnDialog:<Parent>Dialog(playerid)
#define DIALOG_TREE_PARENT
Включить прямую передачу массивов [Показать]
- Не рекомендуется включать данную опцию. При активации передачи массивов напрямую, такие функции, как GetDialogReferral, GetPlayerDialog - передают результат напрямую.
#define DIALOG_TREE_WITHOUT_ARRAY
Отключить страничные типы диалогов [Показать]
- При активации данной опции, страничные типы диалогов становятся недоступны.
#define DIALOG_TREE_WITHOUT_BOOK
Включить обнаружение нажатия клавиши ESC [Показать]
- Работает только при использовании Open MP. При активации данной опции появляется возможность отлеживать нажатие ESC при показанном диалоге. Определить нажатие возможно с помощью функции IsDialogResponseESC()
#define DIALOG_BUTTON_ESC
Доступные константы |
---|
[Показать]
Используемый ID диалога [Показать]
DIALOG_ID (32767)
Максимальное количество создаваемых диалогов [Показать]
MAX_DIALOG_ID (1000)
Недействительное числовое значение [Показать]
INVALID_DIALOG_ID (-1)
Максимальное количество символов для хранения цвета [Показать]
MAX_DIALOG_COLOR (8)
SIZE_DIALOG_COLOR (MAX_DIALOG_COLOR+1)
Максимальное количество символов для хранения имени диалога [Показать]
MAX_DIALOG_NAME (31)
SIZE_DIALOG_NAME (MAX_DIALOG_NAME+1)
Максимальное количество символов для хранения названия в диалоге [Показать]
MAX_DIALOG_CAPTION (64)
SIZE_DIALOG_CAPTION (MAX_DIALOG_CAPTION+1)
Максимальное количество символов для хранения описания в диалоге [Показать]
MAX_DIALOG_INFO (1024)
SIZE_DIALOG_INFO (MAX_DIALOG_INFO+1)
Максимальное количество символов для хранения кнопки в диалоге [Показать]
MAX_DIALOG_BUTTON (28)
SIZE_DIALOG_BUTTON (MAX_DIALOG_BUTTON+1)
Максимальное количество символов для хранения введённого текста в диалоге [Показать]
MAX_DIALOG_INPUTTEXT (128)
SIZE_DIALOG_INPUTTEXT (MAX_DIALOG_INPUTTEXT+1)
Максимальное количество строк в страничном стиле диалога [Показать]
MAX_DIALOG_ROW (100)
Используемые символы для перелистывания страниц диалога [Показать]
DIALOG_ARROW_LEFT ("<")
DIALOG_ARROW_RIGHT (">")
Поддерживаемые стили диалогов |
---|
[Показать]
Информационное сообщение [Показать]
DIALOG_STYLE_MSGBOX
Поле для ввода текста [Показать]
DIALOG_STYLE_INPUT
Отображение информации списком [Показать]
DIALOG_STYLE_LIST
Поле для ввода текста (символы скрыты) [Показать]
DIALOG_STYLE_PASSWORD
Отображение информации списком с разделением на столбцы [Показать]
DIALOG_STYLE_TABLIST
Отображение информации списком с разделением на столбцы с названиями для столбцов [Показать]
DIALOG_STYLE_TABLIST_HEADERS
Как DIALOG_STYLE_LIST, с возможностью перелистывания [Показать]
DIALOG_STYLE_BOOK<>
Как DIALOG_STYLE_TABLIST, с возможностью перелистывания [Показать]
DIALOG_STYLE_TABBOOK<>
Как DIALOG_STYLE_TABLIST_HEADERS, с возможностью перелистывания [Показать]
DIALOG_STYLE_TABBOOK_HEADERS<>
Возможные сообщения в логах |
---|
[Показать]
Повторное создание элемента [Показать]
[DialogTree] Dialog already created (Dialog)
Достигнут лимит по количество создаваемых элементов [Показать]
[DialogTree] Attempted to write array element at index 1001 in array of size 1000 (MAX_DIALOG_ID)
Указан неверный родительский или дочерний элемент [Показать]
[DialogTree] Function tag mismatch (<Parent>Dialog)
Пример использования |
---|
[Показать]
public OnGameModeInit() { if(CreateDialog(Dialog:PlayerMenu)) { SetDefaultDialogStyle(Dialog:PlayerMenu, DIALOG_STYLE_LIST); SetDefaultDialogCaption(Dialog:PlayerMenu, "Меню игрока"); SetDefaultDialogInfo(Dialog:PlayerMenu, "Информация об игроке\nНавыки игрока\nСвязь с администрацией\nПромо-код"); SetDefaultDialogLeft(Dialog:PlayerMenu, "Выбрать"); SetDefaultDialogRight(Dialog:PlayerMenu, "Закрыть"); } if(CreateDialog(Dialog:PlayerMenu, Dialog:pMenuInfo)) { SetDefaultDialogStyle(Dialog:pMenuInfo, DIALOG_STYLE_MSGBOX); SetDefaultDialogCaption(Dialog:pMenuInfo, "Меню игрока | Информация"); SetFunctionDialogInfo(Dialog:pMenuInfo, "GetPlayerMenuInfo"); SetDefaultDialogLeft(Dialog:pMenuInfo, "Закрыть"); SetDefaultDialogRight(Dialog:pMenuInfo, "Назад"); } if(CreateDialog(Dialog:PlayerMenu, Dialog:pMenuSkill)) { SetDefaultDialogStyle(Dialog:pMenuSkill, DIALOG_STYLE_TABLIST_HEADERS); SetDefaultDialogCaption(Dialog:pMenuSkill, "Меню игрока | Навыки"); SetFunctionDialogInfo(Dialog:pMenuSkill, "GetPlayerMenuSkill"); SetDefaultDialogLeft(Dialog:pMenuSkill, "Выбрать"); SetDefaultDialogRight(Dialog:pMenuSkill, "Назад"); } if(CreateDialog(Dialog:pMenuSkill, Dialog:wSkillDeagle); { SetDefaultDialogStyle(Dialog:wSkillDeagle, DIALOG_STYLE_MSGBOX); SetDefaultDialogLeft(Dialog:wSkillDeagle, "Назад"); } if(CreateDialog(Dialog:pMenuSkill, Dialog:wSkillAK47)) { SetDefaultDialogStyle(Dialog:wSkillAK47, DIALOG_STYLE_MSGBOX); SetDefaultDialogLeft(Dialog:wSkillAK47, "Назад"); } if(CreateDialog(Dialog:pMenuSkill, Dialog:wSkillM4)) { SetDefaultDialogStyle(Dialog:wSkillM4, DIALOG_STYLE_MSGBOX); SetDefaultDialogLeft(Dialog:wSkillM4, "Назад"); } if(CreateDialog(Dialog:PlayerMenu, Dialog:pMenuAdmin)) { SetDefaultDialogStyle(Dialog:pMenuAdmin, DIALOG_STYLE_INPUT); SetDefaultDialogCaption(Dialog:pMenuAdmin, "Меню игрока | Администрация"); SetDefaultDialogInfo(Dialog:pMenuAdmin, "Укажите свой вопрос администрации:"); SetDefaultDialogLeft(Dialog:pMenuAdmin, "Принять"); SetDefaultDialogRight(Dialog:pMenuAdmin, "Назад"); } if(CreateDialog(Dialog:PlayerMenu, Dialog:pMenuPromo) { SetDefaultDialogStyle(Dialog:pMenuPromo, DIALOG_STYLE_INPUT); SetDefaultDialogCaption(Dialog:pMenuPromo, "Меню игрока | Промок код"); SetDefaultDialogInfo(Dialog:pMenuPromo, "Укажите действующий промок код:"); SetDefaultDialogLeft(Dialog:pMenuPromo, "Принять"); SetDefaultDialogRight(Dialog:pMenuPromo, "Назад"); } return 1; }
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { if(newkeys == KEY_YES) OpenPlayerDialog(playerid, Dialog:PlayerMenu); return 1; }
OnDialog:PlayerMenu(playerid) { if(IsDialogResponseRight()) return ClosePlayerDialog(); enum { P_MENU_INFO, P_MENU_SKILL, P_MENU_ADMIN, P_MENU_PROMO } switch(GetDialogListitem()) { case P_MENU_INFO: OpenNextPlayerDialog(playerid, Dialog:pMenuInfo); case P_MENU_SKILL: OpenNextPlayerDialog(playerid, Dialog:pMenuSkill); case P_MENU_ADMIN: OpenNextPlayerDialog(playerid, Dialog:pMenuAdmin); case P_MENU_PROMO: OpenNextPlayerDialog(playerid, Dialog:pMenuPromo); } return 1; } OnDialog:pMenuInfo(playerid) { if(IsDialogResponseRight()) return OpenBackPlayerDialog(playerid); else return ClosePlayerDialog(); } OnDialog:pMenuSkill(playerid) { if(IsDialogResponseLeft()) { enum { SKILL_DEAGLE, SKILL_AK47, SKILL_M4 } new caption[SIZE_DIALOG_CAPTION], info[(70+1)]; format(info, sizeof info, "Для перехода на следующий уровень необходимо %i очков навыка", (random(100)+1)); switch(GetDialogListitem()) { case SKILL_DEAGLE: strcat(caption, "Навыки | Deagle"); case SKILL_AK47: strcat(caption, "Навыки | AK-47"); case SKILL_M4: strcat(caption, "Навыки | M4"); } new dialog[SIZE_DIALOG_NAME]; GetDialogReferral(Dialog:pMenuSkill, GetDialogListitem(), dialog); return OpenNextPlayerDialog(playerid, dialog, .caption=caption, .info=info); } else return OpenBackPlayerDialog(playerid); } OnDialog:wSkillDeagle(playerid) { return OpenBackPlayerDialog(playerid); } OnDialog:wSkillAK47(playerid) { return OpenBackPlayerDialog(playerid); } OnDialog:wSkillM4(playerid) { return OpenBackPlayerDialog(playerid); } OnDialog:pMenuAdmin(playerid) { if(IsDialogResponseRight()) return OpenBackPlayerDialog(playerid); if(!strlen(GetDialogInputtext())) return OpenPlayerDialog(playerid); SendClientMessage(playerid, 0xFF0000FF, GetDialogInputtext()); return ClosePlayerDialog(); } OnDialog:pMenuPromo(playerid) { if(IsDialogResponseRight()) return OpenBackPlayerDialog(playerid); if(!strlen(GetDialogInputtext())) return OpenPlayerDialog(playerid); SendClientMessage(playerid, 0x00FF00FF, GetDialogInputtext()); return ClosePlayerDialog(); }
DialogFunction:GetPlayerMenuInfo(playerid) { new const string[] = "Имя\t\t\t %s\nПол\t\t\t %s\nУровень\t\t\t%i\nДата регистрации\t%s"; new message[sizeof string + (MAX_PLAYER_NAME-2) + 5 + 2 + 11]; format(message, sizeof message, string, pInfo[playerid][pName], (pInfo[playerid][pGender]==0)?("мусжкой"):("женский"), (random(100)+1), "24.07.2017"); return UpdateDialogInfo(playerid, message); } DialogFunction:GetPlayerMenuSkill(playerid) { new const string[] = "Оружие\tуровень\nDeagle\t%i\nAK-47\t%i\nM4\t%i"; new message[sizeof string + 6]; format(message, sizeof message, string, random(10), random(10), random(10)); return UpdateDialogInfo(playerid, message); }
Скачать: DialogTree.inc [104,11К]
GitHub: DialogTree
Отдельная благодарность за предоставленную помощь в реализации:
Сообщение отредактировал M I S T E V: 16 января 2025 - 22:57