summaryrefslogtreecommitdiff
path: root/engine/cl_parse_event.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engine/cl_parse_event.cpp')
-rw-r--r--engine/cl_parse_event.cpp137
1 files changed, 137 insertions, 0 deletions
diff --git a/engine/cl_parse_event.cpp b/engine/cl_parse_event.cpp
new file mode 100644
index 0000000..183d763
--- /dev/null
+++ b/engine/cl_parse_event.cpp
@@ -0,0 +1,137 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+#include "client_pch.h"
+#include "dt_recv_eng.h"
+#include "client_class.h"
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+static ConVar cl_showevents ( "cl_showevents", "0", FCVAR_CHEAT, "Print event firing info in the console" );
+
+//-----------------------------------------------------------------------------
+// Purpose: Show descriptive info about an event in the numbered console area
+// Input : slot -
+// *eventname -
+//-----------------------------------------------------------------------------
+void CL_DescribeEvent( int slot, CEventInfo *event, const char *eventname )
+{
+ int idx = (slot & 31);
+
+ if ( !cl_showevents.GetInt() )
+ return;
+
+ if ( !eventname )
+ return;
+
+ con_nprint_t n;
+ n.index = idx;
+ n.fixed_width_font = true;
+ n.time_to_live = 4.0f;
+ n.color[0] = 0.8;
+ n.color[1] = 0.8;
+ n.color[2] = 1.0;
+
+ Con_NXPrintf( &n, "%02i %6.3ff %20s %03i bytes", slot, cl.GetTime(), eventname, Bits2Bytes( event->bits ) );
+
+ if ( cl_showevents.GetInt() == 2 )
+ {
+ DevMsg( "%02i %6.3ff %20s %03i bytes\n", slot, cl.GetTime(), eventname, Bits2Bytes( event->bits ) );
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Decode raw event data into underlying class structure using the specified data table
+// Input : *RawData -
+// *pToData -
+// *pRecvTable -
+//-----------------------------------------------------------------------------
+void CL_ParseEventDelta( void *RawData, void *pToData, RecvTable *pRecvTable, unsigned int uReadBufferSize )
+{
+ // Make sure we have a decoder
+ assert(pRecvTable->m_pDecoder);
+
+ // Only so much data allowed
+ bf_read fromBuf( "CL_ParseEventDelta->fromBuf", RawData, uReadBufferSize );
+
+ // First, decode all properties as zeros since temp ents are delta'd from zeros.
+ RecvTable_DecodeZeros( pRecvTable, pToData, -1 );
+
+ // Now decode the data from the network on top of that.
+ RecvTable_Decode( pRecvTable, pToData, &fromBuf, -1 );
+
+ // Make sure the server, etc. didn't try to send too much
+ assert(!fromBuf.IsOverflowed());
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Once per frame, walk the client's event slots and look for any events
+// that are ready for playing.
+//-----------------------------------------------------------------------------
+void CL_FireEvents( void )
+{
+ VPROF("CL_FireEvents");
+ if ( !cl.IsActive() )
+ {
+ cl.events.RemoveAll();
+ return;
+ }
+
+ int i, next;
+ for ( i = cl.events.Head(); i != cl.events.InvalidIndex(); i = next )
+ {
+ next = cl.events.Next( i );
+
+ CEventInfo *ei = &cl.events[ i ];
+ if ( ei->classID == 0 )
+ {
+ cl.events.Remove( i );
+ continue;
+ }
+
+ // Delayed event!
+ if ( ei->fire_delay && ( ei->fire_delay > cl.GetTime() ) )
+ continue;
+
+ bool success = false;
+
+ // Get the receive table if it exists
+ Assert( ei->pClientClass );
+
+ // Get pointer to the event.
+ if( ei->pClientClass->m_pCreateEventFn )
+ {
+ IClientNetworkable *pCE = ei->pClientClass->m_pCreateEventFn();
+ if(pCE)
+ {
+ // Prepare to copy in the data
+ pCE->PreDataUpdate( DATA_UPDATE_CREATED );
+
+ // Decode data into client event object
+ unsigned int buffer_size = PAD_NUMBER( Bits2Bytes( ei->bits ), 4 );
+ CL_ParseEventDelta( ei->pData, pCE->GetDataTableBasePtr(), ei->pClientClass->m_pRecvTable, buffer_size );
+
+ // Fire the event!!!
+ pCE->PostDataUpdate( DATA_UPDATE_CREATED );
+
+ // Spew to debug area if needed
+ CL_DescribeEvent( i, ei, ei->pClientClass->m_pNetworkName );
+
+ success = true;
+ }
+ }
+
+ if ( !success )
+ {
+ ConDMsg( "Failed to execute event for classId %i\n", ei->classID - 1 );
+ }
+
+ cl.events.Remove( i );
+ }
+}
+
+