summaryrefslogtreecommitdiff
path: root/internal_rewrite
diff options
context:
space:
mode:
authornavewindre <boneyaard@gmail.com>2018-09-12 23:07:32 +0200
committernavewindre <boneyaard@gmail.com>2018-09-12 23:07:32 +0200
commit3c72119a3c474e11f9ee819def492dcbfd1e8f84 (patch)
treeb7e52c422fbc8e96874a2876c9b82f96e7767f09 /internal_rewrite
parente8bff3fb5f484e2fb98bf157f4b85b61fdbd0620 (diff)
asd
Diffstat (limited to 'internal_rewrite')
-rw-r--r--internal_rewrite/IVEngineClient.hpp29
-rw-r--r--internal_rewrite/factory.hpp2
-rw-r--r--internal_rewrite/interface.hpp2
-rw-r--r--internal_rewrite/ragebot_lagcomp.cpp2
-rw-r--r--internal_rewrite/visual.hpp2
-rw-r--r--internal_rewrite/visual_player.cpp110
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( );
}