Вопросы

Всем привет! Я пишу своё мод с нуля, и тут у меня возникла проблема с авторизацией. Я не могу сделать проверку на правильность введённого пароля.

        case DLG_LOG:
        {
            if(response)
            {
                //ВОТ ТУТ ДОЛЖНА БЫТЬ ПРОВЕРКА НА ПРАВИЛЬНОСТЬ ПАРОЛЯ
                {
                    static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'";
                    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+32)];
                    format(query, sizeof(query), fmt_query, player_info[playerid][PASSWORD]);
                    mysql_tquery(dbHandle, query, "PlayerLogin""i", playerid);
                    SCM(playerid, COLOR_GOLD, "Вы авторизовались!");
                }
                else
                {
                    new string[87];
                    SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")-1);
                    if(GetPVarInt(playerid, "WrongPassword") > 0)
                    {
                        format(string, sizeof(string), "[Ошибка] {FFFFFF}Вы ввели неверный пароль от аккаунта. У вас осталось %d попыток ввода.", GetPVarInt(playerid, "WrongPassword"));
                        SCM(playerid, COLOR_RED, string);
                    }
                    if(GetPVarInt(playerid, "WrongPassword") == 0)
                    {
                        SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF} Вы исчерпали лимит попыток ввода и были отключеный от сервера.");
                        SPD(playerid, -10" "" "" """);
                        return Kick(playerid);
                    }
                    ShowLogin(playerid);
                }
            }
            else
            {
                SCM(playerid, COLOR_RED, "Используйте \"/q(uit)\", для выхода из игры");
                SPD(playerid, -10" "" "" """);
                return Kick(playerid);
            }
        }
    }
    return 1;

 

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


Ссылка на сообщение

27 ответов на этот вопрос

  • 0

Сижу вот, пишу тебе код, перепроверяю твой и натыкаюсь на такую вещь.. Аргументы не соответствуют.

                    static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'"// здесь у нас ник и пароль
                    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME)+(-2+32)];
                    format(query, sizeof(query), fmt_query, player_info[playerid][PASSWORD]); // здесь тоже должны быть ник и пароль, но у тебя только ник, получается, что за них берется пароль, который вряд ли нормально записывается.
                    mysql_tquery(dbHandle, query, "PlayerLogin""i", playerid);

// Исправленный вариант
                    new player_nick_for_login[MAX_PLAYER_NAME+1];
                    GetPlayerName(playerid, player_nick_for_login, sizeof player_nick_for_login);
                    static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'";
                    new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME+1)+(-2+32+1)];
                    format(query, sizeof(query), fmt_query, player_nick_for_login, inputtext);
                    mysql_tquery(dbHandle, query, "PlayerLogin""i", playerid); // теперь получается, здесь уже идёт проверка, если найдена строка, то загружаем данные, если нет - повторно просим ввести логин, при этом записываю в локальную переменную в этот паблике количество попыток.

 

В итоге получим диалог: 

case DLG_LOG:
        {
            if(!response) {
                SCM(playerid, COLOR_RED, "Используйте \"/q(uit)\", для выхода из игры");
                SPD(playerid, -10" "" "" """);
                return Kick(playerid);
            }
            if(!strlen(inputtext)) 
                return SCM(playerid, COLOR_RED, "[Ошибка] Вы ничего не ввели!"),
                ShowLogin(playerid);
            //стоило бы добавить проверки ещё на длинну знаков, кириллицу и прочее, не думаю, что у тебя с этим возникнут проблемы

            new player_nick_for_login[MAX_PLAYER_NAME+1];
            GetPlayerName(playerid, player_nick_for_login, sizeof player_nick_for_login);
            static const fmt_query[] = "SELECT * FROM `users` WHERE `name` = '%s' AND `password` = '%s'";
            new query[sizeof(fmt_query)+(-2+MAX_PLAYER_NAME+1)+(-2+32+1)];
            format(query, sizeof(query), fmt_query, player_nick_for_login, inputtext);
            mysql_tquery(dbHandle, query, "PlayerLogin""i", playerid);
            //SCM(playerid, COLOR_GOLD, "Вы авторизовались!"); // явно лишний, потому что неизвестно, верно ли указал игрок пароль. Это будет при успешной авторизации в PlayerLogin
                
            /*else
            {
                new string[87];
                SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")-1);
                if(GetPVarInt(playerid, "WrongPassword") > 0)
                {
                    format(string, sizeof(string), "[Ошибка] {FFFFFF}Вы ввели неверный пароль от аккаунта. У вас осталось %d попыток ввода.", GetPVarInt(playerid, "WrongPassword"));
                    SCM(playerid, COLOR_RED, string);
                }
                if(GetPVarInt(playerid, "WrongPassword") == 0)
                {
                    SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF} Вы исчерпали лимит попыток ввода и были отключеный от сервера.");
                    SPD(playerid, -1, 0, " ", " ", " ", "");
                    return Kick(playerid);
                }
                ShowLogin(playerid);
            }*/ //ВОТ ЭТА вся часть должна быть в случае, если не найден аккаунт с таким паролем (заранее, надеюсь, в OnPlayerConnect идёт проверка на существование аккаунта и  в паблике от запроса идёт уже вывод нужного диалога (рега или авторизация))
        }
    }
    return 1;

 

Я думаю, щас допишу примерный вариант, если проверка будет в диалоге, но тогда тебе нужно будет переписать PlayerLogin немного

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


Ссылка на сообщение
  • 0

Вот, что получилось, если делать проверку в паблике:

case DLG_LOG:
        {
            if(response) {
                SCM(playerid, COLOR_RED, "Используйте \"/q(uit)\", для выхода из игры");
                SPD(playerid, -10" "" "" """);
                return Kick(playerid);
            }            

            new player_nick_for_login[MAX_PLAYER_NAME+1];
            GetPlayerName(playerid, player_nick_for_login, sizeof player_nick_for_login);

            if(!strlen(inputtext))
                return SCM(playerid, COLOR_RED, !"[Ошибка] {FFFFFF}Вы ни чего не ввели, повторите попытку."),
                ShowLogin(playerid);// Повтороно показываешь этот диалог, смею предположить, что это и есть показ

            if(!strcmp(inputtext, player_info[playerid][PASSWORD])) {// если пароль введен верно, следует учитывать, что пароль должен получаться в паблике из вызова запроса в OnPlayerConnect, например, вроде у тебя я и видел его где-то "check"
                //рекомендую переписать PlayerLogin, здесь ты теперь вызываешь запрос, по типу:
                if(GetPVarInt(playerid, "WrongPassword") != 0)
                    DeletePVar(playerid, "WrongPassword");

                static const fmt_mysql_query[] = "SELECT * FROM `users` WHERE `Name` = '%s'"// то есть, паблик должен уже работать как загрузка данных, потому что пароль верный
                new mysql_string[sizeof fmt_mysql_query-2+MAX_PLAYER_NAME+1];
                format(mysql_string, sizeof mysql_string, fmt_mysql_query, player_nick_for_login);
                mysql_tquery(dbHandle, mysql_string, "PlayerLogin""i", playerid);
            }
            
            else // если пароль не подходит
            {
                switch(GetPVarInt(playerid, "WrongPassword")) {
                    case 0: {
                        SCM(playerid, COLOR_RED, !"[Ошибка] Пароль введен неверно! У вас осталось 3 попытки!");
                        ShowLogin(playerid);
                        SetPVarInt(GetPVarInt(playerid, "WrongPassword")+1);
                    }
                    case 1: {
                        SCM(playerid, COLOR_RED, !"[Ошибка] Пароль введен неверно! У вас осталось 2 попытки!");
                        ShowLogin(playerid);
                        SetPVarInt(GetPVarInt(playerid, "WrongPassword")+1);                           
                    }
                    case 2: {
                        SCM(playerid, COLOR_RED, !"[Ошибка] Пароль введен неверно! У вас осталось 1 попытка!");
                        ShowLogin(playerid);
                        SetPVarInt(GetPVarInt(playerid, "WrongPassword")+1);                           
                    }
                    case 3: {
                        SCM(playerid, COLOR_RED, !"[Ошибка] Пароль введен неверно! Вы исчерпали лимит попыток!");
                        SCM(playerid, 0xFFFFFFFF, !"Для выхода из игры введите: /q(uit)");
                        DeletePVar(playerid, "WrongPassword");
                        return Kick(playerid);                       
                    }
                }
            }
        }
    }
    return 1;

 

Отредактировано пользователем SCRIPTMAN

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


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

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

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

    • angel_sinvays
      От angel_sinvays


      Скачать файл Florida Role Play | (Бонусный)
      Список доработок/изменений:

      1. Исправлены дыры с рублями, падением мода
      2. Новый античит(/ac)
      3. Аренда вертолетов (/gps - аренда транспорта - аренда вертолетов)
      4. Добавлена система /goadminka (раздача админки при определённом онлайне)
      5. Обновленны интерьеры банд, СМИ, ПД, выбор скина, домов, магазинов
      6. Изменён экстерьер парка у мэрии, на против больницы
      7. Изменен текстдрав Логотипа, выбор скина, спидометра, дм арены, капта
      8. Вместо мопедов сделаны пикапы аренды
      9. Добавлена система VIP (Бронза, Серебро, Золото и Верона)
      10. Изменена система семей
      11. Добавлен чат для випов (/vc)
      12. При попытки проследить за ботом, перекидывает за игрока
      13. Добавлено казино, в котром можно играть на донат и рубли
      14. Добавлена система дуэлей
      15. Добавлены команды: /security, /checkfull и /fonline
      16. Изменён бот для авто-инвайта
      17. Изменена система дм зон (отличается от дуэлей)
      18. Доработана система статистики администратора, добавлено время администрирования в /admins
      19. Добавлен премиум меню для Verona PREMIUM
      20. Добавлены карты для /tp - Мероприятия
      21. Добавлена статистика лидера, изменена /lmenu
      22. Добавлена покупка аксессуаров в /donate
      23. Добавлена команда /obj
      24. Перераспределил команды для админов
      25. При наличии 1000 рублей или большой суммы виртов у игрока появляется кейс
      26. Исправлены баги со спавном банд
      27. Исправлены баги с падением под текстуры
      28. Исправлен баг с виртуальными мирами
      29. Добавлен NPC авто-инвайт на спавн
      30. Добавлен NPC проведения дуэлей
      31. Исправлена команда /banip
      32. Изменена и доделана система от сливов
      33. Возможность добавить своих ботов (+ уже встроены в мод)
      34. Доработана система мероприятий
      35. Переработана система доната (/donaterub and /donate)
      36. Обновлены плагины, почищена БД
      37. Новые артефакты
      38. Новый спавн
      39. Новая аренда
      40. Автоинвайт в мэрии
       
      UPD: Понизил ценник на мод
      Добавил angel_sinvays Добавлено 14.02.2022 Категория Моды Автор Angel Sinvays  
    • angel_sinvays
      От angel_sinvays
      Список доработок/изменений:

      1. Исправлены дыры с рублями, падением мода
      2. Новый античит(/ac)
      3. Аренда вертолетов (/gps - аренда транспорта - аренда вертолетов)
      4. Добавлена система /goadminka (раздача админки при определённом онлайне)
      5. Обновленны интерьеры банд, СМИ, ПД, выбор скина, домов, магазинов
      6. Изменён экстерьер парка у мэрии, на против больницы
      7. Изменен текстдрав Логотипа, выбор скина, спидометра, дм арены, капта
      8. Вместо мопедов сделаны пикапы аренды
      9. Добавлена система VIP (Бронза, Серебро, Золото и Верона)
      10. Изменена система семей
      11. Добавлен чат для випов (/vc)
      12. При попытки проследить за ботом, перекидывает за игрока
      13. Добавлено казино, в котром можно играть на донат и рубли
      14. Добавлена система дуэлей
      15. Добавлены команды: /security, /checkfull и /fonline
      16. Изменён бот для авто-инвайта
      17. Изменена система дм зон (отличается от дуэлей)
      18. Доработана система статистики администратора, добавлено время администрирования в /admins
      19. Добавлен премиум меню для Verona PREMIUM
      20. Добавлены карты для /tp - Мероприятия
      21. Добавлена статистика лидера, изменена /lmenu
      22. Добавлена покупка аксессуаров в /donate
      23. Добавлена команда /obj
      24. Перераспределил команды для админов
      25. При наличии 1000 рублей или большой суммы виртов у игрока появляется кейс
      26. Исправлены баги со спавном банд
      27. Исправлены баги с падением под текстуры
      28. Исправлен баг с виртуальными мирами
      29. Добавлен NPC авто-инвайт на спавн
      30. Добавлен NPC проведения дуэлей
      31. Исправлена команда /banip
      32. Изменена и доделана система от сливов
      33. Возможность добавить своих ботов (+ уже встроены в мод)
      34. Доработана система мероприятий
      35. Переработана система доната (/donaterub and /donate)
      36. Обновлены плагины, почищена БД
      37. Новые артефакты
      38. Новый спавн
      39. Новая аренда
      40. Автоинвайт в мэрии
       
      UPD: Понизил ценник на мод
    • angel_sinvays
      От angel_sinvays
      Attractive RP
      Скачать файл Давно не было сливов , сейчас я вам готов продемонстрировать копию проекта Attractive RolePlay
      Изначально слив был выложен на моём канале, но после я хочу выложить его сюда.
      Добавил angel_sinvays Добавлено 01.05.2024 Категория Моды Автор Angel Sinvays  
    • KAIF
      От KAIF
      !!!!!ВСЕГО ОДНА КОПИЯ!!!! 
      Единственный мод GTA RP.
       
      Фракции:
      Правительство
      ГИБДД
      Полиция Южного
      ФСБ
      ЦГБ-А
      Автошкола
      Китайская мафия
      Русская Мафия
      Итальянская Мафия
      Американская Мафия
      Чеченская Мафия
      ВВС
      МЧС
      ОПГ Тяп-Ляп
      ОПГ Хади-Такташ
      СМИ Южного
      ФСИН
      В комплекте идёт СБОРКА И МОД.
      Также после покупки вы отправляете мне свой айпи сервера и я привязываю вам сборку под ваш айпи (единоразово) 
      Единственный мод GTA RP.
    • Demon7
      От Demon7
      Как исправить эту ошибку? Попытался залить на мод данный код и при компиляции происходит данная ошибка. Эта ошибка находится на строчке if(GetPlayerData(targetid, "friend_request") == playerid)
      CMD:frien(playerid, params[]) {     new targetid = strval(params);     if(!IsPlayerConnected(targetid))     {         SendClientMessage(playerid, COLOR_RED, "Целевой игрок не подключен к серверу.");         return 0;     }     if(targetid == playerid)     {         SendClientMessage(playerid, COLOR_RED, "Вы не можете предложить себе подружиться.");         return 0;     }     if(IsPlayerInRangeOfPlayer(playerid, targetid, 2.0))     {         if(GetPlayerData(targetid, "friend_request") == playerid)         {             SendClientMessage(playerid, COLOR_RED, "У вас уже есть ожидающий запрос на дружбу от этого игрока.");             return 0;         }         SendClientMessage(playerid, COLOR_YELLOW, "Вы предложили игроку подружиться. Ожидайте ответа...");         SendClientMessage(targetid, COLOR_YELLOW, "Игрок предлагает вам подружиться. Используйте /accept или /reject.");         SetPlayerData(playerid, "friend_request", targetid);         SetPlayerData(targetid, "friend_request", playerid);     }     else     {         SendClientMessage(playerid, COLOR_RED, "Игрок находится слишком далеко.");     }     return 1; }