Вот вам мой вариант, автор, можешь добавить к первому посту..
так вот, для удобства в начало мода добавим пару макросов:
PHP код:
#define RegisterMenu 109//это иды диалогов
#define LoginMenu 1009
Ну вот, теперь в OnPlayerConnect вставляем:
PHP код:
new Name[40]; GetPlayerName(playerid, Name, 40);// узнаем ник игрока
format(Name, 40, "%s.account", Name);// узнаем имя файла
if(fexist(Name))ShowPlayerDialog(playerid, LoginMenu, DIALOG_STYLE_INPUT, "{ff0000}Авторизация", "{ff00ff}Вы должны авторизоваться! \n{ff00ff}Введите ваш пароль:", "Ок", "");//если файл существует
else ShowPlayerDialog(playerid, RegisterMenu, DIALOG_STYLE_INPUT, "{ff0000}Регистрация", "{ff00ff}Зарегистрируйся! \n{ff00ff}Введите пароль:", "Ок", "");//если нет его
диалоги созданы, перейдем к OnDialogResponse:
PHP код:
if(dialogid == RegisterMenu)
{
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, RegisterMenu, DIALOG_STYLE_INPUT, "{ff0000}Регистрация", "{ff00ff}Зарегистрируйся! \n{ff0000}Ты забыл ввести пароль, идиот!", "Ок", "");
if(strlen(inputtext) < 4 || strlen(inputtext) > 20) return ShowPlayerDialog(playerid, RegisterMenu, DIALOG_STYLE_INPUT, "{ff0000}Регистрация", "{ff00ff}Зарегистрируйся! \n{ff0000}Пароль не должен быть меньше 4-ех и больше 20-ти символов!", "Ок", "");
new Name[40]; GetPlayerName(playerid, Name, 40);
format(Name, 40, "%s.account", Name);
new File = ini_createFile(Name);//создаем файл
ini_setInteger(File, "Пароль", hash(inputtext));//записываем хэшированный пароль игрока и другие ключи
ini_setInteger(File, "Деньги", 0);
ini_setInteger(File, "Убийства", 0);
ini_setInteger(File, "Смерти", 0);
ini_setFloat(File, "Здоровье", 0.0);
ini_closeFile(File);//Сохраняем и закрываем файл
SendClientMessage(playerid, -1, "{ff00ff}Вы успешно зарегистрировались и автоматически залогинились!");
SetPVarInt(playerid, "Logged", 1);//залогиниваем игрока
}else if(dialogid == LoginMenu)
{
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, LoginMenu, DIALOG_STYLE_INPUT, "{ff0000}Авторизация", "{ff00ff}Вы должны авторизоваться! \n{ff0000}Ты забыл ввести пароль, идиот!", "Ок", "");
if(strlen(inputtext) < 4 || strlen(inputtext) > 20) return ShowPlayerDialog(playerid, LoginMenu, DIALOG_STYLE_INPUT, "{ff0000}Авторизация", "{ff00ff}Вы должны авторизоваться! \n{ff0000}Пароль не должен быть меньше 4-ех и больше 20-ти символов!", "Ок", "");
new Name[40], value, Float:heal;
GetPlayerName(playerid, Name, 40);
format(Name, 40, "%s.account", Name);
new File = ini_openFile(Name);//открываем файл
ini_getInteger(File, "Пароль", value);//узнаем пароль
if(value != hash(inputtext)) return ShowPlayerDialog(playerid, LoginMenu, DIALOG_STYLE_INPUT, "{ff0000}Авторизация", "{ff00ff}Вы должны авторизоваться! \n{ff0000}Пароль не правильный!", "Ок", "");
ini_getInteger(File, "Деньги", value);//читаем все ключи если пароль верный
SetPVarInt(playerid, "Money", value);//и записываем их в пвары
ini_getInteger(File, "Убийства", value);
SetPVarInt(playerid, "Kills", value);
ini_getInteger(File, "Смерти", value);
SetPVarInt(playerid, "Deaths", value);
ini_getFloat(File, "Здоровье", heal);
SetPVarFloat(playerid, "Health", heal);
SendClientMessage(playerid, -1, "{ff00ff}Вы успешно залогинились!");
SetPVarInt(playerid, "Logged", 1);//залогиниваем игрока
}
Чтобы востановить деньги/здоровье/etc ищем OnPlayerSpawn:
PHP код:
if(GetPVarInt(playerid, "Connect") != 1)//если игрок только что зашел на сервер
{
SetPVarInt(playerid, "Connect", 1);
SetPlayerHealth(playerid, GetPVarFloat(playerid, "Health"));
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, GetPVarInt(playerid, "Money"));
SetPlayerScore(playerid, GetPVarInt(playerid, "Kills"));
}
Добавим убийства и смерти к пварам в паблике OnPlayerDeath:
PHP код:
SetPVarInt(killerid, "Kills", GetPVarInt(killerid, "Kills")+1);
SetPVarInt(playerid, "Deaths", GetPVarInt(playerid, "Deaths")+1);
SetPlayerScore(killerid, GetPVarInt(killerid, "Kills"));
добавим функцию сохранения аккаунта:
PHP код:
stock SaveAccount(playerid)
{
new Name[40], Float:heal;
GetPlayerName(playerid, Name, 40); GetPlayerHealth(playerid,heal);
format(Name, 40, "%s.account", Name);
new File = ini_openFile(Name);
ini_setInteger(File, "Деньги", GetPlayerMoney(playerid));
ini_setInteger(File, "Убийства", GetPVarInt(playerid, "Kills"));
ini_setInteger(File, "Смерти", GetPVarInt(playerid, "Deaths"));
ini_setFloat(File, "Здоровье", heal);
}
теперь сохраняем данные при выходе в OnPlayerDisconnect:
PHP код:
SaveAccount(playerid);//;D
ну вот и все собсно.. ах да, я использовал еще одну функцию (хэширование файла), вот она:
PHP код:
stock hash(pas[])
{
new len=strlen(pas);
new s1 = 1, s2;
for (new n; n<len; n++)
{
s1 = (s1 + pas[n]) % 65521;
s2 = (s2 + s1) % 65521;
}
return (s2 << 16) + s1;
}
Примечание:
Для того, чтобы игрок не мог заспавниться пока не авторизуется нужно в паблик OnPlayerRequestSpawn добавить:
PHP код:
if(GetPVarInt(playerid, "Logged") != 1) return 0;
При краше сервера паблик OnPlayerDisconnect не вызывается, поэтому лучше сделать таймер минут на 5 и каждые эти 5 минут сохранять всех игроков, для этого в OnGameModeInit запускаем таймер:
PHP код:
SetTimer("SaveAccounts", 1000*60*5, true);
и в любое место:
PHP код:
forward SaveAccounts();
public SaveAccounts()
{
for(new f; f < GetMaxPlayers(); f++)
{
if(!IsPlayerConnected(f))continue;
SaveAccount(f);
}
}
Жмем F6, have fun :mag: