Форум Pawn.Wiki - Воплоти мечту в реальность!: DialogTree - древовидный диалоговый процессор - Форум Pawn.Wiki - Воплоти мечту в реальность!

Перейти к содержимому

  • (3 Страниц) +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

DialogTree - древовидный диалоговый процессор современный обработчик диалогов Оценка: ***** 1 Голосов

#21
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Обновлено.

    ■   Добавлены новые функции для настройки диалога:

    SetFunctionDialogStyle(const dialog[], const function[])

    SetFunctionDialogCaption(const dialog[], const function[])

    SetFunctionDialogInfo(const dialog[], const function[])

    SetFunctionDialogLeft(const dialog[], const function[])

    SetFunctionDialogRight(const dialog[], const function[])

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


    ■   Добавлен новый обработчик для функций диалога:

    DialogFunction:name(playerid)

    С помощью данного обработчика вы можете создавать свои функции для диалогов.


    ■   Добавлены новые функции, которые необходимо использовать внутри функций созданных через DialogFunction:

    UpdateDialogStyle(playerid, const style)

    UpdateDialogCaption(playerid, const caption[])

    UpdateDialogInfo(playerid, const info[])

    UpdateDialogLeft(playerid, const left[])

    UpdateDialogRight(playerid, const right[])

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


    ■   Обновлён пример использования в описании библиотеки.


    Пример использования [Показать]





Добавлю от себя, что теперь вы можете задавать дефолтные значения в виде результата функции, которая выполнится в момент показа диалога. Это позволяет создавать диалоги сразу задавая им статичные и динамические значения. Использование функций OpenPlayerDialog и OpenBack/NextPlayerDialog становится ещё проще!

Приоритеты информации. Указывая информацию в функциях OpenPlayerDialog, OpenBackPlayerDialog, OpenNextPlayerDialog - будет выводиться именно она, даже если есть дефолтные значения. Если ничего не указывать, будет браться информация из заданых функций. Если функций нет, тогда будет браться информация из дефолтных значений.

Сообщение отредактировал M I S T E V: 05 января 2025 - 20:54

1

#22
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Последняя обнова (для 2024 :biggrin:)

    ■   Теперь данные функции являются макросами, которые работают напрямую с данными (response / listitem / inputtext) и не требуют создания переменных/массивов для записи результата в них

    IsDialogResponseLeft()

    IsDialogResponseRight()

    IsDialogResponseESC()

    GetDialogListitem()

    GetDialogInputtext()


    ■   Обновлён пример использования в теме.

Сообщение отредактировал M I S T E V: 02 января 2025 - 10:51

0

#23
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Обновлено.

    ■   Исправлена критическая ошибка связанная с функцией CallLocalFunction.


    Подробнее [Показать]



    ■   Обновлены названия функций взаимодействия с игроком:

    IsDialogResponseLeft()

    IsDialogResponseRight()

    IsDialogResponseESC()

    GetDialogListitem()

    GetDialogInputtext()

    ■   Исправлена ошибка с функцией ClosePlayerDialog, теперь необходимо указывать id игрока для которого необходимо закрыть диалог.

Сообщение отредактировал M I S T E V: 02 января 2025 - 10:40

0

#24
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Обновлено.

    ■   Добавлен редактор (конструктор) диалогов. Для включения необходимо перед подключением создать макрос:

    #define DIALOG_TREE_EDITOR

    При активной опции DIALOG_TREE_LITE - редактор будет автоматически отключён. Все экспортированные диалоги помещаются в папку scriptfiles с приставкой "DialogTree_" с расширением файла ".txt".

    Функция для перехода в редактор:

    DialogTreeEditor(playerid)


    Пример использования: [Показать]




    ■   Теперь функцию диалога можно задать для нескольких диалогов. Указание диалога в функциях ниже больше не требуется.

    UpdateDialogStyle(playerid, const style)

    UpdateDialogCaption(playerid, const caption[])

    UpdateDialogInfo(playerid, const info[])

    UpdateDialogLeft(playerid, const left[])

    UpdateDialogRight(playerid, const right[])


    ■   Цвет, указанный в функциях настройки диалога по умолчанию, не применяется в диалогах со стилем список и ему подобных.

Сообщение отредактировал M I S T E V: 07 января 2025 - 21:01

1

#25
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Обновлено.

    ■   Исправлена несовместимость с упакованными строками.

0

#26
Пользователь офлайн   continue 

  • Эксперт
  • Вставить ник
  • Раскрыть информацию
Научись использовать git. Я хочу посмотреть код, а мне нужно качать файл...


1) Можно без циклов же...

    for(new i = 0; i < MAX_DIALOG_ID; i++)
    {
        dtreeDefaultDialogStyle[i] = INVALID_DIALOG_ID;

        #if !defined DIALOG_TREE_LITE
        
            dtreeReferral[i] = INVALID_DIALOG_ID;

        #endif
    }



2) i - вообще ни о чем не говорит тут

        new i = dtreePlayerDialogid[playerid];

        if(i != INVALID_DIALOG_ID)


3) Кажется, что открытие диалога можно вынести за условие

                    if(!strcmp(inputtext, DIALOG_ARROW_LEFT))
                    {
                        dtreePlayerPage[playerid]--;

                        return OpenPlayerDialog(playerid, "", dtreePlayerDialogStyle[playerid], dtreePlayerDialogCaption[playerid], dtreePlayerDialogInfo[playerid], dtreePlayerDialogLeft[playerid], dtreePlayerDialogRight[playerid]);
                    }

                    else if(!strcmp(inputtext, DIALOG_ARROW_RIGHT))
                    {
                        dtreePlayerPage[playerid]++;

                        return OpenPlayerDialog(playerid, "", dtreePlayerDialogStyle[playerid], dtreePlayerDialogCaption[playerid], dtreePlayerDialogInfo[playerid], dtreePlayerDialogLeft[playerid], dtreePlayerDialogRight[playerid]);
                    }


4) Смысл использовать else, если можно без него?

        stock GetDialogReferral(const dialog[], offset, string[])
        {
            new dialogid = GetDialogID(dialog);

            for(new i = 0, count; i < MAX_DIALOG_ID; i++)
            {
                if(dtreeReferral[i] == INVALID_DIALOG_ID)
                    continue;


                if(dtreeReferral[i] != dialogid)
                    continue;


                if(offset != count)
                    count++;
                else
                {
                    strcat((string[0] = EOS, string), dtreeFunction[i], MAX_DIALOG_NAME);

                    break;
                }
            }


            return 1;
        }


=>

        stock GetDialogReferral(const dialog[], offset, string[])
        {
            new dialogid = GetDialogID(dialog);

            for(new i = 0, count; i < MAX_DIALOG_ID; i++)
            {
                if(dtreeReferral[i] == INVALID_DIALOG_ID)
                    continue;


                if(dtreeReferral[i] != dialogid)
                    continue;


                if(offset != count) {
                    count++;
                    continue;
                }

                strcat((string[0] = EOS, string), dtreeFunction[i], MAX_DIALOG_NAME);
                break;
            }


            return 1;
        }

Сообщение отредактировал continue: 10 января 2025 - 23:26

1

#27
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияcontinue (10 января 2025 - 23:17) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

1. Переменные объявлены через static, сразу задать им значение "= {INVALID_DIALOG_ID, ...}" - не получится. Остаётся только цикл? :huh:
2. Исправил.
3. Никак не вынести. Это относится для страничных типов диалогов и там необходимо отслеживать нажатие на стрелочки. Ошибка была в другом, что сначала нужно определить стрелки, и если ни одна из них не нажата - переходим к обычным действиям, а именно к очистке массивов. Исправил.
4. Исправил.

Сообщение отредактировал M I S T E V: 11 января 2025 - 11:55

0

#28
Пользователь офлайн   M I S T E V 

  • Вставить ник
  • Раскрыть информацию
Обновлено.

    ■   Добавлена новая функция для получения количества используемых диалогов:

GetDialogCount()

Сообщение отредактировал M I S T E V: 12 января 2025 - 07:43

0

Поделиться темой:


  • (3 Страниц) +
  • 1
  • 2
  • 3
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика