You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
191 lines
5.2 KiB
191 lines
5.2 KiB
//========= 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;
|
|
|