using o_camera_process_t = void(__thiscall*)(void* cam, vec3d* cam_pos, float x, float y, float z);
inline o_camera_process_t o_camera_process{};
#define HOOK( target, hook, original ) \
if ( MH_CreateHook( sdk::address_t{ target }.as< LPVOID >( ), \
reinterpret_cast< LPVOID >( &hook ), reinterpret_cast< LPVOID* >( &original ) ) != MH_OK ) \
THROW_IF_DBG( "can't hook " #hook "." ) \
// хукую вращение камеры во время прицеливания
HOOK((void*)0x00521500, hooks::camera_process, hooks::o_camera_process);
void __fastcall camera_process(void* cam, void* unused, vec3d* cam_pos, float x, float y, float z) {
// cam_pos использую для получения позиции камеры
// стоит знать что это не 0x46F730 который из собейта
// 0x46F730 > cam_pos
vec3d world_coords{ 1,2,3 }; // любые координаты чтобы направить на нее прицел
const auto crosshair_pos = (float*)0xB6EC10;
const auto mult = tan(TheCamera.FindCamFOV() * 0.5f * 0.017453292f);
auto delta_vec = *cam_pos - world_coords;
float f_x = 3.14f - atan2(1.0f, mult * (crosshair_pos[1] - 0.5f + crosshair_pos[1] - 0.5f));
float yaw = atan2f(delta_vec.y, -delta_vec.x) - 3.14f / 2;
*(float*)0xB6F258 = -(yaw - f_x);
o_camera_process(cam, cam_pos, x, y, z);
}