Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Регистрация на mxINI - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

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

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

[ Scr ][ All ]
Регистрация на mxINI
Оценка: ***** 1 Голосов

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

  • Знаток
  • Вставить ник
  • Раскрыть информацию
Знаю что очень много было такие тем, но именно такой ни где не видел.
Итак, создавал данную регистрацию я по книжке, а именно (Pawn Book v5)
Что в ней будет:
: Сохранение Пароля, Левела, Национальности, Пола, Скина, Денег, Здоровья :
1.Шаг Подготовка
На самый вверх добавьте инклюд mxINI
#include <mxINI>


Дальше добавьте так-же наверху макросы:
#define DSI DIALOG_STYLE_INPUT
#define DSP DIALOG_STYLE_PASSWORD
#define DSL DIALOG_STYLE_LIST
#define DSM DIALOG_STYLE_MSGBOX
#define SPD ShowPlayerDialog
#define SCM SendClientMessage


Ниже макросов добавьте массив с данными игрока:
enum pInfo {
 	pPassword[21],
	pName[MAX_PLAYER_NAME],
 	pLevel,
 	pMoney,
	Float:pHealth,
	pMail[21],
	pNationaly,
	pSex,
	pSkin
}

Ниже массива переменные:
new player_info[MAX_PLAYERS][pInfo];
new bool:Login[MAX_PLAYERS];
new bool:CreateAccount[MAX_PLAYERS];
new ErPassword[MAX_PLAYERS];
new gSkinM[5] = { 1, 2, 3 ,4 ,5 }; // Мужские скины
new gSkinF[2] = { 13, 12 }; // Женские скины

2.Шаг Диалоги
Добавьте в OnPlayerRequestClass(playerid, classid), Данный код:
	ClearPeremens(playerid);
	new str[256];
	GetPlayerName(playerid, player_info[playerid][pName], 24);
	format(str, sizeof(str), "users/%s.ini", player_info[playerid][pName]);
	if(CreateAccount[playerid] == true) // Если игрок не прошел регистрацию и вышел, то удалим его аккаунт
	{
	    format(str, sizeof(str), "users/%s.ini", player_info[playerid][pName]);
	    fremove(str);
	}
	if(fexist(str))
	{
		format(str, sizeof(str), "Добро пожаловать на сервере Ride\nАвторизируйтесь:");
		SPD(playerid, 6, DSP, "Авторизация", str, "Вход", "Отмена");
	}
	else
	{
	    format(str, sizeof(str), "Добро пожаловать на сервере Ride\nПридумайте пароль и запишите в окошко:");
	    SPD(playerid, 1, DSI, "Регистрация", str, "Далее", "Отмена");
	}

Выглядеть должно так:
OnPlayerRequestClass [Показать]

Идем в паблик OnDialogResponse и добавляем вот этот код:
	new str[256];
	switch(dialogid)
	{
	    case 1:
	    {
			if(response)
			{
			    if(!strlen(inputtext))
			    {
				    format(str, sizeof(str), "Добро пожаловать на сервере Ride\nПридумайте пароль и запишите в окошко:");
				    SPD(playerid, 1, DSI, "Регистрация", str, "Далее", "Отмена");
			        return true; // Возращаем диалог если ничего не введено
			    }
			    if(strlen(inputtext) < 6 || strlen(inputtext) > 20) return SPD(playerid, 1, DSM, "Ошибка", "Длина пароля от 6-ти до 20-ти символов!", "Повтор", "");
				for(new i = strlen(inputtext); i != 0; --i)
				switch(inputtext[i])
				{
				    case 'А'..'Я','а'..'я': return SPD(playerid, 1, DSM, "Ошибка", "В пароле найдены Русские символы!", "Повтор", "");
				}
				format(str, sizeof(str), "users/%s.ini", player_info[playerid][pName]);
				new File = ini_createFile(str); // Создадим файл с именем игрока в папке users
				if(File < 0) // Если файл выдаст ошибку, то откроем снова
				return ini_openFile(str);
				{
				    ini_setString(File, "Password", inputtext); // Записываем, то что игрок ввел в диалоге
				    ini_setInteger(File, "Level", player_info[playerid][pLevel]); // Записываем левел
				    ini_setInteger(File, "Money", player_info[playerid][pMoney]); // Записываем деньги
					ini_setFloat(File, "Health", player_info[playerid][pHealth]); // Записываем здоровье
					ini_setInteger(File, "Nationaly", player_info[playerid][pNationaly]); // Записываем национальность
					ini_setInteger(File, "Sex", player_info[playerid][pSex]); // Записываем пол
					ini_setInteger(File, "Skin", player_info[playerid][pSkin]); // Записываем скин
					ini_closeFile(File); // Закрываем файл
				}
				CreateAccount[playerid] = true; // Включим переменную, для проверки
				SPD(playerid, 2, DSI, "Ввод E-MAIL", "Введите E-MAIL", "Далее", "Назад");
			}
			else
			{
			    Kick(playerid);
			}
	    }
	    case 2:
	    {
	        if(response)
	        {
	            if(!strlen(inputtext))
	            {
	            	SPD(playerid, 2, DSI, "Ввод E-MAIL", "Введите E-MAIL", "Далее", "Назад");
	            	return 1;
				}
				if(strlen(inputtext) < 6 || strlen(inputtext) > 20) return SPD(playerid, 2, DSI, "Ввод E-MAIL", "Введите E-MAIL", "Далее", "Назад");
				for(new i = strlen(inputtext); i != 0; --i)
				switch(inputtext[i])
				{
				    case 'А'..'Я','а'..'я': return SPD(playerid, 1, DSM, "Ошибка", "В MAIL найдены Русские символы!", "Повтор", "");
				}
				if(strfind(inputtext, "@mail.ru", true) == -1) return SPD(playerid, 2, DSI, "Ввод E-MAIL", "Введите E-MAIL", "Далее", "Назад");
				format(str, sizeof(str), "users/%s.ini", player_info[playerid][pName]);
				ini_setString(ini_openFile(str), "Mail", inputtext);
				ini_closeFile(ini_openFile(str));
				new RulesMSG[100]; // Создадим локальную переменную размером 100 байт
			    strins(RulesMSG,"{FF0000}1. Игрок\n{FFFFFF}1.1 Не делать то-то\n1.2 Ник такой такой",strlen(RulesMSG)); // Наши правила сервера
			    strins(RulesMSG,"{FFFFFF}Так сяк меняйте как хотите!",strlen(RulesMSG));
				SPD(playerid, 3, DSM, "Правила сервера", RulesMSG, "Согласен", "Выход");
	        }
	        else // Если игрок нажал назад, то вернем его в диалог 1
	        {
			    format(str, sizeof(str), "Добро пожаловать на сервере Ride\nПридумайте пароль и запишите в окошко:");
			    SPD(playerid, 1, DSI, "Регистрация", str, "Далее", "Отмена");
	        }
	    }
	    case 3:
	    {
	        if(response) SPD(playerid, 4, DSL, "Национальность", "[1] Русский\n[2] Американец", "Далее", "Назад");
	        else { SPD(playerid, 2, DSI, "Ввод E-MAIL", "Введите E-MAIL", "Далее", "Назад"); } // Вернем в диалог E-MAIL'а
	    }
		case 4: // Тут функционал нашего 4 диалога!
		{
			switch(listitem) // Проверка DIALOG_STYLE_LIST
			{
			    case 0: player_info[playerid][pNationaly] = 1; // Если выбрал Русский, то ставим значение 1
			    case 1: player_info[playerid][pNationaly] = 2; // Если выбрал Американец, то ставим значение 2
			} // Можете добавить ещё, кому-как
			SPD(playerid, 5, DSM, "Выбор пола", "Выберите пол", "Мужской", "Женский");
		}
		case 5:
		{
		    if(response)
		    {
		        player_info[playerid][pSex] = 1; // Если кнопка мужской, то значение 1
				new rand = random(sizeof(gSkinM)); // Рандомный скин при спавне
				SetPlayerSkin(playerid, gSkinM[rand]);
				player_info[playerid][pSkin] = gSkinM[rand];
			}
		    else
		    {
		    	player_info[playerid][pSex] = 2; // Если кнопка женский, то значение 2
				new rand2 = random(sizeof(gSkinF)); // Рандомный скин при спавне
				SetPlayerSkin(playerid, gSkinF[rand2]);
				player_info[playerid][pSkin] = gSkinF[rand2];
		    }
		    CreateAccount[playerid] = false; // Выключим переменную, (Она для того чтобы когда игрок зашел и сразу вышел его аккаунт удалился!) Он сохранится только по окончанию регистрации
			player_info[playerid][pLevel] = 1;
			player_info[playerid][pHealth] = 100.0;
			player_info[playerid][pMoney] = 10000;
			Login[playerid] = true;
		    SpawnPlayer(playerid);
		}
		case 6:
		{
		    if(response)
		    {
		        if(!strlen(inputtext))
		        {
					format(str, sizeof(str), "Добро пожаловать на сервере Ride\nАвторизируйтесь:");
					SPD(playerid, 6, DSP, "Авторизация", str, "Вход", "Отмена");
					return 1;
				}
				if(strlen(inputtext) < 6 || strlen(inputtext) > 20) return SPD(playerid, 6, DSM, "Ошибка", "Длина пароля от 6-ти до 20-ти символов!", "Повтор", "");
				for(new i = strlen(inputtext); i != 0; --i)
				switch(inputtext[i])
				{
				    case 'А'..'Я', 'а'..'я': return SPD(playerid, 6, DSM, "Ошибка", "В пароле найдены Русские символы!", "Повтор", "");
				}
				format(str, sizeof(str), "users/%s.ini", player_info[playerid][pName]);
				new File = ini_openFile(str);
				ini_getString(File, "Password", str);
				if(!strcmp(inputtext, str, true))
				{
				    ini_getString(File, "Password", str); // Узнаем пароль
				    ini_getInteger(File, "Level", player_info[playerid][pLevel]); // Узнаем левел
				    ini_getInteger(File, "Money", player_info[playerid][pMoney]); // Узнаем деньги
					ini_getFloat(File, "Health", player_info[playerid][pHealth]); // Узнаем здоровье
					ini_getInteger(File, "Nationaly", player_info[playerid][pNationaly]); // Узнаем национальность
					ini_getInteger(File, "Sex", player_info[playerid][pSex]); // Узнаем пол
					ini_getInteger(File, "Skin", player_info[playerid][pSkin]); // Узнаем скин
					ini_closeFile(File); // Закрываем файл
					SpawnPlayer(playerid);
					Login[playerid] = true;
		    }
		    	else
		    {
		        switch(ErPassword[playerid])
		        {
		            case 0:
		            {
			            SCM(playerid, 0xFFFFFFAA, "Вы ввели неверный пароль. {FF0000}У вас осталось 2 попытки!");
						format(str, sizeof(str), "Добро пожаловать на сервере Ride\nАвторизируйтесь:");
						SPD(playerid, 6, DSP, "Авторизация", str, "Вход", "Отмена");
	                    ErPassword[playerid] = 1;
                    }
                    case 1:
                    {
			            SCM(playerid, 0xFFFFFFAA, "Вы ввели неверный пароль. {FF0000}У вас осталось 1 попытка!");
						format(str, sizeof(str), "Добро пожаловать на сервере Ride\nАвторизируйтесь:");
						SPD(playerid, 6, DSP, "Авторизация", str, "Вход", "Отмена");
	                    ErPassword[playerid] = 2;
                    }
                    case 2:
                    {
			            SCM(playerid, 0xFFFFFFAA, "Вы ввели неверный пароль. {FF0000}У вас осталось 0 попыток!");
						format(str, sizeof(str), "Добро пожаловать на сервере Ride\nАвторизируйтесь:");
						SPD(playerid, 6, DSP, "Авторизация", str, "Вход", "Отмена");
	                    ErPassword[playerid] = 3;
                    }
                    case 3:
                    {
                        Kick(playerid);
                    }
				  }
     		   }
		    }
		    else { Kick(playerid); }
		}
	}

Выглядеть должно так:
OnDialogResponse [Показать]

3 Шаг - Стоки
Добавляем в самый низ стоки:
stock ClearPeremens(playerid)
{
	Login[playerid] = false;
	ErPassword[playerid] = 0;
}


stock SetPlayerSpawn(playerid)
{
	if(player_info[playerid][pHealth] <= 0) player_info[playerid][pHealth] = 100.0; // Если здоровье меньше 0 или ровняется 0, то восстановим его
	SetPlayerHealth(playerid, player_info[playerid][pHealth]); // Выдаем здоровье
	GivePlayerMoney(playerid, player_info[playerid][pMoney]); // Выдаем деньги
	SetPlayerSkin(playerid, player_info[playerid][pSkin]); // Выдаем скин
	SetPlayerScore(playerid, player_info[playerid][pLevel]); // Выдаем левел
	if(player_info[playerid][pLevel] >= 1)
	{
		SetPlayerPos(playerid, 1154.3717,-1769.2594,16.5938);
		SetPlayerFacingAngle(playerid, 0.6853);
		SetCameraBehindPlayer(playerid);
		SetPlayerVirtualWorld(playerid, 0);
		SetPlayerInterior(playerid, 0);
	}
	return 1;
}


stock SavePlayer(playerid)
{
	new str[50];
	format(str, sizeof(str), "users/%s.ini", player_info[playerid][pName]);
	new File = ini_openFile(str);
	if(!File)
	{
	 	ini_setInteger(File, "Level", player_info[playerid][pLevel]); // Записываем левел
	 	ini_setInteger(File, "Money", player_info[playerid][pMoney]); // Записываем деньги
	 	GetPlayerHealth(playerid, player_info[playerid][pHealth]); // Узнаем здоровье игрока
		ini_setFloat(File, "Health", player_info[playerid][pHealth]); // Записываем здоровье
		ini_setInteger(File, "Nationaly", player_info[playerid][pNationaly]); // Записываем национальность
		ini_setInteger(File, "Sex", player_info[playerid][pSex]); // Записываем пол
		ini_setInteger(File, "Skin", player_info[playerid][pSkin]); // Записываем скин
		ini_closeFile(File); // Закрываем файл
	}
}


4. Шаг
Идем в public OnPlayerSpawn
И туда вставляем вот этот код:
	if(Login[playerid] == false) // Если игрок не авторизован и он нажал на кнопку spawn, то кикнем его (Можно что-то другое)
	{
	    Kick(playerid);
	}
	SetPlayerSpawn(playerid); // Пропишу тут сток со спавном, чтобы в будущем не запутаться

Выглядеть должно так:
OnPlayerSpawn [Показать]


Идем в public OnPlayerText
И вставляем вот этот код:
	if(Login[playerid] == false) // Если игрок не авторизован и он написал в чат, то кикнем его
	{
	    Kick(playerid);
	}

Выглядеть должно так:
OnPlayerText [Показать]


Идем в public OnPlayerCommandText
И вставляем вот этот код:
	if(Login[playerid] == false) // Если игрок не авторизован и он написал в чат команду, то кикнем его
	{
	    Kick(playerid);
	}

Выглядеть должно так:
OnPlayerCommandText [Показать]


Идем в public OnPlayerDisconnect
И вставляем вот этот код:
	new str[30];
	if(CreateAccount[playerid] == true) // На всякий случай создам доп.удаление аккаунта при уходе от регистрации
	{
		 format(str, sizeof(str), "users/%s.ini", player_info[playerid][pName]);
		 fremove(str);
	}
	if(Login[playerid] == true) SavePlayer(playerid); // Если переменная Login будет true(Истина), то сохраним аккаунт

Выглядеть должно так:
OnPlayerDisconnect [Показать]


Ищем public OnGameModeExit
И вставляем вот этот код:
foreach(new i: Player) SavePlayer(i);


Вот и всё, если есть Баги или Вопросы, то пишите.
Делал в основном по учебнику Pawn Book V5
Скачать:
* Изображение Ссылка на new.pwn(Готовое)
* Изображение Ссылка на mxIN(Последний)
* Изображение Ссылка на foreach
0

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

  • Новичок
  • Вставить ник
  • Раскрыть информацию
error 017: undefined symbol "ClearPeremens"
Ошибка вылезла
0

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

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

Просмотр сообщенияKuliSH (17 Декабрь 2017 - 09:43) писал:

error 017: undefined symbol "ClearPeremens"
Ошибка вылезла


Проверь у тебя в OnPlayerConnect есть
ClearPeremens(playerid);

и в самом конце stock
stock ClearPeremens(playerid)
{
	Login[playerid] = false;
	ErPassword[playerid] = 0;
}

0

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

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Всё заработало, спасибо! Можешь меня в ВК добавить, поговорить нужно?
https://vk.com/kulish_21
0

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

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

Просмотр сообщенияKuliSH (17 Декабрь 2017 - 09:54) писал:

Всё заработало, спасибо! Можешь меня в ВК добавить, поговорить нужно?
https://vk.com/kulish_21

Добавил
0

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

  • Х_X
  • Вставить ник
  • Раскрыть информацию
В чём смысл создавать подобные уроки, когда их МОРЕ и они ни чем не отличаются друг от друга.
1

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

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

Просмотр сообщенияSonic X (17 Декабрь 2017 - 12:22) писал:

В чём смысл создавать подобные уроки, когда их МОРЕ и они ни чем не отличаются друг от друга.

Именно через format и switch я не видел на данном форуме в основном используют if(dialogid == 1)
И через доп. паблики + это не урок, а готовое решение!
Я просто выложил свой труд, может кому-нибудь, да пригодиться.

Сообщение отредактировал Avisomik: 17 Декабрь 2017 - 14:41

0

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

  • Х_X
  • Вставить ник
  • Раскрыть информацию
Вот, посмотри, о чём я - ссылка
0

#9
Пользователь офлайн   Yakess 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Спасибо, за регистрацию, не много под шаманил я под Drift и все работает отлично, хоть и давно этот урок был создан :yes:
Только как админ систему сделать, с этой регистрацией?

Сообщение отредактировал Yakess: 10 Январь 2019 - 20:13

0

#10
Пользователь офлайн   Avisomik 

  • Знаток
  • Вставить ник
  • Раскрыть информацию
Честно говоря, давно забросил mxINI (уже и не помню).

Но на форме есть много подобных систем.

Сообщение отредактировал Avisomik: 11 Январь 2019 - 15:43

0

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


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

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


Яндекс.Метрика