- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 395
- Реакции
- 8
Здарова, народ. Заметил, что у многих в последнее время посыпались списки спектаторов. В Apex это вечная тема после обновлений, когда структуры немного едут.
Решил поделиться рабочим методом через observerList. Фишка этого кода в том, что он адекватно считает не только врагов, но и палит, когда за вами присматривает ваш же тиммейт. Оффсеты в коде ниже актуальные, но если что-то отвалится — вы знаете, где искать базу.
Логика реализации:
Важное по оффсетам:
Если юзаете какой-то специфический SDK, не забудьте поправить dwEntityList и YOUR_BASE_ADDRESS под свои переменные. По моим тестам, метод стабильный, ложных срабатываний минимум.
Кто уже вшивал подобное в свои internal или external проекты, отпишитесь — как оно по производительности, если чекать каждый кадр?
Решил поделиться рабочим методом через observerList. Фишка этого кода в том, что он адекватно считает не только врагов, но и палит, когда за вами присматривает ваш же тиммейт. Оффсеты в коде ниже актуальные, но если что-то отвалится — вы знаете, где искать базу.
Логика реализации:
- Проверяем валидность локал плеера.
- Цепляем observerList (база + оффсет).
- Итерируемся по списку игроков (max 61 для Apex).
- Сверяем индекс сущности, на которую смотрит наблюдатель, с нашим localPlayer.
Код:
int CountSpectators(uintptr_t localPlayer)
{
if (!localPlayer)
return 0;
int spectators = 0;
const int maxPlayers = 61;
// Актуальный оффсет observerList
auto observerList = read<uintptr_t>(YOUR_BASE_ADDRESS + 0x6284DB8);
if (!observerList)
return 0;
for (int i = 0; i < maxPlayers; ++i)
{
auto entity = GetEntityBase(i);
if (!entity)
continue;
int playerIndex = read<int>(entity + 0x38);
int specIndex = read<int>(observerList + playerIndex * 8 + 0x954);
// Получаем сущность спектатора через EntityList
auto specEntity = read<uintptr_t>(YOUR_BASE_ADDRESS + dwEntityList + ((specIndex & 0xFFFF) << 5));
if (specEntity == localPlayer)
spectators++;
}
return spectators;
}
Важное по оффсетам:
Если юзаете какой-то специфический SDK, не забудьте поправить dwEntityList и YOUR_BASE_ADDRESS под свои переменные. По моим тестам, метод стабильный, ложных срабатываний минимум.
Кто уже вшивал подобное в свои internal или external проекты, отпишитесь — как оно по производительности, если чекать каждый кадр?