Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Диалоги через stock - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Диалоги через stock
Оценка: -----

#1
Пользователь офлайн   Sonic X 

  • Х_X
  • Вставить ник
  • Раскрыть информацию
Чтобы облегчить себе жизнь с использованием диалогов, можно воспользоваться этим способом.

Часто можно видеть такое:
ShowPlayerDialog(playerid, dialogid, style, "название", "много текста\n\
                                             а он может быть\n\
                                             ещё в таком виде", "Кнопка 1", "Кнопка 2");

И мы используем данный диалог несколько, занимая много места в моде, а ведь ещё может быть использование с переменными:
new str[size];//size - образный размер массива
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, MAX_PLAYER_NAME);
format(str, sizeof(str), "Аккаунт %s ещё не зарегистрирован. Введите свой пароль", name);
ShowPlayerDialog(playerid, dialogid, style, "название", str, "Кнопка 1", "Кнопка 2");

А если нужно будет что-то заменить в одном диалоге, а их несколько, и таких "замен" много нужно произвести. (кто умеет пользоваться CTRL+F - вас не касается :biggrin:)

Можно легко решить данную проблему таким способом:
stock SPD_register(playerid)//SPD - сокращённо ShowPlayerDialog; После "_" идёт название диалога.
{
    new str[size];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, MAX_PLAYER_NAME);
    format(str, sizeof(str), "Аккаунт %s ещё не зарегистрирован. Введите свой пароль", name);
    return  ShowPlayerDialog(playerid, dialogid, style, "название", str, "Кнопка 1", "Кнопка 2");
}

Теперь данный диалог можно использовать вот так:
OnPlayerConnect(playerid)
{
    SPD_register(playerid);
}

Таких stock'ов можно создавать столько, сколько нужно вам. Хотите, можете сделать ещё 1 для вывода предупреждения игроку о неверном пароле:
stock SPD_register_error(playerid)
{
    new str[size];
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid, name, MAX_PLAYER_NAME);
    format(str, sizeof(str), "Аккаунт %s ещё не зарегистрирован. Вы использовали запрещающие символы. Начните сначала.", name);
    return  ShowPlayerDialog(playerid, dialogid, style, "название", str, "Кнопка 1", "Кнопка 2");
}


Также вы можете передавать не только свой ID, но и других игроков:
for(new id; id < MAX_PLAYERS; id++)
{
    SPD_event(id);
}



Если появятся вопросы, задавайте, постараюсь ответить.

Если уже есть подобная тема, эту удалите, либо укажите автора. Пока что автором являюсь Я.

Сообщение отредактировал Sonic X: 25 Январь 2018 - 23:49

1

#2
Пользователь офлайн   fausto 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Неплохо
0

#3
Пользователь онлайн   Xegare 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Есть инклюд mdialog by Ziggi, там по такому же принципу, но еще один плюс, в виде центрирования по левому, правому краю и центру.
0

#4
Пользователь офлайн   Long- 

  • Assassin Of Scripters
  • Вставить ник
  • Раскрыть информацию
Для начало нужно указать что такое stock в целом.
Stock это маркер компилятора, указывающий компилятору на исключение кода функции из конечного amx файла.
Т.е , он не оперируется в памяти сервера, и отличается она от переменной только тем что , ее нельзя создать локальной т.к это - функция.
И тем, что в случае если ее негде не вызвать, то на стадии компилирования компилятор ее пропустит, как в случае с комментированием кода "/* */", и не вызовет варнинг "204: symbol is assigned a value that is never used:".

Работает это тоже самое как и обычная переменная:

stock gTest = 3;
stock gTest1[MAX_PLAYERS] = "NameUser";
stock Float:gTest2 = 1.4;


main()
    printf("%d, %s, %f", gTest, gTest1, gTest2);


Да и в этой теме я не вижу ничего "облегчающего".
Ибо лучше тогда использовать как сказали , mdialog, либо использовать флаги, или автоматоны, которыми реально упростишь себе жизнь .
0

#5
Пользователь офлайн   Sonic X 

  • Х_X
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияLong- (26 Январь 2018 - 10:20) писал:

автоматоны, которыми реально упростишь себе жизнь


Спасибо :biggrin:
(http://pawn-wiki.ru/...ja-avtomatonov/)
0

#6
Пользователь офлайн   Long- 

  • Assassin Of Scripters
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияSonic X (26 Январь 2018 - 12:02) писал:



А зачем мне ссылка?
0

#7
Пользователь офлайн   Nexius 

  • Знаток
  • Вставить ник
  • Раскрыть информацию
Делал подобным способом организацию диалогов в своём редакторе объектов, но по практическому опыту именно такой способ не всегда всё облегчает, потому что часто нужно оправить один и тот же диалог, но, к примеру, с немного разным текстом (пример: вывести обычный текст + строку с ошибкой в конце, если ввёл неверный пароль в окно ввода), потому у меня он немного был улучшен: помимо аргумента playerid в функции показа диалога была ещё и строка, в которую можно было опционально написать нужный текст диалога, и применялся бы он только тогда, когда был бы передан. Т.е. что-то вроде того:

public OnPlayerConnect(playerid)
{
    SPD_register(playerid);
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if(dialogid == DIALOG_REGISTRATION)
    {
        if(!response)
        {
            new str[128], name[MAX_PLAYER_NAME];
            GetPlayerName(playerid, name, MAX_PLAYER_NAME);
            format(str, sizeof(str), "Аккаунт %s ещё не зарегистрирован. Введите свой пароль\n\nОшибка: Вы должны ввести свой пароль!", name);
            return SPD_register(playerid, str);
        }
        return 1;
    }
    return 0;
}

SPD_register(playerid, text[] = "") //text[] = "" - тем самым делаем параметр необязательным для ввода, + по умолчанию строка будет пустой
{
    if(text[0]) return ShowPlayerDialog(playerid, dialogid, style, "название", text, "Кнопка 1", "Кнопка 2"); //Есть "text"? => выводим "text"
    else
    {
        new str[128], name[MAX_PLAYER_NAME];
        GetPlayerName(playerid, name, MAX_PLAYER_NAME);
        format(str, sizeof(str), "Аккаунт %s ещё не зарегистрирован. Введите свой пароль", name);
        return ShowPlayerDialog(playerid, dialogid, style, "название", str, "Кнопка 1", "Кнопка 2");
    }
    return 0;
}


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

Сообщение отредактировал Nexius: 26 Январь 2018 - 14:35

1

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей