Доступ к готовым решениям

Переход в группу "Пользователь"

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

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок Система регистрации с 0. [mxINI][2 часть]

Статус
В этой теме нельзя размещать новые ответы.

From_Enot

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

Что в ней будет:

1. Диалог регистрации
2. Диалог подтверждения пароля
3. Решение математического примера
4. Вывод правил сервера
5. Выбор пола
6. Сохранение аккаунта.

Помимо этого, будет несколько уже интересных функций:

1. Если Вы не прошли регистрацию до конца и случайно нажали ESC и нас выгнало с сервера, то когда Вы зайдете еще раз, регистрация продолжится.
2. Не будет выбора скина. Регистрация конечно для Role Play сервера, но я всегда делал без выбора скина, ибо мне это не нужно.
3. Решение математического примера. В диалоге выведется рандомный пример, который игрок должен будет решить.

Приступим. В начале мода Вы видите:
PHP:
#include <a_samp>
Как Вы уже поняли, здесь мы добавляем инклуды. Поскольку, наша система находится на mxINI, то добавим его следующим образом
PHP:
#include <a_samp>
#include <mxINI>
Теперь. Добавим некоторые дефайны, сразу после инклудов:
PHP:
#define Kickk SetTimerEx("kick", 100, false, "i", playerid); // Создадим define с таймером, зачем он я объясню позже.
#define DSM DIALOG_STYLE_MSGBOX // Сокращаем написание DIALOG_STYLE_MSGBOX до DSM
#define DSL DIALOG_STYLE_LIST // Сокращаем написание DIALOG_STYLE_LIST до DSL
#define DSI DIALOG_STYLE_INPUT // Сокращаем написание DIALOG_STYLE_INPUT до DSI
#define DSP DIALOG_STYLE_PASSWORD // Сокращаем написание DIALOG_STYLE_PASSWORD до DSP
Рассказывать про виды диалогов я не буду, ибо на форуме их и так полно. И добавим дефайны цветов:
PHP:
#define MODER_COLOR 0xff6a6aaa  // Цвет для ошибок, предупреждений и т.п.
#define HELP_COLOR 0xfff48daa   // Цвет для подсказок и каких либо " Внимание "
#define SERVER_COLOR 0xffd66eaa // Цвет для Регистрации и Авторизации
#define COLOR_RED 0xff0000aa // Красный цвет
#define COLOR_WHITE 0xffffffaa // Белый цвет
Теперь, после объявления всех инклудов и дефайнов, которые нам понадобятся, мы с Вами добавим несколько переменных:
PHP:
new nickname[MAX_PLAYER_NAME]; // Будет нужна для получения имени игрока
new Login[MAX_PLAYERS];
new AccountExist[MAX_PLAYERS];
new quest; // Нужна будет для диалога с решением математического примера
Теперь создадим массив, который будет хранить в себе информацию об игроке:
PHP:
enum pInfo // Задаем название массиву - pInfo
{
	pRegStage, // Стадия регстрации
	pLoginTries, 
	pSex, // Пол
	pSkin, // Скин
	pLevel, // Уровень
	pAdmin, // Админка
	pModerator, 
	pChatModerator,
	pHouse, // Дом
        Float: pHealth // Здоровье
}
new PlayerInfo[MAX_PLAYERS][pInfo]; // Так же создадим переменную с названием PlayerInfo.
Теперь создадим последнюю переменную, которая будет хранить в себе правила сервера
PHP:
new ServerRules[7][]=
{
	{"{ffd66e}{ffffff}1){ffd66e} Запрещено использование любых программ, дающих преимущество над другими игроками или раcширяющими возможности персонажа(читов).\nНаказание - {ffffff}бан{ffd66e}. Срок определяется модератором и зависит от типа нарушения, а также уровня игрока."},
	{"{ffd66e}\n\n{ffffff}2){ffd66e} Запрещена всевозможная реклама проектов и/или ресурсов, не относящихся к {ffffff}Role Play{ffd66e}.\nНаказание - {ffffff}бан{ffd66e}."},
	{"{ffd66e}\n\n{ffffff}3){ffd66e} Запрещены любого рода оскорбления игроков.\nНаказание выбирает модератор, полагаясь на ситуацию и сложившиеся обстоятельства.\nОскорбление родных/родственников. Наказание - {ffffff}бан{ffd66e}."},
	{"{ffd66e}\n\n{ffffff}4){ffd66e} Запрещено беспорядочное и непосредственное причинение урона игрокам и транспортным средствам(DM).\nНаказание - {ffffff}блокировка игрового процесса{ffd66e}. "},
	{"{ffd66e}\n\n{ffffff}5){ffd66e} Запрещен обман игроков, также любые махинации с игровым имуществом и/или валютой.\nНаказание выбирает модератор, полагаясь на ситуацию и сложившиеся обстоятельства."},
	{"{ffd66e}\n\n{ffffff}6){ffd66e} Запрещена передача и/или продажа игрового аккаунта другому игроку.\nНаказание - {ffffff}блокировка аккаунта{ffd66e}."},
	{"{ffd66e}\n\n\nНе забудьте посетить наш сайт - {ffffff}Pawno-Info.ru{ffd66e}.\nТам вы найдете много полезной информации и сможете получить ответ на все ваши вопросы, связанные с игровым процессом."}
};
Данные правила, Вы само собой замените на свои. Эти я взял из интернета.
Далее идем в
PHP:
public OnPlayerRequestClass(playerid, classid)
Его заменяем на:
PHP:
public OnPlayerRequestClass(playerid, classid)
{
	new string[250]; // - 1
	GetPlayerName(playerid, nickname, sizeof(nickname)); // - 2
	switch(AccountExist[playerid])
	{
	    case 1:
	    {
	        if(PlayerInfo[playerid][pLoginTries] == 3) // - 3 
	        {
	 			SendClientMessage(playerid, MODER_COLOR, "Ранее вы уже пытались войти в аккаунт, но трижды ввели неправильный пароль.");
	 			SendClientMessage(playerid, MODER_COLOR, "Администрация считает, что это попытка взлома аккаунта. На этот раз у вас 2 попытки, чтобы ввести правильный пароль.");
			}
        	if(PlayerInfo[playerid][pLoginTries] == 5) // - 3
        	{
	        	SendClientMessage(playerid, MODER_COLOR, "Было совершено несколько неудачных входов в аккаунт. Администрация посчитала, что это попытка взлома аккаунта.");
	        	SendClientMessage(playerid, MODER_COLOR, "В целях предотвратить возможный взлом, ваш аккаунт временно заблокирован.");
	        	SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Чтобы снять блокировку раньше времени, обратитесь к администрации: Pawno-Info.ru.");
	        	SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Доступ к аккаунту временно заблокирован. Введите (q)uit, чтобы выйти.");
				Kickk
				return true;
	        }
       		format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер:  Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведите пароль от аккаунта:", nickname);
        	ShowPlayerDialog(playerid, 1, DSP, "Авторизация", string, "Вход", "Отмена"); 
		}
	    case 0:
	    {
	        SendClientMessage(playerid, COLOR_WHITE, "Этот ник {ff0000}не зарегистрирован{ffffff} на этом сервере. Зарегистрируйтесь, пожалуйста.");
	    	format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nИспользуемый вами ник не занят.\nЗарегистрируйтесь\n\nВведите желаемый пароль от аккаунта:", nickname);
     		ShowPlayerDialog(playerid, 2, DSP, "Регистрация", string, "Далее", "Отмена"); 
	    }
	}
	return 1;
}
Теперь расскажу. Я около " трудных " мест, поставил цифры. Теперь объясню их суть.
1) Создаем переменную string которая хранит в себе 250 символов.
2) Получаем имя игрока
3) Как я уже ранее написал, я сделал интересную функцию, которую не везде видел. Если вы заходите на сервер и трижды вводите неправильный пароль, то вас кикает. В следующий раз у вас уже будет всего 2 попытки на ввод правильного пароля. Если же вы опять неправильно вводите пароль, то вас банит сервер. Единственный недочет этой функции в том, что я не сделал, что бы сервер сам разбанивал игрока через некоторое время. Так что разбанить можно через файл.

Продолжаем.
В
PHP:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
мы начинаем вставлять наши диалоги:
PHP:
	new string[1500]; // - 1
	switch(dialogid) // - 2
	{
	    case 1:
		{
  			if(response)
	        {
	            if(!strlen(inputtext))
	            {
	                format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведите пароль от аккаунта:", nickname);
	            	ShowPlayerDialog(playerid, 1, DSP, "Авторизация", string, "Вход", "Отмена");
	            	return true;
	            }
	            for(new i = strlen(inputtext); i != 0; --i) // - 3
	            switch(inputtext[i]) // 3
	            { // 3
	                case 'А'..'Я', 'а'..'я': // 3
					{
						SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Смените раскладку вашей клавиатуры.");
						format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведите пароль от аккаунта:", nickname);
						ShowPlayerDialog(playerid, 1, DSP, "Авторизация", string, "Вход", "Отмена");
	            		return true;
					}
	            }
	            format(string, sizeof(string), "Accounts/%s.ini", nickname);
                new File = iniOpen(string);
                ini_getString(File, "Password", string); // -4
                ini_getInteger(File, "Registration Stage", PlayerInfo[playerid][pRegStage]); // -4
                if(!strcmp(inputtext, string, true)) // - 5
                {
                    switch(PlayerInfo[playerid][pRegStage])
                    {
                        case 0:
                        {
                            SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} В прошлый раз вы закончили регистрацию не до конца.");
							SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Ответьте на вопрос, чтобы продолжить регистрацию.");
                            new align = random(10);
 					 		SetPVarInt(playerid, "align", align);
            				format(string, sizeof(string), "{ffd66e}Сколько будет: {ffffff}%i{ffd66e} + {ffffff}%i{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", align, align*2+4);
            				ShowPlayerDialog(playerid, 4, DIALOG_STYLE_INPUT, "Вопрос:", string, "Далее", "Отмена");
							PlayerInfo[playerid][pLoginTries] = 0;
							iniClose(File);
							return true;
                        }
                        case 1:// - 6
                        {
                            SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} В прошлый раз вы закончили регистрацию не до конца.");
  							SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Ответьте на вопрос, чтобы продолжить регистрацию.");
                            new align = random(10);
 					 		SetPVarInt(playerid, "align", align);
            				format(string, sizeof(string), "{ffd66e}Сколько будет: {ffffff}%i{ffd66e} + {ffffff}%i{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", align, align*2+4);
            				ShowPlayerDialog(playerid, 4, DIALOG_STYLE_INPUT, "Вопрос:", string, "Далее", "Отмена");
							PlayerInfo[playerid][pLoginTries] = 0;
							iniClose(File);
							return true;
                        }
						case 2: //- 7
						{
						    SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} В прошлый раз вы закончили регистрацию не до конца.");
  							SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Выберите желаемый пол, чтобы продолжить регистрацию.");
						    ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
						    PlayerInfo[playerid][pLoginTries] = 0;
						    iniClose(File);
						    return true;
						}
						case 3: //- 8
						{
						    SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} В прошлый раз вы закончили регистрацию не до конца.");
  							SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Ознакомьтесь с общими правилами сервера, чтобы продолжить регистрацию.");
						    format(string, sizeof(string), "%s%s%s%s%s%s%s", ServerRules[0], ServerRules[1], ServerRules[2], ServerRules[3], ServerRules[4], ServerRules[5], ServerRules[6]);
   		        			ShowPlayerDialog(playerid, 6, DSM, "Общие правила", string, "Играть", "");
   		        			PlayerInfo[playerid][pLoginTries] = 0;
   		        			iniClose(File);
   		        			return true;
						}
						case 4: //- 9
						{
						    iniGet(File, "Password", string);
		                    iniGetInt(File, "Sex", PlayerInfo[playerid][pSex]);
		                    iniGetInt(File, "Skin", PlayerInfo[playerid][pSkin]);
		                    iniGetInt(File, "Level", PlayerInfo[playerid][pLevel]);
		                    iniGetInt(File, "Login Tries", PlayerInfo[playerid][pLoginTries]);
		                    iniGetInt(File, "Admin", PlayerInfo[playerid][pAdmin]);
							iniGetInt(File, "Moderator", PlayerInfo[playerid][pModerator]);
							iniGetInt(File, "Chat Moderator", PlayerInfo[playerid][pChatModerator]);
							iniGetInt(File, "House", PlayerInfo[playerid][pHouse]);
		                    iniClose(File);
		                    PlayerInfo[playerid][pLoginTries] = 0;
		                    SpawnPlayer(playerid);
						}
 					}
                }
                else // - 10
                {
                    iniClose(File);
                    switch(PlayerInfo[playerid][pLoginTries])
                    {
                        case 0:
                        {
                            SendClientMessage(playerid, MODER_COLOR, "Вы ввели неправильный пароль. У вас осталось 2 попытки!");
                            format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведите пароль от аккаунта:", nickname);
	            			ShowPlayerDialog(playerid, 1, DSP, "Авторизация", string, "Вход", "Отмена");
							PlayerInfo[playerid][pLoginTries] = 1;
                        }
                        case 1:
						{
						    SendClientMessage(playerid, MODER_COLOR, "Вы ввели неправильный пароль. У вас осталась 1 попытка!");
						    format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведите пароль от аккаунта:", nickname);
	            			ShowPlayerDialog(playerid, 1, DSP, "Авторизация", string, "Вход", "Отмена");
	            			PlayerInfo[playerid][pLoginTries] = 2;
						}
                        case 2:
                        {
                            SendClientMessage(playerid, MODER_COLOR, "Вы трижды ввели неправильный пароль  -  Вы были кикнуты!");
                            SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Введите (q)uit, чтобы выйти.");
							PlayerInfo[playerid][pLoginTries] = 3;
							SaveAccounts(playerid);
							Kickk

                        }
                        case 3:
                        {
                           	SendClientMessage(playerid, MODER_COLOR, "Вы ввели неправильный пароль. У вас осталась 1 попытка!");
						    format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим:RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nЭтот аккаунт уже зарегистрирован.\n\nВведите пароль от аккаунта:", nickname);
	            			ShowPlayerDialog(playerid, 1, DSP, "Авторизация", string, "Вход", "Отмена");
	            			PlayerInfo[playerid][pLoginTries] = 4;
                        }
                        case 4:
                        {
                            SendClientMessage(playerid, MODER_COLOR, "В целях предотвратить возможный взлом, ваш аккаунт временно заблокирован.");
	            			SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Чтобы снять блокировку раньше времени, обратитесь к администрации: vk.com/realq5.");
	            			SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Введите (q)uit, чтобы выйти.");
	            			PlayerInfo[playerid][pLoginTries] = 5;
	            			SaveAccounts(playerid);
							Kickk
                        }
                    }
                }
	        }
	        else
	        {
	            SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} Авторизация была отменена - Вы будете кикнуты.");
	            SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Введите (q)uit, чтобы выйти.");
				Kickk
	        }
		}
Фуф. Теперь объясню что я пометил здесь.
1) Опять же создаем string, который на сей раз будет содержать в себе 1500 символов
2) Создаем switch с диалогами, для каждого диалога отдельный case. Думаю все просто.
3) Здесь мы создаем проверку на то, что ввел игрок. Если он ввел русские символы, то ему высветится сообщение о том, что так делать нельзя :) и просьба о том, что бы он сменил раскладку.
4) Все просто. Мод открывает файл, берет информацию из строчки с паролем ( " Password " ) и стадию регистрации ("Registration Stage"), после это будет происходить функция. Полностью ее объяснять я тоже не буду, ибо это займет очень много времени, как на мой ввод, так и на ваше чтение.
5) Создаем еще одну проверку.
6) Теперь пойдут case's которые будут проверять следующее: Как я уже говорил, если Вы не закончили регистрацию до конца, то при заходе у вас все продолжится с того момента где вы остановились. И данные кейсы ( я пометил вам как 7 и 8 ) будут как раз проверять эту стадию регистрации
9) Если, с данной системой все в порядке и игрок все сделал так как надо нам, то мод записывает информацию из массива pInfo в файл с нашим ником. Затем он закрывает его и спавнит нас.
10) Дальше у нас пойдет проверка на то, ошиблись мы в воде пароля или нет. Там я тоже рассказывать не буду, потому что ничего сложного не вижу.

Теперь дополним данный паблик оставшимися диалогами и приступим к окончанию.
PHP:
		case 2: // Данный кейс отвечает за диалог регистрации
		{
		    if(response)
		    {
		        if(!strlen(inputtext))
		        {
		            format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер:  Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера:Pawno-Info.ru\n\nИспользуемый вами ник не занят.\nЗарегистрируйтесь\n\nВведите желаемый пароль от аккаунта:", nickname);
     				ShowPlayerDialog(playerid, 2, DSP, "Регистрация", string, "Далее", "Отмена");
     				return true;
		        }
		        for(new i = strlen(inputtext); i != 0; --i)
		        switch(inputtext[i])
		        {
		            case 'А'..'Я', 'а'..'я':
		            {
						SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Пароль не должен содержать русских символов. Смените раскладку вашей клавиатуры.");
						format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: RP: LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nИспользуемый вами ник не занят.\nЗарегистрируйтесь\n\nВведите желаемый пароль от аккаунта:", nickname);
     					ShowPlayerDialog(playerid, 2, DSP, "Регистрация", string, "Далее", "Отмена");
     					return true;
		            }
				}
				if(strlen(inputtext) < 6 || strlen(inputtext) > 20) // делаем проверку на то, сколько символов ввел игрок. Если меньше 6 или больше 20, то мы ему отказываем.
				{
					SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Пароль должен состоять минимум из 6 символов.");
					format(string, sizeof(string), "{ffd66e}Здравствуйте, %s!\n\n•Вы зашли на сервер: Role Play (0.3.7) [RUS]\n•Игровой режим: : LS/SF/LV (RP)\n•Сайт сервера: Pawno-Info.ru\n\nИспользуемый вами ник не занят.\nЗарегистрируйтесь\n\nВведите желаемый пароль от аккаунта:", nickname);
					ShowPlayerDialog(playerid, 2, DSP, "Регистрация", string, "Далее", "Отмена");
					return true;
				}
				GetPlayerName(playerid, nickname, sizeof(nickname)); // Получаем имя игрока
				format(string, sizeof(string), "Accounts/%s.ini", nickname);
				new File = ini_createFile(string);
				if(File < 0) ini_openFile(string);
				{
				    ini_setString(File, "Password", inputtext); // Если регистрация прошла успешно, то записываем все данные из pinfo в файл с нашим ником.
				    ini_setInteger(File, "Registration Stage", PlayerInfo[playerid][pRegStage]);
				    ini_setInteger(File, "Login Tries", PlayerInfo[playerid][pLoginTries]);
				    ini_setInteger(File, "Money", GetPlayerMoney(playerid));
				    ini_setInteger(File, "Sex", PlayerInfo[playerid][pSex]);
				    ini_setInteger(File, "Skin", PlayerInfo[playerid][pSkin]);
				    ini_setInteger(File, "Level", PlayerInfo[playerid][pLevel]);
					ini_setInteger(File, "Admin", PlayerInfo[playerid][pAdmin]);
					ini_setInteger(File, "Moderator", PlayerInfo[playerid][pModerator]);
					ini_setInteger(File, "Chat Moderator", PlayerInfo[playerid][pChatModerator]);
					ini_setInteger(File, "House", PlayerInfo[playerid][pHouse]);
				    iniClose(File); // Закрываем файл
		    		PlayerInfo[playerid][pRegStage] = 0;
					ShowPlayerDialog(playerid, 3, DSP, "Подтверждение пароля", "{ffd66e}Аккаунт успешно создан.\nЧтобы продолжить регистрацию подтвердите ваш пароль.\nВведите ваш пароль и нажмите кнопку \"Далее\"", "Далее", "Выход");
				}
		    }
		    else
		    {
		        SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} Вы отменили регистрацию - Вы будете кикнуты.");
				SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Введите (q)uit, чтобы выйти.");
				Kickk
		    }
		}
		case 3: // данный кейс отвечает за диаолг с подтверждением пароля
		{
	    	if(response)
	    	{
	        	if(!strlen(inputtext))
	        	{
	            	ShowPlayerDialog(playerid, 3, DSP, "Подтверждение пароля", "{ffd66e}Аккаунт успешно создан.\nЧтобы продолжить регистрацию подтвердите ваш пароль.\nВведите ваш пароль и нажмите кнопку \"Далее\"", "Далее", "Выход");
	            	return true;
	        	}
	        	for(new i = strlen(inputtext); i != 0; --i)
	        	switch(inputtext[i])
	        	{
	            	case 'А'..'Я', 'а'..'я': // Опять же проверка на то какие символы ввел игрок
	            	{
            			SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Смените раскладку вашей клавиатуры.");
             			ShowPlayerDialog(playerid, 3, DSP, "Подтверждение пароля", "{ffd66e}Аккаунт успешно создан.\nЧтобы продолжить регистрацию подтвердите ваш пароль.\nВведите ваш пароль и нажмите кнопку \"Далее\"", "Далее", "Выход");
           				return true;
	            	}
	        	}
	        	format(string, sizeof(string), "Accounts/%s.ini", nickname);
                new File = iniOpen(string);
                ini_getString(File, "Password", string);
                if(!strcmp(inputtext, string, true))
                {
                    PlayerInfo[playerid][pRegStage] = 1;
					SaveAccounts(playerid);
				 	quest = random(10) +1; // Создаем рандом, для того что бы нам выдавались всегда разные примеры для решения
					if (quest== 1)   ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}два{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 11
					if (quest== 2)   ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}восемь{ffd66e} + {ffffff}четыре{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");  // 12
					if (quest== 3)   ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}семь{ffd66e} + {ffffff}шесть{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");   // 13
					if (quest== 4)   ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}шесть{ffd66e} + {ffffff}восемь{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 14
					if (quest== 5)   ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}пять{ffd66e} + {ffffff}десять{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 15
					if (quest== 6)   ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}пять{ffd66e} + {ffffff}одиннадцать{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 16
					if (quest== 7)   ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}восемь{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 17
					if (quest== 8)   ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}девять{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); //18
					if (quest== 9)   ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}десять{ffd66e} + {ffffff}девять{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 19
					if (quest== 10)  ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}десять{ffd66e} + {ffffff}десять{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена"); // 20
				}
				else
				{
			    	SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Пароль неверный. Попробуйте еще раз.");
     				ShowPlayerDialog(playerid, 3, DSP, "Подтверждение пароля", "{ffd66e}Аккаунт успешно создан.\nЧтобы продолжить регистрацию подтвердите ваш пароль.\nВведите ваш пароль и нажмите кнопку \"Далее\"", "Далее", "Выход");
   					return true;
				}
	    	}
	    	else
	    	{
	        	SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} Регистрация была прервана - Вы будете кикнуты.");
				SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Чтобы продолжить регистрацию, в следующий раз просто войдите на сервер под своим ником.");
				SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Введите (q)uit, чтобы выйти.");
				Kickk
	    	}
   		}
   		case 4: // Теперь пойдет кейс, отвечающий за диалог с решением примера. 
   		{
                    new regQuest[10]={11, 12, 13, 14, 15, 16, 17, 18, 19, 20};// Переменная в которой хранятся " ответы " на математический пример.
   		    if(response)
   		    {
   		        if(quest == 1) // Если выпал 1 диалог из нашего ранее созданного рандома, то выводится следующее:
   		        {
   		            if(!strlen(inputtext))
   		            {
   		                ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}два{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
	                    return true;
   		            }
             		if(strcmp(inputtext, regQuest[0], true)) // Если введенный текст соответствует нашей переменной с ответами, то продолжается система регистрации
             		{
					    PlayerInfo[playerid][pRegStage] = 2;
		    			SaveAccounts(playerid);
					    ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
					}
					else
					{
					    ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}два{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
         				return true;
					}
   		        }
   		        if(quest == 2)
   		        {
   		            if(!strlen(inputtext))
   		            {
   		                ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}восемь{ffd66e} + {ffffff}четыре{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
						return true;
   		            }
   		            if(strcmp(inputtext, regQuest[1], true))
   		            {
         				PlayerInfo[playerid][pRegStage] = 2;
		    			SaveAccounts(playerid);
					    ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
   		            }
   		            else
   		            {
   		                ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}восемь{ffd66e} + {ffffff}четыре{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
						return true;
   		            }
   		        }
   		        if(quest == 3)
   		        {
   		            if(!strlen(inputtext))
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}семь{ffd66e} + {ffffff}шесть{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                		return true;
   		            }
   		            if(strcmp(inputtext, regQuest[2], true))
   		            {
         				PlayerInfo[playerid][pRegStage] = 2;
		    			SaveAccounts(playerid);
					    ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
   		            }
   		            else
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}семь{ffd66e} + {ffffff}шесть{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                 		return true;
   		            }
   		        }
   		        if(quest == 4)
   		        {
   		            if(!strlen(inputtext))
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}шесть{ffd66e} + {ffffff}восемь{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		            if(strcmp(inputtext, regQuest[3], true))
   		            {
         				PlayerInfo[playerid][pRegStage] = 2;
		    			SaveAccounts(playerid);
					    ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
   		            }
   		            else
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}шесть{ffd66e} + {ffffff}восемь{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		        }
   		        if(quest == 5)
   		        {
   		            if(!strlen(inputtext))
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}пять{ffd66e} + {ffffff}десять{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		            if(strcmp(inputtext, regQuest[4], true))
   		            {
         				PlayerInfo[playerid][pRegStage] = 2;
		    			SaveAccounts(playerid);
					    ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
   		            }
   		            else
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}пять{ffd66e} + {ffffff}десять{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		        }
   		        if(quest == 6)
   		        {
   		            if(!strlen(inputtext))
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}пять{ffd66e} + {ffffff}одиннадцать{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		            if(strcmp(inputtext, regQuest[5], true))
   		            {
         				PlayerInfo[playerid][pRegStage] = 2;
		    			SaveAccounts(playerid);
					    ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
   		            }
   		            else
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}пять{ffd66e} + {ffffff}одиннадцать{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		        }
   		        if(quest == 7)
   		        {
   		            if(!strlen(inputtext))
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}восемь{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		            if(strcmp(inputtext, regQuest[6], true))
   		            {
         				PlayerInfo[playerid][pRegStage] = 2;
		    			SaveAccounts(playerid);
					    ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
   		            }
   		            else
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}восемь{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		        }
   		        if(quest == 8)
   		        {
   		            if(!strlen(inputtext))
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}девять{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		            if(strcmp(inputtext, regQuest[7], true))
   		            {
         				PlayerInfo[playerid][pRegStage] = 2;
		    			SaveAccounts(playerid);
					    ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
   		            }
   		            else
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}девять{ffd66e} + {ffffff}девять{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		        }
   		        if(quest == 9)
   		        {
   		            if(!strlen(inputtext))
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}десять{ffd66e} + {ffffff}девять{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		            if(strcmp(inputtext, regQuest[8], true))
   		            {
         				PlayerInfo[playerid][pRegStage] = 2;
		    			SaveAccounts(playerid);
					    ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
   		            }
   		            else
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}десять{ffd66e} + {ffffff}девять{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                       	return true;
   		            }
   		        }
   		        if(quest == 10)
   		        {
   		            if(!strlen(inputtext))
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}десять{ffd66e} + {ffffff}десять{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		            if(strcmp(inputtext, regQuest[9], true))
   		            {
         				PlayerInfo[playerid][pRegStage] = 2;
		    			SaveAccounts(playerid);
					    ShowPlayerDialog(playerid, 5, DSM, "Пол", "{ffd66e}Выберите желаемый игровой пол.", "Парень", "Девушка");
   		            }
   		            else
   		            {
                        ShowPlayerDialog(playerid, 4, DSI, "Вопрос:", "{ffd66e}Сколько будет: {ffffff}десять{ffd66e} + {ffffff}десять{ffd66e} =  {ffffff}число{ffd66e} ? ({ffffff}Например, 6{ffd66e})", "Далее", "Отмена");
                        return true;
   		            }
   		        }
   		    }
			else
			{
                SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Внимание:{ffffff} Регистрация была прервана - Вы будете кикнуты.");
				SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Чтобы продолжить регистрацию, в следующий раз просто войдите на сервер под своим ником.");
				SendClientMessage(playerid, COLOR_WHITE, "{fff48d}Подсказка:{ffffff} Введите (q)uit, чтобы выйти.");
				Kickk
			}
   		}
   		case 5: // Отвечает за то, что регистрация прошла успешна, нам высветится диалог с выбором пола, и нам останется только прочитать правила сервера
   		{
   		    if(response)
   		    {
   		        PlayerInfo[playerid][pSex] = 1; // Если выбрали мужской пол, то записывается 1
   		        PlayerInfo[playerid][pRegStage] = 3; // Стадия регистрации - 3
   		        PlayerInfo[playerid][pSkin] = 23; // Выдаем 23 скин
   		        SaveAccounts(playerid);
   		        format(string, sizeof(string), "%s%s%s%s%s%s%s", ServerRules[0], ServerRules[1], ServerRules[2], ServerRules[3], ServerRules[4], ServerRules[5], ServerRules[6]);
   		        ShowPlayerDialog(playerid, 6, DSM, "Общие правила", string, "Играть", "");
   		        
   		    }
   		    else
   		    {
   		        PlayerInfo[playerid][pSex] = 2; // Если выбрали женский пол, то записывается 2
   		        PlayerInfo[playerid][pRegStage] = 3;
   		        PlayerInfo[playerid][pSkin] = 12; // Выдаем 12 скин
   		        SaveAccounts(playerid);
				format(string, sizeof(string), "%s%s%s%s%s%s%s", ServerRules[0], ServerRules[1], ServerRules[2], ServerRules[3], ServerRules[4], ServerRules[5], ServerRules[6]);
   		        ShowPlayerDialog(playerid, 6, DSM, "Общие правила", string, "Играть", "");
   		    }
   		}
   		case 6: // отвечает за полностью пройденную регистрация
   		{
   		    if(response)
   		    {
   		        PlayerInfo[playerid][pRegStage] = 4; // Стадия регистрации 4 - все нормально
   		        SaveAccounts(playerid); // Сохраняем аккаунт
   		        SpawnPlayer(playerid); // И спавним игрока
   		    }
   		    else
   		    {
   		        PlayerInfo[playerid][pRegStage] = 4;
   		        SaveAccounts(playerid);
   		        SpawnPlayer(playerid);
   		    }
   		}
	}
С диалогами закончили. Теперь нам останется создать сток с сохранением и подключить его
В самый конец мода:
PHP:
stock SaveAccounts(playerid)
{
	new  string[128];
	GetPlayerName(playerid, nickname, sizeof(nickname));
	format(string, sizeof(string), "Accounts/%s.ini", nickname);
	new File = iniOpen(string);
 	ini_setInteger(File, "Registration Stage", PlayerInfo[playerid][pRegStage]);
    ini_setInteger(File, "Login Tries", PlayerInfo[playerid][pLoginTries]);
    ini_setInteger(File, "Money", GetPlayerMoney(playerid));
    ini_setInteger(File, "Sex", PlayerInfo[playerid][pSex]);
    ini_setInteger(File, "Skin", PlayerInfo[playerid][pSkin]);
    ini_setInteger(File, "Level", PlayerInfo[playerid][pLevel]);
	ini_setInteger(File, "Admin", PlayerInfo[playerid][pAdmin]);
	ini_setInteger(File, "Moderator", PlayerInfo[playerid][pModerator]);
	ini_setInteger(File, "Chat Moderator", PlayerInfo[playerid][pChatModerator]);
	ini_setInteger(File, "House", PlayerInfo[playerid][pHouse]);
    iniClose(File);
}
И заменим паблик
PHP:
public OnPlayerDisconnect(playerid, reason)
на
PHP:
public OnPlayerDisconnect(playerid, reason)
{
	if Login[playerid] == 0 *then return 1;
	GetPlayerName(playerid, nickname, sizeof(nickname));
	SaveAccounts(playerid);
return 1;
}
И остается сделать последнее, сток со спавном игрока
Опять же в самый конец мода вставляем:
PHP:
stock SetPlayerSpawn(playerid)
{
	SetPlayerSkin(playerid, PlayerInfo[playerid][pSkin]); // Задаем скин из переменной pSkin
	SetPlayerScore(playerid, PlayerInfo[playerid][pLevel]); // Выдем level
	SetPlayerColor(playerid, 0xFFFFFF20);
	if(PlayerInfo[playerid][pHealth] <= 0) PlayerInfo[playerid][pHealth] = 100.0; // делаем здоровье - 100, дабы нас не спавнило и не убивало в туже секунду
	SetPlayerHealth(playerid, PlayerInfo[playerid][pHealth]);
	if(PlayerInfo[playerid][pLevel] >= 0)
	{
		SetPlayerPos(playerid, 330.0964,-1516.5410,35.8672); // Координаты появления. У меня это рядом с отелем в ЛС.
		SetPlayerFacingAngle(playerid, 229.3571);
		SetCameraBehindPlayer(playerid);
		SetPlayerVirtualWorld(playerid, 0);
		SetPlayerInterior(playerid, 0);
	}
	return true;
}
И в OnPlayerSpawn добавим:
PHP:
SetPlayerSpawn(playerid);
Я думаю, что объяснил все очень и очень подробно, проблем возникнуть не должно. Вам останется сделать следующее:
1) В папке scriptfiles создать папку Accounts
2) Скачать инклуд mxINI, и закинуть его в папку pawno --> include
Надеюсь мои старания были не зря. Более опытные скриптеры, к Вам просьба, если заметите какие либо ошибочки или более лучшую оптимизацию, напишите сюда или в лс. Всем спасибо :)

Скачать инклуд:
файл:
virustotal:
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.
Сверху Снизу