summaryrefslogtreecommitdiff
path: root/internal_rewrite/autowall.cpp
diff options
context:
space:
mode:
authorJustSomePwner <crotchyalt@gmail.com>2018-09-14 20:23:54 +0200
committerJustSomePwner <crotchyalt@gmail.com>2018-09-14 20:23:54 +0200
commitb4748901d34d26bee517dea9655d2c0362c627f0 (patch)
tree911dfd98e52727a2a6bdccef028ce982d8fadbca /internal_rewrite/autowall.cpp
parent7800db47f2cd00c4c01b002d85ec2c4c61e578e4 (diff)
pAutowall
Diffstat (limited to 'internal_rewrite/autowall.cpp')
-rw-r--r--internal_rewrite/autowall.cpp232
1 files changed, 123 insertions, 109 deletions
diff --git a/internal_rewrite/autowall.cpp b/internal_rewrite/autowall.cpp
index b546cbd..b4d4337 100644
--- a/internal_rewrite/autowall.cpp
+++ b/internal_rewrite/autowall.cpp
@@ -76,73 +76,95 @@ namespace features
static auto is_breakable_ptr = pattern::first_code_match( g_csgo.m_chl.dll( ), xors( "55 8B EC 51 56 8B F1 85 F6 74 68 83 BE" ) );
#endif
- auto& v2 = *reinterpret_cast< uint8_t* >( uintptr_t( ent ) + 0x27c );
- uint8_t backup_value = v2;
-
- auto clientclass = ent->GetClientClass( );
- if( clientclass->m_class_id != CFuncBrush && clientclass->m_class_id != CBaseDoor )
- v2 = 2;
+ if ( !ent || ent->GetIndex( ) == 0 )
+ return false;
auto is_breakable_fn = reinterpret_cast< bool( __thiscall* )( void* ) >( is_breakable_ptr );
- bool is_breakable = is_breakable_fn( ent );
- v2 = backup_value;
+ bool breakable = is_breakable_fn( ent );
- return is_breakable;
- }
+ if ( !breakable)
+ {
+ auto ent_class = ent->GetClientClass( );
- bool c_autowall::trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ) {
- float dist = 0.f;
- CTraceFilter filter;
- Ray_t ray, ray_2;
+ if ( !ent_class )
+ return false;
- float step = 4.f;
- if( g_settings.rage.preserve_fps( ) && util::is_low_fps( ) )
- step = 8.f;
+ auto nazwa = ent_class->m_name;
- while( dist <= 90.f ) {
- // This may seem retarded to you, but it will help frame-rate a lot
- // and the accuracy loss is almost negligible. You can remove this if
- // you want to.
-
- dist += step;
-
- out_end = start + dir * dist;
-
- int contents = g_csgo.m_trace( )->GetPointContents( out_end, MASK_SHOT_HULL | CONTENTS_HITBOX );
+ // s/o 2 estrosterik
+ if ( *reinterpret_cast<uint32_t*>( nazwa ) == 0x65724243 && *reinterpret_cast<uint32_t*>( nazwa + 0x7 ) == 0x53656C62 )
+ return true;
+ }
- if( contents & MASK_SHOT_HULL && !( contents & CONTENTS_HITBOX ) )
- continue;
+ return breakable;
+ }
- ray.Init( out_end, out_end - dir * step );
- g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL | CONTENTS_HITBOX, 0, exit_trace );
+ bool c_autowall::trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ) {
+ float dist = 0.f;
+ int old_contents = 0;
+
+ Ray_t ray;
- if( exit_trace->startsolid && exit_trace->surface.flags & SURF_HITBOX ) {
- filter.pSkip = exit_trace->m_pEnt;
+ while ( dist <= 90.f )
+ {
+ dist += 4.0f;
- ray_2.Init( out_end, start );
- g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL, &filter, exit_trace );
+ out_end = start + ( dir * dist );
- if( exit_trace->DidHit( ) && !exit_trace->startsolid ) {
- out_end = exit_trace->endpos;
- return true;
- }
+ if ( !old_contents )
+ old_contents = g_csgo.m_trace( )->GetPointContents( out_end, MASK_SHOT_HULL | CONTENTS_HITBOX );
+
+ int contents = g_csgo.m_trace( )->GetPointContents( out_end, MASK_SHOT_HULL | CONTENTS_HITBOX );
+
+ if ( contents & MASK_SHOT_HULL && ( !( contents & CONTENTS_HITBOX ) || old_contents == contents ) )
+ continue;
+
+ vec3_t end = out_end - ( dir * 4.0f );
+ ray.Init( out_end, end );
+
+ g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL | CONTENTS_HITBOX, nullptr, exit_trace );
+
+ if ( exit_trace->startsolid && exit_trace->surface.flags & SURF_HITBOX )
+ {
+ CTraceFilter filter;
+ filter.pSkip = exit_trace->m_pEnt;
+
+ ray.Init( out_end, start );
+
+ g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL, &filter, exit_trace );
+
+ if ( exit_trace->DidHit( ) && !exit_trace->startsolid )
+ {
+ out_end = exit_trace->endpos;
+ return true;
+ }
+
+ continue;
}
- else if( !exit_trace->DidHit( ) || exit_trace->startsolid ) {
- if( tr.m_pEnt && tr.m_pEnt->GetIndex( ) ) {
- if( is_breakable( tr.m_pEnt ) )
- return true;
- start = tr.endpos;
- }
+ if ( exit_trace->DidHit( ) && !exit_trace->startsolid )
+ {
+ if ( is_breakable( tr.m_pEnt ) && is_breakable( exit_trace->m_pEnt ) )
+ return true;
+
+ if ( tr.surface.flags & SURF_NODRAW || !( exit_trace->surface.flags & SURF_NODRAW ) && ( exit_trace->plane.normal.dot( dir ) <= 1.f ) )
+ {
+ out_end -= dir * ( exit_trace->fraction * 4.f );
+ return true;
+ }
+
+ continue;
}
- else if( ( ( exit_trace->surface.flags >> 7 ) & 1 ) && !( ( tr.surface.flags >> 7 ) & 1 ) )
- continue;
- else if( exit_trace->plane.normal.dot( dir ) <= 1.0f ) {
- auto fraction = exit_trace->fraction * step;
- out_end = out_end - dir * fraction;
- return true;
+ if ( !exit_trace->DidHit( ) || exit_trace->startsolid )
+ {
+ if ( tr.m_pEnt && tr.m_pEnt != g_csgo.m_entlist( )->GetClientEntity<IClientEntity>( 0 ) && is_breakable( exit_trace->m_pEnt ) )
+ {
+ *exit_trace = tr;
+ exit_trace->endpos = out_end + dir;
+ return true;
+ }
}
}
@@ -150,67 +172,62 @@ namespace features
}
bool c_autowall::handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ) {
- surfacedata_t* enter_surface_data = g_csgo.m_phys_props( )->GetSurfaceData( data.enter_trace.surface.surfaceProps );
- int enter_material = enter_surface_data->game.material;
- float enter_surf_penetration_mod = enter_surface_data->game.penetrationmodifier;
- data.trace_length += data.enter_trace.fraction * data.trace_length_remaining;
- data.current_damage *= static_cast<float>( pow( wpn_data->range_modifier, data.trace_length * 0.002 ) );
+ vec3_t pen_end;
+ CGameTrace exit_trace;
- if( data.trace_length > 3000.f || enter_surf_penetration_mod < 0.1f )
- data.penetrate_count = 0;
-
- if( data.penetrate_count <= 0 )
- return false;
-
- vec3_t out_end;
- CGameTrace trace_exit;
- if( !trace_to_exit( data.enter_trace.endpos, data.direction, out_end, data.enter_trace, &trace_exit ) )
- return false;
-
- surfacedata_t* exit_surface_data = g_csgo.m_phys_props( )->GetSurfaceData( trace_exit.surface.surfaceProps );
-
- int exit_material = exit_surface_data->game.material;
- float exit_surf_penetration_mod = exit_surface_data->game.penetrationmodifier;
-
- float final_damage_modifier = 0.16f;
- float combined_penetration_modifier = 0.0f;
-
- if( ( data.enter_trace.contents & CONTENTS_GRATE ) != 0 || enter_material == 89 || enter_material == 71 ) {
- combined_penetration_modifier = 3.0f;
- final_damage_modifier = 0.05f;
+ if ( !trace_to_exit( data.enter_trace.endpos, data.direction, pen_end, data.enter_trace, &exit_trace ) )
+ {
+ if ( !( g_csgo.m_trace( )->GetPointContents( pen_end, MASK_SHOT_HULL ) & MASK_SHOT_HULL ) )
+ return false;
}
- else {
- combined_penetration_modifier = ( enter_surf_penetration_mod + exit_surf_penetration_mod ) * 0.5f;
+
+ bool is_light_surf = ( data.enter_trace.contents >> 7 ) & 1;
+ bool is_solid_surf = ( data.enter_trace.contents >> 3 ) & 1;
+
+ auto exit_surface = g_csgo.m_phys_props( )->GetSurfaceData( exit_trace.surface.surfaceProps );
+ auto enter_surface = g_csgo.m_phys_props( )->GetSurfaceData( data.enter_trace.surface.surfaceProps );
+
+ if ( !exit_surface || !enter_surface )
+ return false;
+
+ int exit_material = exit_surface->game.material, enter_material = enter_surface->game.material;
+
+ auto damage_mod = 0.16f;
+ auto pen_mod = ( enter_surface->game.penetrationmodifier + exit_surface->game.penetrationmodifier ) * 0.5f;
+
+ constexpr uint32_t grate = 71, wood = 85, plastic = 76, glass = 89, cardboard = 87;
+
+ if ( enter_material == grate /* metal vents */ || enter_material == glass /* windows */ )
+ {
+ pen_mod = 3.0f;
+ damage_mod = 0.05f;
+ }
+ else if ( is_light_surf || is_solid_surf )
+ {
+ pen_mod = 1.0f;
+ damage_mod = 0.16f;
}
-
- if( enter_material == exit_material ) {
- if( exit_material == 87 || exit_material == 85 )
- combined_penetration_modifier = 3.0f;
- else if( exit_material == 76 )
- combined_penetration_modifier = 2.0f;
+
+ if ( enter_material == exit_material )
+ {
+ if ( exit_material == cardboard || exit_material == wood )
+ pen_mod = 3.0f;
+ else if ( exit_material == plastic )
+ pen_mod = 2.0f;
}
- float modifier = fmaxf( 0.f, 1.0f / combined_penetration_modifier );
- float taken_damage = ( data.current_damage * final_damage_modifier ) + modifier * 3.0f * fmaxf( 0.0f,
- ( float )( 3.0 / ( wpn_data->penetration ) ) * 1.25f );
- float thickness = ( trace_exit.endpos - data.enter_trace.endpos ).lengthsqr( );
-
- thickness *= modifier;
- thickness *= 0.041666668f;
+ float thickness = exit_trace.endpos.dist_to( data.enter_trace.endpos );
- float lost_damage = fmaxf( 0.0f, taken_damage + thickness );
-
- if( lost_damage > data.current_damage )
- return false;
+ auto modifier = math::max( 0.f, 1.0f / pen_mod );
+ auto modified_penetration = ( ( modifier * 3.0f ) * math::max( 0.f, ( 3.0f / wpn_data->penetration ) * 1.25f ) + ( data.current_damage * damage_mod ) ) + ( ( ( thickness * thickness ) * modifier ) / 24.f );
- if( lost_damage >= 0.0f )
- data.current_damage -= lost_damage;
+ data.current_damage -= math::max( 0.f, modified_penetration );
- if( data.current_damage < 1.0f )
+ if ( data.current_damage <= 0.f )
return false;
- data.src = trace_exit.endpos;
+ data.src = exit_trace.endpos;
data.penetrate_count--;
return true;
@@ -258,14 +275,6 @@ namespace features
data.current_damage *= std::pow( wep_data->range_modifier, data.trace_length * 0.002f );
auto enemy = ( c_base_player* )( data.enter_trace.m_pEnt );
- auto cl = enemy->ce( )->GetClientClass( );
- if( cl->m_class_id != CCSPlayer ) {
- return false;
- }
-
- if( shooter->m_iTeamNum( ) == enemy->m_iTeamNum( ) && !g_settings.rage.friendlies ) {
- return false;
- }
if( scale )
scale_damage( enemy, data.enter_trace.hitgroup, wep_data->armor_ratio, data.current_damage );
@@ -273,6 +282,11 @@ namespace features
return true;
}
+ auto enter_surface = g_csgo.m_phys_props( )->GetSurfaceData( data.enter_trace.surface.surfaceProps );
+
+ if ( data.trace_length > 3000.f || enter_surface->game.penetrationmodifier <= 0.1f )
+ data.penetrate_count = 0;
+
if( !handle_bullet_penetration( wep_data, data ) )
break;
}