summaryrefslogtreecommitdiff
path: root/internal_rewrite/ragebot_resolver.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'internal_rewrite/ragebot_resolver.cpp')
-rw-r--r--internal_rewrite/ragebot_resolver.cpp55
1 files changed, 41 insertions, 14 deletions
diff --git a/internal_rewrite/ragebot_resolver.cpp b/internal_rewrite/ragebot_resolver.cpp
index 509b577..1b29305 100644
--- a/internal_rewrite/ragebot_resolver.cpp
+++ b/internal_rewrite/ragebot_resolver.cpp
@@ -90,8 +90,6 @@ namespace features
return -1.f;
};
- float start_dmg = get_damage( local_pos, enemy_pos, g_ctx.m_local, ent );
-
auto trace_ent_pos = [ & ]( vec3_t start, vec3_t end, c_base_player* ent ) {
Ray_t ray;
CGameTrace tr;
@@ -108,9 +106,14 @@ namespace features
return tr.endpos;
};
- auto test_dmg = [ & ]( float dist ) {
- vec3_t enemy_left = math::get_rotated_pos( enemy_pos, aim_angle.y - 90.f, dist );
- vec3_t enemy_right = math::get_rotated_pos( enemy_pos, aim_angle.y + 90.f, dist );
+ float local_dist = 75.f;
+ float enemy_dist = 75.f;
+
+ float start_dmg = get_damage( enemy_pos, local_pos, g_ctx.m_local, ent );
+
+ auto test_dmg = [ & ]( float dist, float enemy_dist, float delta = 50.f ) {
+ vec3_t enemy_left = math::get_rotated_pos( enemy_pos, aim_angle.y - 90.f, enemy_dist );
+ vec3_t enemy_right = math::get_rotated_pos( enemy_pos, aim_angle.y + 90.f, enemy_dist );
enemy_left = trace_ent_pos( enemy_pos, enemy_left, ent );
enemy_right = trace_ent_pos( enemy_pos, enemy_right, ent );
@@ -121,30 +124,53 @@ namespace features
local_left = trace_ent_pos( local_pos, local_left, g_ctx.m_local );
local_right = trace_ent_pos( local_pos, local_right, g_ctx.m_local );
- float dmg_left = get_damage( local_left, enemy_left, ent, g_ctx.m_local )
- + get_damage( local_right, enemy_left, ent, g_ctx.m_local );
+ float dmg_left = get_damage( local_left, enemy_left, g_ctx.m_local, ent )
+ + get_damage( local_right, enemy_left, g_ctx.m_local, ent );
- float dmg_right = get_damage( local_left, enemy_right, ent, g_ctx.m_local )
- + get_damage( local_right, enemy_right, ent, g_ctx.m_local );
+ float dmg_right = get_damage( local_left, enemy_right, g_ctx.m_local, ent )
+ + get_damage( local_right, enemy_right, g_ctx.m_local, ent );
- if( std::abs( dmg_left - dmg_right ) < 25.f )
+ if( std::abs( dmg_left - dmg_right ) < delta )
return false;
float max_dmg = math::max( dmg_left, dmg_right );
ret_dir = dmg_left > dmg_right;
cur_damage = max_dmg;
- return max_dmg > 25.f;
+ return max_dmg > delta;
};
- float dist = ( ent->m_vecOrigin( ) - ent->get_hitbox_pos( 0 ) ).length2d( );
+ float radius = std::floorf( ( g_ctx.m_local->get_hitbox_pos( 0 ) - g_ctx.m_local->get_hitbox_pos( HITBOX_PELVIS ) ).length2d( ) );
+ radius = radius >= 15.f ? 20.f : 10.f;
+
+ float enemy_radius = std::floorf( ( ent->get_hitbox_pos( 0 ) - ent->get_hitbox_pos( HITBOX_PELVIS ) ).length2d( ) );
+ enemy_radius = enemy_radius >= 15.f ? 20.f : 10.f;
- if( !test_dmg( dist + 1.f ) ) {
+ if( !test_dmg( enemy_radius + 1.f, radius + 1.f, 25.f ) ) {
if( cur_damage < start_dmg * 2.f )
return -1;
}
- if( !test_dmg( 50.f ) )
+ bool found = false;
+
+ for( size_t i = 5; i > 0; --i ) {
+ float cur_dist = local_dist / i;
+ float cur_enemy_dist = enemy_dist / i;
+
+ if( cur_dist < radius )
+ continue;
+
+ if( cur_enemy_dist < enemy_radius )
+ continue;
+
+ if( test_dmg( cur_enemy_dist, cur_dist, 125.f / i ) ) {
+ found = true;
+ break;
+ } else if( cur_damage > 125.f / i )
+ break;
+ }
+
+ if( !found )
return -1;
return ret_dir;
@@ -180,6 +206,7 @@ namespace features
m_was_invalid = false;
int freestanding = g_cheat.m_ragebot.m_resolver->try_freestanding( ent );
+
if( freestanding != -1 ) {
m_state = R_FREESTANDING;
}