Question

Вступление: Приветствую! У меня огромная проблема. Прошу знающих людей дать ответ, я не слишком смышленый в деле модов, т.к только начинаю этим заниматься так что прошу (Если можете) помочь в решении возникшей ситуации.

 

Контекст: Дело в том что пишу код с нуля по урокам, в видео автор делает ХЭШ-пароль, а у меня с ним возникли трудности, не суть. Возникла проблема при авторизации игрока. Когда я ввожу не правильный пароль, программа естественно отвечает что он не верный, но когда я пишу правильный, он тоже пишет что он не правильный, и я не знаю что с этим делать...


Весь код (Убрал только не задействованные функции):

Спойлер



#include <a_samp>

#include <fix>
#include <a_mysql>
#include <streamer>
#include <sscanf2>
#include <foreach>
#include <Pawn.Regex>
#include <Pawn.CMD>
#include <crashdetect>

#define     SCM     SendClientMessage
#define     SCMTA   SendClientMessageToAll
#define     SPD     ShowPlayerDialog

#define     COLOR_WHITE 0xFFFFFFFF
#define     COLOR_RED   0xff0004AA

#define MAX_PASSWORD_LENGTH 32


//---------------------------   БАЗА ДАННЫХ   ----------------------------
#define MYSQL_HOST "localhost"
#define MYSQL_USER "root"
#define MYSQL_PASS ""
#define MYSQL_BASE "project"

//------------------------------------------------------------------------

main()
{
    print("\n----------------------------------");
    print(" 14.11.23 | Mr.Sokolowsky");
    print("----------------------------------\n");
}

//----------------------------   Переменные   ----------------------------
//-----------------------------   Мусорка   ------------------------------

//------------------------------------------------------------------------
//------------------------------------------------------------------------

enum player
{
    ID,
    NAME[MAX_PLAYER_NAME],
    PASSWORD[32],
    EMAIL[64],
    REF,
    SEX,
    RACE,
    AGE,
    SKIN,
    REGDATA[13],
    REGIP[16],
}

new player_info[MAX_PLAYERS][player]; // 1 Warning, он ни на что не влияет.

enum Dialog
{
    DLG_NONE,
    DLG_REG,
    DLG_REGEMAIL,
    DLG_LOG,
    DLG_REGREF,
    DLG_SEX,
    DLG_REGRACE,
    DLG_REGAGE
}

new MySQL:dbHandle;

public OnGameModeInit()
{
    ConnectMySQL();
    return 1;
}

stock ConnectMySQL()
{
    dbHandle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_BASE);
    switch(mysql_errno())
    {
        case 0: print("Успешно");
        default: print("НЕ РАБОТАЕТ");
    }
}

public OnGameModeExit()
{
    mysql_close(dbHandle);
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    return 1;
}

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid, player_info[playerid][NAME], MAX_PLAYER_NAME);
    TogglePlayerSpectating(playerid, 1);
    InterpolateCameraPos(playerid, 1243.014526, -2036.57836982.257240+5.071.424697, -2078.66357437.51391925000);
    InterpolateCameraLookAt(playerid, 498.725097, -1991.03637637.513919-5.0364.344390, -1828.5292968.78862625000);
    static const fmt_query[] = "SELECT `id` FROM `users` WHERE `name` = '%s'";
    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)];
    format(query, sizeof(query), fmt_query, player_info[playerid][NAME]);
    mysql_tquery(dbHandle, query, "CheckRegistration""i", playerid);
    return 1;
}

forward CheckRegistration(playerid);
public CheckRegistration(playerid)
{
    new rows;
    cache_get_row_count(rows);
    if(rows)
    {
        cache_get_value_name(0"password", player_info[playerid][PASSWORD], 32);
        ShowLogin(playerid);
    }
    else ShowRegistration(playerid);
}

stock ShowLogin(playerid)
{
    new dialog[156+(-2+MAX_PLAYER_NAME)];
    format(dialog, sizeof(dialog),
        "{FFFFFF}Уважаемый {0089ff}%s{FFFFFF}, с возврощением на {0089ff}Venera RolePlay{FFFFFF}\n\
        \t\tМы рады снова видеть вас!\n\n\
        Для продолжения, введите свой пароль в поле ниже:",
    player_info[playerid][NAME]
    );
    SPD(playerid, DLG_LOG, DIALOG_STYLE_INPUT, "* {ffd100}Авторизация{FFFFFF} *", dialog, "Войти""Выход");
}

stock ShowRegistration(playerid)
{
    new dialog[340+(-2+MAX_PLAYER_NAME)];
    format(dialog, sizeof(dialog),
        "{FFFFFF}Уважаемый {0089ff}%s{FFFFFF}, мы рады вас видеть на {0089ff}Venera RolePlay{FFFFFF}\n\
        Аккаунт с таким именем не зарегестрирован в базе\n\
        Для игры на нашем сервере, придумайте сложный пароль!\n\
        После чего нажмите \"Далее\"\n\
        {ff9500}\t* Пароль должен быть от 8-ми до 32-ух символов\n\
        \t* Пароль дожен состоять из цифр и латинских букв.",
        player_info[playerid][NAME]
    );
    SPD(playerid, DLG_REG, DIALOG_STYLE_INPUT, "* {ffd100}Регистрация{FFFFFF} * Ввод пароля", dialog, "Далее""Выход" );
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DLG_REG:
        {
            if(response)
            {
                if(!strlen(inputtext))
                {
                    ShowRegistration(playerid);
                    return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Введите пароль в поле ниже и нажмите \"Далее\"");
                }
                if(strlen(inputtext) < 8 || strlen(inputtext) > 32)
                {
                    ShowRegistration(playerid);
                    return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Длина пароля должна быть от 8 до 32 символов.");
                }
                new regex:rg_passwordcheck = regex_new("^[a-zA-Z0-9]{1,}$");
                if(regex_check(inputtext, rg_passwordcheck))
                {
                    strmid(player_info[playerid][PASSWORD], inputtext, 0, strlen(inputtext), 32);
                    SPD(playerid, DLG_REGEMAIL, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Ввод Email",
                        "{FFFFFF}Введите свой настоящий Email адрес \n\
                        Если вы потеряете доступ к аккаунту, то сможете восстановить его через Email\n\
                        Введите его в поле ниже и нажмите \"Далее\"",
                        "Далее""");
                }
                else
                {
                    ShowRegistration(playerid);
                    return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Пароль может состоять только из чисел и цифр!");
                }
                regex_delete(rg_passwordcheck);
            }
            else
            {
                SCM(playerid, COLOR_RED, "Используйте \"/q\", чтобы покинуть сервер");
                SPD(playerid, -10" "" "" """);
                return Kick(playerid);
            }
        }
        case DLG_REGEMAIL:
        {// case
            if(!strlen(inputtext))
            {//strlen
                SPD(playerid, DLG_REGEMAIL, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Ввод Email",
                    "{FFFFFF}Введите свой настоящий Email адрес \n\
                    Если вы потеряете доступ к аккаунту, то сможете восстановить его через Email\n\
                    Введите его в поле ниже и нажмите \"Далее\"",
                    "Далее""");
                    return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Введите ваш Email ниже и нажмите \"Далее\"");
            }//strlen
            new regex:rg_emailcheck = regex_new("^[a-zA-Z0-9.-_]{1,43}@[a-zA-Z]{1,12}.[a-zA-Z]{1,8}$");
            if(regex_check(inputtext, rg_emailcheck))
            {//regex
                strmid(player_info[playerid][EMAIL], inputtext, 0, strlen(inputtext), 64);
                SPD(playerid, DLG_REGREF, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Ввод пригласившего игрока",
                   "{FFFFFF}Если ты зашел на сервер по приглашению, то \n\
                   можешь указать ник пригласившего в поле ниже.",
                   "Далее""Пропустить");
            }//regex
            else
            {//else-regex
                SPD(playerid, DLG_REGEMAIL, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Ввод Email",
                    "{FFFFFF}Введите свой настоящий Email адрес \n\
                    Если вы потеряете доступ к аккаунту, то сможете восстановить его через Email\n\
                    Введите его в поле ниже и нажмите \"Далее\"",
                    "Далее""");
                    return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Введите ваш Email ниже и нажмите \"Далее\"");
                return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Укажите правильно ваш Email адрес.");
            }//else-regex
            regex_delete(rg_emailcheck);
        }//case
        case DLG_REGREF:
        { // case 2
            if(response)
            { // if response 2
                new regex:rg_refcheck = regex_new("^[a-zA-Z_]{4,24}$");
                if(regex_check(inputtext, rg_refcheck))
                { // if regex
                    static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s'";
                    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)];
                    format(query, sizeof(query), fmt_query, inputtext);
                    mysql_tquery(dbHandle, query, "CheckReferal""is", playerid, inputtext);
                } // if regex
                else
                { // else regex
                    SPD(playerid, DLG_REGREF, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Ввод пригласившего игрока",
                       "{FFFFFF}Если ты зашел на сервер по приглашению, то \n\
                       можешь указать ник пригласившего в поле ниже.",
                       "Далее""Пропустить");
                       return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Введите ник игрока приглосившего вас корректно!");
                } // else regex
                regex_delete(rg_refcheck);
            } // if response 2
            else
            { // else if response 2
                SPD(playerid, DLG_SEX, DIALOG_STYLE_MSGBOX, "{ff9300}Регистрация{FFFFFF} * Выбор пола",
                    "{FFFFFF}Выберите пол вашего персонажа:",
                    "Мужской""Женский");
            } // else if response 2
        } //case 2
        case DLG_SEX:
        {
            if(response) player_info[playerid][SEX] = 1;
            else player_info[playerid][SEX] = 2;
            SPD(playerid, DLG_REGRACE, DIALOG_STYLE_LIST, "{ff9300}Регистрация{FFFFFF} * Выбор расы",
                "Негроидная\n\
                Европиоидная\n\
                Монголоидная/Азиатская",
            "Далее""");
        }
        case DLG_REGRACE:
        {
            switch(listitem)
            {
                case 0: player_info[playerid][RACE] = 1;
                case 1: player_info[playerid][RACE] = 2;
                case 2: player_info[playerid][RACE] = 3;
            }
            SPD(playerid, DLG_REGAGE, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Выбор возраста",
                "{FFFFFF}Введите возраст вашего будующего персонажа:\n\
                {ff9500}\t* Возраст должен быть от 18-ти до 60-ти лет!",
                "Далее""");
        }
        case DLG_REGAGE:
        {
            if(!strlen(inputtext))
            {
                SPD(playerid, DLG_REGAGE, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Выбор возраста",
                "{FFFFFF}Введите возраст вашего будующего персонажа:\n\
                {ff9500}\t* Возраст должен быть от 18-ти до 60-ти лет!",
                "Далее""");
            return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Укажите ваш возраст");
            }
            if(strval(inputtext) < 18 || strval(inputtext) > 60)
            {
            SPD(playerid, DLG_REGAGE, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Выбор возраста",
            "{FFFFFF}Введите возраст вашего будующего персонажа:\n\
            {ff9500}\t* Возраст должен быть от 18-ти до 60-ти лет!",
            "Далее""");
            return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Укажите возраст от 18-ти до 60-ти");
            }
            player_info[playerid][AGE] = strval(inputtext);
            //  ИНФ ПРО МАССИВ
            // В массиве 3 рассы, на каждый диаразон возраста - свои скины
            // Расы: Негроидная, Европиоидная, Монголоидная
            // Диапазоны: 18-29, 30-45, 46-60
            new regmaleskins[9][4] =
            {
                {19,21,22,28}, // Негроидная 18-29
                {24,25,36,67}, // Негроидная 30-45
                {14,142,182,183}, // Негроидная 46-60
                {29,96,101,26}, // Европиоидная 18-29
                {2,37,72,202}, // Европиоидная 30-45
                {1,3,234,290}, // Европиоидная 46-60
                {23,60,170,180}, // Монголоидная 18-29
                {20,47,48,206}, // Монголоидная 30-45
                {44,58,132,229// Монголоидная 46-60
            };
            new regfemaleskins[9][2] = // Аналогично
            {
                {13,69},
                {9,190},
                {10,218},
                {41,56},
                {31,151},
                {39,89},
                {169,193},
                {207,225},
                {54,130}
            };
                new newskinindex;
                switch(player_info[playerid][RACE])
                {
                    case 1: {}
                    case 2: newskinindex+=3;
                    case 3: newskinindex+=6;
                }
                switch(player_info[playerid][AGE])
                {
                    case 18..29: {}
                    case 30..45: newskinindex++;
                    case 46..60: newskinindex+=2;
                }
                if(player_info[playerid][SEX] == 1) player_info[playerid][SKIN] = regfemaleskins[newskinindex][random(4)];
                else player_info[playerid][SKIN] = regfemaleskins[newskinindex][random(2)];
                new Year, Month, Day;
                getdate(Year, Month, Day);
                new date[13];
                format(date, sizeof(date), "%02d.%02d.%d", Day, Month, Year);
                new ip[16];
                GetPlayerIp(playerid, ip, sizeof(ip));
                
                static const fmt_query[] = "INSERT INTO `users` (`name`, `password`, `email`, `ref`, `sex`, `race`, `age`, `skin`, `regdata`,  `regip`) VALUES ('%s', '%s', '%s', '%d', '%d', '%d', '%d', '%d', '%s', '%s')";
                    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+64)+(-2+32)+(-2+8)+(-2+2)+(-2+2)+(-2+3)+(-2+4)+(-2+13)+(-2+16)];
                    format(query, sizeof(query), fmt_query, player_info[playerid][NAME], player_info[playerid][PASSWORD], player_info[playerid][EMAIL], player_info[playerid][REF], player_info[playerid][SEX], player_info[playerid][RACE], player_info[playerid][AGE], player_info[playerid][SKIN], date, ip);
                    mysql_query(dbHandle, query);
                    
                static const fmt_query2[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'";
                    format(query, sizeof(query), fmt_query2, player_info[playerid][NAME], player_info[playerid][PASSWORD]);
                    mysql_tquery(dbHandle, query, "PlayerLogin""i", playerid);

                    
        }

        case DLG_LOG:
        {
            if (response)
            {
                static const fmt_query[] = "SELECT * FROM `users` WHERE `password` = '%s'";
                new query[sizeof(fmt_query)+(-2+32)];
                format(query, sizeof(query), fmt_query, player_info[playerid][PASSWORD]);
                new Cache: result = mysql_query(dbHandle, query);
                if(cache_num_rows())
                {
                    SCM(playerid, COLOR_WHITE, "{22ff00}[SERVER]{FFFFFF}: {ff0000}Верно!");
                }
                else
                {
                    SCM(playerid, COLOR_WHITE, "{ff0000}[SERVER]{FFFFFF}: {ff0000}Не верно!");
                    ShowLogin(playerid);
                    cache_delete(result);
                }
            }
            else
            {
                SCM(playerid, COLOR_WHITE, "{ff0000}[SERVER]{FFFFFF}: {ff0000}(/q){FFFFFF}");
                SPD(playerid, -10" "" "" """);
                return Kick(playerid);
            }
        }
    }// Не трогать
    return 1;
}// не трогать

forward PlayerLogin(playerid);
public PlayerLogin(playerid)
{
    new rows;
    cache_get_row_count(rows);
    if(rows)
    {
        cache_get_value_name_int(0"id", player_info[playerid][ID]);
        cache_get_value_name(0"email", player_info[playerid][EMAIL], 64);
        cache_get_value_name(0"password", player_info[playerid][PASSWORD], 32);
        cache_get_value_name_int(0"ref", player_info[playerid][REF]);
        cache_get_value_name_int(0"sex", player_info[playerid][SEX]);
        cache_get_value_name_int(0"race", player_info[playerid][RACE]);
        cache_get_value_name_int(0"age", player_info[playerid][AGE]);
        cache_get_value_name_int(0"skin", player_info[playerid][SKIN]);
        cache_get_value_name_int(0"regdate", player_info[playerid][REGDATA], 13);
        cache_get_value_name_int(0"regip", player_info[playerid][REGIP], 16);

        TogglePlayerSpectating(playerid, 0);
        SetSpawnInfo(playerid, 000000000000);
        SetPVarInt(playerid, "logged"1);
        SpawnPlayer(playerid);
    }
    return 1;
}

forward CheckReferal(playerid, referal[]);
public CheckReferal(playerid, referal[])
{
    new rows;
    cache_get_row_count(rows);

    if(rows)
    {
        new refid;
        SPD(playerid, DLG_SEX, DIALOG_STYLE_MSGBOX, "{ff9300}Регистрация{FFFFFF} * Выбор пола",
            "{FFFFFF}Выберите пол вашего персонажа:",
            "Мужской""Женский");
        cache_get_value_name_int(0"id", refid);
        player_info[playerid][REF] = refid;
    }
    else
    {
        SPD(playerid, DLG_REGREF, DIALOG_STYLE_INPUT, "{ff9300}Регистрация{FFFFFF} * Ввод пригласившего игрока",
           "{FFFFFF}Если ты зашел на сервер по приглашению, то \n\
           можешь указать ник пригласившего в поле ниже.",
           "Далее""Пропустить");
        return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Аккаунта с таким ником нет в базе данных!");
    }
    return 1;
}

public OnPlayerClickPlayer(playerid, clickedplayerid, source)
{
    return 1;
}

CMD:spawn(playerid)
{
    TogglePlayerSpectating(playerid, 0);
        SetSpawnInfo(playerid, 000000000000);
        SetPVarInt(playerid, "logged"1);
        SpawnPlayer(playerid);
}

 


 

Код самой авторизации: 

case DLG_LOG:
        {
            if (response)
            {
                static const fmt_query[] = "SELECT * FROM `users` WHERE `password` = '%s'";
                new query[sizeof(fmt_query)+(-2+32)];
                format(query, sizeof(query), fmt_query, player_info[playerid][PASSWORD]);
                new Cache: result = mysql_query(dbHandle, query);
                if(cache_num_rows())
                {
                    SCM(playerid, COLOR_WHITE, "{22ff00}[SERVER]{FFFFFF}: {ff0000}Верно!");
                }
                else
                {
                    SCM(playerid, COLOR_WHITE, "{ff0000}[SERVER]{FFFFFF}: {ff0000}Не верно!");
                    ShowLogin(playerid);
                    cache_delete(result);
                }
            }
            else
            {
                SCM(playerid, COLOR_WHITE, "{ff0000}[SERVER]{FFFFFF}: {ff0000}(/q){FFFFFF}");
                SPD(playerid, -10" "" "" """);
                return Kick(playerid);
            }
        }
    }// Не трогать
    return 1;
}// не трогать

 

Edited by keyl

Заметка от keyl , создано

3.2. Код необходимо брать в тег "Код", а код более 10 строк – еще и в "Спойлер". Как это сделать рассказано в разделе "FAQ".

Устное предупреждение.

Share this post


Link to post

3 answers to this question

  • 0

Мод компилируется без ошибок?

Share this post


Link to post
  • 0

@Хатнис да, только варнинги и все, тип синтаксис и т.д

Share this post


Link to post

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

    • Topowich
      By Topowich
      Недавно начал создавать свой комп сервер,начал потихоньку заменять модели тс и столкнулся с такой проблемой,что не могу понять как менять настройку авто. Подскажите пожалуйста,как это сделать?Мне не принципиально  чтобы настройки были в коде сервера,можно и на файлах если будет хорошо работать