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

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

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

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

Мануал Регистрация R8 32 + Мультиязычность

Zhenia

Изучающий
Пользователь
Регистрация
8 Сен 2014
Сообщения
850
Лучшие ответы
1
Репутация
74
Создадим простую регистрацию и авторизацию на R8 32, использованный урок Мультиязычность [ALL]

PHP:
#define L(%0) %0[PlayerInfo[playerid][pLang]] // pLang можете заменить на другую переменную, 0 - русский, 1 - английский
#define PlusPVarInt(%0,%1,%2) SetPVarInt(%0,%1,GetPVarInt(%0,%1)+%2)

#define DIALOG_NULL 0 //пустой диалог. Ссылаются на него все пустышки.
#define DIALOG_REGISTER 1
#define DIALOG_LOGIN 2
#define DIALOG_PASS_ERROR 3
#define DIALOG_LANG 4


#define MYSQL_HOST      "IP "
#define MYSQL_USER      "user"
#define MYSQL_DB        "DB"
#define MYSQL_PASS      "PASS"
Создание диалогов и тд смотрим в уроке Мультиязычность [ALL]

В enum добавляем
PHP:
pName,
pPass[количество символов],
pLang,
Подключение
PHP:
public OnGameModeInit()
        mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_DB,MYSQL_PASS);
	mysql_function_query(1,"SET NAMES 'cp1251'",false,"","");
	mysql_set_charset("cp1251");
	mysql_log(100);
Проверка игрока в базе
PHP:
public OnPlayerConnect(playerid)
        new query[57]; 
	format(query,sizeof(query),"SELECT Pass FROM users WHERE Name='%s'",PlayerInfo[playerid][pName]);
	mysql_function_query(1,query,true,"GetPass","i",playerid);
Паблик получения пароля
PHP:
forwar GetPass(playerid);
public GetPass(playerid)
{
        if(!rows) //аккаунта нет
	{
	    ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_MSGBOX,"Язык | Language","Select language.\nВыберите языка.","English","Русский");
	    return 1;
	}
	ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,L(LoginTitle),L(LoginDlg),L(bInput),L(bExit)); // значение после L, это кнопки и надписи, сами их создавайте и ставить обязательно по порядку, а то бред выйдет
	new pass[17];
	cache_get_row(0,0,pass);
	format(PlayerInfo[playerid][pPass],17,pass); //сразу в глобальную извлечь нельзя. Только так.
	return 1;
}
Загружаем аккаунт.
PHP:
forward LoadAccount(playerid);
public LoadAccount(playerid)
{
	new rows,fields;   				//это все на всякий случай.
	cache_get_data(rows,fields); 	//Чтобы сервер не крашнуло.
	if(!rows) return Kick(playerid);
	
	new string[52];
	
	PlayerInfo[playerid][pPass] = cache_get_row_int(0,0); 
        //Принцип простой, в каком порядке стоит переменная в enum, такой порядок пишем в cache_get_row_int, например, pPass стоит первой, значит пишем 0.0, так как в кода все начинается с нуля.
	return 1;
}
Диалоги
PHP:
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
	switch(dialogid)
	{
	    case DIALOG_REGISTER:
	    {
	        if(!response) return Kick(playerid);
			if(strlen(inputtext) < 4 || strlen(inputtext) > 16) return SPD(playerid,DLG_REG,DIALOG_STYLE_PASSWORD,L(RegTitle),L(RegDlg),L(bInput),L(bExit));
			new query[84];
			format(query,sizeof(query),"INSERT INTO users(`Name`,`Pass`) VALUES ('%s','%s')",PlayerInfo[playerid][pName],inputtext);
			mysql_function_query(1,query,false,"","");
			
			format(query,sizeof(query),"SELECT * FROM users WHERE Name='%s'",PlayerInfo[playerid][pName]);
			mysql_function_query(1,query,true,"LoadPlayerAccount","i",playerid);
	    }
	    case DIALOG_LOGIN:
	    {
	        if(!response) return Kick(playerid);
	        if(!strlen(inputtext)) return SPD(playerid,DLG_LOGIN,DIALOG_STYLE_PASSWORD,L(LoginTitle),L(LoginDlg),L(bInput),L(bExit));
            new string[100];
			if(strcmp(PlayerInfo[playerid][pPass],inputtext,false) != 0)
	        {
	            PlusPVarInt(playerid,"PassErrCount",1);
	            if(GetPVarInt(playerid,"PassErrCount") == 3) return KickEx(playerid,2);
				format(string,sizeof(string),"%s %d",L(PassErrDlg),3-GetPVarInt(playerid,"PassErrCount"));
				if(PlayerInfo[playerid][pLang]) strcat(string," attempts.");
				else
				{
				    if(GetPVarInt(playerid,"PassErrCount")) strcat(string," попытка."); // 1 попытка
					else strcat(string," попытки."); //две попытки.
				}
				SPD(playerid,DIALOG_PASS_ERROR,DIALOG_STYLE_MSGBOX,L(PassErrTitle),L(PassErrDlg),L(bX),"");
	        }
	        format(string,sizeof(string),"SELECT * FROM users WHERE Name='%s'",PlayerInfo[playerid][pName]);
			mysql_function_query(1,string,true,"LoadAccount","i",playerid);
	    }
	    case DIALOG_PASS_ERROR: return ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,L(LoginTitle),L(LoginDlg),L(bInput),L(bExit));
		case DIALOG_LANG:
		{
		    PlayerInfo[playerid][pLang] = response;
			ShowPlayerDialog(playerid,DIALOG_REGISTER,DIALOG_STYLE_PASSWORD,L(RegTitle),L(RegDlg),L(bInput),L(bExit));
		}
	}
	return 1;

stock KickEx(playerid,reason)
{
	new string[70];
	string = L(KickPre);
	strcat(string,KickDlg[PlayerInfo[playerid][pLang]+(reason*2)-2]);
	SPD(playerid,DLG_NULL,DIALOG_STYLE_MSGBOX,L(KickTitle),string,L(bX),"");
	SetPVarInt(playerid,"TimeToKick",1);
	return 1;
}
}
1234
 
Последнее редактирование:
Сверху Снизу