From 716be28826ac61491944490373402c39123a1d75 Mon Sep 17 00:00:00 2001 From: navewindre Date: Mon, 3 Dec 2018 22:03:34 +0100 Subject: boris is cool --- cheat/internal_rewrite/ragebot_resolver.cpp | 71 ++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 22 deletions(-) (limited to 'cheat/internal_rewrite/ragebot_resolver.cpp') 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 ); -- cgit v1.2.3