diff options
| author | boris <wzn@moneybot.cc> | 2018-11-28 16:00:02 +1300 |
|---|---|---|
| committer | boris <wzn@moneybot.cc> | 2018-11-28 16:00:02 +1300 |
| commit | 3d412a4b30a9f7c7f51ea6562e694315948bd3da (patch) | |
| tree | 26d67dfd1f3e5fd12903ad13e85d0cb8bcf8f21c /cheat/internal_rewrite/context.cpp | |
| parent | e4729e4393d90271a3814c7a79950a660c48325a (diff) | |
cleaned up
in short, the cheat and loader are now separate solutions. unused stuff was moved into the legacy solution in case anyone wants to compile it or whatever.
i can change this back if you want to. also, i configured the loader to compile in x64, and have separate build types for linux and win64
Diffstat (limited to 'cheat/internal_rewrite/context.cpp')
| -rw-r--r-- | cheat/internal_rewrite/context.cpp | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/cheat/internal_rewrite/context.cpp b/cheat/internal_rewrite/context.cpp new file mode 100644 index 0000000..26af64c --- /dev/null +++ b/cheat/internal_rewrite/context.cpp @@ -0,0 +1,212 @@ +#include "context.hpp" +#include "console.hpp" +#include "hooks.hpp" +#include "base_cheat.hpp" + +context::c_context g_ctx; + +NAMESPACE_REGION( context ) + +bool c_context::run_frame( ) { + m_local = g_csgo.m_entlist( )->GetClientEntity< >( + g_csgo.m_engine( )->GetLocalPlayer( ) ); + + return !!m_local; +} + +void c_context::on_cmove_end( user_cmd_t* cmd ) { + if( g_settings.menu.anti_untrusted ) + cmd->clamp( ); + + auto send = g_cheat.m_lagmgr.get_state( ); + + if( send ) { + m_last_fakeangle = cmd->m_viewangles; + + m_last_origin = m_local->m_vecOrigin( ); + } + else { + m_last_realangle = cmd->m_viewangles; + //m_last_realangle.x = m_last_fakeangle.x; + } + + if( g_cheat.m_lagmgr.get_choked( ) == 1 ) { + m_thirdperson_angle = m_last_realangle; + } + + m_thirdperson_angle.x = std::clamp( cmd->m_viewangles.x, -89.f, 89.f ); + if( g_cheat.m_lagmgr.get_sent( ) > 1 ) { + m_thirdperson_angle.y = m_last_fakeangle.y; + } + + //auto anim_state = g_cheat.m_ragebot.m_antiaim->get_animstate( ); + + + if( ( cmd->m_buttons & IN_ATTACK ) && m_local->can_attack( ) ) { + auto weap = m_local->get_weapon( ); + if( !weap->is_knife( ) && weap->m_iItemDefinitionIndex( ) != WEAPON_TASER && !weap->is_grenade( ) ) { + if( !m_has_incremented_shots && !m_has_fired_this_frame ) { + shot_data_t new_shot{ }; + new_shot.m_angle = cmd->m_viewangles; + new_shot.m_local_pos = m_local->get_eye_pos( ); + + m_last_shot++; + m_last_shot %= 128; + m_shot_data[ m_last_shot ] = new_shot; + + m_has_incremented_shots = true; + } + + m_has_fired_this_frame = true; + } + } + + auto wep = m_local->get_weapon( ); + if( wep ) { + weapon_info_t* wpn_info = m_local->get_weapon( )->get_wpn_info( ); + if( wpn_info && m_has_fired_this_frame ) + m_local->get_weapon( )->m_flNextPrimaryAttack( ) += wpn_info->cycle_time; + } + + if( g_settings.misc.log_hits( ) ) { + for( auto& it : m_shot_data ) { + if( !it.m_enemy_index ) + continue; + + if( !it.m_handled ) + break; + + if( !it.m_logged ) { + char print_str[ 100 ]{ 0 }; + memset( print_str, 0, 100 ); + + if( it.m_hit ) { + player_info_t info; + if( !g_csgo.m_engine( )->GetPlayerInfo( it.m_enemy_index, &info ) ) + continue; + + char name[ 32 ]; + auto ent = g_csgo.m_entlist( )->GetClientEntity( it.m_enemy_index ); + + ent->get_name_safe( name ); + + strenc::w_sprintf_s( print_str, 100, "[\3moneybot\1] hit %s in %s for %d\0", name, util::hitgroup_to_string( it.m_hit ).c_str( ), it.m_damage ); + } + else if( it.m_missed ) + strenc::w_sprintf_s( print_str, 100, "[\3moneybot\1] missed shot due to spread\0" ); + + g_csgo.m_clientmode( )->m_pChatElement->ChatPrintf( 0, 0, print_str ); + g_con->game_console_print( "%s\n", print_str ); + } + + it.m_logged = true; + } + } + + static float last_shot = 0.f; + if( m_has_fired_this_frame ) + last_shot = g_csgo.m_globals->m_curtime; + else if( auto weapon = g_ctx.m_local->get_weapon( ) ) { + float fire_rate = weapon->get_wpn_info( )->cycle_time; + float tolerance = util::get_total_latency( ) * 2.f + fire_rate + TICK_INTERVAL( ); + if( std::abs( last_shot - g_csgo.m_globals->m_curtime ) > tolerance ) { + reset_shot_queue( ); + last_shot = g_csgo.m_globals->m_curtime; + } + } + + + m_has_incremented_shots = false; + if( std::abs( m_last_shot - m_last_shot_ack ) >= 10 ) + reset_shot_queue( ); + + *get_last_cmd( ) = *cmd; +} + +void c_context::reset_shot_queue( ) { + auto last_shot = m_shot_data[ m_last_shot ]; + m_last_shot = m_last_shot_ack = 0; + m_shot_data = { }; + m_shot_data[ 0 ] = last_shot; +} + +//predicted servertime of player, use this for breaking lby etc +float c_context::pred_time( ) { + calculate_tickbase( ); + + return m_tickbase * g_csgo.m_globals->m_interval_per_tick; +} + +//calculate tickbase depending on whether last ucmd was predicted +bool c_context::calculate_tickbase( ) { + if ( !m_local ) { + return false; + } + + //get current tickbase + auto player_tickbase = m_local->m_nTickBase( ); + + //disabled due to our engine pred being shit + m_tickbase = player_tickbase; + return true; + + if ( m_snapshot.empty( ) ) { + m_tickbase = player_tickbase; + return false; + } + + //if cmd wasnt predicted increment tickbase + auto snap_cmd = &m_snapshot.front( ); + if ( !snap_cmd->m_predicted ) { + if ( !m_tickbase ) { + m_tickbase = player_tickbase; + } + + m_tickbase++; + snap_cmd->m_predicted = true; + } + else { + m_tickbase = player_tickbase; + } + + return true; +} + +bool c_context::precache_model( const char* model ) { + + auto cache_table = g_csgo.m_string_table( )->FindTable( "modelprecache" ); + + if( !cache_table ) + return true; + + g_csgo.m_model_info( )->FindOrLoadModel( model ); + + int string_index = cache_table->AddString( false, model ); + + if( string_index == -1 ) + return false; + + return true; +} + +//save snapshots of usercommands +bool c_context::create_snapshot( user_cmd_t* ucmd ) { + user_cmd_t ucmd_copy; + + while ( m_snapshot.size( ) >= 64 ) { + m_snapshot.pop_back( ); + } + + if ( !ucmd ) { + return false; + } + + memcpy( &ucmd_copy, + ucmd, + sizeof( ucmd_copy ) ); + + m_snapshot.push_front( ucmd_copy ); + return true; +} + +END_REGION
\ No newline at end of file |
