From 559a0f5669f537e21f3d39780e6e3d77591ff8c1 Mon Sep 17 00:00:00 2001 From: navewindre Date: Fri, 14 Sep 2018 21:46:28 +0200 Subject: a --- internal_rewrite/autowall.cpp | 527 ++++++++++++++++++----------------- internal_rewrite/ragebot_antiaim.cpp | 2 +- internal_rewrite/settings.hpp | 1 + internal_rewrite/ui.h | 6 +- internal_rewrite/ui_form.h | 2 +- internal_rewrite/visual_player.cpp | 27 +- 6 files changed, 284 insertions(+), 281 deletions(-) diff --git a/internal_rewrite/autowall.cpp b/internal_rewrite/autowall.cpp index b4d4337..5cff6b0 100644 --- a/internal_rewrite/autowall.cpp +++ b/internal_rewrite/autowall.cpp @@ -1,130 +1,131 @@ -#include - -#include "autowall.hpp" -#include "settings.hpp" -#include "context.hpp" -#include "math.hpp" - -namespace features -{ - bool c_autowall::is_armored( c_base_player* ent, int armor_value, int hitgroup ) { - if ( armor_value <= 0 ) return false; - - switch( hitgroup ) { - case HITGROUP_GENERIC: - case HITGROUP_CHEST: - case HITGROUP_STOMACH: - case HITGROUP_LEFTARM: - case HITGROUP_RIGHTARM: - return true; - case HITGROUP_HEAD: - return ent->m_bHasHelmet( ); - } - - return false; - } - - void c_autowall::trace_line( const vec3_t& start, const vec3_t& end, unsigned mask, void* ignore, CGameTrace* tr ) { - CTraceFilter filter; - Ray_t ray; - - filter.pSkip = ignore; - ray.Init( start, end ); - - g_csgo.m_trace( )->TraceRay( ray, mask, &filter, tr ); - } - - void c_autowall::scale_damage( c_base_player* ent, int hitgroup, float weapon_armor_ratio, float& damage ) { - float multiplier; - float armor_ratio; - float new_damage; - int armor; - - auto get_hitgroup_mul = []( int hitgroup ) { - switch ( hitgroup ) { - case HITGROUP_HEAD: - return 4.f; - case HITGROUP_STOMACH: - return 1.25f; - case HITGROUP_LEFTLEG: - case HITGROUP_RIGHTLEG: - return 0.75f; - } - - return 1.0f; - }; - - multiplier = get_hitgroup_mul( hitgroup ); - damage *= multiplier; - armor = ent->m_ArmorValue( ); - - 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 ) { - new_damage = damage - armor * 2.0f; - } - - damage = new_damage; - } - } - - bool c_autowall::is_breakable( IClientEntity* ent ) { -#ifdef is_breakable_ptr - static auto is_breakable_ptr = g_header.patterns.is_breakable; -#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 - - 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) - { - auto ent_class = ent->GetClientClass( ); - - if ( !ent_class ) - return false; - - auto nazwa = ent_class->m_name; - - // s/o 2 estrosterik - if ( *reinterpret_cast( nazwa ) == 0x65724243 && *reinterpret_cast( nazwa + 0x7 ) == 0x53656C62 ) - return true; - } - - return breakable; - } - - bool c_autowall::trace_to_exit( vec3_t start, vec3_t& dir, vec3_t& out_end, CGameTrace& tr, CGameTrace* exit_trace ) { +#include + +#include "autowall.hpp" +#include "settings.hpp" +#include "context.hpp" +#include "math.hpp" + +namespace features +{ + bool c_autowall::is_armored( c_base_player* ent, int armor_value, int hitgroup ) { + if ( armor_value <= 0 ) return false; + + switch( hitgroup ) { + case HITGROUP_GENERIC: + case HITGROUP_CHEST: + case HITGROUP_STOMACH: + case HITGROUP_LEFTARM: + case HITGROUP_RIGHTARM: + return true; + case HITGROUP_HEAD: + return ent->m_bHasHelmet( ); + } + + return false; + } + + void c_autowall::trace_line( const vec3_t& start, const vec3_t& end, unsigned mask, void* ignore, CGameTrace* tr ) { + CTraceFilter filter; + Ray_t ray; + + filter.pSkip = ignore; + ray.Init( start, end ); + + g_csgo.m_trace( )->TraceRay( ray, mask, &filter, tr ); + } + + void c_autowall::scale_damage( c_base_player* ent, int hitgroup, float weapon_armor_ratio, float& damage ) { + float multiplier; + float armor_ratio; + float new_damage; + int armor; + + auto get_hitgroup_mul = []( int hitgroup ) { + switch ( hitgroup ) { + case HITGROUP_HEAD: + return 4.f; + case HITGROUP_STOMACH: + return 1.25f; + case HITGROUP_LEFTLEG: + case HITGROUP_RIGHTLEG: + return 0.75f; + } + + return 1.0f; + }; + + multiplier = get_hitgroup_mul( hitgroup ); + damage *= multiplier; + armor = ent->m_ArmorValue( ); + + 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 ) { + new_damage = damage - armor * 2.0f; + } + + damage = new_damage; + } + } + + bool c_autowall::is_breakable( IClientEntity* ent ) { +#ifdef is_breakable_ptr + static auto is_breakable_ptr = g_header.patterns.is_breakable; +#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 + + 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 ) + { + auto ent_class = ent->GetClientClass( ); + + 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 ) + return true; + } + + return breakable; + } + + 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; - + Ray_t ray; + while ( dist <= 90.f ) { - dist += 4.0f; - - out_end = start + ( dir * dist ); - + dist += 4.0f; + + out_end = start + ( dir * dist ); + 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 ); + 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 ); - + + 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; @@ -133,7 +134,7 @@ namespace features 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; @@ -141,8 +142,8 @@ namespace features } continue; - } - + } + if ( exit_trace->DidHit( ) && !exit_trace->startsolid ) { if ( is_breakable( tr.m_pEnt ) && is_breakable( exit_trace->m_pEnt ) ) @@ -155,8 +156,8 @@ namespace features } continue; - } - + } + 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 ) ) @@ -165,167 +166,167 @@ namespace features exit_trace->endpos = out_end + dir; return true; } - } - } - - return false; - } - - bool c_autowall::handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ) { - - 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; - } + } + } + + return false; + } + + bool c_autowall::handle_bullet_penetration( weapon_info_t* wpn_data, fire_bullet_data_t& data ) { + + 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; + } bool is_light_surf = ( data.enter_trace.contents >> 7 ) & 1; - bool is_solid_surf = ( data.enter_trace.contents >> 3 ) & 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; + 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; - 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; + 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 */ ) + 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 ) + else if( is_light_surf || is_solid_surf ) { pen_mod = 1.0f; damage_mod = 0.16f; - } + } - if ( enter_material == exit_material ) + if( enter_material == exit_material ) { - if ( exit_material == cardboard || exit_material == wood ) + 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( 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 ); - - if ( data.current_damage <= 0.f ) - return false; - - data.src = exit_trace.endpos; - data.penetrate_count--; - - return true; - } - - 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.trace_length = 0.f; - - if( !wep_data ) - return false; - - data.current_damage = ( float )( wep_data->damage ); - - while( data.penetrate_count > 0 && data.current_damage > 1.0f ) { - if ( !ent_check ) { - data.trace_length_remaining = data.length_to_end - data.trace_length; - } - else { - data.trace_length_remaining = wep_data->range - data.trace_length; - } - - vec3_t end = data.src + data.direction * data.trace_length_remaining; - trace_line( data.src, end, MASK_SHOT | CONTENTS_GRATE, shooter, &data.enter_trace ); - - util::clip_trace_to_player( target->ce( ), data.src, end + data.direction * 40.f, MASK_SHOT | CONTENTS_GRATE, &data.filter, &data.enter_trace ); - - if( data.enter_trace.fraction == 1.0f ) { - if( !ent_check ) { - data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; - data.current_damage *= std::pow( wep_data->range_modifier, data.trace_length * 0.002f ); - - if( scale ) - scale_damage( target, HITGROUP_HEAD, wep_data->armor_ratio, data.current_damage ); - return true; - } - - break; - } - - - if( data.enter_trace.hitgroup <= HITGROUP_RIGHTLEG && data.enter_trace.hitgroup >= HITGROUP_HEAD - && data.enter_trace.m_pEnt == target->ce( ) ) { - data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; - data.current_damage *= std::pow( wep_data->range_modifier, data.trace_length * 0.002f ); - - auto enemy = ( c_base_player* )( data.enter_trace.m_pEnt ); - - if( scale ) - scale_damage( enemy, data.enter_trace.hitgroup, wep_data->armor_ratio, data.current_damage ); - - return true; - } - + 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 ); + + if( data.current_damage <= 0.f ) + return false; + + data.src = exit_trace.endpos; + data.penetrate_count--; + + return true; + } + + 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.trace_length = 0.f; + + if( !wep_data ) + return false; + + data.current_damage = ( float )( wep_data->damage ); + + while( data.penetrate_count > 0 && data.current_damage > 1.0f ) { + if ( !ent_check ) { + data.trace_length_remaining = data.length_to_end - data.trace_length; + } + else { + data.trace_length_remaining = wep_data->range - data.trace_length; + } + + vec3_t end = data.src + data.direction * data.trace_length_remaining; + trace_line( data.src, end, MASK_SHOT | CONTENTS_GRATE, shooter, &data.enter_trace ); + + util::clip_trace_to_player( target->ce( ), data.src, end + data.direction * 40.f, MASK_SHOT | CONTENTS_GRATE, &data.filter, &data.enter_trace ); + + if( data.enter_trace.fraction == 1.0f ) { + if( !ent_check ) { + data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; + data.current_damage *= std::pow( wep_data->range_modifier, data.trace_length * 0.002f ); + + if( scale ) + scale_damage( target, HITGROUP_HEAD, wep_data->armor_ratio, data.current_damage ); + return true; + } + + break; + } + + + if( data.enter_trace.hitgroup <= HITGROUP_RIGHTLEG && data.enter_trace.hitgroup >= HITGROUP_HEAD + && data.enter_trace.m_pEnt == target->ce( ) ) { + data.trace_length += data.enter_trace.fraction * data.trace_length_remaining; + data.current_damage *= std::pow( wep_data->range_modifier, data.trace_length * 0.002f ); + + auto enemy = ( c_base_player* )( data.enter_trace.m_pEnt ); + + 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.trace_length > 3000.f || enter_surface->game.penetrationmodifier <= 0.1f ) - data.penetrate_count = 0; - - if( !handle_bullet_penetration( wep_data, data ) ) - break; - } - - return false; - } - - float c_autowall::run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check ) { - if( !shooter || !target ) { - return 0.f; - } - - auto wep = shooter->get_weapon( ); - if( !wep ) { - return 0.f; - } - - fire_bullet_data_t data; - data.filter.pSkip = shooter; - - if( shooter == g_ctx.m_local ) { - data.src = shooter->get_eye_pos( ); - } - else { - data.src = shooter->m_vecOrigin( ); - data.src.z += 72.f; - } - - data.length_to_end = ( end - data.src ).length( ); - - 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 ) ) { - return data.current_damage; - } - - return 0.f; - } -} + data.penetrate_count = 0; + + if( !handle_bullet_penetration( wep_data, data ) ) + break; + } + + return false; + } + + float c_autowall::run( c_base_player* shooter, c_base_player* target, const vec3_t& end, bool ent_check ) { + if( !shooter || !target ) { + return 0.f; + } + + auto wep = shooter->get_weapon( ); + if( !wep ) { + return 0.f; + } + + fire_bullet_data_t data; + data.filter.pSkip = shooter; + + if( shooter == g_ctx.m_local ) { + data.src = shooter->get_eye_pos( ); + } + else { + data.src = shooter->m_vecOrigin( ); + data.src.z += 72.f; + } + + data.length_to_end = ( end - data.src ).length( ); + + 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 ) ) { + return std::max( data.current_damage, 0.f ); + } + + return 0.f; + } +} diff --git a/internal_rewrite/ragebot_antiaim.cpp b/internal_rewrite/ragebot_antiaim.cpp index a80ecda..1a269d2 100644 --- a/internal_rewrite/ragebot_antiaim.cpp +++ b/internal_rewrite/ragebot_antiaim.cpp @@ -256,7 +256,7 @@ namespace features if( fix_forward_move ) m_cmd->m_forwardmove *= -1.f; - if( g_ctx.m_local->m_nMoveType( ) != MOVETYPE_LADDER ) { + if( g_ctx.m_local->m_nMoveType( ) != MOVETYPE_LADDER && g_settings.rage.fix_legs( ) ) { if( m_cmd->m_forwardmove ) { m_cmd->m_buttons &= ~( m_cmd->m_forwardmove < 0 ? IN_FORWARD : IN_BACK ); m_cmd->m_buttons |= ( m_cmd->m_forwardmove > 0 ? IN_FORWARD : IN_BACK ); diff --git a/internal_rewrite/settings.hpp b/internal_rewrite/settings.hpp index f963c7a..8586f78 100644 --- a/internal_rewrite/settings.hpp +++ b/internal_rewrite/settings.hpp @@ -273,6 +273,7 @@ namespace data con_var< int > edge_dtc_moving{ &holder_, fnv( "rage_edge_dtc_moving" ), 100 }; con_var< int > edge_dtc_priority{ &holder_, fnv( "rage_edge_dtc_priority" ), 0 }; con_var< bool > edge_break_lby{ &holder_, fnv( "rage_edge_break_lby" ) }; + con_var< bool > fix_legs{ &holder_, true }; con_var< bool > break_lby{ &holder_, fnv( "rage_break_lby" ), 0 }; con_var< int > lby_delta{ &holder_, fnv( "rage_lby_delta" ), 180 }; diff --git a/internal_rewrite/ui.h b/internal_rewrite/ui.h index 5a8855c..247a0d5 100644 --- a/internal_rewrite/ui.h +++ b/internal_rewrite/ui.h @@ -369,13 +369,15 @@ namespace ui auto left_column = std::make_shared< ui::base_item >( 0, 0, 0, 0 ); auto right_column = std::make_shared< ui::base_item >( 220, -5, 0, 0 ); - auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 110, xors( "main" ), 110 ); { + auto main_form = std::make_shared< ui::c_form >( 0, 0, 215, 131, xors( "main" ), 131 ); { main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "enabled" ), &g_settings.rage.anti_aim ) ); main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "at players" ), &g_settings.rage.at_players ) ); main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "dormant check" ), &g_settings.rage.dormant_check ) ); main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "angle step" ), &g_settings.rage.angle_step ) ); main_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, 0, 45, &g_settings.rage.angle_step_degrees ) )->set_cond( [ ]( ) { return g_settings.rage.angle_step( ); } ); + + main_form->add_item( std::make_shared< ui::c_checkbox >( 0, 0, xors( "fix leg movement" ), &g_settings.rage.fix_legs ) ); } auto pitch_form = std::make_shared< ui::c_form >( 0, 0, 215, 60, xors( "pitch" ) ); { @@ -384,7 +386,7 @@ namespace ui [ ]( ) { return g_settings.rage.pitch == 1 || g_settings.rage.pitch == 4 || g_settings.rage.pitch == 5; } ); } - auto yaw_form = std::make_shared< ui::c_form >( 0, 0, 215, 211, xors( "yaw" ), 211 ); { + auto yaw_form = std::make_shared< ui::c_form >( 0, 0, 215, 190, xors( "yaw" ), 190 ); { yaw_form->add_item( std::make_shared< ui::c_dropdown< > >( 0, 0, 140, xors( "real yaw" ), &g_settings.rage.real_yaw, &dropdowns::antiaim_yaw ) ); yaw_form->add_item( std::make_shared< ui::c_slider< int > >( 0, 0, 140, -180, 180, &g_settings.rage.real_yaw_add( ) ) )->set_cond( [ ]( ) { return !!g_settings.rage.real_yaw( ); } ); diff --git a/internal_rewrite/ui_form.h b/internal_rewrite/ui_form.h index e9841e4..9dbe68e 100644 --- a/internal_rewrite/ui_form.h +++ b/internal_rewrite/ui_form.h @@ -105,7 +105,7 @@ namespace ui scroll_state > 0 ? m_scroll_offset += 13 : m_scroll_offset -= 13; } } - m_scroll_offset = std::clamp( m_scroll_offset, -( get_total_item_height( ) - m_height + 3 ), 0 ); + m_scroll_offset = std::min< int >( std::max< int >( m_scroll_offset, -( get_total_item_height( ) - m_height + 3 ) ), 0 ); } else { m_scroll_offset = 0; diff --git a/internal_rewrite/visual_player.cpp b/internal_rewrite/visual_player.cpp index ae3d52c..8c824e9 100644 --- a/internal_rewrite/visual_player.cpp +++ b/internal_rewrite/visual_player.cpp @@ -142,17 +142,21 @@ namespace features } vec2_t origin = util::screen_transform( stored_origin ); - - vec3_t origin_zoffset = stored_origin; - origin_zoffset.z += 10; + if( max_corner.y > 1 && max_corner.x > 1 && min_corner.y < screen_h && min_corner.x < screen_w ) { + vec3_t origin_zoffset = stored_origin; + origin_zoffset.z += 10; - vec2_t delta = util::screen_transform( origin_zoffset ) - origin; + vec2_t delta = util::screen_transform( origin_zoffset ) - origin; - min_corner.x += delta.y; - max_corner.x -= delta.y; + min_corner.x += delta.y; + max_corner.x -= delta.y; - min_corner.y += delta.y; - max_corner.y -= delta.y; + min_corner.y += delta.y; + max_corner.y -= delta.y; + } + else { + return { -100, -100, 0, 0 }; + } int x = ( int )min_corner.x; int w = ( int )( max_corner.x - min_corner.x ); @@ -160,7 +164,7 @@ namespace features int y = ( int )min_corner.y; int h = ( int )( max_corner.y - min_corner.y ); - return { x - ( int )origin.x, y - ( int )origin.y, w, h }; + return { x, y, w, h }; } void c_visuals::out_of_fov( c_base_player* ent, const vec3_t& pos, clr_t col ) { @@ -414,11 +418,6 @@ namespace features col.a( ) *= anim; } - auto w2s_cur_origin = util::screen_transform( m_stored_pos[ i ] ); - - box.x += w2s_cur_origin.x; - box.y += w2s_cur_origin.y; - if( box.x > screen_w || box.x + box.w < 0 || box.y > screen_h || box.y + box.h < 0 ) { if( g_settings.visuals.out_of_pov ) { -- cgit v1.2.3