- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 682
- Реакции
- 18
Здарова, реверсеры. Пытаюсь накидать классический ESP для Day of Defeat (Source), но столкнулся с проблемой, которая уже выпила все нервы. Вроде база стандартная, типичный internal, но игра стабильно улетает в рабочий стол именно при попытке собрать скелет.
Суть такова: итерируюсь по энтити-листу, отсеиваю лишнее через ClassID, проверяю флаги, и как только дело доходит до вызова SetupBones — всё сыпется. Код в рендере выглядит примерно так:
Что уже проверял:
Есть подозрение, что проблема в IClientRenderable или я вызываю это дело не в том потоке, хотя для Source-движка это база. Возможно, стоит попробовать юзать
перед вызовом или чекать, готов ли вообще объект к отрисовке через
.
Кто плотно сидел на DoD или старых версиях сурса, подскажите, может там есть какой-то специфичный прикол с оффсетами или структурами, которые я упустил из виду при реверсе. Самое странное, что краш не моментальный, иногда пару кадров успевает отрисовать.
Интересно, не конфликтовал ли у кого-то SetupBones с многопоточностью движка при отрисовке ESP прямо из хука PaintTraverse или Surface.
Суть такова: итерируюсь по энтити-листу, отсеиваю лишнее через ClassID, проверяю флаги, и как только дело доходит до вызова SetupBones — всё сыпется. Код в рендере выглядит примерно так:
Код:
void CHacks_ESP::Render()
{
if (!I::EngineClient->IsInGame())
return;
const int nLocalIndex = I::EngineClient->GetLocalPlayer();
C_DODPlayer* plr = I::EntityList->GetClientEntity(nLocalIndex)->Cast<C_DODPlayer*>();
for (int i = 1; i <= I::EntityList->GetMaxEntities(); i++)
{
if (nLocalIndex == i)
continue;
IClientEntity* ent = I::EntityList->GetClientEntity(i);
if (!ent || ent->IsDormant())
continue;
ClientClass* pCC = ent->GetClientClass();
if (!pCC || pCC->m_ClassID != EClientClass::CDODPlayer)
continue;
C_DODPlayer* otherPlr = ent->Cast<C_DODPlayer*>();
if (otherPlr->deadflag())
continue;
matrix3x4_t bones[128];
// Крашит именно здесь
if (!otherPlr->SetupBones(bones, 128, 0x100, G::Vars->curtime))
continue;
// Рендер бокса и прочего мусора...
}
}
Что уже проверял:
- Указатели на энтити валидные, каст проходит корректно.
- Индекс локального игрока и получение ClientClass в норме.
- Пробовал менять флаг маски костей (BONE_USED_BY_HITBOX и прочие) — результат нулевой.
Есть подозрение, что проблема в IClientRenderable или я вызываю это дело не в том потоке, хотя для Source-движка это база. Возможно, стоит попробовать юзать
Код:
InvalidateBoneCache
Код:
IsRenderable
Кто плотно сидел на DoD или старых версиях сурса, подскажите, может там есть какой-то специфичный прикол с оффсетами или структурами, которые я упустил из виду при реверсе. Самое странное, что краш не моментальный, иногда пару кадров успевает отрисовать.
Интересно, не конфликтовал ли у кого-то SetupBones с многопоточностью движка при отрисовке ESP прямо из хука PaintTraverse или Surface.