mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-23 06:36:54 +00:00
301 lines
6.2 KiB
C++
301 lines
6.2 KiB
C++
|
//========= 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;
|
||
|
}
|