ShowPlayerDialog

Данная функция была добавлена в SA-MP 0.3a и не будет работать в более ранних версиях!


Описание:
Показывает диалоговое окно определенному игроку.
Параметры:
PHP код:
(playerid,<ID диалога>,<ID стиля>,<Название>,<Текст>,<Первая кнопка>,<Вторая кнопка>) 
Разбор кода:
playerid ID игрока, которому будет показан диалог.
<ID диалога> Уникальный ID диалога.
<ID стиля> Стиль диалогового окна.
<Название> Заголовок окна.
<Текст> Текст самого диалога.
<Первая кнопка> Название первой (левой) кнопки диалога.
<Вторая кнопка> Название второй (правой) кнопки.

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

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

Функция:
Вызывается диалоговое окно функцией ShowPlayerDialog, структура функции такая:
PHP код:
ShowPlayerDialog(playerid,<ID диалога>,<ID стиля>,<Название>,<Текст>,<Первая кнопка>,<Вторая кнопка>); 
Упрощение:
Обычно, чтобы не запоминать цифры и не писать длинное название стилей диалогов, я заменяю их такими макросами:

PHP код:
#define LIST DIALOG_STYLE_LIST 
PHP код:
#define PASSWORD DIALOG_STYLE_PASSWORD 
PHP код:
#define MSGBOX DIALOG_STYLE_MSGBOX 
PHP код:
#define INPUT DIALOG_STYLE_INPUT 
Или можно использовать <ID> стиля диалогового окна

Для написания основного текста диалогового окна вы можете использовать нижеприведенную таблицу:
\b backspaсe
\f Form feed
\n Переход на новую строку
\r Возврат каретки
\t Табуляция
\v Вертикальная табуляция
\' Одиночная кавычка
\" Двойные кавычки
\? Вопросительный знак

Пример диалогов:
PHP код:
//пример для DIALOG_STYLE_MSGBOX
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Уведомление","Вы вошли на сервер","Закрыть","");
 
//пример для DIALOG_STYLE_INPUT
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Авторизация","Введите свой пароль:","Войти","Отмена");
 
//пример для DIALOG_STYLE_LIST
ShowPlayerDialog(playerid,1,DIALOG_STYLE_LIST,"Мой диалог","1. Строка\r\n2. Строка\r\n3. Строка","Опция 1""Опция 2");
 
//пример для DIALOG_STYLE_PASSWORD
ShowPlayerDialog(playerid,1,DIALOG_STYLE_PASSWORD,"Авторизация","Введите ваш пароль ниже:","Готово","Отмена"); 
Ответ на диалог:
Мы сделали диалоговое меню, состоящее из 9 пунктов. А нам надо сделать так, чтобы при нажатии на первый пункт, у нас появлялся другой диалог с другой информацией. Для этот мы будем использовать вот такой код:
PHP код:
case <ID диалога>:
{
    if(
response)
    {
        if(
listitem == 0// Первый пункт
        
{
        }
        else if(
listitem == 1// Второй пункт
        
{
        }
        else if(
listitem == 2// Третий пункт
        
{
        }
        else if(
listitem == 3// Четвертый пункт
        
{
        }
        else if(
listitem == 4// Пятый пункт
        
{
        }
        else if(
listitem == 5// Шестой пункт
        
{
        }
        else if(
listitem == 6// Седьмой пункт
        
{
        }
        else if(
listitem == 7// Восьмой пункт
        
{
        }
        else if(
listitem == 8// Девятый пункт
        
{
        }
    }

Условные конструкции:
Вот примет одной конструкции
PHP код:
if(response//Условие: если мы нажали первую кнопку
{
}
else 
//Условие: если мы нажали вторую кнопку
{

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

Создадим команду с использование ZCMD (командный процессор)
PHP код:
CMD:test(playeridparams[])
{
    
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Уведомление","Выберите кнопку","Первая","Вторая");

  Пример команды на стандартном командном процессере

PHP код:
    if (strcmp("/test"cmdtexttrue10) == 0)
    {
        
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"Уведомление","Выберите кнопку","Первая","Вторая");
    } 

И в public OnDialogResponse мы добавим ответ на наш диалог
PHP код:
    case 1:
    {
        if(
response//Условие: если мы нажали первую кнопку
        
{
            
SendClientMessage(playerid,0xFFFFFFAA,"Вы нажали первую кнопку");
        }
        else 
//Условие: если мы нажали вторую кнопку
        
{
            
SendClientMessage(playerid,0xFFFFFFAA,"Вы нажали вторую кнопку");
        }
    } 
Креативизация:
Вы решили создать диалог, а он серы и скучный?
Мы можем раскрасить наш диалог в любые цвета формата RGB.
Пример:
PHP код:
ShowPlayerDialog(playerid,1,DIALOG_STYLE_MSGBOX,"{FFFFFF}Уведомление","{3DB6F2}Выберите кнопку","Первая","Вторая"); 
Цвет мы заключаем в фигурную скобку "{" и "}"
FFFFFF - это белый цвет
3DB6F2 - светло-голубой
Думаю цвета вам не доставит большого труда отыскать. Для этого есть множество поисковых система.

Версия: 1.2

Лучше использовать switch для перебора диалогов.
Что же такое этот оператор switch?
Оператор switch – это оператор выбора. Он удобен в первую очередь тем, что может заменить много условий if, которые проверяют значение одной переменной.
Пример построения с этим оператором:
PHP код:
switch(reason)
{
case 
0// Первый пункт
{
// Тут у Вас что то будет
}
case 
1// Второй пункт
{
// Тут у Вас что то будет
}
case 
2// Третий пункт
{
// Тут у Вас что то будет
}

! Стоить отметить, что в официальной документации к языку написано: ‘In pawn, switch is a structured “if”‘, а это значит, что конструкция switch — это набор структурированных if’ов, отсюда следует, что switch не может работать быстрее if. Но это не всегда так.
  Тесты

Примеры by ZiGGi
  Опен меня

Следующая конструкция:
PHP код:
switch(var)
{
        case 
40,80,150,160,230,420: return 1;

быстрее, чем
PHP код:
if ( var == 40 || var == 80 || var == 150 || var == 160 || var == 230 || var == 420 ) return 1
Следующая конструкция:
PHP код:
switch(var)
{
        case 
40..80,150..160,230..420: return 1;

медленнее чем
PHP код:
if ( var >= 40 && var <= 80 || var >= 150 && var <= 160 || var >= 230 && var <= 420 ) return 1
Следующая конструкция:
PHP код:
switch(var)
{
        case 
40: return 1;

одинакова как и
PHP код:
if ( var == 40 ) return 1
Следующая конструкция:
PHP код:
switch(var)
{
        case 
40..50: return 1;

быстрее чем
PHP код:
if ( var >= 40 && var <= 50 ) return 1
Как видим — switch/case медленнее(значительно) if только на больших промежутках значений.




Версия: 1.3

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

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

PHP код:
new string[кол-во символов];
format(stringsizeof(string), "1 строка");
format(stringsizeof(string), "\n2 строка ",string);
format(stringsizeof(string), "\n3 строка",string);
format(stringsizeof(string), "\n4 строка",string);
format(stringsizeof(string), "\n5строка",string);
ShowPlayerDialog(playeridНОМЕР_ДИАЛОГАСТИЛЬ_ДИАЛОГОВОГО_ОКНА"ЗАГОЛОВОК"string"КНОПКА1""КНОПКА2"); 
 Пример использования

Строки - это места для хранения символов (букв и/или символов). Строки должны быть помещены в массив, так что каждая ячейка может содержать букву, вы должны указать экстра-ячейку для идентификатора строки - "0".
 Пример со статистикой:
PHP код:
new string[128];
format(stringsizeof(string), "Ваше имя: %s",pInfo[playerid][pName]);
format(stringsizeof(string), "\nИгровой уровень: %d",string,pInfo[playerid][pLevel]);
format(stringsizeof(string), "\nДата регистрации: %d ",string,pInfo[playerid][pDataReg]);
format(stringsizeof(string), "\nКоличество убийств: %d и смертей: %d",string,pInfo[playerid][pKills],pInfo[playerid][pDeaths]);
ShowPlayerDialog(playerid228DIALOG_STYLE_MSGBOX"Статистика"string"Понятно"""); 




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

PHP код:
static const _n[5][] =
{
"1 строка\n",
"2 строка\n",
"3 строка\n",
"4 строка\n",
"5 строка"
}
format(stringsizeof(string),"%s%s%s%s%s%s"_n[0],_n[1],_n[2],_n[3],_n[5]);
ShowPlayerDialog(playeridНОМЕР_ДИАЛОГАСТИЛЬ_ДИАЛОГОВОГО_ОКНА"ЗАГОЛОВОК"string"КНОПКА1""КНОПКА2"); 
 Пример использования

PHP код:
static const _n[11][] = 

"Lorem Ipsum - это текст-рыба, часто используемый в печати и\n"
"вэб-дизайне. Lorem Ipsum является стандартной рыбой для\n"
"текстов на латинице с начала XVI века. В то время некий \n"
"безымянный печатник создал большую коллекцию размеров и\n"
"форм шрифтов, используя Lorem Ipsum для распечатки образцов.\n" 
"Lorem Ipsum не только успешно пережил без заметных изменений\n" 
"пять веков, но и перешагнул в электронный дизайн. Его\n" 
"популяризации в новое время послужили публикация листов\n" 
"Letraset с образцами Lorem Ipsum в 60-х годах и, в более недавнее\n" 
"время, программы электронной вёрстки типа Aldus PageMaker, в\n" 
"шаблонах которых используется Lorem Ipsum."

format(stringsizeof(string),"%s%s%s%s%s%s"_n[0],_n[1],_n[2],_n[3],_n[5],_n[6],_n[7],_n[8],_n[9],_n[10]); 
ShowPlayerDialog(playerid1337DIALOG_STYLE_MSGBOX"Lorem Ipsum"string"Понятно""Закрыть");