From b4748901d34d26bee517dea9655d2c0362c627f0 Mon Sep 17 00:00:00 2001 From: JustSomePwner Date: Fri, 14 Sep 2018 20:23:54 +0200 Subject: pAutowall --- internal_rewrite/autowall.cpp | 232 ++++++++++++++++++++++-------------------- 1 file changed, 123 insertions(+), 109 deletions(-) (limited to 'internal_rewrite/autowall.cpp') 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( nazwa ) == 0x65724243 && *reinterpret_cast( 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( 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( 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; } -- cgit v1.2.3