Сбивается сохранения

Сообщения
198
Реакции
16
Помог
1 раз(а)
voed, лучше в client_disconnected() ставить g_bAuth[id] = false, поскольку при заходе игрока на сервер, client_putinserver() вызовется гораздо позже чем client_disconnected() вызываемый при прекеше файлов. тем самым мы отправим ненужный запрос в бд и, если массивы не обнулены, запишем ему информацию другого игрока. если я ошибочно мыслю, поправьте, пожалуйста, но моя практика показала это.

теперь я обнуляю массивы после отправки UPDATE запроса, затем g_bAuth[id] приравниваю false
дополнительно обнуляю при putinserver(), поскольку слышал, что disconnected() может не сработать в некоторых ситуациях. опять же, поправьте, если я ошибаюсь, пожалуйста
 
  • Нравится
Реакции: voed
Сообщения
147
Реакции
29
kucklovod keep in mind if you save data on client_disconected( id ) to check first if map is being changed...because time of exetuting queries can be longer from that moment than time of that moment to plugin_end() (=closing connection); can lead to some data problems i guess, but im not expert in this
 
Сообщения
432
Реакции
410
Помог
14 раз(а)
kucklovod тогда надо вообще в client_connect выставлять в false, и не будет никаких проблем
 
Сообщения
198
Реакции
16
Помог
1 раз(а)
voed, тогда и обнуление можно в client_connect() сделать?
 
Сообщения
32
Реакции
0
kucklovod, Погоди,а причём тут прекеш файлов то? Смотри. Как лично я понял: После получение данных,мы закрываем g_bAuth[id]. В дисконнект мы делаем проверку на опять таки g_bAuth[id] и если она равна тру,то мы выполняем запрос. Правда одно мне не понятно. Если мы сразу же после взятия всех данных закрываем булевую,то как он может его апдейтить в дисконнекте?
4 Дек 2019
voed, Так всё же? Я погуглил о асинхронных и синхронных запросах,но я не знаю им применения,зачастую я использую синхронный запрос,но в можно ли сделать запрос для получение данных асинхронных,но как я понял,что из этого мало что получиться ибо нам же нужно дождаться получения Левела и експы.чтобы в дальнейшем манипулировать ней
 
Сообщения
198
Реакции
16
Помог
1 раз(а)
AlexaCarra, я не знаю как у тебя работает система. обычно g_bAuth служит для того, чтобы зафиксировать авторизацию игрока. то есть, когда вызвался client_putinserver() информация загрузилась, ставится true на g_bAuth. дальше, при client_disconnect() идёт проверка, если g_bAuth == true, то отправляем UPDATE запрос (сохранение). далее обнуляем массивы и g_bAuth = false.
на счёт прекеша. при загрузке файлов игрока выкидывает с сервера, срабатывает client_disconnected(), чтобы не отправлять лишний запрос, есть массив g_bAuth, для чего он нужен, я уже описал выше
 
Сообщения
32
Реакции
0
kucklovod, Всё,понял,а по поводу client_connect() ? Стоит ли в нем обнулять? Выше же написали,что дисконнект не всегда работает,и я убедился лично.
 
Сообщения
198
Реакции
16
Помог
1 раз(а)
AlexaCarra, да, обнуляй там, но я в двух местах обнуляю (_connect(), _disconnected())
подожду ответ voed, а там решу
 
Сообщения
432
Реакции
410
Помог
14 раз(а)
Сообщения
198
Реакции
16
Помог
1 раз(а)
voed, массив с данными игрока. как я понял, обнулить лучше в client_disconnected(), а затем при client_connect()
 
Сообщения
432
Реакции
410
Помог
14 раз(а)
kucklovod, в putinserver достаточно
 
Сообщения
198
Реакции
16
Помог
1 раз(а)
voed, если client_disconnected() вызовется раньше, чем client_putinserver(), то отправится лишний UPDATE запрос, который сохранит не ту информацию об игроке, либо вообще по 0 всё (массивы то обнулены). как это избежать? у себя сделал g_bAuth = 1 после загрузки информации об игроке, а затем обнуление в client_disconnected() и перед загрузкой информации об игроке в client_putinserver()
 
Сообщения
432
Реакции
410
Помог
14 раз(а)
kucklovod, мы ходим по кругу.
Код:
client_connect(id)
{
    g_bAuth[id] = false
}

client_disconnect/ed(id,...)
{
    if(g_bAuth[id])
    {
        //update player data
        g_bAuth[id] = false
    }
}
Таким образом, пока из БД не прилетит добро, что игрок инициализирован, все будет ок.
 
Сообщения
432
Реакции
410
Помог
14 раз(а)
Javekson, client_disconnect, который был в 1.8.2 и ранее, не вызывался, когда игрок отваливался по таймауту(пропал интернет, убил процесс hl.exe и так далее). client_disconnected уже обрабатывает эти случаи. Но при смене карты в client_disconnected игрок невалиден, и кроме id от него получить уже особо ничего нельзя
 
Сообщения
1,032
Реакции
828
Помог
10 раз(а)
voed, не замечал такого, может это редкость какая, во всяком случаи при смене карты sid'ы игроков всегда получал, кажется
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
Всё нормально сохраняется,после того как 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));
Можете смело убить соединение за ненадобностью после создания. Да и само создание каждый инит такое себе. Я уже не раз высказывал свое мнение по этому поводу.
 
Сообщения
2,491
Реакции
2,794
Помог
61 раз(а)
авторизовался на стим сервере
ну в принципе да, иногда стим плющит и авторизация может быть дольше. но я скорее имел ввиду старый трюк с не до конца авторизироваными игроками
8 Дек 2019
UPDATE: Перепутал с STEAM_ID_LAN
 

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

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