- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 770
- Реакции
- 20
Здарова, кодеры. После недавнего апдейта в CS2 (тот самый патч ag2) посыпались многие наработки, и одна из самых неприятных штук — полностью отъехал Spectator List.
Логика, которая до этого работала как часы, теперь выдает либо нули, либо не проходит валидацию хендлов. Похоже, Valve опять что-то перетряхнули в структурах пешек или обсервер-сервисов. Юзаю стандартный подход через чтение m_hObserverPawn и последующий поиск цели через m_hObserverTarget, но на выходе теперь тишина.
Сам кусок кода, на котором всё стопорится:
Грешу на то, что либо сместились оффсеты внутри m_pObserverServices, либо доступ к m_sSanitizedPlayerName теперь реализован иначе. Если кто-то уже копал свежие дампы или фиксил подобное в своих сурсах — черканите, в какую сторону копать.
Есть подозрение, что Valve в очередной раз решили усложнить жизнь создателям экстерналов через изменение линковки пешек.
Логика, которая до этого работала как часы, теперь выдает либо нули, либо не проходит валидацию хендлов. Похоже, Valve опять что-то перетряхнули в структурах пешек или обсервер-сервисов. Юзаю стандартный подход через чтение m_hObserverPawn и последующий поиск цели через m_hObserverTarget, но на выходе теперь тишина.
Сам кусок кода, на котором всё стопорится:
Код:
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 в очередной раз решили усложнить жизнь создателям экстерналов через изменение линковки пешек.