void local_animations::update_fake_animations()
{
auto alloc = !local_data.animstate;
auto change = !alloc && handle != &g_ctx.local()->GetRefEHandle(); //-V807
auto reset = !alloc && !change && g_ctx.local()->m_flSpawnTime() != spawntime; //-V550
if (change)
m_memalloc()->Free(local_data.animstate);
if (reset)
{
util::reset_state(local_data.animstate);
spawntime = g_ctx.local()->m_flSpawnTime();
}
if (alloc || change)
{
local_data.animstate = (c_baseplayeranimationstate*)m_memalloc()->Alloc(sizeof(c_baseplayeranimationstate));
if(local_data.animstate)
util::create_state(local_data.animstate, g_ctx.local());
handle = (CBaseHandle*)&g_ctx.local()->GetRefEHandle();
spawntime = g_ctx.local()->m_flSpawnTime();
}
if (!alloc && !change && !reset && fake_server_update)
{
float pose_parameter[24]; //-V688
memcpy(pose_parameter, &g_ctx.local()->m_flPoseParameter(), 24 * sizeof(float));
AnimationLayer layers[13]; //-V688
memcpy(layers, g_ctx.local()->get_animlayers(), g_ctx.local()->animlayer_count() * sizeof(AnimationLayer));
auto backup_frametime = m_globals()->m_frametime; //-V807
auto backup_curtime = m_globals()->m_curtime;
m_globals()->m_frametime = m_globals()->m_intervalpertick;
m_globals()->m_curtime = g_ctx.local()->m_flSimulationTime();
local_data.animstate->m_pBaseEntity = g_ctx.local();
util::update_state(local_data.animstate, local_animations::get().local_data.fake_angles);
local_data.animstate->m_bInHitGroundAnimation = false;
local_data.animstate->m_fLandingDuckAdditiveSomething = 0.0f;
local_data.animstate->m_flHeadHeightOrOffsetFromHittingGroundAnimation = 1.0f;
g_ctx.local()->invalidate_bone_cache();
g_ctx.local()->setup_bones_rebuilt(g_ctx.globals.fake_matrix, BONE_USED_BY_ANYTHING);
local_data.visualize_lag = g_cfg.player.visualize_lag;
if (!local_data.visualize_lag)
{
for (auto& i : g_ctx.globals.fake_matrix)
{
i[0][3] -= g_ctx.local()->GetRenderOrigin().x; //-V807
i[1][3] -= g_ctx.local()->GetRenderOrigin().y;
i[2][3] -= g_ctx.local()->GetRenderOrigin().z;
}
}
m_globals()->m_frametime = backup_frametime;
m_globals()->m_curtime = backup_curtime;
memcpy(&g_ctx.local()->m_flPoseParameter(), pose_parameter, 24 * sizeof(float));
memcpy(g_ctx.local()->get_animlayers(), layers, g_ctx.local()->animlayer_count() * sizeof(AnimationLayer));
}
}