@@ -41,11 +41,11 @@ static ConVar net_showevents( "net_showevents", "0", FCVAR_CHEAT, "Dump game eve
4141
4242EXPOSE_SINGLE_INTERFACE_GLOBALVAR ( CGameEventManager, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2, s_GameEventManager );
4343
44- CGameEvent::CGameEvent ( CGameEventDescriptor *descriptor )
44+ CGameEvent::CGameEvent ( CGameEventDescriptor *descriptor, const char *name )
4545{
4646 Assert ( descriptor );
4747 m_pDescriptor = descriptor;
48- m_pDataKeys = new KeyValues ( descriptor-> name );
48+ m_pDataKeys = new KeyValues ( name );
4949}
5050
5151CGameEvent::~CGameEvent ()
@@ -63,6 +63,11 @@ int CGameEvent::GetInt( const char *keyName, int defaultValue)
6363 return m_pDataKeys->GetInt ( keyName, defaultValue );
6464}
6565
66+ uint64 CGameEvent::GetUint64 ( const char *keyName, uint64 defaultValue)
67+ {
68+ return m_pDataKeys->GetUint64 ( keyName, defaultValue );
69+ }
70+
6671float CGameEvent::GetFloat ( const char *keyName, float defaultValue )
6772{
6873 return m_pDataKeys->GetFloat ( keyName, defaultValue );
@@ -83,6 +88,11 @@ void CGameEvent::SetInt( const char *keyName, int value )
8388 m_pDataKeys->SetInt ( keyName, value );
8489}
8590
91+ void CGameEvent::SetUint64 ( const char *keyName, uint64 value )
92+ {
93+ m_pDataKeys->SetUint64 ( keyName, value );
94+ }
95+
8696void CGameEvent::SetFloat ( const char *keyName, float value )
8797{
8898 m_pDataKeys->SetFloat ( keyName, value );
@@ -158,8 +168,8 @@ void CGameEventManager::Reset()
158168 m_Listeners.PurgeAndDeleteElements ();
159169 m_EventFiles.RemoveAll ();
160170 m_EventFileNames.RemoveAll ();
171+ m_EventMap.Purge ();
161172 m_bClientListenersChanged = true ;
162-
163173 Assert ( m_GameEvents.Count () == 0 );
164174}
165175
@@ -189,10 +199,12 @@ void CGameEventManager::WriteEventList(SVC_GameEventList *msg)
189199
190200 Assert ( descriptor.eventid >= 0 && descriptor.eventid < MAX_EVENT_NUMBER );
191201
202+ const char *pName = m_EventMap.GetElementName ( descriptor.elementIndex );
203+
192204 msg->m_DataOut .WriteUBitLong ( descriptor.eventid , MAX_EVENT_BITS );
193- msg->m_DataOut .WriteString ( descriptor. name );
194-
195- KeyValues *key = descriptor.keys ->GetFirstSubKey ();
205+ msg->m_DataOut .WriteString ( pName );
206+
207+ KeyValues *key = descriptor.keys ->GetFirstSubKey ();
196208
197209 while ( key )
198210 {
@@ -208,7 +220,6 @@ void CGameEventManager::WriteEventList(SVC_GameEventList *msg)
208220 }
209221
210222 msg->m_DataOut .WriteUBitLong ( TYPE_LOCAL, 3 ); // end marker
211-
212223 msg->m_nNumEvents ++;
213224 }
214225}
@@ -296,25 +307,26 @@ void CGameEventManager::WriteListenEventList(CLC_ListenEvents *msg)
296307
297308 if ( descriptor.eventid == -1 )
298309 {
299- DevMsg (" Warning! Client listens to event '%s' unknown by server.\n " , descriptor.name );
310+ const char *pName = m_EventMap.GetElementName (descriptor.elementIndex );
311+ DevMsg (" Warning! Client listens to event '%s' unknown by server.\n " , pName );
300312 continue ;
301313 }
302314
303315 msg->m_EventArray .Set ( descriptor.eventid );
304316 }
305317}
306318
307- IGameEvent *CGameEventManager::CreateEvent ( CGameEventDescriptor *descriptor )
319+ IGameEvent *CGameEventManager::CreateEvent ( CGameEventDescriptor *descriptor, const char *name )
308320{
309- return new CGameEvent ( descriptor );
321+ return new CGameEvent ( descriptor, name );
310322}
311323
312- IGameEvent *CGameEventManager::CreateEvent ( const char *name, bool bForce )
324+ IGameEvent *CGameEventManager::CreateEvent ( const char *name, bool bForce, int *pCookie )
313325{
314326 if ( !name || !name[0 ] )
315327 return NULL ;
316328
317- CGameEventDescriptor *descriptor = GetEventDescriptor ( name );
329+ CGameEventDescriptor *descriptor = GetEventDescriptor ( name, pCookie );
318330
319331 // check if this event name is known
320332 if ( !descriptor )
@@ -330,7 +342,7 @@ IGameEvent *CGameEventManager::CreateEvent( const char *name, bool bForce )
330342 }
331343
332344 // create & return the new event
333- return new CGameEvent ( descriptor );
345+ return new CGameEvent ( descriptor, name );
334346}
335347
336348bool CGameEventManager::FireEvent ( IGameEvent *event, bool bServerOnly )
@@ -351,7 +363,8 @@ IGameEvent *CGameEventManager::DuplicateEvent( IGameEvent *event )
351363 return NULL ;
352364
353365 // create new instance
354- CGameEvent *newEvent = new CGameEvent ( gameEvent->m_pDescriptor );
366+ const char *pName = m_EventMap.GetElementName (gameEvent->m_pDescriptor ->elementIndex );
367+ CGameEvent *newEvent = new CGameEvent ( gameEvent->m_pDescriptor , pName );
355368
356369 // free keys
357370 newEvent->m_pDataKeys ->deleteThis ();
@@ -414,12 +427,16 @@ bool CGameEventManager::FireEventIntern( IGameEvent *event, bool bServerOnly, bo
414427 {
415428 if ( bClientOnly )
416429 {
417- ConMsg ( " Game event \" %s\" , Tick %i:\n " , descriptor->name , cl.GetClientTickCount () );
430+ #ifndef DEDICATED
431+ const char *pName = m_EventMap.GetElementName (descriptor->elementIndex );
432+ ConMsg ( " Game event \" %s\" , Tick %i:\n " , pName, cl.GetClientTickCount () );
418433 ConPrintEvent ( event );
434+ #endif
419435 }
420436 else if ( net_showevents.GetInt () > 1 )
421437 {
422- ConMsg ( " Server event \" %s\" , Tick %i:\n " , descriptor->name , sv.GetTick () );
438+ const char *pName = m_EventMap.GetElementName (descriptor->elementIndex );
439+ ConMsg ( " Server event \" %s\" , Tick %i:\n " , pName, sv.GetTick () );
423440 ConPrintEvent ( event );
424441 }
425442 }
@@ -491,7 +508,8 @@ bool CGameEventManager::SerializeEvent( IGameEvent *event, bf_write* buf )
491508
492509 if ( net_showevents.GetInt () > 2 )
493510 {
494- DevMsg (" Serializing event '%s' (%i):\n " , descriptor->name , descriptor->eventid );
511+ const char *pName = m_EventMap.GetElementName (descriptor->elementIndex );
512+ DevMsg (" Serializing event '%s' (%i):\n " , pName, descriptor->eventid );
495513 }
496514
497515 while ( key )
@@ -545,11 +563,12 @@ IGameEvent *CGameEventManager::UnserializeEvent( bf_read *buf)
545563 }
546564
547565 // create new event
548- IGameEvent *event = CreateEvent ( descriptor );
566+ const char *pName = m_EventMap.GetElementName (descriptor->elementIndex );
567+ IGameEvent *event = CreateEvent ( descriptor, pName );
549568
550569 if ( !event )
551570 {
552- DevMsg ( " CGameEventManager::UnserializeEvent:: failed to create event %s .\n " , descriptor->name );
571+ DevMsg ( " CGameEventManager::UnserializeEvent:: failed to create event %i .\n " , descriptor->eventid );
553572 return NULL ;
554573 }
555574
@@ -766,9 +785,7 @@ bool CGameEventManager::RegisterEvent( KeyValues * event)
766785 int index = m_GameEvents.AddToTail ();
767786 descriptor = &m_GameEvents.Element (index);
768787
769- AssertMsg2 ( V_strlen ( event->GetName () ) <= MAX_EVENT_NAME_LENGTH, " Event named '%s' exceeds maximum name length %d" , event->GetName (), MAX_EVENT_NAME_LENGTH );
770-
771- Q_strncpy ( descriptor->name , event->GetName (), MAX_EVENT_NAME_LENGTH );
788+ descriptor->elementIndex = m_EventMap.Insert ( event->GetName (), index );
772789 }
773790 else
774791 {
@@ -859,20 +876,34 @@ void CGameEventManager::FreeEvent( IGameEvent *event )
859876 delete event;
860877}
861878
862- CGameEventDescriptor *CGameEventManager::GetEventDescriptor (const char * name)
879+ CGameEventDescriptor *CGameEventManager::GetEventDescriptor (const char * name, int *pCookie )
863880{
881+ const uint32 cookieBit = 0x80000000 ;
882+ const uint32 cookieMask = ~cookieBit;
883+
864884 if ( !name || !name[0 ] )
865885 return NULL ;
866886
867- for ( int i= 0 ; i < m_GameEvents. Count (); i++ )
887+ if ( pCookie && *pCookie )
868888 {
869- CGameEventDescriptor *descriptor = &m_GameEvents[i];
889+ int gameEventIndex = uint32 (*pCookie) & cookieMask;
890+ CGameEventDescriptor *pDescriptor = &m_GameEvents[gameEventIndex];
891+ if ( !V_stricmp ( m_EventMap.GetElementName (pDescriptor->elementIndex ), name ) )
892+ {
893+ return pDescriptor;
894+ }
895+ }
896+ int eventMapIndex = m_EventMap.Find ( name );
897+ if ( eventMapIndex == m_EventMap.InvalidIndex () )
898+ return NULL ;
870899
871- if ( Q_strcmp ( descriptor->name , name ) == 0 )
872- return descriptor;
900+ int gameEventIndex = m_EventMap[eventMapIndex];
901+ if ( pCookie )
902+ {
903+ *pCookie = cookieBit | gameEventIndex;
873904 }
874905
875- return NULL ;
906+ return &m_GameEvents[gameEventIndex] ;
876907}
877908
878909bool CGameEventManager::AddListenerAll ( void *listener, int nListenerType )
0 commit comments