WIP: port alien swarm and extend engine for asw

This commit is contained in:
nillerusr
2023-10-03 20:02:58 +03:00
parent 7d3c0d8b5a
commit 8322130890
617 changed files with 161164 additions and 220 deletions
+59 -28
View File
@@ -41,11 +41,11 @@ static ConVar net_showevents( "net_showevents", "0", FCVAR_CHEAT, "Dump game eve
EXPOSE_SINGLE_INTERFACE_GLOBALVAR( CGameEventManager, IGameEventManager2, INTERFACEVERSION_GAMEEVENTSMANAGER2, s_GameEventManager );
CGameEvent::CGameEvent( CGameEventDescriptor *descriptor )
CGameEvent::CGameEvent( CGameEventDescriptor *descriptor, const char *name )
{
Assert( descriptor );
m_pDescriptor = descriptor;
m_pDataKeys = new KeyValues( descriptor->name );
m_pDataKeys = new KeyValues( name );
}
CGameEvent::~CGameEvent()
@@ -63,6 +63,11 @@ int CGameEvent::GetInt( const char *keyName, int defaultValue)
return m_pDataKeys->GetInt( keyName, defaultValue );
}
uint64 CGameEvent::GetUint64( const char *keyName, uint64 defaultValue)
{
return m_pDataKeys->GetUint64( keyName, defaultValue );
}
float CGameEvent::GetFloat( const char *keyName, float defaultValue )
{
return m_pDataKeys->GetFloat( keyName, defaultValue );
@@ -83,6 +88,11 @@ void CGameEvent::SetInt( const char *keyName, int value )
m_pDataKeys->SetInt( keyName, value );
}
void CGameEvent::SetUint64( const char *keyName, uint64 value )
{
m_pDataKeys->SetUint64( keyName, value );
}
void CGameEvent::SetFloat( const char *keyName, float value )
{
m_pDataKeys->SetFloat( keyName, value );
@@ -158,8 +168,8 @@ void CGameEventManager::Reset()
m_Listeners.PurgeAndDeleteElements();
m_EventFiles.RemoveAll();
m_EventFileNames.RemoveAll();
m_EventMap.Purge();
m_bClientListenersChanged = true;
Assert( m_GameEvents.Count() == 0 );
}
@@ -189,10 +199,12 @@ void CGameEventManager::WriteEventList(SVC_GameEventList *msg)
Assert( descriptor.eventid >= 0 && descriptor.eventid < MAX_EVENT_NUMBER );
const char *pName = m_EventMap.GetElementName( descriptor.elementIndex );
msg->m_DataOut.WriteUBitLong( descriptor.eventid, MAX_EVENT_BITS );
msg->m_DataOut.WriteString( descriptor.name );
KeyValues *key = descriptor.keys->GetFirstSubKey();
msg->m_DataOut.WriteString( pName );
KeyValues *key = descriptor.keys->GetFirstSubKey();
while ( key )
{
@@ -208,7 +220,6 @@ void CGameEventManager::WriteEventList(SVC_GameEventList *msg)
}
msg->m_DataOut.WriteUBitLong( TYPE_LOCAL, 3 ); // end marker
msg->m_nNumEvents++;
}
}
@@ -296,7 +307,8 @@ void CGameEventManager::WriteListenEventList(CLC_ListenEvents *msg)
if ( descriptor.eventid == -1 )
{
DevMsg("Warning! Client listens to event '%s' unknown by server.\n", descriptor.name );
const char *pName = m_EventMap.GetElementName(descriptor.elementIndex);
DevMsg("Warning! Client listens to event '%s' unknown by server.\n", pName );
continue;
}
@@ -304,17 +316,17 @@ void CGameEventManager::WriteListenEventList(CLC_ListenEvents *msg)
}
}
IGameEvent *CGameEventManager::CreateEvent( CGameEventDescriptor *descriptor )
IGameEvent *CGameEventManager::CreateEvent( CGameEventDescriptor *descriptor, const char *name )
{
return new CGameEvent ( descriptor );
return new CGameEvent ( descriptor, name );
}
IGameEvent *CGameEventManager::CreateEvent( const char *name, bool bForce )
IGameEvent *CGameEventManager::CreateEvent( const char *name, bool bForce, int *pCookie )
{
if ( !name || !name[0] )
return NULL;
CGameEventDescriptor *descriptor = GetEventDescriptor( name );
CGameEventDescriptor *descriptor = GetEventDescriptor( name, pCookie );
// check if this event name is known
if ( !descriptor )
@@ -330,7 +342,7 @@ IGameEvent *CGameEventManager::CreateEvent( const char *name, bool bForce )
}
// create & return the new event
return new CGameEvent ( descriptor );
return new CGameEvent ( descriptor, name );
}
bool CGameEventManager::FireEvent( IGameEvent *event, bool bServerOnly )
@@ -351,7 +363,8 @@ IGameEvent *CGameEventManager::DuplicateEvent( IGameEvent *event )
return NULL;
// create new instance
CGameEvent *newEvent = new CGameEvent ( gameEvent->m_pDescriptor );
const char *pName = m_EventMap.GetElementName(gameEvent->m_pDescriptor->elementIndex );
CGameEvent *newEvent = new CGameEvent ( gameEvent->m_pDescriptor, pName );
// free keys
newEvent->m_pDataKeys->deleteThis();
@@ -414,12 +427,16 @@ bool CGameEventManager::FireEventIntern( IGameEvent *event, bool bServerOnly, bo
{
if ( bClientOnly )
{
ConMsg( "Game event \"%s\", Tick %i:\n", descriptor->name, cl.GetClientTickCount() );
#ifndef DEDICATED
const char *pName = m_EventMap.GetElementName(descriptor->elementIndex);
ConMsg( "Game event \"%s\", Tick %i:\n", pName, cl.GetClientTickCount() );
ConPrintEvent( event );
#endif
}
else if ( net_showevents.GetInt() > 1 )
{
ConMsg( "Server event \"%s\", Tick %i:\n", descriptor->name, sv.GetTick() );
const char *pName = m_EventMap.GetElementName(descriptor->elementIndex);
ConMsg( "Server event \"%s\", Tick %i:\n", pName, sv.GetTick() );
ConPrintEvent( event );
}
}
@@ -491,7 +508,8 @@ bool CGameEventManager::SerializeEvent( IGameEvent *event, bf_write* buf )
if ( net_showevents.GetInt() > 2 )
{
DevMsg("Serializing event '%s' (%i):\n", descriptor->name, descriptor->eventid );
const char *pName = m_EventMap.GetElementName(descriptor->elementIndex);
DevMsg("Serializing event '%s' (%i):\n", pName, descriptor->eventid );
}
while ( key )
@@ -545,11 +563,12 @@ IGameEvent *CGameEventManager::UnserializeEvent( bf_read *buf)
}
// create new event
IGameEvent *event = CreateEvent( descriptor );
const char *pName = m_EventMap.GetElementName(descriptor->elementIndex);
IGameEvent *event = CreateEvent( descriptor, pName );
if ( !event )
{
DevMsg( "CGameEventManager::UnserializeEvent:: failed to create event %s.\n", descriptor->name );
DevMsg( "CGameEventManager::UnserializeEvent:: failed to create event %i.\n", descriptor->eventid );
return NULL;
}
@@ -766,9 +785,7 @@ bool CGameEventManager::RegisterEvent( KeyValues * event)
int index = m_GameEvents.AddToTail();
descriptor = &m_GameEvents.Element(index);
AssertMsg2( V_strlen( event->GetName() ) <= MAX_EVENT_NAME_LENGTH, "Event named '%s' exceeds maximum name length %d", event->GetName(), MAX_EVENT_NAME_LENGTH );
Q_strncpy( descriptor->name, event->GetName(), MAX_EVENT_NAME_LENGTH );
descriptor->elementIndex = m_EventMap.Insert( event->GetName(), index );
}
else
{
@@ -859,20 +876,34 @@ void CGameEventManager::FreeEvent( IGameEvent *event )
delete event;
}
CGameEventDescriptor *CGameEventManager::GetEventDescriptor(const char * name)
CGameEventDescriptor *CGameEventManager::GetEventDescriptor(const char * name, int *pCookie)
{
const uint32 cookieBit = 0x80000000;
const uint32 cookieMask = ~cookieBit;
if ( !name || !name[0] )
return NULL;
for (int i=0; i < m_GameEvents.Count(); i++ )
if ( pCookie && *pCookie )
{
CGameEventDescriptor *descriptor = &m_GameEvents[i];
int gameEventIndex = uint32(*pCookie) & cookieMask;
CGameEventDescriptor *pDescriptor = &m_GameEvents[gameEventIndex];
if ( !V_stricmp( m_EventMap.GetElementName(pDescriptor->elementIndex), name ) )
{
return pDescriptor;
}
}
int eventMapIndex = m_EventMap.Find( name );
if ( eventMapIndex == m_EventMap.InvalidIndex() )
return NULL;
if ( Q_strcmp( descriptor->name, name ) == 0 )
return descriptor;
int gameEventIndex = m_EventMap[eventMapIndex];
if ( pCookie )
{
*pCookie = cookieBit | gameEventIndex;
}
return NULL;
return &m_GameEvents[gameEventIndex];
}
bool CGameEventManager::AddListenerAll( void *listener, int nListenerType )
+13 -8
View File
@@ -13,6 +13,7 @@
#pragma once
#endif
#include "utldict.h"
#include <igameevents.h>
#include <utlvector.h>
#include <KeyValues.h>
@@ -34,16 +35,16 @@ class CGameEventDescriptor
public:
CGameEventDescriptor()
{
name[0] = 0;
eventid = -1;
keys = NULL;
local = false;
reliable = true;
elementIndex = -1;
}
public:
char name[MAX_EVENT_NAME_LENGTH]; // name of this event
int eventid; // network index number, -1 = not networked
int eventid; // network index number, -1 = not networked
int elementIndex;
KeyValues *keys; // KeyValue describing data types, if NULL only name
bool local; // local event, never tell clients about that
bool reliable; // send this event as reliable message
@@ -54,7 +55,7 @@ class CGameEvent : public IGameEvent
{
public:
CGameEvent( CGameEventDescriptor *descriptor );
CGameEvent( CGameEventDescriptor *descriptor, const char *name );
virtual ~CGameEvent();
const char *GetName() const;
@@ -64,11 +65,13 @@ public:
bool GetBool( const char *keyName = NULL, bool defaultValue = false );
int GetInt( const char *keyName = NULL, int defaultValue = 0 );
uint64 GetUint64( const char *keyName = NULL, uint64 defaultValue = 0 );
float GetFloat( const char *keyName = NULL, float defaultValue = 0.0f );
const char *GetString( const char *keyName = NULL, const char *defaultValue = "" );
void SetBool( const char *keyName, bool value );
void SetInt( const char *keyName, int value );
void SetUint64( const char *keyName, uint64 value );
void SetFloat( const char *keyName, float value );
void SetString( const char *keyName, const char *value );
@@ -111,8 +114,9 @@ public: // IGameEventManager functions
bool AddListener( IGameEventListener2 *listener, const char *name, bool bServerSide );
bool FindListener( IGameEventListener2 *listener, const char *name );
void RemoveListener( IGameEventListener2 *listener);
IGameEvent *CreateEvent( const char *name, bool bForce = false );
IGameEvent *CreateEvent( const char *name, bool bForce = false, int *pCookie = NULL );
IGameEvent *DuplicateEvent( IGameEvent *event);
bool FireEvent( IGameEvent *event, bool bDontBroadcast = false );
bool FireEventClientSide( IGameEvent *event );
@@ -127,7 +131,7 @@ public:
void ReloadEventDefinitions(); // called by server on new map
bool AddListener( void *listener, CGameEventDescriptor *descriptor, int nListenerType );
CGameEventDescriptor *GetEventDescriptor( const char *name );
CGameEventDescriptor *GetEventDescriptor( const char *name, int *pCookie = NULL );
CGameEventDescriptor *GetEventDescriptor( IGameEvent *event );
CGameEventDescriptor *GetEventDescriptor( int eventid );
@@ -145,13 +149,14 @@ public:
protected:
IGameEvent *CreateEvent( CGameEventDescriptor *descriptor );
IGameEvent *CreateEvent( CGameEventDescriptor *descriptor, const char *name );
bool RegisterEvent( KeyValues * keys );
void UnregisterEvent(int index);
bool FireEventIntern( IGameEvent *event, bool bServerSide, bool bClientOnly );
CGameEventCallback* FindEventListener( void* listener );
CUtlVector<CGameEventDescriptor> m_GameEvents; // list of all known events
CUtlDict<int, int> m_EventMap;
CUtlVector<CGameEventCallback*> m_Listeners; // list of all registered listeners
CUtlSymbolTable m_EventFiles; // list of all loaded event files
CUtlVector<CUtlSymbol> m_EventFileNames;
+8
View File
@@ -66,10 +66,13 @@ CBaseClient::CBaseClient()
m_bReportFakeClient = true;
m_iTracing = 0;
m_bPlayerNameLocked = false;
m_nDebugID = EVENT_DEBUG_ID_INIT;
}
CBaseClient::~CBaseClient()
{
m_nDebugID = EVENT_DEBUG_ID_SHUTDOWN;
}
@@ -670,6 +673,11 @@ void CBaseClient::FireGameEvent( IGameEvent *event )
}
}
int CBaseClient::GetEventDebugID( void )
{
return m_nDebugID;
}
bool CBaseClient::SendServerInfo( void )
{
COM_TimestampedLog( " CBaseClient::SendServerInfo" );
+2
View File
@@ -144,6 +144,8 @@ public: // IClientMessageHandlers
public: // IGameEventListener
virtual void FireGameEvent( IGameEvent *event );
int m_nDebugID;
virtual int GetEventDebugID( void );
public:
+9
View File
@@ -539,6 +539,8 @@ public:
virtual bool REMOVED_SteamRefreshLogin( const char *password, bool isSecure ) { return false; }
virtual bool REMOVED_SteamProcessCall( bool & finished ) { return false; }
virtual ISPSharedMemory *GetSinglePlayerSharedMemorySpace( const char *handle, int ent_num = MAX_EDICTS );
virtual void SetGamestatsData( CGamestatsData *pGamestatsData );
virtual CGamestatsData *GetGamestatsData();
@@ -1568,6 +1570,13 @@ void CEngineClient::OnStorageDeviceDetached( void )
g_pXboxSystem->CloseContainers();
}
ISPSharedMemory *CEngineClient::GetSinglePlayerSharedMemorySpace( const char *szName, int ent_num )
{
// TODO(nillerusr): it this necessary? Implement later if so
return NULL; //g_pSinglePlayerSharedMemoryManager->GetSharedMemory( szName, ent_num );
}
void CEngineClient::ResetDemoInterpolation( void )
{
if( demorecorder->IsRecording() )
+11 -37
View File
@@ -50,47 +50,28 @@ csurface_t *CCollisionBSPData::GetSurfaceAtIndex( unsigned short surfaceIndex )
return &map_surfaces[surfaceIndex];
}
#if TEST_TRACE_POOL
CTSPool<TraceInfo_t> g_TraceInfoPool;
#else
class CTraceInfoPool : public CTSList<TraceInfo_t *>
{
public:
CTraceInfoPool() = default;
};
CTraceInfoPool g_TraceInfoPool;
#endif
static TraceInfo_t g_TraceInfo;
TraceInfo_t *BeginTrace()
{
#if TEST_TRACE_POOL
TraceInfo_t *pTraceInfo = g_TraceInfoPool.GetObject();
#else
TraceInfo_t *pTraceInfo;
if ( !g_TraceInfoPool.PopItem( &pTraceInfo ) )
if ( g_TraceInfo.m_BrushCounters[0].Count() != GetCollisionBSPData()->numbrushes + 1 )
{
pTraceInfo = new TraceInfo_t;
}
#endif
if ( pTraceInfo->m_BrushCounters[0].Count() != GetCollisionBSPData()->numbrushes + 1 )
{
memset( pTraceInfo->m_Count, 0, sizeof( pTraceInfo->m_Count ) );
pTraceInfo->m_nCheckDepth = -1;
memset( g_TraceInfo.m_Count, 0, sizeof( g_TraceInfo.m_Count ) );
g_TraceInfo.m_nCheckDepth = -1;
for ( int i = 0; i < MAX_CHECK_COUNT_DEPTH; i++ )
{
pTraceInfo->m_BrushCounters[i].SetCount( GetCollisionBSPData()->numbrushes + 1 );
pTraceInfo->m_DispCounters[i].SetCount( g_DispCollTreeCount );
g_TraceInfo.m_BrushCounters[i].SetCount( GetCollisionBSPData()->numbrushes + 1 );
g_TraceInfo.m_DispCounters[i].SetCount( g_DispCollTreeCount );
memset( pTraceInfo->m_BrushCounters[i].Base(), 0, pTraceInfo->m_BrushCounters[i].Count() * sizeof(TraceCounter_t) );
memset( pTraceInfo->m_DispCounters[i].Base(), 0, pTraceInfo->m_DispCounters[i].Count() * sizeof(TraceCounter_t) );
memset( g_TraceInfo.m_BrushCounters[i].Base(), 0, g_TraceInfo.m_BrushCounters[i].Count() * sizeof(TraceCounter_t) );
memset( g_TraceInfo.m_DispCounters[i].Base(), 0, g_TraceInfo.m_DispCounters[i].Count() * sizeof(TraceCounter_t) );
}
}
PushTraceVisits( pTraceInfo );
PushTraceVisits( &g_TraceInfo );
return pTraceInfo;
return &g_TraceInfo;
}
void PushTraceVisits( TraceInfo_t *pTraceInfo )
@@ -114,16 +95,9 @@ void PopTraceVisits( TraceInfo_t *pTraceInfo )
Assert( pTraceInfo->m_nCheckDepth >= -1 );
}
void EndTrace( TraceInfo_t *&pTraceInfo )
void EndTrace( TraceInfo_t *pTraceInfo )
{
PopTraceVisits( pTraceInfo );
Assert( pTraceInfo->m_nCheckDepth == -1 );
#if TEST_TRACE_POOL
g_TraceInfoPool.PutObject( pTraceInfo );
#else
g_TraceInfoPool.PushItem( pTraceInfo );
#endif
pTraceInfo = NULL;
}
static ConVar map_noareas( "map_noareas", "0", 0, "Disable area to area connection testing." );
+1 -1
View File
@@ -158,7 +158,7 @@ struct cnode_t
TraceInfo_t *BeginTrace();
void PushTraceVisits( TraceInfo_t *pTraceInfo );
void PopTraceVisits( TraceInfo_t *pTraceInfo );
void EndTrace( TraceInfo_t *&pTraceInfo );
void EndTrace( TraceInfo_t *pTraceInfo );
//-----------------------------------------------------------------------------
+9 -1
View File
@@ -475,6 +475,8 @@ CHLTVServer::CHLTVServer()
m_nGlobalSlots = 0;
m_nGlobalClients = 0;
m_nGlobalProxies = 0;
m_nDebugID = EVENT_DEBUG_ID_INIT;
}
CHLTVServer::~CHLTVServer()
@@ -488,6 +490,8 @@ CHLTVServer::~CHLTVServer()
// make sure everything was destroyed
Assert( m_CurrentFrame == NULL );
Assert( CountClientFrames() == 0 );
m_nDebugID = EVENT_DEBUG_ID_SHUTDOWN;
}
void CHLTVServer::SetMaxClients( int number )
@@ -1015,9 +1019,13 @@ void CHLTVServer::FireGameEvent(IGameEvent *event)
}
}
int CHLTVServer::GetEventDebugID( void )
{
return m_nDebugID;
}
bool CHLTVServer::ShouldUpdateMasterServer()
{
// If the main game server is active, then we let it update Steam with the server info.
return !sv.IsActive();
}
+2
View File
@@ -115,6 +115,8 @@ public: // CBaseServer interface:
public:
void FireGameEvent(IGameEvent *event);
int m_nDebugID;
int GetEventDebugID( void );
public: // IHLTVServer interface:
IServer *GetBaseServer( void );
+8 -1
View File
@@ -262,11 +262,13 @@ CON_COMMAND( logaddress_list, "List all addresses currently being used by logadd
CLog::CLog()
{
Reset();
m_nDebugID = EVENT_DEBUG_ID_INIT;
}
CLog::~CLog()
{
m_nDebugID = EVENT_DEBUG_ID_SHUTDOWN;
}
void CLog::Reset( void ) // reset all logging streams
@@ -644,6 +646,11 @@ void CLog::FireGameEvent( IGameEvent *event )
}
}
int CLog::GetEventDebugID( void )
{
return m_nDebugID;
}
struct TempFilename_t
{
bool IsGzip;
+2 -1
View File
@@ -24,7 +24,8 @@ public:
public: // IGameEventListener Interface
void FireGameEvent( IGameEvent *event );
int m_nDebugID;
int GetEventDebugID( void );
public:
bool IsActive( void ); // true if logging is "on"
+6
View File
@@ -1595,6 +1595,12 @@ public:
return sv.GetPlayerInfo( (ent_num-1), pinfo );
}
virtual ISPSharedMemory *GetSinglePlayerSharedMemorySpace( const char *szName, int ent_num = MAX_EDICTS )
{
// TODO(nillerusr): it this necessary? Implement later if so
return NULL; //return g_pSinglePlayerSharedMemoryManager->GetSharedMemory( szName, ent_num );
}
bool IsClientFullyAuthenticated( edict_t *pEdict )
{
int entnum = NUM_FOR_EDICT( pEdict );