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

Обновлено: 11.05.2024

Автор:BlackWolfA Перевод:DizeL[ZR]
Функция:

Стили: 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
>
>
>[/pwn]

Вот Вам не большой пример скрипта..


Кстати да при использования диалогового окна в случае необходимости нужно пользоваться:
\b - backspae - забой
\f - Form feed - перевод страницы
\n - new line - новая строка
\r - возврат каретки
\t - табуляция
\v - вертикальная табуляция
\' - одиночная кавычка
\" - двойные кавычки
\? - вопросительный знак

Мои работы:
[INC] Сборник d_includes [LAST],[FS] New Demage Effect,[FS]Авто-Поворотники,
[FS]mp3player,[FS] Fun Chat Game,[FS] Car Buy Syst,[FS] Anti-AirBrk,[INC] d_setpos,
[GM] Game Move v0.1,[FS+include]Super-Armour [0.3z],[FS + Include] Multi Checkpoints

if(dialogid == 3 && response)
<
switch(listitem)
<
case 0:
<
SendClientMessage(playerid, 0xFFFF00AA, " Садитесь в тягач, подцепляйте телегу и едьте на красный круг, что-бы доставить продукты!");
SetPlayerCheckpoint(playerid, 2176.2202,-2230.3501,21.9618, 3.0);
>
case 1:
<
SendClientMessage(playerid, 0xFFFF00AA, " Садитесь в тягач, подцепляйте телегу и едьте на красный круг, что-бы доставить продукты!");
SetPlayerCheckpoint(playerid, 2497.6387,-651.5430,12.2501, 3.0);
>
case 2:
<
SendClientMessage(playerid, 0xFFFF00AA, " Садитесь в тягач, подцепляйте телегу и едьте на красный круг, что-бы доставить продукты!");
SetPlayerCheckpoint(playerid, 2332.4812,-1925.5785,21.8174, 3.0);
>
>
>

подскажите плиз как мне зделать так чтобы когда потходиш к пикапу (вигледит тк"j")автоматически вилезло диалоговае окно с нескальками вариантами!?

В public OnGameModeInit()

pic = CreatePickup(model, type, Float:X, Float:Y, Float:Z, Virtualworld); //Тут сам допишешь модель координаты и тд!

В public OnPlayerPickUpPickup( playerid, pickupid )

if(!strcmp(cmd, "/register", true))
<
new tmp[256];
tmp = strtok(cmdtext, idx);
RegisterPlayer(playerid,tmp);
return 1;
>

new cmd[256];
new idx = 0;
cmd = strtok(cmdtext, idx);
if(!strcmp(cmd, "/login", true))
<
new tmp[256];
tmp = strtok(cmdtext, idx);
LoginPlayer(playerid,tmp);
return 1;
>

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
<
new tmp[256];
new idx = 0;
if(dialogid == 1)
<
if(response)
<
//РЕГИСТРАЦИЯ
tmp = strtok(inputtext, idx);
RegisterPlayer(playerid,tmp);
>
>
else
<
//ВХОД
tmp = strtok(inputtext, idx);
LoginPlayer(playerid,tmp);
>
>

if(dialogid == 739)
<
format(string,sizeof(string),"Я Мужчина\nЯ Женщина");
ShowPlayerDialog(playerid,251,DIALOG_STYLE_LIST,"Выбор пола",string,"Принят","Отмена");
return 1;
>

ShowPlayerDialog(playerid,765,DIALOG_STYLE_MSGBOX,"Правила","Блаблабла\nБлаблабла\nБлаблабла","Согласен","Ну их нах");

if(dialogid == 765)
<
if(response)
<
SendClientMessage(playerid, COLOR_GREEN, "*Молодец что принял правила *");
>
else
<
SendClientMessage(playerid, COLOR_GREEN, "*Правила нах не посылают *");
Kick(playerid);
>
>


ты заметил там где правила - \n - это переход на след строку если чо.
а так если ошибка говори поправь я не тестил но вроде не должно быть ошибок!!

Добавлено (22.11.2010, 22:27)
---------------------------------------------
Эмм пацаны выше ктото писал чтоб ему помогли регу на диалог перевести, кто возьмется мне заодно пожалуйста переведите, ато перевожу а там пасс не читается!

[cut=А вот /register] if (strcmp(cmd, "/register", true)==0)
<
new string[265];
tmp = strtok(cmdtext, idx);
if(!strlen(tmp))
<
SendClientMessage(playerid, COLOR_GREY, " ÏÎÄÑÊÀÇÊÀ: /register [ïàðîëü]");
return 1;
>
if (gPlayerAccount[playerid] == 1)
<
SendClientMessage(playerid, COLOR_GREY, " Íèê óæå çàðåãèñòðèðîâàí");
return 1;
>

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

Стили диалога:

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

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

Или можно использовать стиля диалогового окна

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

\bbackspaсe
\fForm feed
\nПереход на новую строку
\rВозврат каретки
\tТабуляция
\vВертикальная табуляция
\'Одиночная кавычка
\"Двойные кавычки
\?Вопросительный знак

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

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

Создадим команду с использование ZCMD (командный процессор)

Креативизация:
Вы решили создать диалог, а он серы и скучный?
Мы можем раскрасить наш диалог в любые цвета формата RGB.
Пример:

Цвет мы заключаем в фигурную скобку "<" и ">"
FFFFFF - это белый цвет
3DB6F2 - светло-голубой
Думаю цвета вам не доставит большого труда отыскать. Для этого есть множество поисковых система.

Что же такое этот оператор switch?
Оператор switch – это оператор выбора. Он удобен в первую очередь тем, что может заменить много условий if, которые проверяют значение одной переменной.
Пример построения с этим оператором:

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

Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:

Маппинг для сервера

Если вы хотите обновить Ваш сервер новыми доработками - то зайдите в наш раздел. Большой выбор готовых решений от наших пользователей

Моды для сервера

Огромный выбор различных модификаций для Вашего сервера. Пролистайте эти темы! Возможно именно там Вы найдете то, что искали уже давно.

San Andreas Multiplayer Mobile

Хочешь узнать, как создается собственный Android-клиент для игры в SA-MP с телефона? Наши профессионалы помогут тебе достичь желаемого результата.

Вы используете устаревший браузер. Этот и другие сайты могут отображаться в нём некорректно.
Вам необходимо обновить браузер или попробовать использовать другой.

Санечек

Изучающий

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

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

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

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

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


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

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

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


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

Вот в принципе и все, В следующем уроке мы рассмотрим другой стиль диалога.

Создание диалогов (в новом samp 0.3) может показаться довольно трудным, хотя на самом деле довольно просто создать диалоговое окно. Эта краткая инструкция продемонстрирует вам, как сделать диалоговый список. Это диалоговое окно для демонстрационных целей и будет довольно ограниченным.

Сдесь будут показаны 3 примера стилей диалоговых окон: DIALOG_STYLE_MSGBOX, DIALOG_STYLE_INPUT и DIALOG_STYLE_LIST.

Объяснение

Сначала рассмотрим функцию ShowPlayerDialog

И все её параметры:

playeridID игрока которому будет показан данный диалог.
dialogidID диалога, чтобы в дальнейшем мы могли с ним работать.
info[]Текст в окне диалога. Используйте \n чтобы начать писать с новой строки и \t для сведения в таблицу.


и обработка вызовов при нажатии кнопок диалога (button1[] или button2[])

responseЛогика: true - если была нажата кнопка №1, false - если была нажата кнопка №2
listitemИспользуется только в диалоге со стилем DIALOG_STYLE_LIST, первый элемент 0 и т.д. по возрастанию.
inputtext[]Используется только в диалоге со стилем DIALOG_STYLE_INPUT, это строка ввода в диалоговом окне.


now that is done we can proceed

List dialog

Во первыъ, рассмотрим пример с показом диалога по команде ввода. С использованием OnPlayerCommandText:

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

Let me explain what this does, there are two switches. one for the dialogid, and one for the listitem. the if statement at top is needed else it doesnt check what button you clicked.

msgbox dialog

This is a simple one. it just is a textbox with two buttons no input no different choises just two buttons to process

this will show the dialog with ID 2(we already used dialogid 1) to the player. the style here is DIALOG_STYLE_MSGBOX.

now we need to setup the response again.

explanation: this only checks the dialogid because it already checked if you pressed the first button wich is yes. and then applys the animation for 10 seconds

input dialog

This dialog will have a line for input. (as the name implies).

We will make a chatdialog (what is typed in the dialog will appear in the chat).

This is a command created with strcmp, so it belongs under the OnPlayerCommandText callback.

Let's set-up the response, again..

As seen, this will print the inputtext string into a chat message for everyone.

Автор:BlackWolfA Перевод:DizeL[ZR]
Функция:

Стили: 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
>
>
>[/pwn]

Вот Вам не большой пример скрипта..


Кстати да при использования диалогового окна в случае необходимости нужно пользоваться:
\b - backspae - забой
\f - Form feed - перевод страницы
\n - new line - новая строка
\r - возврат каретки
\t - табуляция
\v - вертикальная табуляция
\' - одиночная кавычка
\" - двойные кавычки
\? - вопросительный знак

Мои работы:
[INC] Сборник d_includes [LAST],[FS] New Demage Effect,[FS]Авто-Поворотники,
[FS]mp3player,[FS] Fun Chat Game,[FS] Car Buy Syst,[FS] Anti-AirBrk,[INC] d_setpos,
[GM] Game Move v0.1,[FS+include]Super-Armour [0.3z],[FS + Include] Multi Checkpoints

[pwn] format("Правила сервера");
ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,"Правила [RP]_FaNTaSy_WoRLD_[RUS]","Принять","Отмена");
return 1;
>[/pwn]

теперь я покажу, как сделано у тебя

Fifa4ka, просмотри внимательно параметры функции ShowPlayerDialog(playerid, dialogid, style, caption[], info[], button1[], button2[])

теперь я покажу, как сделано у тебя

playerid - playerid
dialogid - 0
style - DIALOG_STYLE_MSGBOX
caption[] - Правила [RP]_FaNTaSy_WoRLD_[RUS]
info[] - то, что будет отображатся в окне и у тебя этого параметра просто нету
button1[] - Принять
button2[] - Отмена

Я не понимаю как сделать если не сложно можешь написать тока без

в OnPlayerLogin в конец проверки

new pravila[256+1];
format(pravila, sizeof(pravila), "Не читери\nНе оскарбляй\nУважай остальных");
ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,"Правила [RP]_FaNTaSy_WoRLD_[RUS]","pravila","Принять","Отмена");

и в OnPlayerDialog

Хмм. в твоём случае игроку придется каждый раз соглашаться с правилами при подключении, лучше сделай так:

в OnPlayerLogin в конец проверки

new pravila[256+1];
format(pravila, sizeof(pravila), "Не читери\nНе оскарбляй\nУважай остальных");
ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,"Правила [RP]_FaNTaSy_WoRLD_[RUS]","pravila","Принять","Отмена");

и в OnPlayerDialog

if(dialogid == 0)
<
if(response)
<
SendClientMessage(playerid, COLOR_YELLOW, " Удачной игры на сервере");
>
else
<
SendClientMessage(playerid, COLOR_YELLOW, " Для игры на нашем сервере, вы должны принять правила");
Kick(playerid);
>
>

так что тяжело соглашатся каждый раз но чтоб они знали про правила

у меня система другая написана

нету этого OnPlayerDialog

new pravila[256+1];
format(pravila, sizeof(pravila), "Не читери\nНе оскарбляй\nУважай остальных");
ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,"Правила [RP]_FaNTaSy_WoRLD_[RUS]","pravila","Принять","Отмена");

new pravila[256+1];
format(pravila, sizeof(pravila), "Не читери\nНе оскарбляй\nУважай остальных");
ShowPlayerDialog(playerid,0,DIALOG_STYLE_MSGBOX,"Правила [RP]_FaNTaSy_WoRLD_[RUS]","pravila","Принять","Отмена");

ну и то, что я выложил, в OnDialogResponse (будь внимательнее) ответь в аське мне

я сделала как бы всё что ты сказал и всё равно не идёт(

Добавлено (14.11.2009, 12:52)
---------------------------------------------
На самп коме немного криво написано, вот взял из своего мода для примера

хоть куда:
format(s,sizeof(s),"Скил ближнего оружия\nСкил дальнего оружия оружия\nСкил среднего оружия\nСкил устойчивости к радиации\nСкил телепортации\nСкил повышения очков опыта с каждого уровня\nСкил увиличения возможности крита\nСкил увиличения прыжка в высоту\nСкил временого увиличения скорости передвежения\nСкил увиличения хп");
ShowPlayerDialog(playerid,4,DIALOG_STYLE_LIST,"Выберите начальный скил",s,"Выбрать","Поже");

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
<
if(dialogid == 4)
<
if(response)
<
if (listitem == 0)
<
dini_IntSet(loginname,"S1",1);
SendClientMessage(playerid, 0xAA3333AA, "Вы выбрали Скил ближнего оружия!");
OnPlayerEnter(playerid);
>
else if (listitem == 1)
<
dini_IntSet(loginname,"S2",1);
SendClientMessage(playerid, 0xAA3333AA, "Вы выбрали Скил среднего оружия!");
OnPlayerEnter(playerid);
>
****************************** мой код


Думаю тут все понятно



[pwn]public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
<
if(dialogid == 5)
if(!response) return 1;
if(listitem == 0) //проверка, выбран ли Пункт 1
<
Ваш код
>
if(listitem == 1) //проверка, выбран ли Пункт 2
<
Ваш код
>
if(listitem == 2) //проверка, выбран ли Пункт 3
<
Ваш код
>
>
return 1;
>[/pwn]

Ололо, чем сложнее подпись - тем интересней*)

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