Перейти к содержанию
Авторизация  
mikilov

Как сделать переход с одного диалога на другой используя текст ?

Рекомендуемые сообщения

mikilov

Доброго времени суток, форумчане.

Подскажите пожалуйста, как сделать переход с одного диалогового окна на другой, используя текст "следующая страница" в конце диалога. 

Пример: https://imgur.com/a/1cvt34f
 

Надеюсь вы меня поняли. Буду очень благодарен если объясните и подскажите как это сделать! ( Новичок, что поделать. :D83DDE07:  )
 
 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Lefist

Попробую объяснить на примере (данный пример как можно реализовать написал только что, работоспособность не проверял): у нас есть массив из 150 строк и его необходимо реализовать в виде отдельных страниц по 40 строк на каждой

#define my_dialog 100 // идентификатор диалога
#define page_size 40 // количество строк на странице
#define arr_size 150 // количество строк в нашем массиве
#define string_max_length 24 // максимальное количество символов в строке

// сам массив с данными
new my_arr[arr_size][string_max_length] = {
    "абв",
    ...
};

после чего нам нужно понять как нумеровать страницы, можно с помощью переменной или номера диалога (тут как удобно), я покажу на примере отдельной переменной

// текущая страница у пользователя
new page_dialog[MAX_PLAYERS];

теперь мы можешь приступить к написанию самого диалога, для этого используем нашу страницу и показываем строки из нашей страницы

stock ShowListForPlayer(playerid) {
    // Создаем переменную с содержанием диалога
    new content[arr_size * 24];

    // Для цикла создаем идентификатор начала
    new item = 0 + 40 * page_dialog[playerid];

    // и идентификатор конца
    new max_item = 40 * (page_dialog + 1);

    // Если идентификатор конца выходит за рамки, нужно его укоротить
    if (max_item > arr_size) max_item = arr_size;

    // Сам цикл, который будет собирать содержание из строк
    while (item < max_item) {
        // Добавляем строчку к нашему контенту
        strcat(content, my_arr[item]);
        strcat(content, "\n");

        // Берем следующий элемент
        item++;
    }

    // Если строки не умещаются на странице
    if (arr_size > page_size) {
        ?if (max_item == arr_size) {
            strcat(content, "<< Предыдущая страница");
        }
        else if (max_item != page_size) {
            strcat(content, ">> Следующая страница\n<< Предыдущая страница");
        }
        else if (max_item == page_size) {
            strcat(content, ">> Следующая страница");
        }
    }

    // Выводим сам диалог
    ShowPlayerDialog(playerid, my_dialog, DIALOG_STYLE_LIST, "Заголовок", content, "Выбрать", "Закрыть");
}

Диалог создали, нужно и обработать его в OnPlayerDialogResponse

case my_dialog: {
    // Если нажал на кнопку "Закрыть"
    if (!response) return true;
    
    // Нужно, чтобы проверить на количество в диалоге
    new item = 40 * page_dialog;
    new max_item = 40 * (page_dialog + 1);
    if (max_item > arr_size) max_item = arr_size;

    // Получаем количество элементов
    new num_el = max_item - item;

    if (arr_size > page_size) {
        ?if (max_item == arr_size) {
             if (listitem == num_el) {
                // Возвращаемся на пред. страницу
                page_dialog[playerid]--;
                
                // Показываем диалог
                ShowListForPlayer(playerid);
            }
        }
        else if (max_item != page_size) {
            if (listitem == num_el) {
                // Возвращаемся на след. страницу
                page_dialog[playerid]++;
                
                // Показываем диалог
                ShowListForPlayer(playerid);
            }
            else if (listitem == num_el + 1) {
                // Возвращаемся на пред. страницу
                page_dialog[playerid]--;
                
                // Показываем диалог
                ShowListForPlayer(playerid);
            }
        }
        else if (max_item == page_size) {
            if (listitem == num_el) {
                // Возвращаемся на след. страницу
                page_dialog[playerid]++;
                
                // Показываем диалог
                ShowListForPlayer(playerid);
            }
        }
    }

    // Обработка нажатия на один элемент из списка (от 0 до arr_size)
    switch (item + listitem) {
        // ...
    }

    return true;
}

Теперь нужно написать команду

cmd:mydialog(playerid) {
    // Чтобы показывало 1 страницу
    page_dialog[playerid] = 0;
    
    // Показываем диалог
    ShowListForPlayer(playerid);
    return true;
}

Что-то типо такого получается, показал пример как можно реализовать, работоспособность не проверял

 

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
SCRIPTMAN

Оооу, как там расписано. Самый простой вариант:

Вот у тебя регионы, на них 100% есть case, в котором содержится действие.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Гость
Эта тема закрыта для публикации ответов.
Авторизация  

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

×

Важная информация

Мы разместили cookie-файлы на ваше устройство, чтобы помочь сделать этот сайт лучше. Вы можете изменить свои настройки cookie-файлов, или продолжить без изменения настроек.