Как сделать диалоговое окно самп

Добавил пользователь Morpheus
Обновлено: 18.09.2024

dialogid: например 1-2-3-4-5. и т.д

Стили: 3 стиля диалогового окна.
Стиль 0=DIALOG_STYLE_MSGBOX
Стиль 1=DIALOG_STYLE_INPUT
Стиль 2=DIALOG_STYLE_LIST

caption: Название диалога
info: Текст в диалоговом окне
button1: Первая кнопка например: Ок, Login
button2: вторая кнопка .Пример:Cancel

Вот вам пример кода:

if(strcmp(cmdtext, "/login", true) == 0)
<
new s[128];
new loginname[MAX_PLAYER_NAME];
GetPlayerName(playerid,loginname,MAX_PLAYER_NAME);
format(s,sizeof(s),"Welcome again, %s!\n\nContiune to login!",loginname);
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Login Plase!",s,"Login","Cancel");
return 1;
>

if(strcmp(cmdtext, "/login", true) == 0)
<
new s[128];
new loginname[MAX_PLAYER_NAME];
GetPlayerName(playerid,loginname,MAX_PLAYER_NAME);
format(s,sizeof(s)," Здарова еще раз, %s!\n\n Зайди под своим ником!",loginname);
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT," Форма Логина!",s," Логин"," Отмена");
return 1;
>


Проверено, пишет по-русски.. ладно продолжим туториал. Дальше вообще то отсутствует функция работы с диалоговым окном, т.е. что будет срабатывать если нажали на Ок. в туториале который я переводил но шас попробую вам рассказать сам.
Вот паблик функции работы с ней:

Сейчас расскажу здесь что означает:
playerid: ну я думаю вы поняли что это ид игрок.
dialogid: ид диалогового окна
response: проверка нажал ли игрок на первую кнопку или на вторую
listitem: если выбрали стиль окна DIALOG_STYLE_LIST ,то это будет выбор опции находящего в списке
inputtext[] это то что игрок ввел в поле, например, в системе регистрации.

Сейчас сделаю скрипт диалогового окна на примере стиля DIALOG_STYLE_MSGBOX(0).

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
<
if(dialogid == 0)
<
if(response)
<
//Здесь то что случится если игрок нажмет на кнопка1
>
else
<
//А здесь если он нажмет кнопка2
>
>
>


Сама функция, вместе с её параметрами выглядит примерно так - ShowDialog ( style, caption, text, button1, button2, id )
Style - основной параметр, отвечающий за стиль самого диалога.
Captain - заголовок вашего диалога.
Text - текст внутри вашего диалога.
Button1/2 - название кнопок в диалоге ( если нужна только 1 кнопка, вторую оставляйте пустой )
Id - необязательный параметр, позволяет задать персональный ID вашему диалогу, для дальнейшего его считывания. ​


Сразу поговорим про Escape-последовательности, это специальные знаки, которые влияют на вид вашего текста. Этому есть более сложное объяснение, но для AHK этого не нужно. Я покажу вам 2 основные последовательности:
` - основной экранирующий символ.
`n - перенос строки.
`t - горизонтальная табуляция ( отступ ).


Ну и конечно же нельзя забыть про покраску текста, для этого мы используем HTML-цвета . Думаю как красить через HTML, проблем у вас нет.
< CODE >TEXT

Приступим к самим диалогам.
В AHK существует 3 основных диалога, и несколько дополнительных.



Самый простой информационный диалог. Используют обычно для вывода информации, например /help или шпоры. Но не рекомендую загружать в него много текста. Сразу сможете увидеть работу HTML цветов. ​



Диалог для ввода информации. Есть несколько способов получить введенный текст, один уже немного стар, второй ещё можно использовать. ​



Один из самых распространённых диалогов, используют для выбора. Чтобы повесить действие на строку вам нужно ещё одна функция (LineResult), которую вам нужно засунуть в конец вашего кода или в SAMP UDF. ​



Почти такой же, как и 1, только скрывает введенный текст звездочками. Получить из него текст точно так же, как и в 1. Только учтите, что полученный текст скрыт не будет. ​

Дополнительные диалоги(редкие, но использовать можно)
Будьте внимательны к разметке в данном диалоге, сложно читать текст внутри из-за того что весь этот текст наслаивается друг на друга. Escape-последовательности также сбивают с толку.
Получить информацию с 2 диалогов ниже можно точно так же, как и со 2 стиля.




Такой, как 4, только добавлены шапки, сверху, в которых также можно написать дополнительную информацию. Из этого диалога сделан Tab(список игроков в онлайн). ​

ShowPlayerDialog(playerid, 8008 , DIALOG_STYLE_MSGBOX, "Тут название", "Тут текст", "Кнопка1", "Кнопка2");

Диалоговые окна 624661

2) Диалог с полем, в которое можно ввести что-либо Ид: 1Название: DIALOG_STYLE_INPUTСкриншот: Код диалога: Код:

ShowPlayerDialog(playerid,8009,DIALOG_STYLE_INPUT,"Тут название","Тут ваш текст","Кнопка1","Кнопка2");

Диалоговые окна 614421

3) Диалог, со списком Ид: 2Название: DIALOG_STYLE_LISTСкриншот: Код диалога: Код:

ShowPlayerDialog(playerid, 8007, DIALOG_STYLE_LIST, "Тут название", "Пункт 1\nПункт 2", "Кнопка1", "Кнопка2");

Диалоговые окна 592917

4) Диалог, с полем ввода(используется для ввода пароля) он просто шифрует введеные символы точками Внимание: диалог был добавлен в версию клиента samp 0.3d (я его не тестировал, поэтому и скрин с офф сайта) Ид: 3Название: DIALOG_STYLE_PASSWORDСкриншот: Код диалога: Код:

ShowPlayerDialog(playerid, 8008, DIALOG_STYLE_PASSWORD, "Тут название", "Тут текст(можете написать 'Введите пароль')", "Кнопка1", "Кнопка2");


dialogid: id диалога/использующийся диалогом идентификатор
style: доступные стили диалогового окна(Всего 3):




Рассмотрим как создать окно c выбором оружия как на скриншоте!?
Код диалогового окна(вставляем куда это возможно,к примеру в комманды):

ShowPlayerDialog(playerid, dialogid, 2, "List of weapons:", "1\tDeagle\n2\tSawnoff\n3\tPistol\n4\tGrenade\n5\tParachute\n6\tLorikeet", "Select", "Cancel");


* Параметр: \n в тексте диалога перенос на новую строку
** Кавычки " " перед началом текста и в конце обязательны!

Теперь создаём public отвечающий за использование диалоговых окон(Выбрал какое то оружие или отказался от выбора)

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
<
if(dialogid == ид диалога указанный вами)
<
if(response) // Первая кнопка,если игрок согласился(Выбрал)
<
if(listitem == 0) // id выбранной опции(у первой строки всегда 0 id)
<
GivePlayerWeapon(playerid, 24, 100);// Даём игроку Deagle
>
if(listitem == 1)
<
GivePlayerWeapon(playerid, 26, 100);// Даём игроку Sawnoff
>
if(listitem == 2) // Остальные попробуйте расставить сами
<
GivePlayerWeapon(playerid, 22, 100);// Даём игроку Кольт
>
>
else // Если игрок нажал вторую кнопку "CANCEL"
<
SendClientMessage(playerid,COLOR_RED," Вы вышли из меню.");
>
>
return 1;
>

ИНФОРМАЦИОННО-РАЗВЛЕКАТЕЛЬНЫЙ ПОРТАЛ

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

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

1 ShowPlayerDialog(playerid, , , , , , );

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

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

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

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

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

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

  • Цифра 0 – это идентификатор (ID) диалога, у каждого диалога свой ID.
  • После идентификатора пишем название стиля диалога, но он заменен константой, поэтому написано DSM (DIALOG_STYLE_MSGBOX) .
  • После стиля пишем название диалога.
  • Далее пишем текст диалога и название первой и второй кнопки.

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


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

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

if(dialogid == 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, эту функцию, которая возвратит значение, которое и будет значением этой переменной.


Второе диалоговое окно будет выглядеть следующим образом:

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

Читайте также: