Client index -x is invalid

DarkerZ

Участник
Сообщения
395
Реакции
175
приведу часть кода:
C-подобный:
#define EW_MODULE_OFFLINE_EBAN

public void OnClientPostAdminCheck(int iClient)
{
    if(!IsValidClient(iClient) || !IsClientConnected(iClient) || IsFakeClient(iClient)) return;
    #if defined EW_MODULE_OFFLINE_EBAN
    EWM_OfflineEban_OnClientPostAdminCheck(iClient);
    #endif
    int iFlags = GetUserFlagBits(iClient);
    if(iFlags & ADMFLAG_KICK || iFlags & ADMFLAG_ROOT) g_bIsAdmin[iClient] = true;
}

stock bool IsValidClient(int iClient)
{
    if (iClient > 0 && iClient <= MaxClients && IsValidEdict(iClient) && IsClientInGame(iClient)) return true;
    return false;
}

public void EWM_OfflineEban_OnClientPostAdminCheck(int iClient)
{
    if(IsClientSourceTV(iClient)) return; //ignore SourceTV
    char sClient_Name[32], sClient_SteamID[64];
    int iUserID = GetClientUserId(iClient);
    GetClientName(iClient, sClient_Name, MAX_NAME_LENGTH);
    GetClientAuthId(iClient, AuthId_Steam2, sClient_SteamID, sizeof(sClient_SteamID));
    bool bNotFound = true;
    for(int i = 0; i < g_OfflineArray.Length; i++)
    {
        class_Offline_Eban OfflinePlayerTest;
        g_OfflineArray.GetArray(i, OfflinePlayerTest, sizeof(OfflinePlayerTest));
        if(StrEqual(OfflinePlayerTest.Player_SteamID, sClient_SteamID, false))
        {
            bNotFound = false;
            OfflinePlayerTest.UserID = iUserID;
            FormatEx(OfflinePlayerTest.PlayerName, sizeof(OfflinePlayerTest.PlayerName), "%s", sClient_Name);
            OfflinePlayerTest.TimeStamp = -1;
            OfflinePlayerTest.TimeStamp_Start = -1;
            FormatEx(OfflinePlayerTest.LastItem, sizeof(OfflinePlayerTest.LastItem), "None");
            g_OfflineArray.SetArray(i, OfflinePlayerTest, sizeof(OfflinePlayerTest));
            break;
        }
    }
    if(bNotFound)
    {
        class_Offline_Eban NewOfflinePlayer;
        NewOfflinePlayer.UserID = iUserID;
        FormatEx(NewOfflinePlayer.PlayerName, sizeof(NewOfflinePlayer.PlayerName), "%s", sClient_Name);
        FormatEx(NewOfflinePlayer.Player_SteamID, sizeof(NewOfflinePlayer.Player_SteamID), "%s", sClient_SteamID);
        NewOfflinePlayer.TimeStamp = -1;
        NewOfflinePlayer.TimeStamp_Start = -1;
        FormatEx(NewOfflinePlayer.LastItem, sizeof(NewOfflinePlayer.LastItem), "None");
        g_OfflineArray.PushArray(NewOfflinePlayer, sizeof(NewOfflinePlayer));
    }
}
и в Errorlog возникают следующие ошибки:
Exception reported: Client index -2016298800 is invalid на строчку GetClientAuthId(iClient, AuthId_Steam2, sClient_SteamID, sizeof(sClient_SteamID));
Exception reported: Client index 0 is invalid на строчку int iFlags = GetUserFlagBits(iClient);
хотя все проверки сделаны до вызова функций. и да первая ошибка всегда выдаёт один и тот же невалидный индекс, на другом сервере индекс отличается, но так же один и тот же, грубо говоря зависит от сервера.
помогите разобраться, спасибо заранее
 
Решение
GetClientName(iClient, sClient_Name, MAX_NAME_LENGTH);
А теперь магия. Знаете, почему обычно используют sizeof() при передаче размера буфера?
C-подобный:
#define MAX_NAME_LENGTH 128 /**< Maximum buffer required to store a client name */
Вы вполне спокойно могли выйти за пределы массива и случайно перетереть свой индекс при чтении ника.

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #2
GetClientName(iClient, sClient_Name, MAX_NAME_LENGTH);
А теперь магия. Знаете, почему обычно используют sizeof() при передаче размера буфера?
C-подобный:
#define MAX_NAME_LENGTH 128 /**< Maximum buffer required to store a client name */
Вы вполне спокойно могли выйти за пределы массива и случайно перетереть свой индекс при чтении ника.
 
Решение
Сверху Снизу