[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
[Pawno-Урок]Простая регистрация в диалоговых окнах
Дата: 04.06.2011, Суббота, 16:43:57 | Сообщение # $NUMBER
Группа: VIP
Сообщений: 1021
Репутация: 815+
Привет. Сейчас мы сделаем регистрацию с помощью [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
    Репутация: 39+
    Проблема в том, что когда я зарегался он выдаёт авторизацию я ввёл туда пароль, а он ещё такоеже окно появилось ввёл опять пароль он зашол но не спавниться :(
    Дата: 21.08.2011, Воскресенье, 23:37:00 | Сообщение # $NUMBER
    Группа: VIP
    Сообщений: 1021
    Репутация: 815+
    SaPsAn7774, Что я тебя не понял... по подробнее
    Дата: 21.08.2011, Воскресенье, 23:46:02 | Сообщение # $NUMBER
    Группа: Проверенные
    Сообщений: 83
    Репутация: 39+
    :D короче дело в том что авторизация вылазеет два раза))) во как!)а потом я нажимаю spawn он не spawn XD понятно??? :)
    Дата: 22.08.2011, Понедельник, 18:28:51 | Сообщение # $NUMBER
    Группа: Проверенные
    Сообщений: 80
    Репутация: 1+
    Вопрос по 4 пункту: почему Float:pHeal?
    Дата: 06.07.2013, Суббота, 14:57:19 | Сообщение # $NUMBER
    Группа: Модераторы
    Сообщений: 1045
    Репутация: 1112+

    Код
    SpawnPlayer(playerid);  

    модераторы добавьте это к первому посту. Эта строка нужна, чтобы убирать кнопки <<< >>> spawn. Новичкам поможет.
    • Страница 1 из 1
    • 1
    Поиск: