summaryrefslogtreecommitdiff
path: root/dedicated/sys_common.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'dedicated/sys_common.cpp')
-rw-r--r--dedicated/sys_common.cpp300
1 files changed, 300 insertions, 0 deletions
diff --git a/dedicated/sys_common.cpp b/dedicated/sys_common.cpp
new file mode 100644
index 0000000..5138bd3
--- /dev/null
+++ b/dedicated/sys_common.cpp
@@ -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;
+}