Вопросы

Написал свой первый код и в нём 16 ошибок таких как:

Спойлер

C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(18) : error 017: undefined symbol "mysql_thread_init"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(19) : warning 213: tag mismatch: expected tag "MYSQL", but found "MySQL"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(21) : warning 213: tag mismatch: expected tag "MySQL", but found "MYSQL"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(27) : error 017: undefined symbol "mysql_real_query"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(38) : error 017: undefined symbol "DIALOG_REGISTER_OR_LOGIN"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(57) : error 017: undefined symbol "COLOR_RED"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(75) : error 017: undefined symbol "DIALOG_REGISTER_OR_LOGIN"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(80) : error 017: undefined symbol "DIALOG_REGISTER"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(85) : error 017: undefined symbol "DIALOG_LOGIN"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(89) : error 017: undefined symbol "DIALOG_REGISTER"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(103) : warning 213: tag mismatch: expected tag "MySQL", but found "MYSQL"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(110) : error 017: undefined symbol "DisconnectPlayer"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(114) : error 017: undefined symbol "DIALOG_LOGIN"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(119) : warning 202: number of arguments does not match definition
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(121) : warning 213: tag mismatch: expected tag "MySQL", but found "MYSQL"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(125) : error 017: undefined symbol "DisconnectPlayer"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(132) : warning 235: public function lacks forward declaration (symbol "OnPlayerLogin")
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(135) : error 028: invalid subscript (not an array or too many subscripts): "extra"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(141) : error 028: invalid subscript (not an array or too many subscripts): "result"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(141) : error 029: invalid expression, assumed zero
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(141) : warning 215: expression has no effect
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(141) : error 001: expected token: ";", but found "]"
C:\Users\tolas\OneDrive\Ðàáî÷èé ñòîë\Âàæíîå\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(141) : fatal error 107: too many error messages on one line

 

собственно мой код:

Спойлер

#include <a_samp>
#include <dc_cmd>
#include <sscanf2>
#include <a_mysql>

#define HOST "localhost"
#define USER "root"
#define PASSWORD ""
#define DATABASE "mydb"

new
    PlayerInfo[MAX_PLAYERS][2], // Информация о поле и скине игрока
    PlayerLoggedIn[MAX_PLAYERS], // Флаг входа игрока в игру
    MYSQL:dbHandle;

public OnGameModeInit()
{
    mysql_thread_init();
    dbHandle = mysql_connect(HOST, USER, PASSWORD, DATABASE);

    if (dbHandle == MYSQL_INVALID_HANDLE)
    {
        print("Ошибка: Не удалось подключиться к базе данных MySQL.");
        return 0;
    }

    mysql_real_query(dbHandle, "CREATE TABLE IF NOT EXISTS players (ID INT AUTO_INCREMENT PRIMARY KEY, Name TEXT, Password TEXT, Gender INT, Skin INT, Money INT)"true);

    return 1;
}

public OnPlayerConnect(playerid)
{
    PlayerInfo[playerid][0] = 0// Индекс скина
    PlayerInfo[playerid][1] = 0// Пол (0 - мужской, 1 - женский)

    // Создание диалоговой формы выбора регистрации или авторизации
    ShowPlayerDialog(playerid, DIALOG_REGISTER_OR_LOGIN, DIALOG_STYLE_MSGBOX, "Добро пожаловать""Выберите опцию:""Регистрация""Вход");
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    if (PlayerLoggedIn[playerid])
    {
        PlayerLoggedIn[playerid] = 0;
        // Сохранение информации в базу данных MySQL при выходе игрока
        SavePlayerData(playerid);
    }
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    if(!PlayerLoggedIn[playerid])
    {
        SendClientMessage(playerid, COLOR_RED, "Вы должны авторизоваться перед выбором класса.");
        return 0;
    }
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!PlayerLoggedIn[playerid])
    {
        SendClientMessage(playerid, 0xFF0000FF"Вы должны авторизоваться, чтобы использовать команды.");
        return 0;
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if (dialogid == DIALOG_REGISTER_OR_LOGIN)
    {
        if (response == 1// Регистрация
        {
            // Создание диалоговой формы регистрации
            ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Регистрация""Введите пароль для регистрации:""OK""Отмена");
        }
        else if (response == 2// Вход
        {
            // Создание диалоговой формы авторизации
            ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Авторизация""Введите пароль:""OK""Отмена");
        }
        return 1;
    }
    else if (dialogid == DIALOG_REGISTER)
    {
        if (response)
        {
            new
                playerName[MAX_PLAYER_NAME],
                password[MAX_PLAYER_NAME];

            GetPlayerName(playerid, playerName, sizeof(playerName));
            sscanf(inputtext, "s[24]s[24]", playerName, password);

            new query[256];
            format(query, sizeof(query), "INSERT INTO players (Name, Password, Gender, Skin, Money) VALUES ('%s', '%s', %d, %d, %d)", playerName, password, PlayerInfo[playerid][1], PlayerInfo[playerid][0], 0);

            mysql_tquery(dbHandle, query, """");

            SendClientMessage(playerid, 0x00AA00FF"Вы успешно зарегистрировались!");
            SendClientMessage(playerid, 0x00AA00FF"Теперь введите пароль для авторизации.");
        }
        else
        {
            DisconnectPlayer(playerid);
        }
        return 1;
    }
    else if (dialogid == DIALOG_LOGIN)
    {
        if (response)
        {
            new query[256];
            format(query, sizeof(query), "SELECT Gender, Skin, Money FROM players WHERE Name = '%s' AND Password = '%s'", GetPlayerName(playerid), inputtext);

            mysql_tquery(dbHandle, query, "OnPlayerLogin""iissi", playerid, inputtext);
        }
        else
        {
            DisconnectPlayer(playerid);
        }
        return 1;
    }
    return 0;
}

public OnPlayerLogin(result, rows, fields, extra)
{
    new
        playerid = extra[1],
        password[MAX_PLAYER_NAME];

    if (rows)
    {
        GetPlayerName(playerid, password, sizeof(password));
        PlayerInfo[playerid][1] = result[2][0]; // Пол
        PlayerInfo[playerid][0] = result[2][1]; // Скин

        PlayerLoggedIn[playerid] = 1;

        SetPlayerSkin(playerid, PlayerInfo[playerid][0]);

        SendClientMessage(playerid, 0x00AA00FF"Вы успешно авторизовались!");
    }
    else
    {
        SendClientMessage(playerid, 0xFF0000FF"Ошибка: неверный пароль!");
        DisconnectPlayer(playerid);
    }
    return 1;
}

public SavePlayerData(playerid)
{
    if (!PlayerLoggedIn[playerid]) return 0;

    new
        query[256],
        pname[MAX_PLAYER_NAME];

    GetPlayerName(playerid, pname, sizeof(pname));
    format(query, sizeof(query), "UPDATE players SET Gender = %d, Skin = %d WHERE Name = '%s'", PlayerInfo[playerid][1], PlayerInfo[playerid][0], pname);

    mysql_tquery(dbHandle, query, """");
    return 1;
}

public OnPlayerSpawn(playerid)
{
    if (!PlayerLoggedIn[playerid]) return 0;

    // Установить пол игрока
    if (PlayerInfo[playerid][1] == 1// Женский пол
    {
        SetPlayerInterior(playerid, 5);
    }
    else // Мужской пол
    {
        SetPlayerInterior(playerid, 0);
    }

    return 1;
}

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

 

 

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

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

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

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

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


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

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

  • 0

@tivan666ban 
То, что вы скинули - код не плагина, а инклуда, держу в курсе.
Раз уж вы его нашли и скинули, почему сами в него не заглянули?
В этом инклуде нет таких функций как вы используете, а именно:
mysql_thread_end

mysql_real_query

mysql_thread_init

//

Как по мне работа с thread не нужна, а mysql_real_query - обычный sql-запрос, почему бы его не сделать как все остальные (раз уж функции такой нет), а именно через mysql_tquery или т.п.
Что касается ошибки на 212-й строке - я забыл поставить точку с запятой
Код под вашу MySQL-версию:
 

Спойлер

#include <a_samp>
#include <dc_cmd>
#include <sscanf2>
#include <a_mysql>

#define HOST "localhost"
#define USER "root"
#define PASSWORD ""
#define DATABASE "mydb"

#define COLOR_RED 0xFF0000FF

enum e_DIALOG_ID {
    DIALOG_REGISTER_OR_LOGIN,
    DIALOG_REGISTER,
    DIALOG_LOGIN
}

new
    PlayerInfo[MAX_PLAYERS][2], // Информация о поле и скине игрока
    PlayerLoggedIn[MAX_PLAYERS], // Флаг входа игрока в игру
    MySQL:dbHandle;

public OnGameModeInit()
{
    dbHandle = mysql_connect(HOST, USER, PASSWORD, DATABASE);

    if (dbHandle == MYSQL_INVALID_HANDLE)
    {
        print("Ошибка: Не удалось подключиться к базе данных MySQL.");
        return 0;
    }

    mysql_tquery(dbHandle, "CREATE TABLE IF NOT EXISTS players (ID INT AUTO_INCREMENT PRIMARY KEY, Name TEXT, Password TEXT, Gender INT, Skin INT, Money INT)""","");

    return 1;
}

public OnPlayerConnect(playerid)
{
    PlayerInfo[playerid][0] = 0// Индекс скина
    PlayerInfo[playerid][1] = 0// Пол (0 - мужской, 1 - женский)

    // Создание диалоговой формы выбора регистрации или авторизации
    ShowPlayerDialog(playerid, DIALOG_REGISTER_OR_LOGIN, DIALOG_STYLE_MSGBOX, "Добро пожаловать""Выберите опцию:""Регистрация""Вход");
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    if (PlayerLoggedIn[playerid])
    {
        PlayerLoggedIn[playerid] = 0;
        // Сохранение информации в базу данных MySQL при выходе игрока
        SavePlayerData(playerid);
    }
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    if(!PlayerLoggedIn[playerid])
    {
        SendClientMessage(playerid, COLOR_RED, "Вы должны авторизоваться перед выбором класса.");
        return 0;
    }
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!PlayerLoggedIn[playerid])
    {
        SendClientMessage(playerid, 0xFF0000FF"Вы должны авторизоваться, чтобы использовать команды.");
        return 0;
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid) {
        case DIALOG_REGISTER_OR_LOGIN:
        {
            if (response == 1// Регистрация
            {
                // Создание диалоговой формы регистрации
                ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Регистрация""Введите пароль для регистрации:""OK""Отмена");
            }
            else if (response == 2// Вход
            {
                // Создание диалоговой формы авторизации
                ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Авторизация""Введите пароль:""OK""Отмена");
            }
            return 1;
        }
        case DIALOG_REGISTER:
        {
            if (response)
            {
                new
                    playerName[MAX_PLAYER_NAME],
                    password[MAX_PLAYER_NAME];

                GetPlayerName(playerid, playerNamesizeof(playerName));
                sscanf(inputtext, "s[24]s[24]", playerName, password);

                new query[256];
                format(query, sizeof(query), "INSERT INTO players (Name, Password, Gender, Skin, Money) VALUES ('%s', '%s', %d, %d, %d)", playerName, password, PlayerInfo[playerid][1], PlayerInfo[playerid][0], 0);

                mysql_tquery(dbHandle, query, """");

                SendClientMessage(playerid, 0x00AA00FF"Вы успешно зарегистрировались!");
                SendClientMessage(playerid, 0x00AA00FF"Теперь введите пароль для авторизации.");
            }
            else
            {
                Kick(playerid);
            }
            return 1;
        }
        case DIALOG_LOGIN:
        {
            if (response)
            {
                new query[256];
                format(query, sizeof(query), "SELECT Gender, Skin, Money FROM players WHERE Name = '%s' AND Password = '%s' LIMIT 1", GN(playerid), inputtext);
                mysql_tquery(dbHandle, query, "OnPlayerLogin""is[64]", playerid, inputtext);
            }
            else
            {
                Kick(playerid);
            }
            return 1;
        }
    }
    return 0;
}
forward OnPlayerLogin(playerid, pass[]);
public OnPlayerLogin(playerid, pass[])
{
    new
        password[MAX_PLAYER_NAME],
        rows;
    cache_get_row_count(rows);
    new sex, skin;
    cache_get_value_index_int(00, sex);
    cache_get_value_index_int(01, skin);
    if (rows)
    {
        GetPlayerName(playerid, password, sizeof(password));
        PlayerInfo[playerid][1] = sex; // Пол
        PlayerInfo[playerid][0] = skin; // Скин

        PlayerLoggedIn[playerid] = 1;

        SetPlayerSkin(playerid, PlayerInfo[playerid][0]);

        SendClientMessage(playerid, 0x00AA00FF"Вы успешно авторизовались!");
    }
    else
    {
        SendClientMessage(playerid, 0xFF0000FF"Ошибка: неверный пароль!");
        Kick(playerid);
    }
    return 1;
}
forward SavePlayerData(playerid);
public SavePlayerData(playerid)
{
    if (!PlayerLoggedIn[playerid]) return 0;

    new
        query[256],
        pname[MAX_PLAYER_NAME];

    GetPlayerName(playerid, pname, sizeof(pname));
    format(query, sizeof(query), "UPDATE players SET Gender = %d, Skin = %d WHERE Name = '%s'", PlayerInfo[playerid][1], PlayerInfo[playerid][0], pname);

    mysql_tquery(dbHandle, query, """");
    return 1;
}

public OnPlayerSpawn(playerid)
{
    if (!PlayerLoggedIn[playerid]) return 0;

    // Установить пол игрока
    if (PlayerInfo[playerid][1] == 1// Женский пол
    {
        SetPlayerInterior(playerid, 5);
    }
    else // Мужской пол
    {
        SetPlayerInterior(playerid, 0);
    }

    return 1;
}

public OnGameModeExit()
{
    mysql_close(dbHandle);
    return 1;
}
stock GN(playerid){
    new NN[MAX_PLAYER_NAME];
    GetPlayerName(playerid, NN, MAX_PLAYER_NAME);
    return NN;
}

 

Впредь перед тем как писать функции непонятно из какого источника взятые, удосужьтесь лишний раз взглянуть есть ли они в используемой вами библиотеке

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


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

Ваши ошибки:

Спойлер

MYSQL:dbHandle -> MySQL:dbHandle
Добавить enum dialog{...} для скапливания диалогов
Добавить #define COLOR_RED 0xFF0000FF
DisconnectPlayer(ID) - > Kick(ID)

 

Объясните мне этот код:
mysql_tquery(dbHandle, query, "OnPlayerLogin", "iissi", playerid, inputtext);
Вы хотите передать в public 5 параметров (iissi), мало того, что размер для строк не указан,
так ещё и передаёте 2 параметра, а в самом public принимаете так вообще 4

Для public OnPlayerLogin не был создан forward

 

В конец MySQL-запросов по поиску аккаунтов для оптимизации лучше добавлять LIMIT 1

Всё остальное из-за отсутствия нудной библиотеки MySQL для функций:
mysql_thread_init()
mysql_real_query()

Поправленный (не заверяю, что рабочий) мною код:

Спойлер

#include <a_samp>
#include <dc_cmd>
#include <sscanf2>
#include <a_mysql>

#define HOST "localhost"
#define USER "root"
#define PASSWORD ""
#define DATABASE "mydb"

#define COLOR_RED 0xFF0000FF

enum dialog {
    DIALOG_REGISTER_OR_LOGIN,
    DIALOG_REGISTER,
    DIALOG_LOGIN
}

new
    PlayerInfo[MAX_PLAYERS][2], // Информация о поле и скине игрока
    PlayerLoggedIn[MAX_PLAYERS], // Флаг входа игрока в игру
    MySQL:dbHandle;

public OnGameModeInit()
{
    mysql_thread_init();
    dbHandle = mysql_connect(HOST, USER, PASSWORD, DATABASE);

    if (dbHandle == MYSQL_INVALID_HANDLE)
    {
        print("Ошибка: Не удалось подключиться к базе данных MySQL.");
        return 0;
    }

    mysql_real_query(dbHandle, "CREATE TABLE IF NOT EXISTS players (ID INT AUTO_INCREMENT PRIMARY KEY, Name TEXT, Password TEXT, Gender INT, Skin INT, Money INT)"true);

    return 1;
}

public OnPlayerConnect(playerid)
{
    PlayerInfo[playerid][0] = 0// Индекс скина
    PlayerInfo[playerid][1] = 0// Пол (0 - мужской, 1 - женский)

    // Создание диалоговой формы выбора регистрации или авторизации
    ShowPlayerDialog(playerid, DIALOG_REGISTER_OR_LOGIN, DIALOG_STYLE_MSGBOX, "Добро пожаловать""Выберите опцию:""Регистрация""Вход");
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    if (PlayerLoggedIn[playerid])
    {
        PlayerLoggedIn[playerid] = 0;
        // Сохранение информации в базу данных MySQL при выходе игрока
        SavePlayerData(playerid);
    }
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    if(!PlayerLoggedIn[playerid])
    {
        SendClientMessage(playerid, COLOR_RED, "Вы должны авторизоваться перед выбором класса.");
        return 0;
    }
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!PlayerLoggedIn[playerid])
    {
        SendClientMessage(playerid, 0xFF0000FF"Вы должны авторизоваться, чтобы использовать команды.");
        return 0;
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if (dialogid == DIALOG_REGISTER_OR_LOGIN)
    {
        if (response == 1// Регистрация
        {
            // Создание диалоговой формы регистрации
            ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Регистрация""Введите пароль для регистрации:""OK""Отмена");
        }
        else if (response == 2// Вход
        {
            // Создание диалоговой формы авторизации
            ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Авторизация""Введите пароль:""OK""Отмена");
        }
        return 1;
    }
    else if (dialogid == DIALOG_REGISTER)
    {
        if (response)
        {
            new
                playerName[MAX_PLAYER_NAME],
                password[MAX_PLAYER_NAME];

            GetPlayerName(playerid, playerName, sizeof(playerName));
            sscanf(inputtext, "s[24]s[24]", playerName, password);

            new query[256];
            format(query, sizeof(query), "INSERT INTO players (Name, Password, Gender, Skin, Money) VALUES ('%s', '%s', %d, %d, %d)", playerName, password, PlayerInfo[playerid][1], PlayerInfo[playerid][0], 0);

            mysql_tquery(dbHandle, query, """");

            SendClientMessage(playerid, 0x00AA00FF"Вы успешно зарегистрировались!");
            SendClientMessage(playerid, 0x00AA00FF"Теперь введите пароль для авторизации.");
        }
        else
        {
            Kick(playerid);
        }
        return 1;
    }
    else if (dialogid == DIALOG_LOGIN)
    {
        if (response)
        {
            new query[256];
            format(query, sizeof(query), "SELECT Gender, Skin, Money FROM players WHERE Name = '%s' AND Password = '%s' LIMIT 1", GetPlayerName(playerid), inputtext);

            mysql_tquery(dbHandle, query, "OnPlayerLogin""is[64]", playerid, inputtext);
        }
        else
        {
            Kick(playerid);
        }
        return 1;
    }
    return 0;
}
forward OnPlayerLogin(playerid, pass[]);
public OnPlayerLogin(playerid, pass[])
{
    new
        playerid = extra[1],
        password[MAX_PLAYER_NAME],
        rows;
    cache_get_row_count(rows);
    new sex, skin;
    cache_get_value_index_int(00, sex);
    cache_get_value_index_int(01, skin);
    if (rows)
    {
        GetPlayerName(playerid, password, sizeof(password));
        PlayerInfo[playerid][1] = sex; // Пол
        PlayerInfo[playerid][0] = skin; // Скин

        PlayerLoggedIn[playerid] = 1;

        SetPlayerSkin(playerid, PlayerInfo[playerid][0]);

        SendClientMessage(playerid, 0x00AA00FF"Вы успешно авторизовались!");
    }
    else
    {
        SendClientMessage(playerid, 0xFF0000FF"Ошибка: неверный пароль!");
        Kick(playerid);
    }
    return 1;
}

public SavePlayerData(playerid)
{
    if (!PlayerLoggedIn[playerid]) return 0;

    new
        query[256],
        pname[MAX_PLAYER_NAME];

    GetPlayerName(playerid, pname, sizeof(pname));
    format(query, sizeof(query), "UPDATE players SET Gender = %d, Skin = %d WHERE Name = '%s'", PlayerInfo[playerid][1], PlayerInfo[playerid][0], pname);

    mysql_tquery(dbHandle, query, """");
    return 1;
}

public OnPlayerSpawn(playerid)
{
    if (!PlayerLoggedIn[playerid]) return 0;

    // Установить пол игрока
    if (PlayerInfo[playerid][1] == 1// Женский пол
    {
        SetPlayerInterior(playerid, 5);
    }
    else // Мужской пол
    {
        SetPlayerInterior(playerid, 0);
    }

    return 1;
}

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

 

Если же код выше будет выдавать ошибки, после того как Вы решите проблему с Вашим MySQL, то пришлите мне ошибки и версию MySQL, которую Вы используете.

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


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

#include <a_samp>
#include <dc_cmd>
#include <sscanf2>
#include <a_mysql>

#define HOST "localhost"
#define USER "root"
#define PASSWORD ""
#define DATABASE "mydb"

#define COLOR_RED 0xFF0000FF

enum dialog {
    DIALOG_REGISTER_OR_LOGIN,
    DIALOG_REGISTER,
    DIALOG_LOGIN
}

new
    PlayerInfo[MAX_PLAYERS][2], // Информация о поле и скине игрока
    PlayerLoggedIn[MAX_PLAYERS], // Флаг входа игрока в игру
    MySQL:dbHandle;

public OnGameModeInit()
{
    mysql_thread_init();
    dbHandle = mysql_connect(HOST, USER, PASSWORD, DATABASE);

    if (dbHandle == MYSQL_INVALID_HANDLE)
    {
        print("Ошибка: Не удалось подключиться к базе данных MySQL.");
        return 0;
    }

    mysql_real_query(dbHandle, "CREATE TABLE IF NOT EXISTS players (ID INT AUTO_INCREMENT PRIMARY KEY, Name TEXT, Password TEXT, Gender INT, Skin INT, Money INT)"true);

    return 1;
}

public OnPlayerConnect(playerid)
{
    PlayerInfo[playerid][0] = 0// Индекс скина
    PlayerInfo[playerid][1] = 0// Пол (0 - мужской, 1 - женский)

    // Создание диалоговой формы выбора регистрации или авторизации
    ShowPlayerDialog(playerid, DIALOG_REGISTER_OR_LOGIN, DIALOG_STYLE_MSGBOX, "Добро пожаловать""Выберите опцию:""Регистрация""Вход");
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    if (PlayerLoggedIn[playerid])
    {
        PlayerLoggedIn[playerid] = 0;
        // Сохранение информации в базу данных MySQL при выходе игрока
        SavePlayerData(playerid);
    }
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    if(!PlayerLoggedIn[playerid])
    {
        SendClientMessage(playerid, COLOR_RED, "Вы должны авторизоваться перед выбором класса.");
        return 0;
    }
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!PlayerLoggedIn[playerid])
    {
        SendClientMessage(playerid, 0xFF0000FF"Вы должны авторизоваться, чтобы использовать команды.");
        return 0;
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    if (dialogid == DIALOG_REGISTER_OR_LOGIN)
    {
        if (response == 1// Регистрация
        {
            // Создание диалоговой формы регистрации
            ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Регистрация""Введите пароль для регистрации:""OK""Отмена");
        }
        else if (response == 2// Вход
        {
            // Создание диалоговой формы авторизации
            ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Авторизация""Введите пароль:""OK""Отмена");
        }
        return 1;
    }
    else if (dialogid == DIALOG_REGISTER)
    {
        if (response)
        {
            new
                playerName[MAX_PLAYER_NAME],
                password[MAX_PLAYER_NAME];

            GetPlayerName(playerid, playerName, sizeof(playerName));
            sscanf(inputtext, "s[24]s[24]", playerName, password);

            new query[256];
            format(query, sizeof(query), "INSERT INTO players (Name, Password, Gender, Skin, Money) VALUES ('%s', '%s', %d, %d, %d)", playerName, password, PlayerInfo[playerid][1], PlayerInfo[playerid][0], 0);

            mysql_tquery(dbHandle, query, """");

            SendClientMessage(playerid, 0x00AA00FF"Вы успешно зарегистрировались!");
            SendClientMessage(playerid, 0x00AA00FF"Теперь введите пароль для авторизации.");
        }
        else
        {
            Kick(playerid);
        }
        return 1;
    }
    else if (dialogid == DIALOG_LOGIN)
    {
        if (response)
        {
            new query[256];
            format(query, sizeof(query), "SELECT Gender, Skin, Money FROM players WHERE Name = '%s' AND Password = '%s' LIMIT 1", GetPlayerName(playerid), inputtext);

            mysql_tquery(dbHandle, query, "OnPlayerLogin""is[64]", playerid, inputtext);
        }
        else
        {
            Kick(playerid);
        }
        return 1;
    }
    return 0;
}
forward OnPlayerLogin(playerid, pass[]);
public OnPlayerLogin(playerid, pass[])
{
    new
        playerid = extra[1],
        password[MAX_PLAYER_NAME],
        rows;
    cache_get_row_count(rows);
    new sex, skin;
    cache_get_value_index_int(00, sex);
    cache_get_value_index_int(01, skin);
    if (rows)
    {
        GetPlayerName(playerid, password, sizeof(password));
        PlayerInfo[playerid][1] = sex; // Пол
        PlayerInfo[playerid][0] = skin; // Скин

        PlayerLoggedIn[playerid] = 1;

        SetPlayerSkin(playerid, PlayerInfo[playerid][0]);

        SendClientMessage(playerid, 0x00AA00FF"Вы успешно авторизовались!");
    }
    else
    {
        SendClientMessage(playerid, 0xFF0000FF"Ошибка: неверный пароль!");
        Kick(playerid);
    }
    return 1;
}

public SavePlayerData(playerid)
{
    if (!PlayerLoggedIn[playerid]) return 0;

    new
        query[256],
        pname[MAX_PLAYER_NAME];

    GetPlayerName(playerid, pname, sizeof(pname));
    format(query, sizeof(query), "UPDATE players SET Gender = %d, Skin = %d WHERE Name = '%s'", PlayerInfo[playerid][1], PlayerInfo[playerid][0], pname);

    mysql_tquery(dbHandle, query, """");
    return 1;
}

public OnPlayerSpawn(playerid)
{
    if (!PlayerLoggedIn[playerid]) return 0;

    // Установить пол игрока
    if (PlayerInfo[playerid][1] == 1// Женский пол
    {
        SetPlayerInterior(playerid, 5);
    }
    else // Мужской пол
    {
        SetPlayerInterior(playerid, 0);
    }

    return 1;
}

public OnGameModeExit()
{
    mysql_close(dbHandle);
    mysql_thread_end();
    return 1;
}
Спойлер


C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(26) : error 017: undefined symbol "mysql_thread_init"
C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(35) : error 017: undefined symbol "mysql_real_query"
C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(83) : warning 213: tag mismatch: expected tag "dialog", but found none ("_")
C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(97) : warning 213: tag mismatch: expected tag "dialog", but found none ("_")
C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(122) : warning 213: tag mismatch: expected tag "dialog", but found none ("_")
C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(127) : warning 202: number of arguments does not match definition
C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(143) : warning 219: local variable "playerid" shadows a variable at a preceding level
C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(143) : error 017: undefined symbol "extra"
C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(170) : warning 235public function lacks forward declaration (symbol "SavePlayerData")
C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(205) : error 017: undefined symbol "mysql_thread_end"
Pawn compiler 3.10.10           Copyright (c) 1997-2006, ITB CompuPhase


4 Errors.

 

 

 

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

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


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

в response лучше свич как и в пикапах он быстрее чем подзалупный if

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

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


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

@tivan666ban 
Лог и примечания:
 

Спойлер

Я же вам сказал, что ошибки:
mysql_thread_init
mysql_real_query
mysql_thread_end
//
enum dialog -> enum e_DIALOG_ID
Перебор диалогов в OnDialogResponse сделать через case

Неправильное использование GetPlayerName(playerid)
Сделал доп. функцию GN()

Смысл в этой строке: playerid = extra[1] ?

Вы видоизменили код и повторили свою же прошлую ошибку
Не создали forward для public SavePlayerData(playerid)
Загляните хоть в этот раз на мои изменения и посмотрите, как это делается

Код:
 

Спойлер

#include <a_samp>
#include <dc_cmd>
#include <sscanf2>
#include <a_mysql>

#define HOST "localhost"
#define USER "root"
#define PASSWORD ""
#define DATABASE "mydb"

#define COLOR_RED 0xFF0000FF

enum e_DIALOG_ID {
    DIALOG_REGISTER_OR_LOGIN,
    DIALOG_REGISTER,
    DIALOG_LOGIN
}

new
    PlayerInfo[MAX_PLAYERS][2], // Информация о поле и скине игрока
    PlayerLoggedIn[MAX_PLAYERS], // Флаг входа игрока в игру
    MySQL:dbHandle;

public OnGameModeInit()
{
    mysql_thread_init();
    dbHandle = mysql_connect(HOST, USER, PASSWORD, DATABASE);

    if (dbHandle == MYSQL_INVALID_HANDLE)
    {
        print("Ошибка: Не удалось подключиться к базе данных MySQL.");
        return 0;
    }

    mysql_real_query(dbHandle, "CREATE TABLE IF NOT EXISTS players (ID INT AUTO_INCREMENT PRIMARY KEY, Name TEXT, Password TEXT, Gender INT, Skin INT, Money INT)", true);

    return 1;
}

public OnPlayerConnect(playerid)
{
    PlayerInfo[playerid][0] = 0; // Индекс скина
    PlayerInfo[playerid][1] = 0; // Пол (0 - мужской, 1 - женский)

    // Создание диалоговой формы выбора регистрации или авторизации
    ShowPlayerDialog(playerid, DIALOG_REGISTER_OR_LOGIN, DIALOG_STYLE_MSGBOX, "Добро пожаловать", "Выберите опцию:", "Регистрация", "Вход");
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    if (PlayerLoggedIn[playerid])
    {
        PlayerLoggedIn[playerid] = 0;
        // Сохранение информации в базу данных MySQL при выходе игрока
        SavePlayerData(playerid);
    }
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    if(!PlayerLoggedIn[playerid])
    {
        SendClientMessage(playerid, COLOR_RED, "Вы должны авторизоваться перед выбором класса.");
        return 0;
    }
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!PlayerLoggedIn[playerid])
    {
        SendClientMessage(playerid, 0xFF0000FF, "Вы должны авторизоваться, чтобы использовать команды.");
        return 0;
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid) {
        case DIALOG_REGISTER_OR_LOGIN:
        {
            if (response == 1) // Регистрация
            {
                // Создание диалоговой формы регистрации
                ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Регистрация", "Введите пароль для регистрации:", "OK", "Отмена");
            }
            else if (response == 2) // Вход
            {
                // Создание диалоговой формы авторизации
                ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Авторизация", "Введите пароль:", "OK", "Отмена");
            }
            return 1;
        }
        case DIALOG_REGISTER:
        {
            if (response)
            {
                new
                    playerName[MAX_PLAYER_NAME],
                    password[MAX_PLAYER_NAME];

                GetPlayerName(playerid, playerName, sizeof(playerName));
                sscanf(inputtext, "s[24]s[24]", playerName, password);

                new query[256];
                format(query, sizeof(query), "INSERT INTO players (Name, Password, Gender, Skin, Money) VALUES ('%s', '%s', %d, %d, %d)", playerName, password, PlayerInfo[playerid][1], PlayerInfo[playerid][0], 0);

                mysql_tquery(dbHandle, query, "", "");

                SendClientMessage(playerid, 0x00AA00FF, "Вы успешно зарегистрировались!");
                SendClientMessage(playerid, 0x00AA00FF, "Теперь введите пароль для авторизации.");
            }
            else
            {
                Kick(playerid);
            }
            return 1;
        }
        case DIALOG_LOGIN:
        {
            if (response)
            {
                new query[256];
                format(query, sizeof(query), "SELECT Gender, Skin, Money FROM players WHERE Name = '%s' AND Password = '%s' LIMIT 1", GN(playerid), inputtext);
                mysql_tquery(dbHandle, query, "OnPlayerLogin", "is[64]", playerid, inputtext);
            }
            else
            {
                Kick(playerid);
            }
            return 1;
        }
    }
    return 0;
}
forward OnPlayerLogin(playerid, pass[]);
public OnPlayerLogin(playerid, pass[])
{
    new
        password[MAX_PLAYER_NAME],
        rows;
    cache_get_row_count(rows);
    new sex, skin;
    cache_get_value_index_int(0, 0, sex);
    cache_get_value_index_int(0, 1, skin);
    if (rows)
    {
        GetPlayerName(playerid, password, sizeof(password));
        PlayerInfo[playerid][1] = sex; // Пол
        PlayerInfo[playerid][0] = skin; // Скин

        PlayerLoggedIn[playerid] = 1;

        SetPlayerSkin(playerid, PlayerInfo[playerid][0]);

        SendClientMessage(playerid, 0x00AA00FF, "Вы успешно авторизовались!");
    }
    else
    {
        SendClientMessage(playerid, 0xFF0000FF, "Ошибка: неверный пароль!");
        Kick(playerid);
    }
    return 1;
}
forward SavePlayerData(playerid);
public SavePlayerData(playerid)
{
    if (!PlayerLoggedIn[playerid]) return 0;

    new
        query[256],
        pname[MAX_PLAYER_NAME];

    GetPlayerName(playerid, pname, sizeof(pname));
    format(query, sizeof(query), "UPDATE players SET Gender = %d, Skin = %d WHERE Name = '%s'", PlayerInfo[playerid][1], PlayerInfo[playerid][0], pname);

    mysql_tquery(dbHandle, query, "", "");
    return 1;
}

public OnPlayerSpawn(playerid)
{
    if (!PlayerLoggedIn[playerid]) return 0;

    // Установить пол игрока
    if (PlayerInfo[playerid][1] == 1) // Женский пол
    {
        SetPlayerInterior(playerid, 5);
    }
    else // Мужской пол
    {
        SetPlayerInterior(playerid, 0);
    }

    return 1;
}

public OnGameModeExit()
{
    mysql_close(dbHandle);
    mysql_thread_end();
    return 1;
}
stock GN(playerid){
    new NN[MAX_PLAYER_NAME];
    GetPlayerName(playerid, NN, MAX_PLAYER_NAME);
    return NN
}

 

Так же я Вас просил попытаться сделать что-то с вашей MySQL версией ,как минимум сообщит мне её.

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


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

C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(26) : error 017: undefined symbol "mysql_thread_init"
C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(35) : error 017: undefined symbol "mysql_real_query"
C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(205) : error 017: undefined symbol "mysql_thread_end"
C:\Users\tolas\OneDrive\Рабочий стол\Важное\SA-MP clear server 0.3.7 new 2023\gamemodes\Untitled.pwn(212) : error 001: expected token: ";", but found "}"
Pawn compiler 3.10.10           Copyright (c) 1997-2006, ITB CompuPhase


4 Errors.

 

Спойлер

#include <a_samp>
#include <dc_cmd>
#include <sscanf2>
#include <a_mysql>

#define HOST "localhost"
#define USER "root"
#define PASSWORD ""
#define DATABASE "mydb"

#define COLOR_RED 0xFF0000FF

enum e_DIALOG_ID {
    DIALOG_REGISTER_OR_LOGIN,
    DIALOG_REGISTER,
    DIALOG_LOGIN
}

new
    PlayerInfo[MAX_PLAYERS][2], // Информация о поле и скине игрока
    PlayerLoggedIn[MAX_PLAYERS], // Флаг входа игрока в игру
    MySQL:dbHandle;

public OnGameModeInit()
{
    mysql_thread_init();
    dbHandle = mysql_connect(HOST, USER, PASSWORD, DATABASE);

    if (dbHandle == MYSQL_INVALID_HANDLE)
    {
        print("Ошибка: Не удалось подключиться к базе данных MySQL.");
        return 0;
    }

    mysql_real_query(dbHandle, "CREATE TABLE IF NOT EXISTS players (ID INT AUTO_INCREMENT PRIMARY KEY, Name TEXT, Password TEXT, Gender INT, Skin INT, Money INT)"true);

    return 1;
}

public OnPlayerConnect(playerid)
{
    PlayerInfo[playerid][0] = 0// Индекс скина
    PlayerInfo[playerid][1] = 0// Пол (0 - мужской, 1 - женский)

    // Создание диалоговой формы выбора регистрации или авторизации
    ShowPlayerDialog(playerid, DIALOG_REGISTER_OR_LOGIN, DIALOG_STYLE_MSGBOX, "Добро пожаловать""Выберите опцию:""Регистрация""Вход");
    return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
    if (PlayerLoggedIn[playerid])
    {
        PlayerLoggedIn[playerid] = 0;
        // Сохранение информации в базу данных MySQL при выходе игрока
        SavePlayerData(playerid);
    }
    return 1;
}

public OnPlayerRequestClass(playerid, classid)
{
    if(!PlayerLoggedIn[playerid])
    {
        SendClientMessage(playerid, COLOR_RED, "Вы должны авторизоваться перед выбором класса.");
        return 0;
    }
    return 1;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if (!PlayerLoggedIn[playerid])
    {
        SendClientMessage(playerid, 0xFF0000FF"Вы должны авторизоваться, чтобы использовать команды.");
        return 0;
    }
    return 1;
}

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid) {
        case DIALOG_REGISTER_OR_LOGIN:
        {
            if (response == 1// Регистрация
            {
                // Создание диалоговой формы регистрации
                ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Регистрация""Введите пароль для регистрации:""OK""Отмена");
            }
            else if (response == 2// Вход
            {
                // Создание диалоговой формы авторизации
                ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Авторизация""Введите пароль:""OK""Отмена");
            }
            return 1;
        }
        case DIALOG_REGISTER:
        {
            if (response)
            {
                new
                    playerName[MAX_PLAYER_NAME],
                    password[MAX_PLAYER_NAME];

                GetPlayerName(playerid, playerNamesizeof(playerName));
                sscanf(inputtext, "s[24]s[24]", playerName, password);

                new query[256];
                format(query, sizeof(query), "INSERT INTO players (Name, Password, Gender, Skin, Money) VALUES ('%s', '%s', %d, %d, %d)", playerName, password, PlayerInfo[playerid][1], PlayerInfo[playerid][0], 0);

                mysql_tquery(dbHandle, query, """");

                SendClientMessage(playerid, 0x00AA00FF"Вы успешно зарегистрировались!");
                SendClientMessage(playerid, 0x00AA00FF"Теперь введите пароль для авторизации.");
            }
            else
            {
                Kick(playerid);
            }
            return 1;
        }
        case DIALOG_LOGIN:
        {
            if (response)
            {
                new query[256];
                format(query, sizeof(query), "SELECT Gender, Skin, Money FROM players WHERE Name = '%s' AND Password = '%s' LIMIT 1", GN(playerid), inputtext);
                mysql_tquery(dbHandle, query, "OnPlayerLogin""is[64]", playerid, inputtext);
            }
            else
            {
                Kick(playerid);
            }
            return 1;
        }
    }
    return 0;
}
forward OnPlayerLogin(playerid, pass[]);
public OnPlayerLogin(playerid, pass[])
{
    new
        password[MAX_PLAYER_NAME],
        rows;
    cache_get_row_count(rows);
    new sex, skin;
    cache_get_value_index_int(00, sex);
    cache_get_value_index_int(01, skin);
    if (rows)
    {
        GetPlayerName(playerid, password, sizeof(password));
        PlayerInfo[playerid][1] = sex; // Пол
        PlayerInfo[playerid][0] = skin; // Скин

        PlayerLoggedIn[playerid] = 1;

        SetPlayerSkin(playerid, PlayerInfo[playerid][0]);

        SendClientMessage(playerid, 0x00AA00FF"Вы успешно авторизовались!");
    }
    else
    {
        SendClientMessage(playerid, 0xFF0000FF"Ошибка: неверный пароль!");
        Kick(playerid);
    }
    return 1;
}
forward SavePlayerData(playerid);
public SavePlayerData(playerid)
{
    if (!PlayerLoggedIn[playerid]) return 0;

    new
        query[256],
        pname[MAX_PLAYER_NAME];

    GetPlayerName(playerid, pname, sizeof(pname));
    format(query, sizeof(query), "UPDATE players SET Gender = %d, Skin = %d WHERE Name = '%s'", PlayerInfo[playerid][1], PlayerInfo[playerid][0], pname);

    mysql_tquery(dbHandle, query, """");
    return 1;
}

public OnPlayerSpawn(playerid)
{
    if (!PlayerLoggedIn[playerid]) return 0;

    // Установить пол игрока
    if (PlayerInfo[playerid][1] == 1// Женский пол
    {
        SetPlayerInterior(playerid, 5);
    }
    else // Мужской пол
    {
        SetPlayerInterior(playerid, 0);
    }

    return 1;
}

public OnGameModeExit()
{
    mysql_close(dbHandle);
    mysql_thread_end();
    return 1;
}
stock GN(playerid){
    new NN[MAX_PLAYER_NAME];
    GetPlayerName(playerid, NN, MAX_PLAYER_NAME);
    return NN
}

 

Версия плагина mySQL R41-4 его код:

Спойлер

/**
 * MySQL plugin R41-4
 */


#if defined mysql_included
    #endinput
#endif
#define mysql_included


/**
 * Common error codes
 *
 * Client: http://dev.mysql.com/doc/refman/5.5/en/error-messages-client.html
 * Server: http://dev.mysql.com/doc/refman/5.5/en/error-messages-server.html
 */

#define ER_DBACCESS_DENIED_ERROR        1044
#define ER_ACCESS_DENIED_ERROR          1045
#define ER_UNKNOWN_TABLE                1109
#define ER_SYNTAX_ERROR                 1149
#define CR_SERVER_GONE_ERROR            2006
#define CR_SERVER_LOST                  2013
#define CR_COMMAND_OUT_OF_SYNC          2014
#define CR_SERVER_LOST_EXTENDED         2055


#if !defined E_LOGLEVEL
enum E_LOGLEVEL
{
    NONE = 0,
    DEBUG = 1,
    INFO = 2,
    WARNING = 4,
    ERROR = 8,
    
    ALL = ERROR | WARNING | INFO | DEBUG
};
#endif

enum E_ORM_ERROR
{
    ERROR_INVALID,
    ERROR_OK,
    ERROR_NO_DATA
};

enum E_MYSQL_GLOBAL_OPTION
{
    DUPLICATE_CONNECTIONS,
    DUPLICATE_CONNECTION_WARNING
};

enum E_MYSQL_OPTION
{
    AUTO_RECONNECT,
    MULTI_STATEMENTS,
    POOL_SIZE,
    SERVER_PORT,
    SSL_ENABLE,
    SSL_KEY_FILE,
    SSL_CERT_FILE,
    SSL_CA_FILE,
    SSL_CA_PATH,
    SSL_CIPHER
};

enum E_MYSQL_FIELD_TYPE
{
    MYSQL_TYPE_INVALID = -1,
    MYSQL_TYPE_DECIMAL = 0
    MYSQL_TYPE_TINY,
    MYSQL_TYPE_SHORT,  
    MYSQL_TYPE_LONG,
    MYSQL_TYPE_FLOAT,  
    MYSQL_TYPE_DOUBLE,
    MYSQL_TYPE_NULL,   
    MYSQL_TYPE_TIMESTAMP,
    MYSQL_TYPE_LONGLONG,
    MYSQL_TYPE_INT24,
    MYSQL_TYPE_DATE,   
    MYSQL_TYPE_TIME,
    MYSQL_TYPE_DATETIME, 
    MYSQL_TYPE_YEAR,
    MYSQL_TYPE_NEWDATE, 
    MYSQL_TYPE_VARCHAR,
    MYSQL_TYPE_BIT,
    MYSQL_TYPE_TIMESTAMP2,
    MYSQL_TYPE_DATETIME2,
    MYSQL_TYPE_TIME2,
    MYSQL_TYPE_JSON = 245,
    MYSQL_TYPE_NEWDECIMAL = 246,
    MYSQL_TYPE_ENUM = 247,
    MYSQL_TYPE_SET = 248,
    MYSQL_TYPE_TINY_BLOB = 249,
    MYSQL_TYPE_MEDIUM_BLOB = 250,
    MYSQL_TYPE_LONG_BLOB = 251,
    MYSQL_TYPE_BLOB = 252,
    MYSQL_TYPE_VAR_STRING = 253,
    MYSQL_TYPE_STRING = 254,
    MYSQL_TYPE_GEOMETRY = 255
};

enum E_MYSQL_EXECTIME_UNIT
{
    MILLISECONDS,
    MICROSECONDS
};

#define MYSQL_DEFAULT_HANDLE MySQL:1
#define MYSQL_INVALID_HANDLE MySQL:0
#define MYSQL_INVALID_CACHE Cache:0
#define MYSQL_INVALID_ORM ORM:0



// ORM functions
native ORM:orm_create(const table[], MySQL:handle = MYSQL_DEFAULT_HANDLE);
native orm_destroy(ORM:id);

native E_ORM_ERROR:orm_errno(ORM:id);

native orm_apply_cache(ORM:id, row_idx, result_idx = 0);

native orm_select(ORM:id, const callback[] = ""const format[] = "", {Float, _}:...);
native orm_update(ORM:id, const callback[] = ""const format[] = "", {Float, _}:...);
native orm_insert(ORM:id, const callback[] = ""const format[] = "", {Float, _}:...);
native orm_delete(ORM:id, const callback[] = ""const format[] = "", {Float, _}:...);

native orm_load(ORM:id, const callback[] = ""const format[] = "", {Float, _}:...) = orm_select;
native orm_save(ORM:id, const callback[] = ""const format[] = "", {Float, _}:...);

native orm_addvar_int(ORM:id, &var, const columnname[]);
native orm_addvar_float(ORM:id, &Float:var, const columnname[]);
native orm_addvar_string(ORM:id, var[], var_maxlenconst columnname[]);

native orm_clear_vars(ORM:id);
native orm_delvar(ORM:id, const columnname[]);
native orm_setkey(ORM:id, const columnname[]);


// MySQL functions
native mysql_log(E_LOGLEVEL:loglevel = ERROR | WARNING);
native MySQL:mysql_connect(const host[], const user[], const password[], const database[], MySQLOpt:option_id = MySQLOpt:0);
native MySQL:mysql_connect_file(const file_name[] = "mysql.ini");
native mysql_close(MySQL:handle = MYSQL_DEFAULT_HANDLE);

native mysql_unprocessed_queries(MySQL:handle = MYSQL_DEFAULT_HANDLE);
native mysql_global_options(E_MYSQL_GLOBAL_OPTION:type, value);

native MySQLOpt:mysql_init_options();
native mysql_set_option(MySQLOpt:option_id, E_MYSQL_OPTION:type, ...);

native mysql_pquery(MySQL:handle, const query[], const callback[] = ""const format[] = "", {Float,_}:...);
native mysql_tquery(MySQL:handle, const query[], const callback[] = ""const format[] = "", {Float,_}:...);
native Cache:mysql_query(MySQL:handle, const query[], bool:use_cache = true);
native mysql_tquery_file(MySQL:handle, const file_path[], const callback[] = ""const format[] = "", {Float,_}:...);
native Cache:mysql_query_file(MySQL:handle, const file_path[], bool:use_cache = false);

native mysql_errno(MySQL:handle = MYSQL_DEFAULT_HANDLE);
native mysql_error(destination[], max_len = sizeof(destination), MySQL:handle = MYSQL_DEFAULT_HANDLE);
native mysql_escape_string(const source[], destination[], max_len = sizeof(destination), MySQL:handle = MYSQL_DEFAULT_HANDLE);
native mysql_format(MySQL:handle, output[], max_len, const format[], {Float,_}:...);
native mysql_set_charset(const charset[], MySQL:handle = MYSQL_DEFAULT_HANDLE);
native mysql_get_charset(destination[], max_len = sizeof(destination), MySQL:handle = MYSQL_DEFAULT_HANDLE);
native mysql_stat(destination[], max_len = sizeof(destination), MySQL:handle = MYSQL_DEFAULT_HANDLE);



// Cache functions
native cache_get_row_count(&destination);
native cache_get_field_count(&destination);
native cache_get_result_count(&destination);
native cache_get_field_name(field_index, destination[], max_len = sizeof(destination));
native E_MYSQL_FIELD_TYPE:cache_get_field_type(field_index);
native cache_set_result(result_index);

stock cache_num_rows()
{
    new row_count;
    cache_get_row_count(row_count);
    return row_count;
}
stock cache_num_fields()
{
    new field_count;
    cache_get_field_count(field_count);
    return field_count;
}
stock cache_num_results()
{
    new result_count;
    cache_get_result_count(result_count);
    return result_count;
}


//  overload macros for cache_get_value natives
#define cache_get_value(%1) (_:MSCGV0:MSCGV1:MSCGV2:cache_get_ovrld_value(%1))
#define MSCGV0:MSCGV1:MSCGV2:cache_get_ovrld_value(%1,"%2",%3) cache_get_value_name(%1,#%2,%3)
#define MSCGV1:MSCGV2:cache_get_ovrld_value(%1,%8string%9:%2,%3) cache_get_value_name(%1,%2,%3)
#define MSCGV2:cache_get_ovrld_value(%1,%2,%3) cache_get_value_index(%1,%2,%3)

#define cache_get_value_int(%1) (_:MSCGVI0:MSCGVI1:MSCGVI2:cache_get_value_int_ovrld(%1))
#define MSCGVI0:MSCGVI1:MSCGVI2:cache_get_value_int_ovrld(%1,"%2",%3) cache_get_value_name_int(%1,#%2,%3)
#define MSCGVI1:MSCGVI2:cache_get_value_int_ovrld(%1,%8string%9:%2,%3) cache_get_value_name_int(%1,%2,%3)
#define MSCGVI2:cache_get_value_int_ovrld(%1,%2,%3) cache_get_value_index_int(%1,%2,%3)

#define cache_get_value_float(%1) (_:MSCGVF0:MSCGVF1:MSCGVF2:cache_get_value_float_ovrld(%1))
#define MSCGVF0:MSCGVF1:MSCGVF2:cache_get_value_float_ovrld(%1,"%2",%3) cache_get_value_name_float(%1,#%2,%3)
#define MSCGVF1:MSCGVF2:cache_get_value_float_ovrld(%1,%8string%9:%2,%3) cache_get_value_name_float(%1,%2,%3)
#define MSCGVF2:cache_get_value_float_ovrld(%1,%2,%3) cache_get_value_index_float(%1,%2,%3)

#define cache_get_value_bool(%1) cache_get_value_int(%1)

#define cache_is_value_null(%1) (_:MSCIVN0:MSCIVN1:MSCIVN2:cache_is_value_null_ovrld(%1))
#define MSCIVN0:MSCIVN1:MSCIVN2:cache_is_value_null_ovrld(%1,"%2",%3) cache_is_value_name_null(%1,#%2,%3)
#define MSCIVN1:MSCIVN2:cache_is_value_null_ovrld(%1,%8string%9:%2,%3) cache_is_value_name_null(%1,%2,%3)
#define MSCIVN2:cache_is_value_null_ovrld(%1,%2,%3) cache_is_value_index_null(%1,%2,%3)


native cache_get_value_index(row_idx, column_idx, destination[], max_len = sizeof(destination));
native cache_get_value_index_int(row_idx, column_idx, &destination);
native cache_get_value_index_float(row_idx, column_idx, &Float:destination);
/*
native cache_get_value_index_bool(row_idx, column_idx, &bool:destination);
*/
stock cache_get_value_index_bool(row_idx, column_idx, &bool:destination)
{
    return cache_get_value_index_int(row_idx, column_idx, _:destination);
}
native cache_is_value_index_null(row_idx, column_idx, &bool:destination);

native cache_get_value_name(row_idx, const column_name[], destination[], max_len = sizeof(destination));
native cache_get_value_name_int(row_idx, const column_name[], &destination);
native cache_get_value_name_float(row_idx, const column_name[], &Float:destination);
/*
native cache_get_value_name_bool(row_idx, const column_name[], &bool:destination);
*/
stock cache_get_value_name_bool(row_idx, const column_name[], &bool:destination)
{
    return cache_get_value_name_int(row_idx, column_name, _:destination);
}
native cache_is_value_name_null(row_idx, const column_name[], &bool:destination);

native Cache:cache_save();
native cache_delete(Cache:cache_id);
native cache_set_active(Cache:cache_id);
native cache_unset_active();
native bool:cache_is_any_active();
native bool:cache_is_valid(Cache:cache_id);

native cache_affected_rows();
native cache_insert_id();
native cache_warning_count();

native cache_get_query_exec_time(E_MYSQL_EXECTIME_UNIT:unit = MICROSECONDS);
native cache_get_query_string(destination[], max_len = sizeof(destination));


// Forward declarations
forward OnQueryError(errorid, const error[], const callback[], const query[], MySQL:handle);

 

 

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


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

Спасибо вам большое@Sleash

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


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

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

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

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

    • От MrNARTI
      делал дополнение для организации что бы при повторном взятии авто не вводить /unfcar.
       
      код
       
      ошибки
       
      обьясните пожалуйста понятным языком даже для тупых пожалуйста)