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

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

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

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

Мануал Система регистрации R39-6

Zzzerl

Нуль
Регистрация
29 Сен 2017
Сообщения
8
Лучшие ответы
0
Репутация
9
Что включает в себя данный мануал?
Регистрация:
1. Пароль
2. Повторение пароля
3. Почта - проверка занята ли почта другим игроком
4.Выбор пола
5. Спавн игрока
Авторизация:
1. Пароль
2. Спавн игрока




И так начнем.

Подключаем библиотеку MySQL
ко всем Include

PHP:
#include <a_mysql>
Чтобы не искать строчку для логина, пароля, базы
создадим макрос

PHP:
#define HOST "HOST"
#define USER "USER"
#define PASS "PASS"
#define DB "DATABASE"
#define MAXLOGINA 3 //количество попыток входа в аккаунт

forward CheckUser(playerid);
forward OnPlayerJoin(playerid);

Создадим переменные
PHP:
enum PDATA
{
	pId,//ID игрока в базе
	pName[MAX_PLAYER_NAME], //Ник игрока
	pPassword[32], //Пароль игрока
	pEmail[64], //Почта игрока
	pSex //Пол игрока
}
enum PTEMP
{
	bool:pJoined, //Игрока зашел
	bool:pLogined, //Игрок авторизовался
	pLoginAttempt //Попытки входа
}
//Диалоги
enum 
{
	dLogin, //Авторизация
	dRegister, //Рег пароль
	dRegister1, //Рег повтор пароля
	dRegister2, //Рег Почта
	dRegister3 //Рег Пол
}
new mysql;
new pData[MAX_PLAYERS][PDATA];
new pTemp[MAX_PLAYERS][PTEMP];
new sdialog[193];//Массив для работы с диалогами регистрации\авторизации
В public OnGameModeInit()

PHP:
mysql = mysql_connect(HOST, USER, DB, PASS); //Подключение к базе
Чтобы вывести статус подключения, вставляем такой код в main{}

PHP:
if(mysql_errno())
        print(" Подключение к базе не установлено");
    else
    {
        print(" Подключение установлено");
        mysql_query(1,"SET NAMES cp1251");
	}
В public OnGameModeExit()
PHP:
mysql_close(mysql);//закрываем соединение
В public OnDialogResponse
PHP:
switch(dialogid)
{
	case dRegister:
	{
		if(!response)
		{
			SendClientMessage(playerid,0xFFFFFFFF,"Введите /q чтобы выйти");
			Kick(playerid);
		}
		else if(!strlen(inputtext))
		{
			SendClientMessage(playerid,0xAFAFAFAA,"Вы не ввели пароль");
			format(sdialog,sizeof(sdialog),"{FFFFFF}Добро пожаловать на сервер {20997c}Top Servak{FFFFFF}.\nВаш логин: {4981b3}%s{FFFFFF}\n\nДанный аккаунт {4ac24a}свободен{FFFFFF}.\nЧтобы зарегистрироваться введите пароль:",pData[playerid][pName]);
			ShowPlayerDialog(playerid, dRegister, 1, "Регистрация", sdialog, "Далее", "Выйти");
		}
		else
		{
			if(strfind(inputtext,"|") != -1)
			{
				SendClientMessage(playerid,0xAFAFAFAA,"У вас в пароле присутствуют запрещенные символы");
				format(sdialog,sizeof(sdialog),"{FFFFFF}Добро пожаловать на сервер {20997c}Top Servak{FFFFFF}.\nВаш логин: {4981b3}%s{FFFFFF}\n\nДанный аккаунт {4ac24a}свободен{FFFFFF}.\nЧтобы зарегистрироваться введите пароль:",pData[playerid][pName]);
				ShowPlayerDialog(playerid, dRegister, 1, "Регистрация", sdialog, "Далее", "Выйти");
			}
			if(strlen(inputtext) <6 || strlen(inputtext) > 32)
			{
				SendClientMessage(playerid,0xFFFFFFFF,"Длина пароля должна быть от 6-и до 32-х символов");
				format(sdialog,sizeof(sdialog),"{FFFFFF}Добро пожаловать на сервер {20997c}Top Servak{FFFFFF}.\nВаш логин: {4981b3}%s{FFFFFF}\n\nДанный аккаунт {4ac24a}свободен{FFFFFF}.\nЧтобы зарегистрироваться введите пароль:",pData[playerid][pName]);
				ShowPlayerDialog(playerid, dRegister, 1, "Регистрация", sdialog, "Далее", "Выйти");
			}
			SetPVarString(playerid,"passvtr",inputtext);
			ShowPlayerDialog(playerid,dRegister1,3,"Регистрация","{FFFFFF}Чтобы убедиться что вы не ошиблись при вводе\n\nПовторите ваш пароль:","Далее","Назад");
		}
	}
	case dRegister1:
	{
		new oldpass[32];
		GetPVarString(playerid,"passvtr",oldpass,32);
		DeletePVar(playerid,"passvtr");
		if(!response)
		{
			format(sdialog,sizeof(sdialog),"{FFFFFF}Добро пожаловать на сервер {20997c}Amicorum Role Play{FFFFFF}.\nВаш логин: {4981b3}%s{FFFFFF}\n\nДанный аккаунт {4ac24a}свободен{FFFFFF}.\nЧтобы зарегистрироваться введите пароль:",pData[playerid][pName]);
			ShowPlayerDialog(playerid, dRegister, 1, "Регистрация", sdialog, "Далее", "Выйти");
		}
		if(!strcmp(inputtext,oldpass,false) && strlen(inputtext))
		{
			strcat(pData[playerid][pPassword],inputtext, 32);
			ShowPlayerDialog(playerid,dRegister2,1,"{ffffad}Регистрация","{FFFFFF}Введите адрес Вашей электронной почты\nИспользуя его, вы сможете восстановить доступ к аккаунту\nв случае взлома или если забудете пароль\n\nУбедитесь в правильности ввода","Далее","Назад");
		}
		else
		{
			SendClientMessage(playerid,0xAFAFAFAA,"Введенные Вами пароли не совпадают");
			format(sdialog,sizeof(sdialog),"{FFFFFF}Добро пожаловать на сервер {20997c}Amicorum Role Play{FFFFFF}.\nВаш логин: {4981b3}%s{FFFFFF}\n\nДанный аккаунт {4ac24a}свободен{FFFFFF}.\nЧтобы зарегистрироваться введите пароль:",pData[playerid][pName]);
			ShowPlayerDialog(playerid, dRegister, 1, "Регистрация", sdialog, "Далее", "Выйти");
		}
	}
	case dRegister2:
	{
		if(!response)
		{
			format(sdialog,sizeof(sdialog),"{FFFFFF}Добро пожаловать на сервер {20997c}Amicorum Role Play{FFFFFF}.\nВаш логин: {4981b3}%s{FFFFFF}\n\nДанный аккаунт {4ac24a}свободен{FFFFFF}.\nЧтобы зарегистрироваться введите пароль:",pData[playerid][pName]);
			ShowPlayerDialog(playerid, dRegister, 1, "Регистрация", sdialog, "Далее", "Выйти");
		}
		if(strfind(inputtext,"|") != -1)
		{
			SendClientMessage(playerid,0xAFAFAFAA,"У вас в почте присутствуют запрещенные символы");
			format(sdialog,sizeof(sdialog),"{FFFFFF}Добро пожаловать на сервер {20997c}Amicorum Role Play{FFFFFF}.\nВаш логин: {4981b3}%s{FFFFFF}\n\nДанный аккаунт {4ac24a}свободен{FFFFFF}.\nЧтобы зарегистрироваться введите пароль:",pData[playerid][pName]);
			ShowPlayerDialog(playerid, dRegister, 1, "Регистрация", sdialog, "Далее", "Выйти");
		}
		else
		{
			new querys[90];
			format(querys,sizeof(querys),"SELECT `Id` FROM `Users` WHERE `Email` = '%s'",inputtext);
			mysql_query(mysql, querys);
			if(cache_get_row_count(mysql))
			{
				SendClientMessage(playerid,CGRAY,"Данный eMail уже используется");
				format(sdialog,sizeof(sdialog),"{FFFFFF}Добро пожаловать на сервер {20997c}Amicorum Role Play{FFFFFF}.\nВаш логин: {4981b3}%s{FFFFFF}\n\nДанный аккаунт {4ac24a}свободен{FFFFFF}.\nЧтобы зарегистрироваться введите пароль:",pData[playerid][pName]);
				ShowPlayerDialog(playerid, dRegister, 1, "Регистрация", sdialog, "Далее", "Выйти");
				return 0;
			}
			strcat(pData[playerid][pEmail],inputtext, 64);
			ShowPlayerDialog(playerid,dRegister3,0,"Регистрация","Выберите пол для вашего персонажа.", "Мужской", "Женский");
		}
	}
	case dRegister3:
	{
		if(response) pData[playerid][pSex] = 1;
		else pData[playerid][pSex] = 2;
		RegisterPlayer(playerid);
	}
	case dLogin:
	{
		if(!response)
		{
			SendClientMessage(playerid,0xFFFFFFFF,"Введите /q что бы Выйти");
			Kick(playerid);
		}
		else if(!strlen(inputtext))
		{
			format(sdialog, sizeof(sdialog),"{FFFFFF}Добро пожаловать на сервер{4682b3} Top serva{FFFFFF}.\n\tВаш логин: {4682b3}%s{FFFFFF}\n\nДанный аккаунт {96ffa8}зарегистрирован{ffffff}.\nЧтобы войти введите пароль:",pData[playerid][pName]);
			ShowPlayerDialog(playerid, dLogin, 3, "Авторизация", sdialog, "Войти", "Выйти");
		}
		else
		{
			if(!strcmp(inputtext,pData[playerid][pPassword],false,MAX_PLAYER_NAME))
			{
				pTemp[playerid][pLogined] = true;
				LoadPlayerData(playerid);
				SpawnPlayer(playerid);
			}
			else
			{
				pTemp[playerid][pLoginAttempt]++;
				if(pTemp[playerid][pLoginAttempt] == MAXLOGINA)
				{
					SendClientMessage(playerid,0xFF0000AA,"Вы исчерпали лимит попыток ввода пароля, Вы были кикнуты!");
					SendClientMessage(playerid,0xFFFFFFFF,"Напишите /q что бы Выйти");
					return Kick(playerid);
				}
				new str[43];
				new maxim = MAX_LOGIN_ATTEMPTS-pTemp[playerid][pLoginAttempt];
				format(str, 43,"Пароль введен неверно. Осталось попыток: %d",maxim);
				SendClientMessage(playerid,0xFF0000AA,str);
				format(sdialog, sizeof(sdialog),"{FFFFFF}Добро пожаловать на сервер{4682b3} Top serva{FFFFFF}.\n\tВаш логин: {4682b3}%s{FFFFFF}\n\nДанный аккаунт {96ffa8}зарегистрирован{ffffff}.\nЧтобы войти введите пароль:",pData[playerid][pName]);
				ShowPlayerDialog(playerid, dLogin, 3, "Авторизация", sdialog, "Войти", "Выйти");
			}
		}
	}
}
Теперь создадим нужные Stock's и Public's
PHP:
stock RegisterPlayer(playerid) //регистрация игрока
{
	new query_string[300];
	format(query_string, sizeof(query_string),"INSERT INTO `Users` (`Name`,`Password`,`Email`,`Sex`) VALUES ('%s','%s','%s','%d')",pData[playerid][pName],pData[playerid][pPassword],pData[playerid][pEmail],pData[playerid][pSex]);
	mysql_query(mysql, query_string, false);
	SendClientMessage(playerid,0x33AA33AA,"Аккаунт зарегистрирован");
	pTemp[playerid][pLogined] = true;
	LoadPlayerData(playerid); //загрузка данных из базы
	SpawnPlayer(playerid);
	return 1;
}
stock LoadPlayerData(playerid) //загрузка данных игрока из базы
{
	new query[61]; format(query, 61, "SELECT * FROM `Users` WHERE Name = '%s'",pData[playerid][pName]);
	mysql_query(mysql, query);
	if(cache_get_row_count(mysql))
	{
		pData[playerid][pId] = cache_get_field_content_int(0, "Id", mysql);
		cache_get_field_content(0, "Name", pData[playerid][pName], mysql, 24);
        	cache_get_field_content(0, "Email", pData[playerid][pEmail], mysql, 64);
        	pData[playerid][pSex] = cache_get_field_content_int(0, "Sex", mysql);
	}
	return 1;
}
stock UpdatePlayerData(playerid,field[],data) //обновление данных игрока
{
	new query[90];
	format(query,sizeof(query),"UPDATE `Users` SET `%s` = '%d' WHERE `Name` = '%s'",field,data,pData[playerid][pName]);
	mysql_query(mysql, query);
	return 1;
}
stock PlayerDef(playerid) //Обнуление данных игрока при выходе
{
	pData[playerid][pId] = -1;
	strdel(pData[playerid][pName], 0, 24);
	strdel(pData[playerid][pPassword], 0, 32);
	strdel(pData[playerid][pEmail], 0, 64);
	pData[playerid][pSex] = 0;
}
public OnPlayerJoin(playerid) //Проверка есть ли в базе игрок
{
	TogglePlayerControllable(playerid,0);
	SpawnPlayer(playerid);
	SetPlayerVirtualWorld(playerid,playerid+1);
	SetPlayerPos(playerid, -1532.9323,688.2255,133.0514);
	GetPlayerName(playerid, pData[playerid][pName], MAX_PLAYER_NAME);
	new smysql[72];
	mysql_format(mysql, smysql, sizeof smysql, "SELECT `Id`,`Password` FROM `Users` WHERE `Name` = '%s'", pData[playerid][pName]);
	mysql_tquery(mysql, smysql, "CheckUser", "d", playerid);
}
public CheckUser(playerid)
{
	if(cache_get_row_count(mysql))
	{
		new id = cache_get_row_int(0, 0, mysql);
		cache_get_row(0, 1, pData[playerid][pPassword], mysql, 32);
		format(sdialog,190,"{FFFFFF}Добро пожаловать на сервер{4682b3} Amicorum Role Play{FFFFFF}.\n\tВаш логин: {4682b3}%s{FFFFFF}\n\nДанный аккаунт {96ffa8}зарегистрирован{ffffff}.\nЧтобы войти введите пароль:",pData[playerid][pName]);
		ShowPlayerDialog(playerid, dLogin, 3, "Авторизация", sdialog, "Войти", "Выйти");
	}
	else
	{
		format(sdialog,193,"{FFFFFF}Добро пожаловать на сервер {20997c}Amicorum Role Play{FFFFFF}.\nВаш логин: {4981b3}%s{FFFFFF}\n\nДанный аккаунт {4ac24a}свободен{FFFFFF}.\nЧтобы зарегистрироваться введите пароль:",pData[playerid][pName]);
		ShowPlayerDialog(playerid, dRegister, 1, "Регистрация", sdialog, "Далее", "Выйти");
	}
}
В public OnPlayerRequestClass
PHP:
pTemp[playerid][pJoined] = true;
SetTimerEx("OnPlayerJoin",10,false,"i",playerid);
return 1;
В public OnPlayerSpawn
PHP:
TogglePlayerControllable(playerid,0);
 if(!pTemp[playerid][pLogined] || !pTemp[playerid][pJoined]) return 1;
SetPlayerVirtualWorld(playerid,0);
SetPlayerInterior(playerid,0);
SetPlayerPos(playerid,1208.2224,-1747.0385,13.5933);
SetPlayerFacingAngle(playerid, 87.0252);
В public OnPlayerConnect
PHP:
pTemp[playerid][pLogined] = false;
PlayerDef(playerid);
В public OnPlayerDisconnect
PHP:
pTemp[playerid][pLogined] = false;
    pTemp[playerid][pJoined] = false;
    PlayerDef(playerid);
Сама база



Как использовать UpdatePlayerData

UpdatePlayerData(playerid,field[],data) - playerid понятно, field - имя столбца в базе, data - переменная

Пример:

UpdatePlayerData(playerid,"Money",pData[playerid][pMoney])


Если забыл добавить какую то строчку, прошу написать об этом
 
Сверху Снизу