diff options
Diffstat (limited to 'cheat/tf2/visuals_world.cpp')
| -rw-r--r-- | cheat/tf2/visuals_world.cpp | 344 |
1 files changed, 344 insertions, 0 deletions
diff --git a/cheat/tf2/visuals_world.cpp b/cheat/tf2/visuals_world.cpp new file mode 100644 index 0000000..b727798 --- /dev/null +++ b/cheat/tf2/visuals_world.cpp @@ -0,0 +1,344 @@ +#include <unordered_map>
+#include <cmath>
+#include "ctx.hpp"
+#include "visuals.hpp"
+#include "interfaces.h"
+#include "renderer.hpp"
+#include "base_cheat.h"
+#include "settings.h"
+namespace features
+{
+ void fix_static_props( ) {
+ static auto cvar = cl.m_cvar( )->FindVar( xors( "r_drawspecificstaticprop" ) );
+ static bool fixed{ };
+ if( !fixed ) {
+ cvar->m_flags |= 0;
+ cvar->set_value( 1 );
+
+ fixed = true;
+ }
+ }
+
+
+ void c_visuals::draw_world( ) {
+ if( !g_settings.visuals.active )
+ return;
+
+ static const auto m_bShouldGlow = g_netvars.get_netvar( fnv( "DT_DynamicProp" ), fnv( "m_bShouldGlow" ) );
+
+
+ for( int i{ }; i < cl.m_entlist( )->get_highest_entity_index( ); ++i ) {
+ auto ent = cl.m_entlist( )->get_client_entity< IClientEntity >( i );
+ if( !ent ) continue;
+
+ auto client_class = ent->get_client_class( );
+ if( !client_class ) continue;
+
+ int class_id = client_class->m_class_id;
+ std::string name = "";
+
+ auto is_object = [ &name ]( int class_id ) -> bool {
+ switch( class_id ) {
+ case CObjectSentrygun:
+ name = xors( "sentry" );
+ return true;
+ case CObjectDispenser:
+ name = xors( "dispenser" );
+ return true;
+ case CObjectTeleporter:
+ name = xors( "teleporter" );
+ return true;
+ default:
+ return false;
+ }
+
+ return false;
+ };
+
+ auto is_projectile = [ &name ]( int class_id ) -> bool {
+ switch( class_id ) {
+ case CTFProjectile_Arrow:
+ name = xors( "arrow" );
+ return true;
+ case CTFProjectile_Cleaver:
+ name = xors( "cleaver" );
+ return true;
+ case CTFProjectile_EnergyBall:
+ name = xors( "energy ball" );
+ return true;
+ case CTFProjectile_EnergyRing:
+ name = xors( "energy ring" );
+ return true;
+ case CTFProjectile_Flare:
+ name = xors( "flare" );
+ return true;
+ case CTFProjectile_HealingBolt:
+ name = xors( "healing bolt" );
+ return true;
+ case CTFProjectile_Jar:
+ name = xors( "jar" );
+ return true;
+ case CTFProjectile_JarMilk:
+ name = xors( "jar milk" );
+ return true;
+ case CTFGrenadePipebombProjectile:
+ name = xors( "pipe bomb" );
+ return true;
+ case CTFProjectile_Rocket:
+ name = xors( "rocket" );
+ return true;
+ case CTFProjectile_Throwable:
+ name = xors( "throwable" );
+ return true;
+ case CTFProjectile_ThrowableBreadMonster:
+ name = xors( "bread monster" );
+ return true;
+ case CTFProjectile_ThrowableBrick:
+ name = xors( "brick" );
+ return true;
+ case CTFProjectile_ThrowableRepel:
+ name = xors( "repel" );
+ return true;
+ case CTFProjectile_SentryRocket:
+ name = xors( "rocket" );
+ return true;
+ default:
+ return false;
+ }
+ return false;
+ };
+
+ //objects
+ if( is_object( class_id ) ) {
+
+ //wont work
+ if( ( g_settings.visuals.building_esp == 2 || g_settings.visuals.building_esp == 3 ) && !g_settings.misc.hide_from_obs ) {
+ //*( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true;
+ }
+
+ if( g_settings.visuals.building_esp == 1 || g_settings.visuals.building_esp == 3 ) {
+ auto pos = ent->get_abs_origin( );
+ auto w2s = util::screen_transform( pos );
+ //currently they are not cute
+ //auto cutie = cl.m_entlist( )->get_entity_from_handle< c_base_player >( ent->as< c_base_weapon >( )->m_hOwnerEntity( ) );
+ draw_string( w2s.x, w2s.y, ALIGN_CENTER, false,
+ g_settings.visuals.building_esp_clr, name.c_str( ) );
+
+ //later
+
+ //if( g_settings.visuals.building_owner( ) )
+ // draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, g_settings.visuals.building_esp_clr, cutie->get_info( ).name );
+ }
+ }
+
+
+
+
+ //projectiles
+ if( is_projectile( class_id ) ) {
+ //wont work
+ if( ( g_settings.visuals.projectile_esp == 2 || g_settings.visuals.projectile_esp == 3 ) && !g_settings.misc.hide_from_obs ) {
+ //*( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true;
+ }
+
+ if( g_settings.visuals.projectile_esp == 1 || g_settings.visuals.projectile_esp == 3 ) {
+ auto pos = ent->get_abs_origin( );
+ auto w2s = util::screen_transform( pos );
+ //again not cute
+ //auto cutie = cl.m_entlist( )->get_entity_from_handle< c_base_player >( ent->as< c_base_weapon >( )->m_hOwnerEntity( ) );
+ draw_string( w2s.x, w2s.y, ALIGN_CENTER, false,
+ g_settings.visuals.projectile_esp_clr, name.c_str( ) );
+
+ //later when i can be fucked
+
+ //if( g_settings.visuals.building_owner( ) )
+ // draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, g_settings.visuals.projectile_esp_clr, cutie->get_info( ).name );
+ }
+ }
+
+
+
+
+
+ /*if( class_id == CObjectTeleporter || class_id == CObjectDispenser || class_id == CObjectSentrygun ) {
+ auto owner = ( int )ent->as< c_base_weapon >( )->m_hBuilder( ) & 0xfff;
+ if( owner <= 0 || owner > 64 ) {
+ auto origin = ent->get_render_origin( );
+ if( origin ) {
+ bool draw = g_settings.visuals.grenade_esp( ) == 1;
+ bool glow = g_settings.visuals.grenade_esp( ) == 2;
+
+ if( draw || g_settings.visuals.grenade_esp == 3 ) {
+ if( !glow && !g_settings.misc.hide_from_obs ) {
+ *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = false;
+ }
+
+ auto w2s = util::screen_transform( origin );
+ auto name = util::object_index_to_name( class_id );
+
+ draw_string( w2s.x, w2s.y, ALIGN_CENTER, false,
+ g_settings.visuals.grenade_esp_clr( ), name );
+ }
+ if( ( glow || g_settings.visuals.grenade_esp == 3 ) && !g_settings.misc.hide_from_obs ) {
+ *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true;
+ }
+ }
+ }
+ }*/
+ /*else {
+ if( g_settings.visuals.weapon_esp && strstr( client_class->m_name, xors( "Projectile" ) ) ) {
+ auto model = ent->get_model( );
+ if( !model ) continue;
+
+ std::string name = xors( "Rocket" );
+
+ auto hdr = cl.m_modelinfo( )->GetStudioModel( model );
+ if( !hdr )
+ continue;
+
+ if( !strstr( hdr->name, xors( "thrown" ) ) && !strstr( hdr->name, xors( "dropped" ) ) )
+ continue;
+
+
+
+
+ if( strstr( hdr->name, xors( "JarGas" ) ) ) {
+ name = xors( "jargas" );
+ }
+ else if( strstr( hdr->name, xors( "Cleaver" ) ) ) {
+ name = xors( "Cleaver" );
+ }
+ else if( strstr( hdr->name, xors( "JarMilk" ) ) ) {
+ name = xors( "Milk" );
+ }
+ else if( strstr( hdr->name, xors( "incendiary" ) ) || strstr( hdr->name, xors( "molotov" ) ) ) {
+ name = xors( "molotov" );
+ }
+
+ if( ( g_settings.visuals.weapon_esp == 2 || g_settings.visuals.weapon_esp == 3 ) && !g_settings.misc.hide_from_obs ) {
+ *( bool* )( uintptr_t( ent ) + m_bShouldGlow ) = true;
+ }
+
+ if( g_settings.visuals.weapon_esp == 1 || g_settings.visuals.weapon_esp == 3 ) {
+ auto pos = ent->get_render_origin( );
+ auto w2s = util::screen_transform( pos );
+ auto cutie = cl.m_entlist( )->get_entity_from_handle< c_base_player >( ent->as< c_base_weapon >( )->m_hOwnerEntity( ) );
+ draw_string( w2s.x, w2s.y, ALIGN_CENTER, false,
+ g_settings.visuals.grenade_esp_clr, name.c_str( ) );
+
+ if( g_settings.visuals.grenade_owner( ) )
+ draw_string( w2s.x, w2s.y + 10, ALIGN_CENTER, false, g_settings.visuals.grenade_esp_clr, cutie->get_info( ).name );
+ }
+ }
+ }
+ }*/
+
+ }
+}
+
+
+ void c_visuals::world_modulate( ) {
+ static std::unordered_map< MaterialHandle_t, fclr_t > world_materials;
+ static std::unordered_map< MaterialHandle_t, fclr_t > world_materials2;
+ static c_base_player* local_player = nullptr;
+ static auto night_mode = false;
+ static bool modulated = false;
+ static bool alpha = false;
+
+ if( !g_settings.visuals.world_modulate || !cl.m_engine( )->IsInGame( ) || g_settings.misc.hide_from_obs ) {
+ modulated = false;
+ if( !world_materials2.empty( ) ) {
+ for( auto& it : world_materials2 ) {
+ auto mat = cl.m_mat_system( )->GetMaterial( it.first );
+ if( !mat ) continue;
+
+ auto original_col = it.second;
+ mat->ColorModulate( original_col.r( ), original_col.g( ), original_col.b( ) );
+ mat->AlphaModulate( original_col.a( ) );
+ }
+
+ world_materials.clear( );
+ world_materials2.clear( );
+ }
+
+ return;
+ }
+
+ if( g_ctx.m_stage == FRAME_NET_UPDATE_POSTDATAUPDATE_END ) {
+ fix_static_props( );
+
+ if( local_player == g_ctx.m_local &&
+ night_mode == g_settings.visuals.night_mode( ) &&
+ alpha == g_settings.visuals.transparent_props( ) &&
+ modulated == g_settings.visuals.world_modulate( ) )
+ return;
+
+
+ for( auto i = cl.m_mat_system( )->FirstMaterial( );
+ i != cl.m_mat_system( )->InvalidMaterial( );
+ i = cl.m_mat_system( )->NextMaterial( i ) ) {
+
+ auto mat = cl.m_mat_system( )->GetMaterial( i );
+ if( !mat ) continue;
+
+ const char* group = mat->GetTextureGroupName( );
+ bool is_world = strstr( group, xors( "World" ) );
+ bool is_sky = strstr( group, xors( "Sky" ) );
+ bool is_prop = strstr( group, xors( "StaticProp" ) );
+
+ if( is_world || is_sky || is_prop ) {
+ const char* name = mat->GetName( );
+ if( world_materials.find( i ) == world_materials.end( ) ) {
+ fclr_t clr;
+
+ mat->GetColorModulate( &clr.r( ), &clr.g( ), &clr.b( ) );
+ clr.a( ) = mat->GetAlphaModulation( );
+
+ world_materials.emplace( i, clr );
+ world_materials2.emplace( i, clr );
+ }
+
+ fclr_t new_color;
+
+ new_color = world_materials2.find( i )->second;
+ bool apply = g_settings.visuals.night_mode && g_settings.visuals.world_modulate;
+
+ if( is_world ) {
+ if( apply ) {
+ new_color.r( ) *= 0.15f;
+ new_color.g( ) *= 0.15f;
+ new_color.b( ) *= 0.15f;
+ }
+ }
+ else if( is_prop ) {
+ if( apply ) {
+ new_color.r( ) *= 0.3f;
+ new_color.g( ) *= 0.3f;
+ new_color.b( ) *= 0.3f;
+ }
+ if( g_settings.visuals.world_modulate && g_settings.visuals.transparent_props ) {
+ new_color.a( ) *= 0.6f;
+ }
+ }
+ else if( is_sky ) {
+ if( apply ) {
+ new_color = fclr_t( 0.f, 0.f, 0.f );
+ }
+ }
+
+ if( !( world_materials.at( i ) == new_color ) ) {
+ mat->ColorModulate( new_color.r( ), new_color.g( ), new_color.b( ) );
+ mat->AlphaModulate( new_color.a( ) );
+
+ world_materials.at( i ) = new_color;
+ }
+ }
+ }
+
+ modulated = g_settings.visuals.world_modulate;
+ night_mode = g_settings.visuals.night_mode;
+ alpha = g_settings.visuals.transparent_props;
+ local_player = g_ctx.m_local;
+ }
+ }
+}
\ No newline at end of file |
