Привет! Если вы читаете это - вы еще не зарегистрированы. Это займет не больше минуты. Нажмите здесь, чтобы пройти регистрацию в несколько простых шагов, чтобы получить доступ ко всем разделам нашего форума. Удачи!
Так как тема создавалась давным давно, то и будем ее переделывать как будто в те времена. Решил сделать свой сервер. Ну а так как все начинается с регистрации, то и появился вопрос: как сделать и что же нужно использовать. Пролистав немало страниц на форуме, я понял, что единых и понятных уроков нет (на тот момент времени не было). Вот так и появилась идея создания данного решения. Ну что ж, приступим.
Приготовление.
Для регистрации нам понадобится особый инклюд mxINI. Скачать его можете тут(кликабельно).
Его нужно поместить в специальную папку, которая находится:
PHP код:
папка с сервером/pawno/include
После того как мы поместили инклюд в нужную папку, переходим в наш мод/new.pwn
Ко всем форвардам (если они есть, если нету, то под инклюдами) вставляем такие форварды:
forward OnPlayerRegister(playerid, password[]); //паблик отвечающий за регистрацию
forward OnPlayerLogin(playerid,password[]); //паблик отвечающий за логин
forward SaveAccounts(); //сток отвечающий за сохранение аккаунта[SIZE=2][/SIZE]
В начале мода создаем масив отвечающий за нашу регистрацию.
enum pInfo
{
pPass [64], //переменная отвечающая за пароль от аккаунта
pMoney, //переменная отвечающая за деньги
Float:pHealth, //переменная типа Float, отвечающая за здоровье (тип Float поддерживает значения с плавающей точкой, например 3.66)
}
new Player[MAX_PLAYERS][pInfo];
И ко всем new добавляем переменную, которая отслеживает, существует ли уже аккаунт с данным ником или нет.
new PAccount [MAX_PLAYERS];
Теперь мы готовы приступать к созданию самой "начинки" регистрации.
Создаем "тело" регистрации.
В паблик OnPlayerConnect(playerid) вставляем следующее:
new playername[MAX_PLAYER_NAME];// переменная содержащая ник игрока
new string[128];
GetPlayerName(playerid,playername,sizeof(playername));// Узнаем ник
format(string,sizeof(string),"players/%s.ini", playername);// Путь к файлу с аккаунтом
if(fexist(string))
{
PAccount[playerid] = 1;
}
else
{
PAccount[playerid] = 0;
}
в строчке "format(string,sizeof(string),"players/%s.ini", playername);" players можете изменить на любое другое название вашей папки в которую будет сохранятся файл аккаунта. Данная папка находится:
PHP код:
папка с сервером/scriptfiles
если же ее нет, то нужно создать папку с точно таким же именем, иначе файл не будет сохранятся.
Затем в паблик OnPlayerRequestClass(playerid, classid) вставляем приглашения к диалогам, вместо выбора скина:
if(PAccount[playerid] == 1)// Если аккаунт есть {
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Добро пожаловать.\nВаш аккаунт зарегистрирован.\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру.
}
else// Если аккаунта нет
{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Окно Регистрации","Здравствуйте\nВаш аккаунт не зарегистрирован.\nЗарегистрируйтесь введя пароль в окошко","Ввод","");// Показываем диалог регистрации.
}
Теперь у нас есть приглашения к диалогам, но самих действий с ними нет. Что бы это исправить, в конец мода вставляем наши паблики:
public OnPlayerRegister(playerid, password[])// Паблик регистрации
{
if(IsPlayerConnected(playerid))
{
new string[64];// Масив с путём для файла
new playername[MAX_PLAYER_NAME];// Масив для получения имени игрока
new playersip[64];
GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
GetPlayerIp(playerid,playersip,sizeof(playersip));
format(string,sizeof(string), "players/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения
new iniFile = ini_createFile(string);// Создаём файл с именем игрока в папке players
if(iniFile < 0)// Если Файла нет
{
iniFile = ini_openFile(string);// Открываем
}
if(iniFile >= 0)// Если файл есть
{
strmid(Player[playerid][pPass],password,0,strlen(password),255);// Присваиваем масиву pPass, значение password[]
ini_setString(iniFile,"Pass",Player[playerid][pPass]);// Записываем пароль игрока в файл
ini_setFloat(iniFile, "Heal", 100.0);
ini_setInteger(iniFile,"Money",300);
ini_closeFile(iniFile);// Закрываем файл
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Добро пожаловать.\nВаш аккаунт зарегистрирован.\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру.
}
}
return 1;
}
и
public OnPlayerLogin(playerid,password[])
{
if(IsPlayerConnected(playerid))// Проверка на подключение игрока
{
new string[64];// Масив с путём для файла
new pass[64];// Масив с паролем
new playername[MAX_PLAYER_NAME];// Масив для получения имени игрока
GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
format(string,sizeof(string), "players/%s.ini", playername);// Добавляем имя игрока, в путь для загрузки
new iniFile = ini_openFile(string);// Открываем файл
ini_getString(iniFile,"Pass",pass,64);// Загружаем пароль
if(strcmp(pass,password,true) == 0)// Если введёный пароль, соответсвует паролю при регистрации, то загружаем акк
{
ini_getString(iniFile,"Pass",Player[playerid][pPass],64);// Загружаем пароль
ini_getFloat(iniFile, "Heal", Player[playerid][pHeal]);
ini_getInteger(iniFile,"Money",Player[playerid][pMoney]);
ini_closeFile(iniFile);// Закрываем файл
}
else// Если пароль не верен..
{
ini_closeFile(iniFile);// Закрываем файл
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Добро пожаловать.\nВаш аккаунт зарегистрирован.\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру.
return 1;
}
SpawnPlayer(playerid);// Спавним игрока
}
return 1;
}
Ну а что бы все это работало, в паблик OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) вставляем это:
if(dialogid == 1)// Ид диалога Для Логина
{
if(response)// Если игрок нажал первую кнопку входа
{
if(!strlen(inputtext))// Если окно ввода пустое, выводим диалог снова
{
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Добро пожаловать.\nВаш аккаунт зарегистрирован.\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру.
return 1;
}
new pass[64];// Масив с паролем
strmid(pass,inputtext,0,strlen(inputtext),64);// Считываем текст с диалога
OnPlayerLogin(playerid,pass);// Запускаем паблик входа
}
else// Если игрок нажал Esc, вернём ему диалог
{
ShowPlayerDialog(playerid,1,DIALOG_STYLE_INPUT,"Окно Входа","Добро пожаловать.\nВаш аккаунт зарегистрирован.\nВведите свой пароль в окошко","Ввод","");// Показываем диалог входа в игру.
}
}
if(dialogid == 2)// Ид диалога для регистрации
{
if(response)// Если игрок нажал первую кнопку
{
if(!strlen(inputtext))// Если окно ввода пустое, выводим диалог снова
{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Окно Регистрации","Здравствуйте\nВаш аккаунт не зарегистрирован.\nЗарегистрируйтесь введя пароль в окошко","Ввод","");// Показываем диалог регистрации.
return 1;
}
new pass[64];// Масив с паролем
strmid(pass,inputtext,0,strlen(inputtext),64);// Считываем текст с диалога
OnPlayerRegister(playerid,pass);// Запускаем паблик регистрации
}
else// Если игрок нажал Esc, вернём ему диалог
{
ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Окно Регистрации","Здравствуйте\nВаш аккаунт не зарегистрирован.\nЗарегистрируйтесь введя пароль в окошко","Ввод","");// Показываем диалог регистрации.
}
}
Ну и в завершении всего, добавляем сток, который будет сохранять информацию по игроку. В самом конце мода создаем это:
stock SavePlayer(playerid)
{
new string[64];// Масив с путём для файла
new playername[MAX_PLAYER_NAME];// Масив для получения имени игрока
new Float:health;
GetPlayerName(playerid, playername, sizeof(playername));// Получаем Имя игрока
GetPlayerHealth(playerid,health); //Получаем кол-во хп
format(string, sizeof(string), "players/%s.ini", playername);// Добавляем имя игрока, в путь для сохранения
new iniFile = ini_openFile(string);// Открываем файл по тому пути который указали.
ini_setString(iniFile,"Pass",Player[playerid][pPass]);// Записываем пароль игрока в файл
ini_setFloat(iniFile,"Heal",health);
ini_setInteger(iniFile,"Money",GetPlayerMoney(playerid));
ini_closeFile(iniFile);// Закрываем файл
}
Ну и что бы все сохранялось при выходе игрока с сервера, в паблик OnPlayerDisconnect(playerid, reason) вставляем это:
SavePlayer(playerid); //вызываем наш сток сохранения
Вот и все. Ваша регистрация создана. Не забудьте, если вы поменяли путь к папке для сохранения файла в одном месте, то нужно поменять его везде. Ну вроде бы и все. Об ошибках или вопросах пишите, надеюсь смогу ответить Полностью реконструировал тему. Надеюсь теперь косяков не будет. Не забывайте про + если помог.