Не распознает STEAMID или другая причина. Телепатия

Тема в разделе "Программирование / Скриптинг", создана пользователем Primo, 15 дек 2014.

  1. Primo

    Primo Где мои манеры

    Сообщения:
    1.191
    Симпатии:
    310
    Возникла проблема:-D
    Приспичило немного переписать плагин сохранения статистики в бд, да вот проблема возникла.

    Имеется такой код:
    PHP:
    public OnClientPostAdminCheck(client)
    {
        
    decl String:sAuth[32];
        
    GetClientAuthString(clientsAuthsizeof(sAuth) - 1);
        
    decl String:sQuery[256];
        
    Format(sQuerysizeof(sQuery) - 1"SELECT * FROM dp_users WHERE Steam = '%s'"sAuth);
        
    SQL_TQuery(dbSQL_SelectPlayerCallbacksQueryclient);
    }


    public 
    SQL_SelectPlayerCallback(Handle:ownerHandle:hndl, const String:error[], any:iClient)
    {
        if(
    hndl == INVALID_HANDLE)
        {
            
    LogError("Ошибка подключения к базе данных (%s)"error);
        }
        else
        {
            if(
    SQL_HasResultSet(hndl) && SQL_FetchRow(hndl) && IsClientInGame(iClient))
            {
                
    Player[pKills][iClient] = SQL_FetchInt(hndl2);
                
    Player[pDeaths][iClient] = SQL_FetchInt(hndl3);
                
    Player[pLevel][iClient] = SQL_FetchInt(hndl4);
                
    Player[pEXP][iClient] = SQL_FetchInt(hndl5);
                
    Player[pCredit][iClient] = SQL_FetchInt(hndl6);
                
    Player[pBanValue][iClient] = SQL_FetchInt(hndl7);
            }
            else
            {
                
    Player[pKills][iClient] = 0;
                
    Player[pDeaths][iClient] = 0;
                
    Player[pLevel][iClient] = 0;
                
    Player[pEXP][iClient] = 0;
                
    Player[pCredit][iClient] = 0;
                
    Player[pBanValue][iClient] = 0;
            }
        }
    }

    public 
    OnClientDisconnect(client

        if(
    client <= MaxClients && !IsFakeClient(client)) 
        { 
            
    Player[PlayerJoin][client] = 1;
            
    decl String:sAuth[64], String:pName[150], String:query[2048]; 
            
    GetClientName(clientsAuthsizeof(sAuth) - 1); 
            
    SQL_EscapeString(dbsAuthpNamesizeof(pName) - 1); 
            
    GetClientAuthString(clientsAuthsizeof(sAuth) - 1); 
            
    FormatEx(querysizeof(query), 
            
    "INSERT INTO dp_users (Steam, Nick, Kills, Deaths, Level, EXP, Credits, BanValue) VALUES ('%s', '%s', %d, %d, %d, %d, %d, %d) ON DUPLICATE KEY UPDATE Steam = '%s', Nick = '%s', Kills = %d, Deaths = %d, Level = %d, EXP = %d, Credits = %d, BanValue = %d",
            
    sAuth,
            
    pName,
            
    Player[pKills][client],
            
    Player[pDeaths][client],
            
    Player[pLevel][client],
            
    Player[pEXP][client],
            
    Player[pCredit][client],
            
    Player[pBanValue][client],
            
    sAuth,
            
    pName,
            
    Player[pKills][client],
            
    Player[pDeaths][client],
            
    Player[pLevel][client],
            
    Player[pEXP][client],
            
    Player[pCredit][client],
            
    Player[pBanValue][client]); 
            
    SQL_TQuery(dbSQL_SelectPlayerCallbackquery); 
        } 
    }

    Суть проблемы в том, что в базу в поле Steam записывается ник игрока, а не его STEAMID. Происходит это редко, но это очень мешает. Как, когда и по какой причине это происходит - я не имею понятия.
    Один из вариантов, это при подключении к серверу игрока кикает, но, разве, steamid не известен уже в тот момент?
     

    Вложения:

    • steamid.jpg
      steamid.jpg
      Размер файла:
      18,4 КБ
      Просмотров:
      20
  2. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.539
    Симпатии:
    1.984
    Если речь идёт о player_connect, то SteamID можно получить лишь из самого события ("networkid"), а сам GetClientUserId(client) = 0.
    Не выдумывай.
     
    Primo нравится это.
  3. Primo

    Primo Где мои манеры

    Сообщения:
    1.191
    Симпатии:
    310
    AlmazON, я имею ввиду:
    Игрок подключается, и во время подключения сразу отключается, следовательно должна срабатывать функция OnClientDisconnect, а в ней идёт запись данных в бд. В итоге задаётся вопрос: "Доступен ли steamid игрока в такой ситуации(моменте)?"

    Игра CSGO :)
     
  4. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.539
    Симпатии:
    1.984
    А ты попробуй, если есть сомнения. Тем более, на CS:GO. Что мешает сделать тест?
    client может быть только 0, но не выше MaxClients. Лишняя проверка.
    Оффтоп
     
    Primo нравится это.
  5. Primo

    Primo Где мои манеры

    Сообщения:
    1.191
    Симпатии:
    310
    AlmazON, что раньше вызывается?
    OnClientPostAdminCheck или player_connect?
     
  6. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.539
    Симпатии:
    1.984
    Цепочка вызовов при подключении игрока к серверу:
    1) HookEvent("player_connect", callback, EventHookMode_Pre);
    2) public bool:OnClientConnect(client, String:rejectmsg[], maxlen)
    3) OnClientConnected(client)
    4) OnClientAuthorized(client, const String:auth[])
    5) OnClientPutInServer(client)
    6) public Action:OnClientPreAdminCheck(client)
    7) OnClientPostAdminFilter(client)
    8) OnClientPostAdminCheck(client)
    Самый первый.
     
    Primo нравится это.
  7. Primo

    Primo Где мои манеры

    Сообщения:
    1.191
    Симпатии:
    310
    Проблема в силе. Игроки стали жаловаться, что теперь вообще всё обнуляется...
     
  8. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.993
    Симпатии:
    2.989
    Primo нравится это.
  9. Primo

    Primo Где мои манеры

    Сообщения:
    1.191
    Симпатии:
    310
  10. R1KO

    R1KO Супер-модератор

    Сообщения:
    5.993
    Симпатии:
    2.989
    Primo, в новом см перешли на новый тип стима. Может в ксго старый просто убрали?
     
    Primo нравится это.
  11. Primo

    Primo Где мои манеры

    Сообщения:
    1.191
    Симпатии:
    310
    R1KO, не убрали, и не собираются убирать, похоже. Ну, по крайней мере, уже месяца 3 собираются.

    Через networkid не вариант. Не берёт steamid.
     
  12. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.539
    Симпатии:
    1.984
    Берёт. Просто
    В событиях получаем новый тип SteamID, а через GetClientAuthString - старый.
    Сам на этом раз столкнулся, правда в Доте.
     
    Primo нравится это.
  13. Primo

    Primo Где мои манеры

    Сообщения:
    1.191
    Симпатии:
    310
    В общем, причиной, как и предполагалось, является отключение во время подключения.
    Сейчас забанил игрока, и когда он подключался его кикнуло из-за бана. В бд записалось вместо steamid его ник. Кто знает решения?
     
  14. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.539
    Симпатии:
    1.984
    Для записи самого ника используй %N, как форматирование индекса игрока client.
    Сделай тест, до какого уровня проверок (которые я 8 штук написал) может дойти забаненный игрок и на этом уровне, если он удобен, и сделай получение данных.
    Я бы на твоем месте пробовал, начиная с OnClientAuthorized(client, const String:auth[]) (и выше по списку) - очень удобно.
     
    Primo нравится это.
  15. Primo

    Primo Где мои манеры

    Сообщения:
    1.191
    Симпатии:
    310
    OnClientConnected(client) тут писало ошибку, что индекс клиента 0, и его steamid не получался, как и с player_connect. (ну старый формат steamid)
     
  16. AlmazON

    AlmazON деревянный © yand3xmail

    Сообщения:
    4.539
    Симпатии:
    1.984
    Я тебе об этом ещё в самом начале сказал. Для этого используются события.
    OnClientAuthorized(client, const String:auth[]) опробуй и первее него.
     
    Primo нравится это.
  17. Primo

    Primo Где мои манеры

    Сообщения:
    1.191
    Симпатии:
    310
    Возникла идея.
    Какой порядок вызова функций при отключении?
    И можно ли проверить, был ли игрок в игре до того(подключился ли), когда выходит?
    Если да, то как?
    Просто получается так, что ни 1 событие не получает данные игрока раньше срабатывания функции OnClientDisconnect, т.к. игрок, который в бане, пытается подключится, а его сразу же кикает.

    Добавлено через 1 час 31 минуту
    Проблему решил путём создания дополнительной переменной. Спасибо AlmazON и R1KO за помощь.
     
    Последнее редактирование: 16 дек 2014