summaryrefslogtreecommitdiff
path: root/cheat/internal_rewrite/ragebot_resolver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'cheat/internal_rewrite/ragebot_resolver.cpp')
-rw-r--r--cheat/internal_rewrite/ragebot_resolver.cpp71
1 files changed, 49 insertions, 22 deletions
diff --git a/cheat/internal_rewrite/ragebot_resolver.cpp b/cheat/internal_rewrite/ragebot_resolver.cpp
index 1b29305..a5a8d50 100644
--- a/cheat/internal_rewrite/ragebot_resolver.cpp
+++ b/cheat/internal_rewrite/ragebot_resolver.cpp
@@ -315,7 +315,22 @@ namespace features
auto hdr = g_csgo.m_model_info( )->GetStudiomodel( model );
auto set = hdr->pHitboxSet( ent->m_nHitboxSet( ) );
- if( hitbox == HITBOX_HEAD ) {
+ auto do_rotate = [ ]( int box ) {
+ switch( box ) {
+ case HITBOX_HEAD:
+ case HITBOX_LEFT_FOOT:
+ case HITBOX_RIGHT_FOOT:
+ case HITBOX_LEFT_HAND:
+ case HITBOX_RIGHT_HAND:
+ case HITBOX_LEFT_CALF:
+ case HITBOX_RIGHT_CALF:
+ return true;
+
+ default: return false;
+ }
+ };
+
+ if( do_rotate( hitbox ) ) {
auto box = set->pHitbox( 0 );
if( box ) {
auto dist = box->bbmin.dist_to( box->bbmax );
@@ -331,7 +346,7 @@ namespace features
new_shot.m_hitbox.min = max;
new_shot.m_hitbox.radius = radius;
new_shot.m_missed = true;
- new_shot.m_hitgroup = HITGROUP_HEAD;
+ new_shot.m_hitgroup = util::hitbox_to_hitgroup( hitbox );
g_ctx.m_last_shot++;
g_ctx.m_last_shot %= 128;
@@ -366,7 +381,9 @@ namespace features
}
else {
matrix3x4 bone_matrix[ 128 ];
- if( model && hdr && set && ent->ce( )->SetupBones( bone_matrix, 128, 0x100, g_csgo.m_globals->m_curtime ) ) {
+ if( model && hdr && set ) {
+ memcpy( bone_matrix, ent->m_CachedBoneData( ).GetElements( ), sizeof( bone_matrix ) );
+
auto box = set->pHitbox( hitbox );
if( !box ) return;
@@ -375,32 +392,42 @@ namespace features
vec3_t shot_pos = position;
vec3_t rotated_center;
- vec3_t offset = position - origin;
- float radius = offset.length2d( );
- float cosine = offset.x / radius;
+ bool is_within = false;
+ for( float rotation = -180.f; rotation <= 180.f; rotation += 45.f ) {
+ float off = ( shot_pos - origin ).length2d( );
+ float deg = ent->ce( )->GetRenderAngles( ).y;
- float deg = RAD2DEG( acos( cosine ) );
- if( offset.y < 0 ) deg += 360.f;
+ float rot = std::remainderf( deg + rotation, 360.f );
+ if( rot < 0.f )
+ rot += 360.f;
+ rotated_center.x = origin.x + cos( DEG2RAD( rot ) ) * off;
+ rotated_center.y = origin.y + sin( DEG2RAD( rot ) ) * off;
+ rotated_center.z = position.z;
- float rot = ( deg - 180.f ) * ( M_PI / 180.f );
- rotated_center.x = origin.x + cos( rot ) * radius;
- rotated_center.y = origin.y + sin( rot ) * radius;
- rotated_center.z = position.z;
+ vec3_t ang = math::vector_angles( g_ctx.m_local->get_eye_pos( ),
+ shot_pos );
- Ray_t ray;
- CTraceFilterOneEntity filter;
- CGameTrace tr_center;
- CGameTrace tr_rot;
+ vec3_t dir = math::angle_vectors( ang );
+ vec3_t trace_pos = g_ctx.m_local->get_eye_pos( ) + dir * 8192.f;
- filter.ent = ent;
+ Ray_t ray;
+ CTraceFilterOneEntity filter;
+ CGameTrace tr_center;
+ CGameTrace tr_rot;
- ray.Init( g_ctx.m_local->get_eye_pos( ), position );
- g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_center );
+ filter.ent = ent;
- ray.Init( g_ctx.m_local->get_eye_pos( ), rotated_center );
- g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT, &filter, &tr_rot );
+ ray.Init( g_ctx.m_local->get_eye_pos( ), position );
+ g_csgo.m_trace( )->TraceRay( ray, MASK_ALL, &filter, &tr_center );
- bool is_within = tr_center.hitbox == tr_rot.hitbox;
+ ray.Init( g_ctx.m_local->get_eye_pos( ), trace_pos );
+ g_csgo.m_trace( )->TraceRay( ray, MASK_ALL, &filter, &tr_rot );
+
+ is_within = ( tr_center.hitbox == tr_rot.hitbox ) && ( tr_rot.DidHit( ) );
+
+ if( !is_within )
+ break;
+ }
if( !is_within ) {
auto dist = box->bbmin.dist_to( box->bbmax );