- Скрины
Для начала подключаем сам инклуд - ко всем инклудам добавляем:
Code: Select all
#include <mxini>
Далее создаём переменные для игрока:
Code: Select all
enum pInfo {
pMoney, // Сохраняет кол-во денег.
pScore // Последняя строка без запятой
};
new PlayerInfo[MAX_PLAYERS][pInfo];
Добавляем форвард для нового паблика сохранения данных (его создадим позже):
Code: Select all
forward SaveAccounts();
В паблик - public OnPlayerConnect(playerid) вставляем:
Code: Select all
public OnPlayerConnect(playerid)
{
new PlayerNick[500]; // Для админки
GetPlayerName(playerid,PlayerNick,sizeof(PlayerNick)); // Узнаем ник игрока
new users[128];
format(users,sizeof(users),"users/%s.ini",PlayerNick); // Создаем аккаунт
if(!fexist(users)) // Если такого ника нет, то выводим окно с регистрацией
{
ShowPlayerDialog(playerid,7000,DIALOG_STYLE_INPUT, "Регистрация", "Введите пароль:", "Войти", "");
}
else // Если игрок найден, то авторизация
{
ShowPlayerDialog(playerid,7002,DIALOG_STYLE_INPUT, "Авторизация", "Введите свой пароль:", "Войти", "");
}
PlayerInfo[playerid][pMoney] = 0; // При регистрации 0 денег
PlayerInfo[playerid][pScore] = 0; // 0 очков
return 1;
}
В паблик - public OnPlayerDisconnect(playerid,reason) добавим:
Code: Select all
public OnPlayerDisconnect(playerid,reason)
{
SaveAccount(playerid); // Сохранение аккаунтов
return 1;
}
А теперь создаём действия для меню регистрации и авторизации. Для этого в паблик - public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) вставим:
Code: Select all
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) // Менюха
{
if(dialogid == 7000) // Регистрация
{
if(!strlen(inputtext)) return ShowPlayerDialog(playerid,7000,DIALOG_STYLE_INPUT, "Регистрация", "Введите пароль:", "Войти", ""); // Регистрация
if(response)
{
new PlayerNick2[MAX_PLAYER_NAME];
GetPlayerName(playerid,PlayerNick2,sizeof(PlayerNick2)); // Узнаем ник
new account[128];
format(account,sizeof(account),"users/%s.ini",PlayerNick2); // Ищем аккаунт
if(fexist(account)) return ShowPlayerDialog(playerid,7002,DIALOG_STYLE_INPUT, "Авторизация", "Введите свой пароль:", "Войти", ""); // Авторизация
new iniFile = ini_createFile(account); // Создаем аккаунт
if(iniFile < 0) ini_openFile (account); // Если файл пустой, то...
{
ini_setString(iniFile,"Password",inputtext); // Запишем пароль для игрока
ini_setInteger(iniFile, "Money", 5000); // Даём первоначальные денюжки - 5000, но можно и не давать - 0
ini_setInteger(iniFile, "Score", 0); // Запишем очки для игрока
ini_closeFile(iniFile); // Закроем файл
SetPVarInt(playerid, "Logged", 0); // Создаем переменную авторизации
new p[MAX_PLAYER_NAME];
GetPlayerName(playerid,p,23);
SendClientMessage(playerid, 0x21DD00FF, "Ты успешно зарегестрировался. Не забывай свой пароль.");
ShowPlayerDialog(playerid,7002,DIALOG_STYLE_INPUT, "Авторизация", "Введите свой пароль:", "Войти", ""); // Авторизация
}
}
else // Проверка на вторую кнопку, но ее то мы не указали. Но если нажать Esc, то мы не регаемся. Так что мы ставим проверку на нажатие Esc'ейпа
{
ShowPlayerDialog(playerid,7000,DIALOG_STYLE_INPUT, "Регистрация", "Введите пароль:", "Войти", ""); // Регистрация
}
}
//------------------------------------------------------------------------------
if(dialogid == 7002) // Авторизация
{
if(!strlen(inputtext)) return ShowPlayerDialog(playerid,7002,DIALOG_STYLE_INPUT, "Авторизация", "Введите свой пароль:", "Войти", ""); // Авторизация
if(response) // Проверка на кнопку "ОК" и Enter
{
new PlayerNick4[MAX_PLAYER_NAME], password[64];
GetPlayerName(playerid,PlayerNick4,sizeof(PlayerNick4));
new account[128];
format(account,sizeof(account),"users/%s.ini",PlayerNick4); // Загружаем данные
if(IsPlayerNPC(playerid))return 1;
new iniFile = ini_openFile(account);
ini_getString(iniFile, "Password",password); // Узнаём пароль аккаунта.
if(!strcmp(inputtext, password, true))
{
ini_getInteger(iniFile, "Money", PlayerInfo[playerid][pMoney]); // Запишем кол-во денег игроку
ini_getInteger(iniFile,"Score",PlayerInfo[playerid][pScore]); // Запишем очки игроку
SetPlayerScore(playerid, PlayerInfo[playerid][pScore]); // Количество очков у игрока
GivePlayerMoney(playerid, PlayerInfo[playerid][pMoney]); // Количество денег у игрока
SendClientMessage(playerid, 0x21DD00FF, "Ты вошёл в свой аккаунт.");
ini_closeFile(iniFile);
return 1;
}
else
{
SendClientMessage(playerid, 0xF60000AA, "Неверный пароль. Попробуй ещё раз.");
ShowPlayerDialog(playerid,7002,DIALOG_STYLE_INPUT, "Авторизация", "Введите свой пароль:", "Войти", ""); // Авторизация
return 1;
}
}
else //Если нажать Esc, то...
{
ShowPlayerDialog(playerid,7002,DIALOG_STYLE_INPUT, "Авторизация", "Введите свой пароль:", "Войти", ""); // Авторизация
}
}
return 0;
}
А теперь создаём новый паблик - public SaveAccounts(), для которого ранее создавали форвард.
Code: Select all
public SaveAccounts() // Сохраняет данные
{
for(new f; f < GetMaxPlayers(); f++)
{
if(!IsPlayerConnected(f))continue;
SaveAccount(f);
}
}
Ну и в конце мода добавляем сток, который и будет выполнять все функции сохранения и записи данных.
Code: Select all
stock SaveAccount(playerid) // Сохраняет данные
{
new PlayerNick6[MAX_PLAYER_NAME], account[128];
GetPlayerName(playerid,PlayerNick6,sizeof(PlayerNick6));
format(account,sizeof(account), "users/%s.ini", PlayerNick6);
new iniFile = ini_openFile(account);
ini_setInteger(iniFile, "Money", GetPlayerMoney(playerid));
ini_setInteger(iniFile, "Score", GetPlayerScore(playerid));
ini_closeFile(iniFile);
return 1;
}
Ну вот с модом работу мы закончили, теперь можно компилировать. Теперь открываем папку с сервером и в папке scriptfiles создаём новую папку users, в которой и будут сохраняться файлы игроков. Всё теперь у Вас есть простенькая регистрация с сохранением данных игрока.