You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
300 lines
6.2 KiB
300 lines
6.2 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//===========================================================================// |
|
#ifdef _WIN32 |
|
#include <windows.h> |
|
#elif POSIX |
|
#include <unistd.h> |
|
#else |
|
#error |
|
#endif |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#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<IDedicatedExports> |
|
{ |
|
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; |
|
}
|
|
|