summaryrefslogtreecommitdiff
path: root/cheat/tf2/CBasePlayer.cpp
diff options
context:
space:
mode:
authorboris <wzn@moneybot.cc>2018-11-28 16:00:02 +1300
committerboris <wzn@moneybot.cc>2018-11-28 16:00:02 +1300
commit3d412a4b30a9f7c7f51ea6562e694315948bd3da (patch)
tree26d67dfd1f3e5fd12903ad13e85d0cb8bcf8f21c /cheat/tf2/CBasePlayer.cpp
parente4729e4393d90271a3814c7a79950a660c48325a (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/tf2/CBasePlayer.cpp')
-rw-r--r--cheat/tf2/CBasePlayer.cpp264
1 files changed, 264 insertions, 0 deletions
diff --git a/cheat/tf2/CBasePlayer.cpp b/cheat/tf2/CBasePlayer.cpp
new file mode 100644
index 0000000..a5860ac
--- /dev/null
+++ b/cheat/tf2/CBasePlayer.cpp
@@ -0,0 +1,264 @@
+#include "CBasePlayer.h"
+#include "sdk.h"
+#include <string>
+#include "math.h"
+#include "graphics.h"
+#include "CBaseWeapon.h"
+#include "ClientClass.h"
+#include "IVEngineClient.h"
+
+vec3_t c_base_player::get_eye_pos( ) {
+ vec3_t offset = get_view_offset( );
+ vec3_t origin = get_origin( );
+ return offset + origin;
+}
+
+uintptr_t c_base_player::get_player_resource( ) {
+ for( int i{ 1 }; i < cl.m_entlist( )->get_highest_entity_index( ); ++i ) {
+ auto ent = cl.m_entlist( )->get_client_entity< IClientEntity >( i );
+ if( !ent ) continue;
+ auto class_ = ent->GetClientClass( );
+ if( class_ ) {
+ if( class_->m_class_id == CTFPlayerResource ) {
+ return uintptr_t( ent );
+ }
+ }
+ }
+
+ return 0;
+}
+
+player_info_t c_base_player::get_info( ) {
+ player_info_t info;
+ cl.m_engine( )->GetPlayerInfo( ce( )->index( ), &info );
+
+ return info;
+}
+
+void c_base_player::get_name_safe( char* buf ) {
+ player_info_t info;
+ if( cl.m_engine( )->GetPlayerInfo( this->ce( )->index( ), &info ) ) {
+ for( size_t i{ }; i < 32; ++i ) {
+ switch( info.name[ i ] ) {
+ case '"':
+ case '\\':
+ case ';':
+ case '\n':
+ buf[ i ] = ' ';
+ break;
+ default:
+ buf[ i ] = info.name[ i ];
+ break;
+ }
+ }
+
+ buf[ 31 ] = 0;
+ }
+}
+
+uintptr_t c_base_player::get_game_rules( ) {
+ static uintptr_t** game_rules = pattern::first_code_match< uintptr_t** >( cl.m_chl.dll( ), xors( "A1 ? ? ? ? 85 C0 0F 84 ? ? ? ? 80 B8 ? ? ? ? ? 0F 84 ? ? ? ? 0F 10 05" ), 0x1 );
+ return **game_rules;
+}
+
+bool c_base_player::is_valid( ) {
+ auto local = cl.m_entlist( )->get_local_player( );
+ return ( this != local && !is_dormant( ) && is_alive( ) && GetClientClass( )->m_class_id == CTFPlayer );
+}
+
+vec3_t c_base_player::get_origin( ) {
+ return m_vecOrigin( );
+}
+
+vec3_t c_base_player::get_view_offset( ) {
+ return m_vecViewOffset( );
+}
+
+vec3_t c_base_player::get_eye_angles( ) {
+ return m_angEyeAngles( );
+}
+
+vec3_t c_base_player::get_velocity( ) {
+ return m_vecVelocity( );
+}
+
+vec3_t c_base_player::get_bone_position( int bone ) {
+ matrix3x4 matrix[ 128 ];
+
+ setup_bones( matrix, 128, 0x100, cl.m_globals->curtime );
+
+ return vec3_t( matrix[ bone ][ 0 ][ 3 ], matrix[ bone ][ 1 ][ 3 ], matrix[ bone ][ 2 ][ 3 ] );
+}
+
+// bye fps lol
+vec3_t c_base_player::get_hitbox_position( int hitbox ) {
+ const auto model = get_model( );
+ if ( !model ) return vec3_t{ };
+
+ auto hdr = cl.m_modelinfo( )->GetStudioModel( model );
+ if ( !hdr ) return vec3_t{ };
+
+ matrix3x4 matrix[ 128 ];
+ if ( !setup_bones( matrix, 128, 0x100, cl.m_globals->curtime ) ) return vec3_t{ };
+
+ auto set = hdr->pHitboxSet( m_nHitboxSet( ) );
+ if ( !set ) return vec3_t{ };
+
+ auto box = set->pHitbox( hitbox );
+
+ vec3_t hitbox_center = ( box->bbmin + box->bbmax ) * 0.5f;
+
+ vec3_t transformed = math::vector_transform( hitbox_center, matrix[ box->bone ] );
+
+ return transformed;
+}
+
+int c_base_player::get_team( ) {
+ return m_iTeamNum( );
+}
+
+bool c_base_player::is_enemy( ) {
+ auto local = g_ctx.m_local;
+ if ( !local ) return false;
+ return get_team( ) != local->get_team( );
+}
+
+int c_base_player::get_class( ) {
+ int class_num = m_iClass( );
+ return std::clamp( class_num, 0, 10 ); //to prevent crashes if its out of bounds
+}
+
+const char* c_base_player::get_class_name( ) {
+ static const char* tf2_class_names[ ] = {
+ "none",
+ "scout",
+ "sniper",
+ "soldier",
+ "demoman",
+ "medic",
+ "heavy",
+ "pyro",
+ "spy",
+ "engineer",
+ "invalid"
+ };
+ return tf2_class_names[ get_class( ) ];
+}
+
+byte c_base_player::get_life_state( ) {
+ return m_lifeState( );
+}
+
+int c_base_player::get_flags( ) {
+ return m_fFlags( );
+}
+
+int c_base_player::get_health( ) {
+ return m_iHealth( );
+}
+
+int c_base_player::get_max_health( ) {
+ IClientEntity* player_resource{ };
+ for ( int i{ }; i < cl.m_entlist( )->get_highest_entity_index( ); i++ ) {
+ auto ent = cl.m_entlist( )->get_client_entity( i );
+ if ( ent && ent->GetClientClass( )->m_class_id == CTFPlayerResource ) {
+ player_resource = ent;
+ break;
+ }
+ }
+ if ( !player_resource ) return 0;
+
+ return *reinterpret_cast< int* >( uintptr_t( player_resource ) + m_iMaxHealth( ) + ( 4 * this->index( ) ) );
+}
+
+bool c_base_player::is_buffed( ) {
+ return get_health( ) > get_max_health( );
+}
+
+bool c_base_player::is_alive( ) {
+ return m_iHealth( ) > 0 && get_life_state( ) == LIFE_ALIVE;
+}
+
+int c_base_player::get_tick_base( ) {
+ return m_nTickBase( );
+}
+
+bool c_base_player::is_visible( ) {
+ auto local = cl.m_entlist( )->get_local_player( );
+ if ( !local ) return true;
+ trace_t tr;
+ Ray_t ray;
+ CTraceFilter filter;
+
+ filter.pSkip = local;
+
+ ray.Init( local->get_eye_pos( ), get_eye_pos( ) );
+
+ cl.m_trace( )->trace_ray( ray, MASK_AIM, &filter, &tr );
+
+ return ( tr.m_pEnt == this || tr.fraction > 0.99f );
+}
+
+bool c_base_player::is_visible( int hitbox ) {
+ auto local = cl.m_entlist( )->get_local_player( );
+ if ( !local ) return true;
+ trace_t tr;
+ Ray_t ray;
+ CTraceFilter filter;
+
+ filter.pSkip = local;
+
+ ray.Init( local->get_eye_pos( ), get_hitbox_position( hitbox ) );
+
+ cl.m_trace( )->trace_ray( ray, MASK_AIM, &filter, &tr );
+
+ return ( tr.m_pEnt == this || tr.fraction > 0.99f );
+}
+
+dynamic_box_t c_base_player::get_dynamic_box( ) {
+ const matrix3x4& trans = m_CollisionGroup( );
+
+ vec3_t min = *reinterpret_cast< vec3_t* >( this + m_Collision( ) + 0x8 );
+ vec3_t max = *reinterpret_cast< vec3_t* >( this + m_Collision( ) + 0x14 );
+
+ vec3_t point_list[ ] = {
+ vec3_t( min.x, min.y, min.z ),
+ vec3_t( min.x, max.y, min.z ),
+ vec3_t( max.x, max.y, min.z ),
+ vec3_t( max.x, min.y, min.z ),
+ vec3_t( max.x, max.y, max.z ),
+ vec3_t( min.x, max.y, max.z ),
+ vec3_t( min.x, min.y, max.z ),
+ vec3_t( max.x, min.y, max.z )
+ };
+
+ vec3_t transformed[ 8 ];
+
+ for ( int i{ }; i < 8; i++ ) {
+ transformed[ i ] = math::vector_transform( point_list[ i ], trans );
+ }
+
+ vec2_t screen_pos[ 8 ]{ vec2_t( 0.f, 0.f ) };
+
+ for ( int i = 0; i < 8; i++ ) {
+ screen_pos[ i ] = graphics.world_to_screen( transformed[ i ] );
+ }
+
+ float left = FLT_MAX, top = FLT_MIN, right = FLT_MIN, bottom = FLT_MAX;
+
+ for ( int i{ }; i < 8; i++ ) {
+ left = std::min< float >( left, screen_pos[ i ].x );
+ top = std::max< float >( top, screen_pos[ i ].y );
+ right = std::max< float >( right, screen_pos[ i ].x );
+ bottom = std::min< float >( bottom, screen_pos[ i ].y );
+ }
+
+ if ( right - left > 4000.f || top - bottom > 4000.f ) return{ 10000, 10000, 0, 0 }; //sanity check
+ return{ ( int )left, ( int )bottom, ( int )( right - left ), ( int )( top - bottom ) + 4 };
+}
+
+c_base_weapon* c_base_player::get_active_weapon( ) {
+ auto wep_handle = m_hActiveWeapon( );
+ auto weapon = reinterpret_cast< c_base_weapon* >( cl.m_entlist( )->get_entity_from_handle( wep_handle ) );
+ return weapon;
+}