From 3c72119a3c474e11f9ee819def492dcbfd1e8f84 Mon Sep 17 00:00:00 2001 From: navewindre Date: Wed, 12 Sep 2018 23:07:32 +0200 Subject: asd --- internal_rewrite/IVEngineClient.hpp | 29 +++++++++ internal_rewrite/factory.hpp | 2 +- internal_rewrite/interface.hpp | 2 +- internal_rewrite/ragebot_lagcomp.cpp | 2 +- internal_rewrite/visual.hpp | 2 + internal_rewrite/visual_player.cpp | 110 ++++++++++++++++++++++++----------- 6 files changed, 110 insertions(+), 37 deletions(-) diff --git a/internal_rewrite/IVEngineClient.hpp b/internal_rewrite/IVEngineClient.hpp index d3a4d8f..fb39e08 100644 --- a/internal_rewrite/IVEngineClient.hpp +++ b/internal_rewrite/IVEngineClient.hpp @@ -4,6 +4,7 @@ #include "util.hpp" #include "vector.hpp" +#include "CUtlVector.hpp" using matrix3x4 = float[ 3 ][ 4 ]; @@ -162,6 +163,34 @@ public: } }; +struct CSndInfo { + int guid; + void *file_handle; + int sound_source; + int channel; + int speaker_entity; + float volume; + float last_spatilized_volume; + float radius; + int pitch; + vec3_t *origin; + vec3_t *direction; + bool update_positions; + bool is_sentence; + bool disable_dsp_processing; + bool from_speaker_entity; + bool server_sound; +}; + +class IVEngineSound { +public: + void GetActiveSounds( CUtlVector< CSndInfo >& list ) { + using fn = void( __thiscall* )( void*, CUtlVector< CSndInfo >& ); + + return util::get_vfunc< fn >( this, 18 )( this, list ); + } +}; + class IVEngineClient { public: diff --git a/internal_rewrite/factory.hpp b/internal_rewrite/factory.hpp index d197951..c81c79b 100644 --- a/internal_rewrite/factory.hpp +++ b/internal_rewrite/factory.hpp @@ -11,7 +11,7 @@ //IFACE_DLLMAIN - interfaces are passed through dllmain and below code doesnt need to be ran #ifndef _DEBUG //#define IFACE_DLLMAIN -//#define HEADER_MODULE +#define HEADER_MODULE #endif #ifdef IFACE_DLLMAIN diff --git a/internal_rewrite/interface.hpp b/internal_rewrite/interface.hpp index 577ab23..9879a4a 100644 --- a/internal_rewrite/interface.hpp +++ b/internal_rewrite/interface.hpp @@ -94,7 +94,7 @@ public: c_interface_base< ICVar > m_cvar; c_interface_base< IGameEventManager2 > m_event_mgr; c_interface_base< CHudChat > m_hud_chat; - c_interface_base< uintptr_t > m_engine_sound; + c_interface_base< IVEngineSound > m_engine_sound; c_interface_base< INetChannel > m_net_channel; c_interface_base< cvar_t > m_debug_show_spread; c_interface_base< cvar_t > m_interpolate; diff --git a/internal_rewrite/ragebot_lagcomp.cpp b/internal_rewrite/ragebot_lagcomp.cpp index 201c9be..0401f05 100644 --- a/internal_rewrite/ragebot_lagcomp.cpp +++ b/internal_rewrite/ragebot_lagcomp.cpp @@ -448,7 +448,7 @@ namespace features if( g_settings.rage.resolver( ) ) { float anim_time = ent->m_flOldSimulationTime( ) + TICK_INTERVAL( ); - if( ent->m_flSimulationTime( ) - m_flick_time[ i ] > 1.1f && !m_first_update[ i ] ) { + if( anim_time - m_flick_time[ i ] > 1.1f && !m_first_update[ i ] ) { has_updated = true; ent->m_angEyeAngles( ).y = lby; diff --git a/internal_rewrite/visual.hpp b/internal_rewrite/visual.hpp index 8df913e..79709ca 100644 --- a/internal_rewrite/visual.hpp +++ b/internal_rewrite/visual.hpp @@ -88,12 +88,14 @@ namespace features void update_glow( ); void world_modulate( ); void update_position( int index, const vec3_t& pos ); + void reset_position( ); void store_tracer( int ent_index, vec3_t shot ); void store_sound( int ent, vec3_t origin ); void store_firegrenades( int ent, vec3_t origin ); void draw_autowall( ); void draw_spread( ); void out_of_fov( c_base_player* ent, const vec3_t& pos, clr_t col ); + void update_positions( ); void store_hit( ); void radar( ); void draw_tracers( ); 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