• 0

[закрыто] Ошибка при регистрации на сервере SAMP

Question

INewBRO
Новичок
Спойлер

#include <a_samp>

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

#define     MYSQL_HOST "localhost"
#define     MYSQL_USER "root"
#define     MYSQL_PASS ""
#define     MYSQL_BASE "AdeonRP"

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

#define COLOR_WHITE 0xFFFFFFFF
#define COLOR_RED   0xFF0000FF

main()
{
    print("\n----------------------------------");
    print("-----Modificated server is succes!-----");
    print("----------------------------------\n");
}

new MySQL:dbHandle;

enum player
{
    ID,
    NAME[MAX_PLAYER_NAME],
    PASSWORD[32],
    EMAIL[64],
    REF,
}
new player_info[MAX_PLAYERS][player];

enum dialogs
{
    DLG_NONE,
    DLG_REG,
    DLG_REGEMAIL,
    DLG_LOG,
    DLG_REGREF,
}

public OnGameModeInit()
{
    ConnectMySQL();
    SetGameModeText("Adeon-rp Russian");
    AddPlayerClass(0, 1958.3783, 1343.1572, 15.3746, 269.1425, 0, 0, 0, 0, 0, 0);
    return 1;
}

stock ConnectMySQL()
{
    dbHandle = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_BASE);
    switch(mysql_errno())
    {
        case 0: print("Подключение к MySQL успешно!");
        default: print("MySQL не подключен!");
    }
    mysql_log(ERROR | WARNING);
    mysql_set_charset("cp1251");
}

public OnGameModeExit()
{
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{

}

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid, player_info[playerid][NAME], MAX_PLAYER_NAME);
    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) ShowLogin(playerid);
    else ShowRegistration(playerid);
}

stock ShowLogin(playerid)
{
    SCM(playerid, COLOR_WHITE, "Игрок зарегистрирован");
}

stock ShowRegistration(playerid)
{
    new dialog[398+(-2+MAX_PLAYER_NAME)];
    format(dialog, sizeof(dialog),
        "{FFFFFF}Уважаемый {ffb73b}%s{FFFFFF}, вас приветствует сервер {ffb73b}Adeon RolePlay!{FFFFFF}\n\
        Аккаунт с этим ником не зарегистрирован на нашем сервере\n\
        Для игры на сервере вы должны пройти регистрацию\n\n\
        Придумайте пароль для вашего будущего аккаунта и нажмите \"Далее\"\n\
        {699bff}-Пароль должен быть от 8-ми до 32-ух символов\n\
        -Пароль должен состоять только из цифр и латинских символов любого регистра",
    player_info[playerid][NAME]
    );
    SPD(playerid, DLG_REG, DIALOG_STYLE_INPUT, "{699bff}Регистрация{FFFFFF} • Ввод пароля", dialog, "Далее", "Выход");
}

public OnPlayerDisconnect(playerid, reason)
{
    return 1;
}

public OnPlayerSpawn(playerid)
{
    return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
    return 1;
}

public OnVehicleSpawn(vehicleid)
{
    return 1;
}

public OnVehicleDeath(vehicleid, killerid)
{
    return 1;
}

public OnPlayerText(playerid, text[])
{
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    return 0;
}

public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
{
    return 1;
}

public OnPlayerExitVehicle(playerid, vehicleid)
{
    return 1;
}

public OnPlayerStateChange(playerid, newstate, oldstate)
{
    return 1;
}

public OnPlayerEnterCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveCheckpoint(playerid)
{
    return 1;
}

public OnPlayerEnterRaceCheckpoint(playerid)
{
    return 1;
}

public OnPlayerLeaveRaceCheckpoint(playerid)
{
    return 1;
}

public OnRconCommand(cmd[])
{
    return 1;
}

public OnPlayerRequestSpawn(playerid)
{
    return 1;
}

public OnObjectMoved(objectid)
{
    return 1;
}

public OnPlayerObjectMoved(playerid, objectid)
{
    return 1;
}

public OnPlayerPickUpPickup(playerid, pickupid)
{
    return 1;
}

public OnVehicleMod(playerid, vehicleid, componentid)
{
    return 1;
}

public OnVehiclePaintjob(playerid, vehicleid, paintjobid)
{
    return 1;
}

public OnVehicleRespray(playerid, vehicleid, color1, color2)
{
    return 1;
}

public OnPlayerSelectedMenuRow(playerid, row)
{
    return 1;
}

public OnPlayerExitedMenu(playerid)
{
    return 1;
}

public OnPlayerInteriorChange(playerid, newinteriorid, oldinteriorid)
{
    return 1;
}

public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
    return 1;
}

public OnRconLoginAttempt(ip[], password[], success)
{
    return 1;
}

public OnPlayerUpdate(playerid)
{
    return 1;
}

public OnPlayerStreamIn(playerid, forplayerid)
{
    return 1;
}

public OnPlayerStreamOut(playerid, forplayerid)
{
    return 1;
}

public OnVehicleStreamIn(vehicleid, forplayerid)
{
    return 1;
}

public OnVehicleStreamOut(vehicleid, forplayerid)
{
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case DLG_REG:
        {
            if(response)
            {
                if(!strlen(inputtext))
                {
                    ShowRegistration();
                    return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Введите пароль в поле ниже и нажмите \"Далее\"");
                }
                if(strlen(inputtext) < 8 || strlen(inputtext) > 32)
                {
                    ShowRegistration();
                    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, "{699bff}Регистрация{FFFFFF} • Ввод Email",
                    "{FFFFFF}Введите ваш настоящий Email адрес\n\
                    Если вы потеряете доступ к аккаунту, то вы сможете восстановить его через Email\n\
                    Введите его в поле ниже и нажмите \"Далее\"",
                    "Далее", "");
                }
                else
                {
                    ShowRegistration();
                    return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Пароль может состоять только из чисел и латинских символов любого регистра");
                }
                regex_delete(rg_passwordcheck);
            }
            else
            {
                SCM(playerid, COLOR_RED, "Используйте \"/q\", чтобы покинуть сервер");
                SPD(playerid, -1, 0, " ", " ", " ", "");
                return Kick(playerid);
            }
        }
        case DLG_REGEMAIL:
        {
            if(!strlen(inputtext))
            {
                SPD(playerid, DLG_REGEMAIL, DIALOG_STYLE_INPUT, "{699bff}Регистрация{FFFFFF} • Ввод Email",
                    "{FFFFFF}Введите ваш настоящий Email адрес\n\
                    Если вы потеряете доступ к аккаунту, то вы сможете восстановить его через Email\n\
                    Введите его в поле ниже и нажмите \"Далее\"",
                    "Далее", "");
                    return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Введите ваш Email в поле ниже и нажмите \"Далее\"");
            }
            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))
            {
                strmid(player_info[playerid][EMAIL], inputtext, 0, strlen(inputtext), 64);
                SPD(playerid, DLG_REGREF, DIALOG_STYLE_INPUT, "{699bff}Регистрация {FFFFFF} • Ввод пригласившего",
                    "{FFFFFF}Если ты зашёл на сервер по приглашению, то\n\
                    можешь указать ник пригласившего в поле ниже:",
                "Далее", "Пропустить");
            }
            else
            {
                SPD(playerid, DLG_REGEMAIL, DIALOG_STYLE_INPUT, "{699bff}Регистрация{FFFFFF} • Ввод Email",
                    "{FFFFFF}Введите ваш настоящий Email адрес\n\
                    Если вы потеряете доступ к аккаунту, то вы сможете восстановить его через Email\n\
                    Введите его в поле ниже и нажмите \"Далее\"",
                "Далее", "");
                return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Укажите ваш Email адрес правильно");
            }
            regex_delete(rg_emailcheck);
        }
        case DLG_REGREF:
        {
            if(response) // далее
            {
                new regex:rg_refcheck = regex_new("^[a-zA-Z]{4,24}$");
                if(regex_check(inputtext, rg_refcheck))
                {
                    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", "i", playerid, inputtext);
                }
                regex_delete(rg_refcheck);
            }
            else // пропустить
            {
                SPD(playerid, DLG_REGREF, DIALOG_STYLE_INPUT,"{699bff}Регистрация {FFFFFF} • Ввод пригласившего",
                    "{FFFFFF}Если ты зашёл на сервер по приглашению, то\n\
                    можешь указать ник пригласившего в поле ниже:",
                "Далее", "Пропустить");
                return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Введите ник игрока пригласившего вас на Adeon RP корректно!");
            }
        }
    }
    return 1;
}

forward CheckReferal(playerid, referal[]);
public CheckReferal(playerid, referal[])
{
    new rows;
    cache_get_row_count(rows);
    if(rows)
    {
        new refid;
        cache_get_value_name_int(0, "id", refid);
        player_info[playerid][REF] = refid;
        SCM(playerid, COLOR_WHITE, "Тест");
    }
    else
    {
        SPD(playerid, DLG_REGREF, DIALOG_STYLE_INPUT,"{699bff}Регистрация {FFFFFF} • Ввод пригласившего",
        "{FFFFFF}Если ты зашёл на сервер по приглашению, то\n\
        можешь указать ник пригласившего в поле ниже:",
    "Далее", "Пропустить");
        return SCM(playerid, COLOR_RED, "[Ошибка] {FFFFFF}Аккаунта с таким ником не существует!");
    }
return 1;
}

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

 

Писал сервер по гайду Leon'a, всё нормально скомпилировалось, ошибки к подключению MySQL не было, и тут... Сервер закрывает соединение при регистрации или при показе ошибки. И это не записывается в MySQL. Тем временем в консоли сервера пишет: 

[connection] incoming connection: 127.0.0.1:64677 id: 0
[join] Test_Test has joined the server (0:127.0.0.1)

(всё что дальше после попытки регистрации или показа ошибки)
[debug] Run time error 6: "Invalid instruction"
[debug]  Unknown opcode 0x0 at address 0x00000001
[debug] AMX backtrace:
[debug] #0 00000001 in public OnDialogResponse () at <unknown file>:0
[part] Test_Test has left the server (0:2)

Edited by Cawfee

Share this post


Link to post
Share on other sites

1 answer to this question

  • 0
user408337
Свой человек

@INewBRO В некоторых участках кода ты не указываешь аргументы к функции ShowRegistration();

Должно быть ShowRegistration(playerid);
Исправь недочеты и попробуй зарегистрироваться заново.

Попробуй перекомпилировать мод с ключом "-d3", компилятор должен указать на недочёты

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • gooding
      By gooding
      Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
      Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
       
       

    • gooding
      By gooding


      Скачать файл PAR RP | Уникальный мод без багов
      Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
      Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
       
       

      Добавил gooding Добавлено 20.11.2024 Категория Моды Автор GOODING (Я)  
    • Kalinin
      By Kalinin
      1. Набираю команду для создания CRMP сервера.
      2. Вакансии  которые свободны. Связь через TG @kalinin_sql
      Нам нужны;
      1.Кодеры
      2.Маперы
      3.СММ
      Так-же дружная работа. По поводу зарплаты будем обговаривать все лично в беседе ТГ
       
    • whccompany
      By whccompany
      Rostov Role Play | Rostov RP | CRMP Mobile Project объявляет набор людей в свою команду: Нам требуются:
       
      1. Маппера:
      Сдельная оплата труда от 250 до 3000 рублей/ за 1 работу
       
      2. Специалист по Text Draw:
      Сдельная оплата труда от 400 до 3500 рублей/ за одну работу
       
      3. Pawn разработчик:
      Заработная плата от 10 000 рублей/месяц
       
      4. Программист для создания лаунчера и сайта UCP с автодонатом:
      Заработная плата от 10 000 рублей/месяц
       
      Контакты для связи:
       
      ВКонтакте
       
      Telegram
       
    • Владислав2
      By Владислав2
      Здравствуйте, при компиляции появляется ошибка,

      Ошибка:
      error 017: undefined symbol "REP_KUZIA_TD"

      Строки:
       
          REP_KUZIA_TD[0] = TextDrawCreate(7.499990, 314.444396, "REP: 1");
          TextDrawLetterSize(REP_KUZIA_TD[0], 0.400000, 1.600000);
          TextDrawAlignment(REP_KUZIA_TD[0], 1);
          TextDrawColor(REP_KUZIA_TD[0], -1);
          TextDrawSetShadow(REP_KUZIA_TD[0], 0);
          TextDrawSetOutline(REP_KUZIA_TD[0], 1);
          TextDrawBackgroundColor(REP_KUZIA_TD[0], 255);
          TextDrawFont(REP_KUZIA_TD[0], 1);
          TextDrawSetProportional(REP_KUZIA_TD[0], 1);
          TextDrawSetShadow(REP_KUZIA_TD[0], 0);
          REP_KUZIA_TD[1] = TextDrawCreate(6.249957, 330.518493, "ASK: 0");
          TextDrawLetterSize(REP_KUZIA_TD[1], 0.400000, 1.600000);
          TextDrawAlignment(REP_KUZIA_TD[1], 1);
          TextDrawColor(REP_KUZIA_TD[1], -1);
          TextDrawSetShadow(REP_KUZIA_TD[1], 0);
          TextDrawSetOutline(REP_KUZIA_TD[1], 1);
          TextDrawBackgroundColor(REP_KUZIA_TD[1], 255);
          TextDrawFont(REP_KUZIA_TD[1], 1);
          TextDrawSetProportional(REP_KUZIA_TD[1], 1);
          TextDrawSetShadow(REP_KUZIA_TD[1], 0);
          return 1;
      }

      Буду рад если кто-то поможет