R1KO / VIP-Core

GNU General Public License v3.0
50 stars 34 forks source link

CSGO: Client language may not be choosen correctly. #122

Open gotgameio opened 1 year ago

gotgameio commented 1 year ago

Описание проблемы на alliedmods: https://forums.alliedmods.net/showpost.php?p=2211771&postcount=9

Если использовать GetClientLanguage() в OnClientPutInServer() без таймера, иногда это происходит в одном иногда в разных тиках по этому если язык сервера "ru" а язык клиента "en" GetClientLanguage() возвращает язык сервера а не клиента. В общем загрузку данных клиента нужно обернуть в таймер тогда все работает и язык клиента всегда определяется верно.

Clients.sp:

public void OnClientPutInServer(int iClient)
{
    //  g_iClientInfo[iClient] = 0;
    DBG_Clients("OnClientPutInServer %N (%d): %b", iClient, iClient, g_iClientInfo[iClient])

    if(!IsFakeClient(iClient) && !IsClientSourceTV(iClient))
    {
        // Clients_CheckVipAccess(iClient, true, true);
        CreateTimer(1.0, Timer_OnClientPutInServer, GetClientSerial(iClient), TIMER_FLAG_NO_MAPCHANGE);
    }
}

public Action Timer_OnClientPutInServer(Handle timer, any serial)
{
    int iClient = GetClientFromSerial(serial);
    if (iClient) 
    {
        Clients_CheckVipAccess(iClient, true, true);
    }

    return Plugin_Stop;
}
R1KO commented 1 year ago

был расчет на то, что запрос в бд сыграет роль задержки, видимо мало. Есть куча кейсов которые требуют загрузить права пораньше, и куда чтобы загрузить их позже. Я думаю как более-менее оптимальное решение будет добавить таймер именно на вывод приветственного сообщения

gotgameio commented 1 year ago

Просто на разном железе при бывает разная задержка и тд, оно через раз определяет как надо, да возможно сам таймер надо на приветствие а не на загрузку данных я еще потестирую отпишу.

CrazyHackGUT commented 1 year ago

Железо тут вообще не причём. В CS:GO язык отдельно запрашивается сервером у клиента через QueryClientConVar(); в старых играх он сразу прилетал вместе с пачкой других переменных.

gotgameio commented 1 year ago

Железо тут вообще не причём. В CS:GO язык отдельно запрашивается сервером у клиента через QueryClientConVar(); в старых играх он сразу прилетал вместе с пачкой других переменных.

Тут не железо виновато само собой, но есть рассинхрон получения языка в OnClientPutInServer, иногда он успевает придти иногда нет и используется язык сервера в этом случае, в общем рандом в некотором смысле, вычитал что таймаут даже не 1 секунду а 5 делают в этом случае, но возможно стоит вообще перенести в другое событие когда язык уже получен.