Всё о сервере, форум!
Основы программирования
ИНФОРМАЦИОННО-РАЗВЛЕКАТЕЛЬНЫЙ ПОРТАЛ

PrR[ Проект SAMP - Romashka [0.3e] ™18+™

Pawn :: Основы скриптинга
Создание простого диалога

Диалоги бывают трех типов:
  • 0 - DIALOG_STYLE_MSGBOX - обычный диалог с 2мя кнопками,
  • 1 - DIALOG_STYLE_INPUT - диалог с полем для ввода,
  • 2 - DIALOG_STYLE_LIST - список из нескольких элементов.
  • 3 - DIALOG_STYLE_PASSWORD – диалог с полем ввода пароля.
Вызывается диалоговое окно функцией ShowPlayerDialog, структура функции такая:

1 ShowPlayerDialog(playerid,<ID диалога>,<ID стиля>,<Название>,<Текст>,<Первая кнопка>,<Вторая>);

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

#define DSL DIALOG_STYLE_LIST
#define DSI DIALOG_STYLE_INPUT
#define DSM DIALOG_STYLE_MSGBOX
#define DSP DIALOG_STYLE_PASSWORD


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

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

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

if (strcmp("/test", cmdtext, true, 10) == 0)
{
return 1;
}


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

1 ShowPlayerDialog(playerid,0,DSM,"Подтверждение","Вы точно хотите выполнить команду","Да","Нет");
  • Цифра 0 – это идентификатор (ID) диалога, у каждого диалога свой ID.
  • После идентификатора пишем название стиля диалога, но он заменен константой, поэтому написано DSM (DIALOG_STYLE_MSGBOX).
  • После стиля пишем название диалога.
  • Далее пишем текст диалога и название первой и второй кнопки.
В общем, код будет выглядеть следующим образом:

if (strcmp("/test", cmdtext, true, 10) == 0)
{
ShowPlayerDialog(playerid,0,DSM,"Подтверждение", "Вы точно хотите выполнить команду","Да","Нет");
return 1;
}


А диалоговое окно будет выглядеть так:


       Но данное диалоговое окно работать не будет, если мы не напишем для него функцию. Допустим, наша команда выдаст в чат всю информацию об игроке, т.е. при нажатии кнопки «Да» все так и будет, но при нажатии кнопки «Нет», мы выдадим сообщение красным цветом о том, что данная команда не была выполнена.

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

if(dialogid == 0) //Условие: если мы вызвали диалог с ID = 0
{
}


Условие проверяет: было ли вызвано диалоговое окно с ID = 0. Внутрь этой условной конструкции
добавляем еще одно условие:

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


Условие проверяет, была ли нажата первая кнопка, если нажата вторая кнопка, то выполняется код после else. Внутри этой условной конструкции для первой кнопки мы пишем следующий код.

if(response)
{
new string[128]; //Переменная с основным текстом диалога
new plname[MAX_PLAYER_NAME]; //Переменная с именем игрока
new money; //Переменные для хранения кол-ва наличных денег игрока
new Float: health, Float: armor; //Переменные для хранения кол-ва здоровья и брони игрока
GetPlayerName(playerid,plname,MAX_PLAYER_NAME); //Записываем имя игрока в переменную plname
money = GetPlayerMoney(playerid); //Записываем деньги игрока в переменную money и т.д.
GetPlayerHealth(playerid,health);
GetPlayerArmour(playerid,armor);
format(string,sizeof(string),”Игрок: %s(ID:%d). Деньги: %d $.\n Здоровье: %.2f\n Броня: %.2f”,
plname,playerid,money,health,armor);
ShowPlayerDialog(playerid,1,DSM,"Информация об игроке",string,"ОК","");
}else{}


      Сначала мы создаем все необходимые переменные, а потом получаем данные и сразу же их записываем их во всех переменные. Обратите внимание на функцию GetPlayerMoney, в скобках она имеет всего один аргумент (playerid), в отличие от других, и она возвращает количество денег игрока. Поэтому мы присваиваем переменной money, эту функцию, которая возвратит значение, которое и будет значением этой переменной.

        Еще обратите внимание на %.2f, я мог бы использовать просто %f. Точка и цифра означает, сколько чисел должно быть после запятой у десятичного числа. Дальше мы форматируем сообщение, после чего вызываем новое диалоговое окно с новым ID. Обратите внимание, что имя второй кнопки не указано, в таком случае, эта кнопка просто будет отсутствовать в диалоге. А вместо основного текста мы подставляем переменную string в которой уже есть готовое отформатированное сообщение.
   
       Второе диалоговое окно будет выглядеть следующим образом:


        Вернемся к условию, если будет нажата вторая кнопка в первом диалоге, тут все просто без объяснений в else пишем:

1 SendClientMessage(playerid,COLOR_RED,"Команда отменена");







Логин: Пароль:
Забыли пароль?Регистрация
При копировании материала с сайта активная ссылка обязательна!
Сайт управляется SiNG cms © 2010-2015