Counter Strike : Global Offensive Source Code
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.
 
 
 
 
 
 

303 lines
6.1 KiB

//===== Copyright 1996-2005, 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/dbg.h"
#include "tier1/strtools.h"
#include "tier0/icommandline.h"
#include "idedicatedexports.h"
#include "mathlib/expressioncalculator.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;
#ifdef _WIN32
extern bool g_bVGui;
#endif
/*
==============
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
==============
*/
void ProcessConsoleInput( void )
{
char *s;
if ( !engine )
return;
do
{
s = sys->ConsoleInput();
if (s)
{
char szBuf[ 256 ];
Q_snprintf( szBuf, sizeof( szBuf ), "%s\n", s );
engine->AddConsoleText ( szBuf );
}
} while (s);
}
#ifdef _WIN32
extern bool g_bVGui;
#endif
class CDedicatedExports : public CBaseAppSystem<IDedicatedExports>
{
public:
virtual void Sys_Printf( char *text )
{
if ( sys )
{
sys->Printf( "%s", text );
}
}
virtual void RunServer( void );
virtual bool IsGuiDedicatedServer();
};
void PerformCommandLineSubstitutions( int nIndex )
{
// modify the command line, replacing all occurrences of ## with nIndex
for( int i = 0; i < CommandLine()->ParmCount(); i++ )
{
char newBuf[2048];
char const *ppParm = CommandLine()->GetParm( i );
V_strncpy( newBuf, ppParm, sizeof( newBuf ) );
bool bDidReplace = false;
bool bWasExpression = false;
for(;;)
{
char *pReplace = V_strstr( newBuf, "##" );
if (! pReplace )
break;
pReplace[0] = '0' + ( nIndex / 10 );
pReplace[1] = '0' + ( nIndex % 10 );
bDidReplace = true;
if ( ( pReplace != newBuf ) &&
( strchr( "+-/*", pReplace[-1] ) ) ) // is this an expression involving "##"?
{
bWasExpression = true;
}
}
if ( bDidReplace )
{
if ( bWasExpression )
{
sprintf( newBuf, "%d", ( int ) ( EvaluateExpression( newBuf, -1 ) ) );
}
printf("setparm %d %s\n", i, newBuf );
CommandLine()->SetParm( i, newBuf );
}
}
}
#ifdef _LINUX // linux uses the implementation in sys_subproc
void CDedicatedExports::RunServer( void )
{
// check for forking
char const *pForkParam = CommandLine()->ParmValue( "-fork" );
if ( pForkParam )
{
int nNumChildInstances = atoi( pForkParam );
if ( nNumChildInstances >= 1 )
{
RunServerSubProcesses( nNumChildInstances );
}
}
else
{
::RunServer( false );
}
}
#else
void CDedicatedExports::RunServer( void )
{
PerformCommandLineSubstitutions( 0 );
::RunServer( false );
}
#endif
bool CDedicatedExports::IsGuiDedicatedServer()
{
#ifndef _WIN32
return false;
#else
return g_bVGui;
#endif
}
EXPOSE_SINGLE_INTERFACE( CDedicatedExports, IDedicatedExports, VENGINE_DEDICATEDEXPORTS_API_VERSION );
int Sys_GetExecutableName( char *out )
{
#ifdef _WIN32
if ( !::GetModuleFileName( ( HINSTANCE )GetModuleHandle( NULL ), out, 256 ) )
{
return 0;
}
#else
extern char g_szEXEName[ 256 ];
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;
}