diff options
Diffstat (limited to 'internal_rewrite/skins.cpp')
| -rw-r--r-- | internal_rewrite/skins.cpp | 271 |
1 files changed, 271 insertions, 0 deletions
diff --git a/internal_rewrite/skins.cpp b/internal_rewrite/skins.cpp new file mode 100644 index 0000000..4abef06 --- /dev/null +++ b/internal_rewrite/skins.cpp @@ -0,0 +1,271 @@ +#include "skins.hpp"
+#include "settings.hpp"
+#include "context.hpp"
+#include "interface.hpp"
+
+namespace features
+{
+ int c_skins::get_knife_index( ) {
+ switch( g_settings.misc.skins.knife( ) ) {
+ case 0:
+ return 0;
+ case 1:
+ return 500;
+ case 2:
+ return 505;
+ case 3:
+ return 506;
+ case 4:
+ return 507;
+ case 5:
+ return 508;
+ case 6:
+ return 509;
+ }
+
+ return 0;
+ }
+
+ const char* c_skins::get_model_str( ) {
+ switch( g_settings.misc.skins.knife( ) ) {
+ case 0:
+ return 0;
+ case 1:
+ return xors( "models/weapons/v_knife_bayonet.mdl" );
+ case 2:
+ return xors( "models/weapons/v_knife_flip.mdl" );
+ case 3:
+ return xors( "models/weapons/v_knife_gut.mdl" );
+ case 4:
+ return xors( "models/weapons/v_knife_karam.mdl" );
+ case 5:
+ return xors( "models/weapons/v_knife_m9_bay.mdl" );
+ case 6:
+ return xors( "models/weapons/v_knife_tactical.mdl" );
+ }
+
+ return nullptr;
+ }
+
+ const char* c_skins::get_glove_model( ) {
+ switch( g_settings.misc.skins.glove ) {
+ case 5027:
+ return xors( "models/weapons/v_models/arms/glove_bloodhound/v_glove_bloodhound.mdl" );
+ case 5030:
+ return xors( "models/weapons/v_models/arms/glove_sporty/v_glove_sporty.mdl" );
+ case 5031:
+ return xors( "models/weapons/v_models/arms/glove_slick/v_glove_slick.mdl" );
+ case 5032:
+ return xors( "models/weapons/v_models/arms/glove_handwrap_leathery/v_glove_handwrap_leathery.mdl" );
+ case 5033:
+ return xors( "models/weapons/v_models/arms/glove_motorcycle/v_glove_motorcycle.mdl" );
+ case 5034:
+ return xors( "models/weapons/v_models/arms/glove_specialist/v_glove_specialist.mdl" );
+ }
+
+ return nullptr;
+ }
+
+ const char* c_skins::get_killicon_str( ) {
+ switch( g_settings.misc.skins.knife( ) ) {
+ case 0:
+ return 0;
+ case 1:
+ return xors( "bayonet" );
+ case 2:
+ return xors( "knife_flip" );
+ case 3:
+ return xors( "knife_gut" );
+ case 4:
+ return xors( "knife_karambit" );
+ case 5:
+ return xors( "knife_m9_bayonet" );
+ case 6:
+ return xors( "knife_tactical" );
+ }
+
+ return nullptr;
+ }
+
+ int c_skins::get_current_weapon_id( ) {
+ if( !g_ctx.m_local || !g_ctx.m_local->is_valid( ) )
+ return WEAPON_KNIFE;
+
+ auto weapon = g_ctx.m_local->get_weapon( );
+ if( !weapon )
+ return WEAPON_KNIFE;
+
+ return get_weapon_id( weapon );
+ }
+
+ int c_skins::get_weapon_id( c_base_weapon* weapon ) {
+ if( weapon->is_knife( ) || weapon->is_grenade( ) )
+ return WEAPON_KNIFE;
+
+ if( weapon->m_iItemDefinitionIndex( ) == WEAPON_TASER )
+ return WEAPON_KNIFE;
+
+ return std::clamp< int >( weapon->m_iItemDefinitionIndex( ), 0, 64 );
+ }
+
+ // This is nasty.
+ void c_skins::replace_deaths( IGameEvent* event ) {
+ if( !strcmp( event->GetName( ), xors( "player_death" ) ) && g_csgo.m_engine( )->GetPlayerForUserID( event->GetInt( xors( "attacker" ) ) ) == g_csgo.m_engine( )->GetLocalPlayer( ) ) {
+ if( ( !strcmp( event->GetString( xors( "weapon" ) ), xors( "knife_default_ct" ) ) || !strcmp( event->GetString( xors( "weapon" ) ), xors( "knife_t" ) ) ) ) {
+ if( get_killicon_str( ) )
+ event->SetString( xors( "weapon" ), get_killicon_str( ) );
+ }
+ }
+ }
+
+ //stop this
+ void c_skins::override_weapon( c_base_weapon* wep ) {
+ auto aw = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( g_ctx.m_local->m_hActiveWeapon( ) );
+ auto vm = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( g_ctx.m_local->m_hViewModel( ) );
+ auto wm = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( g_ctx.m_local->get_weapon( )->m_hWeaponWorldModel( ) );
+
+ auto info = g_ctx.m_local->get_info( );
+ int index = get_knife_index( );
+
+ if( wep->is_knife( ) && index ) {
+ int model = g_csgo.m_model_info( )->GetModelIndex( get_model_str( ) );
+
+ wep->m_iItemDefinitionIndex( ) = index;
+ wep->m_nModelIndex( ) = model;
+ wep->m_iWorldDroppedModelIndex( ) = model + 2;
+ wep->m_iWorldModelIndex( ) = model + 1;
+ wep->m_iViewModelIndex( ) = model;
+ wep->m_iItemIDHigh( ) = -1;
+ wep->m_iEntityQuality( ) = 3;
+
+ if( aw->m_iItemDefinitionIndex( ) == wep->m_iItemDefinitionIndex( ) )
+ vm->m_nModelIndex( ) = model;
+
+ if( wm && wep == aw ) {
+ wm->m_nModelIndex( ) = model + 1;
+ }
+ }
+
+ if( m_last_index != g_settings.misc.skins.current_skin ) {
+ g_settings.misc.skins.skins( )[ get_current_weapon_id( ) ] = g_settings.misc.skins.current_skin;
+
+ if( g_csgo.m_global_state->get_client_state( )->m_delta_tick != -1 ) {
+ g_csgo.m_global_state->get_client_state( )->m_delta_tick = -1; // fullupdate happens
+ }
+
+
+ m_last_index = g_settings.misc.skins.current_skin;
+ g_ctx.run_frame( );
+ }
+
+ if( ( wep->m_hOwner( ) & 0xfff ) == g_ctx.m_local->ce( )->GetIndex( ) ) {
+ if( g_settings.misc.skins.skins( )[ get_weapon_id( wep ) ] <= 0 )
+ return;
+
+ if( g_settings.misc.skins.skins( )[ get_weapon_id( wep ) ] != wep->m_nFallbackPaintKit( ) ) {
+ wep->m_iItemIDHigh( ) = -1;
+ wep->m_iAccountID( ) = info.m_xuidlow;
+ }
+
+ wep->m_nFallbackPaintKit( ) = g_settings.misc.skins.skins( )[ get_weapon_id( wep ) ];
+ wep->m_nFallbackStatTrak( ) = -1;
+ wep->m_nFallbackSeed( ) = math::random_number( 0, 1000 );
+
+ wep->m_flFallbackWear( ) = 0.0000001f;
+ }
+ }
+
+ void c_skins::override_gloves( ) {
+ static int last_glove = 0;
+ static int last_skin = 0;
+ static ulong_t glove_handle = 0;
+ auto wearables = ( uint32_t* )( uintptr_t( g_ctx.m_local ) + 0x2EF4 );
+
+ auto glove = ( c_base_weapon* )( g_csgo.m_entlist( )->GetClientEntityFromHandle( wearables[ 0 ] ) );
+
+ if( !glove ) {
+ auto last_glove = ( c_base_weapon* )( g_csgo.m_entlist( )->GetClientEntityFromHandle( glove_handle ) );
+
+ if( last_glove ) {
+ wearables[ 0 ] = glove_handle;
+ glove = last_glove;
+ }
+ }
+
+ if( !g_ctx.m_local->is_alive( ) || !g_settings.misc.skins.glove ) {
+ if( glove ) {
+ glove->ce( )->GetClientNetworkable( )->SetDestroyedOnRecreateEntities( );
+ glove->ce( )->GetClientNetworkable( )->Release( );
+ }
+
+ return;
+ }
+
+ if( !g_settings.misc.skins.glove || !g_settings.misc.skins.glove_skin )
+ return;
+
+ bool update = false;
+ if( last_glove != g_settings.misc.skins.glove || last_skin != g_settings.misc.skins.glove_skin ) {
+ g_csgo.m_global_state->get_client_state( )->m_delta_tick = -1;
+ update = true;
+ }
+
+ last_glove = g_settings.misc.skins.glove;
+ last_skin = g_settings.misc.skins.glove_skin;
+
+ if( !glove ) {
+ for( auto cc = g_csgo.m_chl( )->GetAllClasses( ); !!cc; cc = cc->m_next ) {
+ if( cc->m_class_id != CEconWearable )
+ continue;
+
+ int entry = g_csgo.m_entlist( )->GetHighestEntityIndex( ) + 1;
+ int serial = math::random_number( 0, 4095 );
+
+ cc->m_create_fn( entry, serial );
+
+ glove = g_csgo.m_entlist( )->GetClientEntity< c_base_weapon >( entry );
+ wearables[ 0 ] = entry | serial << 16;
+ glove_handle = wearables[ 0 ];
+ update = true;
+
+ break;
+ }
+ }
+
+ if( glove ) {
+ auto desired_glove = g_settings.misc.skins.glove;
+ if( !desired_glove )
+ return;
+
+ glove->m_iItemDefinitionIndex( ) = desired_glove;
+ glove->m_nFallbackPaintKit( ) = g_settings.misc.skins.glove_skin;
+ glove->m_iEntityQuality( ) = 4;
+ glove->m_nFallbackSeed( ) = math::random_number( 0, 600 );
+ glove->m_iItemIDHigh( ) = -1;
+ glove->m_iAccountID( ) = g_ctx.m_local->get_info( ).m_xuidlow;
+
+ if( update ) {
+ int model_index = g_csgo.m_model_info( )->GetModelIndex( get_glove_model( ) );
+ glove->set_glove_model( desired_glove );
+ glove->ce( )->GetClientNetworkable( )->PreDataUpdate( 0 );
+ }
+ }
+ }
+
+
+ void c_skins::operator()( ) {
+ if( g_csgo.m_engine( )->IsInGame( ) && g_ctx.run_frame( ) && g_ctx.m_local->is_player( ) ) {
+ override_gloves( );
+
+ if( g_ctx.m_local->m_iHealth( ) > 0 && g_ctx.m_local->get_weapon( ) ) {
+ auto weapons = ( uint32_t* )( uintptr_t( g_ctx.m_local ) + 0x2DE8 );
+ for( int i{ }; weapons[ i ]; ++i ) {
+ auto wep = g_csgo.m_entlist( )->GetClientEntityFromHandle< c_base_weapon >( weapons[ i ] );
+ if( wep && wep->m_OriginalOwnerXuidLow( ) == g_ctx.m_local->get_info( ).m_xuidlow && !wep->is_grenade( ) && wep->m_iItemDefinitionIndex( ) != WEAPON_TASER ) {
+ override_weapon( wep );
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file |
