mirror of
https://github.com/celisej567/source-engine.git
synced 2026-01-05 22:09:59 +03:00
1
This commit is contained in:
300
dedicated/sys_common.cpp
Normal file
300
dedicated/sys_common.cpp
Normal file
@@ -0,0 +1,300 @@
|
||||
//========= 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;
|
||||
}
|
||||
Reference in New Issue
Block a user