diff options
| author | Unknown <azeem@live.ru> | 2018-11-14 18:29:12 +0000 |
|---|---|---|
| committer | Unknown <azeem@live.ru> | 2018-11-14 18:29:12 +0000 |
| commit | bd82cca68225a25396f2400965956ea9ee518d70 (patch) | |
| tree | 1648f42d53ba437af36ec20fdade068c5a347698 /internal_rewrite/autowall.cpp | |
| parent | 5e5b152f4b62432655cc4069c1d95be636749b7d (diff) | |
fuck this
Diffstat (limited to 'internal_rewrite/autowall.cpp')
| -rw-r--r-- | internal_rewrite/autowall.cpp | 139 |
1 files changed, 70 insertions, 69 deletions
diff --git a/internal_rewrite/autowall.cpp b/internal_rewrite/autowall.cpp index 042c74c..603f94e 100644 --- a/internal_rewrite/autowall.cpp +++ b/internal_rewrite/autowall.cpp @@ -5,12 +5,13 @@ #include "context.hpp"
#include "math.hpp"
-namespace features
-{
+
+
+namespace features {
bool c_autowall::is_armored( c_base_player* ent, int armor_value, int hitgroup ) {
if ( armor_value <= 0 ) return false;
- switch( hitgroup ) {
+ switch ( hitgroup ) {
case HITGROUP_GENERIC:
case HITGROUP_CHEST:
case HITGROUP_STOMACH:
@@ -58,42 +59,42 @@ namespace features damage *= multiplier;
armor = ent->m_ArmorValue( );
- if( is_armored( ent, armor, hitgroup ) ) {
+ if ( is_armored( ent, armor, hitgroup ) ) {
armor_ratio = weapon_armor_ratio * 0.5f;
new_damage = damage * armor_ratio;
- if( hitgroup != HITGROUP_HEAD && damage - damage * armor_ratio * 0.5f > armor ) {
+ if ( hitgroup != HITGROUP_HEAD && damage - damage * armor_ratio * 0.5f > armor ) {
new_damage = damage - armor * 2.0f;
}
damage = new_damage;
}
}
-
+
bool c_autowall::is_breakable( IClientEntity* ent ) {
-#ifdef is_breakable_ptr
+ #ifdef is_breakable_ptr
static auto is_breakable_ptr = g_header.patterns.is_breakable;
-#else
+ #else
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
+ #endif
- if( !ent || ent->GetIndex( ) == 0 )
+ if ( !ent || ent->GetIndex( ) == 0 )
return false;
auto is_breakable_fn = reinterpret_cast< bool( __thiscall* )( void* ) >( is_breakable_ptr );
bool breakable = is_breakable_fn( ent );
- if( !breakable ) {
+ if ( !breakable ) {
auto ent_class = ent->GetClientClass( );
- if( !ent_class )
+ if ( !ent_class )
return false;
// s/o 2 poiak
auto nazwa = ent_class->m_name;
// s/o 2 estrosterik
- if( *reinterpret_cast< uint32_t* >( nazwa ) == 0x65724243 && *reinterpret_cast< uint32_t* >( nazwa + 0x7 ) == 0x53656C62 )
+ if ( *reinterpret_cast< uint32_t* >( nazwa ) == 0x65724243 && *reinterpret_cast< uint32_t* >( nazwa + 0x7 ) == 0x53656C62 )
return true;
}
@@ -106,18 +107,16 @@ namespace features Ray_t ray;
- while( dist <= 90.f ) {
+ while ( dist <= 90.f ) {
dist += 4.0f;
out_end = start + ( dir * dist );
- if( !old_contents )
+ 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 ) )
+ if ( contents & MASK_SHOT_HULL && ( !( contents & CONTENTS_HITBOX ) || old_contents == contents ) )
continue;
vec3_t end = out_end - ( dir * 4.0f );
@@ -126,7 +125,7 @@ namespace features g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL | CONTENTS_HITBOX, nullptr, exit_trace );
- if( exit_trace->startsolid && exit_trace->surface.flags & SURF_HITBOX ) {
+ if ( exit_trace->startsolid && exit_trace->surface.flags & SURF_HITBOX ) {
CTraceFilter filter;
filter.pSkip = exit_trace->m_pEnt;
@@ -134,7 +133,7 @@ namespace features g_csgo.m_trace( )->TraceRay( ray, MASK_SHOT_HULL, &filter, exit_trace );
- if( exit_trace->DidHit( ) && !exit_trace->startsolid ) {
+ if ( exit_trace->DidHit( ) && !exit_trace->startsolid ) {
out_end = exit_trace->endpos;
return true;
}
@@ -145,7 +144,7 @@ namespace features // maps/cs_office/glass/urban_glass
const char* surface_name = tr.surface.name;
- if( surface_name
+ if ( surface_name
&& *( uint32_t* )( &surface_name[ 0 ] ) == 0x7370616d
&& *( uint32_t* )( &surface_name[ 4 ] ) == 0x5f73632f
&& *( uint32_t* )( &surface_name[ 8 ] ) == 0x6966666f
@@ -160,11 +159,11 @@ namespace features return true;
}
- if( exit_trace->DidHit( ) && !exit_trace->startsolid ) {
- if( is_breakable( tr.m_pEnt ) && is_breakable( tr.m_pEnt ) )
+ if ( exit_trace->DidHit( ) && !exit_trace->startsolid ) {
+ if ( is_breakable( tr.m_pEnt ) && is_breakable( tr.m_pEnt ) )
return true;
- if( tr.surface.flags & SURF_NODRAW || !( exit_trace->surface.flags & SURF_NODRAW ) && ( exit_trace->plane.normal.dot( dir ) <= 1.f ) ) {
+ 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;
}
@@ -172,8 +171,8 @@ namespace features continue;
}
- if( !exit_trace->DidHit( ) || exit_trace->startsolid ) {
- if( tr.m_pEnt && tr.m_pEnt != g_csgo.m_entlist( )->GetClientEntity< void >( 0 ) && is_breakable( exit_trace->m_pEnt ) ) {
+ if ( !exit_trace->DidHit( ) || exit_trace->startsolid ) {
+ if ( tr.m_pEnt && tr.m_pEnt != g_csgo.m_entlist( )->GetClientEntity< void >( 0 ) && is_breakable( exit_trace->m_pEnt ) ) {
*exit_trace = tr;
exit_trace->endpos = out_end + dir;
return true;
@@ -189,10 +188,11 @@ namespace features vec3_t pen_end;
CGameTrace exit_trace;
- 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;
+
+
+ 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;
}
bool is_light_surf = ( data.enter_trace.contents >> 7 ) & 1;
@@ -201,7 +201,7 @@ namespace features 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 )
+ if ( !exit_surface || !enter_surface )
return false;
int exit_material = exit_surface->game.material, enter_material = enter_surface->game.material;
@@ -211,33 +211,35 @@ namespace features constexpr uint32_t grate = 71, wood = 85, plastic = 76, glass = 89, cardboard = 87;
- if( enter_material == grate /* metal vents */ || enter_material == glass /* windows */ )
- {
+ 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 )
- {
+ } else if ( is_light_surf || is_solid_surf ) {
pen_mod = 1.0f;
damage_mod = 0.16f;
}
- if( enter_material == exit_material )
- {
- if( exit_material == cardboard || exit_material == wood )
+ if ( enter_material == exit_material ) {
+ if ( exit_material == cardboard || exit_material == wood )
pen_mod = 3.0f;
- else if( exit_material == plastic )
+ else if ( exit_material == plastic )
pen_mod = 2.0f;
}
- float thickness = exit_trace.endpos.dist_to( data.enter_trace.endpos );
+ float thickness = exit_trace.endpos.dist_to_sqr( data.enter_trace.endpos );
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 );
- data.current_damage -= math::max( 0.f, modified_penetration );
+ auto lost_dmg = std::fmaxf(
+ ( ( modifier * thickness ) / 24.f )
+ + ( ( data.current_damage * damage_mod )
+ + ( std::fmaxf( 3.75f / wpn_data->penetration, 0.f ) * 3.f * modifier ) ), 0.f );
+
- if( data.current_damage <= 0.f )
+ if ( lost_dmg > 0.f )
+ data.current_damage -= lost_dmg;
+
+ if ( data.current_damage < 1.f )
return false;
data.src = exit_trace.endpos;
@@ -247,16 +249,18 @@ namespace features }
bool c_autowall::fire_bullet( c_base_player* shooter, c_base_player* target, weapon_info_t* wep_data, fire_bullet_data_t& data, bool ent_check, bool scale ) {
- data.penetrate_count = 4;
+ data.penetrate_count = 4;
- if( !wep_data )
+ if ( !wep_data )
return false;
data.current_damage = ( float )( wep_data->damage );
- while ( data.penetrate_count > 0 && data.current_damage > 1.0f )
- {
- data.to_travel -= data.traveled;
+ while ( data.penetrate_count > 0 && data.current_damage >= 1.0f ) {
+ // this little nigga all along.
+ // never trust the feds.
+ // or even fluffy people.
+ data.to_travel = data.travel_range - data.traveled;
vec3_t end = data.src + data.direction * data.to_travel;
trace_line( data.src, end, MASK_SHOT | CONTENTS_GRATE, shooter, &data.enter_trace );
@@ -265,9 +269,9 @@ namespace features data.traveled += data.to_travel * data.enter_trace.fraction;
data.current_damage *= std::pow( wep_data->range_modifier, data.traveled * 0.002f );
- if( data.enter_trace.fraction == 1.0f ) {
- if( !ent_check ) {
- if( scale )
+ if ( data.enter_trace.fraction == 1.0f ) {
+ if ( !ent_check ) {
+ if ( scale )
scale_damage( target, HITGROUP_HEAD, wep_data->armor_ratio, data.current_damage );
return true;
@@ -276,21 +280,21 @@ namespace features }
- if( data.enter_trace.hitgroup <= HITGROUP_RIGHTLEG && data.enter_trace.hitgroup >= HITGROUP_HEAD
+ if ( data.enter_trace.hitgroup <= HITGROUP_RIGHTLEG && data.enter_trace.hitgroup >= HITGROUP_HEAD
&& data.enter_trace.m_pEnt == target->ce( ) ) {
auto enemy = ( c_base_player* )( data.enter_trace.m_pEnt );
- if( scale )
+ if ( scale )
scale_damage( enemy, data.enter_trace.hitgroup, wep_data->armor_ratio, data.current_damage );
return true;
}
auto enter_surface = g_csgo.m_phys_props( )->GetSurfaceData( data.enter_trace.surface.surfaceProps );
- if ( data.traveled > 3000.f || enter_surface->game.penetrationmodifier <= 0.1f )
- data.penetrate_count = 0;
+ if ( data.traveled > 3000.f || enter_surface->game.penetrationmodifier < 0.1f )
+ break;
- if( !handle_bullet_penetration( wep_data, data ) )
+ if ( !handle_bullet_penetration( wep_data, data ) )
break;
}
@@ -298,39 +302,36 @@ namespace features }
float c_autowall::run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check ) {
- if( !shooter || !target ) {
+ if ( !shooter || !target ) {
return 0.f;
}
auto wep = shooter->get_weapon( );
- if( !wep ) {
+ if ( !wep ) {
return 0.f;
}
fire_bullet_data_t data;
data.filter.pSkip = shooter;
- if( shooter == g_ctx.m_local ) {
+ if ( shooter == g_ctx.m_local ) {
data.src = shooter->get_eye_pos( );
- }
- else {
+ } else {
data.src = shooter->m_vecOrigin( );
data.src.z += 72.f;
}
- data.travel_range = ( end - data.src ).length( );
+ data.direction = end - data.src;
+ data.travel_range = data.direction.length( );
+ data.direction.normalize_vector( );
data.traveled = 0.f;
data.to_travel = data.travel_range;
- vec3_t angles = math::vector_angles( data.src, end );
- data.direction = math::angle_vectors( angles );
-
- data.direction.normalize_vector( );
- if( fire_bullet( shooter, target, wep->get_wpn_info( ), data, ent_check ) ) {
+ if ( fire_bullet( shooter, target, wep->get_wpn_info( ), data, ent_check ) ) {
return std::max( data.current_damage, 0.f );
}
return 0.f;
}
-}
\ No newline at end of file +}
|
