Antoxa39

[УРОК] - [РЕШЕНИЕ] Регистрация.

2 posts in this topic

Дратути,я научился делать регистрацию, и хочу поделится со всеми как это сделать им самим.

1.Нам потребуется: Denwer или Open Server. ( Урок про подключение я делал ранее, так что обьяснять сейчас что и как делать для подключения не буду, но урок можно посмотреть тут)

2.MySQL R39-6.

3. Прямые руки.

4. Переходим к процессу.

//P.S БД - База Данных

Делаем подключение к БД.

main(){}
#include <a_samp>


#include <a_mysql>
#include <Pawn.CMD>
#include <sscanf2>
#include <streamer>
#include <time>

//--------------   SQL     ----------------------
new dbHandle;
#define MYSQL_HOST "127.0.0.1"
#define MYSQL_USER "mysql"
#define MYSQL_BD "urok"
#define MYSQL_PASSWORD "mysql"
//------------------------

public OnGameModeInit()
{
    dbHandle = mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_BD,MYSQL_PASSWORD);
    CheckConnectSQL();
    return 1;
}

public OnGameModeExit()
{
    return 1;
}
stock CheckConnectSQL()
{
    if(mysql_errno()) printf("Подключение к БД %s прервалось. Код ошибки: %d",MYSQL_BD,mysql_errno())
    else printf("Подключение к БД %s успешно!",MYSQL_BD)
    return 1;
}


Подключение сделано.

Далее мы должны сделать такое: Когда игрок заходит на сервер, нужно проверить есть ли игрок с таким Никнеймом в БД.

Делаем массив,который будет хранить в себе пароль,имя игрока. ( сделаем еще и уровень ).

// перед --------------   SQL     ---------------------- создаем enum
//Enum - это вещь, позволяющая создавать большее количество адресов одной переменной
enum pInfo{
    pID,
    pNick[24],
    pPassword[32],
    pLevel
}
new Player[MAX_PLAYERS][pInfo];//Мы обьявили переменную,которая будет хранить в себе наш Enum.

Идем создавать БД.

1.

2.

3.

4.

5. Идем обратно к скриптингу

И вот тут, мы сделаем проверку есть ли в БД аккаунт с таким никнеймом.

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid,Player[playerid][pNick],MAX_PLAYER_NAME);//Мы записали ник игрока в массив pNick.
    new query[100];//создаем переменную с запросом.
    format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);//Форматируем запрос, SELECT * FROM, то есть 
    //загружаем всю информацию о игроке с ником, записаным в pNick.
    mysql_function_query(dbHandle,query,true,"CheckPlayerBD","i",playerid);//Посылаем запрос в БД, указываем ИД подключение - dbHandle. true - потому что мы хотим получить информацию. И вызываем следующим паблик "CheckPlayerBD"
    return 1;
}
//в конец мода
forward CheckPlayerBD(playerid);
public  CheckPlayerBD(playerid)
{
    new rows,fields;
    cache_get_data(rows,fields);//Проверили есть ли строка с таким именем.
    if(!rows)//если нет такого игрока то показываем регистрацию
    {
        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация""Приветствуем Вас! Вы еще не зарегистрированы,введите свой пароль ниже.""Далее""");
    }
    else
    {
        ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация""Рады видеть Вас снова на Urok. Авторизуйтесь.""Далее""");
        cache_get_field_content(0,"pPassword",Player[playerid][pPassword],dbHandle);//Загружаем пароль игрока из БД.
    }
    return 1;
}

Я мог сделать ИД диалогов через енум, но для примера можно и так.

Далее идем в OnDialogResponse

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        //case 1 это регистрация
        case 1:
        {
            if(!response) return Kick(playerid); // если игрок отказывается от регистрации кикаем его.
            if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация""Длина пароля от 4 до 32 символов.\n Вы также не можете продолжить не указав пароль""Далее""");
            //это была проверка на длину пароля
            for(new i; i < strlen(inputtext); i++)
            {
                switch(inputtext[i])
                {
                    case 'A'..'Z','a'..'z','0'..'9':continue;
                    defaultreturn ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация""Пароль может быть только: a-z, A-Z,0-9""Далее""");
                }
            }
            //это проверка на символы,если игрок будет писать пароль на русском, или какие нибудь другие символы
            //например \*? то ему будет возвращатся этот же диалог,а если все отлично то регистрация продолжится.
            new query[120 + MAX_PLAYER_NAME];//также создали запрос
            format(query,sizeof(query),"INSERT INTO `account` (`pNick`,`pPassword`,`pLevel`) VALUES ('%s','%s','1')"),Player[playerid][pNick],inputtext);
            /*Мы отформатировали строку,сделав в ней запрос: Добавить строку в таблице account, со столбцами pNick = '%s', %s значит строка
            в данном случае эта строка, это массив который хранит в себе никнейм игрока,inputtext это введеный текст игроком, pLevel это уровень игрока,изначально в бд он будет 1.*/
            mysql_query(dbHandle,query);
            //теперь делаем запрос на загрузку акканута.
            new query1[100];
            format(query1,sizeof(query1),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);//отфарматироваали новый запрос
            mysql_function_query(dbHandle,query1,true,,"LoadAcc","i",playerid);
        }
    }
    case 2:
    {
        if(!response) return Kick(playerid); // если игрок отказывается от авторизации также кикаем его.
        if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация""Неверный пароль""Далее""");//Делаем проверку на длину пароля, т.к при регистрации у нас пароль был от 4 до 32, тут тоже самое должно быть
        for(new i; i < strlen(inputtext); i++)
        {
            switch(inputtext[i])
            {
                case 'A'..'Z','a'..'z','0'..'9'continue;//если он также вводит правильные символы продолжаем выполнение кода для игрока.
                defaultreturn  ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация""Не верный пароль!""Далее""");// при вводе спец.символов ему будет возвращать диалог авторизации
            }
        }
        new query[120];
        format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s' AND `pPassword` = '%s'",Player[playerid][pNick],inputtext)//Загрузить информацию о игроке,и проверить совпадает введеный пароль игроком,с тем который в БД.
        mysql_function_query(dbHandle,query,true,"CheckPass","i",playerid);
    }
    return 1;
}
//создаем паблик LoadAcc
forward LoadAcc(playerid);
public LoadAcc(playerid)
{
    Player[playerid][pID] = cache_get_field_content_int(0,"pID",dbHandle);// 0 потому что в БД может быть только одна строка с таким именем или ИД
    Player[playerid][pLevel] = cache_get_field_content_int(0,"pLevel",dbHandle);// приравнение, то есть записываем Левел и ИД игрока в наши массивы.
    //Пароль и никнейм загружать не надо
}
forward CheckPass(playerid);
public CheckPass(playerid)
{
    new rows,fields;
    cache_get_data(rows,fields);//сверяем пароль
    if(rows)
    {
        //если веденный пароль совпадает с паролем в БД то авторизуем игрока
        SpawnPlayer(playerid);
        SendClientMessage(playerid,-1,"Вы успешно авторизовались!");
    }
    else
    {
        //если нет то считаем попытки ввода пароля
        SetPVarInt(playerid,"wrong_password",GetPVarInt(playerid,"wrong_password") + 1)
        ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Авторизация","Не верный пароль!","Далее","");
        new str[64];
        format(str,sizeof(str),"У вас осталось: %d попыток",GetPVarInt(playerid,"wrong_password"));
        SendClientMessage(playerid,-1,str);//форматируем строку, где говорим игроку сколько у него осталось попыток
        if(GetPVarInt(playerid,"wrong_password") >= 5return Kick(playerid);//если игрок использовал больше 5 попыток, то кикаем его
    }

}

и в OnGameModeExit()

public OnGameModeExit()
{
    mysql_close(dbHandle);//отключаемся от БД
    return 1;
}

 

Share this post


Link to post
Share on other sites

P.S В #include ОСТАВИТЬ ТОЛЬКО <a_mysql> и <a_samp> !!!!!!!!!!!!!!!!!!!!!!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • huri
      By huri
      Помогите с плагином, который будет отключать игрока от сервера если он умер более 3 раз за 5 секунд
    • Pukikaki
      By Pukikaki
      Ничего не знаю о павно и тд, решили побегать с друзьями по старому садку, все подключил 0/500 - сервер работает, захожу, коннектит, и все, ничего нету, вводил ник который был в таблице - тоже самое, помогите пожалуйста, как это убрать? Или как вместо UCP поставить просто регистрацию 
      https://yadi.sk/d/BZ7Da2r_3GZDUg
    • Daniil_123123
      By Daniil_123123
      Помогите решить проблему с компиляцией.
       
      Ошибки при попытке компиляции в Pawno: 
      D:\gamemodes\arizona.pwn(53217) : error 017: undefined symbol "GZInfo"
      D:\gamemodes\arizona.pwn(53217) : error 001: expected token: ";", but found "]"
      D:\gamemodes\arizona.pwn(53217) : error 029: invalid expression, assumed zero
      D:\gamemodes\arizona.pwn(53217) : fatal error 107: too many error messages on one line
       
      Сам код в котором ошибки:
       
      Это не весь код, а лишь часть кода из мода, кто сможет помочь - заранее спасибо. Если нужен будет целый файл со всем кодом я могу также прикрепить.
    • Nik_Rofid
      By Nik_Rofid
      Как на копии радмира сделать свою сюжетную линию с награждением в конце?
      Заранее. Спасибо!