Форум Pawn.Wiki - Воплоти мечту в реальность!: [mxINI] Полноценная регистрация для новичков! - Форум Pawn.Wiki - Воплоти мечту в реальность!

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

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

[ Урок ]
[mxINI] Полноценная регистрация для новичков! Новички, загляните обязательно!
Оценка: -----

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

  • Прохожий
  • Вставить ник
  • Раскрыть информацию
Доброго времени суток! Недавно я задался таким вопросом: "А как же создать регистрацию на mxINI?". И вот я разобрался что к чему и хочу показать/научить новичков, как же просто это делается!
Так же не откажусь от плюсика!



И так! Первым делом нам нужен сам include mxINI. Что бы его скачать перейдите по ссылке - https://pawn.wiki/in...ic/12399-mxini/
[ВНИМАНИЕ]: Скачивать обязательно версию - 0.5.2!
1. И так! Когда вы его скачали, следует его установить, то есть распаковать архив в папку pawno/include вашего сервера!

2. Открываем pawno и запускаем наш мод. В начале где находятся все инклуды пишем: #include <mxINI> (МОЖНО СКОПИРОВАТЬ)

3. Поздравляю, инклуд подключен! Теперь после всех #include или #define(если они у вас есть) пишем:

enum pInfo
{
    pPass[32];
};

Объясняю! Это мы добавили для сохранения наших данных. pInfo - PlayerInfo, понятно что здесь будут хранится данные об игроках.
То есть будем сохранять для начал только пароль. Значение [32] - максимальное кол-во символов в пароле!

4. Теперь после сохранения данных добавим две переменные:
new PlayerInfo[MAX_PLAYERS][pInfo];
new PAccount[MAX_PLAYERS];

1-ая переменная создана для того что бы сохранение данных было в наш enum!
2-ая переменная создана для того что бы мы проверяли, есть аккаунт или нет!

5. Теперь в паблик OnPlayerRequestClass вставим:
	if(PAccount[playerid] == 1) // Если аккаунт есть в базе данных, то:
	{
	    ShowPlayerDialog(playerid, 1001, DIALOG_STYLE_INPUT, "{800000}Авторизация аккаунта", "{FFFFFF}Доброго времени суток! Вас приветствует сервер {FFFF00}Sunrise Role Play{FFFFFF}!\n{FFFFFF}Чтобы начать игру на сервере пройдите авторизацию.\n{FFFFFF}Введите ваш пароль, который вводили при регистрации!\n\n{800000}[ВНИМАНИЕ]: {FFFFFF}Если вы забыли пароль от аккаунта, то обратитесь к старшим на форуме!", "{800000}Далее", "{800000}Выход");
	}
	    else // Если аккаунта нет в базе данных, то:
	{
	    ShowPlayerDialog(playerid, 1000, DIALOG_STYLE_INPUT, "{800000}Регистрация аккаунта", "{FFFFFF}Доброго времени суток! Вас приветствует сервер {FFFF00}Sunrise Role Play{FFFFFF}!\nЧтобы начать игру на сервере пройдите регистрацию.\n{FFFFFF}Придумайте сложный пароль.\n\n\t{7CFC00}Примечание:\n\t- Пароль чувствителен к регистру\n\t- Пароль должен состоять от 6-ти до 32-ух символов\n\t- Пароль может состоять из русских и латинских символов и чисел", "{800000}Далее", "{800000}Выход");
	}

Объясняю! Мы создали 2 диалога. Первый диалог - авторизация, второй диалог - регистрация. Ранее мы создавали переменную:
new PAccount[MAX_PLAYERS];
И теперь наша конструкция читается так - если(if) аккаунт найден(PAccount[playerid] == 1), то покажем авторизацию, иначе - регистрацию!

6. С диалогами разобрались. Теперь добавим им функционал. Найдём public OnDialogResponse и вставим:
	if(dialogid == 1001)
	{
	    if(response)
	    {
	        if(!strlen(inputtext))
	        {
	            SendClientMessage(playerid, 0x800000FF, "[Ошибка] {FFFFFF}Вы не ввели пароль в окно авторизации!");
	            ShowPlayerDialog(playerid, 1001, DIALOG_STYLE_INPUT, "{800000}Авторизация аккаунта", "{FFFFFF}Доброго времени суток! Вас приветствует сервер {FFFF00}Sunrise Role Play{FFFFFF}!\n{FFFFFF}Чтобы начать игру на сервере пройдите авторизацию.\n{FFFFFF}Введите ваш пароль, который вводили при регистрации!\n\n{800000}[ВНИМАНИЕ]: {FFFFFF}Если вы забыли пароль от аккаунта, то обратитесь к старшим на форуме!", "{800000}Далее", "{800000}Выход");
	            return 1;
	        }
	        new pass[32];
	        strmid(pass, inputtext, 0, strlen(inputtext), 32);
	        OnPlayerLogin(playerid, pass);
	    }
	    else
	    {
	        SendClientMessage(playerid, 0x1E90FFFF, "[Подсказка] {FFFFFF}Вы отказались от авторизации. Чтобы выйти из игры воспользуйтесь командой /q(/quit)!");
	        Kick(playerid);
		}
	}
	if(dialogid == 1000)
	{
	    if(response)
	    {
	        if(!strlen(inputtext))
	        {
	            SendClientMessage(playerid, 0x800000FF, "[Ошибка] {FFFFFF}Вы не ввели пароль в окно регистрации!");
	            ShowPlayerDialog(playerid, 1000, DIALOG_STYLE_INPUT, "{800000}Регистрация аккаунта", "{FFFFFF}Доброго времени суток! Вас приветствует сервер {FFFF00}Sunrise Role Play{FFFFFF}!\nЧтобы начать игру на сервере пройдите регистрацию.\n{FFFFFF}Придумайте сложный пароль.\n\n\t{7CFC00}Примечание:\n\t- Пароль чувствителен к регистру\n\t- Пароль должен состоять от 6-ти до 32-ух символов\n\t- Пароль может состоять из русских и латинских символов и чисел", "{800000}Далее", "{800000}Выход");
	            return 1;
	        }
	        new pass[32];
	        strmid(pass, inputtext, 0, strlen(inputtext), 32);
	        OnPlayerRegister(playerid, pass);
	    }
	        else
		{
	        SendClientMessage(playerid, 0x1E90FFFF, "[Подсказка] {FFFFFF}Вы отказались от регистрации. Чтобы выйти из игры воспользуйтесь командой /q(/quit)!");
	        Kick(playerid);
		}
	}

ДА! Текста много, но это не страшно, объясняю! Если перед игроком авторизация и ответ получен(то происходят действия)
НО
А если игрок ничего не написал??? Правильно! Для этого добавим проверку. Она начинается от if(!strlen(inputtext)).
Если ничего не написано в поле ввода, то мы должны сказать игроку в чате чтобы он написал пароль и снова показать диалог авторизации!
И очень часто люди забывают написать "return 1;" (прекратить действие), это нужно для того чтобы у игрока не было флуда, если ничего не напишет.
Далее создаётся новая переменная пароля - "pass[32]".
Строка - strmid(pass, inputtext, 0, strlen(inputtext), 32); проверяет, правильный ли пароль написал игрок в поле ввода.
Если да, то срабатывает public OnPlayerLogin который мы создадим позже!
А если же не правильный пароль, то у игрока просто снова появится окно авторизации.
Так же мы добавили кнопку "Выход", если он на неё нажмёт, то игрока кикнет и в чате появится подсказка о том как выйти из игры в этом случае.
АВТОРИЗАЦИЯ ГОТОВА!

После этого мы создали функционал для регистрации. Здесь всё то, что и в авторизации.
Если игрок ничего не написал, то окно регистрации появится заного и игрока предупредит чат!
Если игрок написал пароль, то покажем окно авторизации!
Но если же он нажмёт на кнопку "Выход" - его оповестят в чате и кикнут!
7. Поздравляю... Функционал готов, НО есть одно НО!!!
Если скомпилировать будут ошибки насчёт "OnPlayerLogin" и "OnPlayerReister". Чтобы их исправить, вставляем:
public OnPlayerRegister(playerid, password[])
{
	if(IsPlayerConnected(playerid))
	{
	    new string[64];
	    new playername[MAX_PLAYER_NAME];
	    GetPlayerName(playerid, playername, sizeof(playername));
	    format(string, sizeof(string), "users/%s.ini", playername);
	    new iniFile = ini_createFile(string);
	    if(iniFile < 0)
	    {
	        iniFile = ini_openFile(string);
	    }
	    if(iniFile >= 0)
	    {
	        strmid(PlayerInfo[playerid][pPass], password, 0, strlen(password), 255);
	        ini_setString(iniFile, "Pass", PlayerInfo[playerid][pPass]);
	        ini_closeFile(iniFile);
	        ShowPlayerDialog(playerid, 1001, DIALOG_STYLE_INPUT, "{800000}Авторизация аккаунта", "{FFFFFF}Доброго времени суток! Вас приветствует сервер {FFFF00}Sunrise Role Play{FFFFFF}!\n{FFFFFF}Чтобы начать игру на сервере пройдите авторизацию.\n{FFFFFF}Введите ваш пароль, который вводили при регистрации!\n\n{800000}[ВНИМАНИЕ]: {FFFFFF}Если вы забыли пароль от аккаунта, то обратитесь к старшим на форуме!", "{800000}Далее", "{800000}Выход");
	    }
	}
	return 1;
}

public OnPlayerLogin(playerid, password[])
{
    if(IsPlayerConnected(playerid))
    {
    	new string[64];
        new pass[32];
        new playername[MAX_PLAYER_NAME];
        GetPlayerName(playerid, playername, sizeof(playername));
        format(string,sizeof(string), "users/%s.ini", playername);
        new iniFile = ini_openFile(string);
        ini_getString(iniFile,"Pass",pass,32);
        if(strcmp(pass,password,true) == 0)
        {
            ini_getString(iniFile,"Pass",PlayerInfo[playerid][pPass], 32);
            ini_closeFile(iniFile);
        }
			else
		{
		    ini_closeFile(iniFile);
      		ShowPlayerDialog(playerid, 1001, DIALOG_STYLE_INPUT, "{800000}Авторизация аккаунта", "{FFFFFF}Доброго времени суток! Вас приветствует сервер {FFFF00}Sunrise Role Play{FFFFFF}!\n{FFFFFF}Чтобы начать игру на сервере пройдите авторизацию.\n{FFFFFF}Введите ваш пароль, который вводили при регистрации!\n\n{800000}[ВНИМАНИЕ]: {FFFFFF}Если вы забыли пароль от аккаунта, то обратитесь к старшим на форуме!", "{800000}Далее", "{800000}Выход");
			return 1;
		}
		SpawnPlayer(playerid);
	}
	return 1;
}

ОБЪЯСНЯЮ!!!
Паблик OnPlayerRegister создан для СОЗДАНИЯ файла с ником игрока.
Паблик OnPlayerLogin - для записи пароля в созданный файл!
Теперь пробуем компилировать!
Если ошибок нет - продолжаем, есть - ищем ошибку(если не знаете - пишите тут в комменты!)
8. Создаём сток для сохранения аккаунта и пароля при дисконекте!
Для этого листаем в конец мода и вставляем:
stock SavePlayer(playerid)
{
	new string[64];
	new playername[MAX_PLAYER_NAME];
	GetPlayerName(playerid, playername, sizeof(playername));
	format(string, sizeof(string), "users/%s.ini", playername);
	new iniFile = ini_openFile(string);
	ini_getString(iniFile, "Pass", PlayerInfo[playerid][pPass]);
	ini_closeFile(iniFile);
}

Здесь мы получаем ИМЯ игрока и записываем ПАРОЛЬ в файл. Остался один шаг!
9. Делаем сохранение при выходе из игры:
SavePlayer(playerid);

Всё! Наша регистрация и авторизация - ГОТОВА.
ЕСЛИ ЕСТЬ ОШИБКИ - ПИШИТЕ СЮДА - ПОМОГУ
АВТОР - ROMIROO2

0

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

  • Прохожий
  • Вставить ник
  • Раскрыть информацию
Инклуд сделал, что не так?
https://imgur.com/a/7GezNOh

Сообщение отредактировал zdronx: 02 мая 2020 - 23:24

0

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

  • Прохожий
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияzdronx (02 мая 2020 - 23:22) писал:

Инклуд сделал, что не так?
https://imgur.com/a/7GezNOh
У тебя слишком длинная строка, не знаю какая, но есть очень длинная строка в моде, её нужно укаратить!
0

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

  • Пользователь
  • Вставить ник
  • Раскрыть информацию
Приветик брат, урок хороший, но у меня выскакивают данные ошибки:
(349) : warning 217: loose indentation
(377) : warning 235: public function lacks forward declaration (symbol "OnPlayerRegister")
(401) : warning 235: public function lacks forward declaration (symbol "OnPlayerLogin")


Пробовал исправить 349 строку, но появлялся новый warning на строке 369
0

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

  • Прохожий
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияTeyk (29 сентября 2020 - 11:54) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]

Тебе надо к всем форвардам добавить #forward OnPlayerRegister и #forward OnPlayerLogin
0

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

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Тебе нужно забыть о mxINI и написать регистрацию на MySQL
1

#7
Пользователь офлайн   алекс66362585 

  • Прохожий
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияDeimoS (02 ноября 2020 - 10:46) писал:

Тебе нужно забыть о mxINI и написать регистрацию на MySQL

какая разница та
0

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

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

Просмотр сообщенияалекс66362585 (27 декабря 2024 - 18:59) писал:

какая разница та

огромная, может ты её ещё не понимаешь
0

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

  • Местный
  • Вставить ник
  • Раскрыть информацию
mxINI это деревня, на MySQL перейди
0

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

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

Просмотр сообщенияCrestan Games (27 декабря 2024 - 19:58) писал:

mxINI это деревня, на MySQL перейди

Mysql деревня, pawn-ini топ
0

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


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

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


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