aboutsummaryrefslogtreecommitdiff
path: root/mp/src/game/shared/usermessages.cpp
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /mp/src/game/shared/usermessages.cpp
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'mp/src/game/shared/usermessages.cpp')
-rw-r--r--mp/src/game/shared/usermessages.cpp191
1 files changed, 191 insertions, 0 deletions
diff --git a/mp/src/game/shared/usermessages.cpp b/mp/src/game/shared/usermessages.cpp
new file mode 100644
index 00000000..317b071e
--- /dev/null
+++ b/mp/src/game/shared/usermessages.cpp
@@ -0,0 +1,191 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#include "cbase.h"
+#include "usermessages.h"
+#include <bitbuf.h>
+
+// memdbgon must be the last include file in a .cpp file!!!
+#include "tier0/memdbgon.h"
+
+void RegisterUserMessages( void );
+
+//-----------------------------------------------------------------------------
+// Purpose: Force registration on .dll load
+// FIXME: Should this be a client/server system?
+//-----------------------------------------------------------------------------
+CUserMessages::CUserMessages()
+{
+ // Game specific registration function;
+ RegisterUserMessages();
+}
+
+CUserMessages::~CUserMessages()
+{
+ int c = m_UserMessages.Count();
+ for ( int i = 0; i < c; ++i )
+ {
+ delete m_UserMessages[ i ];
+ }
+ m_UserMessages.RemoveAll();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *name -
+// Output : int
+//-----------------------------------------------------------------------------
+int CUserMessages::LookupUserMessage( const char *name )
+{
+ int idx = m_UserMessages.Find( name );
+ if ( idx == m_UserMessages.InvalidIndex() )
+ {
+ return -1;
+ }
+
+ return idx;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : index -
+// Output : int
+//-----------------------------------------------------------------------------
+int CUserMessages::GetUserMessageSize( int index )
+{
+ if ( index < 0 || index >= (int)m_UserMessages.Count() )
+ {
+ Error( "CUserMessages::GetUserMessageSize( %i ) out of range!!!\n", index );
+ }
+
+ CUserMessage *e = m_UserMessages[ index ];
+ return e->size;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : index -
+// Output : char const
+//-----------------------------------------------------------------------------
+const char *CUserMessages::GetUserMessageName( int index )
+{
+ if ( index < 0 || index >= (int)m_UserMessages.Count() )
+ {
+ Error( "CUserMessages::GetUserMessageSize( %i ) out of range!!!\n", index );
+ }
+
+ return m_UserMessages.GetElementName( index );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : index -
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CUserMessages::IsValidIndex( int index )
+{
+ return m_UserMessages.IsValidIndex( index );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *name -
+// size - -1 for variable size
+//-----------------------------------------------------------------------------
+void CUserMessages::Register( const char *name, int size )
+{
+ Assert( name );
+ int idx = m_UserMessages.Find( name );
+ if ( idx != m_UserMessages.InvalidIndex() )
+ {
+ Error( "CUserMessages::Register '%s' already registered\n", name );
+ }
+
+ CUserMessage * entry = new CUserMessage;
+ entry->size = size;
+ entry->name = name;
+
+ m_UserMessages.Insert( name, entry );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *name -
+// hook -
+//-----------------------------------------------------------------------------
+void CUserMessages::HookMessage( const char *name, pfnUserMsgHook hook )
+{
+#if defined( CLIENT_DLL )
+ Assert( name );
+ Assert( hook );
+
+ int idx = m_UserMessages.Find( name );
+ if ( idx == m_UserMessages.InvalidIndex() )
+ {
+ DevMsg( "CUserMessages::HookMessage: no such message %s\n", name );
+ Assert( 0 );
+ return;
+ }
+
+ int i = m_UserMessages[ idx ]->clienthooks.AddToTail();
+ m_UserMessages[ idx ]->clienthooks[i] = hook;
+
+#else
+ Error( "CUserMessages::HookMessage called from server code!!!\n" );
+#endif
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+// Input : *pszName -
+// iSize -
+// *pbuf -
+// Output : Returns true on success, false on failure.
+//-----------------------------------------------------------------------------
+bool CUserMessages::DispatchUserMessage( int msg_type, bf_read &msg_data )
+{
+#if defined( CLIENT_DLL )
+ if ( msg_type < 0 || msg_type >= (int)m_UserMessages.Count() )
+ {
+ DevMsg( "CUserMessages::DispatchUserMessage: Bogus msg type %i (max == %i)\n", msg_type, m_UserMessages.Count() );
+ Assert( 0 );
+ return false;
+ }
+
+ CUserMessage *entry = m_UserMessages[ msg_type ];
+
+ if ( !entry )
+ {
+ DevMsg( "CUserMessages::DispatchUserMessage: Missing client entry for msg type %i\n", msg_type );
+ Assert( 0 );
+ return false;
+ }
+
+ if ( entry->clienthooks.Count() == 0 )
+ {
+ DevMsg( "CUserMessages::DispatchUserMessage: missing client hook for %s\n", GetUserMessageName(msg_type) );
+ Assert( 0 );
+ return false;
+ }
+
+ for (int i = 0; i < entry->clienthooks.Count(); i++ )
+ {
+ bf_read msg_copy = msg_data;
+
+ pfnUserMsgHook hook = entry->clienthooks[i];
+ (*hook)( msg_copy );
+ }
+ return true;
+#else
+ Error( "CUserMessages::DispatchUserMessage called from server code!!!\n" );
+ return false;
+#endif
+}
+
+// Singleton
+static CUserMessages g_UserMessages;
+// Expose to rest of .dll
+CUserMessages *usermessages = &g_UserMessages;