- Статус
- Оффлайн
- Регистрация
- 13 Фев 2026
- Сообщения
- 703
- Реакции
- 21
Наткнулся на интересный вариант реализации третьего лица (Thirdperson) в CS2 через хук. Автор называет код «костыльным» и в итоге перекатился на OverrideView, но для тех, кто копает внутренности движка и ищет альтернативные способы манипуляции камерой, этот фрагмент может быть полезен — как минимум из-за структуры оффсетов.
Суть метода заключается в перехвате функции и прямой записи в структуру CameraState.
Что по техничке:
Нюансы:
В Source 2 работа с камерой через хуки часто конфликтует с расчетом ViewMatrix или интерполяцией в OverrideView. Если у вас камера дергается или не хочет менять зум, лучше делайте через client.dll и стандартный SDK-шный метод переопределения вьюхи. Тем не менее, математика адресов здесь верная и может пригодиться при реверсе актуальных билдов.
Интересно, кто-нибудь пробовал фиксить коллизии при таком подходе или все сидят на стандартном OverrideView?
Суть метода заключается в перехвате функции и прямой записи в структуру CameraState.
Что по техничке:
- Базовый расчет CameraState:
Код:
2344LL * (int)a2 + a1 + 552 - Оффсеты внутри стейта:
- + 0x1 — Boolean (состояние активации)
- + 0x2 — Boolean (флаг интерполяции/активности)
- + 0x8 — Float (Pitch / EyeAngles.x)
- + 0xC — Float (Yaw / EyeAngles.y)
- + 0x10 — Float (Дистанция камеры)
Код:
__int64 __fastcall hooks::hkThirdperson(__int64 a1, unsigned int a2) {
__int64 Result = oThirdperson(a1, a2);
auto local = static_cast<C_CSPlayerPawn*>(sdk::GetLocalPlayer());
if (!local || !local->IsAlive())
return Result;
__int64 CameraState = 2344LL * (int)a2 + a1 + 552;
if (globals::thirdperson) {
Vec3 EyeAngles = local->GetEyeAngles();
*reinterpret_cast<bool*>(CameraState + 0x1) = true;
*reinterpret_cast<bool*>(CameraState + 0x2) = true;
*reinterpret_cast<float*>(CameraState + 0x8) = EyeAngles.x;
*reinterpret_cast<float*>(CameraState + 0xC) = EyeAngles.y;
*reinterpret_cast<float*>(CameraState + 0x10) = static_cast<float>(globals::thirdperson_dist);
}
else {
*reinterpret_cast<bool*>(CameraState + 0x1) = false;
*reinterpret_cast<bool*>(CameraState + 0x2) = false;
}
return Result;
}
Нюансы:
В Source 2 работа с камерой через хуки часто конфликтует с расчетом ViewMatrix или интерполяцией в OverrideView. Если у вас камера дергается или не хочет менять зум, лучше делайте через client.dll и стандартный SDK-шный метод переопределения вьюхи. Тем не менее, математика адресов здесь верная и может пригодиться при реверсе актуальных билдов.
Интересно, кто-нибудь пробовал фиксить коллизии при таком подходе или все сидят на стандартном OverrideView?