L0ndl3m
01.02.2014, 16:38
Регистрация на стандартном файловом инклуде "file".
В начало мода, после инклудов:
enum pInfo
{
pName[MAX_PLAYER_NAME+1], // Для записи имени игрока
pLogged, // Для проверки, вошёл ли игрок в аккаунт
pPassword[21], // Для записи пароля игрока
pAdmin // Для записи уровня админки у игрока
};
new PlayerInfo[MAX_PLAYERS][pInfo];
static const MsgBox[][] = // Массив для текста в диалоге при регистрации / авторизации
{
"{00CC00}Добро пожаловать на сервер, {FF0000}%s{00CC00}.\nТакой аккаунт {FF0000}не зарегистрирован{00CC00} на сервере, введите пароль в окно, чтобы зарегистрировать аккаунт.",
"{00CC00}Добро пожаловать на сервер, {00FF00}%s{00CC00}.\nТакой аккаунт {00FF00}зарегистрирован{00CC00} на сервере, введите пароль в окно, чтобы войти в аккаунт."
};
В public OnPlayerConnect:
PlayerInfo[playerid][pLogged] = 0;
// Дать понять, что игрок не вошёл в аккаунт
GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME+1);
// Получаем никнейм игрока
new str[171+MAX_PLAYER_NAME+1];
str = "Accounts/", strcat(str, PlayerInfo[playerid][pName]), strcat(str, ".ini");
// Accounts/ Accounts/Никнейм Accounts/Никнейм.ini
new ex = fexist(str); // Переменная для определения, существует ли аккаунт игрока
format(str, sizeof(str), MsgBox[ex], PlayerInfo[playerid][pName]);
ShowPlayerDialog(playerid, ex, DIALOG_STYLE_INPUT, "Добро пожаловать на сервер", str, "Далее", ""); // Если игрок зарегистрирован, покажет диалог логина, иначе - диалог регистрации
В public OnPlayerDisconnect
if(PlayerInfo[playerid][pLogged]) // если игрок входил в аккаунт, тогда
SaveAccount(playerid); // сохраним аккаунт игрока
В public OnDialogResponse:
switch(dialogid)
{
case 0: // диалог регистрации
{
new str[171 + MAX_PLAYER_NAME];
if(response == 0 || !(3 <= strlen(inputtext) <= 20)) // Если длина пароля меньше 3 либо больше 20, либо игрок нажал на вторую кнопку
{
format(str, sizeof(str), MsgBox[0], PlayerInfo[playerid][pName]);
// Превратим "%s" в полученный никнейм игрока
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "Добро пожаловать на сервер", str, "Далее", "");
}
strmid(PlayerInfo[playerid][pPassword], inputtext, 0, 21, 21);
// Запишем введённый текст с диалога в массив с паролем игрока
str = "Accounts/", strcat(str, PlayerInfo[playerid][pName]), strcat(str, ".ini");
// Accounts/ Accounts/Никнейм Accounts/Никнейм.ini
new File: file = fopen(str, io_write);
// Откроем файл аккаунта игрока в режиме записи
if(file) // Если файл открылся
{
str = "Password=", strcat(str, inputtext);
// Password=Введённый текст в диалог
fwrite(file, str);
// Запишем получившуются строку "str" в файл
fclose(file);
// Закроем файл
}
str = "Добро пожаловать, ", strcat(str, PlayerInfo[playerid][pName]), strcat(str, ", вы успешно зарегистрировались");
SendClientMessage(playerid, 0xFF9900FF, str);
PlayerInfo[playerid][pLogged] = 1; // Дать понять, что игрок вошёл в аккаунт
}
case 1: // диалог авторизации
{
new str[159+MAX_PLAYER_NAME+1];
str = "Accounts/", strcat(str, PlayerInfo[playerid][pName]), strcat(str, ".ini");
// Accounts/ Accounts/Никнейм Accounts/Никнейм.ini
if(response == 0 || inputtext[0] == '\0') // Если игрок нажал на вторую кнопку, либо не ввёл ничего в диалог
{
format(str, sizeof(str), MsgBox[1], PlayerInfo[playerid][pName]); // Превратим "%s" в полученный никнейм игрока
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "С возвращением на сервер", str, "Далее", "");
return true;
}
new File: file = fopen(str, io_read); // Открываем файл в режиме чтения
if(file != File:0) // Если файл открылся
{
fread(file, str); // Прочитаем первую строку из файла
GetDataAfterChar(str); // Записали данные после символа "=", в параметрах его нет, так как по умолчанию, в параметрах функции стоит этот символ
if(strcmp(str, inputtext, false))
{
format(str, sizeof(str), MsgBox[1], PlayerInfo[playerid][pName]); // Превратим "%s" в полученный никнейм игрока
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Вы ввели неверный пароль", str, "Далее", "");
fclose(file); // Закроем файл
}
else
{
strmid(PlayerInfo[playerid][pPassword], str, 0, 21, 21); // Запишем сконвертированную строку в массив с паролем игрока
while(fread(file, str)) // Пробежимся по строкам из файла
{
// Важное примечание! Распологайте строки в файле так, чтобы потом они считывались по порядку, если у вас сначала сохраняется уровень админки, а потом деньги, то сохраняйте так, как показано ниже
if(!strcmp(str, "AdminLevel=", true, 11)) PlayerInfo[playerid][pAdmin] = strval(str[11]); // уровень админки
if(!strcmp(str, "Money=", true, 6)) GivePlayerMoney(playerid, strval(str[6])); // деньги
}
fclose(file); // Закроем файл
str = "С возвращением, ", strcat(str, PlayerInfo[playerid][pName]), strcat(str, ", вы успешно вошли в аккаунт.");
// С возвращением, С возвращением, Никнейм С возвращением, Никнейм, вы успешно вошли в аккаунт.
SendClientMessage(playerid, 0xFF9900FF, str);
PlayerInfo[playerid][pLogged] = 1; // Дать понять, что игрок вошёл в аккаунт
}
}
}
}
В конец мода:
stock GetDataAfterChar(str[], ch[] = "=") // Функция для получения данных после символа
{
new len = strlen(str); // Создаём переменную в которой будет записана длина строки
if(str[len - 1] == '\n') str[len - 1] = '\0'; // Если последний символ строки переход на новую строку, то этот символ будет концом строки
strmid(str, str, strfind(str, ch) + 1, 64, 64); // Запишем данные, полученные после символа, указанные в параметрах (по умолчанию символ "=")
}
stock SaveAccount(playerid) // Функция для сохранения аккаунта игрока
{
new str[34];
str = "Accounts/", strcat(str, PlayerInfo[playerid][pName]), strcat(str, ".ini");
// Accounts/ Accounts/Никнейм Accounts/Никнейм.ini
new File: file = fopen(str, io_write);
// Откроем файл аккаунта игрока в режиме записи
if(file != File:0) // Если файл открылся
{
format(str, 31, "Password=%s\n", PlayerInfo[playerid][pPassword]);
// Запишем в аккаунт игрока его пароль
fwrite(file, str);
// Запишем получившуются строку "str" в файл
format(str, 14, "AdminLevel=%d\n", PlayerInfo[playerid][pAdmin]);
// Запишем в аккаунт игрока его уровень администратирования
fwrite(file, str);
// Запишем получившуются строку "str" в файл
format(str, 13, "Money=%d", GetPlayerMoney(playerid));
// Запишем в аккаунт игрока его количество денег
fwrite(file, str);
// Запишем получившуются строку "str" в файл
fclose(file);
// Закроем файл
}
}
Автор: L0ndl3m (http://pro-pawn.ru/member.PAWN?2057)
Специально для: Pro-Pawn.Ru (http://pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!
В начало мода, после инклудов:
enum pInfo
{
pName[MAX_PLAYER_NAME+1], // Для записи имени игрока
pLogged, // Для проверки, вошёл ли игрок в аккаунт
pPassword[21], // Для записи пароля игрока
pAdmin // Для записи уровня админки у игрока
};
new PlayerInfo[MAX_PLAYERS][pInfo];
static const MsgBox[][] = // Массив для текста в диалоге при регистрации / авторизации
{
"{00CC00}Добро пожаловать на сервер, {FF0000}%s{00CC00}.\nТакой аккаунт {FF0000}не зарегистрирован{00CC00} на сервере, введите пароль в окно, чтобы зарегистрировать аккаунт.",
"{00CC00}Добро пожаловать на сервер, {00FF00}%s{00CC00}.\nТакой аккаунт {00FF00}зарегистрирован{00CC00} на сервере, введите пароль в окно, чтобы войти в аккаунт."
};
В public OnPlayerConnect:
PlayerInfo[playerid][pLogged] = 0;
// Дать понять, что игрок не вошёл в аккаунт
GetPlayerName(playerid, PlayerInfo[playerid][pName], MAX_PLAYER_NAME+1);
// Получаем никнейм игрока
new str[171+MAX_PLAYER_NAME+1];
str = "Accounts/", strcat(str, PlayerInfo[playerid][pName]), strcat(str, ".ini");
// Accounts/ Accounts/Никнейм Accounts/Никнейм.ini
new ex = fexist(str); // Переменная для определения, существует ли аккаунт игрока
format(str, sizeof(str), MsgBox[ex], PlayerInfo[playerid][pName]);
ShowPlayerDialog(playerid, ex, DIALOG_STYLE_INPUT, "Добро пожаловать на сервер", str, "Далее", ""); // Если игрок зарегистрирован, покажет диалог логина, иначе - диалог регистрации
В public OnPlayerDisconnect
if(PlayerInfo[playerid][pLogged]) // если игрок входил в аккаунт, тогда
SaveAccount(playerid); // сохраним аккаунт игрока
В public OnDialogResponse:
switch(dialogid)
{
case 0: // диалог регистрации
{
new str[171 + MAX_PLAYER_NAME];
if(response == 0 || !(3 <= strlen(inputtext) <= 20)) // Если длина пароля меньше 3 либо больше 20, либо игрок нажал на вторую кнопку
{
format(str, sizeof(str), MsgBox[0], PlayerInfo[playerid][pName]);
// Превратим "%s" в полученный никнейм игрока
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "Добро пожаловать на сервер", str, "Далее", "");
}
strmid(PlayerInfo[playerid][pPassword], inputtext, 0, 21, 21);
// Запишем введённый текст с диалога в массив с паролем игрока
str = "Accounts/", strcat(str, PlayerInfo[playerid][pName]), strcat(str, ".ini");
// Accounts/ Accounts/Никнейм Accounts/Никнейм.ini
new File: file = fopen(str, io_write);
// Откроем файл аккаунта игрока в режиме записи
if(file) // Если файл открылся
{
str = "Password=", strcat(str, inputtext);
// Password=Введённый текст в диалог
fwrite(file, str);
// Запишем получившуются строку "str" в файл
fclose(file);
// Закроем файл
}
str = "Добро пожаловать, ", strcat(str, PlayerInfo[playerid][pName]), strcat(str, ", вы успешно зарегистрировались");
SendClientMessage(playerid, 0xFF9900FF, str);
PlayerInfo[playerid][pLogged] = 1; // Дать понять, что игрок вошёл в аккаунт
}
case 1: // диалог авторизации
{
new str[159+MAX_PLAYER_NAME+1];
str = "Accounts/", strcat(str, PlayerInfo[playerid][pName]), strcat(str, ".ini");
// Accounts/ Accounts/Никнейм Accounts/Никнейм.ini
if(response == 0 || inputtext[0] == '\0') // Если игрок нажал на вторую кнопку, либо не ввёл ничего в диалог
{
format(str, sizeof(str), MsgBox[1], PlayerInfo[playerid][pName]); // Превратим "%s" в полученный никнейм игрока
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "С возвращением на сервер", str, "Далее", "");
return true;
}
new File: file = fopen(str, io_read); // Открываем файл в режиме чтения
if(file != File:0) // Если файл открылся
{
fread(file, str); // Прочитаем первую строку из файла
GetDataAfterChar(str); // Записали данные после символа "=", в параметрах его нет, так как по умолчанию, в параметрах функции стоит этот символ
if(strcmp(str, inputtext, false))
{
format(str, sizeof(str), MsgBox[1], PlayerInfo[playerid][pName]); // Превратим "%s" в полученный никнейм игрока
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Вы ввели неверный пароль", str, "Далее", "");
fclose(file); // Закроем файл
}
else
{
strmid(PlayerInfo[playerid][pPassword], str, 0, 21, 21); // Запишем сконвертированную строку в массив с паролем игрока
while(fread(file, str)) // Пробежимся по строкам из файла
{
// Важное примечание! Распологайте строки в файле так, чтобы потом они считывались по порядку, если у вас сначала сохраняется уровень админки, а потом деньги, то сохраняйте так, как показано ниже
if(!strcmp(str, "AdminLevel=", true, 11)) PlayerInfo[playerid][pAdmin] = strval(str[11]); // уровень админки
if(!strcmp(str, "Money=", true, 6)) GivePlayerMoney(playerid, strval(str[6])); // деньги
}
fclose(file); // Закроем файл
str = "С возвращением, ", strcat(str, PlayerInfo[playerid][pName]), strcat(str, ", вы успешно вошли в аккаунт.");
// С возвращением, С возвращением, Никнейм С возвращением, Никнейм, вы успешно вошли в аккаунт.
SendClientMessage(playerid, 0xFF9900FF, str);
PlayerInfo[playerid][pLogged] = 1; // Дать понять, что игрок вошёл в аккаунт
}
}
}
}
В конец мода:
stock GetDataAfterChar(str[], ch[] = "=") // Функция для получения данных после символа
{
new len = strlen(str); // Создаём переменную в которой будет записана длина строки
if(str[len - 1] == '\n') str[len - 1] = '\0'; // Если последний символ строки переход на новую строку, то этот символ будет концом строки
strmid(str, str, strfind(str, ch) + 1, 64, 64); // Запишем данные, полученные после символа, указанные в параметрах (по умолчанию символ "=")
}
stock SaveAccount(playerid) // Функция для сохранения аккаунта игрока
{
new str[34];
str = "Accounts/", strcat(str, PlayerInfo[playerid][pName]), strcat(str, ".ini");
// Accounts/ Accounts/Никнейм Accounts/Никнейм.ini
new File: file = fopen(str, io_write);
// Откроем файл аккаунта игрока в режиме записи
if(file != File:0) // Если файл открылся
{
format(str, 31, "Password=%s\n", PlayerInfo[playerid][pPassword]);
// Запишем в аккаунт игрока его пароль
fwrite(file, str);
// Запишем получившуются строку "str" в файл
format(str, 14, "AdminLevel=%d\n", PlayerInfo[playerid][pAdmin]);
// Запишем в аккаунт игрока его уровень администратирования
fwrite(file, str);
// Запишем получившуются строку "str" в файл
format(str, 13, "Money=%d", GetPlayerMoney(playerid));
// Запишем в аккаунт игрока его количество денег
fwrite(file, str);
// Запишем получившуются строку "str" в файл
fclose(file);
// Закроем файл
}
}
Автор: L0ndl3m (http://pro-pawn.ru/member.PAWN?2057)
Специально для: Pro-Pawn.Ru (http://pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено!