//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //===========================================================================// #ifdef _WIN32 #include #elif POSIX #include #else #error #endif #include #include #include "isys.h" #include "dedicated.h" #include "engine_hlds_api.h" #include "filesystem.h" #include "tier0/vcrmode.h" #include "tier0/dbg.h" #include "tier1/strtools.h" #include "tier0/icommandline.h" #include "idedicatedexports.h" #include "vgui/vguihelpers.h" static long hDLLThirdParty = 0L; //----------------------------------------------------------------------------- // Modules... //----------------------------------------------------------------------------- CSysModule *s_hMatSystemModule = NULL; CSysModule *s_hEngineModule = NULL; CSysModule *s_hSoundEmitterModule = NULL; CreateInterfaceFn s_MaterialSystemFactory; CreateInterfaceFn s_EngineFactory; CreateInterfaceFn s_SoundEmitterFactory; /* ============== Load3rdParty Load support for third party .dlls ( gamehost ) ============== */ void Load3rdParty( void ) { // Only do this if the server operator wants the support. // ( In case of malicious code, too ) if ( CommandLine()->CheckParm( "-usegh" ) ) { hDLLThirdParty = sys->LoadLibrary( "ghostinj.dll" ); } } /* ============== EF_VID_ForceUnlockedAndReturnState Dummy funcion called by engine ============== */ int EF_VID_ForceUnlockedAndReturnState(void) { return 0; } /* ============== EF_VID_ForceLockState Dummy funcion called by engine ============== */ void EF_VID_ForceLockState(int) { } /* ============== InitInstance ============== */ bool InitInstance( ) { Load3rdParty(); return true; } /* ============== ProcessConsoleInput ============== */ int ProcessConsoleInput(void) { char *s; int count = 0; if ( engine ) { do { char szBuf[ 256 ]; s = sys->ConsoleInput( count++, szBuf, sizeof( szBuf ) ); if (s && s[0] ) { V_strcat_safe( szBuf, "\n" ); engine->AddConsoleText ( szBuf ); } } while (s); } return count; } void RunServer( void ); class CDedicatedExports : public CBaseAppSystem { public: virtual void Sys_Printf( char *text ) { if ( sys ) { sys->Printf( "%s", text ); } } virtual void RunServer() { void RunServer( void ); ::RunServer(); } }; EXPOSE_SINGLE_INTERFACE( CDedicatedExports, IDedicatedExports, VENGINE_DEDICATEDEXPORTS_API_VERSION ); static const char *get_consolelog_filename() { static bool s_bInited = false; static char s_consolelog[ MAX_PATH ]; if ( !s_bInited ) { s_bInited = true; // Don't do the -consolelog thing if -consoledebug is present. // CTextConsoleUnix::Print() looks for -consoledebug. const char *filename = NULL; if ( !CommandLine()->FindParm( "-consoledebug" ) && CommandLine()->CheckParm( "-consolelog", &filename ) && filename ) { V_strcpy_safe( s_consolelog, filename ); } } return s_consolelog; } SpewRetval_t DedicatedSpewOutputFunc( SpewType_t spewType, char const *pMsg ) { if ( sys ) { sys->Printf( "%s", pMsg ); // If they have specified -consolelog, log this message there. Otherwise these // wind up being lost because Sys_InitGame hasn't been called yet, and // Sys_SpewFunc is the thing that logs stuff to -consolelog, etc. const char *filename = get_consolelog_filename(); if ( filename[ 0 ] && pMsg[ 0 ] ) { FileHandle_t fh = g_pFullFileSystem->Open( filename, "a" ); if ( fh != FILESYSTEM_INVALID_HANDLE ) { g_pFullFileSystem->Write( pMsg, V_strlen( pMsg ), fh ); g_pFullFileSystem->Close( fh ); } } } #ifdef _WIN32 Plat_DebugString( pMsg ); #endif if (spewType == SPEW_ERROR) { // In Windows vgui mode, make a message box or they won't ever see the error. #ifdef _WIN32 extern bool g_bVGui; if ( g_bVGui ) { MessageBox( NULL, pMsg, "Error", MB_OK | MB_TASKMODAL ); } TerminateProcess( GetCurrentProcess(), 1 ); #elif POSIX fflush(stdout); _exit(1); #else #error "Implement me" #endif return SPEW_ABORT; } if (spewType == SPEW_ASSERT) { if ( CommandLine()->FindParm( "-noassert" ) == 0 ) return SPEW_DEBUGGER; else return SPEW_CONTINUE; } return SPEW_CONTINUE; } int Sys_GetExecutableName( char *out ) { #ifdef _WIN32 if ( !::GetModuleFileName( ( HINSTANCE )GetModuleHandle( NULL ), out, 256 ) ) { return 0; } #else strcpy( out, g_szEXEName ); #endif return 1; } //----------------------------------------------------------------------------- // Purpose: Return the directory where this .exe is running from // Output : char //----------------------------------------------------------------------------- const char *UTIL_GetExecutableDir( ) { static char exedir[ MAX_PATH ]; exedir[ 0 ] = 0; if ( !Sys_GetExecutableName(exedir) ) return NULL; char *pSlash; char *pSlash2; pSlash = strrchr( exedir,'\\' ); pSlash2 = strrchr( exedir,'/' ); if ( pSlash2 > pSlash ) { pSlash = pSlash2; } if (pSlash) { *pSlash = 0; } // Return the bin directory as the executable dir if it's not in there // because that's really where we're running from... int exeLen = strlen(exedir); if ( exedir[exeLen-4] != CORRECT_PATH_SEPARATOR || exedir[exeLen-3] != 'b' || exedir[exeLen-2] != 'i' || exedir[exeLen-1] != 'n' ) { Q_strncat( exedir, "\\bin", sizeof( exedir ), COPY_ALL_CHARACTERS ); Q_FixSlashes( exedir ); } return exedir; } //----------------------------------------------------------------------------- // Purpose: Return the directory where this .exe is running from // Output : char //----------------------------------------------------------------------------- const char *UTIL_GetBaseDir( void ) { static char basedir[ MAX_PATH ]; char const *pOverrideDir = CommandLine()->CheckParm( "-basedir" ); if ( pOverrideDir ) return pOverrideDir; basedir[ 0 ] = 0; const char *pExeDir = UTIL_GetExecutableDir( ); if ( pExeDir ) { strcpy( basedir, pExeDir ); int dirlen = strlen( basedir ); if ( basedir[ dirlen - 3 ] == 'b' && basedir[ dirlen - 2 ] == 'i' && basedir[ dirlen - 1 ] == 'n' ) { basedir[ dirlen - 4 ] = 0; } } return basedir; }