Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Вопрос CS2 Spectator List — Отвал логики после обновления

Sloppy
Начинающий
Начинающий
Статус
Оффлайн
Регистрация
13 Фев 2026
Сообщения
770
Реакции
20
Здарова, кодеры. После недавнего апдейта в CS2 (тот самый патч ag2) посыпались многие наработки, и одна из самых неприятных штук — полностью отъехал Spectator List.

Логика, которая до этого работала как часы, теперь выдает либо нули, либо не проходит валидацию хендлов. Похоже, Valve опять что-то перетряхнули в структурах пешек или обсервер-сервисов. Юзаю стандартный подход через чтение m_hObserverPawn и последующий поиск цели через m_hObserverTarget, но на выходе теперь тишина.

Сам кусок кода, на котором всё стопорится:

Код:
Expand Collapse Copy
if (config.bSpectators)
{
    uint32_t obsPawnHandle = Game::Read<uint32_t>(controller + Offsets::m_hObserverPawn);
    if (obsPawnHandle != 0 && obsPawnHandle != 0xFFFFFFFF)
    {
        uintptr_t obsPawn = Game::GetEntityByHandle(obsPawnHandle);
        if (obsPawn && obsPawn != localPawn)
        {
            uintptr_t obsServices = Game::Read<uintptr_t>(obsPawn + Offsets::m_pObserverServices);
            if (obsServices)
            {
                uint32_t targetHandle = Game::Read<uint32_t>(obsServices + Offsets::m_hObserverTarget);
                if (targetHandle > 0 && targetHandle == localHandle)
                {
                    uintptr_t namePtr = Game::Read<uintptr_t>(controller + Offsets::m_sSanitizedPlayerName);
                    if (namePtr)
                    {
                        struct NameBuf { char data[32]; };
                        NameBuf buf = Game::Read<NameBuf>(namePtr);
                        buf.data[31] = '\0';
                        std::string nameStr(buf.data);
                        if (nameStr.length() > 0 && std::find(spectatorList.begin(), spectatorList.end(), nameStr) == spectatorList.end())
                            spectatorList.push_back(nameStr);
                    }
                }
            }
        }
    }
}

Грешу на то, что либо сместились оффсеты внутри m_pObserverServices, либо доступ к m_sSanitizedPlayerName теперь реализован иначе. Если кто-то уже копал свежие дампы или фиксил подобное в своих сурсах — черканите, в какую сторону копать.

Есть подозрение, что Valve в очередной раз решили усложнить жизнь создателям экстерналов через изменение линковки пешек.
 
Здарова, кодеры. После недавнего апдейта в CS2 (тот самый патч ag2) посыпались многие наработки, и одна из самых неприятных штук — полностью отъехал Spectator List.

Логика, которая до этого работала как часы, теперь выдает либо нули, либо не проходит валидацию хендлов. Похоже, Valve опять что-то перетряхнули в структурах пешек или обсервер-сервисов. Юзаю стандартный подход через чтение m_hObserverPawn и последующий поиск цели через m_hObserverTarget, но на выходе теперь тишина.

Сам кусок кода, на котором всё стопорится:

Код:
Expand Collapse Copy
if (config.bSpectators)
{
    uint32_t obsPawnHandle = Game::Read<uint32_t>(controller + Offsets::m_hObserverPawn);
    if (obsPawnHandle != 0 && obsPawnHandle != 0xFFFFFFFF)
    {
        uintptr_t obsPawn = Game::GetEntityByHandle(obsPawnHandle);
        if (obsPawn && obsPawn != localPawn)
        {
            uintptr_t obsServices = Game::Read<uintptr_t>(obsPawn + Offsets::m_pObserverServices);
            if (obsServices)
            {
                uint32_t targetHandle = Game::Read<uint32_t>(obsServices + Offsets::m_hObserverTarget);
                if (targetHandle > 0 && targetHandle == localHandle)
                {
                    uintptr_t namePtr = Game::Read<uintptr_t>(controller + Offsets::m_sSanitizedPlayerName);
                    if (namePtr)
                    {
                        struct NameBuf { char data[32]; };
                        NameBuf buf = Game::Read<NameBuf>(namePtr);
                        buf.data[31] = '\0';
                        std::string nameStr(buf.data);
                        if (nameStr.length() > 0 && std::find(spectatorList.begin(), spectatorList.end(), nameStr) == spectatorList.end())
                            spectatorList.push_back(nameStr);
                    }
                }
            }
        }
    }
}

Грешу на то, что либо сместились оффсеты внутри m_pObserverServices, либо доступ к m_sSanitizedPlayerName теперь реализован иначе. Если кто-то уже копал свежие дампы или фиксил подобное в своих сурсах — черканите, в какую сторону копать.

Есть подозрение, что Valve в очередной раз решили усложнить жизнь создателям экстерналов через изменение линковки пешек.
даже в этом посте ты умудрился заюзать ии
 
Назад
Сверху Снизу