PDA

Просмотр полной версии : [Мануал] Система регистрации [file]



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)

Копирование данной статьи на других ресурсах без разрешения автора запрещено!

Hidden
01.02.2014, 17:23
Как же любишь ты эти файлы))

L0ndl3m
01.02.2014, 17:25
Как же любишь ты эти файлы))

А как же :3

[ForD]
01.02.2014, 17:33
Вроде хорошо,сегодня лимит,завтра отплюсую тему :3 Молодец.

Seregamil
01.02.2014, 19:25
Баян.
Кому-то явно нечем заняться.

L0ndl3m
01.02.2014, 19:28
Баян.
Кому-то явно нечем заняться.

Нечем заняться? Найди хотя бы одну систему регистрации на этом инклуде.

DeimoS
01.02.2014, 21:22
static const MsgBox[][] = // Массив для текста в диалоге при регистрации / авторизации
{
"{00CC00}Добро пожаловать на сервер, {FF0000}%s{00CC00}.\nТакой аккаунт {FF0000}не зарегистрирован {00CC00}на сервере, введите пароль в окно, чтобы зарегистрировать аккаунт.",
"{00CC00}Добро пожаловать на сервер, {00FF00}%s{00CC00}.\nТакой аккаунт {00FF00}зарегистрирован {00CC00}на сервере, введите пароль в окно, чтобы войти в аккаунт."
};
Два вопроса
1) Зачем это static const, или количество модификаторов увеличивает ваше ЧСВ? ©
2) Какой смысл создавать для подобного текста массивы? Это разве удобно, выискивать код в начале мода, когда диалог расположен где-то в центре? Разве сложно поместить код в тот же format или создать stock, если диалог часто вызывается? Никогда не понимал к чему такие извращения :с

Salvacore
01.02.2014, 22:43
Баян.
Кому-то явно нечем заняться.
Не все на SQLite сидят.

Seregamil
02.02.2014, 07:52
Нечем заняться? Найди хотя бы одну систему регистрации на этом инклуде.

Нашел. Мод Alex009, название: Wars of the Gangs.
Да и к тому же, все файловые ридеры/райдеры основаны на этом инклуде.

Johny
02.02.2014, 10:19
Дам +

L0ndl3m
02.02.2014, 12:45
Нашел. Мод Alex009, название: Wars of the Gangs.
Да и к тому же, все файловые ридеры/райдеры основаны на этом инклуде.

Я имел ввиду про мануал на этом инклуде.

Albert
28.12.2014, 22:46
А куда аккаунты сохраняются на этой системе?

L0ndl3m
28.12.2014, 23:14
А куда аккаунты сохраняются на этой системе?
В папку "Accounts".