Question

Написал свой первый код и в нём 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;
}

 

 

Edited by Cawfee

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

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

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

Share this post


Link to post
Share on other sites

7 answers to this question

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

 

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

Share this post


Link to post
Share on other sites
  • 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, которую Вы используете.

Share this post


Link to post
Share on other sites
  • 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.

 

 

 

Edited by Cawfee

Share this post


Link to post
Share on other sites
  • 0

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

Edited by Cawfee

Share this post


Link to post
Share on other sites
  • 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 версией ,как минимум сообщит мне её.

Share this post


Link to post
Share on other sites
  • 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);

 

 

Share this post


Link to post
Share on other sites
  • 0

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

Share this post


Link to post
Share on other sites
This topic is now closed to further replies.
Sign in to follow this  
Followers 0

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By danya_white


      Скачать файл Игровой Мод Flin RP (последняя версия)
      Доброго времени суток, сегодня выкладываю на продажу оригинальный игровой мод проекта Flin Mobile
      Данный игровой мод сейчас стоит на данном проекте, и держит стабильный онлайн.
       
      Информация о моде:
      Версия MYSQL - R41-4
      Античит - Nex-AC + Rakcheat (Настроено все)
      Стример - Streamer Plugin v2.9.4 by Incognito
      Командный процессор - Pawn CMD
      Хэширование паролей - MD5
      Остальное Все плагины обновлены до последней версии
       
      - Цена бочки снижена до 6000 тысяч вирт. - Навык влияет на ЗП. На 50 навыке продажа бочки за 13500(7500 чистыми) + надбавки за VIP, личный т/с. - Исправлен обход на количество бочек в час, теперь 25, ещё +25 с ADD VIP(в сумме 50). - Исправлено выбрасывание из автомобиля, когда игроки застревали в DFT-30. *Исправление для всех видов т/с. - Теперь когда начинаете загрузку/выгрузку вас не выбрасывает из автомобиля, нужно самому выйти. Подкорректирона работа anti +С. - Блокируется только +С и авто +С . - Сбив темпа работает. Снизили стоимость доступа. Теперь вы можете открывать контейнеры в любое время. Обновили список выпадающих предметов (окупиться или пойти в минус - все зависит от вашего везения). Добавили несколько Real Skins в контейнеры GOLD класса. Кроме того, мы добавили государственным структурам новую крутую штуку - нейтрализатор (нужен дробовик ID:25),  который позволяет быстро вывести из строя двигатель на рандомное время, что позволит полиции более эффективно выполнять свою работу и задерживать преступников. - Добавлены машины Ferrari F50 и Pegassi Toreto для погони за преступниками. - Добавление команды /сtazer для переключения между USP и Deagle. - Добавление нелетального дробовика SPAS, который парализует на 10-15 секунд. - Добавление кнопки паники (/panic) для вызова поддержки. - Фракция Police RC переименована в Los Santos Sheriff Departament (LSSD) - Доработка нейтрализатора автомобилей. - Добавлен семейный инвентарь. - Добавили команды /makegun и еще короткие команды для быстрого создания + /de /mp5 /ak47 /m4. - Добавили возможности отдавать свой личный Т/С в семью. - Добавлена команда /fonline для просмотра количества воюющих семей в онлайне. - Были заблокированы читы, которые позволяли читерам стрелять с большой скоростью - Внесены исправления и корректировки в работе нефтяника. - Изменена система контейнеров, можно открывать в любое время, так же добавлены все новые RealSkins. - Возвращены старые анимации по командам (например: /crossarms, /crossfingers, /frontfall и т.д). - Добавлены новые RP-команды (/ame, /ab, /(un)blind). - Добавлены команды для быстрого крафта оружия (/de /mp4 /m4 /ak47). - Добавлено блокирование предметов от 2 до 6 часов после их выбрасывания в мусорный бак. - Исправлена недоработка, когда можно было находиться в Т/С на ЦР. - Исправлена команда /lock, которая иногда не работала. - Исправлена проблема с меткой сдачи автомобиля на работе автоугонщика. - Исправлена причина кика игроков с ПК на работе нефтяника. Причина была в наличии посторонних CLEO/ASI у игроков. - Исправлена система посадки на мебель. - Увеличен шанс выигрыша ценных призов в рулетках , так же добавлены все новые Real Skins. - Исправлено отображение CJ скина в инвентаре на ПК. - Новая система "Карта кладов"  
      Добавил danya_white Добавлено 10.12.2023 Категория Моды Автор danya_white  
    • By danya_white
      Доброго времени суток, сегодня выкладываю на продажу оригинальный игровой мод проекта Flin Mobile
      Данный игровой мод сейчас стоит на данном проекте, и держит стабильный онлайн.
       
      Информация о моде:
      Версия MYSQL - R41-4
      Античит - Nex-AC + Rakcheat (Настроено все)
      Стример - Streamer Plugin v2.9.4 by Incognito
      Командный процессор - Pawn CMD
      Хэширование паролей - MD5
      Остальное Все плагины обновлены до последней версии
       
      - Цена бочки снижена до 6000 тысяч вирт. - Навык влияет на ЗП. На 50 навыке продажа бочки за 13500(7500 чистыми) + надбавки за VIP, личный т/с. - Исправлен обход на количество бочек в час, теперь 25, ещё +25 с ADD VIP(в сумме 50). - Исправлено выбрасывание из автомобиля, когда игроки застревали в DFT-30. *Исправление для всех видов т/с. - Теперь когда начинаете загрузку/выгрузку вас не выбрасывает из автомобиля, нужно самому выйти. Подкорректирона работа anti +С. - Блокируется только +С и авто +С . - Сбив темпа работает. Снизили стоимость доступа. Теперь вы можете открывать контейнеры в любое время. Обновили список выпадающих предметов (окупиться или пойти в минус - все зависит от вашего везения). Добавили несколько Real Skins в контейнеры GOLD класса. Кроме того, мы добавили государственным структурам новую крутую штуку - нейтрализатор (нужен дробовик ID:25),  который позволяет быстро вывести из строя двигатель на рандомное время, что позволит полиции более эффективно выполнять свою работу и задерживать преступников. - Добавлены машины Ferrari F50 и Pegassi Toreto для погони за преступниками. - Добавление команды /сtazer для переключения между USP и Deagle. - Добавление нелетального дробовика SPAS, который парализует на 10-15 секунд. - Добавление кнопки паники (/panic) для вызова поддержки. - Фракция Police RC переименована в Los Santos Sheriff Departament (LSSD) - Доработка нейтрализатора автомобилей. - Добавлен семейный инвентарь. - Добавили команды /makegun и еще короткие команды для быстрого создания + /de /mp5 /ak47 /m4. - Добавили возможности отдавать свой личный Т/С в семью. - Добавлена команда /fonline для просмотра количества воюющих семей в онлайне. - Были заблокированы читы, которые позволяли читерам стрелять с большой скоростью - Внесены исправления и корректировки в работе нефтяника. - Изменена система контейнеров, можно открывать в любое время, так же добавлены все новые RealSkins. - Возвращены старые анимации по командам (например: /crossarms, /crossfingers, /frontfall и т.д). - Добавлены новые RP-команды (/ame, /ab, /(un)blind). - Добавлены команды для быстрого крафта оружия (/de /mp4 /m4 /ak47). - Добавлено блокирование предметов от 2 до 6 часов после их выбрасывания в мусорный бак. - Исправлена недоработка, когда можно было находиться в Т/С на ЦР. - Исправлена команда /lock, которая иногда не работала. - Исправлена проблема с меткой сдачи автомобиля на работе автоугонщика. - Исправлена причина кика игроков с ПК на работе нефтяника. Причина была в наличии посторонних CLEO/ASI у игроков. - Исправлена система посадки на мебель. - Увеличен шанс выигрыша ценных призов в рулетках , так же добавлены все новые Real Skins. - Исправлено отображение CJ скина в инвентаре на ПК. - Новая система "Карта кладов"  
    • By zdfgdhdrhrhd
      Доброго времени суток, столкнулся с проблемой при добавлении системы анти-флуда пикапов.
      По сути, она работает нормально, но немного напрягает тот факт, что когда встаешь на любой пикап, он отправляет сообщение по два раза, вместо одного.
      Знающие люди, помогите пожалуйста, заранее огромное спасибо!
      Откуда брал систему (инклуд прикрепил ниже):
      pickup_stop_flood.inc