X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=host.c;h=dbc88c59b052280183ab5de951a5d49c57872ae5;hb=277cea019899d1a7d297c270afa9c1c2653c49fa;hp=3c77a0e356ce13c439cd0160946f0e2f74e809c0;hpb=bf54dd6e7fb965287073b669235a7b30c7f96923;p=xonotic%2Fdarkplaces.git diff --git a/host.c b/host.c index 3c77a0e3..dbc88c59 100644 --- a/host.c +++ b/host.c @@ -30,6 +30,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #include "csprogs.h" #include "sv_demo.h" #include "snd_main.h" +#include "thread.h" /* @@ -189,7 +190,7 @@ void Host_ServerOptions (void) else { // default players in some games, singleplayer in most - if (gamemode != GAME_GOODVSBAD2 && gamemode != GAME_NEXUIZ && gamemode != GAME_BATTLEMECH) + if (gamemode != GAME_GOODVSBAD2 && gamemode != GAME_NEXUIZ && gamemode != GAME_XONOTIC && gamemode != GAME_BATTLEMECH) svs.maxclients = 1; } } @@ -289,6 +290,20 @@ void Host_SaveConfig_f(void) Host_SaveConfig_to(file); } +void Host_AddConfigText(void) +{ + // set up the default startmap_sp and startmap_dm aliases (mods can + // override these) and then execute the quake.rc startup script + if (gamemode == GAME_NEHAHRA) + Cbuf_InsertText("alias startmap_sp \"map nehstart\"\nalias startmap_dm \"map nehstart\"\nexec " STARTCONFIGFILENAME "\n"); + else if (gamemode == GAME_TRANSFUSION) + Cbuf_InsertText("alias startmap_sp \"map e1m1\"\n""alias startmap_dm \"map bb1\"\nexec " STARTCONFIGFILENAME "\n"); + else if (gamemode == GAME_TEU) + Cbuf_InsertText("alias startmap_sp \"map start\"\nalias startmap_dm \"map start\"\nexec teu.rc\n"); + else + Cbuf_InsertText("alias startmap_sp \"map start\"\nalias startmap_dm \"map start\"\nexec " STARTCONFIGFILENAME "\n"); +} + /* =============== Host_LoadConfig_f @@ -298,10 +313,12 @@ Resets key bindings and cvars to defaults and then reloads scripts */ void Host_LoadConfig_f(void) { - // unlock the cvar default strings so they can be updated by the new default.cfg - Cvar_UnlockDefaults(); + // reset all cvars, commands and aliases to init values + Cmd_RestoreInitState(); + // prepend a menu restart command to execute after the config + Cbuf_InsertText("\nmenu_restart\n"); // reset cvars to their defaults, and then exec startup scripts again - Cbuf_InsertText("cvar_resettodefaults_all;exec " STARTCONFIGFILENAME "\n"); + Host_AddConfigText(); } /* @@ -428,7 +445,7 @@ void SV_DropClient(qboolean crash) if (host_client->netconnection) { - // free the client (the body stays around) + // tell the client to be gone if (!crash) { // LordHavoc: no opportunity for resending, so use unreliable 3 times @@ -442,9 +459,6 @@ void SV_DropClient(qboolean crash) NetConn_SendUnreliableMessage(host_client->netconnection, &buf, sv.protocol, 10000, false); NetConn_SendUnreliableMessage(host_client->netconnection, &buf, sv.protocol, 10000, false); } - // break the net connection - NetConn_Close(host_client->netconnection); - host_client->netconnection = NULL; } // call qc ClientDisconnect function @@ -454,11 +468,18 @@ void SV_DropClient(qboolean crash) { // call the prog function for removing a client // this will set the body to a dead frame, among other things - int saveSelf = prog->globals.server->self; + int saveSelf = PRVM_serverglobaledict(self); host_client->clientconnectcalled = false; - prog->globals.server->self = PRVM_EDICT_TO_PROG(host_client->edict); - PRVM_ExecuteProgram(prog->globals.server->ClientDisconnect, "QC function ClientDisconnect is missing"); - prog->globals.server->self = saveSelf; + PRVM_serverglobaledict(self) = PRVM_EDICT_TO_PROG(host_client->edict); + PRVM_ExecuteProgram(PRVM_serverfunction(ClientDisconnect), "QC function ClientDisconnect is missing"); + PRVM_serverglobaledict(self) = saveSelf; + } + + if (host_client->netconnection) + { + // break the net connection + NetConn_Close(host_client->netconnection); + host_client->netconnection = NULL; } // if a download is active, close it @@ -546,10 +567,10 @@ void Host_ShutdownServer(void) SV_VM_Begin(); World_End(&sv.world); if(prog->loaded) - if(prog->funcoffsets.SV_Shutdown) + if(PRVM_serverfunction(SV_Shutdown)) { - func_t s = prog->funcoffsets.SV_Shutdown; - prog->funcoffsets.SV_Shutdown = 0; // prevent it from getting called again + func_t s = PRVM_serverfunction(SV_Shutdown); + PRVM_serverfunction(SV_Shutdown) = 0; // prevent it from getting called again PRVM_ExecuteProgram(s,"SV_Shutdown() required"); } for (i = 0, host_client = svs.clients;i < svs.maxclients;i++, host_client++) @@ -769,6 +790,9 @@ void Host_Main(void) double advancetime, aborttime = 0; float offset; + if (cls.state == ca_dedicated) + Collision_Cache_NewFrame(); + // run the world state // don't allow simulation to run too fast or too slow or logic glitches can occur @@ -837,7 +861,7 @@ void Host_Main(void) if (sv.paused == 1 && realtime > sv.pausedstart && sv.pausedstart > 0) { prog->globals.generic[OFS_PARM0] = realtime - sv.pausedstart; - PRVM_ExecuteProgram(prog->funcoffsets.SV_PausedTic, "QC function SV_PausedTic is missing"); + PRVM_ExecuteProgram(PRVM_serverfunction(SV_PausedTic), "QC function SV_PausedTic is missing"); } // end the server VM frame @@ -863,6 +887,8 @@ void Host_Main(void) if (cls.state != ca_dedicated && (cl_timer > 0 || cls.timedemo || ((vid_activewindow ? cl_maxfps : cl_maxidlefps).value < 1))) { R_TimeReport("---"); + Collision_Cache_NewFrame(); + R_TimeReport("collisioncache"); // decide the simulation time if (cls.capturevideo.active) { @@ -1056,7 +1082,7 @@ static void Host_Init (void) developer.string = "1"; } - if (COM_CheckParm("-developer2")) + if (COM_CheckParm("-developer2") || COM_CheckParm("-developer3")) { developer.value = developer.integer = 1; developer.string = "1"; @@ -1070,6 +1096,12 @@ static void Host_Init (void) developer_memorydebug.string = "1"; } + if (COM_CheckParm("-developer3")) + { + gl_paranoid.integer = 1;gl_paranoid.string = "1"; + gl_printcheckerror.integer = 1;gl_printcheckerror.string = "1"; + } + // COMMANDLINEOPTION: Console: -nostdout disables text output to the terminal the game was launched from if (COM_CheckParm("-nostdout")) sys_nostdout = 1; @@ -1114,6 +1146,10 @@ static void Host_Init (void) // initialize filesystem (including fs_basedir, fs_gamedir, -game, scr_screenshot_name) FS_Init(); + // must be after FS_Init + Crypto_Init(); + Crypto_Init_Commands(); + NetConn_Init(); Curl_Init(); //PR_Init(); @@ -1122,6 +1158,7 @@ static void Host_Init (void) Mod_Init(); World_Init(); SV_Init(); + V_Init(); // some cvars needed by server player physics (cl_rollangle etc) Host_InitCommands(); Host_InitLocal(); Host_ServerOptions(); @@ -1135,26 +1172,29 @@ static void Host_Init (void) R_Modules_Init(); Palette_Init(); MR_Init_Commands(); + Thread_Init(); VID_Shared_Init(); VID_Init(); Render_Init(); S_Init(); CDAudio_Init(); Key_Init(); - V_Init(); CL_Init(); } - // set up the default startmap_sp and startmap_dm aliases (mods can - // override these) and then execute the quake.rc startup script - if (gamemode == GAME_NEHAHRA) - Cbuf_AddText("alias startmap_sp \"map nehstart\"\nalias startmap_dm \"map nehstart\"\nexec " STARTCONFIGFILENAME "\n"); - else if (gamemode == GAME_TRANSFUSION) - Cbuf_AddText("alias startmap_sp \"map e1m1\"\n""alias startmap_dm \"map bb1\"\nexec " STARTCONFIGFILENAME "\n"); - else if (gamemode == GAME_TEU) - Cbuf_AddText("alias startmap_sp \"map start\"\nalias startmap_dm \"map start\"\nexec teu.rc\n"); - else - Cbuf_AddText("alias startmap_sp \"map start\"\nalias startmap_dm \"map start\"\nexec " STARTCONFIGFILENAME "\n"); + // save off current state of aliases, commands and cvars for later restore if FS_GameDir_f is called + // NOTE: menu commands are freed by Cmd_RestoreInitState + Cmd_SaveInitState(); + + // FIXME: put this into some neat design, but the menu should be allowed to crash + // without crashing the whole game, so this should just be a short-time solution + + // here comes the not so critical stuff + if (setjmp(host_abortframe)) { + return; + } + + Host_AddConfigText(); Cbuf_Execute(); // if stuffcmds wasn't run, then quake.rc is probably missing, use default @@ -1167,14 +1207,6 @@ static void Host_Init (void) // put up the loading image so the user doesn't stare at a black screen... SCR_BeginLoadingPlaque(); - // FIXME: put this into some neat design, but the menu should be allowed to crash - // without crashing the whole game, so this should just be a short-time solution - - // here comes the not so critical stuff - if (setjmp(host_abortframe)) { - return; - } - if (cls.state != ca_dedicated) { MR_Init(); @@ -1283,6 +1315,7 @@ void Host_Shutdown(void) { R_Modules_Shutdown(); VID_Shutdown(); + Thread_Shutdown(); } Cmd_Shutdown(); @@ -1290,6 +1323,7 @@ void Host_Shutdown(void) CL_Shutdown(); Sys_Shutdown(); Log_Close(); + Crypto_Shutdown(); FS_Shutdown(); Con_Shutdown(); Memory_Shutdown();