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();
|
|
|
|
|
}
|