summaryrefslogtreecommitdiff
path: root/tf2/ctx.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tf2/ctx.cpp')
-rw-r--r--tf2/ctx.cpp97
1 files changed, 97 insertions, 0 deletions
diff --git a/tf2/ctx.cpp b/tf2/ctx.cpp
new file mode 100644
index 0000000..37e192f
--- /dev/null
+++ b/tf2/ctx.cpp
@@ -0,0 +1,97 @@
+#include "ctx.hpp"
+#include "console.hpp"
+#include "hooks.h"
+#include "base_cheat.h"
+
+context::c_context g_ctx;
+
+NAMESPACE_REGION( context )
+
+bool c_context::run_frame( ) {
+ m_local = cl.m_entlist( )->get_client_entity< c_base_player >(
+ cl.m_engine( )->GetLocalPlayer( ) );
+
+ return !!m_local;
+}
+
+
+//predicted servertime of player, use this for breaking lby etc
+float c_context::pred_time( ) {
+ calculate_tickbase( );
+
+ return m_tickbase * cl.m_globals->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->get_tick_base( );
+
+ //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 = cl.m_string_table( )->FindTable( "modelprecache" );
+
+ if( !cache_table )
+ return true;
+
+ cl.m_modelinfo( )->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