namespace hack::core::features {
record_t::record_t( cs2::c_base_entity* target ) noexcept {
if ( !target || !cs2::g_global_vars )
return;
m_simulation_tick = cs2::g_global_vars->m_cur_time;
m_target = target;
if ( !target->m_pGameSceneNode() )
return;
m_origin = target->m_pGameSceneNode( )->m_vecOrigin( );
m_abs_origin = target->m_pGameSceneNode( )->m_vecAbsOrigin( );
m_rotation = target->m_pGameSceneNode( )->m_angRotation( );
m_abs_rotation = target->m_pGameSceneNode( )->m_angAbsRotation( );
memcpy( &m_bone_arr, *target->m_pGameSceneNode( )->get_skeleton_instance( )->m_bone_arr,
sizeof( cs2::bone_data_t ) * 128 );
}
template <typename fn_t>
void record_t::execute( cs2::c_base_entity* target, fn_t func ) noexcept {
if ( !target->m_pGameSceneNode( ) || !*target->m_pGameSceneNode( )->get_skeleton_instance( )->m_bone_arr )
return;
const auto backup_origin = target->m_pGameSceneNode( )->m_vecOrigin( );
const auto backup_abs_origin = target->m_pGameSceneNode( )->m_vecAbsOrigin( );
const auto backup_rotation = target->m_pGameSceneNode( )->m_angRotation( );
const auto backup_abs_rotation = target->m_pGameSceneNode( )->m_angAbsRotation( );
cs2::bone_data_t backup_bone_arr[ 128 ];
memcpy( &backup_bone_arr, target->m_pGameSceneNode( )->get_skeleton_instance( )->m_bone_arr,
sizeof( cs2::bone_data_t ) * 128 );
target->m_pGameSceneNode( )->m_vecOrigin( ) = m_origin;
target->m_pGameSceneNode( )->m_vecAbsOrigin( ) = m_abs_origin;
target->m_pGameSceneNode( )->m_angRotation( ) = m_rotation;
target->m_pGameSceneNode( )->m_angAbsRotation( ) = m_abs_rotation;
memcpy( *target->m_pGameSceneNode( )->get_skeleton_instance( )->m_bone_arr, &m_bone_arr,
sizeof( cs2::bone_data_t ) * 128 );
func( );
target->m_pGameSceneNode( )->m_vecOrigin( ) = backup_origin;
target->m_pGameSceneNode( )->m_vecAbsOrigin( ) = backup_abs_origin;
target->m_pGameSceneNode( )->m_angRotation( ) = backup_rotation;
target->m_pGameSceneNode( )->m_angAbsRotation( ) = backup_abs_rotation;
memcpy( *target->m_pGameSceneNode( )->get_skeleton_instance( )->m_bone_arr, &backup_bone_arr,
sizeof( cs2::bone_data_t ) * 128 );
}
void records_t::update( cs2::c_base_entity* target ) {
if ( m_records.size() >= 21 ) {
m_records.pop( );
}
m_records.push( record_t( target ) );
}
}