sqwarmed/sdk_src/game/shared/usermessages.cpp

195 lines
5.5 KiB
C++
Raw Normal View History

2024-08-29 19:18:30 -04:00
//========= Copyright <20> 1996-2005, 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;
}
ASSERT_LOCAL_PLAYER_RESOLVABLE();
int i = m_UserMessages[ idx ]->clienthooks[ GET_ACTIVE_SPLITSCREEN_SLOT() ].AddToTail();
m_UserMessages[ idx ]->clienthooks[GET_ACTIVE_SPLITSCREEN_SLOT()][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;
}
int nSlot = GET_ACTIVE_SPLITSCREEN_SLOT();
if ( entry->clienthooks[nSlot].Count() == 0 )
{
// not hooking a usermessage is acceptable, pretend we parsed it
return true;
}
for (int i = 0; i < entry->clienthooks[nSlot].Count(); i++ )
{
bf_read msg_copy = msg_data;
pfnUserMsgHook hook = entry->clienthooks[nSlot][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;