Всем привет.
Бьюсь над этим уже второй день, всё перепробовал.
У меня есть система личного аккаунта.
Я пытался сделать отдельную таблицу для сохранений через личный аккаунт по логину (Логин это всегда ник игрока).
Всё работает прекрасно, кроме форварда дисконнекта (Он просто не работает, не сохраняет ни деньги, ни уровень, ни опыт. Я пытался его дебажить, дебаг тоже не проходит.). Даже если я уберу мой форвард и попытаюсь сохранить напрямую в client_disconnected - у меня всё равно ничего не получится.
Бьюсь над этим уже второй день, всё перепробовал.
У меня есть система личного аккаунта.
Я пытался сделать отдельную таблицу для сохранений через личный аккаунт по логину (Логин это всегда ник игрока).
Всё работает прекрасно, кроме форварда дисконнекта (Он просто не работает, не сохраняет ни деньги, ни уровень, ни опыт. Я пытался его дебажить, дебаг тоже не проходит.). Даже если я уберу мой форвард и попытаюсь сохранить напрямую в 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");
}
}