Так же не откажусь от плюсика!
И так! Первым делом нам нужен сам 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