// ne nu mnogo lishnih vizovov etc...
// ubral cuz oni ne nuzni dopusim
// if ( !(*(*engine + 108))(engine) || !(*(*engine + 104))(engine) )
// return original_setup_bones(ecx, bones, max_bones, mask, time);
// kak bi za4em eto nuzno esli func vse ravno called tolko esli in game & connected
// esli pereputal kakuu to 4ast koda s musorom to uvi 4elikam nuzno nau4itsya kodit....
// pastit gethades ksta kruto
matrix3x4_t unk[128] = {};
void updateeeeee(int stage) {
if (stage != 5)
return;
if (!local
|| !local->is_alive())
return;
auto state = local->get_anim_state();
if (!state)
return;
auto sub_14020 = []() -> bool {
static auto dword_97004 = 0;
if ( dword_97004 == globals->m_tickcount )
return false;
dword_97004 = globals->m_tickcount;
return true;
};
static auto abs_yaw = state->m_goal_feet_yaw;
static std::array<float, 24> poses = {};
static std::array<c_animation_layer, 15> layers = {};
if (sub_14020()) {
layers = local->get_anim_layers();
local->update_anim_state(state, cmd->m_viewangles);
if (send_packet){
abs_yaw = state->m_goal_feet_yaw;
poses = local->get_pose_params();
allow_bones = true;
local->setup_bones(unk, 128, 0x0007FF00, 0);
allow_bones = false;
auto origin = local->get_render_origin();
for (int i = 0; i < 128; i++ ) {
unk[i][0][3] -= origin.x;
unk[i][1][3] -= origin.y;
unk[i][2][3] -= origin.z;
}
}
}
if (state->m_last_client_side_animation_update_framecount == globals->m_framecount)
--state->m_last_client_side_animation_update_framecount; // 4ota kakoi prikol ne smeshnoi 4elik to no cap 2 raz obnovit ho4et
local->update_client_side_animation(); // za4em 2 raz to call emae -_________-
local->set_abs_angles(qangle_t(0.f, abs_yaw, 0.f));
local->set_anim_layers(layers);
local->set_pose_params(poses);
}
bool __fastcall sub_29F80(i_client_renderable* ecx, void* edx, matrix3x4_t* bones, int max_bones, int mask, int time) {
auto entity = ecx->get_client_unknown()->get_base_entity();
if (!entity
|| !entity->is_player())
return original(ecx, bones, max_bones, mask, time);
if (time == 0.f)
time = player->get_simulation_time();
if (entity != local) // 0___o
return original(ecx, bones, max_bones, mask, time);
if (!allow_bones) {
if (bones) {
auto origin = ecx->get_render_origin();
for (int i = 0; i < 128; i++ ) {
unk[i][0][3] += origin.x;
unk[i][1][3] += origin.y;
unk[i][2][3] += origin.z;
}
bones->set(unk, 128);
return true;
}
return original(ecx, bones, max_bones, mask, time);
}
*(int*)((uintptr_t)entity + 0xA68) = 0;
*(int*)((uintptr_t)ecx + 0x269C) = 0;
mask |= 0x200;
static const auto ogo = cvar->find_var("r_jiggle_bones");
auto dword_1985D4 = ogo->get_int();
ogo->set_value(0);
entity->get_effects() |= 8;
*(int*)((uintptr_t)entity + 0xA68) = 0;
static const auto force_bone = netvars::get_offset("DT_BaseAnimating", "m_nForceBone");
*(int*)((uintptr_t)entity + force_bone + 0x20) = 0;
static const auto invalidate_bone_cache_fn = (void( __fastcall*)( void* ))(find_sig("client_panorama.dll", "80 3D ?? ?? ?? ?? ?? 74 16 A1 ?? ?? ?? ?? 48 C7 81"));
invalidate_bone_cache_fn(entity);
auto v10 = original(ecx, bones, max_bones, mask, time);
entity->get_effects() &= ~8;
ogo->set_value(dword_1985D4);
return v10;
}