@@ -41,11 +41,11 @@ static ConVar net_showevents( "net_showevents", "0", FCVAR_CHEAT, "Dump game eve
41
41
42
42
EXPOSE_SINGLE_INTERFACE_GLOBALVAR ( CGameEventManager, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2, s_GameEventManager );
43
43
44
- CGameEvent::CGameEvent ( CGameEventDescriptor *descriptor )
44
+ CGameEvent::CGameEvent ( CGameEventDescriptor *descriptor, const char *name )
45
45
{
46
46
Assert ( descriptor );
47
47
m_pDescriptor = descriptor;
48
- m_pDataKeys = new KeyValues ( descriptor-> name );
48
+ m_pDataKeys = new KeyValues ( name );
49
49
}
50
50
51
51
CGameEvent::~CGameEvent ()
@@ -63,6 +63,11 @@ int CGameEvent::GetInt( const char *keyName, int defaultValue)
63
63
return m_pDataKeys->GetInt ( keyName, defaultValue );
64
64
}
65
65
66
+ uint64 CGameEvent::GetUint64 ( const char *keyName, uint64 defaultValue)
67
+ {
68
+ return m_pDataKeys->GetUint64 ( keyName, defaultValue );
69
+ }
70
+
66
71
float CGameEvent::GetFloat ( const char *keyName, float defaultValue )
67
72
{
68
73
return m_pDataKeys->GetFloat ( keyName, defaultValue );
@@ -83,6 +88,11 @@ void CGameEvent::SetInt( const char *keyName, int value )
83
88
m_pDataKeys->SetInt ( keyName, value );
84
89
}
85
90
91
+ void CGameEvent::SetUint64 ( const char *keyName, uint64 value )
92
+ {
93
+ m_pDataKeys->SetUint64 ( keyName, value );
94
+ }
95
+
86
96
void CGameEvent::SetFloat ( const char *keyName, float value )
87
97
{
88
98
m_pDataKeys->SetFloat ( keyName, value );
@@ -158,8 +168,8 @@ void CGameEventManager::Reset()
158
168
m_Listeners.PurgeAndDeleteElements ();
159
169
m_EventFiles.RemoveAll ();
160
170
m_EventFileNames.RemoveAll ();
171
+ m_EventMap.Purge ();
161
172
m_bClientListenersChanged = true ;
162
-
163
173
Assert ( m_GameEvents.Count () == 0 );
164
174
}
165
175
@@ -189,10 +199,12 @@ void CGameEventManager::WriteEventList(SVC_GameEventList *msg)
189
199
190
200
Assert ( descriptor.eventid >= 0 && descriptor.eventid < MAX_EVENT_NUMBER );
191
201
202
+ const char *pName = m_EventMap.GetElementName ( descriptor.elementIndex );
203
+
192
204
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 ();
196
208
197
209
while ( key )
198
210
{
@@ -208,7 +220,6 @@ void CGameEventManager::WriteEventList(SVC_GameEventList *msg)
208
220
}
209
221
210
222
msg->m_DataOut .WriteUBitLong ( TYPE_LOCAL, 3 ); // end marker
211
-
212
223
msg->m_nNumEvents ++;
213
224
}
214
225
}
@@ -296,25 +307,26 @@ void CGameEventManager::WriteListenEventList(CLC_ListenEvents *msg)
296
307
297
308
if ( descriptor.eventid == -1 )
298
309
{
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 );
300
312
continue ;
301
313
}
302
314
303
315
msg->m_EventArray .Set ( descriptor.eventid );
304
316
}
305
317
}
306
318
307
- IGameEvent *CGameEventManager::CreateEvent ( CGameEventDescriptor *descriptor )
319
+ IGameEvent *CGameEventManager::CreateEvent ( CGameEventDescriptor *descriptor, const char *name )
308
320
{
309
- return new CGameEvent ( descriptor );
321
+ return new CGameEvent ( descriptor, name );
310
322
}
311
323
312
- IGameEvent *CGameEventManager::CreateEvent ( const char *name, bool bForce )
324
+ IGameEvent *CGameEventManager::CreateEvent ( const char *name, bool bForce, int *pCookie )
313
325
{
314
326
if ( !name || !name[0 ] )
315
327
return NULL ;
316
328
317
- CGameEventDescriptor *descriptor = GetEventDescriptor ( name );
329
+ CGameEventDescriptor *descriptor = GetEventDescriptor ( name, pCookie );
318
330
319
331
// check if this event name is known
320
332
if ( !descriptor )
@@ -330,7 +342,7 @@ IGameEvent *CGameEventManager::CreateEvent( const char *name, bool bForce )
330
342
}
331
343
332
344
// create & return the new event
333
- return new CGameEvent ( descriptor );
345
+ return new CGameEvent ( descriptor, name );
334
346
}
335
347
336
348
bool CGameEventManager::FireEvent ( IGameEvent *event, bool bServerOnly )
@@ -351,7 +363,8 @@ IGameEvent *CGameEventManager::DuplicateEvent( IGameEvent *event )
351
363
return NULL ;
352
364
353
365
// 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 );
355
368
356
369
// free keys
357
370
newEvent->m_pDataKeys ->deleteThis ();
@@ -414,12 +427,16 @@ bool CGameEventManager::FireEventIntern( IGameEvent *event, bool bServerOnly, bo
414
427
{
415
428
if ( bClientOnly )
416
429
{
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 () );
418
433
ConPrintEvent ( event );
434
+ #endif
419
435
}
420
436
else if ( net_showevents.GetInt () > 1 )
421
437
{
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 () );
423
440
ConPrintEvent ( event );
424
441
}
425
442
}
@@ -491,7 +508,8 @@ bool CGameEventManager::SerializeEvent( IGameEvent *event, bf_write* buf )
491
508
492
509
if ( net_showevents.GetInt () > 2 )
493
510
{
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 );
495
513
}
496
514
497
515
while ( key )
@@ -545,11 +563,12 @@ IGameEvent *CGameEventManager::UnserializeEvent( bf_read *buf)
545
563
}
546
564
547
565
// create new event
548
- IGameEvent *event = CreateEvent ( descriptor );
566
+ const char *pName = m_EventMap.GetElementName (descriptor->elementIndex );
567
+ IGameEvent *event = CreateEvent ( descriptor, pName );
549
568
550
569
if ( !event )
551
570
{
552
- DevMsg ( " CGameEventManager::UnserializeEvent:: failed to create event %s .\n " , descriptor->name );
571
+ DevMsg ( " CGameEventManager::UnserializeEvent:: failed to create event %i .\n " , descriptor->eventid );
553
572
return NULL ;
554
573
}
555
574
@@ -766,9 +785,7 @@ bool CGameEventManager::RegisterEvent( KeyValues * event)
766
785
int index = m_GameEvents.AddToTail ();
767
786
descriptor = &m_GameEvents.Element (index);
768
787
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 );
772
789
}
773
790
else
774
791
{
@@ -859,20 +876,34 @@ void CGameEventManager::FreeEvent( IGameEvent *event )
859
876
delete event;
860
877
}
861
878
862
- CGameEventDescriptor *CGameEventManager::GetEventDescriptor (const char * name)
879
+ CGameEventDescriptor *CGameEventManager::GetEventDescriptor (const char * name, int *pCookie )
863
880
{
881
+ const uint32 cookieBit = 0x80000000 ;
882
+ const uint32 cookieMask = ~cookieBit;
883
+
864
884
if ( !name || !name[0 ] )
865
885
return NULL ;
866
886
867
- for ( int i= 0 ; i < m_GameEvents. Count (); i++ )
887
+ if ( pCookie && *pCookie )
868
888
{
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 ;
870
899
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;
873
904
}
874
905
875
- return NULL ;
906
+ return &m_GameEvents[gameEventIndex] ;
876
907
}
877
908
878
909
bool CGameEventManager::AddListenerAll ( void *listener, int nListenerType )
0 commit comments