This repository has been archived on 2022-06-27. You can view files and clone it, but cannot push or open issues or pull requests.
Xash3DArchive/engine/host.c

242 lines
5.4 KiB
C
Raw Normal View History

2007-06-21 22:00:00 +02:00
//=======================================================================
// Copyright XashXT Group 2007 <20>
// host.c - dedicated and shared host
//=======================================================================
#include <setjmp.h>
#include <windows.h>
#include <dsound.h>
#include "engine.h"
2007-09-02 22:00:00 +02:00
#include "progsvm.h"
2007-06-21 22:00:00 +02:00
2007-09-03 22:00:00 +02:00
platform_exp_t *pi; // fundamental callbacks
host_parm_t host; // host parms
2007-06-21 22:00:00 +02:00
byte *zonepool;
int ActiveApp;
2007-09-03 22:00:00 +02:00
// host params
2007-09-02 22:00:00 +02:00
2007-06-21 22:00:00 +02:00
void Key_Init (void);
void SCR_EndLoadingPlaque (void);
HINSTANCE global_hInstance;
HINSTANCE platform_dll;
cvar_t *timescale;
cvar_t *fixedtime;
cvar_t *showtrace;
void Host_InitPlatform( char *funcname, int argc, char **argv )
{
2007-07-28 22:00:00 +02:00
stdinout_api_t pistd;
2007-08-17 22:00:00 +02:00
platform_t CreatePlat;
2007-06-21 22:00:00 +02:00
2007-06-29 22:00:00 +02:00
//make callbacks
2007-07-28 22:00:00 +02:00
pistd.printf = Msg;
pistd.dprintf = MsgDev;
2007-08-17 22:00:00 +02:00
pistd.wprintf = MsgWarn;
2007-07-28 22:00:00 +02:00
pistd.error = Sys_Error;
2007-06-21 22:00:00 +02:00
if (( platform_dll = LoadLibrary( "bin/platform.dll" )) == 0 )
2007-07-28 22:00:00 +02:00
Sys_Error( "Couldn't load platform.dll\n" );
2007-06-21 22:00:00 +02:00
2007-08-17 22:00:00 +02:00
if (( CreatePlat = (void *)GetProcAddress( platform_dll, "CreateAPI" ) ) == 0 )
2007-08-18 22:00:00 +02:00
Sys_Error("CreateInstance: %s has no valid entry point\n", "platform.dll" );
2007-07-28 22:00:00 +02:00
2007-08-18 22:00:00 +02:00
pi = CreatePlat( pistd );
2007-07-28 22:00:00 +02:00
if(pi->apiversion != PLATFORM_API_VERSION)
Sys_Error("mismatch version (%i should be %i)\n", pi->apiversion, PLATFORM_API_VERSION);
if(pi->api_size != sizeof(platform_exp_t))
Sys_Error("mismatch interface size (%i should be %i)\n", pi->api_size, sizeof(platform_exp_t));
2007-06-21 22:00:00 +02:00
//initialize our platform :)
2007-08-13 22:00:00 +02:00
pi->Init( argc, argv );
2007-06-21 22:00:00 +02:00
2007-06-29 22:00:00 +02:00
//TODO: init basedir here
pi->LoadGameInfo("gameinfo.txt");
2007-06-21 22:00:00 +02:00
zonepool = Mem_AllocPool("Zone Engine");
}
void Host_FreePlatform( void )
{
if(platform_dll)
{
Mem_FreePool( &zonepool );
2007-06-29 22:00:00 +02:00
pi->Shutdown();
2007-06-21 22:00:00 +02:00
FreeLibrary( platform_dll );
}
}
/*
=================
Host_Init
=================
*/
void Host_Init (char *funcname, int argc, char **argv)
{
char *s;
2007-09-03 22:00:00 +02:00
host.state = HOST_INIT; //initialzation started
2007-06-21 22:00:00 +02:00
global_hInstance = (HINSTANCE)GetModuleHandle( NULL );
2007-08-13 22:00:00 +02:00
2007-09-03 22:00:00 +02:00
if(!strcmp(funcname, "host_dedicated")) host.type = HOST_DEDICATED;
else if(!strcmp(funcname, "host_shared")) host.type = HOST_NORMAL;
else host.type = HOST_OFFLINE; // launcher can loading engine for some reasons
2007-06-21 22:00:00 +02:00
2007-09-03 22:00:00 +02:00
COM_InitArgv (argc, argv); // init host.debug & host.developer here
Host_InitPlatform( funcname, argc, argv );
2007-06-21 22:00:00 +02:00
2007-09-03 22:00:00 +02:00
MsgDev(D_INFO, "------- Loading bin/engine.dll [%g] -------\n", ENGINE_VERSION );
Cbuf_Init();
Cmd_Init();
Cvar_Init();
Key_Init();
2007-09-02 22:00:00 +02:00
PRVM_Init();
2007-06-21 22:00:00 +02:00
// we need to add the early commands twice, because
// a basedir or cddir needs to be set before execing
// config files, but we want other parms to override
// the settings of the config files
Cbuf_AddEarlyCommands (false);
Cbuf_Execute ();
Cbuf_AddText ("exec default.cfg\n");
Cbuf_AddText ("exec config.cfg\n");
Cbuf_AddEarlyCommands (true);
Cbuf_Execute ();
// init commands and vars
Cmd_AddCommand ("error", Com_Error_f);
host_speeds = Cvar_Get ("host_speeds", "0", 0);
timescale = Cvar_Get ("timescale", "1", 0);
fixedtime = Cvar_Get ("fixedtime", "0", 0);
showtrace = Cvar_Get ("showtrace", "0", 0);
s = va("%4.2f %s %s %s", VERSION, "x86", __DATE__, BUILDSTRING);
Cvar_Get ("version", s, CVAR_SERVERINFO|CVAR_NOSET);
2007-09-03 22:00:00 +02:00
if (host.type == HOST_DEDICATED)
{
Cmd_AddCommand ("quit", Com_Quit);
}
2007-06-21 22:00:00 +02:00
Sys_Init();
NET_Init ();
Netchan_Init ();
SV_Init();
CL_Init();
// add + commands from command line
2007-09-03 22:00:00 +02:00
if (!Cbuf_AddLateCommands())
2007-06-21 22:00:00 +02:00
{
// if the user didn't give any commands, run default action
2007-09-03 22:00:00 +02:00
if(host.type == HOST_NORMAL) Cbuf_AddText ("d1\n");
2007-06-21 22:00:00 +02:00
else Cbuf_AddText ("dedicated_start\n");
Cbuf_Execute ();
}
else
{ // the user asked for something explicit
// so drop the loading plaque
SCR_EndLoadingPlaque ();
}
}
/*
=================
Host_Frame
=================
*/
void Host_Frame (double time)
{
char *s;
if (setjmp (abortframe) ) return; // an ERR_DROP was thrown
if (showtrace->value)
{
extern int c_traces, c_brush_traces;
extern int c_pointcontents;
2007-07-28 22:00:00 +02:00
Msg ("%4i traces %4i points\n", c_traces, c_pointcontents);
2007-06-21 22:00:00 +02:00
c_traces = 0;
c_brush_traces = 0;
c_pointcontents = 0;
}
do
{
s = Sys_ConsoleInput ();
2007-09-02 22:00:00 +02:00
if(s) Cbuf_AddText (va("%s\n",s));
2007-06-21 22:00:00 +02:00
} while (s);
Cbuf_Execute ();
2007-09-02 22:00:00 +02:00
2007-06-21 22:00:00 +02:00
SV_Frame (time);
CL_Frame (time);
2007-09-03 22:00:00 +02:00
host.framecount++;
2007-06-21 22:00:00 +02:00
}
/*
=================
Host_Main
=================
*/
void Host_Main( void )
{
2007-09-03 22:00:00 +02:00
MSG msg;
static double oldtime, newtime;
2007-06-21 22:00:00 +02:00
2007-09-03 22:00:00 +02:00
host.state = HOST_FRAME;
2007-09-02 22:00:00 +02:00
oldtime = Sys_DoubleTime(); //first call
2007-06-21 22:00:00 +02:00
// main window message loop
2007-09-03 22:00:00 +02:00
while (host.type != HOST_OFFLINE)
2007-06-21 22:00:00 +02:00
{
// if at a full screen console, don't update unless needed
2007-09-03 22:00:00 +02:00
if (host.type == HOST_DEDICATED )
2007-06-21 22:00:00 +02:00
{
2007-09-03 22:00:00 +02:00
Sleep( 1 );
2007-06-21 22:00:00 +02:00
}
2007-09-03 22:00:00 +02:00
else if(host.state == HOST_SLEEP) Sleep( 100 );
2007-06-21 22:00:00 +02:00
while (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
{
if (!GetMessage (&msg, NULL, 0, 0)) Com_Quit ();
2007-09-03 22:00:00 +02:00
host.sv_timer = msg.time;
2007-06-21 22:00:00 +02:00
TranslateMessage (&msg);
DispatchMessage (&msg);
}
2007-09-05 22:00:00 +02:00
do
{
newtime = Sys_DoubleTime();
host.realtime = newtime - oldtime;
} while (host.realtime < 0.001);
2007-06-21 22:00:00 +02:00
2007-09-03 22:00:00 +02:00
Host_Frame (host.realtime);
2007-06-21 22:00:00 +02:00
oldtime = newtime;
}
}
/*
=================
Host_Shutdown
=================
*/
void Host_Free (void)
{
2007-09-03 22:00:00 +02:00
host.state = HOST_SHUTDOWN;
SV_Shutdown ("Server shutdown\n", false);
2007-06-21 22:00:00 +02:00
CL_Shutdown ();
Host_FreePlatform();
}