From 3c72119a3c474e11f9ee819def492dcbfd1e8f84 Mon Sep 17 00:00:00 2001 From: navewindre Date: Wed, 12 Sep 2018 23:07:32 +0200 Subject: asd --- internal_rewrite/visual_player.cpp | 110 +++++++++++++++++++++++++------------ 1 file changed, 76 insertions(+), 34 deletions(-) (limited to 'internal_rewrite/visual_player.cpp') diff --git a/internal_rewrite/visual_player.cpp b/internal_rewrite/visual_player.cpp index 645417d..eeb5cca 100644 --- a/internal_rewrite/visual_player.cpp +++ b/internal_rewrite/visual_player.cpp @@ -22,6 +22,11 @@ namespace features } } + void c_visuals::reset_position( ) { + for( size_t i{ }; i < 65; ++i ) + m_anim_progress[ i ] = 0.f; + } + void c_visuals::store_hit( ) { if( !g_settings.visuals.hitmarkers ) return; @@ -96,49 +101,64 @@ namespace features int x, y, w, h; }; - box_t get_box( c_base_player* ent ) { + box_t get_box( c_base_player* ent, vec3_t stored_origin ) { const matrix3x4& matrix = ent->m_CoordinateFrame( ); - vec3_t min = ent->m_vecMins( ); - vec3_t max = ent->m_vecMaxs( ); - - std::array< vec3_t, 8 > point_list = { - vec3_t{ min.x, min.y, min.z }, - vec3_t{ min.x, max.y, min.z }, - vec3_t{ max.x, max.y, min.z }, - vec3_t{ max.x, min.y, min.z }, - vec3_t{ max.x, max.y, max.z }, - vec3_t{ min.x, max.y, max.z }, - vec3_t{ min.x, min.y, max.z }, - vec3_t{ max.x, min.y, max.z } - }; + vec2_t min_corner{ FLT_MAX, FLT_MAX }; + vec2_t max_corner{ FLT_MIN, FLT_MIN }; + + vec3_t min_pos; + vec3_t max_pos; + + matrix3x4 bone_matrix[ 128 ]; + memcpy( bone_matrix, ent->m_CachedBoneData( ).GetElements( ), ent->m_CachedBoneData( ).GetSize( ) * sizeof( matrix3x4 ) ); + + auto hdr = g_csgo.m_model_info( )->GetStudiomodel( ent->ce( )->GetModel( ) ); + + for( size_t i{ }; i < hdr->numbones; ++i ) { + auto bone = hdr->GetBone( i ); - std::array< float, 8 > x_points; - std::array< float, 8 > y_points; + if( bone && bone->parent != -1 && bone->flags & 0x100 ) { + auto& matrix = bone_matrix[ i ]; + vec3_t hitbox = vec3_t( matrix[ 0 ][ 3 ], matrix[ 1 ][ 3 ], matrix[ 2 ][ 3 ] ); + hitbox -= ent->m_vecOrigin( ); + hitbox += stored_origin; - vec2_t origin = util::screen_transform( ent->m_vecOrigin( ) ); - for( auto& it : point_list ) { - vec3_t backup = it; - for( int i{ }; i < 3; ++i ) { - it[ i ] = backup.dot( ( const vec3_t& )( matrix[ i ] ) ) + matrix[ i ][ 3 ]; + vec2_t pos = util::screen_transform( hitbox ); + + if( pos.x < min_corner.x ) + min_corner.x = pos.x; + + if( pos.x > max_corner.x ) + max_corner.x = pos.x; + + if( pos.y < min_corner.y ) + min_corner.y = pos.y; + + if( pos.y > max_corner.y ) + max_corner.y = pos.y; } } - for( size_t i{ }; i < 8; ++i ) { - vec2_t w2s = util::screen_transform( point_list[ i ] ); - x_points[ i ] = w2s.x; - y_points[ i ] = w2s.y; - } + vec2_t origin = util::screen_transform( stored_origin ); + + vec3_t origin_zoffset = stored_origin; + origin_zoffset.z += 10; - std::sort( x_points.begin( ), x_points.end( ) ); - std::sort( y_points.begin( ), y_points.end( ) ); + vec2_t delta = util::screen_transform( origin_zoffset ) - origin; - int x = ( int )x_points.front( ); - int w = ( int )x_points.back( ) - x; + min_corner.x += delta.y; + max_corner.x -= delta.y; - int y = ( int )y_points.front( ); - int h = ( int )y_points.back( ) - y; + min_corner.y += delta.y; + max_corner.y -= delta.y; + + int x = ( int )min_corner.x; + int w = ( int )( max_corner.x - min_corner.x ); + + int y = ( int )min_corner.y; + int h = ( int )( max_corner.y - min_corner.y ); return { x - ( int )origin.x, y - ( int )origin.y, w, h }; } @@ -322,6 +342,24 @@ namespace features return ret; } + void c_visuals::update_positions( ) { + CUtlVector< CSndInfo > sound_info{ }; + + g_csgo.m_engine_sound( )->GetActiveSounds( sound_info ); + + for( size_t i{ }; i < sound_info.GetSize( ); ++i ) { + auto& snd = sound_info.GetElements( )[ i ]; + + if( snd.origin ) { + int idx = snd.sound_source; + auto ent = g_csgo.m_entlist( )->GetClientEntity( idx ); + + if( ent && ent->is_player( ) && ent->ce( )->IsDormant( ) ) + update_position( idx, snd.origin[ 0 ] ); + } + } + } + void c_visuals::draw_players( ) { static constexpr float anim_rate = 1.0f / 0.3f; static float pov_progress[ 65 ]{ }; @@ -346,8 +384,7 @@ namespace features float alpha = anim; bool dormant = ent->ce( )->IsDormant( ) || !ent->has_valid_anim( ); int health = ent->m_iHealth( ); - auto origin = ent->m_vecOrigin( ); - auto box = get_box( ent ); + auto origin = ent->ce( )->GetRenderOrigin( ); int right_pos = 0; int bottom_pos = 0; bool too_distant = true; @@ -367,6 +404,8 @@ namespace features continue; } + auto box = get_box( ent, m_stored_pos[ i ] ); + clr_t col = ent->m_iTeamNum( ) == g_ctx.m_local->m_iTeamNum( ) ? g_settings.visuals.box_friendly : g_settings.visuals.box_enemy; @@ -856,6 +895,8 @@ namespace features } void c_visuals::on_round_start( ) { + reset_position( ); + m_last_roundstart = g_csgo.m_globals->m_curtime; for( size_t i{ }; i < 65; ++i ) { m_ent_dmg[ i ] = 0; @@ -967,6 +1008,7 @@ namespace features } if( g_settings.visuals.active ) { + update_positions( ); draw_players( ); } -- cgit v1.2.3