Проблема с sqlx

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
4
Реакции
0
Всем привет.
Бьюсь над этим уже второй день, всё перепробовал.
У меня есть система личного аккаунта.
Я пытался сделать отдельную таблицу для сохранений через личный аккаунт по логину (Логин это всегда ник игрока).
Всё работает прекрасно, кроме форварда дисконнекта (Он просто не работает, не сохраняет ни деньги, ни уровень, ни опыт. Я пытался его дебажить, дебаг тоже не проходит.). Даже если я уберу мой форвард и попытаюсь сохранить напрямую в client_disconnected - у меня всё равно ничего не получится.

C++:
new Handle:g_hTupleSql = Empty_Handle, g_szTableName[64];

public dc_starting_db(Handle:hTupleSql)
{
    g_hTupleSql = hTupleSql;
    jbe_sql_data_base(6, g_szTableName, charsmax(g_szTableName));
   
    new szBuffer[2048];
    formatex(szBuffer, charsmax(szBuffer),
    "CREATE TABLE IF NOT EXISTS `%s` \
    (`id` int(11) NOT NULL AUTO_INCREMENT, \
    \
    `login` varchar(32) NOT NULL DEFAULT 'unregistered', \
    `money` int(11) NOT NULL DEFAULT '0', \
    `level` int(11) NOT NULL DEFAULT '1', \
    `exp` int(11) NOT NULL DEFAULT '0', \
    \
    PRIMARY KEY (`id`)); SET NAMES 'utf8' COLLATE 'utf8_general_ci'", g_szTableName);
    SQL_ThreadQuery(g_hTupleSql, "SQL_ThreadQueryHandler", szBuffer);
}

public dc_user_register(pPlayer)
{
    new szBuffer[2048];
    formatex(szBuffer, charsmax(szBuffer),
    "INSERT INTO `%s` (`login`, `money`, `level`, `exp`) VALUES ('%n', '0', '1', '0')", g_szTableName, pPlayer);
    SQL_ThreadQuery(g_hTupleSql, "SQL_ThreadQueryHandler", szBuffer);
}

public dc_user_auth(pPlayer)
{
    new szData[2]; szData[0] = pPlayer;
    SQL_ThreadQuery(g_hTupleSql, "SQL_LoadSave", fmt("SELECT * FROM `%s` WHERE `login` = '%n'", g_szTableName, pPlayer, szData, sizeof(szData)));
}

public dc_user_disconnect(pPlayer)
{
    new szBuffer[2048];
    formatex(szBuffer, charsmax(szBuffer), "UPDATE `%s` SET `money` = '%d', `level` = '%d', `exp` = '%d' WHERE `login` = '%n'",
    g_szTableName, jbe_get_user_money(pPlayer), jbe_get_user_level(pPlayer), jbe_get_user_exp(pPlayer), pPlayer);
    SQL_ThreadQuery(g_hTupleSql, "SQL_ThreadQueryHandler", szBuffer);
}

public SQL_LoadSave(iFailState, Handle:hQuery, const szError[], iError, const szData[], iDataSize)
{
    if(g_hTupleSql == Empty_Handle) return PLUGIN_HANDLED;
    switch(iFailState)
    {
        case TQUERY_CONNECT_FAILED:
        {
            log_amx("ERROR: MySQL connection failed");
            log_amx("[%d] %s", iError, szError);
            return PLUGIN_HANDLED;
        }      
        case TQUERY_QUERY_FAILED:
        {
            log_amx("ERROR: MySQL query failed");
            log_amx("[%d] %s", iError, szError);
            return PLUGIN_HANDLED;
        }
    }
    new pPlayer = szData[0];
    if(SQL_NumResults(hQuery) == 1)
    {
        jbe_set_user_money(pPlayer, SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "money")), false);
        jbe_set_user_level(pPlayer, SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "level")));
        jbe_set_user_exp(pPlayer, SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "exp")));
    }
    else
    {
        new szBuffer[2048];
        formatex(szBuffer, charsmax(szBuffer),
        "INSERT INTO `%s` (`login`, `money`, `level`, `exp`) VALUES ('%n', '0', '1', '0')", g_szTableName, pPlayer);
        SQL_ThreadQuery(g_hTupleSql, "SQL_ThreadQueryHandler", szBuffer);
    }
    return PLUGIN_HANDLED;
}

public SQL_ThreadQueryHandler(iState, Handle:hQuery, szError[], iError, iParams[], iParamsSize)
{
    if(iState == 0) return;
    log_amx("SQL Error: %d (%s)", iError, szError);
}
C++:
public client_disconnected(id)
{
    if(!jbe_is_user_connected(id) || ~g_iBitUserConnect & (1<<id)) return;
    if(task_exists(id+TASK_DATA_BASE_CONNECT)) remove_task(id+TASK_DATA_BASE_CONNECT);
   
    g_iBitUserConnect &= ~(1<<id);
   
    if(is_user_connected_account(id))
    {
        ExecuteForward(g_hForward[StatusUser_Disconnect], _, id);

        // g_hForward[StatusUser_Disconnect] это public dc_user_disconnect(pPlayer)

        g_bUserConnected[id] = false;
        g_bUserLoginBusy[id] = false;
        g_bUserConnectType[id] = false;
       
        g_eUserAccount[id][NUMBER_ACCOUNT] = 0;
        formatex(g_eUserAccount[id][LOGIN], charsmax(g_eUserAccount[][LOGIN]), "^0");
        formatex(g_eUserAccount[id][PASSWORD], charsmax(g_eUserAccount[][PASSWORD]), "^0");
        g_eUserAccount[id][SECRET_KEY] = 0;
        formatex(g_eUserAccount[id][REG_STEAM_ID], charsmax(g_eUserAccount[][REG_STEAM_ID]), "^0");
        formatex(g_eUserAccount[id][REG_IP], charsmax(g_eUserAccount[][REG_IP]), "^0");
        formatex(g_eUserAccount[id][REG_DATA], charsmax(g_eUserAccount[][REG_DATA]), "^0");
        g_eUserAccount[id][AUTO_CONNECT] = 0;
        formatex(g_szNewPassword[id], charsmax(g_szNewPassword[]), "^0");
    }
}
 
Сообщения
333
Реакции
290
Помог
9 раз(а)
Я пытался его дебажить, дебаг тоже не проходит.)
Где дебаг то?

До куда доходит в public client_disconnected(id) и что в нем вообще происходит? Где в нем функция сохранения?
 
Сообщения
335
Реакции
93
Помог
2 раз(а)
1) Сохранять по нику такая себе идея.
2) Освобождайте запрос, после чтения всех данных.
3) Вы проверяли наличие данных в dc_user_disconnect, т.е. то, что отправляете в бд?
 
Сообщения
4
Реакции
0
zhorzh78,
Noob_with_cheats,

C++:
public dc_user_disconnect(pPlayer)
{
    new szBuffer[2048];
    formatex(szBuffer, charsmax(szBuffer), "UPDATE `%s` SET `money` = '%d', `level` = '%d', `exp` = '%d' WHERE `login` = '%n'",
    g_szTableName, jbe_get_user_money(pPlayer), jbe_get_user_level(pPlayer), jbe_get_user_exp(pPlayer), pPlayer);
    SQL_ThreadQuery(g_hTupleSql, "SQL_ThreadQueryHandler", szBuffer);
    
    log_amx("UPDATE `%s` SET `money` = '%d', `level` = '%d', `exp` = '%d' WHERE `login` = '%n'", g_szTableName, jbe_get_user_money(pPlayer), jbe_get_user_level(pPlayer), jbe_get_user_exp(pPlayer), pPlayer);
}

L 01/04/2022 - 09:29:20: "Player<12><STEAM_0:1:197604089><TERRORIST>" disconnected
L 01/04/2022 - 09:29:20: World triggered "Round_Draw" (CT "0") (T "0")
L 01/04/2022 - 09:29:20: World triggered "Round_End"
Dropped Player from server
Reason: Client sent 'drop'
Должно вывести в лог запись, но не выводит.
 
Сообщения
335
Реакции
93
Помог
2 раз(а)
is_user_connected_account(id) проверка на наличие аккаунта?
Дебаг перед вызовом форварда (перед проверкой if и после удачной), перед запросом и после. Один лог ничего не даст.
 
Сообщения
4
Реакции
0
Noob_with_cheats,
C++:
#define is_user_connected_account(%1) (g_bUserConnected[%1])
C++:
public client_disconnected(id)
{
    if(!jbe_is_user_connected(id) || ~g_iBitUserConnect & (1<<id)) return;
    if(task_exists(id+TASK_DATA_BASE_CONNECT)) remove_task(id+TASK_DATA_BASE_CONNECT);
   
    g_iBitUserConnect &= ~(1<<id);
   
    log_amx("123");
    if(is_user_connected_account(id))
    {
        log_amx("345");
        ExecuteForward(g_hForward[StatusUser_Disconnect], _, id);
        log_amx("678");
   
        g_bUserConnected[id] = false;
        g_bUserLoginBusy[id] = false;
        g_bUserConnectType[id] = false;
       
        g_eUserAccount[id][NUMBER_ACCOUNT] = 0;
        formatex(g_eUserAccount[id][LOGIN], charsmax(g_eUserAccount[][LOGIN]), "^0");
        formatex(g_eUserAccount[id][PASSWORD], charsmax(g_eUserAccount[][PASSWORD]), "^0");
        g_eUserAccount[id][SECRET_KEY] = 0;
        formatex(g_eUserAccount[id][REG_STEAM_ID], charsmax(g_eUserAccount[][REG_STEAM_ID]), "^0");
        formatex(g_eUserAccount[id][REG_IP], charsmax(g_eUserAccount[][REG_IP]), "^0");
        formatex(g_eUserAccount[id][REG_DATA], charsmax(g_eUserAccount[][REG_DATA]), "^0");
        g_eUserAccount[id][AUTO_CONNECT] = 0;
        formatex(g_szNewPassword[id], charsmax(g_szNewPassword[]), "^0");
        log_amx("90");
    }
}
Ни одна цифра не отобразилась в логах.

Я обнаружил ещё одну проблему. Объясню подробнее.
У меня есть плагин на систему личных аккаунтов.
И есть плагин, который сохраняет всё что мне нужно и зависит от плагина аккаунтов (использует его форварды).
Так вот, именно с ним у меня проблемы.
После полного перезапуска сервера (Видимо что-то багнулось), у меня начал крашится сервер с причиной FATAL ERROR (shutting down): PF_MessageBegin_I: with no target entity.
В момент, когда срабатывает код в форварде dc_user_auth.
Я отключил этот плагин на сохранения и крашей больше не было. Включил, и снова стал выключаться сервер.
Весь код этого плагина есть в моём первом сообщении.
Я не думаю, что проблема в аккаунтах, мне кажется что проблема именно в этом плагине на сохранения.
Я себе уже весь мозг сломал, не знаю что делать.
 
Сообщения
335
Реакции
93
Помог
2 раз(а)
Причину краша не понимаю. szData[2] можно на szData[1] т.к. используется только 1 ячейка. Делай подробные дебаги, дабы понять, где и какие проблемы, особенно с проверками. Хоть через каждую строчку кода.

if(!jbe_is_user_connected(id) || ~g_iBitUserConnect & (1<<id)) return;
Игрок вышел и остановка функции, если игрок не подключён?!
 
Сообщения
4
Реакции
0
Проблема решена. Можно закрывать. Всем спасибо за попытку помочь.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу