Начинающий
-
Автор темы
- #1
Приветсвую! Кто может подсказать, как зафиксить вьюмодль в лв3? я немогу понять, где лежат все необходимые оффесеты для него
if (g_cfg.esp.viewmodel_x)
{
auto viewX = (float)g_cfg.esp.viewmodel_x / 2.0f;
static auto viewXcvar = m_cvar()->FindVar(crypt_str("viewmodel_offset_x"));
if (viewXcvar->GetFloat() != viewX) //-V550
{
*(float*)((DWORD)&viewXcvar->m_fnChangeCallbacks + 0xC) = 0.0f;
viewXcvar->SetValue(viewX);
}
}
ограничение самой игрой, выше значения не можешь ставить, нужен офсет чтобы заработало обратноа что с ним не так?
я знаю, что я тупой, но у меня не получается подобрать нужные оффесеты для xyz. можешь, пожалуйста, помочь?я не понимаю как ты не можешь найти оффсета на это, просто посмотри как вьюмодел вызывается у тя в чите, вот для лв, это неправильный, показал где он
ограничение самой игрой, выше значения не можешь ставить, нужен офсет чтобы заработало обратноmisc.cpp:if (g_cfg.esp.viewmodel_x) { auto viewX = (float)g_cfg.esp.viewmodel_x / 2.0f; static auto viewXcvar = m_cvar()->FindVar(crypt_str("viewmodel_offset_x")); if (viewXcvar->GetFloat() != viewX) //-V550 { *(float*)((DWORD)&viewXcvar->m_fnChangeCallbacks + 0xC) = 0.0f; viewXcvar->SetValue(viewX); } }
// #STR: "ConVarBackups", "viewmodel_offset_fov"
// module: client.dll; sig: 55 8B EC 83 E4 F8 A1 ?? ?? ?? ?? 83 EC 08 B9 ?? ?? ?? ?? FF 50 ?? 6A 00 85 C0 74 23 83 EC 08 C7 44 24 04 00 00 88
void __cdecl hooks::hk_viewmodel_fov_callback( ) {
return;
}
void __fastcall hooks::hk_override_view( void* ecx, void* edx, c_view_setup* setup_view ) {
const auto view_model = i::m_entity_list->get_client_entity_from_handle( ctx::local( )->get_view_model( ) );
c_vec3 forward{}, right{}, up{};
math::angle_vectors( view_model->get_abs_angles( ), &forward, &right, &up );
static const auto set_pos_fn = reinterpret_cast< void( __thiscall* )( void*, const c_vec3& ) >(
utils::sig( m::m_client_dll, _( "55 8B EC 83 E4 F8 51 53 56 57 8B F1 E8" ) ) );
set_pos_fn( view_model, view_model->get_abs_origin( ) + forward * forward_factor + up * up_factor + right * right_factor );
}
//module: client.dll; sig: 55 8B EC 8B 45 08 F3 0F 7E 45
int __fastcall hooks::hk_set_viewmodel( void* ecx, void* edx, int unk, float x, float y, float z ) {
if ( g_cfg.m_misc.m_change_viewmodel ) {
x = static_cast< float >( g_cfg.m_misc.m_viewmodel_x );
y = static_cast< float >( g_cfg.m_misc.m_viewmodel_y );
z = static_cast< float >( g_cfg.m_misc.m_viewmodel_z );
}
return og::m_set_viewmodel( ecx, edx, unk, x, y, z );
}
О, спасибо, такое мне надоValve ограничивает число переменных, когда ты пытаешься изменить квар.
Это работает не со всеми кварами, а с некоторыми, например: cl_interp, cl_updaterate, cl_interp_ratio и другие.
Вот код лимита значения на примере viewmodel_fov:
Посмотреть вложение 233069
Посмотреть вложение 233070
Многие исходники форсят нулевое значение переменной ChangeCallback — это правильно, но есть и ряд других реализаций обхода.
И вместо такой реализации я предлагаю свои способы:
1 способ
Выше я привел скрин, на котором мы видим лимит значений, почему бы просто не перехватить функцию и просто "удалить" код возврата.
2 способC++:// #STR: "ConVarBackups", "viewmodel_offset_fov" // module: client.dll; sig: 55 8B EC 83 E4 F8 A1 ?? ?? ?? ?? 83 EC 08 B9 ?? ?? ?? ?? FF 50 ?? 6A 00 85 C0 74 23 83 EC 08 C7 44 24 04 00 00 88 void __cdecl hooks::hk_viewmodel_fov_callback( ) { return; }
В хуке OverrideView пишем подобный код:
3 способC++:void __fastcall hooks::hk_override_view( void* ecx, void* edx, c_view_setup* setup_view ) { const auto view_model = i::m_entity_list->get_client_entity_from_handle( ctx::local( )->get_view_model( ) ); c_vec3 forward{}, right{}, up{}; math::angle_vectors( view_model->get_abs_angles( ), &forward, &right, &up ); static const auto set_pos_fn = reinterpret_cast< void( __thiscall* )( void*, const c_vec3& ) >( utils::sig( m::m_client_dll, _( "55 8B EC 83 E4 F8 51 53 56 57 8B F1 E8" ) ) ); set_pos_fn( view_model, view_model->get_abs_origin( ) + forward * forward_factor + up * up_factor + right * right_factor ); }
Мы можем перехватить функцию, которая выставляет значения viewmodel`a и модифицировать их под себя.
4 способC++://module: client.dll; sig: 55 8B EC 8B 45 08 F3 0F 7E 45 int __fastcall hooks::hk_set_viewmodel( void* ecx, void* edx, int unk, float x, float y, float z ) { if ( g_cfg.m_misc.m_change_viewmodel ) { x = static_cast< float >( g_cfg.m_misc.m_viewmodel_x ); y = static_cast< float >( g_cfg.m_misc.m_viewmodel_y ); z = static_cast< float >( g_cfg.m_misc.m_viewmodel_z ); } return og::m_set_viewmodel( ecx, edx, unk, x, y, z ); }
Мы можем хукнуть sv_competitive_minspec. Кода не будет — задача для читателя.
Подсказка на первом скрине.
Ого, спасибо, что все подробно объяснил и предложил несколько способов. Я же думал что мне никто толком не расскажет :)Valve ограничивает число переменных, когда ты пытаешься изменить квар.
Это работает не со всеми кварами, а с некоторыми, например: cl_interp, cl_updaterate, cl_interp_ratio и другие.
Вот код лимита значения на примере viewmodel_fov:
Посмотреть вложение 233069
Посмотреть вложение 233070
Многие исходники форсят нулевое значение переменной ChangeCallback — это правильно, но есть и ряд других реализаций обхода.
И вместо такой реализации я предлагаю свои способы:
1 способ
Выше я привел скрин, на котором мы видим лимит значений, почему бы просто не перехватить функцию и просто "удалить" код возврата.
2 способC++:// #STR: "ConVarBackups", "viewmodel_offset_fov" // module: client.dll; sig: 55 8B EC 83 E4 F8 A1 ?? ?? ?? ?? 83 EC 08 B9 ?? ?? ?? ?? FF 50 ?? 6A 00 85 C0 74 23 83 EC 08 C7 44 24 04 00 00 88 void __cdecl hooks::hk_viewmodel_fov_callback( ) { return; }
В хуке OverrideView пишем подобный код:
3 способC++:void __fastcall hooks::hk_override_view( void* ecx, void* edx, c_view_setup* setup_view ) { const auto view_model = i::m_entity_list->get_client_entity_from_handle( ctx::local( )->get_view_model( ) ); c_vec3 forward{}, right{}, up{}; math::angle_vectors( view_model->get_abs_angles( ), &forward, &right, &up ); static const auto set_pos_fn = reinterpret_cast< void( __thiscall* )( void*, const c_vec3& ) >( utils::sig( m::m_client_dll, _( "55 8B EC 83 E4 F8 51 53 56 57 8B F1 E8" ) ) ); set_pos_fn( view_model, view_model->get_abs_origin( ) + forward * forward_factor + up * up_factor + right * right_factor ); }
Мы можем перехватить функцию, которая выставляет значения viewmodel`a и модифицировать их под себя.
4 способC++://module: client.dll; sig: 55 8B EC 8B 45 08 F3 0F 7E 45 int __fastcall hooks::hk_set_viewmodel( void* ecx, void* edx, int unk, float x, float y, float z ) { if ( g_cfg.m_misc.m_change_viewmodel ) { x = static_cast< float >( g_cfg.m_misc.m_viewmodel_x ); y = static_cast< float >( g_cfg.m_misc.m_viewmodel_y ); z = static_cast< float >( g_cfg.m_misc.m_viewmodel_z ); } return og::m_set_viewmodel( ecx, edx, unk, x, y, z ); }
Мы можем хукнуть sv_competitive_minspec. Кода не будет — задача для читателя.
Подсказка на первом скрине.
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz