Дата: 04.06.2011, Суббота, 16:43:57 | Сообщение # $NUMBER
Группа: VIP
Сообщений: 1021
Привет. Сейчас мы сделаем регистрацию с помощью [INI]mxINI. Это урок очень подайдет дял ДМ и ТДМ серверов. Очень быстрая система, а также сохронение.
Сохронение Акаунта Сохронение денег в акаунт Сохронение жизни в аккаунт
Начинаем:
1. Скачиваем Инклуйды и закидоваем в Папка с сервером/Pawno/include
Скачать инклуйд [INI] mxINI Скачать инклуд [INI]md5
2. Открываем ваш мод, и в начале где все#include Код #include <mxINI> #include <md5>
3. Добавляем ко всем forward:
Код forward SaveAccounts();
4. Добовляем переменые для записи жизни и денег
Код enum pInfo { pMoney, // Сохраняет кол-во денег. Float:pHeal, // Сохраняет кол-во жизней. };
5. И под enum'ом вставляем:
Код new Player[MAX_PLAYERS][pInfo];
6. Создаем диалоговые окна: в public OnPlayerConnect(playerid)
Код public OnPlayerConnect(playerid) { new PlayerName[MAX_PLAYER_NAME]; GetPlayerName(playerid,PlayerName,sizeof(PlayerName)); //узнаем ник игрока new account[128]; format(account,sizeof(account),"users/%s.ini",PlayerName); //создаем акк if(!fexist(account)) //если акка не существует, то... { ShowPlayerDialog(playerid,id вашего диалога,DIALOG_STYLE_INPUT, "Регистрация", "Вы должны зарегистрироваться! \nВведите ваш пароль:", "REGISTER", ""); //...Показываем игроку диалог реги } else { ShowPlayerDialog(playerid,id вашего диалога,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", ""); //если он есть, то авторизуем его } }
7. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
Код //=========================== Регистрция =========================== if(dialogid == id вашего диалога) //Регистрация { if(!strlen(inputtext)) return ShowPlayerDialog(playerid, id вашего диалога, DIALOG_STYLE_INPUT, "Регистрация", "Вы должны зарегистрироваться! \nВведите ваш пароль:", "Ок", ""); new PlayerName[MAX_PLAYER_NAME]; GetPlayerName(playerid,PlayerName,sizeof(PlayerName)); //узнаем ник new account[128]; format(account,sizeof(account),"users/%s.ini",PlayerName);//ищем акк if(fexist(account)) return ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", ""); //если акк уже существует, то логиним игрока new iniFile = ini_createFile(account); //создаем акк if(iniFile < 0) ini_openFile (account); //если файл пустой, то... { ini_setString(iniFile,"Пароль",MD5_Hash(inputtext)); //запишем пароль и закодируем его ini_setInteger(iniFile, "Money", 5000); // Запишем кол-во денег в файл. ini_setFloat(iniFile, "Heal", 50.0); // Запишем кол-во жизней в файл. ini_closeFile(iniFile); //закроем файл SetPVarInt(playerid, "Logged", 0); //создаем переменную авторизации ShowPlayerDialog(playerid,id вашего диалога,DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "LOGIN", ""); //теперь после регистрации, мы дадим игроку залогиниться return 1; } } if(dialogid == id вашего диалога) //авторизация { new PlayerName[MAX_PLAYER_NAME], password[64]; GetPlayerName(playerid,PlayerName,sizeof(PlayerName)); //узнаем ник new account[128]; format(account,sizeof(account),"users/%s.ini",PlayerName); //смотрим акк new iniFile = ini_openFile(account); //открываем акк ini_getString(iniFile, "Пароль", MD5_Hash(password)); // Узнаём пароль аккаунта + рекодируем пароль. if(!strcmp(inputtext, password, true)) //если пароль верный, то... { ini_getInteger(iniFile, "Money", Player[playerid][pMoney]); // Запишем кол-во денег в переменную. ini_getFloat(iniFile, "Heal", Player[playerid][pHeal]); // Запишем кол-во жизней в переменную. SetPlayerHealth(playerid, Player[playerid][pHeal]); //Теперь выдадим игроку хп GivePlayerMoney(playerid, Player[playerid][pMoney]); //И денег ini_closeFile(iniFile); //Закроем файл SetPVarInt(playerid, "Logged", 1); //ставим переменной авторизации, что игрок залогинился return 1; } else { SendClientMessage(playerid, COLOR_SYSTEM, "System: Неверный пароль!"); ShowPlayerDialog(playerid, id вашего диалога, DIALOG_STYLE_INPUT, "Авторизация", "Вы должны авторизоваться! \nВведите ваш пароль:", "Ок", ""); return 1; } } return 0; }
8. Ну а теперь при выходе игрока с серва, запишем информацию по нему. В любое место в моде ставим:
Код stock SaveAccount(playerid) { new PlayerName[MAX_PLAYER_NAME], account[128]; GetPlayerName(playerid,PlayerName,sizeof(PlayerName)); //узнаем ник format(account,sizeof(account), "users/%s.ini", PlayerName); //ищем файл new iniFile = ini_openFile(account); //опеним файл ini_setInteger(iniFile, "Money", GetPlayerMoney(playerid)); //Записываем кол-во денег ini_closeFile(iniFile); //Клозим наш файл return 1; }
9. Далие добовляем в public OnPlayerDisconnect(playerid, reason)
Код public OnPlayerDisconnect(playerid, reason) { SaveAccount(playerid); }
10. А если сервер крашнится?! Че будет с акками? Они же не запишутся! Так, спокойно. И на этот случай решение есть! Создаем таймер вOnGameModeInit:
Код SetTimer("SaveAccounts", 1000*60*5, true);
11. И в любое место:
Код forward SaveAccounts(); public SaveAccounts() { for(new f; f < GetMaxPlayers(); f++) { if(!IsPlayerConnected(f))continue; SaveAccount(f); } }
12. Что бы игрок не респавнился пока не введет пароль ставим в OnPlayerRequestSpawn это:
Код if(GetPVarInt(playerid, "Logged") != 1) return 0;
Код SpawnPlayer(playerid);// Эта строка нужна, чтобы убирать кнопки <<< >>> spawn. Новичкам поможет.
13. Создаем папку users в папке scriptfiles Автор: frog163, StUNt71, Folk
|
Дата: 21.08.2011, Воскресенье, 23:01:16 | Сообщение # $NUMBER
Группа: Проверенные
Сообщений: 83
Проблема в том, что когда я зарегался он выдаёт авторизацию я ввёл туда пароль, а он ещё такоеже окно появилось ввёл опять пароль он зашол но не спавниться
|
Дата: 21.08.2011, Воскресенье, 23:37:00 | Сообщение # $NUMBER
Группа: VIP
Сообщений: 1021
SaPsAn7774, Что я тебя не понял... по подробнее
|
Дата: 21.08.2011, Воскресенье, 23:46:02 | Сообщение # $NUMBER
Группа: Проверенные
Сообщений: 83
короче дело в том что авторизация вылазеет два раза))) во как!)а потом я нажимаю spawn он не spawn XD понятно???
|
Дата: 22.08.2011, Понедельник, 18:28:51 | Сообщение # $NUMBER
Группа: Проверенные
Сообщений: 80
Вопрос по 4 пункту: почему Float:pHeal?
|
Дата: 06.07.2013, Суббота, 14:57:19 | Сообщение # $NUMBER
Группа: Модераторы
Сообщений: 1045
Код SpawnPlayer(playerid); модераторы добавьте это к первому посту. Эта строка нужна, чтобы убирать кнопки <<< >>> spawn. Новичкам поможет.
|