В теме 2 сообщения

Antoxa39
Dance 80-90, mmm Nice)

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

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;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Владислав Малиновский
      От Владислав Малиновский
      SWEEK RUSSIA — онлайн игра на телефон с открытым миром, в котором Вы можете создать персонажей вместе со своими друзьями и начать весело проводить время. Вы можете продвигаться по сюжету квестовых миссий или же начать игру с зарабатывания денег в транспортной компании. Создавать организации, подниматься по карьерной лестнице. Заполучив влияние над другими игроками - попробуй себя в роли Президента.
       
      Нам нужны ответственные люди на должность главного администратора. Если вы считаете себя адекватным и ответственным, отпишите в vk.com/devmaksim или t.me/raphmarci.
       
      Официальный сайт проекта - sweekrussia.ru
      Официальный форум проекта - forum.sweekrussia.ru
      Официальное сообщество VK - vk.com/sweekrussia.game
      Официальный TG канал - t.me/sweek_dev
    • bogdan295@gmai
      От bogdan295@gmai
      Здраствуйте, я создавал новую организации когда дело дашло до пикапов они не создаются 
      new lssd1; new lssd2;  else if(pickupid == lssd2)// Вход     {         SetPlayerInteriorEx(playerid,0);         SetPPos(playerid,1567.5510,-1657.9956,5.3859);         SetPlayerFacingAngle(playerid, 500);         return true;     } else if(pickupid == lssd1)// Вsход     {         SetPlayerInteriorEx(playerid,0);         SetPPos(playerid,630.0542,-572.0032,16.3359);         SetPlayerFacingAngle(playerid, 500);         return true;     }     lssd2 = CreatePickupAC(1318,1,626.9653,-571.8394,17.9207, 147); // вход лссд     lssd1 = CreatePickupAC(1318,1,1567.4720,-1660.6494,5.3859, 147); // выход лссд Что я сделал не так?
    • tgfoscar
      От tgfoscar
      Требуется свободное владение C++. Античит, новый способ добавления техники на сервер, совместимость с CEF и возможность добавления полезных функций. За дополнительной информацией обращайтесь к wayne_gm в Discord.
    • enotplaysupptor
      От enotplaysupptor
      Основа для мода Samp для начинающих
      Скачать файл ╔══════════════════════════════════════════════════╗
      ║               Test-RolePlay v0.1           ║
      ║       Современная основа для SA-MP серверов      ║
      ╚══════════════════════════════════════════════════╝
      ✦ О ПРОЕКТЕ:
         Добро пожаловать в Test-RolePlay - мод с нуля, 
         созданный как универсальная основа для SA-MP проектов.
         Проект был создан для тех кто не знает с чего начать и начинающих разработчиков
         Версия: T-RP v0.1 [Актуальная]
      ✦ ОСНОВНЫЕ ПЛАГИНЫ:
         ▸ CrashDetect    - отладка ошибок
         ▸ MySQL R41+     - работа с базой данных
         ▸ Pawn.CMD       - система команд
         ▸ Pawn.Regex     - регулярные выражения
         ▸ SKY            - улучшенные игровые функции
         ▸ sscanf2        - парсинг параметров
         ▸ Streamer       - динамические объекты
         ▸ TOTP           - двухфакторная аутентификация
      ✦ КЛЮЧЕВЫЕ СИСТЕМЫ:
         ┌──────────────────────────────────────────────┐
         │ 🔹 Умная регистрация/авторизация:            │
         │    - Хеширование паролей                     │
         │    - Привязка Email                          │
         │    - Выбор пола и расы персонажа             │
         ├──────────────────────────────────────────────┤
         │ 🔹 Командная система:                        │
         │    - Полный набор РП-команд                  │
         │    - Расширенные админ-команды               │
         ├──────────────────────────────────────────────┤
         │ 🔹 Игровое меню:                             │
         │    - Персональная статистика                 │
         │    - Настройки аккаунта                      │
         │    - Система жалоб и вопросов                │
         ├──────────────────────────────────────────────┤
         │ 🔹 Дополнительные системы:                   │
         │    - АФК-режим с автоматическим детектом      │
         │    - Интегрированный античит (Nex-AC)        │
         └──────────────────────────────────────────────┘
      ✦ ПЛАНЫ РАЗРАБОТКИ:
         » Добавление новых игровых систем
         » Оптимизация существующего кода
         » Расширение возможностей для администраторов
         » Улучшение пользовательского интерфейса
      Если увижу что вы хотите что бы я продолжил разработку данного мода пишите или можете проявиться большую активность










      Добавил enotplaysupptor Добавлено 09.07.2025 Категория Моды Автор Я