Всё нормально сохраняется,после того как n раз сервере рестартишь(перезапуск,смена карты),они сбрасываются. Я хз в чём может быть вопрос и как так может быть,чтобы 1 раз сохранилось,а потом после несколько раз перезапуска сбрасывалось
А теперь по порядку
Код:
switch(iState)
{
case TQUERY_CONNECT_FAILED: log_amx ( "[LVL SYSTEM] Load - Could not connect to SQL database. [%d] %s" , iErrcode , szError );
case TQUERY_QUERY_FAILED: log_amx ( "[LVL SYSTEM] Load Query failed. [%d] %s" , iErrcode , szError );
}
Что будет если запрос закончится неудачей? Верно залогируем и продолжим исполнение функции дальше (ловим ошибки в еррор лог)
Код:
if(equal(g_szSteamID[pPlayer], "ID_PENDING"))
return PLUGIN_HANDLED;
Такие стим ид вообше должны быть запрещены, Но если уж и делать проверку, то селект также не надо было выполнять. А это значит что проверка должна быть в путинсервер
Код:
get_user_authid(id, g_szSteamID[id], charsmax(g_szSteamID[]));
Зачем вам шлобальный кэш стимид? Если можна спокойно получить в любое время.
Код:
new iParams[1]; iParams[0] = id;
Прокидивать нужно не ид игрока, а его юзер ид. Тогда в калбеке можна быть увереным что это не новый игрок котоырй зашел между запросом и ответом к базе, а все тот же самый (можна передать и ид и его юзер ид тем самым исключая поиск ид по юзерид, а просто сравнивая результаты)
Код:
public client_disconnect(id)
{
format(g_szQuery, charsmax(g_szQuery), "UPDATE `%s` SET `user_level` = '%d', `user_exp` = '%d' WHERE `%s`.`SteamID` = '%s';", dbTable, g_iUserLevel[id], g_iUserExp[id], dbTable, g_szSteamID[id]);
SQL_ThreadQuery(g_hDBTuple, "ThreadQueryHandler", g_szQuery);
g_iUserLevel[id] = 0;
g_iUserExp[id] = 0;
}
И ловите ошибки при смене карты. Потому что все запросы могут не успеть обработатся как карта сменилась и они отменились. Апдейтить нужно при событиях (например изменение уронвня игрока) или по таймауту (в начале каждого раунда, раз в минуту). Или как делал я. Хукал дисконнект игрока (именно дисконнект а не форвард амхх) и сохранял. В конце карты я получал всех игроков которые не вышли с сервера (для этого пришлось кэшировать стим ид и онлайн) формировал один общий запрос и слал его в синхронном варианте (что не есть хорошо). Намного лучше если бы мапменеджер сменил карту акурат после окончания запроса. Но и тут свои подводные камни в том, что запрос может длится и 60сек и 2 минуты. Но так как я посчитал что ранк не стольк критичная инфа, т оя просто установил лимит в 15 сек на запрос. И даже если какие данные пропали то это не столь критично. На практике такого не случалось лично у меня.
И еще я не вижу примари ключ автоинкремент. В mysql лучше всего им пользоватся, хотя индексы у вас все равно есть, что также не плохо.
И еще нет смысла держать постоянно коннект к базе
Код:
g_hConnect = SQL_Connect(g_hDBTuple, iErrNo, szError, charsmax(szError));
Можете смело убить соединение за ненадобностью после создания. Да и само создание каждый инит такое себе. Я уже не раз высказывал свое мнение по этому поводу.